You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.2 KiB
135 lines
4.2 KiB
/** @odoo-module **/
|
|
import { Dropdown } from '@web/core/dropdown/dropdown';
|
|
import { DropdownItem } from '@web/core/dropdown/dropdown_item';
|
|
import { registry } from '@web/core/registry';
|
|
import { Component } from '@odoo/owl';
|
|
import { useRef, useState, onMounted, onWillUnmount } from "@odoo/owl";
|
|
|
|
export class Calculator extends Component {
|
|
setup() {
|
|
super.setup();
|
|
this.rootRef = useRef('root');
|
|
this.state = useState({
|
|
currentInput: '',
|
|
currentOperator: '',
|
|
result: 0,
|
|
x: 0,
|
|
y: 0,
|
|
isVisible: false,
|
|
display: ''
|
|
});
|
|
|
|
this.dragStartX = 0;
|
|
this.dragStartY = 0;
|
|
|
|
onMounted(() => {
|
|
document.addEventListener('mousemove', this.onDragging);
|
|
document.addEventListener('mouseup', this.stopDragging);
|
|
});
|
|
|
|
onWillUnmount(() => {
|
|
document.removeEventListener('mousemove', this.onDragging);
|
|
document.removeEventListener('mouseup', this.stopDragging);
|
|
});
|
|
}
|
|
|
|
onclick_calc_icon() {
|
|
this.state.isVisible = !this.state.isVisible;
|
|
}
|
|
|
|
startDragging(ev) {
|
|
this.isDragging = true;
|
|
this.dragStartX = ev.clientX - this.state.x;
|
|
this.dragStartY = ev.clientY - this.state.y;
|
|
}
|
|
|
|
onDragging = (ev) => {
|
|
if (this.isDragging) {
|
|
this.state.x = ev.clientX - this.dragStartX;
|
|
this.state.y = ev.clientY - this.dragStartY;
|
|
}
|
|
}
|
|
|
|
stopDragging = () => {
|
|
this.isDragging = false;
|
|
}
|
|
|
|
onNumberClick(ev) {
|
|
const number = ev.currentTarget.getAttribute('data-key');
|
|
if (number === '.') {
|
|
this.onDecimalClick(ev);
|
|
} else {
|
|
this.state.currentInput += number;
|
|
this.state.display = this.state.currentInput;
|
|
}
|
|
}
|
|
|
|
onOperatorClick(ev) {
|
|
const operator = ev.currentTarget.getAttribute('data-key');
|
|
if (this.state.currentInput !== '') {
|
|
if (this.state.currentOperator !== '') {
|
|
this.state.result = this.calculate(this.state.result, parseFloat(this.state.currentInput), this.state.currentOperator);
|
|
this.state.display = this.state.result.toString();
|
|
} else {
|
|
this.state.result = parseFloat(this.state.currentInput);
|
|
}
|
|
this.state.currentInput = '';
|
|
this.state.currentOperator = operator;
|
|
}
|
|
}
|
|
|
|
onEqualsClick() {
|
|
if (this.state.currentInput !== '') {
|
|
this.state.result = this.calculate(this.state.result, parseFloat(this.state.currentInput), this.state.currentOperator);
|
|
this.state.display = this.state.result.toString();
|
|
this.state.currentInput = this.state.result.toString();
|
|
this.state.currentOperator = '';
|
|
}
|
|
}
|
|
|
|
onClearClick() {
|
|
this.state.result = 0;
|
|
this.state.currentInput = '';
|
|
this.state.currentOperator = '';
|
|
this.state.display = '';
|
|
}
|
|
|
|
onToggleSignClick() {
|
|
if (this.state.currentInput !== '') {
|
|
if (this.state.currentInput[0] === '-') {
|
|
this.state.currentInput = this.state.currentInput.substring(1);
|
|
} else {
|
|
this.state.currentInput = '-' + this.state.currentInput;
|
|
}
|
|
this.state.display = this.state.currentInput;
|
|
}
|
|
}
|
|
|
|
onDecimalClick(ev) {
|
|
const decimal = ev.currentTarget.getAttribute('data-key');
|
|
if (this.state.currentInput.indexOf('.') === -1) {
|
|
this.state.currentInput += decimal;
|
|
this.state.display = this.state.currentInput;
|
|
}
|
|
}
|
|
|
|
calculate(num1, num2, operator) {
|
|
switch (operator) {
|
|
case '+': return num1 + num2;
|
|
case '-': return num1 - num2;
|
|
case '*': return num1 * num2;
|
|
case '/': return num1 / num2;
|
|
case '%': return (num1 / 100) * num2;
|
|
default: return num2;
|
|
}
|
|
}
|
|
}
|
|
|
|
Calculator.template = 'CalculatorTool';
|
|
Calculator.components = { Dropdown, DropdownItem };
|
|
|
|
export const calculator = {
|
|
Component: Calculator,
|
|
};
|
|
|
|
registry.category('systray').add('Calculator', calculator);
|