From 79cc616de267466ac13e3ce7fac46be4224fd8c8 Mon Sep 17 00:00:00 2001 From: demmm Date: Mon, 6 Sep 2021 19:25:16 +0200 Subject: [PATCH] [keyboardq] add interactive keyboard preview rewrite of keyboardq.qml, reduce stackview to 2, use a combobox for keyboard models list colors set to configurable .xml files used for keyboard layouts, about a dozen added now builds, runs, actions record as intended, GS filled correctly --- src/modules/keyboardq/data/Key.qml | 179 ++++++ src/modules/keyboardq/data/Keyboard.qml | 222 ++++++++ src/modules/keyboardq/data/afgani.xml | 65 +++ src/modules/keyboardq/data/ar.xml | 65 +++ src/modules/keyboardq/data/backspace.svg | 7 + .../keyboardq/data/backspace.svg.license | 2 + .../keyboardq/data/button_bkg_center.png | Bin 0 -> 4289 bytes .../data/button_bkg_center.png.license | 2 + .../keyboardq/data/button_bkg_left.png | Bin 0 -> 5549 bytes .../data/button_bkg_left.png.license | 2 + .../keyboardq/data/button_bkg_right.png | Bin 0 -> 5955 bytes .../data/button_bkg_right.png.license | 2 + src/modules/keyboardq/data/de.xml | 66 +++ src/modules/keyboardq/data/empty.xml | 64 +++ src/modules/keyboardq/data/en.xml | 64 +++ src/modules/keyboardq/data/enter.svg | 43 ++ src/modules/keyboardq/data/enter.svg.license | 2 + src/modules/keyboardq/data/es.xml | 64 +++ src/modules/keyboardq/data/fr.xml | 66 +++ src/modules/keyboardq/data/generic.xml | 64 +++ src/modules/keyboardq/data/generic_qz.xml | 66 +++ src/modules/keyboardq/data/pt.xml | 64 +++ src/modules/keyboardq/data/ru.xml | 64 +++ src/modules/keyboardq/data/scan.xml | 64 +++ src/modules/keyboardq/data/shift.license | 2 + src/modules/keyboardq/data/shift.svg | 7 + src/modules/keyboardq/keyboardq.qml | 534 +++++++----------- 27 files changed, 1465 insertions(+), 315 deletions(-) create mode 100644 src/modules/keyboardq/data/Key.qml create mode 100644 src/modules/keyboardq/data/Keyboard.qml create mode 100644 src/modules/keyboardq/data/afgani.xml create mode 100644 src/modules/keyboardq/data/ar.xml create mode 100755 src/modules/keyboardq/data/backspace.svg create mode 100644 src/modules/keyboardq/data/backspace.svg.license create mode 100755 src/modules/keyboardq/data/button_bkg_center.png create mode 100644 src/modules/keyboardq/data/button_bkg_center.png.license create mode 100755 src/modules/keyboardq/data/button_bkg_left.png create mode 100644 src/modules/keyboardq/data/button_bkg_left.png.license create mode 100755 src/modules/keyboardq/data/button_bkg_right.png create mode 100644 src/modules/keyboardq/data/button_bkg_right.png.license create mode 100644 src/modules/keyboardq/data/de.xml create mode 100644 src/modules/keyboardq/data/empty.xml create mode 100644 src/modules/keyboardq/data/en.xml create mode 100755 src/modules/keyboardq/data/enter.svg create mode 100644 src/modules/keyboardq/data/enter.svg.license create mode 100644 src/modules/keyboardq/data/es.xml create mode 100644 src/modules/keyboardq/data/fr.xml create mode 100644 src/modules/keyboardq/data/generic.xml create mode 100644 src/modules/keyboardq/data/generic_qz.xml create mode 100644 src/modules/keyboardq/data/pt.xml create mode 100644 src/modules/keyboardq/data/ru.xml create mode 100644 src/modules/keyboardq/data/scan.xml create mode 100644 src/modules/keyboardq/data/shift.license create mode 100755 src/modules/keyboardq/data/shift.svg diff --git a/src/modules/keyboardq/data/Key.qml b/src/modules/keyboardq/data/Key.qml new file mode 100644 index 000000000..e85b44f08 --- /dev/null +++ b/src/modules/keyboardq/data/Key.qml @@ -0,0 +1,179 @@ +/* === This file is part of Calamares - === + * + * Copyright 2021, Anke Boersma + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +import QtQuick 2.15 + +Item { + id: key + + property string mainLabel: "A" + property var secondaryLabels: []; + + property var iconSource; + + property var keyImageLeft: "" + property var keyImageRight: "" + property var keyImageCenter: "" + + property color keyColor: "#404040" + property color keyPressedColor: "grey" + property int keyBounds: 2 + property var keyPressedColorOpacity: 1 + + property var mainFontFamily: "Roboto" + property color mainFontColor: "white" + property int mainFontSize: 18 + + property var secondaryFontFamily: "Roboto" + property color secondaryFontColor: "white" + property int secondaryFontSize: 10 + + property bool secondaryLabelVisible: true + + property bool isChekable; + property bool isChecked; + + property bool upperCase; + + signal clicked() + signal alternatesClicked(string symbol) + + Item { + anchors.fill: parent + anchors.margins: key.keyBounds + visible: key.keyImageLeft != "" || key.keyImageCenter != "" || key.keyImageRight != "" ? 1 : 0 + Image { + id: backgroundImage_left + anchors.left: parent.left + height: parent.height + fillMode: Image.PreserveAspectFit + source: key.keyImageLeft + } + Image { + id: backgroundImage_right + anchors.right: parent.right + height: parent.height + fillMode: Image.PreserveAspectFit + source: key.keyImageRight + } + Image { + id: backgroundImage_center + anchors.fill: parent + anchors.leftMargin: backgroundImage_left.width - 1 + anchors.rightMargin: backgroundImage_right.width - 1 + height: parent.height + fillMode: Image.Stretch + source: key.keyImageCenter + } + } + + Rectangle { + id: backgroundItem + anchors.fill: parent + anchors.margins: key.keyBounds + color: key.isChecked || mouseArea.pressed ? key.keyPressedColor : key.keyColor; + opacity: key.keyPressedColorOpacity + } + + Column + { + anchors.centerIn: backgroundItem + + Text { + id: secondaryLabelsItem + smooth: true + anchors.right: parent.right + visible: true //secondaryLabelVisible + text: secondaryLabels.length > 0 ? secondaryLabels : "" + color: secondaryFontColor + + font.pixelSize: secondaryFontSize + font.weight: Font.Light + font.family: secondaryFontFamily + font.capitalization: upperCase ? Font.AllUppercase : + Font.MixedCase + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + + Image { + id: icon + smooth: true + anchors.verticalCenter: parent.verticalCenter + source: iconSource + //sourceSize.width: key.width * 0.6 + sourceSize.height: key.height * 0.4 + } + + Text { + id: mainLabelItem + smooth: true + anchors.verticalCenter: parent.verticalCenter + text: mainLabel + color: mainFontColor + visible: iconSource ? false : true + + font.pixelSize: mainFontSize + font.weight: Font.Light + font.family: mainFontFamily + font.capitalization: upperCase ? Font.AllUppercase : + Font.MixedCase + } + } + } + + Row { + id: alternatesRow + property int selectedIndex: -1 + visible: false + anchors.bottom: backgroundItem.top + anchors.left: backgroundItem.left + + Repeater { + model: secondaryLabels.length + + Rectangle { + property bool isSelected: alternatesRow.selectedIndex == index + color: isSelected ? mainLabelItem.color : key.keyPressedColor + height: backgroundItem.height + width: backgroundItem.width + + Text { + anchors.centerIn: parent + text: secondaryLabels[ index ] + font: mainLabelItem.font + color: isSelected ? key.keyPressedColor : mainLabelItem.color + } + } + } + } + + MouseArea { + id: mouseArea + anchors.fill: parent + onPressAndHold: alternatesRow.visible = true + onClicked: { + if (key.isChekable) key.isChecked = !key.isChecked + key.clicked() + } + + onReleased: { + alternatesRow.visible = false + if (alternatesRow.selectedIndex > -1) + key.alternatesClicked(secondaryLabels[alternatesRow.selectedIndex]) + } + + onMouseXChanged: { + alternatesRow.selectedIndex = + (mouseY < 0 && mouseX > 0 && mouseY < alternatesRow.width) ? + Math.floor(mouseX / backgroundItem.width) : + -1; + } + } +} diff --git a/src/modules/keyboardq/data/Keyboard.qml b/src/modules/keyboardq/data/Keyboard.qml new file mode 100644 index 000000000..a804ca9f4 --- /dev/null +++ b/src/modules/keyboardq/data/Keyboard.qml @@ -0,0 +1,222 @@ +/* === This file is part of Calamares - === + * + * Copyright 2021, Anke Boersma + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +import QtQuick 2.15 +import QtQuick.XmlListModel 2.10 + +Item { + id: keyboard + + width: 1024 + height: 640 + + property int rows: 4; + property int columns: 10; + + property string source: "generic.xml" + property var target; + + property color backgroundColor: "black" + + property var keyImageLeft: "" + property var keyImageRight: "" + property var keyImageCenter: "" + + property color keyColor: "#404040" + property color keyPressedColor: "grey" + property int keyBounds: 2 + property var keyPressedColorOpacity: 1 + + property var mainFontFamily: "Roboto" + property color mainFontColor: "white" + property int mainFontSize: 59 + + property var secondaryFontFamily: "Roboto" + property color secondaryFontColor: "white" + property int secondaryFontSize: 30 + + property bool secondaryLabelsVisible: false + property bool doSwitchSource: true + + property bool allUpperCase: false + + signal keyClicked(string key) + signal switchSource(string source) + signal enterClicked() + + Rectangle { + id: root + anchors.fill: parent + color: backgroundColor + + property int keyWidth: keyboard.width / columns; + property int keyHeight: keyboard.height / rows; + + property int xmlIndex: 1 + + Text { + id: proxyMainTextItem + color: keyboard.mainFontColor + font.pixelSize: keyboard.mainFontSize + font.weight: Font.Light + font.family: keyboard.mainFontFamily + font.capitalization: keyboard.allUpperCase ? Font.AllUppercase : + Font.MixedCase + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Text { + id: proxySecondaryTextItem + color: keyboard.secondaryFontColor + font.pixelSize: keyboard.secondaryFontSize + font.weight: Font.Light + font.family: keyboard.secondaryFontFamily + font.capitalization: keyboard.allUpperCase ? Font.AllUppercase : + Font.MixedCase + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Column { + id: column + anchors.centerIn: parent + + Repeater { + id: rowRepeater + + model: XmlListModel { + id: keyboardModel + source: keyboard.source + query: "/Keyboard/Row" + + Behavior on source { + NumberAnimation { + easing.type: Easing.InOutSine + duration: 100 + } + } + } + + Row { + id: keyRow + property int rowIndex: index + anchors.horizontalCenter: if(parent) parent.horizontalCenter + + Repeater { + id: keyRepeater + + model: XmlListModel { + source: keyboard.source + query: "/Keyboard/Row[" + (rowIndex + 1) + "]/Key" + + XmlRole { name: "labels"; query: "@labels/string()" } + XmlRole { name: "ratio"; query: "@ratio/number()" } + XmlRole { name: "icon"; query: "@icon/string()" } + XmlRole { name: "checkable"; query: "@checkable/string()" } + } + + Key { + id: key + width: root.keyWidth * ratio + height: root.keyHeight + iconSource: icon + mainFontFamily: proxyMainTextItem.font + mainFontColor: proxyMainTextItem.color + secondaryFontFamily: proxySecondaryTextItem.font + secondaryFontColor: proxySecondaryTextItem.color + secondaryLabelVisible: keyboard.secondaryLabelsVisible + keyColor: keyboard.keyColor + keyImageLeft: keyboard.keyImageLeft + keyImageRight: keyboard.keyImageRight + keyImageCenter: keyboard.keyImageCenter + keyPressedColor: keyboard.keyPressedColor + keyPressedColorOpacity: keyboard.keyPressedColorOpacity + keyBounds: keyboard.keyBounds + isChekable: checkable + isChecked: isChekable && + command && + command === "shift" && + keyboard.allUpperCase + upperCase: keyboard.allUpperCase + + property var command + property var params: labels + + onParamsChanged: { + var labelSplit; + + if(params[0] === '|') + { + mainLabel = '|' + labelSplit = params + } + else + { + labelSplit = params.split(/[|]+/) + + if (labelSplit[0] === '!') + mainLabel = '!'; + else + mainLabel = params.split(/[!|]+/)[0].toString(); + } + + if (labelSplit[1]) secondaryLabels = labelSplit[1]; + + if (labelSplit[0] === '!') + command = params.split(/[!|]+/)[1]; + else + command = params.split(/[!]+/)[1]; + } + + onClicked: { + if (command) + { + var commandList = command.split(":"); + + switch(commandList[0]) + { + case "source": + keyboard.switchSource(commandList[1]) + if(doSwitchSource) keyboard.source = commandList[1] + return; + case "shift": + keyboard.allUpperCase = !keyboard.allUpperCase + return; + case "backspace": + keyboard.keyClicked('\b'); + target.text = target.text.substring(0,target.text.length-1) + return; + case "enter": + keyboard.enterClicked() + return; + case "tab": + keyboard.keyClicked('\t'); + target.text = target.text + " " + return; + default: return; + } + } + if (mainLabel.length === 1) + root.emitKeyClicked(mainLabel); + } + onAlternatesClicked: root.emitKeyClicked(symbol); + } + } + } + } + } + + function emitKeyClicked(text) { + var emitText = keyboard.allUpperCase ? text.toUpperCase() : text; + keyClicked( emitText ); + target.text = target.text + emitText + } + } +} + diff --git a/src/modules/keyboardq/data/afgani.xml b/src/modules/keyboardq/data/afgani.xml new file mode 100644 index 000000000..356e393f7 --- /dev/null +++ b/src/modules/keyboardq/data/afgani.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/ar.xml b/src/modules/keyboardq/data/ar.xml new file mode 100644 index 000000000..07bd9b087 --- /dev/null +++ b/src/modules/keyboardq/data/ar.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/backspace.svg b/src/modules/keyboardq/data/backspace.svg new file mode 100755 index 000000000..4d29e246c --- /dev/null +++ b/src/modules/keyboardq/data/backspace.svg @@ -0,0 +1,7 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + diff --git a/src/modules/keyboardq/data/backspace.svg.license b/src/modules/keyboardq/data/backspace.svg.license new file mode 100644 index 000000000..36158c604 --- /dev/null +++ b/src/modules/keyboardq/data/backspace.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019 https://www.onlinewebfonts.com/fonts +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/button_bkg_center.png b/src/modules/keyboardq/data/button_bkg_center.png new file mode 100755 index 0000000000000000000000000000000000000000..d17e1698e0b6a10ecdf25905f34ff88760536a95 GIT binary patch literal 4289 zcmeHLeLRzU8=tdqj=Yq2hIQoKFfsDF$e1tNQKmqRES;_9nPaVF>7WH zPgY8FNOC%*jR=pD*GNi*wVvNLq^Ccg^Uw3&bAP`3?Y@8aZ`bd-zSsA~2q3EBKN~@b_?qF#psV0~f1eUA$Z%km|hE{0K=1 z1PbxR6EJJmtXaEut)il$l9H0Lva*VbimIxrnwpxry1IsjhNdQfCJYAC($dn_*4EJh z(1C+v9ekY->wW}>?vJ{FSOZw2P$(N402^Cd+l{t18^O2{ zV56O#oxQ!CgM+=Jql1%^qmz@9vonA*8jaqx31E|pi;Jr(fa~VXo88<1+%Oo7yE}lp zhld9i>yE{O5$oyciNj%WI56V8a5(QRTkv=s9>2v4kN5Tl@bdBT_Qm70sI02{0Y9k1V29lI0*$gGpPr0tAPI zYz++w4h3TUEjXcP7~HjilC;{iM9sZCZxkRT9pv zC@JadpDcM=GPQp&FkFFGagOGc~eZIc!HQa_NB z`({y`)3=HiaO3jxdwX~NvoC4l+CTdX98%}ssa>-8tD~Z!p`m!RNw}2 zdsmYE+=bEcXT;K6XN;G#t@go%$#7i!POWD;2RK@z*>jt`9cj&Sw)^^NV{Uo&DKkY> zrm@GBn&(EGnbQ@fW$hN9-4cVxqu@E_Ua3O`TgYlcOgr@(!P+fJ+vuz;(2D--26@EstL}|lL@E~ z@9GtIMsjt^p~Ce9rlln9FCj_i0G@`hW#Pc14ZNXaRFpS74TA(MQJ`i8vkmSC$WK4l8 zq5tPFCCLiYt@#Ed)!rRdsa9&aGk?SlJ@&iBpN)U>e!i=P+df;B+g|03l|Hkcc}$7l zp8Tn=lP|Gme$UkNXIXmfgk6yky_kPcBnSoPXSyP-Z-bBP_GIXcK)VKO3KWtnNwWjiVt-SS37SU zpxW3movNJj9j#{wGx(W{qvTy3l!e{R_ZI%5(I{nD4%@wGbiaAZ!jg5D9!I%A>}!n9N$#*h5=Dj{3ytU^@KzLGguMRL$yjDbLsMw3*5D|#mWVlJ1Rs(e9@rLgupbFfPk zF47_LUWIpvnvoI1v-u__hPEtznewgGCa~_~L~dgd*JFXIN$Q+K+_hn9%Q4;t%PNY= zSY}t0tN=ag=uzO0IF^9Ld}fz5744v`UsowF73HutzU%PbyaoJwp~`pWrjgMfL7aj z?ug|hjJjNfDiG~Tm#?H}pkA7GgUpK7eXR`wseyS#T8awmVoIwr(#`|!#7^dakwWH@ zF0*w-j%3mtyGEBn%B<}i%mYdWddQ%WE|INd8QX6o&;LEzw!wjX0$Yh~jT zP-<{%f|rwsGoj2tSRfi95A2?}&)tov{gh?*0$WksX%7XVMxtpE!ul1*CtiS|gNd@H zp5bierHB_JVvI`}RMusv@c1Ih5w(E=`vFBa*vlqX2t?OUNKu89FejotqG_RASp?|? zxke6AJzt9bk1UAXm6_Pbd<5+jSG^4NYBSsk>8H&rXhwe@Qf&ZRQTHIMBz+LzqId~n zxe8@3O0))vwV&KBkEpg^*_A|l2!Fwg{;FzJc=*L@dNVzWLbqqorFduJxQ2`R5fZtg zCjhNg98KqE+!=5B!t}~25~@7)qgs2<*pjfk@)`O!x()6y(ns7$V+7c9vW>sKIcQe*eS2xyKT$lyrvBDmHp zb5K#9(seELsE-mMv1WGsT3B5kv3**BHLfmj2~>ejL~xNT=Ris5M68)JYcpw!!Yd@N z0P1kO_Elpp#mtU%iL_e&6&85x;hgVLqY4v1s1<_>>~k6dBsG69k78!YvSdg~+2o=Y z8r|8$I^87R11PMcD47Cd4Qq89Ff^p=)`C8n1noVE>YcWY?m+Q#g5S!fC-4x>1BX$q zjdc+nNY*6D0ZuA>>2j&S6{l;gmwEY=qQ5JyEV0o4&0bEDTu*Y&EPASR%az-DM*S^U z_No2y*u%Nq@XY-#h09gL#^HLww+x(9vv6}Qw~cOX-kALS^XFev^|YBtP|hbL711zv#dW(_%e2Akjk>A$Ll zAIz7&03Q)#jU72?@AQDLUV3ovtU5gXRrSo8u}4|O=gwdX*gxecm!)1t6r90OFW16K zJ%ja(Pw=pL&P7xEStg14fdc{88KyP#1Z~T?+=<#|GW9fkWNY!k+m$I3*EGqj#2Au3 zlR_NDF(%0py_v$5sJOT(9E-WSn`KJ5MDFN?GHtKMr!=>4DBMw*z)a@do_kyk!Bpr4 z;xCmcv8siv^`R0W^+m}o^#}ja{bwyFB8tpP8dj{!F(tJoG_Y5L*W{u5tOuHVW4ce8 z2iMlifEVyXyC!x7)2<)V4|+Rbqf%l1GRIcneNF#<$*TEw`|@L>R|?a7GF8k;PRvwR zP3)f+Q_AMZy>rCA@H|BB$r+1Mhtj;O3B|L;gcq-K$t}O2Ut9DJw5E6eo-iVi-kH=K Vre~}J{&s*sJTcyGOjpX`e*=nhff)b* literal 0 HcmV?d00001 diff --git a/src/modules/keyboardq/data/button_bkg_center.png.license b/src/modules/keyboardq/data/button_bkg_center.png.license new file mode 100644 index 000000000..d36c167bb --- /dev/null +++ b/src/modules/keyboardq/data/button_bkg_center.png.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019 MarcoPellin +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/button_bkg_left.png b/src/modules/keyboardq/data/button_bkg_left.png new file mode 100755 index 0000000000000000000000000000000000000000..0a674af6c1a014846efe6cb3531deb7d75b5eb4d GIT binary patch literal 5549 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 +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/button_bkg_right.png b/src/modules/keyboardq/data/button_bkg_right.png new file mode 100755 index 0000000000000000000000000000000000000000..ce7c4ad7146a5fe93dffe60cd90024de6b2ff6d7 GIT binary patch literal 5955 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 aNn=Hcm+F7`RDc;bY8Pqm&gws?$^QpEvgoh? literal 0 HcmV?d00001 diff --git a/src/modules/keyboardq/data/button_bkg_right.png.license b/src/modules/keyboardq/data/button_bkg_right.png.license new file mode 100644 index 000000000..d36c167bb --- /dev/null +++ b/src/modules/keyboardq/data/button_bkg_right.png.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019 MarcoPellin +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/de.xml b/src/modules/keyboardq/data/de.xml new file mode 100644 index 000000000..55513157e --- /dev/null +++ b/src/modules/keyboardq/data/de.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/empty.xml b/src/modules/keyboardq/data/empty.xml new file mode 100644 index 000000000..74e913a07 --- /dev/null +++ b/src/modules/keyboardq/data/empty.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/en.xml b/src/modules/keyboardq/data/en.xml new file mode 100644 index 000000000..2ab9a344d --- /dev/null +++ b/src/modules/keyboardq/data/en.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/enter.svg b/src/modules/keyboardq/data/enter.svg new file mode 100755 index 000000000..c66a74921 --- /dev/null +++ b/src/modules/keyboardq/data/enter.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/enter.svg.license b/src/modules/keyboardq/data/enter.svg.license new file mode 100644 index 000000000..36158c604 --- /dev/null +++ b/src/modules/keyboardq/data/enter.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019 https://www.onlinewebfonts.com/fonts +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/es.xml b/src/modules/keyboardq/data/es.xml new file mode 100644 index 000000000..6f69c9cbe --- /dev/null +++ b/src/modules/keyboardq/data/es.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/fr.xml b/src/modules/keyboardq/data/fr.xml new file mode 100644 index 000000000..0f77c3f06 --- /dev/null +++ b/src/modules/keyboardq/data/fr.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/generic.xml b/src/modules/keyboardq/data/generic.xml new file mode 100644 index 000000000..7304626c4 --- /dev/null +++ b/src/modules/keyboardq/data/generic.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/generic_qz.xml b/src/modules/keyboardq/data/generic_qz.xml new file mode 100644 index 000000000..c896f59ff --- /dev/null +++ b/src/modules/keyboardq/data/generic_qz.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/pt.xml b/src/modules/keyboardq/data/pt.xml new file mode 100644 index 000000000..0142260ee --- /dev/null +++ b/src/modules/keyboardq/data/pt.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/ru.xml b/src/modules/keyboardq/data/ru.xml new file mode 100644 index 000000000..38f2b6836 --- /dev/null +++ b/src/modules/keyboardq/data/ru.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/scan.xml b/src/modules/keyboardq/data/scan.xml new file mode 100644 index 000000000..76981f3c1 --- /dev/null +++ b/src/modules/keyboardq/data/scan.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardq/data/shift.license b/src/modules/keyboardq/data/shift.license new file mode 100644 index 000000000..36158c604 --- /dev/null +++ b/src/modules/keyboardq/data/shift.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019 https://www.onlinewebfonts.com/fonts +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/modules/keyboardq/data/shift.svg b/src/modules/keyboardq/data/shift.svg new file mode 100755 index 000000000..825ba649b --- /dev/null +++ b/src/modules/keyboardq/data/shift.svg @@ -0,0 +1,7 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + diff --git a/src/modules/keyboardq/keyboardq.qml b/src/modules/keyboardq/keyboardq.qml index 8f8bf05d1..1d59cf30e 100644 --- a/src/modules/keyboardq/keyboardq.qml +++ b/src/modules/keyboardq/keyboardq.qml @@ -1,200 +1,138 @@ -/* === This file is part of Calamares - === +/* === This file is part of Calamares - === * - * SPDX-FileCopyrightText: 2020 Anke Boersma + * SPDX-FileCopyrightText: 2020 - 2021 Anke Boersma * SPDX-License-Identifier: GPL-3.0-or-later * - * Calamares is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Calamares is Free Software: see the License-Identifier above. * - * Calamares is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Calamares. If not, see . */ import io.calamares.core 1.0 import io.calamares.ui 1.0 -import QtQuick 2.10 -import QtQuick.Controls 2.10 +import QtQuick 2.15 +import QtQuick.Controls 2.15 import QtQuick.Window 2.14 import QtQuick.Layouts 1.3 import org.kde.kirigami 2.7 as Kirigami +import "data" -Page { +Item { width: 800 //parent.width - height: 500 + height: 600 - StackView { - id: stack + readonly property color backgroundColor: "#E6E9EA" //Kirigami.Theme.backgroundColor + readonly property color listBackgroundColor: "white" + readonly property color textFieldColor: "#121212" + readonly property color textFieldBackgroundColor: "#F8F8F8" + readonly property color textColor: Kirigami.Theme.textColor + readonly property color highlightedTextColor: Kirigami.Theme.highlightedTextColor + readonly property color highlightColor: Kirigami.Theme.highlightColor + + property var langXml: ["de", "en", "es", "fr", "ru",] + property var arXml: ["Arabic"] + property var ruXml: ["Azerba", "Belaru", "Kazakh", "Kyrgyz", "Mongol", + "Russia", "Tajik", "Ukrain"] + property var frXml: ["Bambar", "Belgia","French", "Wolof"] + property var enXml: ["Bikol", "Chines", "Englis", "Irish", "Lithua", "Maori"] + property var esXml: ["Spanis"] + property var deXml: ["German"] + property var ptXml: ["Portug"] + property var scanXml: ["Danish", "Finnis", "Norweg", "Swedis"] + property var afganiXml: ["Afghan"] + property var genericXml: ["Armeni", "Bulgar", "Dutch", "Estoni", "Icelan", + "Indone", "Italia", "Latvia", "Maltes", "Moldav", "Romani", "Swahil", "Turkis"] + property var genericQzXml: ["Albani", "Bosnia", "Croati", "Czech", "Hungar", + "Luxemb", "Monten", "Polish", "Serbia", "Sloven", "Slovak"] + property var genericAzXml: [] + + property var keyIndex: [] + + Rectangle { + id: backgroundItem anchors.fill: parent - clip: true + color: backgroundColor - initialItem: Item { + Label { + id: header + anchors.horizontalCenter: parent.horizontalCenter + text: qsTr("To activate keyboard preview, select a layout.") + color: textColor + font.bold: true + } + + Label { + id: intro + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: header.bottom + color: textColor + horizontalAlignment: Text.AlignHCenter + width: parent.width / 1.2 + wrapMode: Text.WordWrap + text: ( config.prettyStatus) + } + + RowLayout { + id: models + anchors.top: intro.bottom + anchors.topMargin: 10 + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width /1.5 + spacing: 10 Label { - - id: header - anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("Keyboard Model") - color: Kirigami.Theme.textColor + Layout.alignment: Qt.AlignCenter + text: qsTr("Keyboard Model:") + color: textColor font.bold: true - font.weight: Font.Bold - font.pointSize: 24 } - Label { - - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: header.bottom - color: Kirigami.Theme.textColor - horizontalAlignment: Text.AlignHCenter - width: parent.width / 1.5 - wrapMode: Text.WordWrap - text: qsTr("Click your preferred keyboard model to select layout and variant, or use the default one based on the detected hardware.") - } - - ListView { - - id: list1 - - ScrollBar.vertical: ScrollBar { - - active: true - } - - width: parent.width / 2 - height: 250 - anchors.centerIn: parent - anchors.verticalCenterOffset: -30 - focus: true - clip: true - boundsBehavior: Flickable.StopAtBounds - spacing: 2 - - Rectangle { - - z: parent.z - 1 - anchors.fill: parent - color: "#BDC3C7" - radius: 5 - opacity: 0.7 - } - + ComboBox { + Layout.fillWidth: true + textRole: "label" model: config.keyboardModelsModel - //model: ["Africa", "America", "Antarctica", "Arctic", "Asia", "Atlantic", "Australia", "Europe", "Indian", "Pacific"] - currentIndex: model.currentIndex - delegate: ItemDelegate { - - hoverEnabled: true - width: parent.width - highlighted: ListView.isCurrentItem - - RowLayout { - anchors.fill: parent - - Label { - - text: model.label // modelData - Layout.fillHeight: true - Layout.fillWidth: true - width: parent.width - height: 32 - color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor - - background: Rectangle { - - color: highlighted || hovered ? Kirigami.Theme.highlightColor : "white" //Kirigami.Theme.backgroundColor - opacity: highlighted || hovered ? 0.5 : 0.3 - } - } - - Kirigami.Icon { - - source: "checkmark" - Layout.preferredWidth: 22 - Layout.preferredHeight: 22 - color: Kirigami.Theme.highlightedTextColor - visible: highlighted - } - } - - onClicked: { - - list1.model.currentIndex = index - stack.push(layoutsList) - list1.positionViewAtIndex(index, ListView.Center) - } - } + onCurrentIndexChanged: config.keyboardModels = currentIndex } } - Component { - id: layoutsList + StackView { + id: stack + anchors.top: models.bottom + anchors.topMargin: 10 + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + clip: true - Item { - - Label { - - id: header - anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("Keyboard Layout") - color: Kirigami.Theme.textColor - font.bold: true - font.weight: Font.Bold - font.pointSize: 24 - } - - Label { - - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: header.bottom - color: Kirigami.Theme.textColor - horizontalAlignment: Text.AlignHCenter - width: parent.width / 1.5 - wrapMode: Text.WordWrap - text: config.prettyStatus - //text: qsTr("Set keyboard model or use the default one based on the detected hardware.") - } + initialItem: Item { ListView { - - id: list2 + id: layouts ScrollBar.vertical: ScrollBar { - active: true } width: parent.width / 2 - height: 250 - anchors.centerIn: parent - anchors.verticalCenterOffset: -30 + height: 200 + anchors.horizontalCenter: parent.horizontalCenter focus: true clip: true boundsBehavior: Flickable.StopAtBounds spacing: 2 Rectangle { - z: parent.z - 1 anchors.fill: parent - color: "#BDC3C7" - radius: 5 + color: listBackgroundColor opacity: 0.7 } model: config.keyboardLayoutsModel - //model: ["Brussels", "London", "Madrid", "New York", "Melbourne", "London", "Madrid", "New York", "Brussels", "London", "Madrid", "New York", "Brussels", "London", "Madrid", "New York"] - currentIndex: model.currentIndex + Component.onCompleted: positionViewAtIndex(model.currentIndex, ListView.Center) delegate: ItemDelegate { hoverEnabled: true @@ -202,203 +140,169 @@ Page { highlighted: ListView.isCurrentItem RowLayout { - anchors.fill: parent + anchors.fill: parent Label { - - text: model.label // modelData + id: label1 + text: model.label Layout.fillHeight: true Layout.fillWidth: true + padding: 10 width: parent.width - height: 30 - color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor + height: 32 + color: highlighted ? highlightedTextColor : textColor background: Rectangle { - - color: highlighted || hovered ? Kirigami.Theme.highlightColor : "white" //Kirigami.Theme.backgroundColor + color: highlighted || hovered ? highlightColor : listBackgroundColor opacity: highlighted || hovered ? 0.5 : 0.3 } } - - Kirigami.Icon { - - source: "checkmark" - Layout.preferredWidth: 22 - Layout.preferredHeight: 22 - color: Kirigami.Theme.highlightedTextColor - visible: highlighted - } } onClicked: { - list2.model.currentIndex = index + layouts.model.currentIndex = index + keyIndex = label1.text.substring(0,6) stack.push(variantsList) - list2.positionViewAtIndex(index, ListView.Center) + layouts.positionViewAtIndex(index, ListView.Center) } } } - - ColumnLayout { - - spacing: 2 - anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: -30 - anchors.left: parent.left - anchors.leftMargin: parent.width / 15 - - Button { - - icon.name: "go-previous" - text: qsTr("Models") - onClicked: stack.pop() - } - - Button { - - icon.name: "go-next" - text: qsTr("Variants") - onClicked: stack.push(variantsList) - } - } - } - } - - Component { - id: variantsList - - Item { - - Label { - - id: header - anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("Keyboard Variant") - color: Kirigami.Theme.textColor - font.bold: true - font.weight: Font.Bold - font.pointSize: 24 - } - - Label { - - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: header.bottom - color: Kirigami.Theme.textColor - horizontalAlignment: Text.AlignHCenter - width: parent.width / 1.5 - wrapMode: Text.WordWrap - text: config.prettyStatus - //text: qsTr("Variant keyboard model or use the default one based on the detected hardware.") - } - - ListView { - - id: list3 - - ScrollBar.vertical: ScrollBar { - - active: true - } - - width: parent.width / 2 - height: 250 - anchors.centerIn: parent - anchors.verticalCenterOffset: -30 - focus: true - clip: true - boundsBehavior: Flickable.StopAtBounds - spacing: 2 - - Rectangle { - - z: parent.z - 1 - anchors.fill: parent - color: "#BDC3C7" - radius: 5 - opacity: 0.7 - } - - model: config.keyboardVariantsModel - //model: ["Brussels", "London", "Madrid", "New York", "Melbourne", "London", "Madrid", "New York", "Brussels", "London", "Madrid", "New York", "Brussels", "London", "Madrid", "New York"] - - currentIndex: model.currentIndex - delegate: ItemDelegate { - - hoverEnabled: true - width: parent.width - highlighted: ListView.isCurrentItem - - RowLayout { - anchors.fill: parent - - Label { - - text: model.label //modelData - Layout.fillHeight: true - Layout.fillWidth: true - width: parent.width - height: 30 - color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor - - background: Rectangle { - - color: highlighted || hovered ? Kirigami.Theme.highlightColor : "white" //Kirigami.Theme.backgroundColor - opacity: highlighted || hovered ? 0.5 : 0.3 - } - } - - Kirigami.Icon { - - source: "checkmark" - Layout.preferredWidth: 22 - Layout.preferredHeight: 22 - color: Kirigami.Theme.highlightedTextColor - visible: highlighted - } - } - - onClicked: { - - list3.model.currentIndex = index - list3.positionViewAtIndex(index, ListView.Center) - } - } - } - Button { Layout.fillWidth: true anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: -30 - anchors.left: parent.left + anchors.verticalCenterOffset: -parent.height / 3.5 + anchors.left: parent.left anchors.leftMargin: parent.width / 15 - icon.name: "go-previous" - text: qsTr("Layouts") - onClicked: stack.pop() + icon.name: "go-next" + text: qsTr("Variants") + onClicked: stack.push(variantsList) + } + } + + Component { + id: variantsList + + Item { + + ListView { + id: variants + + ScrollBar.vertical: ScrollBar { + active: true + } + + width: parent.width / 2 + height: 200 + anchors.horizontalCenter: parent.horizontalCenter + anchors.topMargin: 10 + focus: true + clip: true + boundsBehavior: Flickable.StopAtBounds + spacing: 2 + + Rectangle { + z: parent.z - 1 + anchors.fill: parent + color: listBackgroundColor + opacity: 0.7 + } + + model: config.keyboardVariantsModel + currentIndex: model.currentIndex + Component.onCompleted: positionViewAtIndex(model.currentIndex, ListView.Center) + + delegate: ItemDelegate { + hoverEnabled: true + width: parent.width + highlighted: ListView.isCurrentItem + + RowLayout { + anchors.fill: parent + + Label { + text: model.label + Layout.fillHeight: true + Layout.fillWidth: true + padding: 10 + width: parent.width + height: 30 + color: highlighted ? highlightedTextColor : textColor + + background: Rectangle { + color: highlighted || hovered ? highlightColor : listBackgroundColor + opacity: highlighted || hovered ? 0.5 : 0.3 + } + } + } + + onClicked: { + variants.model.currentIndex = index + variants.positionViewAtIndex(index, ListView.Center) + } + } + } + + Button { + Layout.fillWidth: true + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: -parent.height / 3.5 + anchors.left: parent.left + anchors.leftMargin: parent.width / 15 + icon.name: "go-previous" + text: qsTr("Layouts") + onClicked: stack.pop() + } } } } - } - TextField { + TextField { + id: textInput + placeholderText: qsTr("Type here to test your keyboard") + height: 36 + width: parent.width / 1.5 + horizontalAlignment: TextInput.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: keyboard.top + anchors.bottomMargin: parent.height / 25 + color: textFieldColor - placeholderText: qsTr("Test your keyboard") - height: 48 - width: parent.width / 1.5 - horizontalAlignment: TextInput.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom - anchors.bottomMargin: parent.height / 10 - color: "#1F1F1F" + background:Rectangle { + z: parent.z - 1 + anchors.fill: parent + color: textFieldBackgroundColor + radius: 2 + } + } - background:Rectangle { - - z: parent.z - 1 - anchors.fill: parent - color: "#BDC3C7" - radius: 2 - opacity: 0.3 + Keyboard { + id: keyboard + width: parent.width + height: parent.height / 3 + anchors.bottom: parent.bottom + source: langXml.includes(keyIndex) ? (keyIndex + ".xml") : + afganiXml.includes(keyIndex) ? "afgani.xml" : + scanXml.includes(keyIndex) ? "scan.xml" : + genericXml.includes(keyIndex) ? "generic.xml" : + genericQzXml.includes(keyIndex) ? "generic_qz.xml" : + arXml.includes(keyIndex) ? "ar.xml" : + deXml.includes(keyIndex) ? "de.xml" : + enXml.includes(keyIndex) ? "en.xml" : + esXml.includes(keyIndex) ? "es.xml" : + frXml.includes(keyIndex) ? "fr.xml" : + ptXml.includes(keyIndex) ? "pt.xml" : + ruXml.includes(keyIndex) ? "ru.xml" :"empty.xml" + rows: 4 + columns: 10 + keyColor: "transparent" + keyPressedColorOpacity: 0.2 + keyImageLeft: "button_bkg_left.png" + keyImageRight: "button_bkg_right.png" + keyImageCenter: "button_bkg_center.png" + target: textInput + onEnterClicked: console.log("Enter!") } } }