From b59cdcd4d3110283e84a62c8c4329d02260b0f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:13:13 +0100 Subject: [PATCH 01/12] import mobilecomponents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds the .qml and qmldir files for the MobileComponents import. It contains low-level things like units and theme, and mid-level things like Heading, and high-level navigation in the form of an ApplicationWindow and Drawers that hold menues and provide swipe interactions between the pages. These components are a more full version of the "light" plasma components we have been using to make the UI scale well and appear more consistent (coloring, spacing, alignment, etc.). An interesting change is that Units and Theme are now singleton types, which is more efficient. It does mean a few changes to our current API usage: - units becomes Units - theme becomes Theme - 2 properties move out of each (we can't subclass singleton types) This change also means that we're using the vanilla upstream components, so it's very easy to get improvements to these rather young components in, and we don't have to do this work on our own. The mobilecomponents consist of just a bunch of qml files which we can deploy through the qrc file. In the next commits, we will gradually make the current UI use these new elements. Signed-off-by: Sebastian Kügler --- .../qml/mobilecomponents/ActionGroup.qml | 27 + .../mobilecomponents/ApplicationWindow.qml | 86 +++ .../qml/mobilecomponents/ContextDrawer.qml | 93 ++++ .../qml/mobilecomponents/GlobalDrawer.qml | 198 +++++++ qt-mobile/qml/mobilecomponents/Heading.qml | 76 +++ qt-mobile/qml/mobilecomponents/Icon.qml | 42 ++ qt-mobile/qml/mobilecomponents/IconGrid.qml | 239 +++++++++ qt-mobile/qml/mobilecomponents/Label.qml | 59 +++ qt-mobile/qml/mobilecomponents/ListItem.qml | 129 +++++ .../mobilecomponents/ListItemWithActions.qml | 276 ++++++++++ .../qml/mobilecomponents/OverlayDrawer.qml | 317 +++++++++++ qt-mobile/qml/mobilecomponents/Page.qml | 71 +++ qt-mobile/qml/mobilecomponents/PageRow.qml | 496 ++++++++++++++++++ .../qml/mobilecomponents/SplitDrawer.qml | 234 +++++++++ qt-mobile/qml/mobilecomponents/Theme.qml | 62 +++ qt-mobile/qml/mobilecomponents/Units.qml | 101 ++++ .../qml/mobilecomponents/icons/go-next.svg | 144 +++++ .../mobilecomponents/icons/go-previous.svg | 463 ++++++++++++++++ .../private/AbstractDrawer.qml | 47 ++ .../mobilecomponents/private/ActionButton.qml | 142 +++++ .../private/ActionButtonArrow.qml | 56 ++ .../qml/mobilecomponents/private/PageStack.js | 243 +++++++++ qt-mobile/qml/mobilecomponents/private/qmldir | 3 + qt-mobile/qml/mobilecomponents/qmldir | 19 + 24 files changed, 3623 insertions(+) create mode 100644 qt-mobile/qml/mobilecomponents/ActionGroup.qml create mode 100644 qt-mobile/qml/mobilecomponents/ApplicationWindow.qml create mode 100644 qt-mobile/qml/mobilecomponents/ContextDrawer.qml create mode 100644 qt-mobile/qml/mobilecomponents/GlobalDrawer.qml create mode 100644 qt-mobile/qml/mobilecomponents/Heading.qml create mode 100644 qt-mobile/qml/mobilecomponents/Icon.qml create mode 100644 qt-mobile/qml/mobilecomponents/IconGrid.qml create mode 100644 qt-mobile/qml/mobilecomponents/Label.qml create mode 100644 qt-mobile/qml/mobilecomponents/ListItem.qml create mode 100644 qt-mobile/qml/mobilecomponents/ListItemWithActions.qml create mode 100644 qt-mobile/qml/mobilecomponents/OverlayDrawer.qml create mode 100644 qt-mobile/qml/mobilecomponents/Page.qml create mode 100644 qt-mobile/qml/mobilecomponents/PageRow.qml create mode 100644 qt-mobile/qml/mobilecomponents/SplitDrawer.qml create mode 100644 qt-mobile/qml/mobilecomponents/Theme.qml create mode 100644 qt-mobile/qml/mobilecomponents/Units.qml create mode 100644 qt-mobile/qml/mobilecomponents/icons/go-next.svg create mode 100644 qt-mobile/qml/mobilecomponents/icons/go-previous.svg create mode 100644 qt-mobile/qml/mobilecomponents/private/AbstractDrawer.qml create mode 100644 qt-mobile/qml/mobilecomponents/private/ActionButton.qml create mode 100644 qt-mobile/qml/mobilecomponents/private/ActionButtonArrow.qml create mode 100644 qt-mobile/qml/mobilecomponents/private/PageStack.js create mode 100644 qt-mobile/qml/mobilecomponents/private/qmldir create mode 100644 qt-mobile/qml/mobilecomponents/qmldir diff --git a/qt-mobile/qml/mobilecomponents/ActionGroup.qml b/qt-mobile/qml/mobilecomponents/ActionGroup.qml new file mode 100644 index 000000000..ba057f58f --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/ActionGroup.qml @@ -0,0 +1,27 @@ +/* + * Copycontext 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.3 + +Action { + id: root + default property alias children: root.__children + property list __children +} diff --git a/qt-mobile/qml/mobilecomponents/ApplicationWindow.qml b/qt-mobile/qml/mobilecomponents/ApplicationWindow.qml new file mode 100644 index 000000000..71980f9e6 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/ApplicationWindow.qml @@ -0,0 +1,86 @@ +/* + * Copycontext 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.3 +import "private" + +/** + * A window that provides some basic features needed for all apps + * + * It's usually used as a root QML component for the application. + * It's based around the PageRow component, the application will be + * about pages adding and removal. + */ +ApplicationWindow { + id: root + + /** + * The first page that will be loaded when the application starts + */ + property alias initialPage: __pageStack.initialPage + + /** + * The stack used to allocate the pages nd to manage the transitions + * between them. + * It's using a PageRow, while having the same aPI as PageStack, + * it positions the pages as adjacent columns, with as many columns + * as can fit in the screen. An handheld device would usually have a single + * fullscreen column, a tablet device would have many tiled columns. + */ + property alias pageStack: __pageStack + + PageRow { + id: __pageStack + anchors.fill: parent + focus: true + Keys.onReleased: { + if (event.key == Qt.Key_Back && stackView.depth > 1) { + stackView.pop(); + event.accepted = true; + } + } + onLastVisiblePageChanged: { + if (lastVisiblePage != null) { + pop(lastVisiblePage) + } + } + } + + property AbstractDrawer globalDrawer + property AbstractDrawer contextDrawer + + onGlobalDrawerChanged: { + globalDrawer.parent = contentItem.parent; + } + onContextDrawerChanged: { + contextDrawer.parent = contentItem.parent; + } + + property alias actionButton: __actionButton + ActionButton { + id: __actionButton + z: 9999 + anchors.bottom: parent.bottom + x: parent.width/2 - width/2 + iconSource: "distribute-horizontal-x" + + visible: root.globalDrawer || root.contextDrawer + } +} diff --git a/qt-mobile/qml/mobilecomponents/ContextDrawer.qml b/qt-mobile/qml/mobilecomponents/ContextDrawer.qml new file mode 100644 index 000000000..2e2f95f7e --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/ContextDrawer.qml @@ -0,0 +1,93 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 as QtControls +import org.kde.plasma.mobilecomponents 0.2 + +OverlayDrawer { + id: root + + property string title + + //This can be any type of object that a ListView can accept as model. It expects items compatible with either QAction or QQC Action + property var actions + enabled: menu.count > 0 + edge: Qt.RightEdge + + contentItem: QtControls.ScrollView { + ListView { + id: menu + model: { + if (root.actions.length == 0) { + return null; + } else { + return root.actions[0].text !== undefined && + root.actions[0].trigger !== undefined ? + root.actions : + root.actions[0]; + } + } + verticalLayoutDirection: ListView.BottomToTop + //in bottomtotop all is flipped + footer: Item { + height: heading.height + width: menu.width + Heading { + id: heading + anchors { + left: parent.left + right: parent.right + margins: Units.largeSpacing + } + elide: Text.ElideRight + level: 2 + text: root.title + } + } + delegate: ListItem { + enabled: true + Row { + anchors { + left: parent.left + margins: Units.largeSpacing + } + Icon { + height: parent.height + width: height + source: modelData.iconName + } + Label { + text: model ? model.text : modelData.text + } + } + onClicked: { + if (modelData && modelData.trigger !== undefined) { + modelData.trigger(); + // assume the model is a list of QAction or Action + } else if (menu.model.length > index) { + menu.model[index].trigger(); + } else { + console.warning("Don't know how to trigger the action") + } + } + } + } + } +} diff --git a/qt-mobile/qml/mobilecomponents/GlobalDrawer.qml b/qt-mobile/qml/mobilecomponents/GlobalDrawer.qml new file mode 100644 index 000000000..082231c41 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/GlobalDrawer.qml @@ -0,0 +1,198 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Layouts 1.2 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 + +OverlayDrawer { + id: root + edge: Qt.LeftEdge + + default property alias content: mainContent.data + + property alias title: heading.text + property alias titleIcon: headingIcon.source + property alias bannerImageSource: bannerImage.source + property list actions + + contentItem: ColumnLayout { + id: mainColumn + anchors.fill: parent + spacing: 0 + implicitWidth: Units.gridUnit * 12 + + Image { + id: bannerImage + Layout.fillWidth: true + + Layout.preferredWidth: title.implicitWidth + Layout.preferredHeight: bannerImageSource != "" ? Math.max(title.implicitHeight, Math.floor(width / (sourceSize.width/sourceSize.height))) : title.implicitHeight + Layout.minimumHeight: Math.max(headingIcon.height, heading.height) + Units.smallSpacing*2 + + fillMode: Image.PreserveAspectCrop + + anchors { + left: parent.left + right: parent.right + top: parent.top + } + + LinearGradient { + anchors { + left: parent.left + right: parent.right + top: parent.top + } + visible: bannerImageSource != "" + height: title.height * 1.3 + start: Qt.point(0, 0) + end: Qt.point(0, height) + gradient: Gradient { + GradientStop { + position: 0.0 + color: Qt.rgba(0, 0, 0, 0.8) + } + GradientStop { + position: 1.0 + color: "transparent" + } + } + } + + RowLayout { + id: title + anchors { + left: parent.left + top: parent.top + margins: Units.smallSpacing + } + Icon { + id: headingIcon + Layout.minimumWidth: Units.iconSizes.large + Layout.minimumHeight: width + } + Heading { + id: heading + level: 1 + color: bannerImageSource != "" ? "white" : Theme.textColor + } + Item { + height: parent.height + Layout.minimumWidth: height + } + } + } + + Rectangle { + color: Theme.textColor + opacity: 0.2 + Layout.fillWidth: true + Layout.minimumHeight: 1 + } + + StackView { + id: pageRow + Layout.fillWidth: true + Layout.fillHeight: true + initialItem: menuComponent + } + + ColumnLayout { + id: mainContent + Layout.alignment: Qt.AlignHCenter + Layout.minimumWidth: parent.width - Units.smallSpacing*2 + Layout.maximumWidth: Layout.minimumWidth + Layout.fillWidth: false + Layout.fillHeight: true + } + Item { + Layout.minimumWidth: Units.smallSpacing + Layout.minimumHeight: Units.smallSpacing + } + + Component { + id: menuComponent + ListView { + id: optionMenu + clip: true + + model: actions + property int level: 0 + + footer: ListItem { + visible: level > 0 + enabled: true + RowLayout { + anchors { + left: parent.left + } + Icon { + Layout.maximumWidth: height + Layout.fillHeight: true + source: "go-previous" + } + Label { + // Weird, this doesn't work + //text: (typeof(i18n) != undefined) ? i18n("Back") : "Back" + text: "Back" + } + } + onClicked: pageRow.pop() + } + delegate: ListItem { + enabled: true + RowLayout { + anchors { + left: parent.left + right: parent.right + } + Icon { + Layout.maximumWidth: height + Layout.fillHeight: true + source: modelData.iconName + } + Label { + Layout.fillWidth: true + text: modelData.text + } + Icon { + Layout.maximumWidth: height + Layout.fillHeight: true + source: "go-next" + visible: modelData.children != undefined + } + } + onClicked: { + if (modelData.children) { + pageRow.push(menuComponent, {"model": modelData.children, "level": level + 1}); + } else { + modelData.trigger(); + pageRow.pop(pageRow.initialPage); + root.opened = false; + } + } + } + } + } + } +} + diff --git a/qt-mobile/qml/mobilecomponents/Heading.qml b/qt-mobile/qml/mobilecomponents/Heading.qml new file mode 100644 index 000000000..0d3909e12 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Heading.qml @@ -0,0 +1,76 @@ +/* +* Copyright 2012 by Sebastian Kügler +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU Library General Public License as +* published by the Free Software Foundation; either version 2, or +* (at your option) any later version. +* +* 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 Library General Public License for more details +* +* You should have received a copy of the GNU Library General Public +* License along with this program; if not, write to the +* Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. +*/ + +import QtQuick 2.0 +import org.kde.plasma.mobilecomponents 0.2 + +/** + * A heading label used for subsections of texts. + * + * The characteristics of the text will be automatically set according to the + * plasma Theme. Use this components for section titles or headings in your UI, + * for example page or section titles. + * + * Example usage: + * + * @code + * import org.kde.plasma.extras 2.0 as PlasmaExtras + * [...] + * Column { + * PlasmaExtras.Title { text: "Fruit sweetness on the rise" } + * PlasmaExtras.Heading { text: "Apples in the sunlight"; level: 2 } + * PlasmaExtras.Paragraph { text: "Long text about fruit and apples [...]" } + * [...] + * } + * @endcode + * + * The most important property is "text", which applies to the text property of + * Label. See PlasmaComponents Label and primitive QML Text element API for + * additional properties, methods and signals. + */ +Label { + id: heading + + /** + * The level determines how big the section header is display, values + * between 1 (big) and 5 (small) are accepted + */ + property int level: 1 + + property int step: 2 + + height: Math.round(paintedHeight * 1.2) + font.pointSize: headerPointSize(level) + font.weight: Font.Light + wrapMode: Text.WordWrap + opacity: 0.8 + + function headerPointSize(l) { + var n = Theme.defaultFont.pointSize; + var s; + if (l > 4) { + s = n + } else if (l < 2) { + s = n + (5*step) + } else { + s = n + ((5-level)*2) + } + return s; + } +} diff --git a/qt-mobile/qml/mobilecomponents/Icon.qml b/qt-mobile/qml/mobilecomponents/Icon.qml new file mode 100644 index 000000000..d5b253235 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Icon.qml @@ -0,0 +1,42 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.0 +import QtGraphicalEffects 1.0 + +Item { + id: root + property string source + property alias smooth: image.smooth + property bool active: false + property bool valid: image.status == Image.Ready + implicitWidth: image.sourceSize.width + implicitHeight: image.sourceSize.height + + Image { + id: image + anchors.fill: parent + source: root.source != "" ? "icons/" + root.source + ".svg" : root.source + } + GammaAdjust { + anchors.fill: image + source: image + gamma: root.active ? 3.0 : 1 + } +} diff --git a/qt-mobile/qml/mobilecomponents/IconGrid.qml b/qt-mobile/qml/mobilecomponents/IconGrid.qml new file mode 100644 index 000000000..f3f8f1c09 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/IconGrid.qml @@ -0,0 +1,239 @@ +/* + Copyright 2010 Marco Martin + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +import QtQuick 2.1 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.mobilecomponents 0.2 +import org.kde.plasma.mobilecomponents.private 0.2 + +Item { + id: main + + property Component delegate + property QtObject model + + property int pageSize: Math.floor(iconView.width/main.delegateWidth)*Math.floor(iconView.height/main.delegateHeight) + property int delegateWidth: Units.iconSizes.huge + Units.gridUnit*2 + property int delegateHeight: Units.iconSizes.huge + Units.gridUnit*2 + property alias currentPage: iconView.currentIndex + property int pagesCount: Math.ceil(model.count/pageSize) + property int count: model.count + property alias contentX: iconView.contentX + clip: true + + function positionViewAtIndex(index) + { + iconView.positionViewAtIndex(index / pageSize, ListView.Beginning) + } + + Timer { + id: resizeTimer + running: true + interval: 100 + onTriggered: { + main.pageSize = Math.floor(iconView.width/main.delegateWidth)*Math.floor(iconView.height/main.delegateHeight) + if (iconView.currentItem) { + iconView.currentItem.width = iconView.width + iconView.currentItem.height = iconView.height + } + } + } + + ListView { + id: iconView + objectName: "iconView" + pressDelay: 200 + cacheBuffer: 100 + highlightMoveDuration: 250 + anchors.fill: parent + onWidthChanged: resizeTimer.restart() + onHeightChanged: resizeTimer.restart() + + model: main.model ? Math.ceil(main.model.count/main.pageSize) : 0 + highlightRangeMode: ListView.StrictlyEnforceRange + orientation: ListView.Horizontal + snapMode: ListView.SnapOneItem + boundsBehavior: Flickable.DragOverBounds + + signal clicked(string url) + + delegate: Component { + Item { + id: delegatePage + //Explicitly *not* bind the properties for performance reasons + Component.onCompleted: { + width = iconView.width + height = iconView.height + //iconView.cacheBuffer = iconView.width + } + + Flow { + id: iconFlow + width: iconRepeater.suggestedWidth + + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + bottom: parent.bottom + } + property int orientation: ListView.Horizontal + + PagedProxyModel { + id: pagedProxyModel + sourceModel: main.model + currentPage: model.index + pageSize: main.pageSize + } + Repeater { + id: iconRepeater + model: pagedProxyModel + property int columns: Math.min(count, Math.floor(delegatePage.width/main.delegateWidth)) + property int suggestedWidth: main.delegateWidth*columns + //property int suggestedHeight: main.delegateHeight*Math.floor(count/columns) + + delegate: main.delegate + } + } + } + } + } + + + Loader { + id: scrollArea + visible: main.model && Math.ceil(main.model.count/main.pageSize) > 1 + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + height: Math.max( 16, iconView.height - Math.floor(iconView.height/delegateHeight)*delegateHeight) + + property int pageCount: main.model ? Math.ceil(main.model.count/main.pageSize) : 0 + + sourceComponent: pageCount > 1 ? ((pageCount * 20 > width) ? scrollDotComponent : dotsRow) : undefined + function setViewIndex(index) + { + //animate only if near + if (Math.abs(iconView.currentIndex - index) > 1) { + iconView.positionViewAtIndex(index, ListView.Beginning) + } else { + iconView.currentIndex = index + } + } + Component { + id: scrollDotComponent + MouseArea { + anchors.fill: parent + property int pendingIndex: 0 + Rectangle { + id: barRectangle + color: Theme.textColor + opacity: 2.05 + height: 4 + radius: 2 + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: (parent.width/pageCount/2) + rightMargin: (parent.width/pageCount/2) + } + } + Rectangle { + color: Theme.textColor + height: 8 + width: height + radius: 4 + anchors.verticalCenter: parent.verticalCenter + x: parent.width/(pageCount/(iconView.currentIndex+1)) - (parent.width/pageCount/2) - 4 + Behavior on x { + NumberAnimation { + duration: 250 + easing.type: Easing.InOutQuad + } + } + } + function setViewIndexFromMouse(x) + { + pendingIndex = Math.min(pageCount, + Math.round(pageCount / (barRectangle.width / Math.max(x - barRectangle.x, 1)))) + viewPositionTimer.restart() + } + onPressed: setViewIndexFromMouse(mouse.x) + onPositionChanged: setViewIndexFromMouse(mouse.x) + + Timer { + id: viewPositionTimer + interval: 200 + onTriggered: setViewIndex(pendingIndex) + } + } + } + Component { + id: dotsRow + + Item { + Row { + anchors.centerIn: parent + spacing: 20 + + Repeater { + model: scrollArea.pageCount + + + Rectangle { + width: 6 + height: 6 + scale: iconView.currentIndex == index ? 1.5 : 1 + radius: 5 + smooth: true + opacity: iconView.currentIndex == index ? 0.8: 0.4 + color: Theme.textColor + + Behavior on scale { + NumberAnimation { + duration: 250 + easing.type: Easing.InOutQuad + } + } + Behavior on opacity { + NumberAnimation { + duration: 250 + easing.type: Easing.InOutQuad + } + } + + MouseArea { + anchors { + fill: parent + margins: -10 + } + + onClicked: { + setViewIndex(index) + } + } + } + } + } + } + } + } +} diff --git a/qt-mobile/qml/mobilecomponents/Label.qml b/qt-mobile/qml/mobilecomponents/Label.qml new file mode 100644 index 000000000..bf27078b7 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Label.qml @@ -0,0 +1,59 @@ +/* +* Copyright (C) 2011 by Marco Martin +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU Library General Public License as +* published by the Free Software Foundation; either version 2, or +* (at your option) any later version. +* +* 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 Library General Public License for more details +* +* You should have received a copy of the GNU Library General Public +* License along with this program; if not, write to the +* Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. +*/ + +import QtQuick 2.1 +import org.kde.plasma.mobilecomponents 0.2 + +/** + * This is a label which uses the plasma Theme. + * + * The characteristics of the text will be automatically set according to the + * plasma Theme. If you need a more customized text item use the Text component + * from QtQuick. + * + * You can use all elements of the QML Text component, in particular the "text" + * property to define the label text. + * + * @inherit QtQuick.Text + */ +Text { + id: root + + height: Math.round(Math.max(paintedHeight, Units.gridUnit * 1.6)) + verticalAlignment: lineCount > 1 ? Text.AlignTop : Text.AlignVCenter + + activeFocusOnTab: false + renderType: Text.NativeRendering + + font.capitalization: Theme.defaultFont.capitalization + font.family: Theme.defaultFont.family + font.italic: Theme.defaultFont.italic + font.letterSpacing: Theme.defaultFont.letterSpacing + font.pointSize: Theme.defaultFont.pointSize + font.strikeout: Theme.defaultFont.strikeout + font.underline: Theme.defaultFont.underline + font.weight: Theme.defaultFont.weight + font.wordSpacing: Theme.defaultFont.wordSpacing + color: Theme.textColor + + opacity: enabled? 1 : 0.6 + + Accessible.role: Accessible.StaticText + Accessible.name: text +} diff --git a/qt-mobile/qml/mobilecomponents/ListItem.qml b/qt-mobile/qml/mobilecomponents/ListItem.qml new file mode 100644 index 000000000..042ba2cbc --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/ListItem.qml @@ -0,0 +1,129 @@ +/* + * Copyright 2010 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ + +import QtQuick 2.1 +import org.kde.plasma.mobilecomponents 0.2 + +/** + * An item delegate for the primitive ListView component. + * + * It's intended to make all listviews look coherent. + * + * @inherit QtQuick.Item + */ +Item { + id: listItem + default property alias content: paddingItem.data + + /** + * type:bool Holds if the item emits signals related to mouse interaction. + * + * The default value is false. + */ + property alias enabled: itemMouse.enabled + //item has been clicked or pressed+hold + + /** + * This signal is emitted when there is a click. + * + * This is disabled by default, set enabled to true to use it. + * @see enabled + */ + signal clicked + + + /** + * The user pressed the item with the mouse and didn't release it for a + * certain amount of time. + * + * This is disabled by default, set enabled to true to use it. + * @see enabled + */ + signal pressAndHold + + /** + * If true makes the list item look as checked or pressed. It has to be set + * from the code, it won't change by itself. + */ + //plasma extension + //always look pressed? + property bool checked: false + + /** + * If true the item will be a delegate for a section, so will look like a + * "title" for the otems under it. + */ + //is this to be used as section delegate? + property bool sectionDelegate: false + + /** + * True if the list item contains mouse + */ + property alias containsMouse: itemMouse.containsMouse + + width: parent ? parent.width : childrenRect.width + height: paddingItem.childrenRect.height + Units.smallSpacing*2 + + property int implicitHeight: paddingItem.childrenRect.height + Units.smallSpacing*2 + + + MouseArea { + id: itemMouse + property bool changeBackgroundOnPress: !listItem.checked && !listItem.sectionDelegate + anchors.fill: parent + enabled: false + hoverEnabled: true + + onClicked: listItem.clicked() + onPressAndHold: listItem.pressAndHold() + + Rectangle { + id : background + color: listItem.checked || (itemMouse.pressed && itemMouse.changeBackgroundOnPress) ? Theme.highlightColor : Theme.viewBackgroundColor + + anchors.fill: parent + visible: listItem.ListView.view ? listItem.ListView.view.highlight === null : true + opacity: itemMouse.containsMouse && !itemMouse.pressed ? 0.5 : 1 + Behavior on color { + ColorAnimation { duration: Units.longDuration } + } + Behavior on opacity { NumberAnimation { duration: Units.longDuration } } + } + Item { + id: paddingItem + anchors { + fill: parent + margins: Units.smallSpacing + } + } + } + + Rectangle { + color: Theme.textColor + opacity: 0.2 + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + height: 1 + } + + Accessible.role: Accessible.ListItem +} diff --git a/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml b/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml new file mode 100644 index 000000000..9d54fda24 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml @@ -0,0 +1,276 @@ +/* + * Copyright 2010 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 1.0 +import org.kde.plasma.mobilecomponents 0.2 +import QtGraphicalEffects 1.0 + +/** + * An item delegate for the primitive ListView component. + * + * It's intended to make all listviews look coherent. + * + * @inherit QtQuick.Item + */ +Item { + id: listItem + default property alias content: paddingItem.data + + /** + * type:bool Holds if the item emits signals related to mouse interaction. + * + * The default value is false. + */ + property alias enabled: itemMouse.enabled + //item has been clicked or pressed+hold + + /** + * This signal is emitted when there is a click. + * + * This is disabled by default, set enabled to true to use it. + * @see enabled + */ + signal clicked + + + /** + * The user pressed the item with the mouse and didn't release it for a + * certain amount of time. + * + * This is disabled by default, set enabled to true to use it. + * @see enabled + */ + signal pressAndHold + + /** + * If true makes the list item look as checked or pressed. It has to be set + * from the code, it won't change by itself. + */ + //plasma extension + //always look pressed? + property bool checked: false + + /** + * If true the item will be a delegate for a section, so will look like a + * "title" for the otems under it. + */ + //is this to be used as section delegate? + property bool sectionDelegate: false + + /** + * True if the list item contains mouse + */ + property alias containsMouse: itemMouse.containsMouse + + /** + * Defines the actions for the page: at most 4 buttons will + * contain the actions at the bottom of the page, if the main + * item of the page is a Flickable or a ScrllArea, it will + * control the visibility of the actions. + */ + property alias actions: internalActions.data + + Item { + id: internalActions + } + + width: parent ? parent.width : childrenRect.width + height: paddingItem.childrenRect.height + Units.smallSpacing*2 + + property int implicitHeight: paddingItem.childrenRect.height + Units.smallSpacing*2 + + + Rectangle { + id : background + color: Theme.backgroundColor + + width: parent.width + height: parent.height + MouseArea { + anchors.fill: parent + onClicked: itemMouse.x = 0; + } + RowLayout { + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + rightMargin: y + } + height: Math.min( parent.height/1.5, Units.iconSizes.medium) + property bool exclusive: false + property Item checkedButton + spacing: 0 + Repeater { + model: { + if (listItem.actions.length == 0) { + return null; + } else { + return listItem.actions[0].text !== undefined && + listItem.actions[0].trigger !== undefined ? + listItem.actions : + listItem.actions[0]; + } + } + delegate: ToolButton { + Layout.fillHeight: true + Layout.minimumWidth: height + iconName: modelData.iconName + property bool flat: false + onClicked: { + if (modelData && modelData.trigger !== undefined) { + modelData.trigger(); + // assume the model is a list of QAction or Action + } else if (toolbar.model.length > index) { + toolbar.model[index].trigger(); + } else { + console.log("Don't know how to trigger the action") + } + itemMouse.x = 0; + } + } + } + } + } + InnerShadow { + anchors.fill: parent + radius: Units.smallSpacing*2 + samples: 16 + horizontalOffset: 0 + verticalOffset: Units.smallSpacing/2 + color: Qt.rgba(0, 0, 0, 0.3) + source: background + } + LinearGradient { + id: shadow + //TODO: depends from app layout + property bool inverse: true + width: Units.smallSpacing*2 + anchors { + right: shadow.inverse ? undefined : itemMouse.left + left: shadow.inverse ? itemMouse.right : undefined + top: itemMouse.top + bottom: itemMouse.bottom + rightMargin: -1 + } + start: Qt.point(0, 0) + end: Qt.point(Units.smallSpacing*2, 0) + gradient: Gradient { + GradientStop { + position: 0.0 + color: shadow.inverse ? Qt.rgba(0, 0, 0, 0.3) : "transparent" + } + GradientStop { + position: shadow.inverse ? 0.3 : 0.7 + color: Qt.rgba(0, 0, 0, 0.15) + } + GradientStop { + position: 1.0 + color: shadow.inverse ? "transparent" : Qt.rgba(0, 0, 0, 0.3) + } + } + } + + MouseArea { + id: itemMouse + property bool changeBackgroundOnPress: !listItem.checked && !listItem.sectionDelegate + width: parent.width + height: parent.height + enabled: false + hoverEnabled: true + + onClicked: listItem.clicked() + onPressAndHold: listItem.pressAndHold() + + Behavior on x { + NumberAnimation { + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + + Rectangle { + id : item + color: listItem.checked || (itemMouse.pressed && itemMouse.changeBackgroundOnPress) ? Theme.highlightColor : Theme.viewBackgroundColor + anchors.fill: parent + + visible: listItem.ListView.view ? listItem.ListView.view.highlight === null : true + Behavior on color { + ColorAnimation { duration: Units.longDuration } + } + + Item { + id: paddingItem + anchors { + fill: parent + margins: Units.smallSpacing + } + } + + MouseArea { + width: Units.iconSizes.smallMedium + height: width + preventStealing: true + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + rightMargin: y + } + drag { + target: itemMouse + axis: Drag.XAxis + maximumX: 0 + } + onReleased: { + if (itemMouse.x > -itemMouse.width/2) { + itemMouse.x = 0; + } else { + itemMouse.x = -itemMouse.width + width*2 + } + } + onClicked: { + if (itemMouse.x < -itemMouse.width/2) { + itemMouse.x = 0; + } else { + itemMouse.x = -itemMouse.width + width*2 + } + } + Icon { + anchors.fill: parent + source: "application-menu" + } + } + } + } + + + Rectangle { + color: Theme.textColor + opacity: 0.2 + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + height: 1 + } + + Accessible.role: Accessible.ListItem +} diff --git a/qt-mobile/qml/mobilecomponents/OverlayDrawer.qml b/qt-mobile/qml/mobilecomponents/OverlayDrawer.qml new file mode 100644 index 000000000..5ae81929e --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/OverlayDrawer.qml @@ -0,0 +1,317 @@ +/* + * Copyright 2012 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 +import "private" + +/**Documented API + +Imports: + QtQuick 2.1 + +Description: + Overlay Drawers are used to expose additional UI elements needed for small secondary tasks for which the main UI elements are not needed. For example in Okular Active, an Overlay Drawer is used to display thumbnails of all pages within a document along with a search field. This is used for the distinct task of navigating to another page. + +Properties: + bool opened: + If true the drawer is open showing the contents of the "drawer" component. + + Item page: + It's the default property. it's the main content of the drawer page, the part that is always shown + + Item contentItem: + It's the part that can be pulled in and out, will act as a sidebar. +**/ +AbstractDrawer { + id: root + anchors.fill: parent + z: 9999 + + default property alias page: mainPage.data + property Item contentItem + property alias opened: browserFrame.open + property int edge: Qt.LeftEdge + property real position: 0 + + onContentItemChanged: contentItem.parent = drawerPage + onPositionChanged: { + if (!enabled) { + return; + } + if (root.edge == Qt.LeftEdge) { + browserFrame.x = -browserFrame.width + position * browserFrame.width; + } else { + browserFrame.x = root.width - (position * browserFrame.width); + } + } + function open () { + mouseEventListener.startBrowserFrameX = browserFrame.x; + browserFrame.state = "Dragging"; + browserFrame.state = "Open"; + } + function close () { + mouseEventListener.startBrowserFrameX = browserFrame.x; + browserFrame.state = "Dragging"; + browserFrame.state = "Closed"; + } + + Item { + id: mainPage + anchors.fill: parent + onChildrenChanged: mainPage.children[0].anchors.fill = mainPage + } + + Rectangle { + anchors.fill: parent + color: "black" + opacity: 0.6 * (root.edge == Qt.LeftEdge + ? ((browserFrame.x + browserFrame.width) / browserFrame.width) + : (1 - browserFrame.x / root.width)) + } + + MouseArea { + anchors { + right: root.edge == Qt.LeftEdge ? undefined : parent.right + left: root.edge == Qt.LeftEdge ? parent.left : undefined + top: parent.top + bottom: parent.bottom + } + z: 99 + width: Units.smallSpacing + onPressed: mouseEventListener.managePressed(mouse) + onPositionChanged: mouseEventListener.positionChanged(mouse) + onReleased: mouseEventListener.released(mouse) + } + MouseArea { + id: mouseEventListener + anchors.fill: parent + drag.filterChildren: true + property int startBrowserFrameX + property int startMouseX + property real oldMouseX + property bool startDragging: false + property string startState + enabled: browserFrame.state != "Closed" + + onPressed: managePressed(mouse) + function managePressed(mouse) { + if (drawerPage.children.length == 0) { + mouse.accepted = false; + return; + } + + mouse.accepted = true; + startBrowserFrameX = browserFrame.x; + oldMouseX = startMouseX = mouse.x; + startDragging = false; + startState = browserFrame.state; + browserFrame.state = "Dragging"; + browserFrame.x = startBrowserFrameX; + } + + onPositionChanged: { + if (drawerPage.children.length == 0) { + mouse.accepted = false; + return; + } + + if (mouse.x < Units.gridUnit || + Math.abs(mouse.x - startMouseX) > root.width / 5) { + startDragging = true; + } + if (startDragging) { + browserFrame.x = root.edge == Qt.LeftEdge + ? Math.min(0, browserFrame.x + mouse.x - oldMouseX) + : Math.max(root.width - browserFrame.width, browserFrame.x + mouse.x - oldMouseX); + } + oldMouseX = mouse.x; + } + + onReleased: { + if (drawerPage.children.length == 0) { + mouse.accepted = false; + return; + } + + if (root.edge == Qt.LeftEdge) { + if (mouse.x < Units.gridUnit) { + browserFrame.state = "Closed"; + } else if (browserFrame.x - startBrowserFrameX > browserFrame.width / 3) { + browserFrame.state = "Open"; + } else if (startBrowserFrameX - browserFrame.x > browserFrame.width / 3) { + browserFrame.state = "Closed"; + } else { + browserFrame.state = startState + } + + } else { + if (mouse.x > width - Units.gridUnit) { + browserFrame.state = "Closed"; + } else if (browserFrame.x - startBrowserFrameX > browserFrame.width / 3) { + browserFrame.state = "Closed"; + } else if (startBrowserFrameX - browserFrame.x > browserFrame.width / 3) { + browserFrame.state = "Open"; + } else { + browserFrame.state = startState; + } + } + } + onCanceled: { + if (oldMouseX > width - Units.gridUnit) { + browserFrame.state = "Closed"; + } else if (Math.abs(browserFrame.x - startBrowserFrameX) > browserFrame.width / 3) { + browserFrame.state = startState == "Open" ? "Closed" : "Open"; + } else { + browserFrame.state = "Open"; + } + } + onClicked: { + if (Math.abs(startMouseX - mouse.x) > Units.gridUnit) { + return; + } + if ((root.edge == Qt.LeftEdge && mouse.x > browserFrame.width) || + (root.edge != Qt.LeftEdge && mouse.x < browserFrame.x)) { + browserFrame.state = startState == "Open" ? "Closed" : "Open"; + root.clicked(); + } + } + Rectangle { + id: browserFrame + z: 100 + color: Theme.viewBackgroundColor + anchors { + top: parent.top + bottom: parent.bottom + } + + width: { + if (drawerPage.children.length > 0 && drawerPage.children[0].implicitWidth > 0) { + return Math.min( parent.width - Units.gridUnit, drawerPage.children[0].implicitWidth) + } else { + return parent.width - Units.gridUnit * 3 + } + } + + onXChanged: { + root.position = root.edge == Qt.LeftEdge ? 1 + browserFrame.x/browserFrame.width : (root.width - browserFrame.x)/browserFrame.width; + } + + state: "Closed" + onStateChanged: open = (state != "Closed") + property bool open: false + onOpenChanged: { + if (drawerPage.children.length == 0) { + return; + } + + if (open) { + browserFrame.state = "Open"; + } else { + browserFrame.state = "Closed"; + } + } + + LinearGradient { + width: Units.gridUnit/2 + anchors { + right: root.edge == Qt.LeftEdge ? undefined : parent.left + left: root.edge == Qt.LeftEdge ? parent.right : undefined + top: parent.top + bottom: parent.bottom + } + opacity: root.position == 0 ? 0 : 1 + start: Qt.point(0, 0) + end: Qt.point(Units.gridUnit/2, 0) + gradient: Gradient { + GradientStop { + position: 0.0 + color: root.edge == Qt.LeftEdge ? Qt.rgba(0, 0, 0, 0.3) : "transparent" + } + GradientStop { + position: root.edge == Qt.LeftEdge ? 0.3 : 0.7 + color: Qt.rgba(0, 0, 0, 0.15) + } + GradientStop { + position: 1.0 + color: root.edge == Qt.LeftEdge ? "transparent" : Qt.rgba(0, 0, 0, 0.3) + } + } + Behavior on opacity { + NumberAnimation { + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + } + + + MouseArea { + id: drawerPage + anchors { + fill: parent + //leftMargin: Units.gridUnit + } + clip: true + onChildrenChanged: drawerPage.children[0].anchors.fill = drawerPage + } + + states: [ + State { + name: "Open" + PropertyChanges { + target: browserFrame + x: root.edge == Qt.LeftEdge ? 0 : root.width - browserFrame.width + } + }, + State { + name: "Dragging" + //workaround for a quirkiness of the state machine + //if no x binding gets defined in this state x will be set to whatever last x it had last time it was in this state + PropertyChanges { + target: browserFrame + x: mouseEventListener.startBrowserFrameX + } + }, + State { + name: "Closed" + PropertyChanges { + target: browserFrame + x: root.edge == Qt.LeftEdge ? -browserFrame.width : root.width + } + } + ] + + transitions: [ + Transition { + //Exclude Dragging + to: "Open,Closed" + NumberAnimation { + id: transitionAnim + properties: "x" + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + ] + } + } +} + diff --git a/qt-mobile/qml/mobilecomponents/Page.qml b/qt-mobile/qml/mobilecomponents/Page.qml new file mode 100644 index 000000000..53cb04e2a --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Page.qml @@ -0,0 +1,71 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.3 +import org.kde.plasma.mobilecomponents 0.2 +import "private" + +Rectangle { + id: root + + /** + * type:PageStack + * The page stack that this page is owned by. + */ + property Item pageStack + + /** + * Defines the toolbar contents for the page. If the page stack is set up + * using a toolbar instance, it automatically shows the currently active + * page's toolbar contents in the toolbar. + * + * The default value is null resulting in the page's toolbar to be + * invisible when the page is active. + */ + property Item tools: null + + /** + * Defines the contextual actions for the page: + * an easy way to assign actions in the right sliding panel + */ + property alias contextualActions: internalContextualActions.data + + property Flickable flickable + Item { + id: internalContextualActions + } + + Layout.fillWidth: true + color: "transparent" + + Connections { + target: flickable + property real oldContentY: flickable.contentY + onContentYChanged: { + print(flickable.contentY+" "+actionButton.transform[0] ) + if (flickable.atYBeginning || flickable.atYEnd) { + return; + } + actionButton.transform[0].y = Math.min(actionButton.height, Math.max(0, actionButton.transform[0].y + (flickable.contentY - oldContentY))); + + oldContentY = flickable.contentY; + } + } +} diff --git a/qt-mobile/qml/mobilecomponents/PageRow.qml b/qt-mobile/qml/mobilecomponents/PageRow.qml new file mode 100644 index 000000000..941f77f73 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/PageRow.qml @@ -0,0 +1,496 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Marco Martin +** +** 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.0 +import QtQuick.Controls 1.0 +import QtQuick.Layouts 1.2 +import org.kde.plasma.mobilecomponents 0.2 + +import "private/PageStack.js" as Engine + +Item { + id: actualRoot + + width: parent ? parent.width : 0 + height: parent ? parent.height : 0 + + + property int depth: Engine.getDepth() + property Item currentPage: null + property Item lastVisiblePage + property ToolBar toolBar + property variant initialPage + //A column is wide enough for 30 characters + property int columnWidth: Math.round(parent.width/(Units.gridUnit*30)) > 0 ? parent.width/Math.round(parent.width/(Units.gridUnit*30)) : width + property alias clip: scrollArea.clip + + // Indicates whether there is an ongoing page transition. + property bool busy: internal.ongoingTransitionCount > 0 + + // Pushes a page on the stack. + // The page can be defined as a component, item or string. + // If an item is used then the page will get re-parented. + // If a string is used then it is interpreted as a url that is used to load a page component. + // + // The page can also be given as an array of pages. In this case all those pages will be pushed + // onto the stack. The items in the stack can be components, items or strings just like for single + // pages. Additionally an object can be used, which specifies a page and an optional properties + // property. This can be used to push multiple pages while still giving each of them properties. + // When an array is used the transition animation will only be to the last page. + // + // The properties argument is optional and allows defining a map of properties to set on the page. + // If the immediate argument is true then no transition animation is performed. + // Returns the page instance. + function push(page, properties, immediate) + { + var item = Engine.push(page, properties, false, immediate) + scrollToLevel(depth) + return item + } + + // Pops a page off the stack. + // If page is specified then the stack is unwound to that page, to unwind to the first page specify + // page as null. If the immediate argument is true then no transition animation is performed. + // Returns the page instance that was popped off the stack. + function pop(page, immediate) + { + return Engine.pop(page, immediate); + } + + // Replaces a page on the stack. + // See push() for details. + function replace(page, properties, immediate) + { + var item = Engine.push(page, properties, true, immediate); + scrollToLevel(depth) + return item + } + + // Clears the page stack. + function clear() + { + return Engine.clear(); + } + + // Iterates through all pages (top to bottom) and invokes the specified function. + // If the specified function returns true the search stops and the find function + // returns the page that the iteration stopped at. If the search doesn't result + // in any page being found then null is returned. + function find(func) + { + return Engine.find(func); + } + + // Scroll the view to have the page of the given level as first item + function scrollToLevel(level) + { + if (level < 0 || level > depth || root.width < width) { + return + } + + var firstLevel = Math.max(0, level - mainFlickable.width/columnWidth + 1); + scrollAnimation.to = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth+1000)) + scrollAnimation.running = true + } + + SequentialAnimation { + id: scrollAnimation + property alias to: actualScrollAnimation.to + NumberAnimation { + id: actualScrollAnimation + target: mainFlickable + properties: "contentX" + duration: internal.transitionDuration + easing.type: Easing.InOutQuad + } + ScriptAction { + script: { + actualRoot.lastVisiblePage = root.children[Math.floor((mainFlickable.contentX + mainFlickable.width - 1)/columnWidth)].page + } + } + } + + // Called when the page stack visibility changes. + onVisibleChanged: { + if (currentPage) { + if (visible) + currentPage.visible = currentPage.parent.visible = true; + } + } + + onInitialPageChanged: { + if (!internal.completed) { + return + } + + if (initialPage) { + if (depth == 0) { + push(initialPage, null, true) + } else if (depth == 1) { + replace(initialPage, null, true) + } else { + console.log("Cannot update PageStack.initialPage") + } + } + } + + Component.onCompleted: { + internal.completed = true + if (initialPage && depth == 0) + push(initialPage, null, true) + } + + QtObject { + id: internal + + // The number of ongoing transitions. + property int ongoingTransitionCount: 0 + + //FIXME: there should be a way to access to theh without storing it in an ugly way + property bool completed: false + + // Duration of transition animation (in ms) + property int transitionDuration: Units.longDuration + } + + ScrollView { + id: scrollArea + anchors.fill: parent + Flickable { + id: mainFlickable + anchors.fill: parent + interactive: root.width > width + boundsBehavior: Flickable.StopAtBounds + contentWidth: root.width + contentHeight: height + Row { + id: root + spacing: -100 + width: Math.max((depth-1+children[children.length-1].takenColumns) * columnWidth, childrenRect.width - 100) + + height: parent.height + Behavior on width { + NumberAnimation { + duration: internal.transitionDuration + easing.type: Easing.InOutQuad + } + } + } + onMovementEnded: { + scrollToLevel(Math.round(contentX/columnWidth)+1) + } + onFlickEnded: { + movementEnded(); + } + } + } + + // Component for page containers. + Component { + id: containerComponent + + Item { + id: container + + implicitWidth: actualContainer.width + 100 + width: implicitWidth + height: parent ? parent.height : 0 + + x: 0 + + // The actual parent of page: page will anchor to that + property Item pageParent: actualContainer + + property int pageDepth: 0 + Component.onCompleted: { + pageDepth = Engine.getDepth() + 1 + container.z = -Engine.getDepth() + } + + // The states correspond to the different possible positions of the container. + state: "Hidden" + + // The page held by this container. + property Item page: null + + // The owner of the page. + property Item owner: null + + // The width of the longer stack dimension + property int stackWidth: Math.max(actualRoot.width, actualRoot.height) + + + // Flag that indicates the container should be cleaned up after the transition has ended. + property bool cleanupAfterTransition: false + + // Flag that indicates if page transition animation is running + property bool transitionAnimationRunning: false + + // State to be set after previous state change animation has finished + property string pendingState: "none" + + //how many columns take the page? + property alias takenColumns: actualContainer.takenColumns + + // Ensures that transition finish actions are executed + // in case the object is destroyed before reaching the + // end state of an ongoing transition + Component.onDestruction: { + if (transitionAnimationRunning) + transitionEnded(); + } + + Item { + id: actualContainer + + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + rightMargin: 100 + } + + property int takenColumns: { + if (container.page && container.page.Layout && container.page.Layout.fillWidth) { + return Math.max(1, Math.round(actualRoot.width/columnWidth)-(container.x > 0 ? 1: 0)); + } else { + return Math.max(1, Math.round(container.page ? container.page.implicitWidth/columnWidth : 1)); + } + } + + width: (container.pageDepth >= actualRoot.depth ? Math.min(actualRoot.width, takenColumns*columnWidth) : columnWidth) + } + + Rectangle { + anchors { + top: parent.top + bottom: parent.bottom + right: actualContainer.right + } + width: 1 + color: Theme.textColor + opacity: 0.3 + visible: container.pageDepth < actualRoot.depth + } + + // Sets pending state as current if state change is delayed + onTransitionAnimationRunningChanged: { + if (!transitionAnimationRunning && pendingState != "none") { + state = pendingState; + pendingState = "none"; + } + } + + // Handles state change depening on transition animation status + function setState(newState) + { + if (transitionAnimationRunning) + pendingState = newState; + else + state = newState; + } + + // Performs a push enter transition. + function pushEnter(immediate, orientationChanges) + { + if (!immediate) { + setState("Right"); + } + setState(""); + page.visible = true; + } + + // Performs a push exit transition. + function pushExit(replace, immediate, orientationChanges) + { + if (replace) { + setState(immediate ? "Hidden" : "Left"); + } + + if (replace) { + if (immediate) + cleanup(); + else + cleanupAfterTransition = true; + } + } + + // Performs a pop enter transition. + function popEnter(immediate, orientationChanges) + { + setState(""); + page.visible = true; + } + + // Performs a pop exit transition. + function popExit(immediate, orientationChanges) + { + setState(immediate ? "Hidden" : "Left"); + + if (immediate) + cleanup(); + else + cleanupAfterTransition = true; + } + + // Called when a transition has started. + function transitionStarted() + { + container.clip = true + transitionAnimationRunning = true; + internal.ongoingTransitionCount++; + } + + // Called when a transition has ended. + function transitionEnded() + { + container.clip = false + if (state != "") + state = "Hidden"; + + internal.ongoingTransitionCount--; + transitionAnimationRunning = false; + + if (cleanupAfterTransition) { + cleanup(); + } + } + + states: [ + // Explicit properties for default state. + State { + name: "" + PropertyChanges { target: container; visible: true; opacity: 1 } + PropertyChanges { target: container; width: container.implicitWidth} + }, + // Start state for pop entry, end state for push exit. + State { + name: "Left" + PropertyChanges { target: container; opacity: 0 } + PropertyChanges { target: container; width: 100} + }, + // Start state for push entry, end state for pop exit. + State { + name: "Right" + PropertyChanges { target: container; opacity: 0 } + PropertyChanges { target: container; width: 100} + }, + // Inactive state. + State { + name: "Hidden" + PropertyChanges { target: container; visible: false } + PropertyChanges { target: container; width: container.implicitWidth} + } + ] + + transitions: [ + // Push exit transition + Transition { + from: ""; to: "Left" + SequentialAnimation { + ScriptAction { script: transitionStarted() } + ParallelAnimation { + PropertyAnimation { properties: "width"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + } + ScriptAction { script: transitionEnded() } + } + }, + // Pop entry transition + Transition { + from: "Left"; to: "" + SequentialAnimation { + ScriptAction { script: transitionStarted() } + ParallelAnimation { + PropertyAnimation { properties: "width"; easing.type: Easing.OutQuad; duration: internal.transitionDuration } + PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + } + ScriptAction { script: transitionEnded() } + } + }, + // Pop exit transition + Transition { + from: ""; to: "Right" + SequentialAnimation { + ScriptAction { script: transitionStarted() } + ParallelAnimation { + PropertyAnimation { properties: "width"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + } + // Workaround for transition animation bug causing ghost view with page pop transition animation + // TODO: Root cause still unknown + PropertyAnimation {} + ScriptAction { script: transitionEnded() } + } + }, + // Push entry transition + Transition { + from: "Right"; to: "" + SequentialAnimation { + ScriptAction { script: transitionStarted() } + ParallelAnimation { + PropertyAnimation { properties: "width"; easing.type: Easing.OutQuad; duration: internal.transitionDuration } + PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration } + } + ScriptAction { script: transitionEnded() } + } + } + ] + + // Cleans up the container and then destroys it. + function cleanup() + { + if (page != null) { + if (owner != container) { + // container is not the owner of the page - re-parent back to original owner + page.visible = false; + page.anchors.fill = undefined + page.parent = owner; + } + } + container.parent = null; + container.visible = false; + destroy(); + } + } + } +} diff --git a/qt-mobile/qml/mobilecomponents/SplitDrawer.qml b/qt-mobile/qml/mobilecomponents/SplitDrawer.qml new file mode 100644 index 000000000..813eae10c --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/SplitDrawer.qml @@ -0,0 +1,234 @@ +/* + * Copyright 2012 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 +import "private" + +/**Documented API +Inherits: + Item + +Imports: + QtQuick 2.1 + +Description: + Split Drawers are used to expose additional UI elements which are optional and can be used in conjunction with the main UI elements. For example the Resource Browser uses a Split Drawer to select different kinds of filters for the main view. + +Properties: + bool open: + If true the drawer is open showing the contents of the "drawer" component. + + Item page: + It's the default property. it's the main content of the drawer page, the part that is always shown + + Item drawer: + It's the part that can be pulled in and out, will act as a sidebar. + + int visibleDrawerWidth: the width of the visible portion of the drawer: it updates while dragging or animating +**/ +AbstractDrawer { + id: root + anchors { + fill: parent + } + visible: true + + default property alias page: mainPage.data + property Item contentItem + property alias opened: sidebar.open + property int visibleDrawerWidth: browserFrame.x + + Component.onCompleted: { + mainPage.width = browserFrame.width + } + + onContentItemChanged: contentItem.parent = drawerPage + MouseArea { + id: mouseEventListener + z: 200 + drag.filterChildren: true + //drag.target: browserFrame + property int startMouseX + property int oldMouseX + property int startBrowserFrameX + property bool toggle: false + property string startState + + anchors.fill: parent + + onPressed: { + if (drawerPage.children.length == 0 || (browserFrame.state == "Closed" && mouse.x > Units.gridUnit) || + mouse.x < browserFrame.x) { + mouse.accepted = false; + return; + } + + toggle = true; + startBrowserFrameX = browserFrame.x; + oldMouseX = startMouseX = mouse.x; + startState = browserFrame.state; + browserFrame.state = "Dragging"; + browserFrame.x = startBrowserFrameX; + } + + onPositionChanged: { + browserFrame.x = Math.max(0, browserFrame.x + mouse.x - oldMouseX); + oldMouseX = mouse.x; + if (Math.abs(mouse.x - startMouseX) > Units.gridUnit * 2) { + toggle = false; + } + } + + onReleased: { + if (toggle) { + browserFrame.state = startState == "Open" ? "Closed" : "Open" + } else if (browserFrame.x < sidebar.width / 2) { + browserFrame.state = "Closed"; + } else { + browserFrame.state = "Open"; + } + } + onClicked: root.clicked() + } + + Rectangle { + id: browserFrame + z: 100 + color: Theme.backgroundColor + state: "Closed" + onStateChanged: sidebar.open = (state != "Closed") + + anchors { + top: parent.top + bottom: parent.bottom + } + width: root.width; + + Item { + id: mainPage + onChildrenChanged: mainPage.children[0].anchors.fill = mainPage + + anchors.fill: parent + } + + Rectangle { + anchors.fill: parent + color: "black" + opacity: Math.min(0.4, 0.4 * (browserFrame.x / sidebar.width)) + } + LinearGradient { + width: Units.gridUnit/2 + anchors { + right: parent.left + top: parent.top + bottom: parent.bottom + rightMargin: -1 + } + start: Qt.point(0, 0) + end: Qt.point(Units.gridUnit/2, 0) + gradient: Gradient { + GradientStop { + position: 0.0 + color: "transparent" + } + GradientStop { + position: 0.7 + color: Qt.rgba(0, 0, 0, 0.15) + } + GradientStop { + position: 1.0 + color: Qt.rgba(0, 0, 0, 0.3) + } + } + } + + states: [ + State { + name: "Open" + PropertyChanges { + target: browserFrame + x: sidebar.width + } + + }, + State { + name: "Dragging" + PropertyChanges { + target: browserFrame + x: mouseEventListener.startBrowserFrameX + } + }, + State { + name: "Closed" + PropertyChanges { + target: browserFrame + x: 0 + } + } + ] + + transitions: [ + Transition { + //Exclude Dragging + to: "Open,Closed,Hidden" + NumberAnimation { + properties: "x" + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + ] + } + + + Item { + id: sidebar + + property bool open: false + onOpenChanged: { + if (drawerPage.children.length == 0) { + return; + } + + if (open) { + browserFrame.state = "Open"; + } else { + browserFrame.state = "Closed"; + } + } + + width: Math.min(parent.width/4*3, Math.max(root.contentItem ? root.contentItem.implicitWidth : 0, parent.width/4)) + + anchors { + left: parent.left + top: parent.top + bottom: parent.bottom + } + + Item { + id: drawerPage + anchors.fill: parent + clip: false + onChildrenChanged: drawerPage.children[0].anchors.fill = drawerPage + } + } +} + diff --git a/qt-mobile/qml/mobilecomponents/Theme.qml b/qt-mobile/qml/mobilecomponents/Theme.qml new file mode 100644 index 000000000..07bb561bd --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Theme.qml @@ -0,0 +1,62 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.4 + +pragma Singleton + +/*! + \qmltype Theme + \inqmlmodule Material 0.1 + + \brief Provides access to standard colors that follow the Material Design specification. + + See \l {http://www.google.com/design/spec/style/color.html#color-ui-color-application} for + details about choosing a color scheme for your application. + */ +QtObject { + id: theme + + property color textColor: Qt.rgba(0,0,0, 0.54) + + property color highlightColor: "#2196F3" + property color backgroundColor: "#f3f3f3" + property color linkColor: "#2196F3" + property color visitedLinkColor: "#2196F3" + + property color buttonTextColor: Qt.rgba(0,0,0, 0.54) + property color buttonBackgroundColor: "#f3f3f3" + property color buttonHoverColor: "#2196F3" + property color buttonFocusColor: "#2196F3" + + property color viewTextColor: Qt.rgba(0,0,0, 0.54) + property color viewBackgroundColor: "#f3f3f3" + property color viewHoverColor: "#2196F3" + property color viewFocusColor: "#2196F3" + + property color complementaryTextColor: "#f3f3f3" + property color complementaryBackgroundColor: Qt.rgba(0,0,0, 0.54) + property color complementaryHoverColor: "#2196F3" + property color complementaryFocusColor: "#2196F3" + + property font defaultFont: fontMetrics.font + + property variant fontMetrics: TextMetrics {} + +} diff --git a/qt-mobile/qml/mobilecomponents/Units.qml b/qt-mobile/qml/mobilecomponents/Units.qml new file mode 100644 index 000000000..971336301 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/Units.qml @@ -0,0 +1,101 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.4 +import QtQuick.Window 2.2 + +pragma Singleton + + +QtObject { + id: units + + /** + * The fundamental unit of space that should be used for sizes, expressed in pixels. + * Given the screen has an accurate DPI settings, it corresponds to a width of + * the capital letter M + */ + property int gridUnit: fontMetrics.height + + /** + * units.iconSizes provides access to platform-dependent icon sizing + * + * The icon sizes provided are normalized for different DPI, so icons + * will scale depending on the DPI. + * + * Icon sizes from KIconLoader, adjusted to devicePixelRatio: + * * small + * * smallMedium + * * medium + * * large + * * huge + * * enormous + * + * Not devicePixelRation-adjusted:: + * * desktop + */ + property QtObject iconSizes: QtObject { + property int small: 16 * devicePixelRatio + property int smallMedium: 22 * devicePixelRatio + property int medium: 32 * devicePixelRatio + property int large: 48 * devicePixelRatio + property int huge: 64 * devicePixelRatio + property int enormous: 128 * devicePixelRatio + } + + /** + * units.smallSpacing is the amount of spacing that should be used around smaller UI elements, + * for example as spacing in Columns. Internally, this size depends on the size of + * the default font as rendered on the screen, so it takes user-configured font size and DPI + * into account. + */ + property int smallSpacing: gridUnit/4 + + /** + * units.largeSpacing is the amount of spacing that should be used inside bigger UI elements, + * for example between an icon and the corresponding text. Internally, this size depends on + * the size of the default font as rendered on the screen, so it takes user-configured font + * size and DPI into account. + */ + property int largeSpacing: gridUnit + + /** + * The ratio between physical and device-independent pixels. This value does not depend on the \ + * size of the configured font. If you want to take font sizes into account when scaling elements, + * use theme.mSize(theme.defaultFont), units.smallSpacing and units.largeSpacing. + * The devicePixelRatio follows the definition of "device independent pixel" by Microsoft. + */ + property real devicePixelRatio: Screen.devicePixelRatio + + /** + * units.longDuration should be used for longer, screen-covering animations, for opening and + * closing of dialogs and other "not too small" animations + */ + property int longDuration: 250 + + /** + * units.shortDuration should be used for short animations, such as accentuating a UI event, + * hover events, etc.. + */ + property int shortDuration: 150 + + property variant fontMetrics: TextMetrics { + text: "M" + } +} diff --git a/qt-mobile/qml/mobilecomponents/icons/go-next.svg b/qt-mobile/qml/mobilecomponents/icons/go-next.svg new file mode 100644 index 000000000..f2828f18f --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/icons/go-next.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/qt-mobile/qml/mobilecomponents/icons/go-previous.svg b/qt-mobile/qml/mobilecomponents/icons/go-previous.svg new file mode 100644 index 000000000..7cfd42891 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/icons/go-previous.svg @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/qt-mobile/qml/mobilecomponents/private/AbstractDrawer.qml b/qt-mobile/qml/mobilecomponents/private/AbstractDrawer.qml new file mode 100644 index 000000000..db662509c --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/private/AbstractDrawer.qml @@ -0,0 +1,47 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 + +//TODO: This will become a QQC2 Drawer +//providing just a dummy api for now +Item { + id: root + anchors.fill: parent + z: 9999 + + default property alias page: mainPage.data + property Item contentItem + property bool opened + property int edge: Qt.LeftEdge + property real position: 0 + + function open () { } + function close () { } + signal clicked + + Item { + id: mainPage + anchors.fill: parent + onChildrenChanged: mainPage.children[0].anchors.fill = mainPage + } +} + diff --git a/qt-mobile/qml/mobilecomponents/private/ActionButton.qml b/qt-mobile/qml/mobilecomponents/private/ActionButton.qml new file mode 100644 index 000000000..5bf6ab086 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/private/ActionButton.qml @@ -0,0 +1,142 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.2 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 + +MouseArea { + id: button + property alias iconSource: icon.source + Layout.minimumWidth: Units.iconSizes.large + Layout.maximumWidth: Layout.minimumWidth + implicitWidth: Units.iconSizes.large + implicitHeight: width + drag { + target: button + axis: Drag.XAxis + minimumX: contextDrawer ? 0 : parent.width/2 - width/2 + maximumX: globalDrawer ? parent.width : parent.width/2 - width/2 + } + + transform: Translate {} + onReleased: { + if (globalDrawer && x > Math.min(parent.width/4*3, parent.width/2 + globalDrawer.contentItem.width/2)) { + globalDrawer.open(); + contextDrawer.close(); + } else if (contextDrawer && x < Math.max(parent.width/4, parent.width/2 - contextDrawer.contentItem.width/2)) { + if (contextDrawer) { + contextDrawer.open(); + } + if (globalDrawer) { + globalDrawer.close(); + } + } else { + if (globalDrawer) { + globalDrawer.close(); + } + if (contextDrawer) { + contextDrawer.close(); + } + } + } + Connections { + target: globalDrawer + onPositionChanged: { + if (!button.pressed) { + button.x = globalDrawer.contentItem.width * globalDrawer.position + button.parent.width/2 - button.width/2; + } + } + } + Connections { + target: contextDrawer + onPositionChanged: { + if (!button.pressed) { + button.x = button.parent.width/2 - button.width/2 - contextDrawer.contentItem.width * contextDrawer.position; + } + } + } + onXChanged: { + if (button.pressed) { + globalDrawer.position = Math.min(1, Math.max(0, (x - button.parent.width/2 + button.width/2)/globalDrawer.contentItem.width)); + contextDrawer.position = Math.min(1, Math.max(0, (button.parent.width/2 - button.width/2 - x)/contextDrawer.contentItem.width)); + } + } + + Item { + id: background + anchors { + fill: parent + leftMargin: -Units.gridUnit + rightMargin: -Units.gridUnit + } + Rectangle { + radius: width/2 + anchors.centerIn: parent + height: parent.height - Units.smallSpacing*2 + width: height + color: button.pressed ? Theme.highlightColor : Theme.backgroundColor + Icon { + id: icon + anchors { + fill: parent + margins: Units.smallSpacing + } + } + ActionButtonArrow { + anchors { + right: parent.left + rightMargin: Units.smallSpacing + } + visible: contextDrawer && contextDrawer.enabled + inverted: true + } + ActionButtonArrow { + anchors { + left: parent.right + leftMargin: Units.smallSpacing + } + visible: globalDrawer && globalDrawer.enabled + } + Behavior on color { + ColorAnimation { + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + Behavior on x { + NumberAnimation { + duration: Units.longDuration + easing.type: Easing.InOutQuad + } + } + } + } + DropShadow { + anchors.fill: background + horizontalOffset: 0 + verticalOffset: Units.smallSpacing/2 + radius: Units.gridUnit / 2.4 + samples: 16 + color: button.pressed ? "transparent" : Qt.rgba(0, 0, 0, 0.5) + source: background + } +} + diff --git a/qt-mobile/qml/mobilecomponents/private/ActionButtonArrow.qml b/qt-mobile/qml/mobilecomponents/private/ActionButtonArrow.qml new file mode 100644 index 000000000..7b585452b --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/private/ActionButtonArrow.qml @@ -0,0 +1,56 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.2 +import QtGraphicalEffects 1.0 +import org.kde.plasma.mobilecomponents 0.2 + +Canvas { + id: canvas + width: Units.gridUnit + height: width + property bool inverted + property color color: parent.color + anchors.verticalCenter: parent.verticalCenter + + onColorChanged: requestPaint() + + onPaint: { + var ctx = canvas.getContext("2d"); + ctx.fillStyle = canvas.color; + ctx.beginPath(); + if (inverted) { + ctx.moveTo(canvas.width, 0); + ctx.bezierCurveTo(canvas.width-canvas.width/8, 0, + canvas.width-canvas.width/8, canvas.height, + canvas.width, canvas.height); + ctx.lineTo(0, canvas.height/2); + } else { + ctx.moveTo(0, 0); + ctx.bezierCurveTo(canvas.width/8, 0, + canvas.width/8, canvas.height, + 0, canvas.height); + ctx.lineTo(canvas.width, canvas.height/2); + //ctx.lineTo(0, canvas.height); + } + ctx.fill(); + } +} + diff --git a/qt-mobile/qml/mobilecomponents/private/PageStack.js b/qt-mobile/qml/mobilecomponents/private/PageStack.js new file mode 100644 index 000000000..8986956b0 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/private/PageStack.js @@ -0,0 +1,243 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// Page stack. Items are page containers. +var pageStack = []; + +// Page component cache map. Key is page url, value is page component. +var componentCache = {}; + +// Returns the page stack depth. +function getDepth() { + return pageStack.length; +} + +// Pushes a page on the stack. +function push(page, properties, replace, immediate) { + // page order sanity check + if ((!replace && page == currentPage) + || (replace && pageStack.length > 1 + && page == pageStack[pageStack.length - 2].page)) { + throw new Error("Cannot navigate so that the resulting page stack has two consecutive entries of the same page instance."); + } + + // figure out if more than one page is being pushed + var pages; + if (page instanceof Array) { + pages = page; + page = pages.pop(); + if (page.createObject === undefined && page.parent === undefined && typeof page != "string") { + properties = properties || page.properties; + page = page.page; + } + } + + // get the current container + var oldContainer; + if (pageStack.length) { + oldContainer = pageStack[pageStack.length - 1]; + } + + // pop the old container off the stack if this is a replace + if (oldContainer && replace) { + pageStack.pop(); + } + + // push any extra defined pages onto the stack + if (pages) { + var i; + for (i = 0; i < pages.length; i++) { + var tPage = pages[i]; + var tProps; + if (tPage.createObject === undefined && tPage.parent === undefined && typeof tPage != "string") { + tProps = tPage.properties; + tPage = tPage.page; + } + pageStack.push(initPage(tPage, tProps)); + } + } + + // initialize the page + var container = initPage(page, properties); + + // push the page container onto the stack + pageStack.push(container); + + depth = pageStack.length; + currentPage = container.page; + + // perform page transition + //FIXME: this should be in for PageStack, out for PageRow? + //immediate = immediate || !oldContainer; + var orientationChange = false; + if (oldContainer) { + orientationChange = orientationChanges(oldContainer.page, container.page); + oldContainer.pushExit(replace, immediate, orientationChange); + } + + // sync tool bar + var tools = container.page.tools || null; + if (toolBar) { + toolBar.setTools(tools, immediate ? "set" : replace ? "replace" : "push"); + } + + container.pushEnter(immediate, orientationChange); + return container.page; +} + +// Initializes a page and its container. +function initPage(page, properties) { + var container = containerComponent.createObject(root); + + var pageComp; + if (page.createObject) { + // page defined as component + pageComp = page; + } else if (typeof page == "string") { + // page defined as string (a url) + pageComp = componentCache[page]; + if (!pageComp) { + pageComp = componentCache[page] = Qt.createComponent(page); + } + } + if (pageComp) { + if (pageComp.status == Component.Error) { + throw new Error("Error while loading page: " + pageComp.errorString()); + } else { + // instantiate page from component + page = pageComp.createObject(container.pageParent, properties || {}); + } + } else { + // copy properties to the page + for (var prop in properties) { + if (properties.hasOwnProperty(prop)) { + page[prop] = properties[prop]; + } + } + } + + container.page = page; + if (page.parent == null || page.parent == container.pageParent) { + container.owner = container; + } else { + container.owner = page.parent; + } + + // the page has to be reparented if + if (page.parent != container.pageParent) { + page.parent = container.pageParent; + } + + if (page.pageStack !== undefined) { + page.pageStack = root; + } + + page.anchors.fill = container.pageParent + + return container; +} + +// Pops a page off the stack. +function pop(page, immediate) { + // make sure there are enough pages in the stack to pop + if (pageStack.length > 1) { + //unwind to itself means no pop + if (page !== undefined && page == pageStack[pageStack.length - 1].page) { + return + } + // pop the current container off the stack and get the next container + var oldContainer = pageStack.pop(); + var container = pageStack[pageStack.length - 1]; + if (page !== undefined) { + // an unwind target has been specified - pop until we find it + while (page != container.page && pageStack.length > 1) { + pageStack.pop(); + container.popExit(immediate, false); + container = pageStack[pageStack.length - 1]; + } + } + + depth = pageStack.length; + currentPage = container.page; + + // perform page transition + var orientationChange = orientationChanges(oldContainer.page, container.page); + oldContainer.popExit(immediate, orientationChange); + container.popEnter(immediate, orientationChange); + + // sync tool bar + var tools = container.page.tools || null; + if (toolBar) { + toolBar.setTools(tools, immediate ? "set" : "pop"); + } + return oldContainer.page; + } else { + return null; + } +} + +// Checks if the orientation changes between oldPage and newPage +function orientationChanges(oldPage, newPage) { + return newPage.orientationLock != 0 //PlasmaComponents.PageOrientation.Automatic + && newPage.orientationLock != 3//PlasmaComponents.PageOrientation.LockPrevious + && newPage.orientationLock != oldPage.orientationLock +} + +// Clears the page stack. +function clear() { + var container; + while (container = pageStack.pop()) { + container.cleanup(); + } + depth = 0; + currentPage = null; +} + +// Iterates through all pages in the stack (top to bottom) to find a page. +function find(func) { + for (var i = pageStack.length - 1; i >= 0; i--) { + var page = pageStack[i].page; + if (func(page)) { + return page; + } + } + return null; +} + diff --git a/qt-mobile/qml/mobilecomponents/private/qmldir b/qt-mobile/qml/mobilecomponents/private/qmldir new file mode 100644 index 000000000..35e158210 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/private/qmldir @@ -0,0 +1,3 @@ +module org.kde.plasma.mobilecomponents.private +#plugin mobilecomponentsprivateplugin + diff --git a/qt-mobile/qml/mobilecomponents/qmldir b/qt-mobile/qml/mobilecomponents/qmldir new file mode 100644 index 000000000..53daf98a2 --- /dev/null +++ b/qt-mobile/qml/mobilecomponents/qmldir @@ -0,0 +1,19 @@ +module org.kde.plasma.mobilecomponents +#plugin mobilecomponentsplugin + +singleton Units 0.2 Units.qml +singleton Theme 0.2 Theme.qml + +IconGrid 0.2 IconGrid.qml +OverlayDrawer 0.2 OverlayDrawer.qml +SplitDrawer 0.2 SplitDrawer.qml +ActionGroup 0.2 ActionGroup.qml +ApplicationWindow 0.2 ApplicationWindow.qml +ContextDrawer 0.2 ContextDrawer.qml +GlobalDrawer 0.2 GlobalDrawer.qml +Page 0.2 Page.qml +Icon 0.2 Icon.qml +Label 0.2 Label.qml +Heading 0.2 Heading.qml +ListItem 0.2 ListItem.qml +ListItemWithActions 0.2 ListItemWithActions.qml From 4d94441b6db8040b4c0dc6c302d3389a1bafffee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:23:47 +0100 Subject: [PATCH 02/12] Add new files to the qrc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds only the bits from MobileComponent that we already use to the qrc file, including two icons go-next and go-previous (2 simple SVG icons taken from the breeze theme). Signed-off-by: Sebastian Kügler --- qt-mobile/qml/mobile-resources.qrc | 55 +++++++++++++++++++----------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/qt-mobile/qml/mobile-resources.qrc b/qt-mobile/qml/mobile-resources.qrc index 5d2065e22..d6c0825d4 100644 --- a/qt-mobile/qml/mobile-resources.qrc +++ b/qt-mobile/qml/mobile-resources.qrc @@ -1,21 +1,38 @@ - - main.qml - TextButton.qml - Preferences.qml - DiveList.qml - DiveDetails.qml - DownloadFromDiveComputer.qml - Log.qml - TopBar.qml - ThemeTest.qml - StartPage.qml - components/Label.qml - ../../icons/subsurface-mobile-icon.png - - - theme/Theme.qml - theme/qmldir - theme/Units.qml - + + main.qml + TextButton.qml + Preferences.qml + DiveList.qml + DiveDetails.qml + DownloadFromDiveComputer.qml + Log.qml + TopBar.qml + ThemeTest.qml + StartPage.qml + dive.jpg + components/Label.qml + ../../icons/subsurface-mobile-icon.png + + + mobilecomponents/qmldir + mobilecomponents/ActionGroup.qml + mobilecomponents/ApplicationWindow.qml + mobilecomponents/GlobalDrawer.qml + mobilecomponents/Icon.qml + mobilecomponents/Heading.qml + mobilecomponents/PageRow.qml + mobilecomponents/Label.qml + mobilecomponents/ListItem.qml + mobilecomponents/OverlayDrawer.qml + mobilecomponents/Theme.qml + mobilecomponents/Units.qml + mobilecomponents/private/ActionButton.qml + mobilecomponents/private/ActionButtonArrow.qml + mobilecomponents/private/AbstractDrawer.qml + mobilecomponents/private/PageStack.js + mobilecomponents/private/qmldir + mobilecomponents/icons/go-next.svg + mobilecomponents/icons/go-previous.svg + From 2668da3f60d0dc28d1777c1d6cf67e1ee8f88447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:27:20 +0100 Subject: [PATCH 03/12] use mobilecomponents for our pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a dumb port of a number of properties to use the new theme and units API. - import the plugin - change accessors from units and theme to MobileComponents.Unit and MobileComponents.Theme Signed-off-by: Sebastian Kügler --- qt-mobile/qml/CloudStorage.qml | 8 ++++---- qt-mobile/qml/DiveDetails.qml | 7 +++---- qt-mobile/qml/Preferences.qml | 13 +++++++------ qt-mobile/qml/StartPage.qml | 17 +++++++++-------- qt-mobile/qml/TopBar.qml | 29 +++++++++++++++-------------- 5 files changed, 38 insertions(+), 36 deletions(-) diff --git a/qt-mobile/qml/CloudStorage.qml b/qt-mobile/qml/CloudStorage.qml index b199be739..3b94aa5e6 100644 --- a/qt-mobile/qml/CloudStorage.qml +++ b/qt-mobile/qml/CloudStorage.qml @@ -17,12 +17,12 @@ Item { GridLayout { columns: 2 anchors.fill: parent - anchors.margins: units.gridUnit + anchors.margins: MobileComponents.Units.gridUnit Label { text: "Cloud credentials" - Layout.bottomMargin: units.largeSpacing - font.pointSize: units.titlePointSize + Layout.bottomMargin: MobileComponents.Units.largeSpacing + font.pointSize: MobileComponents.Units.titlePointSize Layout.columnSpan: 2 } @@ -72,7 +72,7 @@ Item { id: savePassword } - Item { width: units.gridUnit; height: width } + Item { width: MobileComponents.Units.gridUnit; height: width } Item { height: saveButton.height width: saveButton.width diff --git a/qt-mobile/qml/DiveDetails.qml b/qt-mobile/qml/DiveDetails.qml index 32fa73042..5b597a0df 100644 --- a/qt-mobile/qml/DiveDetails.qml +++ b/qt-mobile/qml/DiveDetails.qml @@ -1,10 +1,9 @@ import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 -import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 -import QtQuick.Window 2.2 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 Item { @@ -45,7 +44,7 @@ Item { Label { Layout.columnSpan: 2 - font.pointSize: units.titlePointSize + font.pointSize: MobileComponents.Units.titlePointSize text: "Dive " + number + " (" + date + ")" } @@ -55,7 +54,7 @@ Item { Layout.preferredHeight: qmlProfile.visible ? qmlProfile.height : profileHideButton.height QMLProfile { id: qmlProfile - height: units.gridUnit * 25 + height: MobileComponents.Units.gridUnit * 25 anchors { top: parent.top left: parent.left diff --git a/qt-mobile/qml/Preferences.qml b/qt-mobile/qml/Preferences.qml index 59861009c..1e1274e21 100644 --- a/qt-mobile/qml/Preferences.qml +++ b/qt-mobile/qml/Preferences.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 1.2 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 Item { @@ -17,12 +18,12 @@ Item { GridLayout { columns: 2 anchors.fill: parent - anchors.margins: units.gridUnit + anchors.margins: MobileComponents.Units.gridUnit Label { text: "Cloud credentials" - Layout.bottomMargin: units.largeSpacing - font.pointSize: units.titlePointSize + Layout.bottomMargin: MobileComponents.Units.largeSpacing + font.pointSize: MobileComponents.Units.titlePointSize Layout.columnSpan: 2 } @@ -74,8 +75,8 @@ Item { Label { text: "Subsurface GPS data webservice" - Layout.bottomMargin: units.largeSpacing - font.pointSize: units.titlePointSize + Layout.bottomMargin: MobileComponents.Units.largeSpacing + font.pointSize: MobileComponents.Units.titlePointSize Layout.columnSpan: 2 } @@ -101,7 +102,7 @@ Item { Layout.fillWidth: true } - Item { width: units.gridUnit; height: width } + Item { width: MobileComponents.Units.gridUnit; height: width } Item { height: saveButton.height width: saveButton.width diff --git a/qt-mobile/qml/StartPage.qml b/qt-mobile/qml/StartPage.qml index 31388f52f..8041a6786 100644 --- a/qt-mobile/qml/StartPage.qml +++ b/qt-mobile/qml/StartPage.qml @@ -1,32 +1,33 @@ import QtQuick 2.5 import QtQuick.Controls 1.2 import QtQuick.Layouts 1.1 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents Item { ColumnLayout { id: startpage anchors.fill: parent - anchors.margins: units.largeSpacing + anchors.margins: MobileComponents.Units.largeSpacing property int buttonWidth: welcomeText.width * 0.66 - Label { - Layout.bottomMargin: units.largeSpacing + MobileComponents.Label { + Layout.bottomMargin: MobileComponents.Units.largeSpacing text: "Subsurface Divelog" font.pointSize: welcomeText.font.pointSize * 2 } - Label { + MobileComponents.Label { id: welcomeText Layout.fillWidth: true - Layout.bottomMargin: units.largeSpacing + Layout.bottomMargin: MobileComponents.Units.largeSpacing text: "No recorded dives found. You can download your dives to this device from the Subsurface cloud storage service, from your dive computer, or add them manually." wrapMode: Text.WordWrap Layout.columnSpan: 2 } Button { id: cloudstorageButton - Layout.bottomMargin: units.largeSpacing + Layout.bottomMargin: MobileComponents.Units.largeSpacing Layout.preferredWidth: startpage.buttonWidth text: "Connect to CloudStorage..." onClicked: { @@ -36,7 +37,7 @@ Item { Button { id: computerButton Layout.preferredWidth: startpage.buttonWidth - Layout.bottomMargin: units.largeSpacing + Layout.bottomMargin: MobileComponents.Units.largeSpacing text: "Transfer from dive computer..." onClicked: { stackView.push(downloadDivesWindow) @@ -45,7 +46,7 @@ Item { Button { id: manualButton Layout.preferredWidth: startpage.buttonWidth - Layout.bottomMargin: units.largeSpacing + Layout.bottomMargin: MobileComponents.Units.largeSpacing text: "Add dive manually..." onClicked: { manager.addDive(); diff --git a/qt-mobile/qml/TopBar.qml b/qt-mobile/qml/TopBar.qml index 624002242..43a5ad6af 100644 --- a/qt-mobile/qml/TopBar.qml +++ b/qt-mobile/qml/TopBar.qml @@ -5,6 +5,7 @@ import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 Rectangle { @@ -12,17 +13,17 @@ Rectangle { property bool goBack: (stackView.depth > 1) - color: theme.accentColor - Layout.minimumHeight: units.gridUnit * 2 + units.largeSpacing + color: MobileComponents.Theme.accentColor + Layout.minimumHeight: MobileComponents.Units.gridUnit * 2 + MobileComponents.Units.largeSpacing Layout.fillWidth: true Layout.margins: 0 RowLayout { anchors.bottom: topPart.bottom - anchors.bottomMargin: units.largeSpacing / 2 + anchors.bottomMargin: MobileComponents.Units.largeSpacing / 2 anchors.left: topPart.left - anchors.leftMargin: units.largeSpacing / 2 + anchors.leftMargin: MobileComponents.Units.largeSpacing / 2 anchors.right: topPart.right - anchors.rightMargin: units.largeSpacing / 2 + anchors.rightMargin: MobileComponents.Units.largeSpacing / 2 Item { Layout.preferredHeight: subsurfaceLogo.height Image { @@ -32,7 +33,7 @@ Rectangle { top: parent.top left: parent.left } - width: units.gridUnit * 2 + width: MobileComponents.Units.gridUnit * 2 height: width } Text { @@ -41,12 +42,12 @@ Rectangle { anchors { left: subsurfaceLogo.right bottom: subsurfaceLogo.bottom - leftMargin: units.gridUnit / 2 + leftMargin: MobileComponents.Units.gridUnit / 2 } - font.pointSize: units.fontMetrics.font.pointSize * 1.5 + font.pointSize: MobileComponents.Units.fontMetrics.font.pointSize * 1.5 verticalAlignment: Text.AlignBottom Layout.fillWidth: false - color: theme.accentTextColor + color: MobileComponents.Theme.accentTextColor } } Item { @@ -57,17 +58,17 @@ Rectangle { // Display back arrow or menu button text: topPart.goBack ? "\u2190" : "\u22ee" anchors.right: parent.right - Layout.preferredWidth: units.gridUnit * 2 + Layout.preferredWidth: MobileComponents.Units.gridUnit * 2 Layout.preferredHeight: parent.height style: ButtonStyle { background: Rectangle { - implicitWidth: units.gridUnit * 2 - color: theme.accentColor + implicitWidth: MobileComponents.Units.gridUnit * 2 + color: MobileComponents.Theme.accentColor } label: Text { id: txt - color: theme.accentTextColor - font.pointSize: units.fontMetrics.font.pointSize * 2 + color: MobileComponents.Theme.accentTextColor + font.pointSize: MobileComponents.Units.fontMetrics.font.pointSize * 2 font.bold: true text: control.text horizontalAlignment: Text.AlignHCenter From 3c1d7c0074d1165030cc3834fc09ba326dfd1b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:30:41 +0100 Subject: [PATCH 04/12] port these as well to mobilecomponents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sebastian Kügler --- qt-mobile/qml/DiveList.qml | 63 +++++++++++++++--------------- qt-mobile/qml/ThemeTest.qml | 33 ++++++++-------- qt-mobile/qml/components/Label.qml | 7 +--- 3 files changed, 51 insertions(+), 52 deletions(-) diff --git a/qt-mobile/qml/DiveList.qml b/qt-mobile/qml/DiveList.qml index 4f147bf6d..2a9c53de6 100644 --- a/qt-mobile/qml/DiveList.qml +++ b/qt-mobile/qml/DiveList.qml @@ -1,9 +1,10 @@ -import QtQuick 2.3 +import QtQuick 2.4 import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.2 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 -import QtQuick.Layouts 1.0 Rectangle { id: page @@ -16,7 +17,7 @@ Rectangle { property real detailsOpacity : 0 - width: diveListView.width - units.smallSpacing + width: diveListView.width - MobileComponents.Units.smallSpacing height: childrenRect.height //Mouse region: When clicked, the mode changes to details view @@ -41,17 +42,17 @@ Rectangle { //Layout of the page: (mini profile, dive no, date at the top //And other details at the bottom. Item { - x: units.smallSpacing - width: parent.width - units.smallSpacing * 2 - height: childrenRect.height + units.smallSpacing * 2 - //spacing: units.smallSpacing / 2 - anchors.margins: units.smallSpacing + x: MobileComponents.Units.smallSpacing + width: parent.width - MobileComponents.Units.smallSpacing * 2 + height: childrenRect.height + MobileComponents.Units.smallSpacing * 2 + //spacing: MobileComponents.Units.smallSpacing / 2 + anchors.margins: MobileComponents.Units.smallSpacing Text { id: locationText text: location - color: theme.textColor - //font.pointSize: Math.round(units.fontMetrics.pointSize * 1.2) // why this doesn't work is a mystery to me, so ... + color: MobileComponents.Theme.textColor + //font.pointSize: Math.round(MobileComponents.Units.fontMetrics.pointSize * 1.2) // why this doesn't work is a mystery to me, so ... scale: 1.2 // Let's see how this works, otherwise, we'll need the default point size somewhere transformOrigin: Item.TopLeft elide: Text.ElideRight @@ -66,12 +67,12 @@ Rectangle { id: dateLabel text: date opacity: 0.6 - color: theme.textColor - font.pointSize: units.smallPointSize + color: MobileComponents.Theme.textColor + font.pointSize: smallPointSize anchors { right: parent.right top: parent.top - bottomMargin: units.smallSpacing / 2 + bottomMargin: MobileComponents.Units.smallSpacing / 2 } } Row { @@ -84,41 +85,41 @@ Rectangle { Text { text: 'Depth: ' opacity: 0.6 - color: theme.textColor + color: MobileComponents.Theme.textColor } Text { text: depth - width: Math.max(units.gridUnit * 3, paintedWidth) // helps vertical alignment throughout listview - color: theme.textColor + width: Math.max(MobileComponents.Units.gridUnit * 3, paintedWidth) // helps vertical alignment throughout listview + color: MobileComponents.Theme.textColor } Text { text: 'Duration: ' opacity: 0.6 - color: theme.textColor + color: MobileComponents.Theme.textColor } Text { text: duration - color: theme.textColor + color: MobileComponents.Theme.textColor } } Text { id: numberText text: "#" + diveNumber - color: theme.textColor + color: MobileComponents.Theme.textColor scale: 1.2 transformOrigin: Item.BottomRight opacity: 0.4 anchors { right: parent.right - topMargin: units.smallSpacing + topMargin: MobileComponents.Units.smallSpacing top: locationText.bottom } } //Text { text: location; width: parent.width } Rectangle { - color: theme.textColor + color: MobileComponents.Theme.textColor opacity: .2 - height: Math.max(1, units.gridUnit / 24) // we really want a thin line + height: Math.max(1, MobileComponents.Units.gridUnit / 24) // we really want a thin line anchors { left: parent.left right: parent.right @@ -132,8 +133,8 @@ Rectangle { Component { id: tripHeading Item { - width: page.width - units.smallSpacing * 2 - height: childrenRect.height + units.smallSpacing * 2 + width: page.width - MobileComponents.Units.smallSpacing * 2 + height: childrenRect.height + MobileComponents.Units.smallSpacing * 2 Text { id: sectionText @@ -141,21 +142,21 @@ Rectangle { anchors { top: parent.top left: parent.left - leftMargin: units.smallSpacing + leftMargin: MobileComponents.Units.smallSpacing right: parent.right } - color: theme.textColor + color: MobileComponents.Theme.textColor font.pointSize: 16 } Rectangle { - height: Math.max(2, units.gridUnit / 12) // we want a thicker line + height: Math.max(2, MobileComponents.Units.gridUnit / 12) // we want a thicker line anchors { top: sectionText.bottom left: parent.left - leftMargin: units.smallSpacing + leftMargin: MobileComponents.Units.smallSpacing right: parent.right } - color: theme.accentColor + color: MobileComponents.Theme.accentColor } } } @@ -166,7 +167,7 @@ Rectangle { model: diveModel delegate: diveDelegate boundsBehavior: Flickable.StopAtBounds - //highlight: Rectangle { color: theme.highlightColor; width: units.smallSpacing } + //highlight: Rectangle { color: MobileComponents.Theme.highlightColor; width: MobileComponents.Units.smallSpacing } focus: true clip: true section.property: "trip" @@ -177,7 +178,7 @@ Rectangle { anchors.fill: parent opacity: (diveListView.count == 0) ? 1.0 : 0 visible: opacity > 0 - Behavior on opacity { NumberAnimation { duration: units.shortDuration } } + Behavior on opacity { NumberAnimation { duration: MobileComponents.Units.shortDuration } } Component.onCompleted: { print("diveListView.count " + diveListView.count); } diff --git a/qt-mobile/qml/ThemeTest.qml b/qt-mobile/qml/ThemeTest.qml index 7452acc1b..b65bc9eef 100644 --- a/qt-mobile/qml/ThemeTest.qml +++ b/qt-mobile/qml/ThemeTest.qml @@ -1,11 +1,12 @@ import QtQuick 2.5 import QtQuick.Layouts 1.1 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents GridLayout { id: themetest columns: 2 - Label { + MobileComponents.Label { Layout.columnSpan: 2 Layout.fillHeight: true text: "Theme Information" @@ -15,39 +16,39 @@ GridLayout { id: fm } - Label { - text: "units.gridUnit:" + MobileComponents.Label { + text: "MobileComponents.Units.gridUnit:" } - Label { - text: units.gridUnit + MobileComponents.Label { + text: MobileComponents.Units.gridUnit } - Label { - text: "units.devicePixelRatio:" + MobileComponents.Label { + text: "MobileComponents.Units.devicePixelRatio:" } - Label { - text: units.devicePixelRatio + MobileComponents.Label { + text: MobileComponents.Units.devicePixelRatio } - Label { + MobileComponents.Label { text: "FontMetrics pointSize:" } - Label { + MobileComponents.Label { text: fm.font.pointSize } - Label { + MobileComponents.Label { text: "FontMetrics pixelSize:" } - Label { + MobileComponents.Label { text: fm.height } - Label { + MobileComponents.Label { text: "hand-computed devicePixelRatio:" } - Label { + MobileComponents.Label { text: fm.height / fm.font.pointSize } @@ -65,7 +66,7 @@ GridLayout { text: font.pointSize } - Label { + MobileComponents.Label { Layout.columnSpan: 2 Layout.fillHeight: true } diff --git a/qt-mobile/qml/components/Label.qml b/qt-mobile/qml/components/Label.qml index acbc079e2..65af7e0db 100644 --- a/qt-mobile/qml/components/Label.qml +++ b/qt-mobile/qml/components/Label.qml @@ -1,9 +1,6 @@ import QtQuick 2.5 -//import QtQuick.Controls 1.2 as QuickControls -import QtQuick.Window 2.2 -import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.1 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents Text { - color: theme.textColor + color: MobileComponents.Theme.textColor } From c302f222ce7dfab1410239faa1161ec2b4413a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:40:00 +0100 Subject: [PATCH 05/12] Add banner image for the left drawer menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This picture is used for the header part of the drawer which can be swiped in from the left. I'm sure Dirk has a better one, but this works quite nicely until he gets to replace it. Signed-off-by: Sebastian Kügler --- qt-mobile/qml/dive.jpg | Bin 0 -> 235727 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 qt-mobile/qml/dive.jpg diff --git a/qt-mobile/qml/dive.jpg b/qt-mobile/qml/dive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56445648acfabe2b6ea202ed7f6facb4582a7fa6 GIT binary patch literal 235727 zcmbTc1yo#1w=UW^1c%`6?k)|%Ex3Dd*G3yjaCaJl2X_eW?(S|0?gS5-%id@I`<#2< z8{^4bV~v_s_08G!Rn1YoM%DbY{O1P%Lta`=8UO_a1(1Dv0DpecX-Rq6SONfYa*O~( z00007AcTSgK)q@5Z!gh5y4ssg4+ZmgJM^2*0R;^}c`NnaUYju3zuVuO0OH@?H@AP+ z|5M7yDXNfjvhuTXa06i8AP4~1Hv~H;2Rq=~KRO3HJJh%T^8V+~Tj!fV1E8S)%Wu_R zwSV+)w10O3{`^lafBoFsfd8xkBmju;@Cfj5hzJM>NJxn9P~M}WAS0s?U}2-bCm|#w zB_SjxCZ}elBd27hA||HiV_;_I;O6EgqZ0t~a|*L^adZCV1PTcW2?ZGi9~Bj!lY*Fn z^Z&E_=>}jT0+ImzFi?~LXiO*=OsGHo0J67n!oAJ>Uz7ijKtaR6!oedTBE3U?12kX& zprK%3pkZO);9%e82+HrR9{`I9heg3529K?3fl zI3zSIJR&kNDH)QI`ZX;*FTbF$sJNuGthTPcp|PpCrM0)Oe_(KEcw}^TZhm2LX?bP! z=l0I--u}Vi(edTg_08?w{qKjzzj#3bVE&8Nzs&v*UYKvZpkZNQU=jY}1qJQ-_QGJo z!clO*V~MFEn7Ck5at0v27f;Bo=|Q66Qu~Et>N@idmzw)0&E;Rz{$}?7j#%LTFJ}J| z`)^*W02COgx5b0O1c(C6eKQxD2edUf5{VtCs%)3FJ|MxuOyBX`CuKU>>oBA547^0AXA zpt5K)LEqYQ{r4~3C`n%!q2=Bpw?Q_H<~?Nd1s*)FQA+q3y9UCDUH*${tyoQtWn!KU zk?O#}iiaJOJIrKH3^^eX;Qj+L(AYnA&$7$`V@C%L(*hk_5SWc_N<1W^A6rw=u#i(DL{c+J$gT_ zc8Q>qMEXgk+x*}}Ax>hdLv>u8IhDgPVR9NTw_D%`*y=&^7Ugd8_q!fYs4%*jL43dZ zomvu@s)9ZpPhV+98v7`cEylE zZ;I~*zc9|yO+hq0hQ^ZOt_K9+uEgTc#&9V>(>Z?thM)E!hipE|Z4J+_JC*7)TE87{ z4WHJ=E+`nwsT`O!h|Q~3UHZNwezW>s1UePy=hops)ji9 z4&k;c$NpQ#ec7C$kgcn*PbmYKdHoDkhrSOh)4uN>vpdMnRpVzJLBxa z2xt)){Q<->GKr7lqg1r>?g3?pwS_NTcir>m6doT)+PJ(`uMN85_o^?s`OAkH7Fw|9J%>zaUKu(I??-7A zMN5eSf1n9wXZ`_*g0B{Bv>Zl_&YEgAuO6M{G22K7kqVS)c@xqU9MroBx~D$>0ce`r zt|rGLojLgHY6pEM>Gz!aHgr{)`kgm$cl8I8bSVbgSR%)e2qZaO7Ugg`p)lGzR>v%Q z7yRh288}X-D&ozXGCX&z5_E57mw6Mo$~$m&@^Fy&z41q9|3M{=g_~!iH>LybPrk%j zIsB3LTG<;w_0IwFu{pm`WrweN6EfYX?`}$elIo)toV}iVJ(qn~>4&o<{x#}s`$JQ; zKZaho{5v4w!q`rTp~Usjw?dDm1VyU4IIeaeWm>)8Gp{=P)@+#!Efx{FBz*`RP|E&fTFJUQq`njj zfdxrkaYFx0h-?)+v!I$+UsSP3;q84-6s8WjeLe{V^??{ux2mlkvf_&)Roz-V^gWG# zAyf1wbvq7Gel4i$)Hx%87gc`k>fkXFrHSaFj;TN=JE){vH48}CfRWCJyE zT@{(3J*%!Bo{aXpusqF}v8gd#9B}3hj^$b3mLm!|%JjU@gHaC1L%$nd<;CwUwZEK_ z?`>XibR2!jrqRijhGLi7y&=x-e1!}h>%}~?xj6BRNyC$<+?vW>+#LL>CfGiibmX3m zHs1OJK=a|~QQuQ5TQ7){Hx$GPNgUFS6&oDhC;0e8rhL7bwmbP`k`5bbb`3*DF;qeo zxt*JcD#x-)#Zi@`@~go)?HUgwD$Lx{jrTI@lB9Uu0V8KmfQ#-Ni| zx@8aE^-EG+&jO^qIUP%n&xp4hS`I9Eyx$O)zsqSjqKI^bh!y^BJ=_?w|M|rfBfI71 z#pW)Rc7xp7{(>Tr?_I4TMyeV6@G9a-Y-p>^IZJF7O?_fU;CY3X&OF8t!63(!{U1OK z<1H1_lT`V!po@x}jN~WXb)%>UsAip9O*W?SWlT0+Jl3O0Uu>yjhzMIjqO z(8DTinA0#fCk8i*k4m|&%=t|keI^^oOijdD6V2#Gp;0>AH{nsrv<&3FLo5@cT+qPS zb+(VhR;x9c+dtMtws*+94URES?ePn)VW?&;fNxr zGEtJYNMvkB2#XSD>Q@VzE|~VVhJC-eT>T*al(Yowu=xX6yW_H{B@vQ?83w%G8SKSM zZ}X236W8soNi zqA#;K1($dP-F6?;UfX-?%XlV5I6T3D`m*L;GNTpW>tJFZ@`~c*YTU=<{QG{3i}z@_ zcXtoG7Zk1<@hAKBQC(S^?c|)@q{puyWQV+_`}ufhfLcreAa>Xth`!AjmqsW{(Cuz- zVH|RQr1eReR+SQhff@QGJAa-`@9DUCb-H?N#OqZw?7?>`r|?Uzpzx%}=dhhe(FATK ztPi>pZ0^9LP3L8^Rgt?NA9g?AmL|f*eq;(G6BiXE$hXvv#u?Hy$t3;FGoyF$+p}%0 zF(+X{nnO>cA?4-vdB#yki@vGt=VcBv!z9pVrjPq>d!J)p(rZ{iG*z#XxQj`8v<;m5 zdM3gkFVV`7T%H6mcx@OjHkMpfJALw0^e>t%l+a3YIq#y)Ib@LCZP6`+ZSH19rv{Vh zHDhY@E*`Zi7C-=*Xxn9&LUJ9AwGQh_uHc;}`2-0C4@wQplx_k?u3I3Z0R5zrN5jq4 z+~xO&lR-w}rN+jSSM4htoOJ2IZ5@;B{pN_elJEWh?HujaLx}VJ1s@4 zJAGP#zOQXoz}KXZa$ZC){iMH zJQ3V4@`&>v3OQ@xqp{lvhN_Dt^a*(rywSd~(pc*e%*^z-Okc*zz#jYoEGW)!qf++D zNw+jO%|x=Ed~egap+*;*QopIxXW-so{mo4n&3D}|8_DwrppAb}jvcu1g1%TcFk07C zW8?V;@WnxzyJG!f*U{$s110a>FMWts?-15G48f$5z)|+|j(mpKi07FGKcXV52tU8~n)uE3JMcEHe zM0a5}2lK0HP62n-FC2Qh0171t9J&<}@wL5VN&tTl-s@hpQuGz`jQ4!KyzkB-XcU!DXB$>$PEYY&#{{ zH;FH~*m1kNBeYNh|<0+-dKeYZ(Fhcs#o9X33xu3Eba<()1JA>dsAEkJX zvT_(25Gcm$|Cz&^+N`TX{WC*^wXrh*3$cexRb5gGmPXdYDFf!W*Y1+=iOFmzZL-sx zRQ29msV&5lL8avRe(uo^={r>vcrv&NPUAWb98gSu$jgDc(DT#3zR$Z@2NG#XM9>;^ zGW|uAa5c7KV#WHyrlfQazDQKtF z*u?mgAd&;|prwZdoh-}pSa1Fu^P9J-4jGTR5#mwi-Q1S-bCqNnb<-%kJI)c0DBdS<&eUw-$e@-FP{G+XW=30gN%1umh0DNT-H-tR)HT{A z_JH17F!wQq*Pc-Fx{#R7FcZTQ#n~BjW^f}d=Z;|_9zy1&np6+-FyC6=zcqS^*C((S zicF@)xWJuCzh(Neab9dc6P)rhmw4bB3(Y5Bwq&Z*7=Muu3vp*7+2jk-k3Rsehq=Yk z$IV%$ue+>Q?4RkOWsk*xZT<~qmbHs+KXUjjXzt7tkzhnaWVkgTkf+YR2FQxCd_zr3 z^q6N^JtzN&loH?+y?Qps+izcvoj-AIoG6<(x{-hP0LM&jmW?)2lu0UGC-A}}g){fd zjae)(L^r7~9XMGI6XQCIDk9xqmfJK4IEe;jLo&0k5IhEWO_b@y0HbID z4Wgo=y+eV@T_;)>&vM?Fp;&>d*3Kdt>xa?;8^7I%RmSp<9)l+AtUxrG-s;Q~9m>M| zz0rQ?m1f2YIQ?^q`&{Nf*rNe>K(FmM4>h^!udPIlY8z9S^Hj}Z%>*oxQUZzZ;-Cuxn zm*{1J3Vnfmh^yi{XhZlzKhyI$Qm`}=KOIAT8f&r^eQlkJ zlnag`@WdBJxv%=#FQc~t> zfa?l=1WCEMN@lCit4W)diQB*a!l!z+m63@KT2PiIL7&anrNoEl?7zYnMff!!*CBDb z(hL({utPS7b3TNXqB#Mv9~yd0#fqm8^?_gv5CP%YDV|cAZNwa(=jdqoi*2Z@8SJ6s7f2> z<+h2twWy4*9tfrd&+GAR0o`ZWosf~kX#z(o2usQ#-MC64pl4*NWazq*M11neD1KvA ze;aO$3j_L~*=QGC$;F_7`38vGXld(H6vO;H|8?z4k-Oirk#oxk$>k8SR%4D=x>jro zFYdnnQ&6iXgb&5)%eTvDvrMbaS~jZsxk_Bvw3MT8x%e;epe3rr{K#q-kc;UVY~p!b zs2tAc1Rx{#-d<<5>AW{&aWE(1)^0-$pYU##es$S?m`I=c_I|>0eO<`ryCPWzF((zOjQhfvl)$4$GWfdi^SSD;eS)*-UecXC? z=W|Os(gMsl<4V=<&03wAd7}oyq%;ONFbE!?-~J5+u|e8Raq6)twQ!zcE6oCk|EuYL}vsPm$NXwgJs(yl<)nYqCJ z;*>GIEKh{6xtCY98HBeT*E89HtHaG_^9ZB0P2p9Js1qOv(+9J4^+IOMwcf27O#}JN zn7XN^2N%)qHwV#AO9dy$C@No9$yjN{*Ekvo!hae7=z8Q9EO>d_QgC;SdA|GBK@+ulLoF_p| zR6!Fs<)w;_0~7mTy^<@epLydJkzp{=_XFaoDf>rf8_OTd+Z_m|_C7{#>pDEAe5Lk2 zioK=&lphbh7dAf1m0*;iN$0Lw&{b~hMLhr03eNMzjpk*xPB@CI9PQl=SqMD?tcz0{ zEi`+^16B6dXIu9~cQxT^4j&wxEcXhVM-zH|^hxKQ2a&w?yK+7nX(L1Kn^O;I=Xy<9 z?<1e*rwk9*mA#DJL|*))@o-mQEq~FJ3vFSsuu6Z;n#kdI4A*=Dax=Q1ho>bG_i{xs zs>Y^xtOw3><7t>zui}Z497-*$rUVSkQaYjtAW)g?pwLC0$1h)#C^f6{fdo@^Pl+jY z?DKe}ckZvEg*hwfbg`!+=a&ov2L-@d&*@}-^`+1Qgh=U*ud9_6eL_gPvFqAKt4pDk6ucg-zDHQO=zMZyu%vCx2*ituja`MS zljqzz7LL$q5hiiDQwOh7qw&yZ(qRxB}@k;xRdqw^6L@7$8i+H?aw8Gq0La zFA{nsitXWH?w%sVbKQSNm*4$3xKBolC6W5m)7g(4lo!EJZ3l+cr~UVQ>(dzB}V z_hFEe?AMVYTj*Kkd1YZ+4Z(tWJVaJ*i}0q$2p-*Nr&xYFCZZ|PJyDWWY2qm7>nR(Ih;yl?;?+$2s9 zab|Q-CQ0Y>uCh1rFQku`{k+U;23c!C&hRb)p;UWQ8`Z!#gZ4;i$rdZLJX*&Vl@c)tE+;C2VqWl6>F8p(FpdcRT52WUO7AYFa9IlR6TC-aTz-< z;0U8QPWLBp<{inynIUg#;i?qYnxb{|aHvP}xk21{!o?8SqA|va|C%aMHV{Pt8%x(! z3Bcbo1++`pR`Z>iwv#do@2E>;YSE;*UKLG^z8&I!R1@pS8(nAmPTcQ`uQe6Eqrkt@ z)|9aA{WVmvd#CB6Rg>O9UV~=%xTV9&A)I?pYkVBje3gZjdoIep3BxA4GJjs4p9D+y zFtKIiO5wa+`Wk7`G*uO@N_Zw5-D9L}MMQ7D`OV0WdE9$cro6^}60RoxO5~C;I5Ckc z{|oA*8~h0{;apKiUCZ^v_55BzC5Z8GJ-i9JKRQI)pvteMg2BOet+{KoZ?i_L87zU{mJagOftpW68WEptN1`jIl3vOiPzuL39&((MEFJ*CqHhM6b8$eTY6@d0u^gSH`HUJteL3n77XnAcq$kF5%1yw>h3kUsqumY zauTmoJMqW94{?e%r@N3Mw{3y<=Lky_;m;ff?P_Brv*K3(sI}~G@W)<{3%6ZKa@Wvg zH+j6&;ai^bK|1nS(Vsp30IH4pz-^r64>5_ygCBQXjul1pd6hf3O+Uy(ri8U1S!3QR z0wE;xpUn4C7dj9GDxNYRB3h?hLv%zf>%bE)5dW4Fr9jnbgx)BA=DAj=ngnB;+xwNO ztob24p&n^+cY;5F6E)i=_6-B>ODg7Q5Cte*hnf&ATU0h%Y1H=QGThZxS<$~tqnd^5?*v9+*ViR4+BLxs}ju8+^6-wuC! zLXpWn$NF!Q2`j~gB-=bGd5l9hJ^ykaL2uleI$4>EcS)(Fw@oz5JREI27 zGPRfmg*Y3b{uW2SwJHb3wJ_>Tc}zL*kw>1(;) zOKfndI%KGr;JLZ9;^%x*cxRux5bgt|v)B~z_3)s~fudd1SMrpNN>fcNi1q6$fscQO z-H2D3y5ps`ANHY-%eR6`0z=m7=LW8ZHk-Ug*_}qN@&k|*!6%>yB*O7N;V9$`*5${( zw$(c{FnY;rL$zO7$Y<^}3bYn-HZs+V$Xy<}{FZDv({$sE{nc^h2??dvx{D?CypW@# z2W!=imPDUM@2_%n8_XT(9R^X7T^Y7R$Ru0c?b&HZdU{H!&;h_l{~PmQYB&U9$H!Mq zfA8(M`w2&F4;T(+MA#Q^f(uQx>bf`NJ0XX;yq^3R&?^a z30LRCrobIOh4)Nk6HjyZ-(9{SsH=Rold}=-ve0>M5iCdDno2i+%)0F>F(s}NbRPzM zme(-R;&fEhec7>7kO3)cbT%}1Lh^$~#Qil_nxf5$ZF`z!q>U3G=zwgbay-l}IU&i# z+O*!iRN{aaCgAF}H_5jWYgHH#y+hv1? zD;uQyR3u=HUz4z#hGP(;=tHjbd@i`J;cMi?FtH83W9DjcAe)M!xwK3<;ve)I*UnsL z^RJq59Im@&Im+@aR!*N?L9mX;N=qiwo(FTeg0J3(ol!Nowg7j3ahQ?6Y&CQ*&cik6sq3h_PAz~=m8rV}f zlSAaRo2N)42fuJsk>T$r#G^AW{P4sMQ@`$NX-!cUK*l~XxooD-?(v4~X4g*_KyUSO zOz|}I>(mFGsTVk~4$$qJa@BkCUud%?Dw6IiIIDfE!m`c?MaU)lsbMMuMJ*8q3ent6 z&os*L7GIYnLO`iy`84O+3T6#*DvX@s!W|n)0eZdHs@$(EtS`@^C1C&J7!&>J<->&( z{bGh(vuNLQ|IhcQXaJQ*2JfvCR*wTUJX7B5M~C$9mVoA4o_?u?7?wq4dRsDMD!LQSc?Zz zrwm=&ueTSgJ#LTYg-g+5qC;|!A&^$e}Y7@MXqbn^fIlki~ zB@3PXxpX#ht?b$s@BwsHfPzR^RGCLtC(tF4=+ zLh55r-5it(Y1a{-`aY|x*UkiC-{Yv+lIH_l3?fCS<=Iz zbopnHwQF*gC%Ap01qTfMf2g7Zf>(RnF^tt zkwZZ(Inva^!mpofv7jmC!=`PfU?b>4Qng}(Pl)4PI0AKg&J(W;r?+E(O1yqCRrSvc zO?SFs8y}|Ha%H!BY{LlI_{&R6m#!U6 ziWIG6O4fT<0O`$11dX@+1~0W(Q?_-oL809rK$_|dTI8d?wGn+*;IO|vVW3=8mB66S z42tEx_0NxvmP5ko?S))p_%01FB;C#~N|#YhQm%y0_8RiHsltOzGT$0 zD47j(Rg|fzH}T21CZ{i_2xL*C z#nq%jsA6pi2(rZuW94?!J(H)9QmL%@PbQ?+i%y07|2g$I7m$S%Y9DS7mueBV+%KXtZTZUf@fA1ouoBh?{%0EkyL_X|CGEOf`!)x4AaW5rI z`rFdy+EX|pjA5Q@r-%5=NPP?;3C*rgR+TlKk;3`#`OnIqpU~f}-Q1i7+1MOGtS078 zrWUMbP7Z8dCeCaetn6$6VNow<6EiytH*!-8D;q~3-9=j$9l4D;kWQONkzLVQ!ou1{ z7VK)F4p!1I1KXJinA3@hyc6~k^m1@^uy8XW_j0gz1POWp>Hc;u_@@8W%trSHay7RU zRFjnc2l7?}()}|QPft%)PcBv`S1UFS0RaIvc1|`AN&7w{RjH5 z4+$rGCs*~ifUtOD1SJ zwqk65E&KmivbSaYueP^Pcnb=)e?#Z3@^A22IKD-k>tCVuclIOPYIl>e4Ly>Ho*&^j>WFi>xaga65%Bz{W*{X5O@Ke>|tSU6}Hcqjw_;#&?P@ms3i z|K1A&3k3}a4?sZt^G_xp1`NhqN@e+}C`R!3%ZUxITBDYIg*=m>p3zOYZLRxwTbDJ+ z@YX_Ko{4d4Gp7T1Yk|$Cf8kSeq`d_e+xCx5lIG3GB(#G>yw8#$Qor!I@aeptaj9z! zMg2jg?wt#2o%}RCMzc=R9;;}clH6hR9UsSWsPjIb_dAPrj~~9HQ>okyde$*t%O5~w z`mNg+qC9*l-|ITNj!EU(ofhk-O$wlGVtckYbM<|G%?bPsYbvb(*K!B6=QgvZli|r~ ze75m-n&;g|opswT3%j72FmMH2Q83csqSf$Cw1vXu4QHweH7_K<&Oh~fa$KpiF}t?2 zwlm955bUB0_Rr<|O|pg>y#%*ctmgrwzc<^s?~GH}eA>Jy?#%A@=)CAaQ*MP_RcvL; z^uwzK>O$R@-*?;>UwoYLtzgaTOiC=eWy(1|x%6ooi**aM9Od zLz(DiX!E8_xkzMuH9;$C1j>P3%cS&@T0Xh1Zz623P4m$=BP*G}0_X_(v29&(+)|3V z!20P2<%kqySVx|s+fSQW`)z(2m#Vp_6u1=rM(*8abyERxSSTZ%zW7ihQ$equDJG?x7h&hun~artA!-S`jv06&+~bm@c|E zBb&W==)gjf=sjBn1`N3@Q`Bj; zCrv1besgV2zPRin@KUrQJ?OYEQWf=Czb#a=5D+bBJ>*~XP(wTLBfaQY?%KTHjO(Dh z-jLH@Uq76XJ9#Ob{N-d;)4J{bTJAhV$+{_vZn1fV&c8XK7sqOov>0o|cFUu>7o7j|AwIq$LV?UhAUp-mT5`;Df$Y46u^dS@_f;R(gGJ_jBbk&6S~ zbO83I6Z^g+onD7(;)#`)1RW4qC>A&K*x+48yYqTxLoI8)wws9r40V@4#93enbjc1$^Yr8oTJ&Q8joOxiC79IVkQg-KTRQI)J8~K%=8M4j&&EFhWEg}R>&GnOl(h?be4e1V=25Bt@yLM#xtk(zCHbD-pr{=+5 zVi^Z)4{9DkfglpaEBl&4N86Be2)zcg+G;81fLq3IB(97_FZss!LvOANjFb5z=*wfo+PW)L&sKj z)`Dn2V~Jr+Te=;gB`Fm}NgcqQBS@vW@c9018gBGdlyr=x>K^<^d_9eNI0aMGJu`!V zN@~AWmXOwR_gjmF_|rP)(%AH~(^vCD%GW0YG!DvV>Milaw22n#aNy3p+SopAPK1yW zDPSL6DVfzRS^ppn>Syh%X*?h@7Va3UjJhqcK_T<$H^>e@MOL^L%?(JyXN~Z)#B@Va zhgzV{+;Nv$b$y{(Io-U{2=5J3(RLm1dpn}>Bsi3I4X#!(_55mavwr5VqXqwEWYZ#I zn%4#D5slXq&rhdn$lED*l{2GmlC`YriZA81oo@-~#>qcf;Tt1unHn}9ITK9-pZ@^gUI^RwLXz->Hby@{4zc{z-W{n;Ir1|}&5W|BWbFEHA4$hEqAH!r(J zG@uI5FVGpiDp$yBxp}Ji2cFmZ3ffoKi^u9xuh>`IKeq-kXZ5xk#1=+f0e3|q_YnemB>V4JNq~95z z;!yB1Tg|xzp7+##lBX6GIqd2WGCgT}-+>t_8nt=IxT~<*{nF0Y;xD4*zx=iD`tcOX?v2WO>Sm*Z6_4QjLWJeS{VrX==yvO}ULsJ~f0c(pGN#i9xQ%jN)lVhooyD0px#6hx;_M zeDCL2^)up7^T9DX(!NC3$@##mnrKbra;mnNR-X^A(`M8_HhAal2hV?WPNcB4@UwhuU zVmMZVYC#J_G8Bwi%DI)OScZ+wJFJ_q{ihX?rLhakMy@(dG4cMSa&!5)S5af3NBte_ zieKi)M6S`B0l%so@5$if+mPKFkK2@yFTg#xa45l!>wXc*`ZfE+ak|=4fm~@X)h&FD zZ{ONmY7*_&=}$04btU_@CIsNC{L{Jw>l^{yeB2N0mZ5%(JNNl^*t=v#KEW-#Ie__PiqG;7pvkuaR46zFGFZF(1CScN z6Gr;Rez7}*t&?q4(^R`N;6o86x(L@chB|dCeZ23>Jt}wU;R?OiYA9lKoPB@b7wLC` zH*`mn|E;TL+r9y1uZ_7%A1#LZ%(eb>f4V5i;HBgY6v!PnMdCEQEebkg-LwCiQU8Afwx89j#2*$jBt&^fTkN zz-FGbN@|?*p2f8@hU)2ewye>l54yT3hvVw!K|qKF3+q?jrRZ0;rN%V-(@f;{on0bB z#4@zN`cQTs%9*Q24H0NURQkh|Z#Ii^9+9ieDIHk7d;^!pZN5!)a*G8&J6Sy?@6}OI ziC4fPwY^tUh>v>={QlGa@PAlXl!$T1BMm7?u+rVvAX#7EkI3 zx(@#USoVU(&$xY!JxkR;5Mjg>`j#CTCDaXZdAs=OPsgS!iPn==Cy%1Lu1;p@bC6w6 z=E8I!jkz)z&cb}tp4(d8)gKOh995G0ZdR@5WJileA1xN@t*7tz-nA8Zj|e)2sY^Fn zKIm4GkcDuzVNpO~jTGonkdoa}kurrmH6ap~-4kzdT7ICgp;Xo``!l_9)+o@kG7POo zR=0FJ$$0YI`}Gj7#kTb$B74ra+PsQ=#7fX-hlkAVq=FS=gYq04Z=a1Dzr#~KcRrvl zm>H8b_mKPmXLpE2x#Q%T`y*W-NT}w(s{_{#MxVK8zYVhr=>)v#=cAL3V(5L-40UAM z13@yDWaF%Q-isLDwH%Ft10?ZT(2wzc6r4l{1@*fC_W{S?{Oxt+;oOnV|lm zR#vbQuGx%@b`%6h>WH9~!9fwpzPnCtFi#toG3%>(xFl5;X5OGRgH6~hS`HmKV|f%QO2pjtP^PpS!BA(HI0y@q=;6YvaerJDh3HzFTHV<)cpX zj^R>lE>z=x020rQ?zfP%MLNXKXsEg$Hx3B_Z|a>WlP zf^>}4?5Q;$N*ThWT@7yOy^C1~kfHF)t*Cz$Au)aDp6`vC0MlF|(C%PnRq1LTG1M7+ zv56@%37sYES(?l#H*zmvMs0Liw-A;GYn+2fqx&+7fO}FB<{AE|k7PSnnrlNAKM`X2R7~3i^hNsxXoBR&7iwz?>y@6j9ZhDl`VBd^1HO6` z##_HTu3Wc3El2Y#F{}O}5~}S7yzi{8z%+8%ATTJF%WNmWw4Y>C8X2V{em!OxcaM9w z=Ebytk~DiQlM?6)|HSn0PlDXGiKGl|7NsP?cSVs)DHpHuE*)?Y$)CW{RSB3`powaK+q8ds>6!Y zz@=3u%V0NM-O>!jl*@-9;y&)Hi@NH-oey(Xet0v9GH1Rg!V%f#J!J`{kNcqbB}(_$FMQac10FCEaU`k>W4k-b_cgLFHX&f#Xf6_8}Cq& z4s;s%v(D}%u7pGO)86tAq&06BOGRTTb6Q%bN{6?QF<1@L%L!qAe? z{Fkoj5w=VZVS=W$vKPZd3!LVz7{Px4IexZ&7jF+Hn?B^b@PTw6lj%AM?Op3uf$w?I zTt1gHF(0UT-#y%ihfVSeuozvFva!cpx=)w?R$LAb}Q_Vq?qia|Qm#^(8;Z9FEk zEuQ9?<|W^Vghlh4+4S{TFki9$-c8E5om6L5HvCwue(BOxv{kE=$6dGns;O1AVfZ_> zflsp6VVbBqVx;=Gi|4)EX z-Y-!KbQ&p1Az@gEMpRW?C4IJ0>?RiJ527DEsA{kY$n`v^>RYRP3I|Lbf~ddOpZb_~ z_*oIO_l#{TA-$@jX?LZ&9Ufi~2H+V7ze=I<^oc<1b8J00Pkr_^Nm{!KuLX=$Tpq3$ z;-68U@ya?2K2>H^8@zrEv|Ehy@C{SU9VA6)>KnNLZ0Rp>yi``iWGXJpW|dJ@8nta} zWI{?N8elg>5o%vLk3OMw$=1dTX40SIS+}KGxi4@c3FDDQ#^qwxkBlFtWV=xnh32&432~ zy+)cM23hQ7i?RjyqtbWo6OytN?E(_{;GtHbMBX`G%toD;i#>INfGZ$K*rDyQ%68~# z#gsc&Mpu;E(Ij%!H#}B4PJOK|Z%^p(Y4cPW+deu=)}nn*RKM-{crq-jF5x8oXVzy; z$cDXRG$hkbz(1{8aq_&=bH(H}p{I9xEPVqZ`IxVdR^bD*@e;M9WfcqFTgvOk?oS@n z5;TWH{MQ@r+yqNfig@WmuAqe75krSU@bx$1@ZxL%%`xT7lL!LDm>%83kH%m;V}nP9IPC9dg|d%$3>F+ty-6=hcZJ^5 zu~Y_Xp?=wIfYzj49j?y;`%l=1>85L(sfz`#pdg8E_}j37$$9YGimAR?E+RgrxsXI4 z9hrPCcbwhm5X8F4dz4uqU}BQ)p#JJiQt2f)dY?@7_Lai_xc!@!LR}++FxDq`(!omE z>Rk{ENAis!jEsm)x-g$j@uUM^jQ^Kt;_}MUDD}f@h2CrA1P3fo`XbrkGgww~P{f$Q zF<`oZWt;X15L~lPXl#+LAr)NpMeqIZ%(0zs*;+c$D@(#Fb_sj$rK%c3>xYdMjRK?2 zIGCLT6iFBo-)0lBmbRBQQ}9^6Yjs&~S}R#d^ek^cqprTpYeR8Qren?*RC#qBb#eN}Wm6V%ER9J# z=9SAoFEgdPOZoekm>GMF?rVQ4lGfir(KeE+1ZaEQrR=O#HsvGRm=lGb1L*uPS{UC= zd+7Qt*tgX5reRN2%=8WkB5&Z;0Lj1i9<85r& z#gtZFmb~7!hXbL1iax={8tu-2)3`6E2niWP&oSFs^YT?k&JgyLB7G_+=!HzvBu z;v4CS4*b1i6ZBVolryqS=LcLC?}+NMp!#4%wCK;ZT^|@bSvCuyQUJGrEk~QeZRi|k z(d%1%hWCJdOPf&DE40QvWg}_LYx=hxr<>oz^PZzPJD65S$c|cmudadnUuVYi$Dtp0 zBd2N5^TTu;(){fjp~f#}S#^H&NCn}9Ms9)F8#fYC^<2->NzFcwcRhjlUeNylpz&wo zX(h$q6BA+o08z^a)$>1l(ye=26^pB04^xIEG{N_t_^vQqA7DK66EqZ_W+_oi>iPC` zxSN`evk4{C@`FxL(NQPkFf_|>4_>J8XR$uHKA=RiP&fqHIm^q8zvN}s958jQ1?8b<)kC*R9eJ1CUE z2F^B-fhJ?0=nitG{2ziE0c z@a~$L3;L%stR3^STC3zVCfmT&zNZI6E4+||@c=Ch(j z=rL_b$~OSGmG?g9hNbjn=n zP#_tRJ$;8R+83iWxF2@;??>WaMCOF|iilof!nXP#n!!<5_-y*e3Ag0`07m8S&Tk{o z2AkX4zLoPEquun%zUL{?v&!6IbX4^CLg*n1)J}JK#)_jgoqs*8I4HQ9Lgwx1dF^O@ z2aj3X@rH7nZh20ber}4snkG+46xyuE6c+i z4b(Wh!mWJ4>ZPdnAgs$7wE8Qvy?o(Dbaw}nG-ZUE?KMnnuD;(Ye9@*fid!_@vn*Kf z-)G6Z$v69DQS`Z)oja_xc0sP+4%n80hfd0-*L&MEm0*FRgT3CPob!zqERSomTi0?W zW!>TH0X7B!&Tq%`sE*|1MbSL1bafuh8O}ZLHFeE*F!3R>J)G?3%|5NW>RMVk1yDhC z7%WNj6ztGT8C)OgdFo!U6|U8_cGT(w6W{2szjPc!41SOvvzZ z`w~<6?bu^*6OP6UV2h99qMoiWdTtprkzJYUfp&j9?btDsS zarviVg5KunbY6ebh?T9gSuDh#OU`Hy)@EbfJuz*^F{d`N^cqOB1;C2=i!7^#Yxj*5 z?rJQp#d7v|osm5{-dnA2meTD!TrWwEhfWG!`g|Ai9Y#@14QS0IiM-}Ckn~As-=%(w zJy`lV>Fuo>dYXIawW9a6_rEw3j_ApahCQznNs{bLJ%5+E+^1^9|woR>Eriz}MRT-u>3eS{~{&wY# z&T}oarwto;54Gn{h&xn%v++V$WkpIY@2A0K#s-I*_xRcjmp5E@OGWc#*>jrABKHNH z-s1TFgvVE3SjL~sU$TG_Td z?xwq#-(7m(`|e#JQ@)=WpGD$&5gft5_ZdjE2}3@pM6876YjX6m!VLHJp8Mw4 zMdw-SOiv4C*=U!47P1eqZ=yb-E3NM2x)xj)ZXqhqM;sovmKSvzm|FfrcN>+yQXAW+ zIdq-ZC6vzB&I4Sy@s$$#U(i(^OWsdowiR=SV%nEwlGb0M%G6Lvyh1b2yWo0I4xVqV z!%86|A1TX9T&?rQ~y=%9@jZA2}8V!7AXNK57H)wYJ-U)g!~#9D|6UrEo8 z&i#A^7un`p+!r2LQV7Ngc#hn z%K=xvL5&sC_68c*Mvyus>1&h}7oLc47114Y!oIeHyVdC_?7i2{r$X{AI@)!m*!ul$ zkYO55CtR09rsntZ-Jd(1(awUbaYoP1v3jYg*hi5iU~4aZDmc!W)?@Z|d|#B)cKMiw z#FT%b5~q|!*WUQ^lJ9saCc89Z48ZIy^=195Wi6Y|HSuu^K8cb-FCIa&eg6O^ZKo;L zB+!lD=2ZhuFA z^RBF*TOstmD<{-v@SwpCom9A_jX7+NUsT}9n z=DH6;g7H|J7N|tL9mA;r^qBHRrQ0YRrAy8*M#tn5^W48%Dtj1NwlQ^61q zNT64i6GyW$>}*M_Giy#0m+VU%09D|DbhnnbB9{Cn^Tn}C&L0i=Gq#ZyRtvH&dYNbsAM<3Sx zG_C7HrsiXHs-@ZI9S=Rwd8WBE0i=h2t>#y>6ef9^>f}&XE{JcS4=@Y*zJEsb^nB~7 z#wbx_KofGuU4B$zH3~Uq;ZfrBXEsX3krrO5Mk0+4TVn!nJvx51mXA7B!8P+pGNm)@ zflNC@h_A84ru#mc{h(k?I-=J+vD2141B}~2w~(8CJ>q9iHE==WZ5kLQR;^(nwuWjM zHljh2o;9Z8e3xA3G+^SRsU1ZAyZ{rQaH(wJD8z0#`^N}hB41AKIMT0CaW@KENbUYz zeujKhZO;MQE1^kT?HtTm*Yk>WkYR%HH)Ji`0`qTHUa%U~HLTmyFa?oSHa{bE8?$tK zR=9l-fzBlDCa0l7^rA&oznn8{!=zthvIzEEj+%YtvyX@}61vw_mFGDc7>?gn=i zG?dq76LzDDquVS)M=xbA_7-8!ZTZHR^|`h*1nC!w-$bzUdIV2mdS+~U;D?d2!nHWc zPKE}s^4AwdLu+dFQ_3cNMJ<>mHv^TW0?;$)7x$LUcE^Bf9K#jFv|Jc;Sgli(E$b4k z1S@_sw`qtYQJbNv;x$w1bJ@wZ>2Wd?YCDOg;_7iPn=+cg>q=}`x2cVG;PfUfqR}SdQT+t&cb1_rE z(D;2RnIKx&E1N-$ZB`>$4uush7J|Ww*I9sc`v4i(YwBG<=LpWel=eYKh?;X^W}DQ4 zRCUek91i@GwqLa8vl^q*bDE?jqk!xA&CCyMl?#w<=ubOkRxm+)u31mO-;LsBG*uIu7?Yt${_X!u*77_;aGtt!vX~vO=vD@BDss` zGKRkkQB8I0H|)K43T>8e&X9I`j_yWw1Q}#-;fl#H3eGLRLwXK=vgQJ*4V# zERn&^mmIK1sKsFb!3QCVm}fvgh|poTh}B6OZ3|1v-q3kcx$Tqi-={|_N0MJM?sJXK zvz&LVeNSQ1%)o}!{RL`Dw^2pP+i`f2AMa$0hImopKqOhs2 zm@9n_QT&;s<+_Ce5oooGnvdoK^o?o0ur;Lb3`jT86A!ydoXOI!)Ux{;1iLQ--;zgT z9?7m>&(AVviB@Z(F<_ic=RWA?g!Lo(4Zh13B%x!V*o{=?dD zdJg_zh`J_5)`y+aL910ZBNYx^z~9-Gz|xSdch%76c>4P$c+7aY_6o6@g>ngUcGs?A zRrQly1S_r}6@`qAnOzsOb+6M2s~SSz6P}xmh8VR^k=;-E`Js7LU16M5??c-z z#Y&;0B0pLrmPKx@KAEyB>FX`)OWjdGx|3liG|;j0I;aL+R?2yG3$g7opOG|Oc73xa zn-(sGuz8hPq@I9ppwE(ATvXZ6rwC7DZ8~Hp&$nzl>37z-Xv{R4 za7e%Bx*Ih4yq|M}c*g-*sZ{#Dztkx*k_%A2zHci+w`j|j)@f@)rso0P%r}$T&Es^{ zwuYT}T-d5)N(g>UlwQKmvW%ONewbFxsHAEtzUe9+sJy35#sif0x2K>sfVG~jRi=&# z#X{xvl{RS0KI~btG6-7VMPhj#fV|r76H!KCC!UYJFHothJz_5cSIz}P;ZbXL))9-4 z-4zbcoMT1N=ap8{wxndfk-crL)XzJ0fih6ETJl8(3l!xoY)4hsV={;V-GR! z4N`HdVy4aOHx8h%9mlJBuJ|UJ`hHVVJE>+)O$2%cqM422)KKWLjFk)>wHHk-CaWi} zVVJGd8J8P!4Nr`@Mtc!as#?<%4w6RgT-+<~$$QpGu47uNnWs+E?wd=X0j013zbUn`;OS|2WC27@c= zqR+4%#B2}r7tOlQ8|}FfI+VRVKwxUhsg|CFkW_L&ZF}qM{2{M#reRCyF{e4RX-v!1 zK0$FR&O|&)Yd8#g`i!qasxz*)(@~;<}tqFcf5D#I2x=1 ztJzU|mZ~OHoew^I=GX>2#ym__ot7b>tP6Fl(B~9pPZ+4Y5<1xt$cBnfqU6^?t#XdX zt7OhsOlUnb^|fN4%9AOfR`X96>WV5&9F!lkoz{G>#X`Hh1pCin^LENrDPH<(_pLr> zSmoTeq2`25+c<9ZYfJs1jJ;>ly-eQP?1yzzGOT@J@0J3l=XZ}8aI&vLBm$}|EhVi4 zhGK_lY^gnyh}sV`PSw@UZ{uXT6xQkviL*}(%2Wy&ZO_@MvIv$$wdkoiS+#LH%#bvs zMm#OA^?e%Dxvf6)JZG2cBr_hm_4<(;UW(qpdbyfy67&;6Y2M1^;*{QF%W0$OQb%Gx zqLVFF4V!6Ny=_8^w4lLU&6byk26E-%Wxl?+wR@js8%v?7rtNbkC&QMFuEn*og=q@z z)+zlkUVTQMV9l@bB6C7VNscOy1}1}}bR1)(==lwom!Pv!gKLXR$!dI&pj`FZs+&_3 zovy>^a$RN`Z6L;JWo#v;GFmA*48kx@?J`_xnAIN5OR!Ws3k$5Pi2)TEX?sVDq@+w` zdTiCjU{6?SCDH0BO_v7UV`s>2jLv31UpZ@pzV+VbiyXV`vrmreRvPmv&33mU)Yj1S&Ysd{ ztWIuC(s)O%Z7?+0s~3J8 z>mNU(dL3P1XX%=&ep|*OP6EzQc^-(teK&zoiq!-s;?7b^RiPWsLunJ}=6c-Q){4Vw z#=`e~UHu9~;$iCg7!k>pnR=~r9A$=JwzAW(evF~L?uLW6eP=DAv!%qM{)Br$&S_0r zW&0e$Z%Qp;k!O^PLUx%>KSjvY2{qC~s3Sxm9JuzeHS{8^6BhHFD}dc5+A1RTGA@XX z30&(QC40A4k5~vrCzb3s5ZZpI_MdDJ+fApHmkTpNpFHZTRjnU-ie8({>1%}!@$aYQ_c9%x z0nn%VRRB*Emu=wS|PN{ zZ_&6tuPW~{HMouBdVIaJnfct^yY_Q(RAMRL);JE6%RYn6P=7oUZ5sgCn1Weft z6Z4*Eg&{dUEA-6RT#&s=9LfZGmD+PB*kx#WpKph{#j>5%a^5K3xg;G5v*@^^Q@pl0 z<0o*E9fiMv8GYla`P}P2df$7;)MQqGQISSwJSTn5(~IU~T_#MJ9#)zL zy+K8EnJ)U52e!LoBOlQqsO?!3eZ~)o0Z*fHX2Eo;H%M;soJFj<%?TLu^?g5j+IW!< zNS!W$$T#@o5SA8fdeGY9Sgwwn9fh0uSiXbN6m*nXCa$yV{Vxl5y>-2(vJErpvc{(~ zpcGBkwA0XIj>_*>4HUEnRdUfyBcT$Nas48E9>As+^WKv=BlhZpsB9#4h{Tf~sy$@V zA}1z3v^7;{Swzrbyev7N>+-a)fR&t^4c49b%m~eb_2Cl;^|$qvv?~?T^p?MS+RQf> zYi3&2D@Bxy_Vl3+=m7=$EkdOhw%t{fP!*SToTm?1N2 zq})p`X;asXa`&a^?PAD=FcxL*R*O@fD_ap0Mv$&0t;#}T6IFCF-gumrE5g;w+3}webJ`#y z%vTV*D)c=`BFU%Jnfe$Za2<;&8xB>?Cp*$)dL@?V<<#;3x*#O?O=A#A1^28KZ`kn! z6sFYzTwpbl-=}69&>G?=nemfDmB*NZx?rRuki$qR<(0^^C1>hOB&|!K#wtbC_dbXaX0*5qRwuVY4Fsd5O~`2TtxlbPWdnEha-gbDXI|yxD46 z8sqSK#rgo^Cf{*gHx_4tMeoJ;_>lS$Y6&`Y*3)waWJ}<-LZep0*n-rW zA+M`RbQ)p=#G=GqL;ak^FNQG#0F%6P-kruwSU-9-wCC1S#0rEm7usuPP;w$LKEKtk z)9Yzd=&08y)igadm&~*Mtj8`Fr3}44Q_gOpv$7~jRqOY?*z~r$&7y=89=OH&@~ zNh;7+EgALI@inW^FJ^*+QW6p0e(8R7poO%7T%pv8*lDrVfdp&~9~UP?M70b zroaY-bBC=RMa<{)(`e`C^7WE!gGZG$ujQ;!Gqt7)mrl$SAnh;pt;<`UpQ&F=OFz)F zilaq69n$sQ@E%&{6eNjDZ#64@nEb8~yKOjV?zKmKPnOsJSvGwB~ zaJYR>pN$g7%r`z=vvd#oKAkF})tNBnx#we}7g=FA9b6;P5q#5CC_UvjvAu>eVKg|% zXNTKY>At^`ct*2PZ(fV~k4$3KdMo#*?@Ultg*sBuxzOFJ1IwfQ2)$b|gx_b<`oeoaBo!-fIoX(MSsI@O%*&OYB^`1uQ zS=d_7pLNgx@>{t0uA*r_x$id;`yBBx42+Z7T(*4gZ#U7n?t%+x@|pR6p>qq|4$Z}I zN;JCGR>AC;`Y&ouU7l2WAnTQ8#QY0 zeG{KTVa9RepoNn`p@^tZ&*&Dc6&%gwcQ)^l*kTApyPhLL&*=^|^!@LmWj?OHou;Yv zkrAxbF=cC_&!cRIy$77z@qeQ8Ye^lf+`WZtU#E5WoiiA6T>P_4+sG++%5$BX4rjch zJ4E$XyLX>S(BKH-%{k}&0}DgXc52r_9N-^n>hoktRcFoJYW&hB(I3YMer7iGy&IGj zHD70$F2|p3TGqmKqSU0T{#}qQsOU(8+2djyJCQFze22}{v-F%g-d9^8x{CKG#G*FT zjN0pnTb)v*gnAy5YgY)3dn9q4G-!co3+a3xN9KK|C~bk67YJq`^`e)JB*bi`-%en^ z01p;R8`JpxY(Gnen@ZBW**>ys^u>x^xq;0Pi+%5R(`e$7M=Rz_!cQ;(mq)W-=OK!n3iU!zgJlP9s$ zC~T|i@R3KnhRkL3tsxSY#BFHRIM=OLDpWCBioHfQr6Y4G)8{DYvL6j)`K;Qlmh>T_ zmLhBLXg$j%484NYNQLH$`|Cm0gFO+orC$e6Q5K`t`eN@y;yDmi=ufM$PnWPZAAJJGp~tW;4@N}BwGpNo%b2Dk=@Hfup#~E%-in~HKW$M)xMJ` zr_&1LzkA)E6ESR5m22#OI_bQpv&TWUsaA<5O%5B0wNpu?I7O`VN+RDxePRJ2F&5fB znTVpw%r6zhvqiZ0R64bU9IXS^?QxjW;AmvJET47G%3`Am`rKr?V50EGvc{c#IArBv>SnYrdC~%7IOT5`v(A>1Lc>g{Vee{>BLmMVb_7ymgFK zV@3{Ut4Ri}o~$W;r(%$8=0$Pc7#^XaYQ)QLX2$epy{Tdt9Z7a~o%XMqR)>~QRPdz1)J6Mw5^zJyB4uH9BaQ$k|BSV8Jwgx$GU#3$X zudJ+BdF>_yi)YqMKm?sAF}y<7eUxne%H`5)D26N#YseOJl0~{h{SB+dyUMmv^5z?v z-ls1OfKNq8`b?tA)ynhT2J58A!s5J#WLevfQE_nffEX_tASjQv>f(vz%LdiBk0RCY&HT5;=XZdNzkp1>{V;<{z5tXVphGARZe>Memx$LG(PfXT!zmnGR>uNjbF^+}S8Z)q4_Y$pgdM;PJ z0|!^~mdI5$VU960DRtv*heYQkB&xgk!U{FG)-F`d4L6K>Rf_E;nkyZy6~6UbCsnqp zrit{;!-a{mBBAihHp?55(8sd6n!*k&hk1@+Hy~4c>Pc}zNHxMJ(|*_7 zw3{&?dZsEhCNXZ()skmwFtY4(n0L)-r{2Z`TyXI;JkFL&cqZpq@p`~UZ)7v2#%jDL zudQm2MlD?W(fXo9t1vIEq}?^I){XsTYjjiU$0j*537Vov^iz9Ao{*-go9R=aTE16D zEz%^lxTfCw-XJ!hm4wB1_t9%BNY?i(Pio!c56mh@E$o>WvbAY>V1qc8B7P=7g#;0q zYX1Ne&ocCzAyiT0<_Skp2Ty}btLMyZGVABsF>9J@iDB*?r=gubBlunD3E>+Q`l03h z2_oRJ822Z~*jL^LsYdkLznY{qgzdC9exwtX5_ zne=^bO!jLU+J1;z#0J%pvmC_(|W+Z zb`_rBKZ@xAM9)1O^biS{Y$KGeee`4gvCe;`$~sNE6jDH2U8}Sy;7s57vy$ z9=s#n_piK4@hey%`-7H>(n-GII|H?wO3aO-tnJ}_c@79p+U{p#Ez)M8(GSr*iS1^) zL}osT`_pYbS$!(ZJz3Y+R%$1w5gU45^}deYCx3Kxm#IYBn%lRU>lV^}_q!7bt<|q< z;LC2(d1!?C9*)*!KCjWy%xxb;{T}wVd9O~*9mtRZ8(6&)V)R)Dyrih*_W|(E_Z{Pt zHbbPzz0opWqn27{F>o}rJg(ZH-5%~LZmSlBWqsR8p+f6m8?E+QdjkXfyaNn zH(tMbw+g}@)z)f{bI|N79*Oik*60NQdpT=bib>@T&mvgL{Gn*{%tRH6*AobfNi_N) zOBf4KTJzq7#Ory)G*XKmkE7ES>NmN6TNJ)(9LaXKD^7dgRw$cBEjf>?75dWmq3GmC zCOhfm`;is;c^>*>==Uq>Q`VBS(*FRZW0uumAFNcB=Bk$zu9}iFYf55vgSF;%D+8#v z@g(w&LrtO;A> zzKdx`SrU_=4e${>PG8=Dd|dW>;3~*W-Gd>AyogLf*5|$Ty+1@N=}ehug*+^J>-w0P zite%rpWIqivz*om33S-j%DY66BawW!K&-2MMhjW(RNARQ8YiK0&)~Y;fXql*W$$r&h{O|G zTv+X5pIwPpnd$W;YFH4SH1&S>M|oPc-XrMxJ*XC7dKXM5;aU1)f}5*aCf`@zqw??u z^xG2G)EFf5=8h|Mtkb)?e{%XMbgQQFxx<@UL|oyOi?f<59y7LaB)?Crq%jKSP4o6* zB$}2e&CNBN{ZCWHSJ9LnGj2RI+GG@R99XUW7md=&blK48a*ZvLQN>D~^rZOdEzfO5 zSc7sP$ycltUcY*AE_3Y1Ecrf(Xxq}CeG~LgJy)m|Yd{d!vXav>Q|i{*M7{3XIe8|- zm7=J>7Pw@IOc85YYTM}Nha37aX?mg#^^euZyB?RPlO443@qC6ZO-d31pR4by@4fG) zezbd@b`MKUJ_|T47!}F_LXK-_=^JAUD4Eu_C-4TD=gl|jm=z3OK_)_3qUPjQ)J>$x zgnH{%Lj>%OBEo$iUcX0X7|52?)%(QUcM2s)_AJ!1EME(vdJka&am5ZBRI^lkqk%&n z-9(reQZ;WMTG3mUg25r0Dz#_n+LKdox5=HW9Tto3d~tC^m@Nv>G6gX=79{5 zrO2As5>X@T(!YATTDYFpTG>^$Ai*cz^kdzbw!Vd8HupX6z3;v6r{71ukA3fSp8MYa z!~iQ0009I70R#g80s{d70RaF20RRF61O*Wi1`rb=6d)oMF%}~*G6xqV|Jncu0RaF3 z1p@9n53q7(yN~*0zww7}>d5zUKHK|4U-dWlkb`TNX~(8JUqZz1s7=1W>#%b;xD;+u zJy}&2N}{WjO>fhEw6)!>`e{ohlU|)7dz4YD@8qo1P8uP~c(emkp!M5I#EKd~4=`ZA zmf99dmg?Vdf*pr)tV*%Sb|3Vx&9enn6WQbJ#%(&PnW!j=l4L)vt#*7{OnTqfODB$0 z?ddV&T>Cvl#ieH&v9XmjdRy+>p@Kup>9iB2Qg)sN%Sb!4PC;d|993uSL0pwR7ZU32 zYHe`mOA7cX%+{eMjqHNFHaRO3EM0w+5bQe-qa)g}OWydW+R+X}{*4<{{{StGfTIX>`F!L@DrYNdp8 zjroHbI}f1xmnrNfevC2cMUc^({uSf|bFuW+9wb=gv!z*P~lk$GMTI~4! zroC|NTeT$~CZ(<lfeYp8gO7dCkt4~Yi za7@U6El;(z1izZ_olwY?n93eju5GbETtpmOav}?r3|V;{f*>_I$?IRRZ={ddjilJBAl?Hkt1Y4zA*86z@Rn@WRRc4@R zC+SwHackJ6Ye=BOuOfoRhL%pUkTn?8RukH))Y@}bFHw=I^wpFejHp5!C4j4T8r4hm zuS>yHkT_9xmQ!Fns@1k)>2?KfqgBw*puM$_wyR_Iq@+Wv*CASGHq8MG4?iBk54h}W z1lIOr6p(A{BpX%ZPfaPTTSTbql;)|WUoBUcN%DOqgcSDon&{!DY?RHxJXT#><3mzcFk zD$r>?zisvlD_v3j40Zkr{G60{!Vn3JQMJV~$F|VYjA`AZfGFhG)1K6vLSuHFFSxAx zlxXk0h_?1)T)&K8#f4J<6RS5&XA^PZqkKg5xi-ap8!y^EoMZgistSsuf$)|6jEz?X zN)OZG(Z%DM*8c!9)X9lVf4r7d1r={jv9onj0Xk&uuYgrMrHTEdi)uKuqRH_>aPHde zB8MnKmeY!Fp)#Xun_NDQVv;Xa@#?#{sT_e(Ij&v}tYq9BJc1{T0vUODqtJ+KNb5B+nYwMROgV~~z#rrB%Mt^GD8wHP@WqzWk>RwE|jV~lQk-rm8d zSPL}uUXw#>-DpG&OB`y=?KcxyNCL&s^(~gQR(iSyf~epW{epZ*RaLBzoc`@<@)Yu- z^u9)jcyN)ck9{h>l+El@;w^P~`3dXodo81oM0b2Dy`2)^RjFJ9CFCl9Q57{nsyj*A z>>2B`08`^iFt{0SyKcPDYuRd+MyW0YU+(Tbsqr);8jld=gTY80l6%^pSn2yJrae}3 z3vF2|=9Jq->eKz-(x;N+%x%@_99+u!052AWD&C|`Y)VEo zWS_~6iR~>qQQH1AR&op zP}OQL4i3b$jGs&Fz9JP&f-xrgSu0+v083_#i_0U6Y%Ght{QaNg08jldkHKV4lV(C? z^3-?A!^^dHA7&P`+IPHGInOjOF||)gr8=V#q3a^js$UD0d%n-u%$|ZExsYntMISZ$dJUY-}5LVr{b& z{Wjf2kp5e&3NcS~-g<8ofYX?k?;m&)Ct9RVfwW{2psAU>{NGUS| zjxyszakavl$FrI%J9W<;JJEcVj*W#==!o}orl1QWgYhTii({GF22;jIqM>jKYI_k^ zD;m~@=Vj8ZYAs#9=csyswXY9)r&Kgvl(|RJ;ikfkFFXrdABs#$A>8Z zS(@O8ar_^9sJ4e<#3?66LaBXtdqKrntFHR{)eKX^uHnBx6Ii^BQb(@r*4VGr;!8G# zg(ZEe6-iC;1p~l2469RYu&Yk>es5yZme$aBx{@%52$ir3im7tJ;q-I$G>j52mRi{^ zv>??MUrw54kuwU#R0Lvj5bj>AU|9@lkyEcD1t@r%9Z2$vE? zd72hiIKU>vI!7Lbm1DXwsrB3x=wmJ7xgwiiYZ+((JbkLk>xwpr zB{8ewp4S?yS!W*@w%Q;6>=*z^{XEpK5(=m@KFT$%?jt`KjZt2*!GzfBj-5VG(@BrK$ zHlfo|xi=u_pHr>9*y@5)W^0x^Jl3mO1ud63WMm2pfjET94RU48DQ`{`-A?B>6ge5D zuCB$U(_3=M^;+n~;$U*KIZnQHfQlxT z+<7KqR{PhCD1AD}3u}F(jY9ndJ3We?gTE@S*&=NcG;vHN;eugI?zQa#Ib8 zRz$(WJG4xb{8lg1VY|k83sQt<{X8cxz>(>UPX=ebF{;TJ_yx% zPTiLWI(rR_OObgmyb+mWsyXh<^sbl8a%L`Hpi%v|-Hlc&mZlV3x8A?^YSz~KVzQhL zQywbr@wG>E5Zj(X zk;5^fmN}(=j(Ut~wJ?%}OBm<698-0ZvA1$qzh|hhUKYgxd9TshRXRnDRnHsdj`CepN1y^K{(KS!}k zh}x&qe3c3%pzN%@Qmf^N5x+|?9N-`*U-eqgByAR`dX@aE=NMaL`zsk|iLrI_ELAAl z*WE33>P5|FMXp&YXO0VRY*KL+GUTCe+?Sm7c)6+a{{XJToUt+xEm{a>eT?}E48U@H zF4R(%wfSSIU@mS?7<2;Z?9Yio)H29#?{+BiOvgvI*jIXOstkDJB^Nc$qO2D&{ zmYS^*)jUp?8wSvenp3g7<(n|Tf(16eufG)6Bio;5{{VETnGD!x1Mz*Be(kWVpLFqi zWY+d1Vv*-^$@JQ5SHyEvnI|l5%_uTWLf<#_Ry;A(+CVRAmM_$A(xV7h8c1ps4+$Y5 zcvNHA$h~DQXjR0X6dLU^W`yj7yz5OEU&)~zzmN_yszRU z<&Npei|yiz5T(R2%SgA>XLY)ys@+M%SiQ2G#Sf)n@qo;83bT$a`T_JVO#qMZuqbbE)W2pJpv zjccwhpAz!vqZ-Ea*>bBhH<`j0tc7j@3yNo_Phb?{G05F_wyR_aQduXsDfV`OSF;aLj7{5mpa)x>z-w@0qCKo&gZ+6=j&uPGxj8$!ccW~@8hi>KTG$>l*er8_f}W(u{A zDfWR3XShpRzm?j^NZs;Ope1zle3ZD|o|USt-v0n?>kVM>ZTMJ%@HMWvd8^_$z1Kqo zc^5r4D7j0U{p4ym39`*!&M5NkD!on$^j=5du#E^!$*i)Yk;IH~Rxyh7+f=S-&k%6# z!R}mP9f?rfMlB{~2HovTU$|c&r^uf4*XerIDjb!}d2iIW>3kID6y*eE7Ay`V7go4e zTi{NeVPo%TX03-YWBPJg7CZj{pUUHy=?5{brQ=4<)fzirBZ!x%e|B$k7`~e!`7AJ0 zAr4>1@)AqpQsLZGmK(y}Uy@_?sM~UUu2voH!S>eaW8SU8c*`S#pL@sRUiD5_c;~JJ zFiPg8aVnlOiFj+|$>ib+=0l52KHHLG1}?`lp0&+QmT)p`CSO*qJ?^DSAhH)4s^wV= zUj)-CZIP=X7L_)Q&YwHA1=5B|NeFtE9#$gamlWjsj_mbX@oTQs3rV38rG-_zLY5M= znir3|likR+4k(3c>$L>C?8bH$G^D=GtTlht_j6V@7fbZWDCGT7>QTF$WEyPs;+Lt3 zNBgg9NLTVU#xsJe)dj4>bspPeHr12q!y?7>gBmX5n&#NZ4M&cNs|5D>e97W|L$wWpzx8lT3-ZuXLjNHhcR&SKX=}&8stz^L4c@AbLl?Nc& zZ9IZ2Lpxpk#f&uL56%LjdR7B6n1S{n@~Jk4K$ zli8z+V?}BatJXkPYq{#wC8GqdUsK3jnz3<`*I07K!~)D!aZ_c#929dnD6*V}I~k>S z6ke`MH%BkQN0yRRK1;@IOcYqcQ{&QpLC#bk;#Y>5J zu%zr$pWl6&k6^wrQZq`tEmm=@a<5#p_l|8YUh)$M2&B@QO`goUKuvfGj#xbAG5aNe zqaZ2PIjFL`BKw+bGA68}_^8_5Vl06C?sLen7-K8qnmAc*FD!rIE@;R!w8xN7u&X=W z?kVm8M}O8A#mA^JjdRT|OD5+=vDk^EZd(*%Qqe4IG3|M{I<8nLGHQeQix>UAza~|; z`MYmvu0Sk&x={5a9IS0geNRLPgyBO z!BuC{p2BRaol?I(*Bu9hSH{z>Pnt9;!pLO6X1DywUP8u1#`t(|^|$jEU4) z*C`s}FIUq^OnR+0m5s*i-cy@?LUe_4_SyKWmo}T0asyU3aaN=(bNx&sV(}&@oTN(S_S^C+PQ8t?5R`bi`2CATJ8$YRmFy7USYc#Rmp7z zsOzb00KC12XFUfm=3TdCLb86lTSOudfqC|v{@Dv$MQp$*caE7YPn)ra&{4*GF+U;EKDPp z&sm(l(I_gglAn}f$Oe;U0vh`}T+y9YpG)N;<;?)GcvncFz(y5(Epo1O!3ttR=Bng~ z7IK85^&vq~xxoCHCUu&+Tz$;Y6t?*pdU5=5l}px2z~3dw8B-=-B}DzBF;W#2EM6cD zg1L6uf21Hyk7`K!mnHy>hN;7K+kNiVWAYAaZ2NKPIW?89ByPQ)bC;1tWlMCa zq(NicIZ2FYPQS%dmqx6*Jji<;`+M zidF)n3dDs&mMdHBGYVx?#&+7*VF^)H3dS&xtJOPaZfdAnuF1sKuuy}D?Y`1iX=Pl0 z;~lc4qOYnq_8FQXUd)#vk^JOw+(b|G)2A~y)s40Se^)uJe^59K`EK-yT$94U;{1=y z!xU~7l(PbC=DDvo7faMHc%7^x8(eMd1!Hh8da(}!Y00Z-Jv1v1QI-7HsUC!h)=Fo! zU5buLUyu~#!3HW>4h6YqD|!7Kwa!Hp7S(*1)2}sH$c2uHrPp#_o(axiYnX*Hw6)$y z6;>9h>moZv#Z6yH#WN&#`6+{nw;t42$VNcqev`zhObW0|A;HeuteCEd3p3%O-8Zh6R500*ns=P_+L z%L@Mh-a>YgbQ3kVN~S4=dDVIS+Nd5eu5$){yPjQ-a*c|%J8CO20ZSFPNz+_TXZt`V zu@)?8_fMuA72EEN-pz6l!?j`(5Gqcc{ISX9M^xw(^WSN*EvO~Z-qsfo6}(|;eF3jB zkv?Cn(r>wqMLv_*rDAIkawS1iWB6SwY(GY^MO`|>RA4z(19qgH5nckN4%ItoUJ6K7)o?a!X!($0K@s zJjkNV^_X*0SiVk_IbEhbGSN={=drbou&qzC4U*K`CBr9^=5SbI^Pg)BZjBJMm{UT* zW4+kPDX^fdjs7fikqCWsqp|8cMNKZ$bap-|P{p+cmbFcga`{dvvo8}$u~AUkwEzo> zFGW{#bzrnFn$_k{oUV?V_9kXNjQFhz@{FlJZedQXAMR{=&gr3g7==KeY zfnF5ggLI&_rEk@i+?zVHV`oW?3*ZGTI#JF7vhBJ@rad%mG7zPYivDrjZA-Inih6}s z&_mkAbn6Rj)NyCn$Mo?%I4l`EL5}_^@r(mGqQL?8mD}5mnhzOi(6Eu(Wj0jTEz_wlNJ@lW^qNSfiNi^ zntM7`G>8=wHnDjh6Pwm=QgvR%w+>8|SaQWq=bJ3sIW7sbiA}-1OUMEil%+LeX+Kk7 zoT7#>uVI>0tq26>pj4p-BGu+Yv4uxEu^88V_S)p8Vy`xoH$hCs9mvfuBHEWH#5X3= zqOzxisU#$t%2K0Dkuv7aUo4>fE173GVQ}u1*{X3cO)*f^_wiLsiC}G|AWUiuQ^V^q zh%uKH6uMC5Lz{54t~yM;>I3eEB37=e%(?E0M*$*ZHlm%Y{Df+IyDYQs0TZTl{R1GV@>clTj{;5_5{RO7x;q=Sg5~qWZ4?0f@cWg zjy6`*OtB*x+ofV|Y12MEGOPi;OOO3Qam`P>N|tn8*cA)b)d-cUTNUy8R%rqygoH2J>;@aX|O?6VH`A`=fnv|yJkAs}8FwYw z46Z#e#niT%=Dso!?^?doF{)^Eu&?$S#Of?^xmSV6#+(zJn)K)P0awZm8v!-x?b?zB z3-q5TRv5XhDtQenj`y_U7mY(6*TM=|!faoVnO#8#yLL-O+W@Ajzxtau`u=6;z}L3i ze)xOZ>3k<4a}M3)^bnCq5Sc>NBT;e+8$26#F5;TykG;k?Y;8$=FlC?YE~Lc9&=vVp zW;(Ao>m7HQlg1lkDHu5`#F^Z>Wua!J{b4R>RmpJ}{7@nEq-vp@@+_o01q-qGr@6)T zCn4Ef@#mT^b1?D{vG!b}V~YM7HajVt=4myrR-kMRrH^}~#NfjRSC~r0bhMHQW7leO z1SeCuQvSn&eZ46%TNxRVe`2Wt?l%|S2%I{ejqL*83xwOF=M+mHCmlW?I`w)QC}3jF(bPFrYMD&g&p zL~Ir0PAa$ekh}SEbZQ$!DD9H0T~fRvqqDIKii;h|Wbr@*|navK_Md3hVv3>N@3qwALoEOEM}6LZJ4%&fk93>JDlt zrF{J}8t>0j(~ulrPC3Du_}HJ4tWjjJRNpvO67vp|^W ziQ99V9NT;um8$6*N~v^xEtf1^SzH!dusGY6P|31hMHfxBHI=dXqe#qcItPYG8!mgQ zxUc0TERQ(-bq$_NN)UvL<)?)x*J{zK<)Jqu6`L$7zva_AXgf*JqM21agdm*?a}+xX z_7Mx0X{I}WP`S;HbQ!hdQU!^t60uUcr_y1rW%jj6pBl(o5=Umfh%2Qk?eol`$SaT9 z$kXDnR)dyVtZK1qY8UNJ0_3sQmyDLkcApwzQR*>Y26nvW+$#6s4_c~s6=5$KA7s>XJ%@$ zIPy6MykjWFSwZ@mlumM|YxOo{$hvRR#ntAZ!jk({V+_VqQqisxs6f|V&o~-v0o_Yk zg+zNw)fC!OUQd-o5qk2cJuslRe-Q#VPiOpqxT$MppgRCsU`pmMcQa9c%% zLq%;#5}^Gl;9tmvBwB5;&3}$P?rsvZRqJhuvP@h>UMz;nnnd~iI#e8^nMhWUDVIM1 z-HPI(I#NlbTBCY`0^)iuRZ|z^ZHr0Mm88O${{U2~1l!2kXfS3Kx9rfHN@c`0%+7Dr+nw9i3>3E54`n{B^gvwqN0rd)(cQ>DI!`m8KV9vTO~v zj(USERMEutx1^+S{#nf@Chhs0^ZqI7uTD9`Ak7$pnu!B~{B2m0HkVj5S14oP$`8zRXnIURfmzm;YOb@S*#HXWlF%r}I2_ZG6MW@NGXeywxNk&=aFiJ~;-XuiM> z>Wl1f#^PL8Qbstjib}y1TIy_#Dr{)&BnTC?i-d5>r{Ku7R73}#_X56G^kt=JG2t7um zDyL4jR`E(|r9KtoTvJD4)Eb(_fvB;0Z_Xb!&?Cu1D(g<25tgg-?J-3GDpm%Gq(r93 zgHb_2DwC@DnKHE)dYdrGMs_n@l)A(gN1d7lk(iZYg9|X0-Q>vTo>eJ8f)eE}FeyT9 zlAyR%nE^nnQLQx$nz-SuqSf)*p>lGC2Lwn?gG%hXP%x;ig((gbl*W|r$hlFaW2-nS z)`?dvb5FihxXmMfVoD8J5PNu&TAvc}tX3$!JE4ls2gawjv~f=1N|T;zbP?k}{{TGG zaQ!P0RPiDcCro+Gs_bE98uAQ%7|O=<`%0gpJ=DS&%>6Aaiy6|9Lb{U@-O5xl=}%>I zMKNt{cu;p~L+;s`rP@hZe=ld8;dSM6z0e$7?@O|3SdbBy(n$T_R!@=(jf z=drXsk%}BuTR;1Oj4_K=PD9qOuUN!yOLaa>~m@?OH zPN#EC-0vq%klKpDQc0x~l(H`>5~;6xE?Z4P6xafWzZGFINabF2Vnq1X4;*ok;*cid(+&A?+n^oOi;_D9oVc3hTyXTw9pPAqgnZhSh-W} zvO!CySjCjOHHd$_oEukV_Zr}Z}`1q|m%ARnS7BibPw!)vJ4FOzBJU)tcj+Pw}<(T2o>TSV)O}POFooV?eG0u4h%J zdtz#7Pg5}!wN{ZS);OY9HOYLX8BW^TeqlOw9a5c&+PjI;Dhz9ib5od@)$=sUF#E=h zyCH1JBjp=@T^jz2lyfN)ipS9}J}C5C8f`d=w}SU_eRh$`9D9fu&rZfUcu=gPuAJbX zGUT+OdKCF7Ttem9>&Bt1Iwi?9>Q2pabcneIAjH&KgFWW$a#bqrtqK^* za}!(JlE=sui-j@UR6RK5bf%D%S<1du%~f)zaaA%by<){s`?J$;Q)ArHU{z|Yt!^r5 zI}~XUoeCis(Txc7o>OI0KWMc}HkFKvz^P|wTUOv`Ri#bD7bAmWpBxn%YUMx#Sx0JH zJe8^>C%Ji7i?J(99h2gjI9$RNRcw<;{{SB)Sg1m&4&8orQOE_44c0=Mk?TrAn&js# ztae;AI?#B^;W(=BZDaavuU3Hqw!+S$#L&EoK!PW+SZ23Pr|tC<;`GK4qjuEgK2?pE z@=An~oYIKw<|rpt=i0~QIIEYz4Veq7v;Yd0Ll#ExCiYnBJebgtL434ias;Eb1(kAL zrvyUM+lpi=Dr!ooh0PRNnp1BgTCM*8rx*PAQL0a&T2B5-U^+XaeA)JXBBHgvwf*A}uK7_V*{bQyNyvrEmcy zjiU5j+nRAf%h~}}lZt{~L|2DVRg4^sFy-LUk)GnMw8I-!tdfwZtSPLgEvarOf^^7E zof`N^S13D5akU*4Vy2TAn;LX#-}eTTmJ_1dmIWRhl^^h1IwjyvsPgMt5q!uQx*dP)~v=wigDqVT#JjdQXU5!^gBLu5h$&ulz)wxZR>d`{Y>&291WO*2EZUB!Y<45}!Fd-Y#WHOs-c+)hY*)%{ z)ZCgfw^kYLqv*{neek-MBoUaoRKMaGiTsLcdQEXw>o_P1t2eBq1%Dz@ZqSKI5-3?- zW#(Lvs#H`I?Ln#w+8o=vP=_dK7N@l}WM?HZf{E&tLRG98RdJjTP{`8n3S*c?MyLe6 zIR>J{^css*Jc$X`ear1o#_~^$wbt`~-<{;L(g&y`(_yed$mAU3+@9P}2)S(nyu(de zSjhm7DD{VMo*Z{jwOo77726PRxgsPTGF-?n2IO1la`c`=?>VcEptUup8o(w@1o@l znpG<8TZvP0vhtyNxhJ5YzEkp!+=V@eBic5pXGgSh`VLR3LM1S*Ae>f^RAyISwO;O% z?)z=`IZ>!~`{h}><$owh6@gC0DQXaesn$CL6?t^Lc^%BHv-zsr7#>g*nR;kp*1Jsi)d{Dd7@@LVsF}1QMD~Aba00W_hYk0wbJX%}AD}2mxvj2g?@cMl+4Q!W5Lo%s zt+hM_r4ZV$i%~=Z2eh^mT&-KuwLa98hPV|g-WT!;T_G7L<8+0k6_t8bEZbB19XmJ* z`*fd}S8nY->Cq{xU7UzSE}3qC=}^>qfvshkwzj;9rC=iW$e88hD8itFYQ0UYXZlUNxp=jYYnEEJh+0%Sen*auK|;WKyn56*!HnMyQomGR?WM&vs3)S%%_zcvSWF{a-1Z2>M2pO}nHrf?X-#ruotot5 ztC=F4_Z0&alIa`jj3vgI0mg)H9wHsGnP=GA$>B?koi`vhX^>xKQN^)>)=^o@0;M4o z8nLxYoa)QPr3M_h(8HLWZu_~`w8l1E=Fw|pPR9Upl-16n^=J~lDNZ^;{iCW%j~=IQ zy5SW0%85%F*Jh@LMlfu$0K}zAoH3*k9XDQBFRp3@+TUabo%4C)= zC&k%2Je=mHu|7YcdfMi-*{)DGYMw#NU&^*-*sG-GsMFTdc`CMcqnk+HDhCwhZp&JZ za3PaXTm@RGv0i=#*!@8%M^0?jWeT`Dv1Qx-S7HgypK3Chd-iigDJ~L-Mm40ytbAMp zz}S$2%Y0TtI^^jV3L^9<`eXF1WON?W#Mn_ywJX%qbb)) zHdHbx5l-pRAhlSuvFOATLUMcic>e$>DC}t!3pQ&x&XkSXWmWJBkEWbennk8Y=~kICZc5_|P8%t;e(u!q?F@Q+Dmu!my|t=cDXh60 zTv5BU%PQaGK{l0(h{ibHfu%W$NK+(UU8pf-%O8f*TWl0!5w8?#MzzXjFa@CEGDBUp^9m3I;rNT|>x!%P)dquy6jQfnKE_UqLEG1GBVu!C&q zNYbaaxu;5vYOLX+d3JWV_5~HBR*-Tjs!gI*X8V#|2S}oWY1Px(oaDzQT`JSIqqVXK zSFfi%Mp2Ptu#b@Ax^Kp(%&PMSth|6aD+gUsko;pXyN%WY#`O7m_-xyYNxE88-ZgLg za&Pq*^+vY^{{W?olS?S&ieo^Ea>Z^>cCKw1R@0oCqGEDmQ)SZWh7INK9#Tw7hby#Z zSqL_WP_<0;JWFYb-M87L7pl_xhb8LPU3n9pp5){dtw44SMLoy3YAZ+;%d`XCmis-J zQ_~kpQyjXR7sbFPuOiyTWy2YM?#re`_T|~L6+O~ZBH9#6Wj!cs1st+QKgbDK8FZ~k z)+<+kQb2WQEZG#Z@E2tFU#OlG{aF3mD^=k~IYHL$3 zgb#TSW|ejOEGfyZ?X*z(7}o^k3Vhv)1p=$P+pVj28usyAliZq%yC0^L-?S)|@*2=6 z2PX82JvhZJL8}y@DX{Tv%AA`OZ{AZp3diICUn`S@f$GgN10v*cp^(RuvQ-_lWb3ju zV>U=*lbWjfR!1V^q#3l#bBLNmQ(C+$sQBim`eO{aF?qzR=KBGp{`k(x2PZ4)US*ahQ6 zeGF-#ZB;7O(pEnj=^O}+SjvFEkd0W(wX6C4s<~aM@`bLN_SBQ6*ebi4q?Iyt16r)) z6LUl;@?;4e$ww##7#W*0EcB1te zMQs9uka9i5tCDM%jYP$Xu_Hr2*c*#>=Y%z6E^;R#RJT2O)53wfQjcauEZ`|5Op{BB z#6$whL^(jLJqqV}2Yy>=8BmomIqR2gsZVD)JGPW-$c(FNYB`lmX>yYXq}bJ@6Qo>| zTA^muNwl(z{Sn(}1mWCvKR|mpB2!a>YH>k0u1kvA+6Uugg@o2~>EeRN8YBFsi;d?bZgRjiqGZI>p4D zW8O;c*A#0a)I#F4wu6v*C22-iFpjhlcXm+qUZ%|16w7*93tKI6lS`W9qLBi;>dlSz zD@YXbfKn~?DXm--4fI0N0Xc0o%V;?QoSvgnH8-(aM0O*#*3my;6WiMXH>WwO7+bkd zC0~NE3wd(^PkYnW8QevyyHgcXl7grTSx&1-r6ahkg>s{5PTFQiO5;x(5^PSz44MX1 z)gfHF6}1UZfkj_ryagfJo`##W$|=>9ZT9O3l{JEiP}kbD%^>dkT>Ao=6Pwrs^$=5H z+yV)-KR6eD`lF95QT=7{rKTn#k8Lh!HFE9AM%6nP1Xj~i-Pxr{_0rdRto0+iLy-y} z?sw@`YO#(4Se)!NJ~UHab&sIcC2hXWRjpFv4(?6F)3DH~wkA6{mgeSUbQ^U~Hp{0* zQd61&f3+g8i=2bZTO%}+lq{pk4 zHlH71+Z~NBSFv1CMpRz5xpu+hwz8Ky0IxgMd9-p9?N^sZdtuCR(Ru7+QjXCl6bfpF zROy$IPKfME3rXGSFlxnJBlPljn@ZjF9OrM!d$pA2Wh=+vBIuOCDcw~4{{|oMdVJ6Loid1Vd_~EoQYLzaU-bP#~D0fW&Z&B2jS`fp7h3r zQJjVBOW5v7msFCcNT{()-&~Z_sMO3vquHv3-7l5s_8&@D_=#rUW))@YNu@ZiBJw6D z1+^pl0-Ds=)8f}>IR__%O6A{Zt*xl+CrXdqjXR3S2HtCJoTo7TNZ^h$DqzSOYjc@>!#BvCzz1wQ+cD5%QPhCP@wjD$_p z+>_@{wx2Qzrb9~A#WjVs8hnZ8zSBYy1ow6W=pznnk)k_q*V9Rb5}bQ*T1`Z$CPC@W zO?rSShtwjE{J;Oi05lN*0R#a91OWsA0|WyB00RI400ILM1QH=J1rQS=K@=b|QDGxO zaRwDIfiqH(BtS!<|Jncu0RsU6KLPH0pRjDO@Ewq|I$K~I?uh>Yo1!}L$XQ~Am6f~7 z!8%^0{EEM{EIy(Gd}U;QWVLj>t@OEP#P2aDK3%FozpRO0(n_Yb6HH`bqR|YRwhfMDrf6)E2jQyIi9NmU+q5%884OAI)9J) zt@|)!40rOf;&Y`TqSN3k=j?_}EkxexzI!#ch8wxG_7-xB?Am+vC?PUBf|dR@25_GP zq}iL2rh(Y*(ofxD zl1nNmoa5-96wdV_Lx9ikQsaM2wL1a-0NJ|#0B4z?Iol|)8aCwyXljaMdR((3qo^Ue zaah1K>TgurtivQ z81G~we2$^Q8Zo1wH&bLi!D0>dxn(-SU{ku-0E<_EI9)6^$b6fu__RtuL3Er!r&;+~S)&=+Z*}$K zA>&@_Hyg%v4i%u=-BJy-(Porb*AR^GqQu64ZY^YDvEx)>NYZ3jj(Y$WvokabPnpuX z%7z~^G=Q->Lt1srq3O`E+brInQ4+<8izH4ia?-bIEq<-aBiUVS7Bi`vDT#k7Mi*0B zp^rfgD>3?Iq}M2+bjJP=U}Tiiq|6NUYLVtne(U?OB4`?lbcxPs0UuGPB zNm>-`0lHM@{{YaspCI?75$&X|me;x8!prE9wlgNJ)9|H@y2$lbM&0Acb2wPtOpnQB zbu%;tzbmGViCs=6&~i9!d;!fHh0}c@S#z1BE-R*DdE8CaEU9(GT6qeV3pLmwWJF_q zC^4gMIdL16U!{wdBaG`<(+P5bgrBA4%Ytw#3?dj zfQB$5HSQG7JcQiS__+WaR-YE?e2_&|ASf#B0rgVaiPYsTN4CmuZPZOKG!}<7np&Pq zT}4;zW8%JJP5UqJ0Y>4aODzqNdx>2T10f}K33RC*Tx|Eid~G!GY1lZqP4yI3UIVd? z{4eLQ*sM&_&6Mxd>+e>vu^%g{lzlfIA?~vBF<}1y#tO;G^7e)L9ciVxaOo;ojBYI| zkW^Phhg7<&h1BwVageq9YFVr@h8BxXW1F!E1&QE6H7lEM#v9@j`H@m)CpEM9>V$Fzv_SmWLjy1N`HU}iC% zuT#$yQTiTJhNoEdV1gv~Ndw0Ul&17uQ)Y)7Of}Jms-pdu=(+q__q-9EVSPD4X0MjQbIG$cX;W`+j z2myO1*=nBePiC`Hg9snYuNzyklR$8!ULV4cFBv64t&&wH%cbi+224DS9h)nFMa1*lrI$7Kx}&ufUBbrAd_^9i9z%4<6xjCaV)`jROX-Ulsmj;nRzFCd zUxhp-7wB^77+!a3cL8}IfNU0LR~o1(rScoEvkNQ4X>|du`p0JMcTi*F&cGB6`Z42O zVh6gM&B0J~_dk@tB4sY3@JefS71E(PDe55RI-VAEO=eJ8v9!fyWBy=#EKZM$AhP7% zodj*Bx|daf`i}c8yJCjTjpN$XusSoiT{|>0VxyGarl|6V7P8`G@fNi1v9RNgPwJap zOAAAMjQmyB>klNdKwP|*H3if&+V*JeYZIupDC*XBNSxSMY|_nCqJm2=s#8Zhq%_pv zZ`-$wwuuX;=I9zz`kx0E_QJIAY*XGfAP+rlj) zWA?*=B%;DSE>ZBljm#Q|SXk0b4uZ2-_H5;UV;V`IusSsk;!dvmc;tvvGc-*}SHCVj36}v1L4NHd3&#(fdZp(id~tyRMxz9VJNO_9z{E zteh6Sc_Za!J<+m?an;IW9DfzlStuUGG#7fE*Hh{L0Nz@%U#=CUW9LZ@!9S}??i86) zJbM&I*V+l46RoO_TS0P%q2or|a>&DcZ2tiBsZ5Z#7jl`L=E-M;G>#H#N2s~+_{#qP zC@e5v4$0V4J^M8?qd4wdzu5_GwaXu(v~ManQEAz!pf}fq=Co||8X^Xovv65Ee?>ko z6ZE-c&ez7)kA)n%531?VyhpA4tgKx|)Dnj5QF}qPlE%DSQ=xk)&q0=ibzx#*v@kj9 ze*k4QHz!MIg#)54*e4iSvdP8++u;}L^a@tdLJJy#4y5z99IRH;?5HzZMOx|@!LHQa z7YZqy&K5pk`B7!qS=elxYLAro%XTW2D1g*0V&+E^Lt3AnvU7eG6vtM|Rt%Wv@)VKi zb$yXZp~1@!IJVmjrGB$(4mL?3Yxq<2CYI{Pb=Shg{*CHb@A(QS+$353 zMbQd7DWx(SJ*ijef49w}%Udc?<33-&5}ga0?G78MF`o@<`B?79br*h07X!D#n;^jY zJSTNFvuj;PFU;+`2NA-HE=C?!4tRZTqs$dfPs7HLYG6}zJbA(K^07bD-UgjplCwY4 z^E8(Pa30Ui92XXBh8w94nI&53_ZT7n0195U@Q+-RO*Ks{nOoAr!fQ?CG^u)CG{WQA zX5+ROQ%$N+LS}Z5v7zt^3vs&C3HA#~y+dUioJX=Pcs4jvdvEf!1NkRC)E2n_wU>t; zPq_S+HZH$cEKF$PeUvBG-&9`byL4s!1j%)ZDjNhEh;SbJ-Q@WA)(&An&Q)8bj+QBwbkJD^D$uNc%4q+WMmc*D+(-+ zIxR2f;bmhw2bQ@~3nQn=3j~9Lx^{T46Zl<65+Uxwx;|ln+6T(W$B!k#O5850>wSKd z66kfI)Ew9PulEMa9k?v1TK+qD?Y5}^x_?Ozr9$ggPqR@1JqRx%RiBdGU zdMun)xz{4Ra40oQ13wiWGbC?2sqr9VNY}cW5*|QNbjhFj4VEr5quHT1AeQNHS#y}< z^a^76U1eh77ye+Zd;u5r7_}0tugPz!i9^x$I8MrBf~iUxcvVTOa+-ARn;pxjqXl~e zBrQBA`z8hAZ7A3PL|^0=)39!vrKL#b@|Yhs%NijIH(5D)ct%$}$hd{|Rw+i!^}S7% zdj$C}WeYTWsieMp>c6tnUr6=~72-YCCsbkDlkyu{fKTc^-plI(k0>enmXoDqxw7un zjgRJ&N}r}d6FJ>TDc!HWE=h&q30adCn^_n##!s%xS$qT))3eMj(s*4}t;%S7IZx?R zHJ(Mne^Dkc64gjeVv56s&-MwEwid3VJa0auycXl6DPt`Vf8C` zVxD6>{x+y^V~>B8t>e~^aU=ALn^aS*?aFLy91YZw7k)gZY~4R7IQF_)mZZUGjaw}y z_gB3pTeeNd3D8;*k-<)7g!d@p`9ec~ihDuaCy?;9G*Bt=G>dA9q1-HZ1VYsFDc`8l zhEUQ$SrUpAn&&6KYAM3E3MPV6-Wn(=Pssae66D7AiHkX zx_3@8(}|@v6Bq}|$NF~cLYEDMTuI@~=agT-0T=$(t`?^qg4BN&qhL@~dj&MU1N_J{C77;e(ce-vsV}F#=Nk<9p8oS~_3x&N$g@*5ilhK+*#;3-7 zM{)PkA8-X-B5$=S`)}jD(i`j+n(c_d`6#Tca_5Z!MbdI!%hIKR@ViUGrH2QWKomZr z!fQmTTyn$wD6;fypODE13Qf-CUdRgJal#y}!oQWBBc>uY3s7K7;~LtuX?B{~cq4N_ zVcmTr8M#xI>e*8fVBt75!*xIe9N*e&fnGq~6s`y1MFy@>!u=ANhVSk_{7%J>_eDfq z5hDKp?MUmZT8Hf!2Ns-Fpb?Dnm=}$wWZ3iq3VdxM!A^GDgxQ5`zb9G@1a4C#Ya2m6 zM>*6Jq95M0#ad}V2bV}hXG9+OUggv}W3l&c;a6iB15yEa-Opj)1Es@}6}{W6%tvE9 zhj+8uy9U~39M0XXQ1oU=4WG?rV?GDzcYc+I+=(g1f|DOa+7A}9@lHINRvdwjvYDP( z{Xs+54JTp$0JyL{+bH@jEJBSh_NK!oxVTQcrHVs&D=Z%#rtpg4Imi+6qwqXwr2J?a zEu}~RJ0O2cPM|`CgBXVax^Gh_@>AsrJ`@F!jYE|zrQD&XnnKU*fk;P2rzl!SlEiPd(sktt4z&)oo8RPAoh zkDrx~2a%ejQ{%Fb4&KFt;9_lr$2HBep7FxNYfj~42DJLB?ToQ!41F=5W%W;M zwo*;yY9U}hOSw@wuV#mCv+&F>+k^szk-rX|$}Q6UmK3d#x*Qi!#PGk@g$6UFG|-*W zN47C*O_U}TVP$B$YPD!Ae7C}RSsB7sQ5}Si z0<9g?GML?JX$C}8u(Kk?ZC2|ms_JTy+KDS3ZyLtQ62@EdvLSOHPVduSBicatSea#; zTFu60bbIo$G2aXHmE(6HEL@jE>Qn~Cprh(dY0~wP9xh8M!Diz9G=-q1N`D3PE+bNV zOHCfb_*mG}A7+J*GxYl=0U>dB{UF1ueiYcgNcP!A^B%=)@!L;rUkmvQP4cMHZ2Cn2 zhC`F2YsEQeuV()M*J7;I1;6Pr+oM2l%91y`g{|!5B6XWV;?#l67KHRRQN6@k_B*)_ zH81dpt&~{>r)B=&K%=_TZgYZ>`nC!Ou|7E6`0})|qMW9Mj%~MP9Hcgi6vNKR@@lWw zYfLS@)a}yyX9=N_Fu7ssZ{@<7zG*3|9|kx^rzx^Vs`y92BUIo5n9@{^d{4iGU#oG# zv-(u4yCtSq-FqrpRB@Rc8Wh;?hiL+2j$&~xD7(HCnjdQ~Bg*SN`d(0m({kh2vVw1r zrN)kO9714%Cf1O;iNuh8G=FOcF|0ZX*<`>ny_k1XiQpBk)13T=QBG-L-A9!}bv&Lz zsdVTBl378(Y&b>sH%`nVZyMC*yU2J8>fe>Kcuim%6&^dDJrm+BG**;#Ag;a@lfr2D z`9rl{$;~nBQ;+Ew+)#jzlsToq^;+!dD7*t)ty|GvJv+4!+ufJJg?*~TWOBaET)!+9h8uVHrk?*-#n}Ru6R*Kf4w>uR^TZa;dlds*`Uezpl-+M zT@?WhCV~zwI#eboH&W*7*+mp@6jo+2#&+B%zTLWE_4P#jNTYC!X$vLAt+V!0A9qj0 z6FS~@Ou@u<)ViKHf=X({e~v)q)Foz9b^L|=A%Z1?SmY-(j>RzPHje7M2T}*+V&>@l zipJ^|?JGAijR*Fc->GeUsUv)5is@54ze3N)bLIY;V05Ljgi0w;%6QI07%=1={7GI_2C1xC}(tgTAL$TR#(ELF6|3eIZfxgo@CiFJ+>$s zJE3!h&Gnr5<>>PKb?)iY*P@Nf>)+VzYftQb@@?Pi$yBrmacQ0EEl894K{ctxUZm$zAnfICJCrDJyoKJO zX=pnjx#0n0b*0VRFUV2lSFY&S${dtAU*&99;+^i^Q(jsr+om1X?%91YaH6~qZGwX} zSM4(y{{W=ycQxA20X3KYR{HdQlj~4&Aw7VPx#4>A2GkPc&1%(^0%!Pg&g>Y+uM< z@{1LBqz`OJ*(0g^ELbCrpVCgrYkgj_G1-yq#+4pZ@X2TtvbvO$1qAMm`j#$Fk+hFS zWRh6nOa7f`7Q&~2(Y&!1*FCLaPvUyYcBvdzH&b*`c$1BrP~uB3;1rm$Mfnc+cx{|> zx|#(ox;G3Yu4p7nw|V6yB=ogaHS>zZt?CD zni`zc(5rQafa$j=;l{y3mHysI*?ks)x{@8%{5cm7gwS~j$K_pxV$*EeKf={P6ML~1 zgTXzvPFMO)A0ZH*OIEH>Z_1Biq05L3)czTpe<=XPKsvvZc#jF4MZcu(qo`Ju|n$KbEvT@xD^q$z6MkjKy`jli+8Ew*AXvo&O)?66*4Yur5(3qV? zKN-zndS=BtbJ(m-uyNU-1(nn!obTQ_T^Y8ia@{ZHn0HXkZMA#f+vEy2QC?Kmozop1Uia7O}3I{_T#lQVhm>%8~ts1>iC0M=HZOUztsYXEo#Yg`DmcZDj z4I@ZQ_S6$U8c~AXg4nvkkJ;2yo*1tAS{r<*-Q)$XRD6MoC^5nIHlN@DWN9Z;Q(7Pe zMAN93Cbov4RzyBVfUzTn5$vLHkkbM^GWQ`%gytJeke*aCUd45c2E2I~oGZK#I#+0F z$mo;A&3vj%yIno-!vM3o>K#(tKT8ibCvrAjOBOkqvdPC0@OuXl!ftcJE9HGumv)^o z_)c@AJFI*?aR$h<@Y{}UuC;~I-ICow!DaN>ala)>iXl=gAy;OL;bG(&&_WCREn|dS z2g)0i55od{WP2)1l(kGX4M?WyKZrs%yWu)Vv6OcUr@f$g5B({#b$q8tT#JpM?}M_C z1F+pSw0)5k?8GVJ(QBUF(@vfdVY@_F-5O0?qp~Z6)B9L&Y-7}JvxA@Ux^}jTJ&wZD zzo^ZWlq*8~f9)9C{i-Io4b&|fi99DdJ$xx&r)F@PG>stgjSs~z04%3A+#T?q?L|i5 zMwDG%$(OFmbsd(XO?)piK&ba#2NP&GztEyxVXfhPTNJql_E;TL#wkbCp6~8QFcIvY z_>T#a($*zqEWVpAqFNL2q;D-;EO`uX4hkHidHG#S1TdKy!rUX0@+lV+%EQa?yLA-J znl+n=Adwc4%8D1s_zO*r+s zx@bG7dTftnY^CW^uxy_hXf~lFGlbC5ce;!Qw%mW|7JR6gt>LA003jZ{CcoCgjkHax z1c01;WZDf+lWid~G007E;FT|^SkgB6?ApE7Bsi`f+oOdOhxE2tanA|ggv^IE4EKDj zZ0j^s`LB%ZrOTE>xmSIl%XDg7rq2ocV#|Dd74>FD{{Slykxtz&DhZozcIaaLBevXr)=qngASrbdZdmy4nfe-@9Si94vHF8vG&x8BmX=I0!Hcdi zoZ?RE))<-lkHt0^<^KT4gkmvKw@UH1mo1MdlSmumg%sKp&ufmZ#+IOa2`gZOPsvqW zBEd>G55;O@N_&A?)|Xw1L)&7ga<-&i&lWR zMx<-1(@lgN0<(J4!@)$;v0%(M{W`&uH1OEVmr-(#$ zMc3P><}v|il_yyhvY$A}>!lA;)kQNm`A0pn3M)O)v+*3KbKR~jHWTD~`9EzYFu2oJ z7fO}R)a2YZgQ}4~39ZzNXsv6PBSC5XqrT_4q)qIa5eP=(!tvKVtzOIVDch?}D*NhR zDch#~gjhf#Ee};_4N0uhc20GQO+Wlvd}hc0027ap`ywd%pcB2fO+N{)_$pzlkLfi< zv#rW}*FV*$g?))YTBS;rD(xRv)yE0hY><1dp`^RhwRQuxl8Z}uO?ezFZlqhYmTaw) z+SBB{k8FHjD77vgjnNg_)Nso7YiidccT(he2K}VNk~Rqs1u_S}fT6^BJB26Yd*j0t zjNxVCc>S8OA#ASF;<{H!WDL1EMrhfxy!INT;LAB3oK~fPA zbhSm(Tw88(n*e^)(7B%-sYMZx&{1KvznYN5(LgD5ydn??l6&G$<0~UArL-0I>G>~X z^beKQ;Ly?Q{{Y15?b9nP2uh2mK?`?XMo3{{(iTjtarGVXax@e)$SGrEwj7<)vz~TN znAYkSkn1VgZg5ge=?V_NgbMgTIRHLTKPm367Ka__RTavulN>?>p5&^pg{1PDZD>G_ z*Gj=!Re-D>&K99y9H_FH7}-CmI<`_vMlPj4Dubi zYvY-|;b(N+KJlZn#*i@_u%(w*3w8cig}_}ER=$c|I)GT+8_EHDsb%yDVH%sbPGuS> zg~w=}q2b8La$-`%=+2icD4~#3`CThUBiv6aPOE<_KP|mGBrbbx zOxkrIJKEW7wkgqXXf+k2E*7nof`}ir%D%zdA@IEAht)ad=Ff7tPkC^p(%@>*3Kln# zvS%+ELXY`RmN4BQE9_I7r=HfavfRZUQzaC#@dI68qA60v>7r)drJ2*D$NoZ$>2iZ1 zuWpwGk<%l8vo=vV*xNZA-7;;$#p)n{30+$eul}rI7S||_{Wmi~(B&*pP3%@vn-jeP zc1Erjkh_%>50ubf?b6)^kAh?*JK+wR`~Lt6erl8+J_>@X)j4i~`!=-pkL~ZV3kDw} zR(2$jJN6Tt&`?Fy%4tKpXf4%jsa1BQ&@XiSINu+VG|Yn=X{qu#&eT@4U11j@Ekhle zDcDZ}!qZOQxpLMQ=de)p*Xi9pH%9F)MZJO?(m1r+zRg9B{JRgh6{TXs5saA=wltj> zt(E+Co_0yV?`e)8?532vyc3wp8O)uU3TI1u-D8E58}Xg7M>a#XqdSi%y4O$X@=fdw z1kRN3&&_ol38Qx7WJPj_T2mpB+y&DxWs%#X((&|vQD^kH*ngy;zyMo@>9L0XAvmVA zN9-2oaK4?6HsYkgiqv?|*ZnevH~zJeYj&7 zkLm>epN%N=*&c=~@>Af+64FyiX;Ae7(MvBQ%ADZ_-T`vCs3nDKYtG%mN z`&UW3qKVl-H?U~oWkaRSkUW!{4BZQdn%J$J5nji2|RnJ=DpskJJhC}yU=ih ze&AGDkB@~HRCmgMQ@x6n`pu~NGo_1L6qs^F`Rt;LTfhZ$_;Im@`?)))G;p#yhyv|R z)b%@s9&;^6oXe|D$ZOhdWw2|oqn*qY7P5I)Yo|chdz2ai*#ve?Zl`J~<4b*2({@qF z?gG|n2?^O+rAm~q_)L8(_zO|GTaU{_W55O(_}w7-Ph z34ci7NH-x!G`hafPY5+M>1ip}P-()=q^!)pGfQ5B^g6;h(jlDhl_aizVTi{=sD4O-(xRFCT6Za`94AWK zX6p~6JbTCxYZ|RzZ6u)w?KPsQPQ$=a`ZkE9P42vQY#|z?Q8a@!m7$H{YfXJGAt)fD z#%sj`x^aAGNkzb$?WNzO;+whM4;*j-$x@KlDV$yHN;g`Qg-NJQ=vOK*p6XHMh?%mM zQz5hg1rm5csi=0VPqzFoBTvtEHp<763~~IYbrw>}>Ll#c=a+BVK6g)zg|@^`VB`uI zTB6npnga*V6;ITpi^F*x^iGdBGekR z*J6W@!XTp5(MZ=QA`7=tM{)MyF{JRmng0N!Nr}87iBYeW91}ghicD!5L69g+1+_~i z7Pr}@YQENr-?pLMrj%KZZp&L=`7FFfhU#Lkwv{Ywmo!l;9(PvCP|4fv%FAQJXe?}C z>3!CJia%C`$z43h9Ajk*qI-B*IQ~W!l^iA#K;aX6FCe`rEkc&cP1`{?Zcqx9`~=V| z`CsKY?zNS>mW0r#tN*C& zOPuKwx7|k`qf6=7K2Zg~;SdlAtxZ6V=X4DsLfIDvjniI5sJ(~^IN@Q^<&h99wkaH2 zCX%gU<|CZ_1N02a0f6EoQ4?q~6hGIx}g#N;k5evP^%JWe4`<2KOaWWBb}`$XNMp zBTJLviPqp#+An2aVA)_}!hPlc0OE%uA5M_fqB40|xYj*NAJB4`nGKX0gS>5NShIt= zWVX7*PH($V$d~r8!>ZrPy6j4|W92uqTWD~Y1DpevUMOd?R+aLMiWi1%qM9iMIZp&b zc9cy!WvsiEXeeUG8#t`2aNXO&qyi4pWovRf?pLZVv=c&bS`%XfcPBh>)oST6S_B=+ zbb7Z6oYcvGeWa4V6w(}1o=NpbX6U5nSPeU%bh41znws;eW4lnIvg2b-DF|-lDBMBz zLFgjYr?EwU2$R4}jsF0o>sp9RlUH&TCbrPs29mTp^o(vB(xduV-9BkYs-LIL4=qe) zqMfqo@Z+82PwDuQkLm2PI&0$oLTN2c%6oW2sJtd-zDF#f?Z0zI8&TvsGht)qhbf-P zQ3RxciFJ9q4K)E7F0}+ zW~k)QSJJ;E4GLbKAs+7CJOFk~cBu5O5P2Jgi;{RLvzNMp9ghjkwx)_qF*-dpx-Cu} zobt8px{Q)mi{Td1EkGuwrxbThYNd^k$Qh_|Q}YXylZvEyMH;=9ozMYNDrK;0Y|g4c z9#nVox^|Y^oTq-bsTM4)jieFEm4lSq8>cu|vIlzq0OEaD38}D{#i-iGH>-{{Sog zRED=qX=_pT{{RWHwllK3-D%ZS6t4dO`r3>~PpzY&jpER84)p&3;&Z5KOn#w#p0uDT zMExeyGZ4=$+$r-st*0grWC9;%Mi!0YO`1k>hI^Cpp8gS;-znzM3O2pQn4suV%FC5c z(ENNUaUB|TPj2NkVaOw}vIEPl!9)hJX!QU9YXWXF^7nbAFG-Dq@=`a%?p5k5N{ytx zf@46XO05&{7OON9T7V%wK#T9OX3I%TZ73#edzALJc4}`ZwHAaMU5K?syB@`Vgi5Pb z+e$kX4in|vER25&nH6jh!f_VRnDh9#5lfWw{j0=XyNV}H!2`OaHYha!ie;)yI!cwE zR;G$WwWwv%o_AVp2+A$pHME@iUs0%fp>9KN+$NpWQ0!fMiTKbn;ZEI0)F9%+OBWIIpH+>}i1#lG=xMcfx`qjf z*3?iN(#Lxshxu7TS+}B{jUf0TZ)imMHu#4|tm^Y%N#|_*RX{%19 zRDh+X&=uQFpfs!PuA4}AD)&GjiB2FQ`b=bUM0IkT9-Wg#cBDaFIf2JhmRW0xZcC%t zJ1o3zuFASXeW^%A+Op^Dte#ahSm38WRSHh_YHKM-ONNxz*jJ}ybp!k_F1?g-yM-g0 z5Zjc?B$etKh%6T6^{z2^$Wt9#FmARD)OkUn;=+zS2n#!vCffv9Yf_JXP--z2@Agt5 zIg3rE$4DTAMan*(Bhl#Yu2<4K9omX+Q=Xjng0Rb6Y=x84*?W7!+@zeWM2vR&4{ORzm>Wp^qOmB7xJC_A}pZL z6(HT!cBQEjf$V~4(0~pIjn+JxLXulOo|;Xo>}6>9 zMEtj8*6QUN2iXRaI87jOhT~Hc911RTi3BD)b?o!G-B*w=3u?y8`LqCfXsyC~-2M~U zukun7-IN-J>p^kUQwEmO)Q<_g?uA+)m)gf@)w=3*C^a3Bkfs$Jw7;hHJQcf939hcx zx^5eMI-C}Bv>)lF=T|H1TH!@V8b1|0?W$4aIfm4IPPth*3~v$#PS z3E48&kpit>Vaf$+R-|_7zEp10$}WxDsNGv3`%*hnYpFfoDme|Kxm&7KsZuSp@5=ay9 z9xlIUgxn@LU88ZkVx)JI@>+J%gEXGNlu!i@#Gr~V949~EAs*-oTP`+M56bxE2k*My zl-D2bPL0hPhYL|WpxY=gJ7A1Rf%{Eme5Xj(jf!N%o!2SA6vk2Rd)lN}n+0;bRJ?TS zP6Q2|?L6c;_4vVGpk z%+ynw>P=}V3LT2B;zuJfJ1gv0C<3aH3j+(xci}e^78dRl`7tz8LVika|Dg11zP`sU#!`T2T(ciEN(Z7`2;RMVt>Df1l5WjUhG0{g$C#P{x3pq=2BH=;;s~uvocHjFCzN?x zCa|6paoktZ6$^9wNKWq3}P&?X^MoGY>j?iQQWK0^}AxKF(sSm<# zpo1+KmxzOF!}3sVA`_Sq2rw-nX3Js-clF&roYFi`1Z|OVKCKGm1;?e%5 z?OL?(fz%UPoyunWrWGo4y8wew728nZHrc{5IP8m41@M`RBfb-&(03@#A0CB=g*H>D zaGB9q&PvGXvFX^UaUZUfcwhS{;tkpJ+;E)wv>s0i%ezI`szb2v6pd)26pp3kLCQx0QQ1M-al&ZXNkIxjwOVs6HaboV zO478Wu%N$%xN<4L5SpnLqBM=xjgwiW)>WW;eN?iy)eJeMPQ&p8_5s-Nf(si!b-6`6 zBv1iN=m}RtZV`UBD{De)_Sr=64(bfOZl`dwGBm!Lc3w;QTT&dw0gy}3_U=<(` z??~)zNs?aLLBOs47q`lAO=T$}v|C6W)N;0{r#tkx2z{-Xu%>7J)V|Nz2weXFR;ap5 znmvl23MjcLwR?7?2VoH+)UMOQ4=0tWHObA?p3T!_po!F0jX^MJK-zp_w^pT&(_*Da z4!|lzDps{Bz0{6Of5Agltx2V9wSJSFN{not+f8S3B8+;hjKI&uWX$Kf?N`dywW|wt zj}xW!Y8VcQp2}8eDYE*~)It(C@}S*`#*`Ugidl_ub*Sbb?xVMlMTqd*)|_<}ELt{K z_Jc^MU=JMbrG&8Vig78eq}S;vO=yr%+|W?qle?7gX+Od+trUP%xcdrm-8F!Pq+ZJ! zQ5Bz*{P#IYBc5!i<2<9X-CFrs8${YpZLbw33+86JvCn z1m2eV-9G{CPl3%ri{%FQJ)@6Nr8GV+P=55Z{I8S(Eu;_#x|BxwM3!!YwFO`O46DYY`P8=FvwPJOMIFNWH3rNS$Li;#|S>kwSgclAgQ=cmCbg`>YVM02T@RI z`e3;|qq5snf*t8njFvjrkV@Jre^lN39xZE3)Zzk?Gmh&}=e)ahB!TVUw%xDoD6-1n zCVohT{#G;|S1De|#*msdIb^s-148mAH<-urxAN0%Eph!>{IeVPhgX9n+%d2EC}@c zn1;7CL6-Ll_)T}p1bnFHj;fTcA02>K_7$j(6pkeBf`c2%vLP}0m8a!HCX%Jg@^Y?< zjm2`Su>0w0quPSUb7PMFQ{Ab`BSy-~cBfi!a?wW6c&Z45&U7)vq8R8pf_-=m0x9cB&QOB9HQOOWukQKo-FL4#*yjx5``=zeo3f=Y#?ux)4y__ z@)I5tNOtQNr%5=rqtc{K#gT%XRKky7)u(k6eYa9SQjzq8ulQXjD1ck?qsr7YJxz$m zZpGr$vZ@`L@`BQ|s_sg(?o*q($MWB(Qsc=X)bw%O)b_g2X|&jae&SF6B|g4lUi+3*5>e>^6pA*$RDt(L$Taa3tsex+0San+AR##HK5uMIL z+^qtOw^p3fBhUaSB@jB)Szbr4DM7~3a%(kkhBJcDM{;{w)Cg3IRyl2e^dw*#DKZn} zwD$tJ?g&nD4@9e0QwlCY;u}|EivIf&oLvGG@tt#w3!m7T>4Jezv z{j`Yg8{7*){xoKJMYf*L(yqpkaT_33q+E=lI%VWd%#n@K6S7|Kp4c8DJ%Sk6@(tRL zN@Lxnrjz;$hX&S846*VP8b{=`-wBwH=8=WmAp@VV3A&i?;i*kT{b zGcc(PY1DXBsRUYpuEeLieUy0)ZpD2~ty+~JJ3Zha{bSV=T(2g{ue1UU6o^1B0@kfw z=!-#sD;@NwG*Z|o=!IWnjV*WB9^ura$nt;J*(^ortgpXHrAoWFS^G2+r;Wk9Asd&l zLxkcQohl^vq!UG^9V!ghwKp?Thp3RG&18a{rDI9;SkBUTMtVixD*{#>Mw1vNn^h?- z`zJF^Ghat=zB_M)rZ z3OiEql8Z=Gf+w}0!m9W|S}sz#MQ4=upbrVHDUI$z((Pb{n=4;h zP~|tVRDev!C7P4XaGKw|t5%u!3BM-5`hG$ zaRb=0aor2I?R|oBnmR$L%&yjgjuj3*t(p+&vizoDJ5?1F@xaX>C**l{34)~eMhIqa zsG_ptb555g1m6XDJ`;}0HWxWXjT}w4@}-@PPn%i=6WQIkSlH%svdQV? zr;~ z%>_>wYpf_HYyC)4Hk?P?_kz$7Unm4SxyhZeG4I^0seS^2PZ_lHQ}l{QFd($wb{Iag}?3LkBDBGDAJ{*ZR* zyP+8w(0BAULGLTn=r+Jd4tJ%LSr-K%6;fTgc=U1_9_*zaR^ zav~{sO^P;!H;aI!i&8LrP@3CpME)N$xvREm~HUp#8LuZIIZgvdec_ zc>+^?sZy@mlu+Cxqud4f@Q(iga7DB`53qJB)h!_qp|Q$^)SHz{E=c8${#49lt)-EO zSW#!~MYYo8QB9(Bt`k^VZ3AezVnEUTM{d5W;j7GCyszO5hj5IpUP4alIjCt;NDOK> zfDt>`K$5i}`&OQIRq~m+RC!m~uhNXpD*F^Z+CVDqJ93K+b{y`TlFFbIglaYR9@j`Xzl8>U5SMuFOj(y2n~&J{1gq>eLVc-fva~te z1!QuAue)R+INs=uAu;6|?aCsP2Dea08EQWWSU<{+FI`SjHNfgC4}$C28AQ$~qTuDI zl^&;Tp@E=(Q9ei-DwMi!)lvw#5SmftSwYlOt)|i3CIv`$Cv*bRi%P&Fa()&>n%t>2 zSFomK{?xSX(M^7mr8l|`?SFAib#9JhxKd?3?V_}xE9^h&CKz)OG203)`M&8rTGLIL2`jrvfwBp_SCj0g2ya*189(?pXEK;!74c%!KdLC z*RxT#1S79tSB=APRC80kkjY{%wH#s1v{l-0*$vi|T7gBT?NK9i0pT=#wb`k`HrlkG zlis^H_6W9$v=vuiET&<$t;cmd0lapkW8GJBf(hpS>-#UT?P~9^>{MrUG__6%^RiY^ z`)lq9Y!>vajnr=kbk?=aA zCOP*(3~w0RZk*!Mqm;N1)W)BbTc@>AS8Mn|zbYIz$+%uUI~Ao`FJ51S9rjwZJJ({0 zf<10hHH{Rc{u5A9N30^>gy`JO(`9f^khug;-(P(r*s4|BpS19p{{Z45g@hlr;WX~OoyvudbN>K^k&U2&)E(Fb6fF5pZ;y7U@(522l+ZxO zj@oZ4A>LOb3h~g{M&cbsImEh?*!GRnX;K5WK1-r1Ni~~RtrQxY_B_&QL$%TpUt*iN zOg=M7(pj`fD!XI9OO))~NYyOfLw|nX@*c$nXd4$Al418CV4 zR+U8sOHHb-#R1q4vaJTHuEhaL9Cts3E-`8Vw5fO96;^;mfQzsGB-+)xU>>g+*i<|i?% zYIChwTJ2hB92FN%FW%@Vx^yiG_)I)3oOccr;&CW?Bf2J*pioqYYE|}bxA{Zubi;)M zfq%CP>l^sDWc-CQi6}|%Q60!AH)O$FCmZ{MzpUt!yo zOOLX(QSbmy|ILn~O_f`0q0WLC&; z%A`R=l+k;qxq(?cD7oDgXm+|_gShJ^FJ z$*)D$h_uGn+XOyiN_>4Bc0X<#0k;)Ax{V>)egIcpfzoYFld3u>Zi2Oa&)D#T7U{of z`!XbRN{Vt&`v|`7aau)EF}qC!_7XPbG~UOxA+qwh$7LI-ww~qB2whPr)HYE`TO*R@ z?4p}i$-Su*N?;edpg8Omc6ixY9HQsm!A9x+PRJ*e)Jk-~L>d!^s?vZ>VhUFv?bhj` z5lA@?uspYg=G%Y0uPg*F=de#V-qGCzO1|`~wV>qW5kvkL#2w0O0RI4i*RfK9LWPn6 z?72X0tFdc}1N0F-iu8*s>SJ!@YGd~c#X`ajrJ#JKu{EnowAl40#2e3UQ%Bp+DY4eb z4#iqK3r=&Nus}F17Ml_sq=!!PPB*Yx6x{E^EB3qtM~CMy=?nt zeOvMLW^XVyVxUnKaV>D8GOa&#%S!GQ=XVMwpHp6>Wn(P5#hXz+y7%`9&ffG(YoBf08-Xf;=F%xLV`~6Wi-j)cq6|fJ? z0|GG2Ly`4r^&OPmDe4wla0IO7V+@I@aY~Rp&YfL@-cJyMT4Nrz{jpWF_ip$wbI;OF zCZkiAWg=?yqSZ5`8wLHcd`%_%n%~S3)DbDGYWiKLS6(KsPW6uMenish2&fy+F)R); zzP(FHZPsJ?XH2E(KJTL*l{0r6GMme}Q!_uLDn~I+eJot@0t8+q{{X*{@j6gc%87NW zTIHpB{W|@#QPgf>n*2uBSgx{;sxymtmi78WZB9(PU46^D;%Y-%w;al7S5mAwns)5n z+Ax_~obEGOsKD4f{b%U4uqKs!v4y@S?r{e{?)669fFSoO+4z=qTT!vw;%WM&R`KA# zN0IeeTE7h|(<&T~TXf;uF|}QTwdR`fa&8cxqS`|VKxN?ii`%`h_?ewUUwvO-;!y8@ zHVC>#!J3YpWmYZKK)RZrxMq{A?tb0F23un@0KOtOuCS_BNu5JicA$kEPJr*Qt)8ra zz_|6?JbD>Y5xC2>{{W@6iHBROcHO#k`|NRtg3x$_iDkP+VAWUhW}@6yNQT@g%+TsP zTdZky{r28Z5Yo)&WPa@@`bX3vsV=a#!S+t)!Q%A3j}_ar;{rG0Mj?S#IDt_Wqk+Mco~`Q+*ry0s;(xU z?�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�GujEc@}ZADFrlw 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 Date: Sun, 29 Nov 2015 17:41:47 +0100 Subject: [PATCH 06/12] Allow to use QML imports shipped in the qrc file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds qrc://imports to the paths that the Qml engine considers for findings import plugins. This change makes loading the mobilecomponents plugin work (it won't be found otherwise). Signed-off-by: Sebastian Kügler --- subsurface-mobile-helper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/subsurface-mobile-helper.cpp b/subsurface-mobile-helper.cpp index e982760f8..e2b32d3b2 100644 --- a/subsurface-mobile-helper.cpp +++ b/subsurface-mobile-helper.cpp @@ -31,6 +31,7 @@ void run_ui() qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLManager"); qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLProfile"); QQmlApplicationEngine engine; + engine.addImportPath("qrc://imports"); DiveListModel diveListModel; QSortFilterProxyModel *sortModel = new QSortFilterProxyModel(0); sortModel->setSourceModel(&diveListModel); From 6ffef818a8d34fdc8aef70c3515c2b91d8d297ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 17:43:56 +0100 Subject: [PATCH 07/12] Rework central navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch is the part implementing the drawers and in-app page navigation. In more detail: - main.qml uses the mobilecomponents plugin and the APIs as already changed in the other components - The extended properties have moved into the root item (for now, they'll get properly encapsulated later) - A menu can be swiped in from the left - The application makes better use when used horizontally (if there's enough space, so depending on the display you can get divelist and -details next to each other, one phone/portrait formfactor, the layout stays in a single column. - The options for GPS have been grouped into a submenu This change follows the Plasma mobile human interface guidelines. These changes are actually relatively small considered what they're doing, most of the logic is encapsulated in mobilecomponents' PageRow and *Drawer classes. The previous navigation pattern is actually a subset of this one, so it still works. Signed-off-by: Sebastian Kügler --- qt-mobile/qml/main.qml | 140 ++++++++++++++++++++++++++++++++++------- 1 file changed, 118 insertions(+), 22 deletions(-) diff --git a/qt-mobile/qml/main.qml b/qt-mobile/qml/main.qml index c3117b9d5..0feaa002e 100644 --- a/qt-mobile/qml/main.qml +++ b/qt-mobile/qml/main.qml @@ -1,4 +1,4 @@ -import QtQuick 2.3 +import QtQuick 2.4 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Window 2.2 @@ -6,29 +6,125 @@ import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 import org.subsurfacedivelog.mobile 1.0 -import "qrc:/qml/theme" as Theme +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents - -Window { +MobileComponents.ApplicationWindow { title: qsTr("Subsurface mobile") property bool fullscreen: true property alias messageText: message.text + + property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) + property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) + + FontMetrics { + id: fontMetrics + } + visible: true - Theme.Units { - id: units + globalDrawer: MobileComponents.GlobalDrawer{ + title: "Subsurface" + titleIcon: "qrc:/qml/subsurface-mobile-icon.png" - property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) - property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) + bannerImageSource: "dive.jpg" + actions: [ + Action { + text: "Preferences" + onTriggered: { + stackView.push(prefsWindow) + } + }, + Action { + text: "Load Dives" + onTriggered: { + manager.loadDives(); + } + }, + + Action { + text: "Download Dives" + onTriggered: { + stackView.push(downloadDivesWindow) + } + }, + + Action { + text: "Add Dive" + onTriggered: { + manager.addDive(); + stackView.push(detailsWindow) + } + }, + + Action { + text: "Save Changes" + onTriggered: { + manager.saveChanges(); + } + }, + + MobileComponents.ActionGroup { + text: "GPS" + Action { + text: "Run location service" + checkable: true + checked: manager.locationServiceEnabled + onToggled: { + manager.locationServiceEnabled = checked; + } + } + Action { + text: "Apply GPS data to dives" + onTriggered: { + manager.applyGpsData(); + } + } + + Action { + text: "Send GPS data to server" + onTriggered: { + manager.sendGpsData(); + } + } + + Action { + text: "Clear stored GPS data" + onTriggered: { + manager.clearGpsData(); + } + } + }, + + Action { + text: "View Log" + onTriggered: { + stackView.push(logWindow) + } + }, + + Action { + text: "Theme Information" + onTriggered: { + stackView.push(themetest) + } + } + ] } - - Theme.Theme { - id: theme - /* Added for subsurface */ - property color accentColor: "#2d5b9a" - property color accentTextColor: "#ececec" - } +// MobileComponents.Units { +// id: units +// +// property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) +// property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) +// +// } +// +// MobileComponents.Theme { +// id: theme +// /* Added for subsurface */ +// property color accentColor: "#2d5b9a" +// property color accentTextColor: "#ececec" +// } Menu { id: prefsMenu @@ -138,7 +234,7 @@ Window { ColumnLayout { id: awLayout anchors.fill: parent - spacing: units.gridUnit / 2 + spacing: MobileComponents.Units.gridUnit / 2 Rectangle { id: detailsPage @@ -148,7 +244,7 @@ Window { DiveList { anchors.fill: detailsPage id: diveDetails - color: theme.backgroundColor + color: MobileComponents.Theme.backgroundColor } } @@ -156,14 +252,14 @@ Window { id: messageArea height: childrenRect.height Layout.fillWidth: true - color: theme.backgroundColor + color: MobileComponents.Theme.backgroundColor Text { id: message - color: theme.textColor + color: MobileComponents.Theme.textColor wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere - styleColor: theme.textColor - font.pointSize: units.smallPointSize + styleColor: MobileComponents.Theme.textColor + font.pointSize: MobileComponents.Units.smallPointSize } } } @@ -201,6 +297,6 @@ Window { } Component.onCompleted: { - print("units.gridUnit is: " + units.gridUnit); + print("MobileComponents.Units.gridUnit is: " + MobileComponents.Units.gridUnit); } } From 5e5c9830a48e8f9c0a376863b4fa17c7f5056af3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 18:56:21 +0100 Subject: [PATCH 08/12] Sync with upstream mobilecomponents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This updates to the state of bf7914b67c45e Signed-off-by: Sebastian Kügler --- qt-mobile/qml/mobilecomponents/Page.qml | 4 ---- qt-mobile/qml/mobilecomponents/PageRow.qml | 11 +++++++++-- qt-mobile/qml/mobilecomponents/Units.qml | 2 +- .../qml/mobilecomponents/private/ActionButton.qml | 12 ++++++++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/qt-mobile/qml/mobilecomponents/Page.qml b/qt-mobile/qml/mobilecomponents/Page.qml index 53cb04e2a..43ec43a49 100644 --- a/qt-mobile/qml/mobilecomponents/Page.qml +++ b/qt-mobile/qml/mobilecomponents/Page.qml @@ -59,10 +59,6 @@ Rectangle { target: flickable property real oldContentY: flickable.contentY onContentYChanged: { - print(flickable.contentY+" "+actionButton.transform[0] ) - if (flickable.atYBeginning || flickable.atYEnd) { - return; - } actionButton.transform[0].y = Math.min(actionButton.height, Math.max(0, actionButton.transform[0].y + (flickable.contentY - oldContentY))); oldContentY = flickable.contentY; diff --git a/qt-mobile/qml/mobilecomponents/PageRow.qml b/qt-mobile/qml/mobilecomponents/PageRow.qml index 941f77f73..4d6adf5a7 100644 --- a/qt-mobile/qml/mobilecomponents/PageRow.qml +++ b/qt-mobile/qml/mobilecomponents/PageRow.qml @@ -82,6 +82,7 @@ Item { // Returns the page instance. function push(page, properties, immediate) { + scrollAnimation.running = false; var item = Engine.push(page, properties, false, immediate) scrollToLevel(depth) return item @@ -93,6 +94,7 @@ Item { // Returns the page instance that was popped off the stack. function pop(page, immediate) { + scrollToLevel(depth-1); return Engine.pop(page, immediate); } @@ -100,6 +102,7 @@ Item { // See push() for details. function replace(page, properties, immediate) { + scrollAnimation.running = false; var item = Engine.push(page, properties, true, immediate); scrollToLevel(depth) return item @@ -128,8 +131,8 @@ Item { } var firstLevel = Math.max(0, level - mainFlickable.width/columnWidth + 1); - scrollAnimation.to = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth+1000)) - scrollAnimation.running = true + scrollAnimation.to = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth)); + scrollAnimation.running = true; } SequentialAnimation { @@ -173,6 +176,10 @@ Item { } } + onWidthChanged: { + var firstLevel = Math.max(0, depth - mainFlickable.width/columnWidth + 1); + mainFlickable.contentX = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth)); + } Component.onCompleted: { internal.completed = true if (initialPage && depth == 0) diff --git a/qt-mobile/qml/mobilecomponents/Units.qml b/qt-mobile/qml/mobilecomponents/Units.qml index 971336301..8b5032a71 100644 --- a/qt-mobile/qml/mobilecomponents/Units.qml +++ b/qt-mobile/qml/mobilecomponents/Units.qml @@ -81,7 +81,7 @@ QtObject { * use theme.mSize(theme.defaultFont), units.smallSpacing and units.largeSpacing. * The devicePixelRatio follows the definition of "device independent pixel" by Microsoft. */ - property real devicePixelRatio: Screen.devicePixelRatio + property real devicePixelRatio: fontMetrics.height / fontMetrics.font.pointSize /** * units.longDuration should be used for longer, screen-covering animations, for opening and diff --git a/qt-mobile/qml/mobilecomponents/private/ActionButton.qml b/qt-mobile/qml/mobilecomponents/private/ActionButton.qml index 5bf6ab086..bfc8c5875 100644 --- a/qt-mobile/qml/mobilecomponents/private/ActionButton.qml +++ b/qt-mobile/qml/mobilecomponents/private/ActionButton.qml @@ -73,10 +73,18 @@ MouseArea { } } } + Connections { + target: button.parent + onWidthChanged: button.x = button.parent.width/2 - button.width/2 + } onXChanged: { if (button.pressed) { - globalDrawer.position = Math.min(1, Math.max(0, (x - button.parent.width/2 + button.width/2)/globalDrawer.contentItem.width)); - contextDrawer.position = Math.min(1, Math.max(0, (button.parent.width/2 - button.width/2 - x)/contextDrawer.contentItem.width)); + if (globalDrawer) { + globalDrawer.position = Math.min(1, Math.max(0, (x - button.parent.width/2 + button.width/2)/globalDrawer.contentItem.width)); + } + if (contextDrawer) { + contextDrawer.position = Math.min(1, Math.max(0, (button.parent.width/2 - button.width/2 - x)/contextDrawer.contentItem.width)); + } } } From 8fad349c82b0f681d6daa95bcfe843e806b48dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 19:09:59 +0100 Subject: [PATCH 09/12] new container for extended theme properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the properties we previously added to units and theme into their own container. This encapsulates these things that belong together and allows us to move it out later without many problems. Also, litter the global namespace a bit less. Signed-off-by: Sebastian Kügler --- qt-mobile/qml/main.qml | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/qt-mobile/qml/main.qml b/qt-mobile/qml/main.qml index 0feaa002e..5f4cdd352 100644 --- a/qt-mobile/qml/main.qml +++ b/qt-mobile/qml/main.qml @@ -13,9 +13,6 @@ MobileComponents.ApplicationWindow { property bool fullscreen: true property alias messageText: message.text - property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) - property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) - FontMetrics { id: fontMetrics } @@ -111,20 +108,14 @@ MobileComponents.ApplicationWindow { } ] } -// MobileComponents.Units { -// id: units -// -// property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) -// property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) -// -// } -// -// MobileComponents.Theme { -// id: theme -// /* Added for subsurface */ -// property color accentColor: "#2d5b9a" -// property color accentTextColor: "#ececec" -// } + + QtObject { + id: subsurfaceTheme + property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5) + property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.7) + property color accentColor: "#2d5b9a" + property color accentTextColor: "#ececec" + } Menu { id: prefsMenu From 6580f078d0ae1d912d9a6b12e2769060b4c77f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 19:21:27 +0100 Subject: [PATCH 10/12] Fix reference errors caused by moving properties around MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes things like accent(Text)Color and our two custom point sizes for fonts resolve correctly again. Signed-off-by: Sebastian Kügler --- qt-mobile/qml/CloudStorage.qml | 2 +- qt-mobile/qml/DiveDetails.qml | 2 +- qt-mobile/qml/DiveList.qml | 4 ++-- qt-mobile/qml/Preferences.qml | 4 ++-- qt-mobile/qml/TopBar.qml | 8 ++++---- qt-mobile/qml/main.qml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/qt-mobile/qml/CloudStorage.qml b/qt-mobile/qml/CloudStorage.qml index 3b94aa5e6..897ebfcee 100644 --- a/qt-mobile/qml/CloudStorage.qml +++ b/qt-mobile/qml/CloudStorage.qml @@ -22,7 +22,7 @@ Item { Label { text: "Cloud credentials" Layout.bottomMargin: MobileComponents.Units.largeSpacing - font.pointSize: MobileComponents.Units.titlePointSize + font.pointSize: subsurfaceTheme.titlePointSize Layout.columnSpan: 2 } diff --git a/qt-mobile/qml/DiveDetails.qml b/qt-mobile/qml/DiveDetails.qml index 5b597a0df..401921c9f 100644 --- a/qt-mobile/qml/DiveDetails.qml +++ b/qt-mobile/qml/DiveDetails.qml @@ -44,7 +44,7 @@ Item { Label { Layout.columnSpan: 2 - font.pointSize: MobileComponents.Units.titlePointSize + font.pointSize: subsurfaceTheme.titlePointSize text: "Dive " + number + " (" + date + ")" } diff --git a/qt-mobile/qml/DiveList.qml b/qt-mobile/qml/DiveList.qml index 2a9c53de6..e0c8f4251 100644 --- a/qt-mobile/qml/DiveList.qml +++ b/qt-mobile/qml/DiveList.qml @@ -68,7 +68,7 @@ Rectangle { text: date opacity: 0.6 color: MobileComponents.Theme.textColor - font.pointSize: smallPointSize + font.pointSize: subsurfaceTheme.smallPointSize anchors { right: parent.right top: parent.top @@ -156,7 +156,7 @@ Rectangle { leftMargin: MobileComponents.Units.smallSpacing right: parent.right } - color: MobileComponents.Theme.accentColor + color: subsurfaceTheme.accentColor } } } diff --git a/qt-mobile/qml/Preferences.qml b/qt-mobile/qml/Preferences.qml index 1e1274e21..8cae95ff0 100644 --- a/qt-mobile/qml/Preferences.qml +++ b/qt-mobile/qml/Preferences.qml @@ -23,7 +23,7 @@ Item { Label { text: "Cloud credentials" Layout.bottomMargin: MobileComponents.Units.largeSpacing - font.pointSize: MobileComponents.Units.titlePointSize + font.pointSize: subsurfaceTheme.titlePointSize Layout.columnSpan: 2 } @@ -76,7 +76,7 @@ Item { Label { text: "Subsurface GPS data webservice" Layout.bottomMargin: MobileComponents.Units.largeSpacing - font.pointSize: MobileComponents.Units.titlePointSize + font.pointSize: subsurfaceTheme.titlePointSize Layout.columnSpan: 2 } diff --git a/qt-mobile/qml/TopBar.qml b/qt-mobile/qml/TopBar.qml index 43a5ad6af..f07a88e47 100644 --- a/qt-mobile/qml/TopBar.qml +++ b/qt-mobile/qml/TopBar.qml @@ -13,7 +13,7 @@ Rectangle { property bool goBack: (stackView.depth > 1) - color: MobileComponents.Theme.accentColor + color: subsurfaceTheme.accentColor Layout.minimumHeight: MobileComponents.Units.gridUnit * 2 + MobileComponents.Units.largeSpacing Layout.fillWidth: true Layout.margins: 0 @@ -47,7 +47,7 @@ Rectangle { font.pointSize: MobileComponents.Units.fontMetrics.font.pointSize * 1.5 verticalAlignment: Text.AlignBottom Layout.fillWidth: false - color: MobileComponents.Theme.accentTextColor + color: subsurfaceTheme.accentTextColor } } Item { @@ -63,11 +63,11 @@ Rectangle { style: ButtonStyle { background: Rectangle { implicitWidth: MobileComponents.Units.gridUnit * 2 - color: MobileComponents.Theme.accentColor + color: subsurfaceTheme.accentColor } label: Text { id: txt - color: MobileComponents.Theme.accentTextColor + color: subsurfaceTheme.accentTextColor font.pointSize: MobileComponents.Units.fontMetrics.font.pointSize * 2 font.bold: true text: control.text diff --git a/qt-mobile/qml/main.qml b/qt-mobile/qml/main.qml index 5f4cdd352..ac2e3eefd 100644 --- a/qt-mobile/qml/main.qml +++ b/qt-mobile/qml/main.qml @@ -250,7 +250,7 @@ MobileComponents.ApplicationWindow { color: MobileComponents.Theme.textColor wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere styleColor: MobileComponents.Theme.textColor - font.pointSize: MobileComponents.Units.smallPointSize + font.pointSize: subsurfaceTheme.smallPointSize } } } From 3d3fce7152d2748818a668e4b3380f38541adca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Sun, 29 Nov 2015 21:24:55 +0100 Subject: [PATCH 11/12] Sync to mobilecomponents 67cf594b4ddc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sebastian Kügler --- qt-mobile/qml/mobilecomponents/ListItemWithActions.qml | 2 +- qt-mobile/qml/mobilecomponents/Page.qml | 2 +- qt-mobile/qml/mobilecomponents/Theme.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml b/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml index 9d54fda24..97eba1c71 100644 --- a/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml +++ b/qt-mobile/qml/mobilecomponents/ListItemWithActions.qml @@ -18,7 +18,7 @@ */ import QtQuick 2.1 -import QtQuick.Layouts 1.3 +import QtQuick.Layouts 1.2 import QtQuick.Controls 1.0 import org.kde.plasma.mobilecomponents 0.2 import QtGraphicalEffects 1.0 diff --git a/qt-mobile/qml/mobilecomponents/Page.qml b/qt-mobile/qml/mobilecomponents/Page.qml index 43ec43a49..784ce8037 100644 --- a/qt-mobile/qml/mobilecomponents/Page.qml +++ b/qt-mobile/qml/mobilecomponents/Page.qml @@ -18,7 +18,7 @@ */ import QtQuick 2.1 -import QtQuick.Layouts 1.3 +import QtQuick.Layouts 1.2 import org.kde.plasma.mobilecomponents 0.2 import "private" diff --git a/qt-mobile/qml/mobilecomponents/Theme.qml b/qt-mobile/qml/mobilecomponents/Theme.qml index 07bb561bd..fd8c49ba2 100644 --- a/qt-mobile/qml/mobilecomponents/Theme.qml +++ b/qt-mobile/qml/mobilecomponents/Theme.qml @@ -36,7 +36,7 @@ QtObject { property color textColor: Qt.rgba(0,0,0, 0.54) property color highlightColor: "#2196F3" - property color backgroundColor: "#f3f3f3" + property color backgroundColor: "#eff0f1" property color linkColor: "#2196F3" property color visitedLinkColor: "#2196F3" From 32219f127634b7783b3967d94e35faeff36b51ef Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Sun, 29 Nov 2015 21:13:57 +0100 Subject: [PATCH 12/12] Port the page navigation to ApplicationWindow's one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ApplicationWindow component has an internal PageRow for the management of the application's pages, use that instead of an own StackView. Use shared components for common things in the app ListItem for the dive list Page for application pages, for correct background color and moving of the action button Signed-off-by: Marco Martin Signed-off-by: Sebastian Kügler --- qt-mobile/qml/DiveDetails.qml | 211 +++++++++++++++-------------- qt-mobile/qml/DiveList.qml | 92 ++++++------- qt-mobile/qml/main.qml | 77 +++++------ qt-mobile/qml/mobile-resources.qrc | 1 + 4 files changed, 191 insertions(+), 190 deletions(-) diff --git a/qt-mobile/qml/DiveDetails.qml b/qt-mobile/qml/DiveDetails.qml index 401921c9f..e69d0e672 100644 --- a/qt-mobile/qml/DiveDetails.qml +++ b/qt-mobile/qml/DiveDetails.qml @@ -3,13 +3,14 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 -import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 +import org.kde.plasma.mobilecomponents 0.2 as MobileComponents -Item { +MobileComponents.Page { id: diveDetailsWindow width: parent.width objectName: "DiveDetails" + flickable: flick property string location property string dive_id @@ -30,120 +31,130 @@ Item { Flickable { id: flick anchors.fill: parent - contentHeight: parent.height + contentHeight: content.height clip: true - ColumnLayout { - width: parent.width - spacing: 8 + Item { + id: content + width: flick.width + height: contentRect.height + MobileComponents.Units.smallSpacing * 2 - - GridLayout { - id: editorDetails - width: parent.width - columns: 2 - - Label { - Layout.columnSpan: 2 - font.pointSize: subsurfaceTheme.titlePointSize - text: "Dive " + number + " (" + date + ")" + ColumnLayout { + anchors { + left: parent.left + right: parent.right + top: parent.top + margins: MobileComponents.Units.smallSpacing } + spacing: MobileComponents.Units.smallSpacing - Item { - Layout.columnSpan: 2 - Layout.fillWidth: true - Layout.preferredHeight: qmlProfile.visible ? qmlProfile.height : profileHideButton.height - QMLProfile { - id: qmlProfile - height: MobileComponents.Units.gridUnit * 25 - anchors { - top: parent.top - left: parent.left - right: parent.right - } - //Rectangle { color: "green"; opacity: 0.4; anchors.fill: parent } // used for debugging the dive profile sizing, will be removed later + + GridLayout { + id: editorDetails + width: parent.width + columns: 2 + + MobileComponents.Heading { + Layout.columnSpan: 2 + text: "Dive " + number + " (" + date + ")" } - Button { - id: profileHideButton - anchors { - right: parent.right - top: parent.top + + Item { + Layout.columnSpan: 2 + Layout.fillWidth: true + Layout.preferredHeight: qmlProfile.visible ? qmlProfile.height : profileHideButton.height + QMLProfile { + id: qmlProfile + height: MobileComponents.Units.gridUnit * 25 + anchors { + top: parent.top + left: parent.left + right: parent.right + } + //Rectangle { color: "green"; opacity: 0.4; anchors.fill: parent } // used for debugging the dive profile sizing, will be removed later } - text: "Hide Dive Profile" - onClicked: { - qmlProfile.visible = !qmlProfile.visible - if (qmlProfile.visible) { - text = "Hide Dive Profile" - } else { - text = "Show Dive Profile" + Button { + id: profileHideButton + anchors { + right: parent.right + top: parent.top + } + text: "Hide Dive Profile" + onClicked: { + qmlProfile.visible = !qmlProfile.visible + if (qmlProfile.visible) { + text = "Hide Dive Profile" + } else { + text = "Show Dive Profile" + } } } } - } - Label { - text: "Location:" - } - TextField { - id: txtLocation; text: location; - Layout.fillWidth: true - } + Label { + text: "Location:" + } + TextField { + id: txtLocation; text: location; + Layout.fillWidth: true + } - Label { - text: "Air Temp:" - } - TextField { - id: txtAirTemp - text: airtemp - Layout.fillWidth: true - } + Label { + text: "Air Temp:" + } + TextField { + id: txtAirTemp + text: airtemp + Layout.fillWidth: true + } - Label { - text: "Water Temp:" - } - TextField { - id: txtWaterTemp - text: watertemp - Layout.fillWidth: true - } + Label { + text: "Water Temp:" + } + TextField { + id: txtWaterTemp + text: watertemp + Layout.fillWidth: true + } - Label { - text: "Suit:" + Label { + text: "Suit:" - } - TextField { - id: txtSuit - text: suit - Layout.fillWidth: true - } + } + TextField { + id: txtSuit + text: suit + Layout.fillWidth: true + } - Label { - text: "Buddy:" - } - TextField { - id: txtBuddy - text: buddy - Layout.fillWidth: true - } + Label { + text: "Buddy:" + } + TextField { + id: txtBuddy + text: buddy + Layout.fillWidth: true + } - Label { - text: "Dive Master:" - } - TextField { - id: txtDiveMaster - text: divemaster - Layout.fillWidth: true - } + Label { + text: "Dive Master:" + } + TextField { + id: txtDiveMaster + text: divemaster + Layout.fillWidth: true + } - Label { - text: "Notes:" - } - TextEdit{ - id: txtNotes - text: notes - focus: true - Layout.fillWidth: true - Layout.fillHeight: true - selectByMouse: true - wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere + Label { + text: "Notes:" + } + TextEdit{ + id: txtNotes + text: notes + focus: true + Layout.fillWidth: true + Layout.fillHeight: true + selectByMouse: true + wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere + } } } } diff --git a/qt-mobile/qml/DiveList.qml b/qt-mobile/qml/DiveList.qml index e0c8f4251..75f4f809e 100644 --- a/qt-mobile/qml/DiveList.qml +++ b/qt-mobile/qml/DiveList.qml @@ -6,37 +6,37 @@ import QtQuick.Dialogs 1.2 import org.kde.plasma.mobilecomponents 0.2 as MobileComponents import org.subsurfacedivelog.mobile 1.0 -Rectangle { +MobileComponents.Page { id: page objectName: "DiveList" + color: MobileComponents.Theme.viewBackgroundColor + flickable: diveListView Component { id: diveDelegate - Item { + MobileComponents.ListItem { id: dive + enabled: true + checked: diveListView.currentIndex == model.index property real detailsOpacity : 0 - width: diveListView.width - MobileComponents.Units.smallSpacing - height: childrenRect.height + //When clicked, the mode changes to details view - //Mouse region: When clicked, the mode changes to details view - MouseArea { - anchors.fill: parent - onClicked: { - detailsWindow.width = parent.width - detailsWindow.location = location - detailsWindow.dive_id = id - detailsWindow.buddy = buddy - detailsWindow.suit = suit - detailsWindow.airtemp = airtemp - detailsWindow.watertemp = watertemp - detailsWindow.divemaster = divemaster - detailsWindow.notes = notes - detailsWindow.number = diveNumber - detailsWindow.date = date - stackView.push(detailsWindow) - } + onClicked: { + diveListView.currentIndex = model.index + detailsWindow.width = parent.width + detailsWindow.location = location + detailsWindow.dive_id = id + detailsWindow.buddy = buddy + detailsWindow.suit = suit + detailsWindow.airtemp = airtemp + detailsWindow.watertemp = watertemp + detailsWindow.divemaster = divemaster + detailsWindow.notes = notes + detailsWindow.number = diveNumber + detailsWindow.date = date + stackView.push(detailsWindow) } //Layout of the page: (mini profile, dive no, date at the top @@ -115,17 +115,6 @@ Rectangle { top: locationText.bottom } } - //Text { text: location; width: parent.width } - Rectangle { - color: MobileComponents.Theme.textColor - opacity: .2 - height: Math.max(1, MobileComponents.Units.gridUnit / 24) // we really want a thin line - anchors { - left: parent.left - right: parent.right - top: numberText.bottom - } - } } } } @@ -136,7 +125,7 @@ Rectangle { width: page.width - MobileComponents.Units.smallSpacing * 2 height: childrenRect.height + MobileComponents.Units.smallSpacing * 2 - Text { + MobileComponents.Heading { id: sectionText text: section anchors { @@ -145,8 +134,7 @@ Rectangle { leftMargin: MobileComponents.Units.smallSpacing right: parent.right } - color: MobileComponents.Theme.textColor - font.pointSize: 16 + level: 2 } Rectangle { height: Math.max(2, MobileComponents.Units.gridUnit / 12) // we want a thicker line @@ -161,18 +149,30 @@ Rectangle { } } - ListView { - id: diveListView + Connections { + target: stackView + onDepthChanged: { + if (stackView.depth == 1) { + diveListView.currentIndex = -1; + } + } + } + ScrollView { anchors.fill: parent - model: diveModel - delegate: diveDelegate - boundsBehavior: Flickable.StopAtBounds - //highlight: Rectangle { color: MobileComponents.Theme.highlightColor; width: MobileComponents.Units.smallSpacing } - focus: true - clip: true - section.property: "trip" - section.criteria: ViewSection.FullString - section.delegate: tripHeading + ListView { + id: diveListView + anchors.fill: parent + model: diveModel + currentIndex: -1 + delegate: diveDelegate + boundsBehavior: Flickable.StopAtBounds + //highlight: Rectangle { color: MobileComponents.Theme.highlightColor; width: MobileComponents.Units.smallSpacing } + focus: true + clip: true + section.property: "trip" + section.criteria: ViewSection.FullString + section.delegate: tripHeading + } } StartPage { anchors.fill: parent diff --git a/qt-mobile/qml/main.qml b/qt-mobile/qml/main.qml index ac2e3eefd..53d872743 100644 --- a/qt-mobile/qml/main.qml +++ b/qt-mobile/qml/main.qml @@ -202,57 +202,46 @@ MobileComponents.ApplicationWindow { } } - ColumnLayout { - anchors.fill: parent + toolBar: TopBar { + width: parent.width + height: Layout.minimumHeight + } - TopBar { + property Item stackView: pageStack + initialPage: Item { + width: parent.width + height: parent.height - } + ColumnLayout { + id: awLayout + anchors.fill: parent + spacing: MobileComponents.Units.gridUnit / 2 - StackView { - id: stackView - Layout.preferredWidth: parent.width - Layout.fillHeight: true - focus: true - Keys.onReleased: if (event.key == Qt.Key_Back && stackView.depth > 1) { - stackView.pop() - event.accepted = true; - } - initialItem: Item { - width: parent.width - height: parent.height + Rectangle { + id: detailsPage + Layout.fillHeight: true + Layout.fillWidth: true - ColumnLayout { - id: awLayout - anchors.fill: parent - spacing: MobileComponents.Units.gridUnit / 2 + DiveList { + anchors.fill: detailsPage + id: diveDetails + color: MobileComponents.Theme.backgroundColor + } + } - Rectangle { - id: detailsPage - Layout.fillHeight: true - Layout.fillWidth: true - DiveList { - anchors.fill: detailsPage - id: diveDetails - color: MobileComponents.Theme.backgroundColor - } - } + Rectangle { + id: messageArea + height: childrenRect.height + Layout.fillWidth: true + color: MobileComponents.Theme.backgroundColor - Rectangle { - id: messageArea - height: childrenRect.height - Layout.fillWidth: true - color: MobileComponents.Theme.backgroundColor - - Text { - id: message - color: MobileComponents.Theme.textColor - wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere - styleColor: MobileComponents.Theme.textColor - font.pointSize: subsurfaceTheme.smallPointSize - } - } + Text { + id: message + color: MobileComponents.Theme.textColor + wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere + styleColor: MobileComponents.Theme.textColor + font.pointSize: MobileComponents.Units.smallPointSize } } } diff --git a/qt-mobile/qml/mobile-resources.qrc b/qt-mobile/qml/mobile-resources.qrc index d6c0825d4..971c2e427 100644 --- a/qt-mobile/qml/mobile-resources.qrc +++ b/qt-mobile/qml/mobile-resources.qrc @@ -19,6 +19,7 @@ mobilecomponents/ActionGroup.qml mobilecomponents/ApplicationWindow.qml mobilecomponents/GlobalDrawer.qml + mobilecomponents/Page.qml mobilecomponents/Icon.qml mobilecomponents/Heading.qml mobilecomponents/PageRow.qml