diff --git a/dialer/src/qml/Dialer/ContactsList.qml b/dialer/src/qml/Dialer/ContactsList.qml index 91bebaca..1a662159 100644 --- a/dialer/src/qml/Dialer/ContactsList.qml +++ b/dialer/src/qml/Dialer/ContactsList.qml @@ -17,13 +17,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import QtQuick 2.0 +import QtQuick 2.7 import QtQuick.Controls 2.2 as Controls import QtQuick.Layouts 1.1 -import org.kde.kirigami 2.8 as Kirigami +import org.kde.kirigami 2.10 as Kirigami import org.kde.people 1.0 as KPeople -import org.kde.plasma.core 2.0 as PlasmaCore - Item { Controls.Label { @@ -38,104 +36,46 @@ Item { Kirigami.SearchField { id: searchField Layout.fillWidth: true + onTextChanged: contactsProxyModel.setFilterFixedString(text) } - Controls.ScrollView { - id: contactScrollView + ListView { + id: contactsList Layout.fillWidth: true Layout.fillHeight: true - Controls.ScrollBar.vertical.policy: Controls.ScrollBar.AlwaysOn - contentItem: ListView { - id: contactsList + section.property: "display" + section.criteria: ViewSection.FirstCharacter + section.delegate: Kirigami.ListSectionHeader {text: section} + clip: true - property string numberToCall - - section.property: "display" - section.criteria: ViewSection.FirstCharacter - clip: true - model: PlasmaCore.SortFilterModel { - sourceModel: KPeople.PersonsSortFilterProxyModel { - sourceModel: KPeople.PersonsModel { - id: contactsModel - } - requiredProperties: "phoneNumber" - } - sortRole: "display" - filterRole: "display" - filterRegExp: ".*" + searchField.text + ".*" - sortOrder: Qt.AscendingOrder + model: KPeople.PersonsSortFilterProxyModel { + id: contactsProxyModel + sourceModel: KPeople.PersonsModel { + id: contactsModel } + requiredProperties: "phoneNumber" + filterRole: Qt.DisplayRole + sortRole: Qt.DisplayRole + filterCaseSensitivity: Qt.CaseInsensitive + Component.onCompleted: sort(0) + } - // PlasmaCore.SortFilterModel { - // sortRole: "display" - // sourceModel: - // } + boundsBehavior: Flickable.StopAtBounds - boundsBehavior: Flickable.StopAtBounds + Component { + id: contactListDelegate - delegate: Kirigami.SwipeListItem { - height: Kirigami.Units.gridUnit * 6 - enabled: true - clip: true - - onClicked: { - contactsList.numberToCall = model.phoneNumber; - } - - actions: [ - Kirigami.Action { - icon.name: "call-start" - text: i18n("Call") - onTriggered: call(contactsList.numberToCall) - }, - Kirigami.Action { - icon.name: "configure-shortcuts" - text: i18n("Send Message") - } - ] - - - RowLayout { - id: mainLayout - anchors.fill: parent - spacing: 10 - - RoundImage { - id: avatar - source: model.decoration - isRound: true - - Layout.preferredHeight: parent.height - Kirigami.Units.gridUnit - Layout.preferredWidth: parent.height - Kirigami.Units.gridUnit - } - - ColumnLayout { - // contact name - Kirigami.Heading { - id: nickLabel - text: model.display - textFormat: Text.PlainText - elide: Text.ElideRight - maximumLineCount: 1 - level: 3 - Layout.fillWidth: true - } - - Controls.Label { - id: dataLabel - text: model.phoneNumber - - elide: Text.ElideRight - visible: dataLabel.text !== nickLabel.text - } - } - } + Kirigami.BasicListItem { + icon: model.decoration + label: model.display +// onClicked: dialerUtils.dial(model.phoneNumber) } + } - CustomSectionScroller { - listView: contactsList - } + delegate: Kirigami.DelegateRecycler { + width: parent.width + sourceComponent: contactListDelegate } } } diff --git a/dialer/src/qml/Dialer/CustomSectionScroller.qml b/dialer/src/qml/Dialer/CustomSectionScroller.qml deleted file mode 100644 index 6e64f40c..00000000 --- a/dialer/src/qml/Dialer/CustomSectionScroller.qml +++ /dev/null @@ -1,205 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Components project. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.1 -import QtQuick.Layouts 1.1 - -import "private/SectionScroller.js" as Sections -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.plasma.components 2.0 as PlasmaComponents - -/** - * Similar to a ScrollBar or a ScrollDecorator. - * - * It's interactive and works on ListViews that have section.property set, so - * its contents are categorized. - * - * An indicator will say to what category the user scrolled to. Useful for - * things like address books or things sorted by date. Don't use with models - * too big (thousands of items) because it implies loading all the items to - * memory, as well loses precision. - * - * @inherit QtQuick.Item - */ -Item { - id: root - - /** - * The listview the sectionScroller will operate on. This component doesn't - * work with Flickable or GridView. - */ - property ListView listView - - onListViewChanged: { - if (listView && listView.model) - internal.initDirtyObserver(); - } - - Connections { - target: listView - onModelChanged: { - if (listView && listView.model) { - internal.initDirtyObserver() - } - } - } - - implicitWidth: scrollBar.implicitWidth - Behavior on opacity { - NumberAnimation { - duration: units.longDuration - } - } - - anchors { - right: listView.right - top: listView.top - bottom: listView.bottom - } - - - PlasmaComponents.RangeModel { - id: range - - minimumValue: 0 - maximumValue: Math.max(0, listView.contentHeight - listView.height) - stepSize: 0 - //inverted: true - positionAtMinimum: root.width*2 - positionAtMaximum: root.height - root.width*2 - value: listView.contentY - onPositionChanged: { - var section = Sections.closestSection(position/listView.height); - if (section) { - if (listView.section.criteria == ViewSection.FirstCharacter) { - sectionLabel.text = section[0]; - } else { - sectionLabel.text = section; - } - } - } - - } - - PlasmaComponents.ScrollBar { - id: scrollBar - flickableItem: listView - anchors.fill: parent - interactive: true - } - PlasmaCore.FrameSvgItem { - id: tooltip - imagePath: "widgets/background" - width: units.gridUnit * 5 + margins.left + margins.right - height: sectionLabel.height + /*subtitle.height +*/ margins.top + margins.bottom - - ColumnLayout { - anchors.centerIn: parent - - PlasmaExtras.Title { - id: sectionLabel - Layout.fillWidth: true - Layout.fillHeight: true - horizontalAlignment: Text.AlignHCenter - } - -// PlasmaComponents.Label { -// id: subtitle -// Layout.fillWidth: true -// horizontalAlignment: Text.AlignHCenter -// visible: text.length > 0 -// text: "Thursday, 7th" -// } - - } - y: 0 - x: -listView.width/2 - width/2 - - opacity: sectionLabel.text && scrollBar.pressed ? 1 : 0 - Behavior on opacity { - NumberAnimation { - duration: units.longDuration - } - } - } - - - Timer { - id: dirtyTimer - interval: 250 - onTriggered: { - Sections.initSectionData(listView); - internal.modelDirty = false; - tooltip.visible = Sections._sections.length > 1 - } - } - QtObject { - id: internal - - property bool modelDirty: false - function initDirtyObserver() { - Sections.initSectionData(listView); - tooltip.visible = Sections._sections.length > 1 - function dirtyObserver() { - if (!internal.modelDirty) { - internal.modelDirty = true; - dirtyTimer.running = true; - } - } - - if (listView.model.countChanged) - listView.model.countChanged.connect(dirtyObserver); - - if (listView.model.itemsChanged) - listView.model.itemsChanged.connect(dirtyObserver); - - if (listView.model.itemsInserted) - listView.model.itemsInserted.connect(dirtyObserver); - - if (listView.model.itemsMoved) - listView.model.itemsMoved.connect(dirtyObserver); - - if (listView.model.itemsRemoved) - listView.model.itemsRemoved.connect(dirtyObserver); - } - } - Accessible.role: Accessible.ScrollBar -} diff --git a/dialer/src/qml/Dialer/private/SectionScroller.js b/dialer/src/qml/Dialer/private/SectionScroller.js deleted file mode 100644 index 7b987fed..00000000 --- a/dialer/src/qml/Dialer/private/SectionScroller.js +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Components project. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -var _sectionData = []; -var _sections = []; - -function initSectionData(list) { - if (!list || !list.model) return; - _sectionData = []; - _sections = []; - var current = ""; - var prop = list.section.property; - - for (var i = 0, count = list.model.count; i < count; i++) { - var item = list.model.get(i); - if (item[prop] !== current) { - current = item[prop]; - _sections.push(current); - _sectionData.push({ index: i, header: current }); - } - } -} - -function closestSection(pos) { - var tmp = (_sections.length) * pos; - var val = Math.ceil(tmp) // TODO: better algorithm - val = val < 2 ? 1 : val; - return _sections[val-1]; -} - -function indexOf(sectionName) { - var val = _sectionData[_sections.indexOf(sectionName)].index; - return val === 0 || val > 0 ? val : -1; -} diff --git a/dialer/src/resources.qrc b/dialer/src/resources.qrc index dff3c1fc..304c911c 100644 --- a/dialer/src/resources.qrc +++ b/dialer/src/resources.qrc @@ -7,10 +7,8 @@ qml/Dialer/Dialer.qml qml/Dialer/ContactsList.qml qml/Dialer/DialPage.qml - qml/Dialer/private/SectionScroller.js qml/Dialer/RoundImage.qml qml/Dialer/History.qml - qml/Dialer/CustomSectionScroller.qml qml/Dialer/HistoryDelegate.qml qml/Dialpad/Dialpad.qml qml/Dialpad/PhoneNumberInput.qml