mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
QML UI: replace combobox with custom text field with hints
Signed-off-by: Marco Martin <notmart@gmail.com>
This commit is contained in:
parent
751626eec5
commit
4113bab17b
3 changed files with 89 additions and 22 deletions
|
@ -1,7 +1,5 @@
|
||||||
import QtQuick 2.3
|
import QtQuick 2.3
|
||||||
import QtQuick.Controls 2.0
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Controls 1.2 as QQC1
|
|
||||||
import QtQuick.Controls.Styles 1.2
|
|
||||||
import QtQuick.Dialogs 1.2
|
import QtQuick.Dialogs 1.2
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import org.subsurfacedivelog.mobile 1.0
|
import org.subsurfacedivelog.mobile 1.0
|
||||||
|
@ -161,45 +159,33 @@ Item {
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: qsTr("Suit:")
|
text: qsTr("Suit:")
|
||||||
}
|
}
|
||||||
QQC1.ComboBox {
|
HintsTextEdit {
|
||||||
id: suitBox
|
id: suitBox
|
||||||
editable: true
|
|
||||||
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.suitList : null
|
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.suitList : null
|
||||||
inputMethodHints: Qt.ImhNoPredictiveText
|
inputMethodHints: Qt.ImhNoPredictiveText
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
style: ComboBoxStyle {
|
|
||||||
dropDownButtonWidth: 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Label {
|
Kirigami.Label {
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: qsTr("Buddy:")
|
text: qsTr("Buddy:")
|
||||||
}
|
}
|
||||||
QQC1.ComboBox {
|
HintsTextEdit {
|
||||||
id: buddyBox
|
id: buddyBox
|
||||||
editable: true
|
|
||||||
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.buddyList : null
|
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.buddyList : null
|
||||||
inputMethodHints: Qt.ImhNoPredictiveText
|
inputMethodHints: Qt.ImhNoPredictiveText
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
style: ComboBoxStyle {
|
|
||||||
dropDownButtonWidth: 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Label {
|
Kirigami.Label {
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: qsTr("Divemaster:")
|
text: qsTr("Divemaster:")
|
||||||
}
|
}
|
||||||
QQC1.ComboBox {
|
HintsTextEdit {
|
||||||
id: divemasterBox
|
id: divemasterBox
|
||||||
editable: true
|
|
||||||
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.divemasterList : null
|
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.divemasterList : null
|
||||||
inputMethodHints: Qt.ImhNoPredictiveText
|
inputMethodHints: Qt.ImhNoPredictiveText
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
style: ComboBoxStyle {
|
|
||||||
dropDownButtonWidth: 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Label {
|
Kirigami.Label {
|
||||||
|
@ -216,15 +202,11 @@ Item {
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: qsTr("Cylinder:")
|
text: qsTr("Cylinder:")
|
||||||
}
|
}
|
||||||
QQC1.ComboBox {
|
HintsTextEdit {
|
||||||
id: cylinderBox
|
id: cylinderBox
|
||||||
editable: true
|
|
||||||
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.cylinderList : null
|
model: diveDetailsListView.currentItem ? diveDetailsListView.currentItem.modelData.dive.cylinderList : null
|
||||||
inputMethodHints: Qt.ImhNoPredictiveText
|
inputMethodHints: Qt.ImhNoPredictiveText
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
style: ComboBoxStyle {
|
|
||||||
dropDownButtonWidth: 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Label {
|
Kirigami.Label {
|
||||||
|
|
84
mobile-widgets/qml/HintsTextEdit.qml
Normal file
84
mobile-widgets/qml/HintsTextEdit.qml
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
import QtQuick 2.6
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtGraphicalEffects 1.0
|
||||||
|
import QtQuick.Layouts 1.2
|
||||||
|
import org.kde.kirigami 2.0 as Kirigami
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: root
|
||||||
|
z: focus ? 999 : 0
|
||||||
|
property alias model: hintsView.model
|
||||||
|
property alias currentIndex: hintsView.currentIndex
|
||||||
|
inputMethodHints: Qt.ImhNoPredictiveText
|
||||||
|
onTextChanged: {
|
||||||
|
textUpdateTimer.restart();
|
||||||
|
}
|
||||||
|
Keys.onUpPressed: {
|
||||||
|
hintsView.currentIndex--;
|
||||||
|
}
|
||||||
|
Keys.onDownPressed: {
|
||||||
|
hintsView.currentIndex++;
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
id: textUpdateTimer
|
||||||
|
interval: 300
|
||||||
|
onTriggered: {
|
||||||
|
if (root.text.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < hintsView.count; ++i) {
|
||||||
|
var m = model[i].match(root.text);
|
||||||
|
if (m !== null && model[i].startsWith(root.text)) {
|
||||||
|
hintsView.currentIndex = i;
|
||||||
|
root.text = model[i];
|
||||||
|
root.select(m[0].length, model[i].length);
|
||||||
|
textUpdateTimer.running = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Frame {
|
||||||
|
z: 9000
|
||||||
|
y: parent.height
|
||||||
|
visible: root.focus
|
||||||
|
width: root.width
|
||||||
|
leftPadding: 0
|
||||||
|
rightPadding: 0
|
||||||
|
topPadding: 2
|
||||||
|
bottomPadding: 2
|
||||||
|
height: Math.max(Kirigami.Units.gridUnit*4, hintsView.contentHeight + topPadding + bottomPadding)
|
||||||
|
background: Rectangle {
|
||||||
|
color: Kirigami.Theme.backgroundColor
|
||||||
|
radius: 2
|
||||||
|
layer.enabled: true
|
||||||
|
layer.effect: DropShadow {
|
||||||
|
horizontalOffset: 0
|
||||||
|
verticalOffset: 1
|
||||||
|
radius: Kirigami.Units.gridUnit
|
||||||
|
samples: 32
|
||||||
|
color: Qt.rgba(0, 0, 0, 0.5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListView {
|
||||||
|
id: hintsView
|
||||||
|
anchors.fill: parent
|
||||||
|
clip: true
|
||||||
|
onCurrentIndexChanged: root.text = model[currentIndex];
|
||||||
|
|
||||||
|
delegate: Kirigami.BasicListItem {
|
||||||
|
label: modelData
|
||||||
|
topPadding: 0
|
||||||
|
bottomPadding: 0
|
||||||
|
leftPadding: 0
|
||||||
|
rightPadding: 0
|
||||||
|
implicitHeight: Kirigami.Units.gridUnit*2
|
||||||
|
checked: hintsView.currentIndex == index
|
||||||
|
onClicked: {
|
||||||
|
hintsView.currentIndex = index
|
||||||
|
root.text = modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
<file>DiveDetailsView.qml</file>
|
<file>DiveDetailsView.qml</file>
|
||||||
<file>DownloadFromDiveComputer.qml</file>
|
<file>DownloadFromDiveComputer.qml</file>
|
||||||
<file>GpsList.qml</file>
|
<file>GpsList.qml</file>
|
||||||
|
<file>HintsTextEdit.qml</file>
|
||||||
<file>Log.qml</file>
|
<file>Log.qml</file>
|
||||||
<file>ThemeTest.qml</file>
|
<file>ThemeTest.qml</file>
|
||||||
<file>StartPage.qml</file>
|
<file>StartPage.qml</file>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue