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;
+ }
+
+ }
+}