Warning, /utilities/kalk/src/qml/BinaryCalculator.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2021-2022 Rohan Asokan <rohan.asokan@students.iiit.ac.in>
0002 // SPDX-License-Identifier: GPL-3.0-or-later
0003 
0004 import QtQuick
0005 import QtQuick.Layouts
0006 import QtQuick.Controls as Controls
0007 import Qt5Compat.GraphicalEffects
0008 import org.kde.kirigami as Kirigami
0009 
0010 Kirigami.Page {
0011     id: initialPage
0012 
0013     title: i18n("Programmer")
0014 
0015     topPadding: 0
0016     leftPadding: 0
0017     rightPadding: 0
0018     bottomPadding: 0
0019 
0020     actions: [
0021         Kirigami.Action {
0022             icon.name: "edit-undo-symbolic"
0023             text: i18n("Undo")
0024             shortcut: "Ctrl+Z"
0025             enabled: inputManager.canUndo
0026             onTriggered: inputManager.undo()
0027         },
0028         Kirigami.Action {
0029             icon.name: "edit-redo-symbolic"
0030             text: i18n("Redo")
0031             shortcut: "Ctrl+Shift+Z"
0032             enabled: inputManager.canRedo
0033             onTriggered: inputManager.redo()
0034         }
0035     ]
0036 
0037     property int yTranslate: 0
0038     property real mainOpacity: 1
0039 
0040     property color dropShadowColor: Qt.darker(Kirigami.Theme.backgroundColor, 1.15)
0041     property int keypadHeight: initialPage.height * 3 / 7
0042     property int screenHeight: initialPage.height - initialPage.keypadHeight
0043 
0044     Keys.onPressed: event => {
0045         if (event.matches(StandardKey.Undo)) {
0046             inputManager.undo();
0047             event.accepted = true;
0048             return;
0049         } else if (event.matches(StandardKey.Redo)) {
0050             inputManager.redo();
0051             event.accepted = true;
0052             return;
0053         }
0054 
0055         switch(event.key) {
0056         case Qt.Key_Delete:
0057         case Qt.Key_Backspace:
0058             inputManager.backspace(); break;
0059         case Qt.Key_0:
0060             inputManager.append("0"); break;
0061         case Qt.Key_1:
0062             inputManager.append("1"); break;
0063         case Qt.Key_Plus:
0064             inputManager.append("+"); break;
0065         case Qt.Key_Minus:
0066             inputManager.append("-"); break;
0067         case Qt.Key_Asterisk:
0068             inputManager.append("*"); break;
0069         case Qt.Key_Slash:
0070             inputManager.append("/"); break;
0071         case Qt.Key_Ampersand:
0072             inputManager.append("&"); break;
0073         case Qt.Key_Bar:
0074             inputManager.append("|"); break;
0075         case Qt.Key_AsciiCircum:
0076             inputManager.append("^"); break;
0077         case Qt.Key_Period:
0078             inputManager.append("."); break;
0079         case Qt.Key_Equal:
0080         case Qt.Key_Return:
0081         case Qt.Key_Enter:
0082             inputManager.equal(); break;
0083         }
0084         event.accepted = true;
0085     }
0086 
0087     onIsCurrentPageChanged: {
0088         if (!inputManager.binaryMode)
0089             inputManager.binaryMode = true
0090     }
0091     
0092     background: Rectangle {
0093         Kirigami.Theme.colorSet: Kirigami.Theme.Window
0094         Kirigami.Theme.inherit: false
0095         color: Kirigami.Theme.backgroundColor
0096         anchors.fill: parent
0097         opacity: mainOpacity
0098     }
0099     
0100     ColumnLayout {
0101         anchors.fill: parent
0102         opacity: mainOpacity
0103         transform: Translate { y: yTranslate }
0104         spacing: 0
0105         
0106         Item {
0107             id: outputScreen
0108             z: 1
0109             Layout.fillWidth: true
0110             Layout.alignment: Qt.AlignTop
0111             Layout.preferredHeight: initialPage.screenHeight
0112             
0113             // top panel drop shadow
0114             RectangularGlow {
0115                 anchors.fill: topPanelBackground
0116                 anchors.topMargin: 1
0117                 glowRadius: 4
0118                 spread: 0.2
0119                 color: dropShadowColor
0120             }
0121             Rectangle {
0122                 id: topPanelBackground
0123                 anchors.top: parent.top
0124                 anchors.left: parent.left
0125                 anchors.right: parent.right
0126                 color: Kirigami.Theme.backgroundColor
0127                 implicitHeight: outputScreen.height
0128             }
0129             
0130             Column {
0131                 id: outputColumn
0132                 anchors.fill: parent
0133                 anchors.margins: Kirigami.Units.largeSpacing
0134                 spacing: initialPage.screenHeight / 8
0135                 
0136                 Flickable {
0137                     anchors.right: parent.right
0138                     height: initialPage.screenHeight / 8
0139                     width: Math.min(parent.width, contentWidth)
0140                     contentHeight: expressionRow.height
0141                     contentWidth: expressionRow.width
0142                     flickableDirection: Flickable.HorizontalFlick
0143                     Controls.Label {
0144                         id: expressionRow
0145                         horizontalAlignment: Text.AlignRight
0146                         font.pointSize: initialPage.screenHeight * 0.1 / 1.5
0147                         font.weight: Font.Light
0148                         text: inputManager.expression
0149                         color: Kirigami.Theme.disabledTextColor
0150                     }
0151                     onContentWidthChanged: {
0152                         if(contentWidth > width)
0153                             contentX = contentWidth - width;
0154                     }
0155                 }
0156                 
0157                 Flickable {
0158                     anchors.right: parent.right
0159                     height: initialPage.screenHeight / 8
0160                     width: Math.min(parent.width, contentWidth)
0161                     contentHeight: resultBin.height
0162                     contentWidth: resultBin.width + Kirigami.Units.gridUnit
0163                     flickableDirection: Flickable.HorizontalFlick
0164                     Controls.Label {
0165                         id: resultBin
0166                         horizontalAlignment: Text.AlignRight
0167                         font.pointSize: initialPage.screenHeight * 0.1
0168                         font.weight: Font.Light
0169                         text: inputManager.binaryResult
0170                         onTextChanged: resultFadeInAnimation.start()
0171                         Controls.Label {
0172                             visible: parent.text.length
0173                             anchors.left: parent.right
0174                             anchors.bottom: parent.bottom
0175                             text: "2"
0176                             font.pointSize: initialPage.screenHeight * 0.1 * 0.3
0177                             font.weight: Font.Light
0178                             color: Kirigami.Theme.disabledTextColor
0179                         }
0180                     }
0181                 }
0182                 
0183                 Flickable {
0184                     anchors.right: parent.right
0185                     height: initialPage.screenHeight / 8
0186                     width: Math.min(parent.width, contentWidth)
0187                     contentHeight: resultDec.height
0188                     contentWidth: resultDec.width + Kirigami.Units.gridUnit
0189                     flickableDirection: Flickable.HorizontalFlick
0190                     Controls.Label {
0191                         id: resultDec
0192                         horizontalAlignment: Text.AlignRight
0193                         font.pointSize: initialPage.screenHeight * 0.1
0194                         font.weight: Font.Light
0195                         text: inputManager.result
0196                         onTextChanged: resultFadeInAnimation.start()
0197                         Controls.Label {
0198                             visible: parent.text.length
0199                             anchors.left: parent.right
0200                             anchors.bottom: parent.bottom
0201                             text: "10"
0202                             font.pointSize: initialPage.screenHeight * 0.1 * 0.3
0203                             font.weight: Font.Light
0204                             color: Kirigami.Theme.disabledTextColor
0205                         }
0206                     }
0207                 }
0208                 
0209                 Flickable {
0210                     anchors.right: parent.right
0211                     height: initialPage.screenHeight / 8
0212                     width: Math.min(parent.width, contentWidth)
0213                     contentHeight: resultHex.height
0214                     contentWidth: resultHex.width + Kirigami.Units.gridUnit
0215                     flickableDirection: Flickable.HorizontalFlick
0216                     Controls.Label {
0217                         id: resultHex
0218                         horizontalAlignment: Text.AlignRight
0219                         font.pointSize: initialPage.screenHeight * 0.1
0220                         font.weight: Font.Light
0221                         text: inputManager.hexResult
0222                         onTextChanged: resultFadeInAnimation.start()
0223                         Controls.Label {
0224                             visible: parent.text.length
0225                             anchors.left: parent.right
0226                             anchors.bottom: parent.bottom
0227                             text: "16"
0228                             font.pointSize: initialPage.screenHeight * 0.1 * 0.3
0229                             font.weight: Font.Light
0230                             color: Kirigami.Theme.disabledTextColor
0231                         }
0232                     }
0233                 }
0234 
0235                 NumberAnimation on opacity {
0236                     id: resultFadeInAnimation
0237                     from: 0.5
0238                     to: 1
0239                     duration: Kirigami.Units.shortDuration
0240                     exclude: [expressionRow]
0241                 }
0242                 NumberAnimation on opacity {
0243                     id: resultFadeOutAnimation
0244                     from: 1
0245                     to: 0
0246                     duration: Kirigami.Units.shortDuration
0247                     exclude: [expressionRow]
0248                 }
0249             }
0250         }
0251         
0252         // Binary Input Pad
0253         Item {
0254             property string expression: ""
0255             id: binaryInputPad
0256             Layout.fillHeight: true
0257             Layout.preferredWidth: initialPage.width
0258             Layout.alignment: Qt.AlignLeft
0259             
0260             BinaryPad {
0261                 id: binaryPad
0262                 anchors.fill: parent
0263                 anchors.margins: Kirigami.Units.smallSpacing
0264                 // Uncomment next line for function overlay
0265                 // anchors.rightMargin: Kirigami.Units.gridUnit * 1.5
0266                 onPressed: text => {
0267                     if (text === "DEL") {
0268                         inputManager.backspace();
0269                     } else if (text === "=") {
0270                         inputManager.equal();
0271                         resultFadeOutAnimation.start();
0272                     } else {
0273                         inputManager.append(text);
0274                     }
0275                 }
0276                 onClear: inputManager.clear()
0277             }
0278         }
0279     }
0280 }