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

0001 /*
0002  * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com>
0003  * SPDX-FileCopyrightText: 2021 Devin Lin <espidev@gmail.com
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as Controls
0010 import org.kde.kirigami as Kirigami
0011 import Qt5Compat.GraphicalEffects
0012 
0013 Kirigami.Page {
0014     id: unitConverter
0015     title: i18n("Converter")
0016     topPadding: 0
0017     leftPadding: 0
0018     rightPadding: 0
0019     bottomPadding: 0
0020 
0021     property int yTranslate: 0
0022     property real mainOpacity: 1
0023     property color dropShadowColor: Qt.darker(Kirigami.Theme.backgroundColor, 1.15)
0024     property int screenHeight: unitConverter.height * 0.5
0025     property int flexPointSize: Math.max(Math.min(screenHeight / 14, width / 24), Kirigami.Theme.defaultFont.pointSize - 3)
0026 
0027     Keys.onPressed: event => {
0028         switch(event.key) {
0029         case Qt.Key_Delete:
0030         case Qt.Key_Backspace:
0031             unitNumberPad.pressed("DEL"); break;
0032         case Qt.Key_0:
0033             unitNumberPad.pressed("0"); break;
0034         case Qt.Key_1:
0035             unitNumberPad.pressed("1"); break;
0036         case Qt.Key_2:
0037             unitNumberPad.pressed("2"); break;
0038         case Qt.Key_3:
0039             unitNumberPad.pressed("3"); break;
0040         case Qt.Key_4:
0041             unitNumberPad.pressed("4"); break;
0042         case Qt.Key_5:
0043             unitNumberPad.pressed("5"); break;
0044         case Qt.Key_6:
0045             unitNumberPad.pressed("6"); break;
0046         case Qt.Key_7:
0047             unitNumberPad.pressed("7"); break;
0048         case Qt.Key_8:
0049             unitNumberPad.pressed("8"); break;
0050         case Qt.Key_9:
0051             unitNumberPad.pressed("9"); break;
0052         case Qt.Key_Period:
0053             unitNumberPad.pressed("."); break;
0054         case Qt.Key_Equal:
0055         case Qt.Key_Return:
0056         case Qt.Key_Enter:
0057             inputManager.equal(); break;
0058         }
0059         event.accepted = true;
0060     }
0061 
0062     actions: Kirigami.Action {
0063         id: category
0064         icon.name: "category"
0065         text: i18n("Category")
0066         onTriggered: categories.open();
0067     }
0068 
0069     Component {
0070         id: delegateComponent
0071         Controls.Label {
0072             text: modelData
0073             opacity: 0.4 + Math.max(0, 1 - Math.abs(Controls.Tumbler.displacement)) * 0.6
0074             horizontalAlignment: Text.AlignHCenter
0075             font.bold: Controls.Tumbler.displacement === 0
0076             font.pointSize: flexPointSize
0077         }
0078     }
0079     
0080     Item {
0081         anchors.fill: parent
0082         opacity: mainOpacity
0083         transform: Translate { y: yTranslate }
0084         
0085         // top panel drop shadow
0086         RectangularGlow {
0087             anchors.fill: topPanelBackground
0088             anchors.topMargin: 1
0089             z: -2
0090             glowRadius: 4
0091             spread: 0.2
0092             color: dropShadowColor
0093         }
0094         
0095         Rectangle {
0096             id: topPanelBackground
0097             z: -1
0098             color: Kirigami.Theme.backgroundColor
0099             anchors.left: parent.left
0100             anchors.right: parent.right
0101             anchors.top: parent.top
0102             implicitHeight: topPanel.height
0103         }
0104         
0105         ColumnLayout {
0106             anchors.fill: parent
0107             spacing: 0
0108             
0109             ColumnLayout {
0110                 id: topPanel
0111                 Layout.fillWidth: true
0112 
0113                 RowLayout {
0114                     Layout.fillHeight: true
0115                     Layout.fillWidth: true
0116                     
0117                     Controls.Tumbler {
0118                         id: fromTumbler
0119                         Layout.fillWidth: true
0120                         Layout.fillHeight: true
0121                         Layout.maximumHeight: unitConverter.screenHeight * 0.5
0122                         wrap: false
0123                         
0124                         model: unitModel.typeList
0125                         currentIndex: unitModel.fromUnitIndex
0126                         delegate: delegateComponent
0127                         onCurrentIndexChanged: {
0128                             unitModel.fromUnitIndex = currentIndex;
0129                         }
0130                     }
0131                     
0132                     Controls.ToolButton {
0133                         icon.name: "gtk-convert"
0134                         icon.height: unitConverter.screenHeight * 0.15
0135                         icon.width: unitConverter.screenHeight * 0.15
0136                         onClicked: {
0137                             let tmp = fromTumbler.currentIndex;
0138                             fromTumbler.currentIndex = toTumbler.currentIndex;
0139                             toTumbler.currentIndex = tmp;
0140                         }
0141                     }
0142                     
0143                     Controls.Tumbler {
0144                         id: toTumbler
0145                         Layout.fillWidth: true
0146                         Layout.fillHeight: true
0147                         Layout.maximumHeight: unitConverter.screenHeight * 0.5
0148                         wrap: false
0149                         
0150                         model: unitModel.typeList
0151                         currentIndex: unitModel.toUnitIndex
0152                         delegate: delegateComponent
0153                         onCurrentIndexChanged: {
0154                             unitModel.toUnitIndex = currentIndex;
0155                         }
0156                     }
0157                 }
0158                 
0159                 Kirigami.Separator {
0160                     Layout.fillWidth: true
0161                 }
0162                 
0163                 GridLayout {
0164                     columns: unitConverter.width > unitConverter.height ? 3 : 1
0165                     Layout.fillWidth: true
0166                     Layout.alignment: Qt.AlignHCenter
0167 
0168                     Controls.Label {
0169                         Layout.fillWidth: true
0170                         font.pointSize: flexPointSize
0171                         text: unitModel.value
0172                         color: Kirigami.Theme.textColor
0173                         horizontalAlignment: Text.AlignHCenter
0174                     }
0175 
0176                     Controls.Label {
0177                         visible: parent.columns > 1 || unitConverter.height > 250
0178                         Layout.fillWidth: true
0179                         font.pointSize: flexPointSize
0180                         text: "="
0181                         color: Kirigami.Theme.textColor
0182                         horizontalAlignment: Text.AlignHCenter
0183                     }
0184 
0185                     Controls.Label {
0186                         Layout.fillWidth: true
0187                         font.pointSize: flexPointSize
0188                         text: unitModel.result
0189                         color: Kirigami.Theme.textColor
0190                         horizontalAlignment: Text.AlignHCenter
0191                     }
0192                 }
0193             }
0194 
0195             PortraitPad {
0196                 id: unitNumberPad
0197                 Layout.fillHeight: true
0198                 Layout.fillWidth: true
0199                 Layout.margins: Kirigami.Units.smallSpacing
0200                 pureNumber: true
0201                 onPressed: text => {
0202                     if (text === "DEL") {
0203                         unitModel.value = unitModel.value.slice(0, unitModel.value.length - 1);
0204                     } else {
0205                         unitModel.value += text;
0206                     }
0207                 }
0208                 onClear: {
0209                     unitModel.value = "";
0210                 }
0211             }
0212         }
0213     }
0214     
0215     background: Rectangle {
0216         opacity: mainOpacity
0217         
0218         Kirigami.Theme.colorSet: Kirigami.Theme.Window
0219         Kirigami.Theme.inherit: false
0220         color: Kirigami.Theme.backgroundColor
0221         anchors.fill: parent
0222     }
0223 
0224     Controls.Dialog {
0225         id: categories
0226         modal: true
0227         focus: true
0228         width: Math.min(parent.width, 400)
0229         x: parent.width / 2 - width / 2
0230 
0231         contentItem: Controls.ScrollView {
0232             ListView {
0233                 id: listview
0234                 model: unitModel
0235                 clip: true
0236                 delegate: Controls.RadioDelegate {
0237                     width: ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin
0238                     text: modelData
0239                     checked: index === unitModel.currentIndex
0240                     onClicked: {
0241                         category.text = text;
0242                         unitModel.currentIndex = index;
0243                         categories.close();
0244                     }
0245                 }
0246 
0247                 Component.onCompleted: category.text = listview.currentItem.text
0248             }
0249 
0250             Component.onCompleted: background.visible = true
0251         }
0252     }
0253 }