diff --git a/debian/control b/debian/control index bed4dc35e..0a52783f6 100644 --- a/debian/control +++ b/debian/control @@ -101,6 +101,7 @@ Depends: autopilot-qt5 (>= 1.4), ubuntu-keyboard-emoji (>= ${source:Version}), ubuntu-keyboard-english (>= ${source:Version}), ubuntu-keyboard-english-dvorak (>= ${source:Version}), + ubuntu-keyboard-english-flick (>= ${source:Version}), ubuntu-keyboard-persian (>= ${source:Version}), ubuntu-keyboard-finnish (>= ${source:Version}), ubuntu-keyboard-french (>= ${source:Version}), @@ -254,6 +255,16 @@ Depends: ubuntu-keyboard (= ${binary:Version}), Description: Ubuntu on-screen keyboard data files - English Dvorak Data files for the Ubuntu virtual keyboard - English Dvorak +Package: ubuntu-keyboard-english-flick +Architecture: any +Depends: ubuntu-keyboard (= ${binary:Version}), + ubuntu-keyboard-english, + hunspell-en-us, + ${misc:Depends}, + ${shlibs:Depends}, +Description: Ubuntu on-screen keyboard data files - English Flick + Data files for the Ubuntu virtual keyboard - English Flick + Package: ubuntu-keyboard-esperanto Architecture: any Depends: ubuntu-keyboard (= ${binary:Version}), diff --git a/debian/ubuntu-keyboard-english-flick.install b/debian/ubuntu-keyboard-english-flick.install new file mode 100644 index 000000000..65f786e80 --- /dev/null +++ b/debian/ubuntu-keyboard-english-flick.install @@ -0,0 +1 @@ +usr/share/maliit/plugins/com/ubuntu/lib/en@flick/ diff --git a/plugins/en@flick/en@flick.pro b/plugins/en@flick/en@flick.pro new file mode 100644 index 000000000..ae754ea32 --- /dev/null +++ b/plugins/en@flick/en@flick.pro @@ -0,0 +1,9 @@ +CONFIG += ordered +TEMPLATE = subdirs +SUBDIRS = \ + src \ + qml + +QMAKE_EXTRA_TARGETS += check +check.target = check +check.CONFIG = recursive diff --git a/plugins/en@flick/qml/Keyboard_en@flick.qml b/plugins/en@flick/qml/Keyboard_en@flick.qml new file mode 100644 index 000000000..f09828d48 --- /dev/null +++ b/plugins/en@flick/qml/Keyboard_en@flick.qml @@ -0,0 +1,171 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import keys 1.0 + +KeyPad { + + anchors.fill: parent; + content: c1 + Column { + id: c1 + property int keyHeight: panel.keyHeight-panel.keyHeight*0.1 + anchors.fill: parent; + spacing: 0 + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + ActionKey{ + width:panel.keyWidth; + height:layout.height; + visHeight:height; + pressedColor: fullScreenItem.theme.actionKeyColor + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ă", "ą", "ȧ", "ā", "ǎ"]:["1", "q", "e", "r", ":"]; + shiftedlabel:symojiKey.state == "marks" ? ["Ă", "Ą", "Ȧ", "Ā", "Ǎ"] :["1", "Q", "E", "R", ":"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŭ", "ų", "ṁ", "ū", "ǔ"] :["2", "t", "y", "u", "g"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŭ", "Ų", "Ṁ", "Ū", "Ǔ"] :["2", "T", "Y", "U", "G"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŏ", "ǫ", "ȯ", "ō", "ǒ"] :["3", "i", "o", "m", ";"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŏ", "Ǫ", "Ȯ", "Ō", "Ǒ"] :["3", "I", "O", "M", ";"] + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + CaseSwitchKey { id: layout; labelright:true} + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ω", "", "ɛ", "д", "ɵ"] : ["#", "", "+", "@", "-"] + shiftedlabel: symojiKey.state == "marks" ? ["Ω", "", "Ɛ", "Д", "Ɵ"] : charlabel + labelleft:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĕ", "ę", "ė", "ē", "ě"] :["4", "a", "w", "d", "s"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĕ", "Ę", "Ė", "Ē", "Ě"] :["4", "A", "W", "D", "S"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĭ", "į", "ḃ", "ī", "ǐ"] :["5", "b", "p", "f", "n"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĭ", "Į", "Ḃ", "Ī", "Ǐ"] :["5", "B", "P", "F", "N"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["đ", "ķ", "ẏ", "ȳ", "ď"]:["6", "h", "k", "l", "j"]; + shiftedlabel: symojiKey.state == "marks" ? ["Đ", "Ķ", "Ẏ", "Ȳ", "Ď"] :["6", "H", "K", "L", "J"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["þ", "ŋ", "æ", "", "œ"] : ["*", "€", "^", "", "$"] + shiftedlabel: symojiKey.state == "marks" ? ["Þ", "Ŋ", "Æ", "", "Œ"] : charlabel + labelright:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + CursorKey { leftSide:true; padding:0; } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ğ", "å", "ġ", "ǵ", "ǧ"] : ["7", "]", "!", "[", "\\"] + shiftedlabel: symojiKey.state == "marks" ? ["Ğ", "Å", "Ġ", "Ǵ", "Ǧ"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ł", "ļ", "ṗ", "ĺ", "ľ"] :["8", "z", "x", "c", "v"] + shiftedlabel: symojiKey.state == "marks" ? ["Ł", "Ļ", "Ṗ", "Ĺ", "Ľ"] :["8", "Z", "X", "C", "V"]; + leaves: charlabel + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ű", "ů", "ż", "ź", "ž"] : ["9", ")", "?", "(", "/"] + shiftedlabel: symojiKey.state == "marks" ? ["Ű", "Ů", "Ż", "Ź", "Ž"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŧ", "ţ", "ṫ", "", "ť"] : ["=", "₹", "£", "", "¥"] + leaves: charlabel + shiftedlabel: symojiKey.state == "marks" ? ["Ŧ", "Ţ", "Ṫ", "", "Ť"] : charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + SymojiKey { id: symojiKey;} + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ø", "ŗ", "ṙ", "ŕ", "ř"] : [",", ">", "&", "<", "_"] + shiftedlabel: symojiKey.state == "marks" ? ["Ø", "Ŗ", "Ṙ", "Ŕ", "Ř"] : charlabel + leaves: symojiKey.state == "marks" ? charlabel : [",", ">", "&", "<", "_"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : leaves + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ő", "ç", "ċ", "ć", "č"] : ["0", "'", "`", "\"", "%"] + shiftedlabel: symojiKey.state == "marks" ? ["Ő", "Ç", "Ċ", "Ć", "Č"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ə", "ş", "ṡ", "ś", "š"] : [".", "}", "|", "{", "~"] + shiftedlabel: symojiKey.state == "marks" ? ["Ə", "Ş", "Ṡ", "Ś", "Š"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + BackspaceKey { rightSide: true; width: panel.keyWidth;visHeight:layout.height;} + } + + } // column + Row{ + anchors.horizontalCenter: parent.horizontalCenter; + anchors.left:parent.left + anchors.bottom:parent.bottom + spacing: 0 + + LayoutBar { + id: layoutBar; + width: parent.width; + height:layout.height-layout.height*0.5; + visHeight:height; + fontSize:fontSize; + } + + } +} diff --git a/plugins/en@flick/qml/Keyboard_en@flick_email.qml b/plugins/en@flick/qml/Keyboard_en@flick_email.qml new file mode 100644 index 000000000..28ce9468b --- /dev/null +++ b/plugins/en@flick/qml/Keyboard_en@flick_email.qml @@ -0,0 +1,172 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import keys 1.0 + +KeyPad { + + anchors.fill: parent; + content: c1 + Column { + id: c1 + property int keyHeight: panel.keyHeight-panel.keyHeight*0.1 + anchors.fill: parent; + spacing: 0 + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + ActionKey{ + width:panel.keyWidth; + height:layout.height; + visHeight:height; + pressedColor: fullScreenItem.theme.actionKeyColor + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ă", "ą", "ȧ", "ā", "ǎ"]:["1", "q", "e", "r", ":"]; + shiftedlabel:symojiKey.state == "marks" ? ["Ă", "Ą", "Ȧ", "Ā", "Ǎ"] :["1", "Q", "E", "R", ":"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŭ", "ų", "ṁ", "ū", "ǔ"] :["2", "t", "y", "u", "g"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŭ", "Ų", "Ṁ", "Ū", "Ǔ"] :["2", "T", "Y", "U", "G"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŏ", "ǫ", "ȯ", "ō", "ǒ"] :["3", "i", "o", "m", ";"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŏ", "Ǫ", "Ȯ", "Ō", "Ǒ"] :["3", "I", "O", "M", ";"] + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + CaseSwitchKey { id: layout; labelright:true} + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ω", "", "ɛ", "д", "ɵ"] : ["#", "", "+", "@", "-"] + shiftedlabel: symojiKey.state == "marks" ? ["Ω", "", "Ɛ", "Д", "Ɵ"] : charlabel + labelleft:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĕ", "ę", "ė", "ē", "ě"] :["4", "a", "w", "d", "s"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĕ", "Ę", "Ė", "Ē", "Ě"] :["4", "A", "W", "D", "S"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĭ", "į", "ḃ", "ī", "ǐ"] :["5", "b", "p", "f", "n"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĭ", "Į", "Ḃ", "Ī", "Ǐ"] :["5", "B", "P", "F", "N"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["đ", "ķ", "ẏ", "ȳ", "ď"]:["6", "h", "k", "l", "j"]; + shiftedlabel: symojiKey.state == "marks" ? ["Đ", "Ķ", "Ẏ", "Ȳ", "Ď"] :["6", "H", "K", "L", "J"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["þ", "ŋ", "æ", "", "œ"] : ["*", "€", "^", "", "$"] + shiftedlabel: symojiKey.state == "marks" ? ["Þ", "Ŋ", "Æ", "", "Œ"] : charlabel + labelright:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + CursorKey { leftSide:true; padding:0; } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ğ", "å", "ġ", "ǵ", "ǧ"] : ["7", "]", "!", "[", "\\"] + shiftedlabel: symojiKey.state == "marks" ? ["Ğ", "Å", "Ġ", "Ǵ", "Ǧ"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ł", "ļ", "ṗ", "ĺ", "ľ"] :["8", "z", "x", "c", "v"] + shiftedlabel: symojiKey.state == "marks" ? ["Ł", "Ļ", "Ṗ", "Ĺ", "Ľ"] :["8", "Z", "X", "C", "V"]; + leaves: charlabel + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ű", "ů", "ż", "ź", "ž"] : ["9", ")", "?", "(", "/"] + shiftedlabel: symojiKey.state == "marks" ? ["Ű", "Ů", "Ż", "Ź", "Ž"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŧ", "ţ", "ṫ", "", "ť"] : ["=", "₹", "£", "", "¥"] + leaves: charlabel + shiftedlabel: symojiKey.state == "marks" ? ["Ŧ", "Ţ", "Ṫ", "", "Ť"] : charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + SymojiKey { id: symojiKey;} + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ø", "ŗ", "ṙ", "ŕ", "ř"] : [",", ">", "&", "<", "_"] + shiftedlabel: symojiKey.state == "marks" ? ["Ø", "Ŗ", "Ṙ", "Ŕ", "Ř"] : charlabel + leaves: symojiKey.state == "marks" ? charlabel : [",", ">", "&", "<", "_"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : leaves + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ő", "ç", "ċ", "ć", "č"] : ["0", "'", "`", "\"", "%"] + shiftedlabel: symojiKey.state == "marks" ? ["Ő", "Ç", "Ċ", "Ć", "Č"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + StringKey { + charlabel: symojiKey.state == "marks" ? ["ə", "ş", "ṡ", "ś", "š"] : [".", ".io", ".com", ".org",".net"] + shiftedlabel: symojiKey.state == "marks" ? ["Ə", "Ş", "Ṡ", "Ś", "Š"] : [".", "}", "#", "{", "~"]; + leaves: symojiKey.state == "marks" ? charlabel : [".", ".io", ".com", ".org",".net"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : [".", "}", "#", "{", "~"]; + unstyledLeaves: symojiKey.state == "marks" ? shiftedlabel : (panel.activeKeypadState === "NORMAL") ? [".", ".io", ".com", ".org",".net"]: shiftedlabel; + } + BackspaceKey { rightSide: true; width: panel.keyWidth;visHeight:layout.height;} + } + + } // column + Row{ + anchors.horizontalCenter: parent.horizontalCenter; + anchors.left:parent.left + anchors.bottom:parent.bottom + spacing: 0 + + LayoutBar { + id: layoutBar; + width: parent.width; + height:layout.height-layout.height*0.5; + visHeight:height; + fontSize:fontSize; + } + + } +} diff --git a/plugins/en@flick/qml/Keyboard_en@flick_url.qml b/plugins/en@flick/qml/Keyboard_en@flick_url.qml new file mode 100644 index 000000000..28ce9468b --- /dev/null +++ b/plugins/en@flick/qml/Keyboard_en@flick_url.qml @@ -0,0 +1,172 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import keys 1.0 + +KeyPad { + + anchors.fill: parent; + content: c1 + Column { + id: c1 + property int keyHeight: panel.keyHeight-panel.keyHeight*0.1 + anchors.fill: parent; + spacing: 0 + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + ActionKey{ + width:panel.keyWidth; + height:layout.height; + visHeight:height; + pressedColor: fullScreenItem.theme.actionKeyColor + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ă", "ą", "ȧ", "ā", "ǎ"]:["1", "q", "e", "r", ":"]; + shiftedlabel:symojiKey.state == "marks" ? ["Ă", "Ą", "Ȧ", "Ā", "Ǎ"] :["1", "Q", "E", "R", ":"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŭ", "ų", "ṁ", "ū", "ǔ"] :["2", "t", "y", "u", "g"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŭ", "Ų", "Ṁ", "Ū", "Ǔ"] :["2", "T", "Y", "U", "G"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŏ", "ǫ", "ȯ", "ō", "ǒ"] :["3", "i", "o", "m", ";"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŏ", "Ǫ", "Ȯ", "Ō", "Ǒ"] :["3", "I", "O", "M", ";"] + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + CaseSwitchKey { id: layout; labelright:true} + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ω", "", "ɛ", "д", "ɵ"] : ["#", "", "+", "@", "-"] + shiftedlabel: symojiKey.state == "marks" ? ["Ω", "", "Ɛ", "Д", "Ɵ"] : charlabel + labelleft:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĕ", "ę", "ė", "ē", "ě"] :["4", "a", "w", "d", "s"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĕ", "Ę", "Ė", "Ē", "Ě"] :["4", "A", "W", "D", "S"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĭ", "į", "ḃ", "ī", "ǐ"] :["5", "b", "p", "f", "n"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĭ", "Į", "Ḃ", "Ī", "Ǐ"] :["5", "B", "P", "F", "N"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["đ", "ķ", "ẏ", "ȳ", "ď"]:["6", "h", "k", "l", "j"]; + shiftedlabel: symojiKey.state == "marks" ? ["Đ", "Ķ", "Ẏ", "Ȳ", "Ď"] :["6", "H", "K", "L", "J"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["þ", "ŋ", "æ", "", "œ"] : ["*", "€", "^", "", "$"] + shiftedlabel: symojiKey.state == "marks" ? ["Þ", "Ŋ", "Æ", "", "Œ"] : charlabel + labelright:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + CursorKey { leftSide:true; padding:0; } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ğ", "å", "ġ", "ǵ", "ǧ"] : ["7", "]", "!", "[", "\\"] + shiftedlabel: symojiKey.state == "marks" ? ["Ğ", "Å", "Ġ", "Ǵ", "Ǧ"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ł", "ļ", "ṗ", "ĺ", "ľ"] :["8", "z", "x", "c", "v"] + shiftedlabel: symojiKey.state == "marks" ? ["Ł", "Ļ", "Ṗ", "Ĺ", "Ľ"] :["8", "Z", "X", "C", "V"]; + leaves: charlabel + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ű", "ů", "ż", "ź", "ž"] : ["9", ")", "?", "(", "/"] + shiftedlabel: symojiKey.state == "marks" ? ["Ű", "Ů", "Ż", "Ź", "Ž"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŧ", "ţ", "ṫ", "", "ť"] : ["=", "₹", "£", "", "¥"] + leaves: charlabel + shiftedlabel: symojiKey.state == "marks" ? ["Ŧ", "Ţ", "Ṫ", "", "Ť"] : charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + SymojiKey { id: symojiKey;} + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ø", "ŗ", "ṙ", "ŕ", "ř"] : [",", ">", "&", "<", "_"] + shiftedlabel: symojiKey.state == "marks" ? ["Ø", "Ŗ", "Ṙ", "Ŕ", "Ř"] : charlabel + leaves: symojiKey.state == "marks" ? charlabel : [",", ">", "&", "<", "_"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : leaves + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ő", "ç", "ċ", "ć", "č"] : ["0", "'", "`", "\"", "%"] + shiftedlabel: symojiKey.state == "marks" ? ["Ő", "Ç", "Ċ", "Ć", "Č"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + StringKey { + charlabel: symojiKey.state == "marks" ? ["ə", "ş", "ṡ", "ś", "š"] : [".", ".io", ".com", ".org",".net"] + shiftedlabel: symojiKey.state == "marks" ? ["Ə", "Ş", "Ṡ", "Ś", "Š"] : [".", "}", "#", "{", "~"]; + leaves: symojiKey.state == "marks" ? charlabel : [".", ".io", ".com", ".org",".net"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : [".", "}", "#", "{", "~"]; + unstyledLeaves: symojiKey.state == "marks" ? shiftedlabel : (panel.activeKeypadState === "NORMAL") ? [".", ".io", ".com", ".org",".net"]: shiftedlabel; + } + BackspaceKey { rightSide: true; width: panel.keyWidth;visHeight:layout.height;} + } + + } // column + Row{ + anchors.horizontalCenter: parent.horizontalCenter; + anchors.left:parent.left + anchors.bottom:parent.bottom + spacing: 0 + + LayoutBar { + id: layoutBar; + width: parent.width; + height:layout.height-layout.height*0.5; + visHeight:height; + fontSize:fontSize; + } + + } +} diff --git a/plugins/en@flick/qml/Keyboard_en@flick_url_search.qml b/plugins/en@flick/qml/Keyboard_en@flick_url_search.qml new file mode 100644 index 000000000..28ce9468b --- /dev/null +++ b/plugins/en@flick/qml/Keyboard_en@flick_url_search.qml @@ -0,0 +1,172 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import keys 1.0 + +KeyPad { + + anchors.fill: parent; + content: c1 + Column { + id: c1 + property int keyHeight: panel.keyHeight-panel.keyHeight*0.1 + anchors.fill: parent; + spacing: 0 + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + ActionKey{ + width:panel.keyWidth; + height:layout.height; + visHeight:height; + pressedColor: fullScreenItem.theme.actionKeyColor + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ă", "ą", "ȧ", "ā", "ǎ"]:["1", "q", "e", "r", ":"]; + shiftedlabel:symojiKey.state == "marks" ? ["Ă", "Ą", "Ȧ", "Ā", "Ǎ"] :["1", "Q", "E", "R", ":"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŭ", "ų", "ṁ", "ū", "ǔ"] :["2", "t", "y", "u", "g"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŭ", "Ų", "Ṁ", "Ū", "Ǔ"] :["2", "T", "Y", "U", "G"]; + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŏ", "ǫ", "ȯ", "ō", "ǒ"] :["3", "i", "o", "m", ";"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ŏ", "Ǫ", "Ȯ", "Ō", "Ǒ"] :["3", "I", "O", "M", ";"] + leaves:charlabel; + shiftedleaves:shiftedlabel; + } + CaseSwitchKey { id: layout; labelright:true} + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ω", "", "ɛ", "д", "ɵ"] : ["#", "", "+", "@", "-"] + shiftedlabel: symojiKey.state == "marks" ? ["Ω", "", "Ɛ", "Д", "Ɵ"] : charlabel + labelleft:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĕ", "ę", "ė", "ē", "ě"] :["4", "a", "w", "d", "s"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĕ", "Ę", "Ė", "Ē", "Ě"] :["4", "A", "W", "D", "S"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ĭ", "į", "ḃ", "ī", "ǐ"] :["5", "b", "p", "f", "n"]; + shiftedlabel: symojiKey.state == "marks" ? ["Ĭ", "Į", "Ḃ", "Ī", "Ǐ"] :["5", "B", "P", "F", "N"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["đ", "ķ", "ẏ", "ȳ", "ď"]:["6", "h", "k", "l", "j"]; + shiftedlabel: symojiKey.state == "marks" ? ["Đ", "Ķ", "Ẏ", "Ȳ", "Ď"] :["6", "H", "K", "L", "J"]; + leaves: charlabel; + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["þ", "ŋ", "æ", "", "œ"] : ["*", "€", "^", "", "$"] + shiftedlabel: symojiKey.state == "marks" ? ["Þ", "Ŋ", "Æ", "", "Œ"] : charlabel + labelright:true + leaves: charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + CursorKey { leftSide:true; padding:0; } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ğ", "å", "ġ", "ǵ", "ǧ"] : ["7", "]", "!", "[", "\\"] + shiftedlabel: symojiKey.state == "marks" ? ["Ğ", "Å", "Ġ", "Ǵ", "Ǧ"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ł", "ļ", "ṗ", "ĺ", "ľ"] :["8", "z", "x", "c", "v"] + shiftedlabel: symojiKey.state == "marks" ? ["Ł", "Ļ", "Ṗ", "Ĺ", "Ľ"] :["8", "Z", "X", "C", "V"]; + leaves: charlabel + shiftedleaves: shiftedlabel; + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ű", "ů", "ż", "ź", "ž"] : ["9", ")", "?", "(", "/"] + shiftedlabel: symojiKey.state == "marks" ? ["Ű", "Ů", "Ż", "Ź", "Ž"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ŧ", "ţ", "ṫ", "", "ť"] : ["=", "₹", "£", "", "¥"] + leaves: charlabel + shiftedlabel: symojiKey.state == "marks" ? ["Ŧ", "Ţ", "Ṫ", "", "Ť"] : charlabel + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + SymojiKey { id: symojiKey;} + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ø", "ŗ", "ṙ", "ŕ", "ř"] : [",", ">", "&", "<", "_"] + shiftedlabel: symojiKey.state == "marks" ? ["Ø", "Ŗ", "Ṙ", "Ŕ", "Ř"] : charlabel + leaves: symojiKey.state == "marks" ? charlabel : [",", ">", "&", "<", "_"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : leaves + } + FlickCharKey { + charlabel: symojiKey.state == "marks" ? ["ő", "ç", "ċ", "ć", "č"] : ["0", "'", "`", "\"", "%"] + shiftedlabel: symojiKey.state == "marks" ? ["Ő", "Ç", "Ċ", "Ć", "Č"] : charlabel + leaves: charlabel + shiftedleaves: shiftedlabel + } + StringKey { + charlabel: symojiKey.state == "marks" ? ["ə", "ş", "ṡ", "ś", "š"] : [".", ".io", ".com", ".org",".net"] + shiftedlabel: symojiKey.state == "marks" ? ["Ə", "Ş", "Ṡ", "Ś", "Š"] : [".", "}", "#", "{", "~"]; + leaves: symojiKey.state == "marks" ? charlabel : [".", ".io", ".com", ".org",".net"] + shiftedleaves: symojiKey.state == "marks" ? shiftedlabel : [".", "}", "#", "{", "~"]; + unstyledLeaves: symojiKey.state == "marks" ? shiftedlabel : (panel.activeKeypadState === "NORMAL") ? [".", ".io", ".com", ".org",".net"]: shiftedlabel; + } + BackspaceKey { rightSide: true; width: panel.keyWidth;visHeight:layout.height;} + } + + } // column + Row{ + anchors.horizontalCenter: parent.horizontalCenter; + anchors.left:parent.left + anchors.bottom:parent.bottom + spacing: 0 + + LayoutBar { + id: layoutBar; + width: parent.width; + height:layout.height-layout.height*0.5; + visHeight:height; + fontSize:fontSize; + } + + } +} diff --git a/plugins/en@flick/qml/qml.pro b/plugins/en@flick/qml/qml.pro new file mode 100644 index 000000000..22cb76550 --- /dev/null +++ b/plugins/en@flick/qml/qml.pro @@ -0,0 +1,20 @@ +TOP_BUILDDIR = $$OUT_PWD/../../.. +TOP_SRCDIR = $$PWD/../../.. + +include($${TOP_SRCDIR}/config.pri) + +TARGET = dummy +TEMPLATE = lib + +lang_en@flick.path = "$$UBUNTU_KEYBOARD_LIB_DIR/en@flick/" +lang_en@flick.files = *.qml *.js + +INSTALLS += lang_en@flick + +# for QtCreator +OTHER_FILES += \ + Keyboard_en@flick.qml \ + Keyboard_en@flick_email.qml \ + Keyboard_en@flick_url.qml \ + Keyboard_en@flick_url_search.qml + diff --git a/plugins/en@flick/src/englishflickplugin.h b/plugins/en@flick/src/englishflickplugin.h new file mode 100644 index 000000000..eb3adce45 --- /dev/null +++ b/plugins/en@flick/src/englishflickplugin.h @@ -0,0 +1,27 @@ +#ifndef ENGLISHFLICKPLUGIN_H +#define ENGLISHFLICKPLUGIN_H + +#include +#include "languageplugininterface.h" +#include "westernlanguagesplugin.h" + +//#include + +class EnglishFlickPlugin : public WesternLanguagesPlugin +{ + Q_OBJECT + Q_INTERFACES(LanguagePluginInterface) + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EnglishFlickPlugin" FILE "englishflickplugin.json") + +public: + explicit EnglishFlickPlugin(QObject* parent = 0) + : WesternLanguagesPlugin(parent) + { + } + + virtual ~EnglishFlickPlugin() + { + } +}; + +#endif // ENGLISHFLICKPLUGIN_H diff --git a/plugins/en@flick/src/englishflickplugin.json b/plugins/en@flick/src/englishflickplugin.json new file mode 100644 index 000000000..b028ae8c8 --- /dev/null +++ b/plugins/en@flick/src/englishflickplugin.json @@ -0,0 +1,7 @@ +{ + "IID": "org.qt-project.Qt.Examples.EnglishFlickPlugin", + "MetaData": { + }, + "className": "EnglishFlickPlugin", + "debug": true +} diff --git a/plugins/en@flick/src/src.pro b/plugins/en@flick/src/src.pro new file mode 100644 index 000000000..7415dbdde --- /dev/null +++ b/plugins/en@flick/src/src.pro @@ -0,0 +1,34 @@ +TOP_BUILDDIR = $$OUT_PWD/../../.. +TOP_SRCDIR = $$PWD/../../.. + +include($${TOP_SRCDIR}/config.pri) + +TEMPLATE = lib +CONFIG += plugin +QT += widgets +INCLUDEPATH += \ + $${TOP_SRCDIR}/src/ \ + $${TOP_SRCDIR}/src/lib/ \ + $${TOP_SRCDIR}/src/lib/logic/ + $${TOP_SRCDIR}/plugins/westernsupport + +HEADERS = \ + englishflickplugin.h + +TARGET = $$qtLibraryTarget(en@flickplugin) + +EXAMPLE_FILES = englishflickplugin.json + +# generate database for presage: +PLUGIN_INSTALL_PATH = $${UBUNTU_KEYBOARD_LIB_DIR}/en@flick/ + +target.path = $$PLUGIN_INSTALL_PATH +INSTALLS += target + +OTHER_FILES += \ + englishflickplugin.json + +LIBS += $${TOP_BUILDDIR}/plugins/plugins/libwesternsupport.a -lpresage -lhunspell + +INCLUDEPATH += $$PWD/../../westernsupport +DEPENDPATH += $$PWD/../../westernsupport diff --git a/plugins/ja/qml/Keyboard_ja.qml b/plugins/ja/qml/Keyboard_ja.qml index 107396604..6c23a4793 100644 --- a/plugins/ja/qml/Keyboard_ja.qml +++ b/plugins/ja/qml/Keyboard_ja.qml @@ -25,6 +25,7 @@ KeyPad { Column { id: c1 + property int keyHeight: panel.keyHeight; anchors.fill: parent spacing: 0 @@ -55,7 +56,7 @@ KeyPad { anchors.horizontalCenter: parent.horizontalCenter; spacing: 0 - CursorKey { action: "left"; } + CursorKey { leftSide:true; } FlickCharKey { label: layout.state == "kana" ? "た" : "GHI"; leaves: layout.state == "kana" ? ["た", "ち", "つ", "て", "と"] : ["g", "h", "i", "(", "4"]; @@ -71,7 +72,7 @@ KeyPad { leaves: layout.state == "kana" ? ["は", "ひ", "ふ", "へ", "ほ"] : ["m", "n", "o", ")", "6"]; annotation: layout.state == "kana" ? "" : "6)"; } - CursorKey { action: "right"; } + CursorKey { rightSide:true; } } Row { diff --git a/plugins/ja/qml/Keyboard_ja_email.qml b/plugins/ja/qml/Keyboard_ja_email.qml index 7bcae8d22..effc1c040 100644 --- a/plugins/ja/qml/Keyboard_ja_email.qml +++ b/plugins/ja/qml/Keyboard_ja_email.qml @@ -15,8 +15,8 @@ */ import QtQuick 2.4 -import "keys/" import keys 1.0 +import "keys/" KeyPad { anchors.fill: parent @@ -25,6 +25,7 @@ KeyPad { Column { id: c1 + property int keyHeight: panel.keyHeight; anchors.fill: parent spacing: 0 @@ -55,7 +56,7 @@ KeyPad { anchors.horizontalCenter: parent.horizontalCenter; spacing: 0 - CursorKey { action: "left"; } + CursorKey { leftSide:true; } FlickCharKey { label: layout.state == "kana" ? "た" : "GHI"; leaves: layout.state == "kana" ? ["た", "ち", "つ", "て", "と"] : ["g", "h", "i", "(", "4"]; @@ -71,7 +72,7 @@ KeyPad { leaves: layout.state == "kana" ? ["は", "ひ", "ふ", "へ", "ほ"] : ["m", "n", "o", ")", "6"]; annotation: layout.state == "kana" ? "" : "6)"; } - CursorKey { action: "right"; } + CursorKey { rightSide:true; } } Row { @@ -108,7 +109,7 @@ KeyPad { leaves: layout.state == "kana" ? ["わ", "を", "ん", "ー"] : ["-", "+", "0", "*"]; annotation: layout.state == "kana" ? "" : "0"; } - DomainKey { + StringKey { label: layout.state == "kana" ? "、。" : ". ,"; leaves: layout.state == "kana" ? ["、", "。", "!", "?"] : [".", ",", ".com", ".jp"]; diff --git a/plugins/ja/qml/Keyboard_ja_url.qml b/plugins/ja/qml/Keyboard_ja_url.qml index 7bcae8d22..ff0894872 100644 --- a/plugins/ja/qml/Keyboard_ja_url.qml +++ b/plugins/ja/qml/Keyboard_ja_url.qml @@ -26,6 +26,7 @@ KeyPad { Column { id: c1 anchors.fill: parent + property int keyHeight: panel.keyHeight; spacing: 0 Row { @@ -55,7 +56,7 @@ KeyPad { anchors.horizontalCenter: parent.horizontalCenter; spacing: 0 - CursorKey { action: "left"; } + CursorKey { leftSide:true; } FlickCharKey { label: layout.state == "kana" ? "た" : "GHI"; leaves: layout.state == "kana" ? ["た", "ち", "つ", "て", "と"] : ["g", "h", "i", "(", "4"]; @@ -71,7 +72,7 @@ KeyPad { leaves: layout.state == "kana" ? ["は", "ひ", "ふ", "へ", "ほ"] : ["m", "n", "o", ")", "6"]; annotation: layout.state == "kana" ? "" : "6)"; } - CursorKey { action: "right"; } + CursorKey { rightSide:true; } } Row { @@ -108,7 +109,7 @@ KeyPad { leaves: layout.state == "kana" ? ["わ", "を", "ん", "ー"] : ["-", "+", "0", "*"]; annotation: layout.state == "kana" ? "" : "0"; } - DomainKey { + StringKey { label: layout.state == "kana" ? "、。" : ". ,"; leaves: layout.state == "kana" ? ["、", "。", "!", "?"] : [".", ",", ".com", ".jp"]; diff --git a/plugins/ja/qml/Keyboard_ja_url_search.qml b/plugins/ja/qml/Keyboard_ja_url_search.qml index 7bcae8d22..ff0894872 100644 --- a/plugins/ja/qml/Keyboard_ja_url_search.qml +++ b/plugins/ja/qml/Keyboard_ja_url_search.qml @@ -26,6 +26,7 @@ KeyPad { Column { id: c1 anchors.fill: parent + property int keyHeight: panel.keyHeight; spacing: 0 Row { @@ -55,7 +56,7 @@ KeyPad { anchors.horizontalCenter: parent.horizontalCenter; spacing: 0 - CursorKey { action: "left"; } + CursorKey { leftSide:true; } FlickCharKey { label: layout.state == "kana" ? "た" : "GHI"; leaves: layout.state == "kana" ? ["た", "ち", "つ", "て", "と"] : ["g", "h", "i", "(", "4"]; @@ -71,7 +72,7 @@ KeyPad { leaves: layout.state == "kana" ? ["は", "ひ", "ふ", "へ", "ほ"] : ["m", "n", "o", ")", "6"]; annotation: layout.state == "kana" ? "" : "6)"; } - CursorKey { action: "right"; } + CursorKey { rightSide:true; } } Row { @@ -108,7 +109,7 @@ KeyPad { leaves: layout.state == "kana" ? ["わ", "を", "ん", "ー"] : ["-", "+", "0", "*"]; annotation: layout.state == "kana" ? "" : "0"; } - DomainKey { + StringKey { label: layout.state == "kana" ? "、。" : ". ,"; leaves: layout.state == "kana" ? ["、", "。", "!", "?"] : [".", ",", ".com", ".jp"]; diff --git a/plugins/ja/qml/keys/FlickCharKey.qml b/plugins/ja/qml/keys/FlickCharKey.qml deleted file mode 100644 index 18b232e63..000000000 --- a/plugins/ja/qml/keys/FlickCharKey.qml +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2015 Canonical Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; version 3. - * - * This program 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -import QtQuick 2.4 -import QtMultimedia 5.0 -import Ubuntu.Components 1.3 -import Ubuntu.Components.Popups 1.3 - -import "key_constants.js" as UI - -Item { - id: key - - property int padding: 0 - - width: leftSide || rightSide ? panel.keyWidth * 2 : panel.keyWidth - height: panel.keyHeight - - /* to be set in keyboard layouts */ - property string label: ""; - property var leaves: ["", "", "", "", ""]; - property int index: keyFlickArea.index; - property bool highlight: false; - - property string action - property bool noMagnifier: !maliit_input_method.enableMagnifier - property bool skipAutoCaps: false - property bool switchBackFromSymbols: false - - property bool leftSide: false - property bool rightSide: false - - property double rowMargin: fullScreenItem.tablet ? units.gu(UI.tabletRowMargin) - : (fullScreenItem.landscape ? units.dp(UI.phoneRowMarginLandscape) - : units.dp(UI.phoneRowMarginPortrait)) - property double keyMargin: fullScreenItem.tablet ? units.gu(UI.tabletKeyMargins) - : units.gu(UI.phoneKeyMargins) - - // These properties are used by autopilot to determine the visible - // portion of the key to press - readonly property double leftOffset: buttonRect.anchors.leftMargin - readonly property double rightOffset: buttonRect.anchors.rightMargin - - /* design */ - property string normalColor: fullScreenItem.theme.charKeyColor - property string pressedColor: fullScreenItem.theme.charKeyPressedColor - property bool borderEnabled: fullScreenItem.theme.keyBorderEnabled - property string borderColor: borderEnabled ? fullScreenItem.theme.charKeyBorderColor : "transparent" - property int fontSize: (fullScreenItem.landscape ? (height / 2) : (height / 2.8)); - - /// annotation shows a small label in the upper right corner - // if the annotiation property is set, it will be used. If not, the first position in extended[] list or extendedShifted[] list will - // be used, depending on the state. If no extended/extendedShifted arrays exist, no annotation is shown - property string annotation: "" - - /*! indicates if te key is currently pressed/down*/ - property alias currentlyPressed: keyFlickArea.pressed - - property string oskState: panel.activeKeypadState - - // Allow action keys to override the standard key behaviour - property bool overridePressArea: false - - signal pressed() - signal released() - - // Make it possible for the visible area of the key to differ from the - // actual key size. This allows us to extend the touch area of the bottom - // row of keys all the way to the bottom of the keyboard, whilst - // maintaining the same visual appearance. - Item { - anchors.top: parent.top - height: panel.keyHeight - width: parent.width - - Rectangle { - id: buttonRect - color: key.currentlyPressed || key.highlight ? pressedColor : normalColor - anchors.fill: parent - anchors.leftMargin: key.leftSide ? (parent.width - panel.keyWidth) + key.keyMargin : key.keyMargin - anchors.rightMargin: key.rightSide ? (parent.width - panel.keyWidth) + key.keyMargin : key.keyMargin - anchors.bottomMargin: key.rowMargin - radius: units.dp(4) - border{ - width: borderEnabled ? units.gu(0.1) : 0 - color: borderColor - } - - /// label of the key - // the label is also the value subitted to the app - - Column { - spacing: units.gu( UI.annotationMargins ) - anchors.centerIn: parent - - Text { - id: keyLabel - text: label - anchors.horizontalCenter: parent.horizontalCenter - font.family: UI.fontFamily - font.pixelSize: fontSize - font.weight: Font.Light - color: fullScreenItem.theme.fontColor - textFormat: Text.StyledText - } - - Text { - id: annotationLabel - text: annotation - - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: units.gu( UI.annotationMargins ) - - font.family: UI.annotationFont - font.pixelSize: fullScreenItem.tablet ? units.dp(UI.tabletAnnotationFontSize) : units.dp(UI.phoneAnnotationFontSize) - font.weight: Font.Light - color: fullScreenItem.theme.annotationFontColor - visible: annotation != "" - } - } - } - - FlickPop { - anchors.horizontalCenter: buttonRect.horizontalCenter - anchors.bottom: buttonRect.top - anchors.bottomMargin: key.height * 0.5 - width: units.gu((UI.fontSize + UI.flickMargin) * 3) - height: units.gu((UI.fontSize + UI.flickMargin) * 3) - chars: leaves - index: keyFlickArea.index - visible: key.currentlyPressed && chars.length > 1 && !noMagnifier - } - } - - FlickArea { - id: keyFlickArea - anchors.fill: key - - onReleased: { - if (overridePressArea) { - key.released(); - return; - } - - event_handler.onKeyReleased(leaves[index], action); - } - - onPressed: { - if (overridePressArea) { - key.pressed(); - return; - } - - if (maliit_input_method.useAudioFeedback) - audioFeedback.play(); - - if (maliit_input_method.useHapticFeedback) - pressEffect.start(); - - event_handler.onKeyPressed(leaves[index], action); - } - } - - Connections { - target: swipeArea.drag - onActiveChanged: { - if (swipeArea.drag.active) - keyFlickArea.cancelPress(); - } - } -} diff --git a/plugins/ja/qml/keys/KanaSwitchKey.qml b/plugins/ja/qml/keys/KanaSwitchKey.qml index c5fae267c..1ce8438ba 100644 --- a/plugins/ja/qml/keys/KanaSwitchKey.qml +++ b/plugins/ja/qml/keys/KanaSwitchKey.qml @@ -18,8 +18,7 @@ import QtQuick 2.4 import QtMultimedia 5.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 - -import "key_constants.js" as UI +import keys 1.0 FlickCharKey { padding: UI.actionKeyPadding diff --git a/plugins/ja/qml/keys/ModifierKey.qml b/plugins/ja/qml/keys/ModifierKey.qml index 17b4258b5..005562374 100644 --- a/plugins/ja/qml/keys/ModifierKey.qml +++ b/plugins/ja/qml/keys/ModifierKey.qml @@ -18,10 +18,8 @@ import QtQuick 2.4 import QtMultimedia 5.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 - import "modifier.js" as Modifier -import "key_constants.js" as UI - +import keys 1.0 FlickCharKey { label: (isPreedit && layoutState == "kana") ? " ゛ ゜" : "␣" leaves: isPreedit ? preeditLeaves : ["␣", "□"] diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 524f3a6d1..9e7aa978a 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -14,6 +14,7 @@ SUBDIRS = \ el \ en \ en@dv \ + en@flick \ eo \ es \ fa \ diff --git a/qml/KeyboardContainer.qml b/qml/KeyboardContainer.qml index 3e16c3b66..3f4e5b3b6 100644 --- a/qml/KeyboardContainer.qml +++ b/qml/KeyboardContainer.qml @@ -48,7 +48,7 @@ Item { objectName: "characterKeyPadLoader" anchors.fill: parent asynchronous: false - source: panel.state === "CHARACTERS" ? internal.characterKeypadSource : internal.symbolKeypadSource + source: internal.loadKeypad(); onLoaded: { if (delayedAutoCaps) { activeKeypadState = "SHIFTED"; @@ -95,6 +95,16 @@ Item { panel.state = "CHARACTERS"; } + function loadKeypad() { + if (panel.state === "CHARACTERS" ) { + return characterKeypadSource; + } else if (panel.state === "SYMBOLS") { + return symbolKeypadSource; + } else { + return "languages/Keyboard_"+panel.state+".qml"; + } + } + function loadLayout(contentType, activeLanguage) { var language = activeLanguage.toLowerCase(); diff --git a/qml/images/happy.svg b/qml/images/happy.svg new file mode 100644 index 000000000..134c63eda --- /dev/null +++ b/qml/images/happy.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/qml/keys/CaseSwitchKey.qml b/qml/keys/CaseSwitchKey.qml new file mode 100644 index 000000000..e7f499cc7 --- /dev/null +++ b/qml/keys/CaseSwitchKey.qml @@ -0,0 +1,87 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import QtMultimedia 5.0 +import Ubuntu.Components 1.3 +import Ubuntu.Components.Popups 1.3 + +import "key_constants.js" as UI + +FlickActionKey { + width: panel.keyWidth + iconNormal:["keyboard-enter", "keyboard-spacebar", "keyboard-caps-disabled", "", "keyboard-caps-locked"] + iconShifted:["keyboard-enter", "keyboard-spacebar", "keyboard-caps-enabled", "", "keyboard-caps-disabled"] + iconCapsLock:["keyboard-enter", "keyboard-spacebar", "keyboard-caps-locked", "", "keyboard-caps-disabled"] + iconAngles:["","","","","180"] + overridePressArea: true + + property string preedit: maliit_input_method.preedit + property bool isPreedit: maliit_input_method.preedit.length > 0 + property string panelState: panel.activeKeypadState + property int cursorPosition: maliit_input_method.cursorPosition + property string lastChar: "" + property var preeditLeaves: [lastChar] + + onReleased: { + if (isPreedit) { + if (index != 2 && index !=4) { + if (index == 0) event_handler.onKeyReleased("", "commit"); + if (index == 1) event_handler.onKeyReleased("", "space"); + } else { + var pos = cursorPosition + var newChar = (index == 2) ? lastChar.toUpperCase() : lastChar + newChar = (index == 4) ? lastChar.toLowerCase() : newChar + maliit_input_method.preedit = preedit.substr(0, cursorPosition-1) + newChar + preedit.substr(cursorPosition) + maliit_input_method.cursorPosition = pos + } + }else{ + if (index == 0) { + event_handler.onKeyReleased("", "return"); + } else if (index == 1) { + event_handler.onKeyReleased("", "space"); + } else if (index == 2) { + if (panelState === "NORMAL"){ + panel.activeKeypadState = "SHIFTED"; + } else { + panel.activeKeypadState = panel.activeKeypadState == "CAPSLOCK" ? "SHIFTED" : "CAPSLOCK"; + } + } else if (index == 4) { + if (panelState !== "NORMAL") + panel.activeKeypadState = "NORMAL"; + } + } + if(panel.autoCapsTriggered && index ==4){ + panel.autoCapsTriggered=false; + panel.activeKeypadState = "NORMAL"; + } + if(panel.autoCapsTriggered && index ==2){ + panel.autoCapsTriggered=false; + panel.activeKeypadState = "CAPSLOCK"; + } + } + + onPressed: { + if (maliit_input_method.useAudioFeedback) + audioFeedback.play(); + + if (maliit_input_method.useHapticFeedback) + pressEffect.start(); + if (isPreedit) { + lastChar = preedit.charAt(cursorPosition-1) + } + } +} diff --git a/qml/keys/CharKey.qml b/qml/keys/CharKey.qml index db6983fd7..75a2848ab 100644 --- a/qml/keys/CharKey.qml +++ b/qml/keys/CharKey.qml @@ -25,6 +25,7 @@ Item { id: key property int padding: 0 + property int visHeight: panel.keyHeight width: leftSide || rightSide ? panel.keyWidth * 2 : panel.keyWidth height: panel.keyHeight @@ -133,8 +134,9 @@ Item { // row of keys all the way to the bottom of the keyboard, whilst // maintaining the same visual appearance. Item { + id:button anchors.top: parent.top - height: panel.keyHeight + height: visHeight width: parent.width Rectangle { diff --git a/plugins/ja/qml/keys/CursorKey.qml b/qml/keys/CursorKey.qml similarity index 81% rename from plugins/ja/qml/keys/CursorKey.qml rename to qml/keys/CursorKey.qml index 569344545..84ccc54b9 100644 --- a/plugins/ja/qml/keys/CursorKey.qml +++ b/qml/keys/CursorKey.qml @@ -19,10 +19,11 @@ import "key_constants.js" as UI import keys 1.0 ActionKey { - label: action == "left" ? "⬅" : "➡"; - leftSide: action == "left"; - rightSide: action == "right"; - + label: leftSide ? "←" : "→"; + shifted:label; + action: leftSide ? "left" : "right"; + height:layout.height; + visHeight:layout.height; property string preedit: maliit_input_method.preedit property int cursorPosition: maliit_input_method.cursorPosition property bool isPreedit: preedit != "" @@ -30,13 +31,13 @@ ActionKey { overridePressArea: true; onReleased: { - if (isPreedit) { + if (isPreedit && !fullScreenItem.cursorSwipe) { if (action == "left" && cursorPosition > 0) { maliit_input_method.cursorPosition-- } else if (action == "right" && cursorPosition < preedit.length) { maliit_input_method.cursorPosition++ } - } else { + } else if (!fullScreenItem.cursorSwipe) { event_handler.onKeyReleased("", action); } } @@ -53,6 +54,8 @@ ActionKey { } onPressAndHold: { - return; + fullScreenItem.cursorSwipe=true; + if(rightSide) + cursorSwipeArea.selectionMode=true; } } diff --git a/qml/keys/FlickActionKey.qml b/qml/keys/FlickActionKey.qml new file mode 100644 index 000000000..d3b3d6e28 --- /dev/null +++ b/qml/keys/FlickActionKey.qml @@ -0,0 +1,33 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 + +import Ubuntu.Components 1.3 + +import "key_constants.js" as UI + +FlickCharKey { + property string shifted:"?123" + fontSize: (fullScreenItem.landscape ? (height / 2) : (height / 2.8)) + * (4 / (label.length >= 2 ? (label.length <= 6 ? label.length + 2.5 : 8) : 4)); + property int visHeight: panel.keyHeight + property int padding: UI.actionKeyPadding + width: panel.keyWidth + units.gu( padding ) + normalColor: fullScreenItem.theme.actionKeyColor + pressedColor: fullScreenItem.theme.actionKeyPressedColor + borderColor: fullScreenItem.theme.actionKeyBorderColor +} diff --git a/plugins/ja/qml/keys/FlickArea.qml b/qml/keys/FlickArea.qml similarity index 100% rename from plugins/ja/qml/keys/FlickArea.qml rename to qml/keys/FlickArea.qml diff --git a/qml/keys/FlickCharKey.qml b/qml/keys/FlickCharKey.qml new file mode 100644 index 000000000..52bbd4da6 --- /dev/null +++ b/qml/keys/FlickCharKey.qml @@ -0,0 +1,509 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import QtMultimedia 5.0 +import Ubuntu.Components 1.3 +import Ubuntu.Components.Popups 1.3 +import QtQuick.Layouts 1.1 + +import "key_constants.js" as UI + +Item { + id: key + + property int padding: 0 + width: leftSide || rightSide ? panel.keyWidth * 2 : panel.keyWidth + height: c1.keyHeight + + /* to be set in keyboard layouts */ + property string label: ""; + property var leaves: ["", "", "", "", ""]; + property var charlabel: ["", "", "", "", ""]; + property var shiftedlabel: ["", "", "", "", ""]; + property var shiftedleaves: ["", "", "", "", ""]; + property int index: keyFlickArea.index; + property bool highlight: false; + + property string action + property bool noMagnifier: true + property bool labelright:false + property bool labelleft:false + property bool skipAutoCaps: false + property bool switchBackFromSymbols: false + + property bool leftSide: false + property bool rightSide: false + + property double rowMargin: fullScreenItem.tablet ? units.gu(UI.tabletRowMargin) + : (fullScreenItem.landscape ? units.dp(UI.phoneRowMarginLandscape) + : units.dp(UI.phoneRowMarginPortrait)) + property double keyMargin: fullScreenItem.tablet ? units.gu(UI.tabletKeyMargins) + : units.gu(UI.phoneKeyMargins) + + // These properties are used by autopilot to determine the visible + // portion of the key to press + readonly property double leftOffset: buttonRect.anchors.leftMargin + readonly property double rightOffset: buttonRect.anchors.rightMargin + + /* icons */ + property var iconNormal: ["", "", "", "", ""]; + property var iconNormalSource: ["", "", "", "", ""]; + property var iconDisabled: ["", "", "", "", ""]; + property var iconCommon: [ + iconNormalSource[0] !== "" ? iconNormalSource[0] + : iconNormal[0] ? "image://theme/%1".arg(iconNormal[0]) : "", + iconNormalSource[1] !== "" ? iconNormalSource[1] + : iconNormal[1] ? "image://theme/%1".arg(iconNormal[1]) : "", + iconNormalSource[2] !== "" ? iconNormalSource[2] + : iconNormal[2] ? "image://theme/%1".arg(iconNormal[2]) : "", + iconNormalSource[3] !== "" ? iconNormalSource[3] + : iconNormal[3] ? "image://theme/%1".arg(iconNormal[3]) : "", + iconNormalSource[4] !== "" ? iconNormalSource[4] + : iconNormal[4] ? "image://theme/%1".arg(iconNormal[4]) : "" + ]; + property var iconShifted: ["", "", "", "", ""]; + property var iconCapsLock: ["", "", "", "", ""]; + property var iconCaps: [ + iconCapsLock[0] ? "image://theme/%1".arg(iconCapsLock[0]) : "", + iconCapsLock[1] ? "image://theme/%1".arg(iconCapsLock[1]) : "", + iconCapsLock[2] ? "image://theme/%1".arg(iconCapsLock[2]) : "", + iconCapsLock[3] ? "image://theme/%1".arg(iconCapsLock[3]) : "", + iconCapsLock[4] ? "image://theme/%1".arg(iconCapsLock[4]) : "" + ]; + property var iconAutoCaps: [ + iconShifted[0] ? "image://theme/%1".arg(iconShifted[0]) : "", + iconShifted[1] ? "image://theme/%1".arg(iconShifted[1]) : "", + iconShifted[2] ? "image://theme/%1".arg(iconShifted[2]) : "", + iconShifted[3] ? "image://theme/%1".arg(iconShifted[3]) : "", + iconShifted[4] ? "image://theme/%1".arg(iconShifted[4]) : "" + ]; + + property color colorNormal: fullScreenItem.theme.fontColor + property color colorShifted: fullScreenItem.theme.fontColor + property color colorCapsLock: fullScreenItem.theme.fontColor + + property var iconAngles: ["", "", "", "", ""]; + property int leavesFontSize: units.gu(UI.fontSize); + + /* design */ + property string normalColor: fullScreenItem.theme.charKeyColor + property string pressedColor: fullScreenItem.theme.charKeyPressedColor + property bool borderEnabled: fullScreenItem.theme.keyBorderEnabled + property string borderColor: borderEnabled ? fullScreenItem.theme.charKeyBorderColor : "transparent" + property int fontSize: (fullScreenItem.landscape ? (height / 2) : (height / 2.8)); + + /// annotation shows a small label in the upper right corner + // if the annotiation property is set, it will be used. If not, the first position in extended[] list or extendedShifted[] list will + // be used, depending on the state. If no extended/extendedShifted arrays exist, no annotation is shown + property string annotation: "" + + /*! indicates if te key is currently pressed/down*/ + property alias currentlyPressed: keyFlickArea.pressed + + property string oskState: panel.activeKeypadState + + // Allow action keys to override the standard key behaviour + property bool overridePressArea: false + + signal pressed() + signal released() + + // Make it possible for the visible area of the key to differ from the + // actual key size. This allows us to extend the touch area of the bottom + // row of keys all the way to the bottom of the keyboard, whilst + // maintaining the same visual appearance. + Item { + anchors.top: parent.top + height: parent.height + width: parent.width + + Rectangle { + id: buttonRect + color: key.currentlyPressed || key.highlight ? pressedColor : normalColor + anchors.fill: parent + anchors.leftMargin: key.leftSide ? (parent.width - panel.keyWidth) + key.keyMargin : key.keyMargin + anchors.rightMargin: key.rightSide ? (parent.width - panel.keyWidth) + key.keyMargin : key.keyMargin + anchors.bottomMargin: key.rowMargin + radius: units.dp(4) + property int iconSize: !fullScreenItem.landscape ? width/4 : width/6 + border{ + width: borderEnabled ? units.gu(0.1) : 0 + color: borderColor + } + + /// label of the key + // the label is also the value subitted to the app + Column { + spacing: units.gu( UI.annotationsMargins ) + anchors.centerIn: parent + Text { + id: keyLabel + text: (panel.hideKeyLabels)?"":label + anchors.horizontalCenter: parent.horizontalCenter + font.family: UI.fontFamily + font.pixelSize: fontSize + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: label!="" + } + Text{ + id: annotationLabel + text: (panel.hideKeyLabels)?"":annotation + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottomMargin: units.gu( UI.annotationMargins ) + font.family: UI.fontFamily + font.pixelSize: fullScreenItem.tablet ? units.dp(UI.tabletAnnotationFontSize) : units.dp(UI.phoneAnnotationFontSize) + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: annotation != "" + } + } + + RowLayout { + id: tapLeftTopCol + anchors.left: parent.left + spacing: 0 + + ColumnLayout { + id: tapColumn + Layout.minimumWidth: !fullScreenItem.landscape ? buttonRect.width/4 : buttonRect.width/3 + Layout.alignment : Qt.AlignTop + spacing: 0 + + Icon { + id: iconImage + source: iconCommon[0] + color: fullScreenItem.theme.selectionColor + Layout.alignment: Qt.AlignHCenter + visible: (iconCommon[0] != "" && !panel.hideKeyLabels) + width: buttonRect.iconSize + height: buttonRect.iconSize + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[0]} + } + + Text { + id: tapLabel + text: (panel.activeKeypadState === "NORMAL")?charlabel[0]:shiftedlabel[0] + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + font.family: UI.fontFamily + font.pixelSize: fontSize + font.weight: Font.Light + color: fullScreenItem.theme.selectionColor + textFormat: Text.StyledText + visible:!iconImageLeft.visible && !panel.hideKeyLabels + } + } + + ColumnLayout { + id: leftColumn + Layout.alignment: Qt.AlignVCenter + Layout.minimumWidth: !fullScreenItem.landscape ? buttonRect.width/4 : buttonRect.width/6 + Layout.preferredHeight: buttonRect.height + spacing: 0 + + Icon { + id: iconImageLeft + source: iconCommon[1] + color: key.colorNormal + Layout.alignment: Qt.AlignHCenter + visible: (iconCommon[1] != "" && !panel.hideKeyLabels) + width: buttonRect.iconSize + height: buttonRect.iconSize + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[1]} + } + + Icon { + id: iconLeft + source: iconDisabled[1] != "" ? "image://theme/%1".arg(iconDisabled[1]):"" + Layout.alignment: Qt.AlignHCenter + width: buttonRect.iconSize + height: buttonRect.iconSize + visible: (middleLeftLabel.text == "" && !iconImageLeft.visible && !panel.hideKeyLabels) + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[1]} + } + + Text { + id: middleLeftLabel + text: (panel.activeKeypadState === "NORMAL")?charlabel[1]:shiftedlabel[1] + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + font.family: UI.fontFamily + font.pixelSize:fontSize + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: !iconLeft.visible && !iconImageLeft.visible && !panel.hideKeyLabels + } + } + + ColumnLayout { + id: topColumn + Layout.minimumWidth: !fullScreenItem.landscape ? buttonRect.width/4 : buttonRect.width/6 + Layout.alignment : Qt.AlignTop + spacing: 0 + + Icon { + id: iconImageUp + source: iconCommon[2] + color: key.colorNormal + Layout.alignment: Qt.AlignHCenter + + visible: (iconCommon[2] != "" && !panel.hideKeyLabels) + width: buttonRect.iconSize + height: buttonRect.iconSize + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[2]} + } + + Icon { + id: iconUp + source: iconDisabled[2] != "" ? "image://theme/%1".arg(iconDisabled[2]):"" + Layout.alignment: Qt.AlignHCenter + width: buttonRect.iconSize + height: buttonRect.iconSize + visible: (topCenterLabel.text == "" && !iconImageUp.visible && !panel.hideKeyLabels) + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[2]} + } + Text { + id: topCenterLabel + text: (panel.activeKeypadState === "NORMAL")?charlabel[2]:shiftedlabel[2]; + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + font.family: UI.fontFamily + font.pixelSize:fontSize + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: !iconImageUp.visible && !iconUp.visible && !panel.hideKeyLabels + } + } + } + + RowLayout { + id: bottomRightCol + anchors.right: parent.right + anchors.bottom: parent.bottom + spacing: 0 + + ColumnLayout { + id: bottomColumn + Layout.minimumWidth: !fullScreenItem.landscape ? buttonRect.width/4 : buttonRect.width/6 + Layout.alignment : Qt.AlignBottom + spacing: 0 + + Icon { + id: iconImageDown + source: iconCommon[4] + color: key.colorNormal + Layout.alignment: Qt.AlignHCenter + visible: (iconCommon[4] != "" && !panel.hideKeyLabels) + width: buttonRect.iconSize + height: buttonRect.iconSize + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[4]} + } + + Icon { + id: iconDown + source: iconDisabled[4] != "" ? "image://theme/%1".arg(iconDisabled[4]):"" + Layout.alignment: Qt.AlignHCenter + width: buttonRect.iconSize + height: buttonRect.iconSize + visible: (bottomCenterLabel.text == "" && !iconImageDown.visible && !panel.hideKeyLabels) + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[4]} + } + + Text { + id: bottomCenterLabel + text: (panel.activeKeypadState === "NORMAL")?charlabel[4]:shiftedlabel[4] + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + font.family: UI.fontFamily + font.pixelSize:fontSize + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: !iconDown.visible && !iconImageDown.visible && !panel.hideKeyLabels + } + } + + ColumnLayout { + id: rightColumn + Layout.alignment: Qt.AlignVCenter + Layout.minimumWidth: !fullScreenItem.landscape ? buttonRect.width/4 : buttonRect.width/6 + Layout.preferredHeight: buttonRect.height + spacing: 0 + + Icon { + id: iconImageRight + source: iconCommon[3] + color: key.colorNormal + Layout.alignment: Qt.AlignHCenter + visible: (iconCommon[3] != "" && !panel.hideKeyLabels) + width: buttonRect.iconSize + height: buttonRect.iconSize + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[3]} + } + + Icon { + id: iconRight + source: iconDisabled[3] != "" ? "image://theme/%1".arg(iconDisabled[3]):"" + Layout.alignment: Qt.AlignHCenter + width: buttonRect.iconSize + height: buttonRect.iconSize + visible: (middleRightLabel.text == "" && !iconImageRight.visible && !panel.hideKeyLabels) + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:iconAngles[3]} + } + + Text { + id: middleRightLabel + text: (panel.activeKeypadState === "NORMAL")?charlabel[3]:shiftedlabel[3] + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + font.family: UI.fontFamily + font.pixelSize:fontSize + font.weight: Font.Light + color: fullScreenItem.theme.fontColor + textFormat: Text.StyledText + visible: !iconImageRight.visible && !iconRight.visible && !panel.hideKeyLabels + } + } + } + } + + FlickPop { + id : flickPop + anchors.horizontalCenter: buttonRect.horizontalCenter + anchors.bottom: buttonRect.top + anchors.bottomMargin: key.height * 0.5 + width: units.gu((UI.fontSize + UI.flickMargin) * 3) + height: units.gu((UI.fontSize + UI.flickMargin) * 3) + chars: (panel.activeKeypadState === "NORMAL")?leaves:shiftedleaves + icons: iconCommon + angles:iconAngles + popFontSize: leavesFontSize + index: keyFlickArea.index + visible:(maliit_input_method.enableMagnifier)? key.currentlyPressed && chars.length > 1:false + } + } + + FlickArea { + id: keyFlickArea + anchors.fill: key + + onReleased: { + if (overridePressArea) { + key.released(); + return; + } + event_handler.onKeyReleased(flickPop.chars[index], action); + if(panel.autoCapsTriggered){ + panel.autoCapsTriggered=false; + }else if (!skipAutoCaps) { + if (panel.activeKeypadState === "SHIFTED" && panel.state === "CHARACTERS"){ + panel.activeKeypadState = "NORMAL"; + } + } + } + + onPressed: { + if (overridePressArea) { + key.pressed(); + return; + } + + if (maliit_input_method.useAudioFeedback) + audioFeedback.play(); + + if (maliit_input_method.useHapticFeedback) + pressEffect.start(); + + if(action != "backspace") { + panel.autoCapsTriggered = false; + } + event_handler.onKeyPressed(flickPop.chars[index], action); + } + } + + Connections { + target: swipeArea.drag + onActiveChanged: { + if (swipeArea.drag.active) + keyFlickArea.cancelPress(); + } + } + // make sure the icon changes even if the property icon* change on runtime + + state: panel.activeKeypadState + states: [ + State { + name: "SHIFTED" + PropertyChanges { + target: flickPop + icons: iconAutoCaps + } + PropertyChanges { + target: iconImage + source: iconAutoCaps[0] + } + PropertyChanges { + target: iconImageUp + source: iconAutoCaps[2] + } + PropertyChanges { + target: iconImageDown + source: iconAutoCaps[4] + } + PropertyChanges { + target: iconImageLeft + source: iconAutoCaps[1] + } + PropertyChanges { + target: iconImageRight + source: iconAutoCaps[3] + } + }, + State { + name: "CAPSLOCK" + PropertyChanges { + target: flickPop + icons: iconCaps + } + PropertyChanges { + target: iconImage + source: iconCaps[0] + } + PropertyChanges { + target: iconImageUp + source: iconCaps[2] + } + PropertyChanges { + target: iconImageDown + source: iconCaps[4] + } + PropertyChanges { + target: iconImageLeft + source: iconCaps[1] + } + PropertyChanges { + target: iconImageRight + source: iconCaps[3] + } + } + ] +} diff --git a/plugins/ja/qml/keys/FlickPop.qml b/qml/keys/FlickPop.qml similarity index 73% rename from plugins/ja/qml/keys/FlickPop.qml rename to qml/keys/FlickPop.qml index 99268db1e..410124790 100644 --- a/plugins/ja/qml/keys/FlickPop.qml +++ b/qml/keys/FlickPop.qml @@ -27,44 +27,66 @@ import "key_constants.js" as UI Item { id: root - property var chars + property var chars: ["", "", "", "", ""]; + property var icons: ["", "", "", "", ""]; + property var angles: ["", "", "", "", ""]; + property int popFontSize: units.gu(UI.fontSize); property int index: 0 visible: false FlickPopKey { id: center - labelChar: chars[0] + labelChar: chars[0] ? chars[0] : "" + labelIcon: icons[0] ? icons[0] : "" anchors.centerIn: parent labelOpacity: index == 0 ? 1.0 : 0.6 + labelAngle: angles[0] ? angles[0] : "" labelColor: index == 0 ? fullScreenItem.theme.selectionColor : fullScreenItem.theme.fontColor + labelFontSize: popFontSize } + FlickPopKey { labelChar: chars[1] ? chars[1] : "" + labelIcon:icons[1] ? icons[1] : "" anchors.verticalCenter: center.verticalCenter anchors.right: center.left labelOpacity: index == 1 ? 1.0 : 0.6 + labelAngle: angles[1] ? angles[1] : "" labelColor: index == 1 ? fullScreenItem.theme.selectionColor : fullScreenItem.theme.fontColor + labelFontSize: popFontSize } + FlickPopKey { labelChar: chars[2] ? chars[2] : "" + labelIcon:icons[2] ? icons[2] : "" anchors.horizontalCenter: center.horizontalCenter anchors.bottom: center.top labelOpacity: index == 2 ? 1.0 : 0.6 + labelAngle: angles[2] ? angles[2] : "" labelColor: index == 2 ? fullScreenItem.theme.selectionColor : fullScreenItem.theme.fontColor + labelFontSize: popFontSize } + FlickPopKey { labelChar: chars[3] ? chars[3] : "" + labelIcon:icons[3] ? icons[3] : "" anchors.verticalCenter: center.verticalCenter anchors.left: center.right labelOpacity: index == 3 ? 1.0 : 0.6 + labelAngle: angles[3] ? angles[3] : "" labelColor: index == 3 ? fullScreenItem.theme.selectionColor : fullScreenItem.theme.fontColor + labelFontSize: popFontSize } + FlickPopKey { labelChar: chars[4] ? chars[4] : "" + labelIcon:icons[4] ? icons[4] : "" anchors.horizontalCenter: center.horizontalCenter anchors.top: center.bottom labelOpacity: index == 4 ? 1.0 : 0.6 + labelAngle: angles[4] ? angles[4] : "" labelColor: index == 4 ? fullScreenItem.theme.selectionColor : fullScreenItem.theme.fontColor + labelFontSize: popFontSize } } diff --git a/plugins/ja/qml/keys/FlickPopKey.qml b/qml/keys/FlickPopKey.qml similarity index 68% rename from plugins/ja/qml/keys/FlickPopKey.qml rename to qml/keys/FlickPopKey.qml index 095d7d790..17d0a0fc7 100644 --- a/plugins/ja/qml/keys/FlickPopKey.qml +++ b/qml/keys/FlickPopKey.qml @@ -15,6 +15,8 @@ */ import QtQuick 2.4 +import QtMultimedia 5.0 +import Ubuntu.Components 1.3 import "key_constants.js" as UI Rectangle { @@ -22,9 +24,12 @@ Rectangle { height: units.gu(UI.fontSize + UI.flickMargin) property string labelChar + property string labelIcon property color labelColor: fullScreenItem.theme.fontColor property real labelOpacity: 1.0 - visible: labelChar ? true : false + property int labelAngle: 0 + property int labelFontSize: units.gu(UI.fontSize) + visible: labelChar || labelIcon? true : false color: fullScreenItem.theme.charKeyColor border.width: units.gu(UI.flickBorderWidth) @@ -35,9 +40,18 @@ Rectangle { anchors.centerIn: parent text: parent.labelChar font.family: UI.fontFamily - font.pixelSize: units.gu(UI.fontSize) + font.pixelSize: labelFontSize font.bold: UI.fontBold color: parent.labelColor opacity: parent.labelOpacity } + Icon { + anchors.centerIn: parent + source: parent.labelIcon ? parent.labelIcon : "" + color: parent.labelColor + opacity: parent.labelOpacity + transform: Rotation { origin.x:buttonRect.iconSize/2; origin.y:buttonRect.iconSize/2; angle:labelAngle} + height: buttonRect.iconSize + width: buttonRect.iconSize + } } diff --git a/qml/keys/KeyPad.qml b/qml/keys/KeyPad.qml index b4f0c87a1..00d538fa2 100644 --- a/qml/keys/KeyPad.qml +++ b/qml/keys/KeyPad.qml @@ -22,7 +22,8 @@ Item { state: "NORMAL" property var content: c1 - property string symbols: "languages/Keyboard_symbols.qml" + property string symbols: "languages/Keyboard_symbols.qml"; + property string accents: "languages/Keyboard_accents.qml"; property bool capsLock: false Column { diff --git a/qml/keys/LayoutBar.qml b/qml/keys/LayoutBar.qml new file mode 100644 index 000000000..55dad42cf --- /dev/null +++ b/qml/keys/LayoutBar.qml @@ -0,0 +1,47 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import Ubuntu.Components 1.3 + +import "key_constants.js" as UI +import "languages.js" as Languages + +ActionKey { + pressedColor: fullScreenItem.theme.actionKeyColor + overridePressArea: true; + + Label { + anchors.centerIn: parent + anchors.verticalCenterOffset: -parent.rowMargin / 2 - units.gu(0.15) + font.family: UI.fontFamily + font.weight: Font.Light + font.pixelSize: parent.fontSize * 0.6 + opacity: UI.spaceOpacity + text: Languages.languageIdToName(maliit_input_method.activeLanguage) + horizontalAlignment: Text.AlignHCenter + visible: !panel.hideKeyLabels + } + +onPressed: { + if (maliit_input_method.useAudioFeedback) + audioFeedback.play(); + + if (maliit_input_method.useHapticFeedback) + pressEffect.start(); + + } +} diff --git a/plugins/ja/qml/keys/DomainKey.qml b/qml/keys/StringKey.qml similarity index 100% rename from plugins/ja/qml/keys/DomainKey.qml rename to qml/keys/StringKey.qml diff --git a/qml/keys/SymojiKey.qml b/qml/keys/SymojiKey.qml new file mode 100644 index 000000000..7be5665d1 --- /dev/null +++ b/qml/keys/SymojiKey.qml @@ -0,0 +1,94 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 + +import "key_constants.js" as UI + +FlickActionKey { + id: symojiKey + property bool standard: (maliit_input_method.previousLanguage && panel.state == "CHARACTERS" && state == "signs") ? true : false + property bool stdsingle: (!maliit_input_method.previousLanguage && panel.state == "CHARACTERS" && state == "signs") ? true : false + charlabel: (state == "marks") ? ["", "", "a!", "", ""] : (panel.state == "CHARACTERS") ? ["", "", "ä‽", "", "īø"] : ["", "", "", "", "a!"] + leaves: charlabel + iconNormal: stdsingle? ["", "", "", "settings", ""]: ["language-chooser", "", "", "navigation-menu", ""] + iconNormalSource: standard ? ["", "", "", "../images/happy.svg", ""] : maliit_input_method.previousLanguage ?["", "", "", "", ""]:["../images/happy.svg", "", "", "", ""] + iconAngles:["","","","","180"] + iconDisabled: ["", "", "keyboard-caps-locked", "", "keyboard-caps-locked"] + shiftedlabel: charlabel + shiftedleaves: leaves + width: panel.keyWidth; + action: "symbols"; + + overridePressArea: true; + property string default_state:"signs" + state: diacritics.state + + Item { + id: diacritics + + state: parent.default_state; + states: [ + State { + name: "marks" + PropertyChanges { + target: diacritics; + state: "marks"; + } + }, + State { + name: "signs" + PropertyChanges { + target: diacritics; + state: "signs"; + } + } + ] + } + + onReleased: { + if (index == 0) { + if (maliit_input_method.previousLanguage && maliit_input_method.previousLanguage != maliit_input_method.activeLanguage && panel.state == "CHARACTERS") { + maliit_input_method.activeLanguage = maliit_input_method.previousLanguage; + } else { + panel.state = "emoji"; + } + } else if (index == 2) { + panel.state = (state == "marks") ? "CHARACTERS" : "accents"; + state = (state == "marks") ? "signs" : "marks"; + } else if (index == 3) { + if(standard) + panel.state = "emoji"; + else if(panel.state == "CHARACTERS" && state == "signs"){ + Qt.openUrlExternally("settings:///system/language") + maliit_input_method.hide(); + }else { + canvas.languageMenuShown = true; + } + } else if (index == 4) { + if(panel.state == "accents" && state =="signs") panel.state = "CHARACTERS"; + else state="marks"; + } + } + onPressed: { + if (maliit_input_method.useAudioFeedback) + audioFeedback.play(); + + if (maliit_input_method.useHapticFeedback) + pressEffect.start(); + + } +} diff --git a/qml/keys/key_constants.js b/qml/keys/key_constants.js index 40123b8cf..18ed215bb 100644 --- a/qml/keys/key_constants.js +++ b/qml/keys/key_constants.js @@ -87,3 +87,15 @@ var tabletKeyboardHeightLandscape = 0.34; // percent of screen /* for UITK Components */ var toolkitTheme = "Ubuntu.Components.Themes.Ambiance" + +/* ActionKey layout */ +var undoFontSize = 2; + +/* FlickCharKey layout */ +var annotationFontSize = 1.5; // gu +var annotationMargins = 0.3; // gu + +/* FlickPop layout */ +var flickMargin = 1.5 // gu +var flickBorderWidth = 0.1 // gu +var flickBorderColor = "#999999" diff --git a/qml/keys/languages.js b/qml/keys/languages.js index 0d8e90922..b0a3484af 100644 --- a/qml/keys/languages.js +++ b/qml/keys/languages.js @@ -28,6 +28,7 @@ function languageIdToName(languageId) if (languageId == "el") return i18n.tr("Greek"); if (languageId == "en") return i18n.tr("English"); if (languageId == "en@dv") return i18n.tr("English\n(Dvorak)"); + if (languageId == "en@flick") return i18n.tr("English (Flick)"); if (languageId == "eo") return i18n.tr("Esperanto"); if (languageId == "es") return i18n.tr("Spanish"); if (languageId == "fa") return i18n.tr("Persian"); diff --git a/qml/keys/qmldir b/qml/keys/qmldir index 4bf0b5e22..6612873ed 100644 --- a/qml/keys/qmldir +++ b/qml/keys/qmldir @@ -18,3 +18,14 @@ PressArea 1.0 PressArea.qml SpaceKey 1.0 SpaceKey.qml UrlKey 1.0 UrlKey.qml UI 1.0 key_constants.js +CommitKey 1.0 CommitKey.qml +CaseSwitchKey 1.0 CaseSwitchKey.qml +FlickCharKey 1.0 FlickCharKey.qml +FlickActionKey 1.0 FlickActionKey.qml +FlickArea 1.0 FlickArea.qml +FlickPop 1.0 FlickPop.qml +FlickPopKey 1.0 FlickPopKey.qml +CursorKey 1.0 CursorKey.qml +StringKey 1.0 StringKey.qml +LayoutBar 1.0 LayoutBar.qml +SymojiKey 1.0 SymojiKey.qml diff --git a/qml/languages/Keyboard_accents.qml b/qml/languages/Keyboard_accents.qml new file mode 100644 index 000000000..785ddc0c8 --- /dev/null +++ b/qml/languages/Keyboard_accents.qml @@ -0,0 +1,168 @@ +/* + * Copyright 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; version 3. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick 2.4 +import keys 1.0 + +KeyPad { + + anchors.fill: parent; + content: c1 + Column { + id: c1 + property int keyHeight: panel.keyHeight-panel.keyHeight*0.1 + anchors.fill: parent; + spacing: 0 + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + ActionKey{width:panel.keyWidth;height:layout.height;visHeight:height} + FlickCharKey { + charlabel: ["ã", "à", "â", "á", "ä"]; + leaves: charlabel + shiftedlabel: ["Ã", "À", "Â", "Á", "Ä"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["ũ", "ù", "û", "ú", "ü"]; + leaves: charlabel + shiftedlabel: ["Ũ", "Ù", "Û", "Ú", "Ü"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["õ", "ò", "ô", "ó", "ö"]; + leaves: charlabel + shiftedlabel: ["Õ", "Ò", "Ô", "Ó", "Ö"]; + shiftedleaves: shiftedlabel + } + CaseSwitchKey { id: layout; labelright:true} + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + FlickCharKey { + charlabel: ["√", "", "±", "÷", "×"] + labelleft:true + leaves: charlabel + shiftedlabel: ["✿", "", "∆", "。", "﹏"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["ẽ", "è", "ê", "é", "ë"]; + leaves: charlabel + shiftedlabel: ["Ẽ", "È", "Ê", "É", "Ë"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["ĩ", "ì", "î", "í", "ï"]; + leaves: charlabel + shiftedlabel: ["Ĩ", "Ì", "Î", "Í", "Ï"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["ỹ", "ỳ", "ŷ", "ý", "ÿ"]; + leaves: charlabel + shiftedlabel: ["Ỹ", "Ỳ", "Ŷ", "Ý", "Ÿ"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["¢", "™", "©", "", "®"]; + labelright:true + leaves: charlabel + shiftedlabel: ["ʖ", "๑", " ͡", "", " ͜"]; + shiftedleaves: shiftedlabel + + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + CursorKey { leftSide:true; padding: 0 } + FlickCharKey { + charlabel: ["–", "§", "¦", "ß", "⸘"] + leaves: charlabel + shiftedlabel: ["ง", "ᕙ", "∀", "ᕗ", "⊸"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["ñ", "ņ", "ṅ", "ń", "ň"] + leaves: charlabel + shiftedlabel: ["Ñ", "Ń", "Ṅ", "Ņ", "Ň"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["—", "ſ", "‽", "ı", "ð"] + leaves: charlabel + shiftedlabel: ["ノ", "≧", "人", "≦", "ڡ"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["¤", "♪", "☆", "", "✧"] + leaves: charlabel + shiftedlabel: ["•", "ẙ", "·", "", "∴"]; + shiftedleaves: shiftedlabel + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter; + spacing: 0 + + SymojiKey { id: symojiKey;} + + FlickCharKey { + charlabel: ["„", "»", "‾", "«", "¿"] + leaves: charlabel + shiftedlabel: ["つ", "’̀", "ツ", "‘́", "ヮ"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["≠", "“", "´", "”", "‰"] + leaves: charlabel + shiftedlabel: ["∇", "╰", "「", "╯", "┐"]; + shiftedleaves: shiftedlabel + } + FlickCharKey { + charlabel: ["…", "ª", "¨", "°", "¡"] + leaves: charlabel + shiftedlabel: ["∠", "☜", "゚", "☞", "」"]; + shiftedleaves: shiftedlabel + } + BackspaceKey { rightSide: true; width: panel.keyWidth;visHeight:layout.height;} + } + + } // column + Row{ + anchors.horizontalCenter: parent.horizontalCenter; + anchors.left:parent.left + anchors.bottom:parent.bottom + spacing: 0 + + LayoutBar { + id: layoutBar; + width: parent.width; + height:layout.height-layout.height*0.5; + visHeight:height; + fontSize:fontSize; + } + + } +}