├── README.md ├── applicationui.cpp ├── applicationui.hpp ├── common ├── ButtonFlat.qml ├── ButtonRaised.qml ├── FlickableArea.qml ├── FloatingActionButton.qml ├── FloatingActionMiniButton.qml ├── HorizontalDivider.qml ├── IconActive.qml ├── IconColored.qml ├── IconInactive.qml ├── LabelBody.qml ├── LabelBodySecondary.qml ├── LabelCaption.qml ├── LabelDisplay1.qml ├── LabelDisplay2.qml ├── LabelDisplay3.qml ├── LabelDisplay4.qml ├── LabelHeadline.qml ├── LabelSubheading.qml ├── LabelTitle.qml ├── PopupPalette.qml ├── SimpleTextTitle.qml ├── StackTextTitle.qml ├── SwipeArea.qml ├── SwitchWithLeftLabel.qml └── VerticalDivider.qml ├── deployment.pri ├── images.qrc ├── images ├── LICENSE ├── black │ ├── arrow_back.png │ ├── arrow_back@2x.png │ ├── arrow_back@3x.png │ ├── arrow_back@4x.png │ ├── directions.png │ ├── directions@2x.png │ ├── directions@3x.png │ ├── directions@4x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── home@4x.png │ ├── more_vert.png │ ├── more_vert@2x.png │ ├── more_vert@3x.png │ ├── more_vert@4x.png │ ├── person.png │ ├── person@2x.png │ ├── person@3x.png │ ├── person@4x.png │ ├── x18 │ │ ├── arrow_back.png │ │ ├── arrow_back@2x.png │ │ ├── arrow_back@3x.png │ │ ├── arrow_back@4x.png │ │ ├── directions.png │ │ ├── directions@2x.png │ │ ├── directions@3x.png │ │ ├── directions@4x.png │ │ ├── home.png │ │ ├── home@2x.png │ │ ├── home@3x.png │ │ ├── home@4x.png │ │ ├── person.png │ │ ├── person@2x.png │ │ ├── person@3x.png │ │ └── person@4x.png │ ├── x36 │ │ ├── arrow_back.png │ │ ├── arrow_back@2x.png │ │ ├── arrow_back@3x.png │ │ ├── arrow_back@4x.png │ │ ├── directions.png │ │ ├── directions@2x.png │ │ ├── directions@3x.png │ │ ├── directions@4x.png │ │ ├── home.png │ │ ├── home@2x.png │ │ ├── home@3x.png │ │ ├── home@4x.png │ │ ├── person.png │ │ ├── person@2x.png │ │ ├── person@3x.png │ │ └── person@4x.png │ └── x48 │ │ ├── arrow_back.png │ │ ├── arrow_back@2x.png │ │ ├── arrow_back@3x.png │ │ ├── arrow_back@4x.png │ │ ├── directions.png │ │ ├── directions@2x.png │ │ ├── directions@3x.png │ │ ├── directions@4.png │ │ ├── home.png │ │ ├── home@2x.png │ │ ├── home@3x.png │ │ ├── home@4x.png │ │ ├── person.png │ │ ├── person@2x.png │ │ ├── person@3x.png │ │ └── person@4x.png └── white │ ├── arrow_back.png │ ├── arrow_back@2x.png │ ├── arrow_back@3x.png │ ├── arrow_back@4x.png │ ├── directions.png │ ├── directions@2x.png │ ├── directions@3x.png │ ├── directions@4x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── home@4x.png │ ├── more_vert.png │ ├── more_vert@2x.png │ ├── more_vert@3x.png │ ├── more_vert@4x.png │ ├── person.png │ ├── person@2x.png │ ├── person@3x.png │ ├── person@4x.png │ ├── x18 │ ├── arrow_back.png │ ├── arrow_back@2x.png │ ├── arrow_back@3x.png │ ├── arrow_back@4x.png │ ├── directions.png │ ├── directions@2x.png │ ├── directions@3x.png │ ├── directions@4x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── home@4x.png │ ├── person.png │ ├── person@2x.png │ ├── person@3x.png │ └── person@4x.png │ ├── x36 │ ├── arrow_back.png │ ├── arrow_back@2x.png │ ├── arrow_back@3x.png │ ├── arrow_back@4x.png │ ├── directions.png │ ├── directions@2x.png │ ├── directions@3x.png │ ├── directions@4x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── home@4x.png │ ├── person.png │ ├── person@2x.png │ ├── person@3x.png │ └── person@4x.png │ └── x48 │ ├── arrow_back.png │ ├── arrow_back@2x.png │ ├── arrow_back@3x.png │ ├── arrow_back@4.png │ ├── directions.png │ ├── directions@2x.png │ ├── directions@3x.png │ ├── directions@4x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── home@4x.png │ ├── person.png │ ├── person@2x.png │ ├── person@3x.png │ └── person@4.png ├── main.cpp ├── main.qml ├── pages ├── PageFive.qml ├── PageFour.qml ├── PageOne.qml ├── PageThree.qml └── PageTwo.qml ├── qml.qrc ├── stackedpages.pro ├── translations.qrc ├── translations ├── stackedpages.ts ├── stackedpages_cn.ts ├── stackedpages_en.ts └── stackedpages_zh_CN.ts └── uiconstants.hpp /README.md: -------------------------------------------------------------------------------- 1 | # stackedpages 2 | Sample APP - Qt 5.7+ - Android iOS PC and other platforms 3 | 4 | This is not a real-life app - this app only demonstrates the use of Material style and new Qt Quick Controls 2 5 | 6 | 7 | The topics of this second sample app: 8 | 9 | * more Qt Quick Controls 2 stuff: Buttons (Raised Buttons and Flat Buttons) 10 | * Navigation with StackView: pop(), push(), find() 11 | * go up and down page-by-page or jump back/force 12 | * Navigation with Android bottom Back-key 13 | * navigation with Android Back Button in Titlebar (ToolBar) 14 | * Navigation with Buttons and Floating Action Button 15 | * Navigation with Shortcut (physical keyboard attached) 16 | * Management of StackView to implement business-logic - simplified with init() and cleanup() functions 17 | * Dark Theme and selecting primary and accent color from options menu in ToolBar 18 | 19 | Strings are marked as translatable, but not translated yet. See the first app to learn about i18n. 20 | 21 | This second sample app is a simple app only to demonstrate navigation through stacked pages 22 | 23 | 24 | This app needs Qt 5.7 RC or greater 25 | 26 | ## License Information 27 | [see LICENSE ( The Unlicense )](LICENSE) 28 | 29 | Images downloaded from https://design.google.com/icons/ - then renamed to match Qt High DPI images- and project-specific- naming 30 | 31 | 32 | ## Screenshots 33 | This sample app uses Material Design with UI Controls provided by Qt 5.7+ and was designed and tested on Android (BlackBerry PRIV Android 6.0.1) and iOS (iPhone 6s iOS 9.3). 34 | 35 | ### Screenshot Android Page 1 36 | ![alt tag](https://appbus.files.wordpress.com/2016/05/android_page_01.png "Screenshot Android Page 1") 37 | 38 | ### Screenshot Android Page 2 39 | ![alt tag](https://appbus.files.wordpress.com/2016/05/android_page_02.png "Screenshot Android Page 2") 40 | 41 | ### Screenshot ios Page 2 42 | ![alt tag](https://appbus.files.wordpress.com/2016/05/ios_page_02.png "Screenshot Android Page 2") 43 | 44 | ### Screenshot Android Page 3 45 | ![alt tag](https://appbus.files.wordpress.com/2016/05/android_page_03.png "Screenshot Android Page 3") 46 | 47 | more information here: 48 | http://www.heilqt.com 49 | -------------------------------------------------------------------------------- /applicationui.cpp: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | #include "applicationui.hpp" 3 | #include "uiconstants.hpp" 4 | 5 | #include 6 | 7 | using namespace ekke::constants; 8 | 9 | ApplicationUI::ApplicationUI(QObject *parent) : QObject(parent) 10 | { 11 | // default theme is light 12 | mIsDarkTheme = false; 13 | // default primary color is BlueGrey 14 | mPrimaryPalette = 18; 15 | // default accent color is orange 16 | mAccentPalette = 14; 17 | } 18 | 19 | /* Change Theme Palette */ 20 | QStringList ApplicationUI::swapThemePalette() 21 | { 22 | mIsDarkTheme = !mIsDarkTheme; 23 | if (mIsDarkTheme) { 24 | return darkPalette; 25 | } 26 | return lightPalette; 27 | } 28 | 29 | /* Get current default Theme Palette */ 30 | QStringList ApplicationUI::defaultThemePalette() 31 | { 32 | if (mIsDarkTheme) { 33 | return darkPalette; 34 | } 35 | return lightPalette; 36 | } 37 | 38 | /* Get one of the Primary Palettes */ 39 | QStringList ApplicationUI::primaryPalette(const int paletteIndex) 40 | { 41 | mPrimaryPalette = paletteIndex; 42 | switch (paletteIndex) { 43 | case 0: 44 | return materialRed; 45 | break; 46 | case 1: 47 | return materialPink; 48 | break; 49 | case 2: 50 | return materialPurple; 51 | break; 52 | case 3: 53 | return materialDeepPurple; 54 | break; 55 | case 4: 56 | return materialIndigo; 57 | break; 58 | case 5: 59 | return materialBlue; 60 | break; 61 | case 6: 62 | return materialLightBlue; 63 | break; 64 | case 7: 65 | return materialCyan; 66 | break; 67 | case 8: 68 | return materialTeal; 69 | break; 70 | case 9: 71 | return materialGreen; 72 | break; 73 | case 10: 74 | return materialLightGreen; 75 | break; 76 | case 11: 77 | return materialLime; 78 | break; 79 | case 12: 80 | return materialYellow; 81 | break; 82 | case 13: 83 | return materialAmber; 84 | break; 85 | case 14: 86 | return materialOrange; 87 | break; 88 | case 15: 89 | return materialDeepOrange; 90 | break; 91 | case 16: 92 | return materialBrown; 93 | break; 94 | case 17: 95 | return materialGrey; 96 | break; 97 | default: 98 | return materialBlueGrey; 99 | break; 100 | } 101 | } 102 | 103 | /* Get one of the Accent Palettes */ 104 | QStringList ApplicationUI::accentPalette(const int paletteIndex) 105 | { 106 | mAccentPalette = paletteIndex; 107 | int currentPrimary = mPrimaryPalette; 108 | QStringList thePalette = primaryPalette(paletteIndex); 109 | mPrimaryPalette = currentPrimary; 110 | // we need: primaryColor, textOnPrimary, iconOnPrimaryFolder 111 | return QStringList{thePalette.at(1), thePalette.at(4), thePalette.at(7)}; 112 | } 113 | 114 | /* Get Default Primary Palette */ 115 | QStringList ApplicationUI::defaultPrimaryPalette() 116 | { 117 | return primaryPalette(mPrimaryPalette); 118 | } 119 | 120 | /* Get Default Accent Palette */ 121 | QStringList ApplicationUI::defaultAccentPalette() 122 | { 123 | return accentPalette(mAccentPalette); 124 | } 125 | 126 | 127 | -------------------------------------------------------------------------------- /applicationui.hpp: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | #ifndef APPLICATIONUI_HPP 3 | #define APPLICATIONUI_HPP 4 | 5 | #include 6 | 7 | class ApplicationUI : public QObject 8 | { 9 | Q_OBJECT 10 | 11 | public: 12 | ApplicationUI(QObject *parent = 0); 13 | 14 | Q_INVOKABLE 15 | QStringList swapThemePalette(); 16 | 17 | Q_INVOKABLE 18 | QStringList defaultThemePalette(); 19 | 20 | Q_INVOKABLE 21 | QStringList primaryPalette(const int paletteIndex); 22 | 23 | Q_INVOKABLE 24 | QStringList accentPalette(const int paletteIndex); 25 | 26 | Q_INVOKABLE 27 | QStringList defaultPrimaryPalette(); 28 | 29 | Q_INVOKABLE 30 | QStringList defaultAccentPalette(); 31 | 32 | signals: 33 | 34 | public slots: 35 | 36 | private: 37 | bool mIsDarkTheme; 38 | int mPrimaryPalette; 39 | int mAccentPalette; 40 | }; 41 | 42 | #endif // APPLICATIONUI_HPP 43 | -------------------------------------------------------------------------------- /common/ButtonFlat.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | 8 | // Flat Button 9 | Button { 10 | id: button 11 | // default: flatButtonTextColor 12 | property alias textColor: buttonText.color 13 | focusPolicy: Qt.NoFocus 14 | Layout.fillWidth: true 15 | Layout.preferredWidth : 1 16 | leftPadding: 6 17 | rightPadding: 6 18 | hoverEnabled:true 19 | contentItem: Text { 20 | id: buttonText 21 | text: button.text 22 | opacity: enabled ? 1.0 : 0.3 23 | color: button.hovered ?"white":flatButtonTextColor 24 | horizontalAlignment: Text.AlignHCenter 25 | verticalAlignment: Text.AlignVCenter 26 | elide: Text.ElideRight 27 | font.capitalization: Font.AllUppercase 28 | font.weight: Font.Medium 29 | } 30 | background: 31 | Rectangle { 32 | id: buttonBackground 33 | implicitHeight: 48 34 | Layout.minimumWidth: 88 35 | color: button.pressed ? buttonText.color : (!button.hovered ?"transparent":primaryColor) 36 | radius: 2 37 | opacity: button.pressed ? 0.12 : 1.0 38 | } // background 39 | } // button 40 | -------------------------------------------------------------------------------- /common/ButtonRaised.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | 8 | // Raised Button 9 | Button { 10 | id: button 11 | // default: textOnPrimary 12 | property alias textColor: buttonText.color 13 | // default: primaryColor 14 | property alias buttonColor: buttonBackground.color 15 | focusPolicy: Qt.NoFocus 16 | Layout.fillWidth: true 17 | Layout.preferredWidth : 1 18 | leftPadding: 6 19 | rightPadding: 6 20 | contentItem: Text { 21 | id: buttonText 22 | text: button.text 23 | opacity: enabled ? 1.0 : 0.3 24 | color: textOnPrimary 25 | horizontalAlignment: Text.AlignHCenter 26 | verticalAlignment: Text.AlignVCenter 27 | elide: Text.ElideRight 28 | font.capitalization: Font.AllUppercase 29 | } 30 | background: 31 | Rectangle { 32 | id: buttonBackground 33 | implicitHeight: 48 34 | color: primaryColor 35 | radius: 2 36 | opacity: button.pressed ? 0.75 : 1.0 37 | layer.enabled: true 38 | layer.effect: DropShadow { 39 | verticalOffset: 2 40 | horizontalOffset: 1 41 | color: dropShadow 42 | samples: button.pressed ? 20 : 10 43 | spread: 0.5 44 | } 45 | } // background 46 | } // button 47 | -------------------------------------------------------------------------------- /common/FlickableArea.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 2.2 3 | 4 | Pane { 5 | id:flickId 6 | signal swipeLeft() 7 | signal swipeRight() 8 | signal swipeUp() 9 | signal swipeDown() 10 | // SwipeArea{ 11 | // id:swipeId 12 | // anchors.fill: flickId 13 | // onSwipeDown: { 14 | // flickId.swipeDown(); 15 | // } 16 | // onSwipeRight: { 17 | // console.log("pop next page"); 18 | // navPane.pushNextPage() 19 | // flickId.swipeRight(); 20 | // } 21 | // onSwipeUp: { 22 | // flickId.swipeUp(); 23 | // } 24 | // onSwipeLeft: { 25 | // flickId.swipeLeft(); 26 | // console.log("pop pre page"); 27 | // navPane.popOnePage() 28 | // } 29 | // } 30 | } 31 | -------------------------------------------------------------------------------- /common/FloatingActionButton.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | 8 | Button { 9 | id: button 10 | // image should be 24x24 11 | property alias imageSource: contentImage.source 12 | // default: primaryColor 13 | property alias backgroundColor: buttonBackground.color 14 | property bool showShadow: true 15 | focusPolicy: Qt.NoFocus 16 | contentItem: 17 | Item { 18 | implicitHeight: 24 19 | implicitWidth: 24 20 | Image { 21 | id: contentImage 22 | anchors.centerIn: parent 23 | } 24 | } 25 | background: 26 | Rectangle { 27 | id: buttonBackground 28 | implicitWidth: 56 29 | implicitHeight: 56 30 | color: primaryColor 31 | radius: width / 2 32 | opacity: button.pressed ? 0.75 : 1.0 33 | layer.enabled: button.showShadow 34 | layer.effect: DropShadow { 35 | verticalOffset: 3 36 | horizontalOffset: 1 37 | color: dropShadow 38 | samples: button.pressed ? 20 : 10 39 | spread: 0.5 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /common/FloatingActionMiniButton.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Controls 2.2 4 | import QtQuick.Controls.Material 2.2 5 | import QtGraphicalEffects 1.0 6 | 7 | Button { 8 | id: button 9 | // image should be 24x24 10 | property alias imageSource: contentImage.source 11 | // default: primaryColor 12 | property alias backgroundColor: buttonBackground.color 13 | property bool showShadow: false 14 | focusPolicy: Qt.NoFocus 15 | contentItem: 16 | Item { 17 | implicitHeight: 24 18 | implicitWidth: 24 19 | Image { 20 | id: contentImage 21 | anchors.centerIn: parent 22 | } 23 | } 24 | background: 25 | Rectangle { 26 | id: buttonBackground 27 | implicitWidth: 48 28 | implicitHeight: 48 29 | color: primaryColor 30 | radius: width / 2 31 | opacity: button.pressed ? 0.75 : 1.0 32 | layer.enabled: button.showShadow 33 | layer.effect: DropShadow { 34 | verticalOffset: 3 35 | horizontalOffset: 1 36 | color: dropShadow 37 | samples: button.pressed ? 20 : 10 38 | spread: 0.5 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /common/HorizontalDivider.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Controls 2.2 4 | import QtQuick.Controls.Material 2.2 5 | 6 | Item { 7 | height: 8 8 | anchors.left: parent.left 9 | anchors.right: parent.right 10 | anchors.margins: 6 11 | // https://www.google.com/design/spec/components/dividers.html#dividers-types-of-dividers 12 | Rectangle { 13 | width: parent.width 14 | height: 1 15 | opacity: dividerOpacity 16 | color: dividerColor 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/IconActive.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | 4 | Image { 5 | property string imageName: "" 6 | onImageNameChanged: { 7 | calculatePath() 8 | } 9 | property int imageSize: 0 10 | onImageSizeChanged: { 11 | if(imageName.length > 0) { 12 | calculatePath() 13 | } 14 | } 15 | //trick: to be triggered if folder changed 16 | property string currentIconFolder: iconFolder 17 | onCurrentIconFolderChanged: { 18 | if(imageName.length > 0) { 19 | calculatePath() 20 | } 21 | } 22 | opacity: iconActiveOpacity 23 | function calculatePath() { 24 | var path = "qrc:/images/"+currentIconFolder 25 | switch(imageSize) { 26 | case 18: 27 | path += "/x18/" 28 | break; 29 | case 36: 30 | path += "/x36/" 31 | break; 32 | case 48: 33 | path += "/x48/" 34 | break; 35 | default: 36 | path += "/" 37 | } // switch 38 | path += imageName 39 | source = path 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /common/IconColored.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtGraphicalEffects 1.0 4 | 5 | Image { 6 | id: image 7 | property string imageName: "" 8 | onImageNameChanged: { 9 | calculatePath() 10 | } 11 | property int imageSize: 0 12 | onImageSizeChanged: { 13 | if(imageName.length > 0) { 14 | calculatePath() 15 | } 16 | } 17 | // default: primary color 18 | property alias color: colorOverlay.color 19 | //trick: to be triggered if folder changed 20 | property string currentIconFolder: iconFolder 21 | onCurrentIconFolderChanged: { 22 | if(imageName.length > 0) { 23 | calculatePath() 24 | } 25 | } 26 | ColorOverlay { 27 | id: colorOverlay 28 | anchors.fill: image 29 | source: image 30 | color: primaryColor 31 | } 32 | function calculatePath() { 33 | var path = "qrc:/images/"+currentIconFolder 34 | switch(imageSize) { 35 | case 18: 36 | path += "/x18/" 37 | break; 38 | case 36: 39 | path += "/x36/" 40 | break; 41 | case 48: 42 | path += "/x48/" 43 | break; 44 | default: 45 | path += "/" 46 | } // switch 47 | path += imageName 48 | source = path 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /common/IconInactive.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | 4 | Image { 5 | property string imageName: "" 6 | onImageNameChanged: { 7 | calculatePath() 8 | } 9 | property int imageSize: 0 10 | onImageSizeChanged: { 11 | if(imageName.length > 0) { 12 | calculatePath() 13 | } 14 | } 15 | //trick: to be triggered if folder changed 16 | property string currentIconFolder: iconFolder 17 | onCurrentIconFolderChanged: { 18 | if(imageName.length > 0) { 19 | calculatePath() 20 | } 21 | } 22 | opacity: iconInactiveOpacity 23 | function calculatePath() { 24 | var path = "qrc:/images/"+currentIconFolder 25 | switch(imageSize) { 26 | case 18: 27 | path += "/x18/" 28 | break; 29 | case 36: 30 | path += "/x36/" 31 | break; 32 | case 48: 33 | path += "/x48/" 34 | break; 35 | default: 36 | path += "/" 37 | } // switch 38 | path += imageName 39 | source = path 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /common/LabelBody.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | opacity: opacityBodyAndButton 9 | } 10 | -------------------------------------------------------------------------------- /common/LabelBodySecondary.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | Label { 6 | Layout.fillWidth: true 7 | opacity: opacityBodySecondary 8 | } 9 | -------------------------------------------------------------------------------- /common/LabelCaption.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeCaption 9 | opacity: opacityCaption 10 | font.capitalization: Font.AllUppercase 11 | } 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /common/LabelDisplay1.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeDisplay1 9 | opacity: opacityDisplay1 10 | } 11 | -------------------------------------------------------------------------------- /common/LabelDisplay2.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeDisplay2 9 | opacity: opacityDisplay2 10 | } 11 | -------------------------------------------------------------------------------- /common/LabelDisplay3.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeDisplay3 9 | opacity: opacityDisplay3 10 | } 11 | -------------------------------------------------------------------------------- /common/LabelDisplay4.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescornerimport QtQuick 2.9 2 | import QtQuick.Layouts 1.3 3 | import QtQuick.Controls 2.2 4 | 5 | Label { 6 | Layout.fillWidth: true 7 | font.pixelSize: fontSizeDisplay4 8 | opacity: opacityDisplay4 9 | } 10 | -------------------------------------------------------------------------------- /common/LabelHeadline.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeHeadline 9 | opacity: opacityHeadline 10 | } 11 | -------------------------------------------------------------------------------- /common/LabelSubheading.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeSubheading 9 | opacity: opacitySubheading 10 | } 11 | -------------------------------------------------------------------------------- /common/LabelTitle.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | 6 | Label { 7 | Layout.fillWidth: true 8 | font.pixelSize: fontSizeTitle 9 | opacity: opacityTitle 10 | } 11 | -------------------------------------------------------------------------------- /common/PopupPalette.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | 8 | Popup { 9 | id: popup 10 | property bool selectAccentColor: false 11 | Material.elevation: 8 12 | 13 | x: parent.width - width 14 | width: Math.min(appWindow.width, appWindow.height) / 3 * 2 15 | height: appWindow.height - header.height 16 | transformOrigin: Popup.TopRight 17 | 18 | // Hint: as of Qt 5.7 Beta because of bug in dark theme, 19 | // background is too dark 20 | // https://bugreports.qt.io/browse/QTBUG-53266 21 | 22 | ListView { 23 | id: listView 24 | // Attention: clip should be used carefully, 25 | // but using a ListView inside a Popup 26 | // you must set it to true 27 | // otherwise content will appear outside while scrolling 28 | // don't clip at Paopup: will cut the elevation shadow 29 | clip: true 30 | 31 | currentIndex: -1 32 | anchors.fill: parent 33 | implicitHeight: popup.height 34 | delegate: Item { 35 | id: itemDelegate 36 | width: parent.width 37 | implicitHeight: 40 38 | Row { 39 | spacing: 0 40 | leftPadding: 10 41 | Rectangle { 42 | visible: selectAccentColor 43 | anchors.verticalCenter: parent.verticalCenter 44 | implicitHeight: 32 45 | implicitWidth: 48 46 | color: primaryColor 47 | } 48 | Rectangle { 49 | anchors.verticalCenter: parent.verticalCenter 50 | implicitHeight: 32 51 | implicitWidth: 32 52 | color: model.bg 53 | } 54 | LabelBody { 55 | leftPadding: 10 56 | anchors.verticalCenter: parent.verticalCenter 57 | text: model.title 58 | } 59 | } // end Row 60 | MouseArea { 61 | anchors.fill: parent 62 | onClicked: { 63 | if (selectAccentColor) { 64 | appWindow.switchAccentPalette(index) 65 | } else { 66 | appWindow.switchPrimaryPalette(index) 67 | } 68 | popup.close() 69 | } 70 | } // mouse 71 | } // end delegateItem 72 | 73 | model: ListModel { 74 | ListElement { title: qsTr("Material Red"); bg: "#F44336" } 75 | ListElement { title: qsTr("Material Pink"); bg: "#E91E63" } 76 | ListElement { title: qsTr("Material Purple"); bg: "#9C27B0" } 77 | ListElement { title: qsTr("Material DeepPurple"); bg: "#673AB7" } 78 | ListElement { title: qsTr("Material Indigo"); bg: "#3F51B5" } 79 | ListElement { title: qsTr("Material Blue"); bg: "#2196F3" } 80 | ListElement { title: qsTr("Material LightBlue"); bg: "#26A1DA" } 81 | ListElement { title: qsTr("Material Cyan"); bg: "#00BCD4" } 82 | ListElement { title: qsTr("Material Teal"); bg: "#009688" } 83 | ListElement { title: qsTr("Material Green"); bg: "#4CAF50" } 84 | ListElement { title: qsTr("Material LightGreen"); bg: "#8BC34A" } 85 | ListElement { title: qsTr("Material Lime"); bg: "#CDDC39" } 86 | ListElement { title: qsTr("Material Yellow"); bg: "#FFEB3B" } 87 | ListElement { title: qsTr("Material Amber"); bg: "#FFC107" } 88 | ListElement { title: qsTr("Material Orange"); bg: "#FF9800" } 89 | ListElement { title: qsTr("Material DeepOrange"); bg: "#FF5722" } 90 | ListElement { title: qsTr("Material Brown"); bg: "#795548" } 91 | ListElement { title: qsTr("Material Grey"); bg: "#9E9E9E" } 92 | ListElement { title: qsTr("Material BlueGrey"); bg: "#607D8B" } 93 | } 94 | ScrollIndicator.vertical: ScrollIndicator { } 95 | } // end listView 96 | } // end popup 97 | -------------------------------------------------------------------------------- /common/SimpleTextTitle.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | 7 | ToolBar { 8 | id: titleToolBar 9 | property alias text: titleLabel.text 10 | 11 | RowLayout { 12 | focus: false 13 | spacing: 6 14 | anchors.fill: parent 15 | LabelTitle { 16 | id: titleLabel 17 | text: "ekke" 18 | leftPadding: 16 19 | elide: Label.ElideRight 20 | horizontalAlignment: Qt.AlignHCenter 21 | verticalAlignment: Qt.AlignVCenter 22 | color: textOnPrimary 23 | } 24 | ToolButton { 25 | focusPolicy: Qt.NoFocus 26 | Image { 27 | id: buttonImage 28 | anchors.centerIn: parent 29 | source: "qrc:/images/"+iconOnPrimaryFolder+"/more_vert.png" 30 | } 31 | onClicked: { 32 | optionsMenu.open() 33 | } 34 | Menu { 35 | id: optionsMenu 36 | x: parent.width - width 37 | transformOrigin: Menu.TopRight 38 | MenuItem { 39 | text: isDarkTheme? qsTr("Light Theme") : qsTr("Dark Theme") 40 | onTriggered: { 41 | themePalette = myApp.swapThemePalette() 42 | } 43 | } 44 | MenuItem { 45 | text: qsTr("Select Primary Color") 46 | onTriggered: { 47 | popup.selectAccentColor = false 48 | popup.open() 49 | } 50 | } 51 | MenuItem { 52 | text: qsTr("Select Accent Color") 53 | onTriggered: { 54 | popup.selectAccentColor = true 55 | popup.open() 56 | } 57 | } 58 | onAboutToHide: { 59 | appWindow.resetFocus() 60 | } 61 | } // end optionsMenu 62 | 63 | } // end ToolButton 64 | } // end RowLayout 65 | } // end ToolBar 66 | 67 | 68 | -------------------------------------------------------------------------------- /common/StackTextTitle.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | 7 | ToolBar { 8 | id: titleToolBar 9 | property alias text: titleLabel.text 10 | 11 | RowLayout { 12 | focus: false 13 | spacing: 6 14 | anchors.fill: parent 15 | ToolButton { 16 | enabled: navPane.depth > 1 17 | focusPolicy: Qt.NoFocus 18 | Image { 19 | id: backImageImage 20 | visible: navPane.depth > 1 21 | anchors.centerIn: parent 22 | source: "qrc:/images/"+iconOnPrimaryFolder+"/arrow_back.png" 23 | } 24 | onClicked: { 25 | navPane.popOnePage() 26 | } 27 | } 28 | LabelTitle { 29 | id: titleLabel 30 | text: "ekke" 31 | // leftPadding: 16 32 | elide: Label.ElideRight 33 | horizontalAlignment: Qt.AlignHCenter 34 | verticalAlignment: Qt.AlignVCenter 35 | color: textOnPrimary 36 | } 37 | ToolButton { 38 | focusPolicy: Qt.NoFocus 39 | Image { 40 | id: buttonImage 41 | anchors.centerIn: parent 42 | source: "qrc:/images/"+iconOnPrimaryFolder+"/more_vert.png" 43 | } 44 | onClicked: { 45 | optionsMenu.open() 46 | } 47 | Menu { 48 | id: optionsMenu 49 | x: parent.width - width 50 | transformOrigin: Menu.TopRight 51 | MenuItem { 52 | text: isDarkTheme? qsTr("Light Theme") : qsTr("Dark Theme") 53 | onTriggered: { 54 | themePalette = myApp.swapThemePalette() 55 | } 56 | } 57 | MenuItem { 58 | text: qsTr("Select Primary Color") 59 | onTriggered: { 60 | popup.selectAccentColor = false 61 | popup.open() 62 | } 63 | } 64 | MenuItem { 65 | text: qsTr("Select Accent Color") 66 | onTriggered: { 67 | popup.selectAccentColor = true 68 | popup.open() 69 | } 70 | } 71 | onAboutToHide: { 72 | appWindow.resetFocus() 73 | } 74 | } // end optionsMenu 75 | 76 | } // end ToolButton 77 | } // end RowLayout 78 | } // end ToolBar 79 | 80 | 81 | -------------------------------------------------------------------------------- /common/SwipeArea.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | 3 | MouseArea { 4 | property point origin 5 | property bool ready: false 6 | signal move(int x, int y) 7 | signal swipe(string direction) 8 | // preventStealing:true 9 | propagateComposedEvents:true 10 | onPressed: { 11 | drag.axis = Drag.XAndYAxis 12 | origin = Qt.point(mouse.x, mouse.y) 13 | } 14 | 15 | onPositionChanged: { 16 | switch (drag.axis) { 17 | case Drag.XAndYAxis: 18 | if (Math.abs(mouse.x - origin.x) > 16) { 19 | drag.axis = Drag.XAxis 20 | } 21 | else if (Math.abs(mouse.y - origin.y) > 16) { 22 | drag.axis = Drag.YAxis 23 | } 24 | break 25 | case Drag.XAxis: 26 | move(mouse.x - origin.x, 0) 27 | break 28 | case Drag.YAxis: 29 | move(0, mouse.y - origin.y) 30 | break 31 | } 32 | } 33 | 34 | onReleased: { 35 | switch (drag.axis) { 36 | case Drag.XAndYAxis: 37 | canceled(mouse) 38 | break 39 | case Drag.XAxis: 40 | swipe(mouse.x - origin.x < 0 ? "left" : "right") 41 | break 42 | case Drag.YAxis: 43 | swipe(mouse.y - origin.y < 0 ? "up" : "down") 44 | break 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /common/SwitchWithLeftLabel.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Controls 2.2 4 | 5 | Row { 6 | property alias text: switchLabel.text 7 | property alias checked: theSwitch.checked 8 | leftPadding: 6 9 | LabelBody { 10 | id: switchLabel 11 | wrapMode: Text.WordWrap 12 | anchors.verticalCenter: parent.verticalCenter 13 | } 14 | Switch { 15 | id: theSwitch 16 | anchors.verticalCenter: parent.verticalCenter 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/VerticalDivider.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Controls 2.2 4 | import QtQuick.Controls.Material 2.2 5 | 6 | Item { 7 | implicitWidth: 8 8 | anchors.top: parent.top 9 | anchors.bottom: parent.bottom 10 | // https://www.google.com/design/spec/components/dividers.html#dividers-types-of-dividers 11 | Rectangle { 12 | id: theRectangle 13 | width: 1 14 | height: parent.height 15 | anchors.horizontalCenter: parent.horizontalCenter 16 | opacity: dividerOpacity 17 | color: dividerColor 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /deployment.pri: -------------------------------------------------------------------------------- 1 | unix:!android { 2 | isEmpty(target.path) { 3 | qnx { 4 | target.path = /tmp/$${TARGET}/bin 5 | } else { 6 | target.path = /opt/$${TARGET}/bin 7 | } 8 | export(target.path) 9 | } 10 | INSTALLS += target 11 | } 12 | 13 | export(INSTALLS) 14 | -------------------------------------------------------------------------------- /images.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/black/more_vert.png 4 | images/black/more_vert@2x.png 5 | images/black/more_vert@3x.png 6 | images/black/more_vert@4x.png 7 | images/white/more_vert.png 8 | images/white/more_vert@2x.png 9 | images/white/more_vert@3x.png 10 | images/white/more_vert@4x.png 11 | images/white/person.png 12 | images/white/person@2x.png 13 | images/white/person@3x.png 14 | images/white/person@4x.png 15 | images/black/person.png 16 | images/black/person@2x.png 17 | images/black/person@3x.png 18 | images/black/person@4x.png 19 | images/black/x36/person.png 20 | images/black/x36/person@2x.png 21 | images/black/x36/person@3x.png 22 | images/black/x36/person@4x.png 23 | images/white/x36/person.png 24 | images/white/x36/person@2x.png 25 | images/white/x36/person@3x.png 26 | images/white/x36/person@4x.png 27 | images/black/x18/person.png 28 | images/black/x18/person@2x.png 29 | images/black/x18/person@3x.png 30 | images/black/x18/person@4x.png 31 | images/black/x48/person.png 32 | images/black/x48/person@2x.png 33 | images/black/x48/person@3x.png 34 | images/black/x48/person@4x.png 35 | images/white/x18/person.png 36 | images/white/x18/person@2x.png 37 | images/white/x18/person@3x.png 38 | images/white/x18/person@4x.png 39 | images/white/x48/person.png 40 | images/white/x48/person@2x.png 41 | images/white/x48/person@3x.png 42 | images/white/x48/person@4.png 43 | images/black/arrow_back.png 44 | images/black/arrow_back@2x.png 45 | images/black/arrow_back@3x.png 46 | images/black/arrow_back@4x.png 47 | images/black/directions.png 48 | images/black/directions@2x.png 49 | images/black/directions@3x.png 50 | images/black/directions@4x.png 51 | images/black/x18/arrow_back.png 52 | images/black/x18/arrow_back@2x.png 53 | images/black/x18/arrow_back@3x.png 54 | images/black/x18/arrow_back@4x.png 55 | images/black/x18/directions.png 56 | images/black/x18/directions@2x.png 57 | images/black/x18/directions@3x.png 58 | images/black/x18/directions@4x.png 59 | images/black/x36/arrow_back.png 60 | images/black/x36/arrow_back@2x.png 61 | images/black/x36/arrow_back@3x.png 62 | images/black/x36/arrow_back@4x.png 63 | images/black/x36/directions.png 64 | images/black/x36/directions@2x.png 65 | images/black/x36/directions@3x.png 66 | images/black/x36/directions@4x.png 67 | images/black/x48/arrow_back.png 68 | images/black/x48/arrow_back@2x.png 69 | images/black/x48/arrow_back@3x.png 70 | images/black/x48/arrow_back@4x.png 71 | images/black/x48/directions.png 72 | images/black/x48/directions@2x.png 73 | images/black/x48/directions@3x.png 74 | images/black/x48/directions@4.png 75 | images/white/arrow_back.png 76 | images/white/arrow_back@2x.png 77 | images/white/arrow_back@3x.png 78 | images/white/arrow_back@4x.png 79 | images/white/directions.png 80 | images/white/directions@2x.png 81 | images/white/directions@3x.png 82 | images/white/directions@4x.png 83 | images/white/x18/arrow_back.png 84 | images/white/x18/arrow_back@2x.png 85 | images/white/x18/arrow_back@3x.png 86 | images/white/x18/arrow_back@4x.png 87 | images/white/x18/directions.png 88 | images/white/x18/directions@2x.png 89 | images/white/x18/directions@3x.png 90 | images/white/x18/directions@4x.png 91 | images/white/x36/arrow_back.png 92 | images/white/x36/arrow_back@2x.png 93 | images/white/x36/arrow_back@3x.png 94 | images/white/x36/arrow_back@4x.png 95 | images/white/x36/directions.png 96 | images/white/x36/directions@2x.png 97 | images/white/x36/directions@3x.png 98 | images/white/x36/directions@4x.png 99 | images/white/x48/arrow_back.png 100 | images/white/x48/arrow_back@2x.png 101 | images/white/x48/arrow_back@3x.png 102 | images/white/x48/arrow_back@4.png 103 | images/white/x48/directions.png 104 | images/white/x48/directions@2x.png 105 | images/white/x48/directions@3x.png 106 | images/white/x48/directions@4x.png 107 | images/black/home.png 108 | images/black/home@2x.png 109 | images/black/home@3x.png 110 | images/black/home@4x.png 111 | images/black/x18/home.png 112 | images/black/x18/home@2x.png 113 | images/black/x18/home@3x.png 114 | images/black/x18/home@4x.png 115 | images/black/x36/home.png 116 | images/black/x36/home@2x.png 117 | images/black/x36/home@3x.png 118 | images/black/x36/home@4x.png 119 | images/black/x48/home.png 120 | images/black/x48/home@2x.png 121 | images/black/x48/home@3x.png 122 | images/black/x48/home@4x.png 123 | images/white/home.png 124 | images/white/home@2x.png 125 | images/white/home@3x.png 126 | images/white/home@4x.png 127 | images/white/x18/home.png 128 | images/white/x18/home@2x.png 129 | images/white/x18/home@3x.png 130 | images/white/x18/home@4x.png 131 | images/white/x36/home.png 132 | images/white/x36/home@2x.png 133 | images/white/x36/home@3x.png 134 | images/white/x36/home@4x.png 135 | images/white/x48/home.png 136 | images/white/x48/home@2x.png 137 | images/white/x48/home@3x.png 138 | images/white/x48/home@4x.png 139 | 140 | 141 | -------------------------------------------------------------------------------- /images/LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public licenses. 379 | Notwithstanding, Creative Commons may elect to apply one of its public 380 | licenses to material it publishes and in those instances will be 381 | considered the "Licensor." Except for the limited purpose of indicating 382 | that material is shared under a Creative Commons public license or as 383 | otherwise permitted by the Creative Commons policies published at 384 | creativecommons.org/policies, Creative Commons does not authorize the 385 | use of the trademark "Creative Commons" or any other trademark or logo 386 | of Creative Commons without its prior written consent including, 387 | without limitation, in connection with any unauthorized modifications 388 | to any of its public licenses or any other arrangements, 389 | understandings, or agreements concerning use of licensed material. For 390 | the avoidance of doubt, this paragraph does not form part of the public 391 | licenses. 392 | 393 | Creative Commons may be contacted at creativecommons.org. 394 | -------------------------------------------------------------------------------- /images/black/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/arrow_back.png -------------------------------------------------------------------------------- /images/black/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/arrow_back@2x.png -------------------------------------------------------------------------------- /images/black/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/arrow_back@3x.png -------------------------------------------------------------------------------- /images/black/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/arrow_back@4x.png -------------------------------------------------------------------------------- /images/black/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/directions.png -------------------------------------------------------------------------------- /images/black/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/directions@2x.png -------------------------------------------------------------------------------- /images/black/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/directions@3x.png -------------------------------------------------------------------------------- /images/black/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/directions@4x.png -------------------------------------------------------------------------------- /images/black/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/home.png -------------------------------------------------------------------------------- /images/black/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/home@2x.png -------------------------------------------------------------------------------- /images/black/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/home@3x.png -------------------------------------------------------------------------------- /images/black/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/home@4x.png -------------------------------------------------------------------------------- /images/black/more_vert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/more_vert.png -------------------------------------------------------------------------------- /images/black/more_vert@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/more_vert@2x.png -------------------------------------------------------------------------------- /images/black/more_vert@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/more_vert@3x.png -------------------------------------------------------------------------------- /images/black/more_vert@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/more_vert@4x.png -------------------------------------------------------------------------------- /images/black/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/person.png -------------------------------------------------------------------------------- /images/black/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/person@2x.png -------------------------------------------------------------------------------- /images/black/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/person@3x.png -------------------------------------------------------------------------------- /images/black/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/person@4x.png -------------------------------------------------------------------------------- /images/black/x18/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/arrow_back.png -------------------------------------------------------------------------------- /images/black/x18/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/arrow_back@2x.png -------------------------------------------------------------------------------- /images/black/x18/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/arrow_back@3x.png -------------------------------------------------------------------------------- /images/black/x18/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/arrow_back@4x.png -------------------------------------------------------------------------------- /images/black/x18/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/directions.png -------------------------------------------------------------------------------- /images/black/x18/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/directions@2x.png -------------------------------------------------------------------------------- /images/black/x18/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/directions@3x.png -------------------------------------------------------------------------------- /images/black/x18/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/directions@4x.png -------------------------------------------------------------------------------- /images/black/x18/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/home.png -------------------------------------------------------------------------------- /images/black/x18/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/home@2x.png -------------------------------------------------------------------------------- /images/black/x18/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/home@3x.png -------------------------------------------------------------------------------- /images/black/x18/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/home@4x.png -------------------------------------------------------------------------------- /images/black/x18/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/person.png -------------------------------------------------------------------------------- /images/black/x18/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/person@2x.png -------------------------------------------------------------------------------- /images/black/x18/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/person@3x.png -------------------------------------------------------------------------------- /images/black/x18/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x18/person@4x.png -------------------------------------------------------------------------------- /images/black/x36/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/arrow_back.png -------------------------------------------------------------------------------- /images/black/x36/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/arrow_back@2x.png -------------------------------------------------------------------------------- /images/black/x36/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/arrow_back@3x.png -------------------------------------------------------------------------------- /images/black/x36/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/arrow_back@4x.png -------------------------------------------------------------------------------- /images/black/x36/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/directions.png -------------------------------------------------------------------------------- /images/black/x36/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/directions@2x.png -------------------------------------------------------------------------------- /images/black/x36/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/directions@3x.png -------------------------------------------------------------------------------- /images/black/x36/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/directions@4x.png -------------------------------------------------------------------------------- /images/black/x36/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/home.png -------------------------------------------------------------------------------- /images/black/x36/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/home@2x.png -------------------------------------------------------------------------------- /images/black/x36/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/home@3x.png -------------------------------------------------------------------------------- /images/black/x36/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/home@4x.png -------------------------------------------------------------------------------- /images/black/x36/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/person.png -------------------------------------------------------------------------------- /images/black/x36/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/person@2x.png -------------------------------------------------------------------------------- /images/black/x36/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/person@3x.png -------------------------------------------------------------------------------- /images/black/x36/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x36/person@4x.png -------------------------------------------------------------------------------- /images/black/x48/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/arrow_back.png -------------------------------------------------------------------------------- /images/black/x48/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/arrow_back@2x.png -------------------------------------------------------------------------------- /images/black/x48/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/arrow_back@3x.png -------------------------------------------------------------------------------- /images/black/x48/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/arrow_back@4x.png -------------------------------------------------------------------------------- /images/black/x48/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/directions.png -------------------------------------------------------------------------------- /images/black/x48/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/directions@2x.png -------------------------------------------------------------------------------- /images/black/x48/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/directions@3x.png -------------------------------------------------------------------------------- /images/black/x48/directions@4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/directions@4.png -------------------------------------------------------------------------------- /images/black/x48/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/home.png -------------------------------------------------------------------------------- /images/black/x48/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/home@2x.png -------------------------------------------------------------------------------- /images/black/x48/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/home@3x.png -------------------------------------------------------------------------------- /images/black/x48/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/home@4x.png -------------------------------------------------------------------------------- /images/black/x48/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/person.png -------------------------------------------------------------------------------- /images/black/x48/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/person@2x.png -------------------------------------------------------------------------------- /images/black/x48/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/person@3x.png -------------------------------------------------------------------------------- /images/black/x48/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/black/x48/person@4x.png -------------------------------------------------------------------------------- /images/white/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/arrow_back.png -------------------------------------------------------------------------------- /images/white/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/arrow_back@2x.png -------------------------------------------------------------------------------- /images/white/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/arrow_back@3x.png -------------------------------------------------------------------------------- /images/white/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/arrow_back@4x.png -------------------------------------------------------------------------------- /images/white/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/directions.png -------------------------------------------------------------------------------- /images/white/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/directions@2x.png -------------------------------------------------------------------------------- /images/white/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/directions@3x.png -------------------------------------------------------------------------------- /images/white/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/directions@4x.png -------------------------------------------------------------------------------- /images/white/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/home.png -------------------------------------------------------------------------------- /images/white/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/home@2x.png -------------------------------------------------------------------------------- /images/white/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/home@3x.png -------------------------------------------------------------------------------- /images/white/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/home@4x.png -------------------------------------------------------------------------------- /images/white/more_vert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/more_vert.png -------------------------------------------------------------------------------- /images/white/more_vert@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/more_vert@2x.png -------------------------------------------------------------------------------- /images/white/more_vert@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/more_vert@3x.png -------------------------------------------------------------------------------- /images/white/more_vert@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/more_vert@4x.png -------------------------------------------------------------------------------- /images/white/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/person.png -------------------------------------------------------------------------------- /images/white/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/person@2x.png -------------------------------------------------------------------------------- /images/white/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/person@3x.png -------------------------------------------------------------------------------- /images/white/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/person@4x.png -------------------------------------------------------------------------------- /images/white/x18/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/arrow_back.png -------------------------------------------------------------------------------- /images/white/x18/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/arrow_back@2x.png -------------------------------------------------------------------------------- /images/white/x18/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/arrow_back@3x.png -------------------------------------------------------------------------------- /images/white/x18/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/arrow_back@4x.png -------------------------------------------------------------------------------- /images/white/x18/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/directions.png -------------------------------------------------------------------------------- /images/white/x18/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/directions@2x.png -------------------------------------------------------------------------------- /images/white/x18/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/directions@3x.png -------------------------------------------------------------------------------- /images/white/x18/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/directions@4x.png -------------------------------------------------------------------------------- /images/white/x18/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/home.png -------------------------------------------------------------------------------- /images/white/x18/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/home@2x.png -------------------------------------------------------------------------------- /images/white/x18/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/home@3x.png -------------------------------------------------------------------------------- /images/white/x18/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/home@4x.png -------------------------------------------------------------------------------- /images/white/x18/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/person.png -------------------------------------------------------------------------------- /images/white/x18/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/person@2x.png -------------------------------------------------------------------------------- /images/white/x18/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/person@3x.png -------------------------------------------------------------------------------- /images/white/x18/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x18/person@4x.png -------------------------------------------------------------------------------- /images/white/x36/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/arrow_back.png -------------------------------------------------------------------------------- /images/white/x36/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/arrow_back@2x.png -------------------------------------------------------------------------------- /images/white/x36/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/arrow_back@3x.png -------------------------------------------------------------------------------- /images/white/x36/arrow_back@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/arrow_back@4x.png -------------------------------------------------------------------------------- /images/white/x36/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/directions.png -------------------------------------------------------------------------------- /images/white/x36/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/directions@2x.png -------------------------------------------------------------------------------- /images/white/x36/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/directions@3x.png -------------------------------------------------------------------------------- /images/white/x36/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/directions@4x.png -------------------------------------------------------------------------------- /images/white/x36/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/home.png -------------------------------------------------------------------------------- /images/white/x36/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/home@2x.png -------------------------------------------------------------------------------- /images/white/x36/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/home@3x.png -------------------------------------------------------------------------------- /images/white/x36/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/home@4x.png -------------------------------------------------------------------------------- /images/white/x36/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/person.png -------------------------------------------------------------------------------- /images/white/x36/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/person@2x.png -------------------------------------------------------------------------------- /images/white/x36/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/person@3x.png -------------------------------------------------------------------------------- /images/white/x36/person@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x36/person@4x.png -------------------------------------------------------------------------------- /images/white/x48/arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/arrow_back.png -------------------------------------------------------------------------------- /images/white/x48/arrow_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/arrow_back@2x.png -------------------------------------------------------------------------------- /images/white/x48/arrow_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/arrow_back@3x.png -------------------------------------------------------------------------------- /images/white/x48/arrow_back@4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/arrow_back@4.png -------------------------------------------------------------------------------- /images/white/x48/directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/directions.png -------------------------------------------------------------------------------- /images/white/x48/directions@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/directions@2x.png -------------------------------------------------------------------------------- /images/white/x48/directions@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/directions@3x.png -------------------------------------------------------------------------------- /images/white/x48/directions@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/directions@4x.png -------------------------------------------------------------------------------- /images/white/x48/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/home.png -------------------------------------------------------------------------------- /images/white/x48/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/home@2x.png -------------------------------------------------------------------------------- /images/white/x48/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/home@3x.png -------------------------------------------------------------------------------- /images/white/x48/home@4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/home@4x.png -------------------------------------------------------------------------------- /images/white/x48/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/person.png -------------------------------------------------------------------------------- /images/white/x48/person@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/person@2x.png -------------------------------------------------------------------------------- /images/white/x48/person@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/person@3x.png -------------------------------------------------------------------------------- /images/white/x48/person@4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toby20130333/stackedpages/d413a1dd04541e03d42b357ae14e9df93ba272d4/images/white/x48/person@4.png -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include "applicationui.hpp" 9 | 10 | int main(int argc, char *argv[]) 11 | { 12 | QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 13 | qputenv("QT_QUICK_CONTROLS_STYLE", "material"); 14 | QGuiApplication app(argc, argv); 15 | 16 | QTranslator translator; 17 | if (translator.load(QLocale(), QLatin1String("stackedpages"), QLatin1String("_"), QLatin1String(":/translations"))) { 18 | app.installTranslator(&translator); 19 | } else { 20 | qDebug() << "cannot load translator " << QLocale::system().name() << " check content of translations.qrc"; 21 | } 22 | 23 | ApplicationUI appui; 24 | QQmlApplicationEngine engine; 25 | 26 | // from QML we have access to ApplicationUI as myApp 27 | QQmlContext* context = engine.rootContext(); 28 | context->setContextProperty("myApp", &appui); 29 | 30 | engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 31 | return app.exec(); 32 | } 33 | -------------------------------------------------------------------------------- /main.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.5 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.1 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "common" 8 | import "pages" 9 | 10 | // This app demonstrates HowTo use Qt 5.8 and Qt Quick Controls 2.1, High DPI and more 11 | // This app is NOT a production ready app 12 | // This app's goal is only to help you to understand some concepts 13 | // see blog http://j.mp/qt-x to learn about Qt 5.8 for Material - styled Android or iOS Apps 14 | // learn about this stacked_pages_x app from this article: http://j.mp/qt-stacked-pages-x 15 | // ekke (Ekkehard gentz) @ekkescorner 16 | 17 | ApplicationWindow { 18 | id: appWindow 19 | // visibile must set to true - default is false 20 | visible: true 21 | width: 400 22 | height: 600 23 | // primary and accent properties: 24 | property variant primaryPalette: myApp.defaultPrimaryPalette() 25 | property color primaryLightColor: primaryPalette[0] 26 | property color primaryColor: primaryPalette[1] 27 | property color primaryDarkColor: primaryPalette[2] 28 | property color textOnPrimaryLight: primaryPalette[3] 29 | property color textOnPrimary: primaryPalette[4] 30 | property color textOnPrimaryDark: primaryPalette[5] 31 | property string iconOnPrimaryLightFolder: primaryPalette[6] 32 | property string iconOnPrimaryFolder: primaryPalette[7] 33 | property string iconOnPrimaryDarkFolder: primaryPalette[8] 34 | property variant accentPalette: myApp.defaultAccentPalette() 35 | property color accentColor: accentPalette[0] 36 | property color textOnAccent: accentPalette[1] 37 | property string iconOnAccentFolder: accentPalette[2] 38 | Material.primary: primaryColor 39 | Material.accent: accentColor 40 | // theme Dark vs Light properties: 41 | property variant themePalette: myApp.defaultThemePalette() 42 | property color dividerColor: themePalette[0] 43 | property color cardAndDialogBackground: themePalette[1] 44 | property real primaryTextOpacity: themePalette[2] 45 | property real secondaryTextOpacity: themePalette[3] 46 | property real dividerOpacity: themePalette[4] 47 | property real iconActiveOpacity: themePalette[5] 48 | property real iconInactiveOpacity: themePalette[6] 49 | property string iconFolder: themePalette[7] 50 | property int isDarkTheme: themePalette[8] 51 | property color flatButtonTextColor: themePalette[9] 52 | // Material.dropShadowColor OK for Light, but too dark for dark theme 53 | property color dropShadow: isDarkTheme? "#E4E4E4" : Material.dropShadowColor 54 | onIsDarkThemeChanged: { 55 | if(isDarkTheme == 1) { 56 | Material.theme = Material.Dark 57 | } else { 58 | Material.theme = Material.Light 59 | } 60 | } 61 | // font sizes - defaults from Google Material Design Guide 62 | property int fontSizeDisplay4: 112 63 | property int fontSizeDisplay3: 56 64 | property int fontSizeDisplay2: 45 65 | property int fontSizeDisplay1: 34 66 | property int fontSizeHeadline: 24 67 | property int fontSizeTitle: 20 68 | property int fontSizeSubheading: 16 69 | property int fontSizeBodyAndButton: 14 // is Default 70 | property int fontSizeCaption: 12 71 | // fonts are grouped into primary and secondary with different Opacity 72 | // to make it easier to get the right property, 73 | // here's the opacity per size: 74 | property real opacityDisplay4: secondaryTextOpacity 75 | property real opacityDisplay3: secondaryTextOpacity 76 | property real opacityDisplay2: secondaryTextOpacity 77 | property real opacityDisplay1: secondaryTextOpacity 78 | property real opacityHeadline: primaryTextOpacity 79 | property real opacityTitle: primaryTextOpacity 80 | property real opacitySubheading: primaryTextOpacity 81 | // body can be both: primary or secondary text 82 | property real opacityBodyAndButton: primaryTextOpacity 83 | property real opacityBodySecondary: secondaryTextOpacity 84 | property real opacityCaption: secondaryTextOpacity 85 | // 86 | 87 | SwipeArea{ 88 | id:swipeId 89 | anchors.fill: parent 90 | onSwipe: { 91 | console.log("pop pre page"); 92 | //通过手势pop出来 93 | if(direction=="left") navPane.popOnePage() 94 | } 95 | } 96 | 97 | header: StackTextTitle { 98 | id: titleBar 99 | text: navPane.currentItem? navPane.currentItem.title : qsTr("A simple Stacked - Pages APP") 100 | } 101 | 102 | // primaryDarkColor is used because FAB can overlap Raised Buttons colored in primaryColor 103 | FloatingActionButton { 104 | property string imageName: navPane.depth < 5? "/directions.png" : "/home.png" 105 | z: 1 106 | anchors.margins: 16 107 | anchors.right: parent.right 108 | anchors.bottom: parent.bottom 109 | imageSource: "qrc:/images/"+iconOnPrimaryDarkFolder+imageName 110 | backgroundColor: primaryDarkColor 111 | onClicked: { 112 | if(navPane.depth < 5) { 113 | navPane.pushNextPage() 114 | } else { 115 | navPane.goToPage(1) 116 | } 117 | } 118 | } // FAB 119 | 120 | StackView { 121 | id: navPane 122 | focus: true 123 | anchors.fill: parent 124 | anchors.bottomMargin: 40 125 | initialItem: pageOne 126 | // support of BACK key 127 | Keys.onBackPressed: { 128 | event.accepted = navPane.depth > 1 129 | popOnePage() 130 | if(navPane.depth == 1) { 131 | // perhaps ask user if app should really quit 132 | var page = navPane.get(0) 133 | page.cleanup() 134 | } 135 | } 136 | // some keyboard shortcuts if: 137 | // * running on BlackBerry PRIV (Slider with hardware keyboard) 138 | // * or attached Bluetooth Keyboard 139 | // Jump to Page 1 (w), 2 (e), 3 (r), 4 (s), 5(d) 140 | // Goto next page: 'n' 141 | // Goto previous page: 'p' 142 | Shortcut { 143 | sequence: "w" 144 | onActivated: navPane.goToPage(1) 145 | } 146 | Shortcut { 147 | sequence: "Alt+w" 148 | onActivated: navPane.goToPage(1) 149 | } 150 | Shortcut { 151 | sequence: "e" 152 | onActivated: navPane.goToPage(2) 153 | } 154 | Shortcut { 155 | sequence: "Alt+e" 156 | onActivated: navPane.goToPage(2) 157 | } 158 | Shortcut { 159 | sequence: "r" 160 | onActivated: navPane.goToPage(3) 161 | } 162 | Shortcut { 163 | sequence: "Alt+r" 164 | onActivated: navPane.goToPage(3) 165 | } 166 | Shortcut { 167 | sequence: "s" 168 | onActivated: navPane.goToPage(4) 169 | } 170 | Shortcut { 171 | sequence: "Alt+s" 172 | onActivated: navPane.goToPage(4) 173 | } 174 | Shortcut { 175 | sequence: "d" 176 | onActivated: navPane.goToPage(5) 177 | } 178 | Shortcut { 179 | sequence: "Alt+d" 180 | onActivated: navPane.goToPage(5) 181 | } 182 | // n == NEXT 183 | Shortcut { 184 | sequence: "n" 185 | onActivated: navPane.pushNextPage() 186 | } 187 | // p == PREVIOUS 188 | Shortcut { 189 | sequence: "p" 190 | onActivated: navPane.popOnePage() 191 | } 192 | Shortcut { 193 | sequence: " " 194 | onActivated: navPane.pushNextPage() 195 | } 196 | Shortcut { 197 | sequence: "Shift+ " 198 | onActivated: navPane.popOnePage() 199 | } 200 | 201 | // go one level back in stack 202 | function popOnePage() { 203 | if(navPane.depth == 1) { 204 | return 205 | } 206 | // check if target page already is on the stack 207 | var targetIsUninitialized = false 208 | if(!navPane.get(navPane.depth-2)) { 209 | targetIsUninitialized = true 210 | } 211 | var page = pop() 212 | if(targetIsUninitialized) { 213 | navPane.currentItem.init() 214 | } 215 | // do cleanup from previous page 216 | page.cleanup() 217 | } // popOnePage 218 | 219 | function pushOnePage(pageComponent) { 220 | var page = push(pageComponent) 221 | page.init() 222 | } 223 | 224 | function pushNextPage() { 225 | switch(navPane.depth) { 226 | case 1: 227 | pushOnePage(pageTwo) 228 | break; 229 | case 2: 230 | pushOnePage(pageThree) 231 | break; 232 | case 3: 233 | pushOnePage(pageFour) 234 | break; 235 | case 4: 236 | pushOnePage(pageFive) 237 | break; 238 | default: 239 | // nothing - 5 is max 240 | } 241 | } // pushNextPage 242 | 243 | function findPage(pageName) { 244 | var targetPage = find(function(item) { 245 | return item.name == pageName; 246 | }) 247 | if(targetPage) { 248 | return targetPage.StackView.index 249 | } else { 250 | console.log("Page not found in StackView: "+pageName) 251 | return -1 252 | } 253 | } 254 | 255 | function goUpTo(pageNumber) { 256 | var count = pageNumber-navPane.depth 257 | var pages = new Array (count) 258 | for(var i = 0; i < count; i++) { 259 | var thePageNumber = navPane.depth+i+1 260 | switch(thePageNumber) { 261 | case 1: 262 | pages[i] = pageOne 263 | break; 264 | case 2: 265 | pages[i] = pageTwo 266 | break; 267 | case 3: 268 | pages[i] = pageThree 269 | break; 270 | case 4: 271 | pages[i] = pageFour 272 | break; 273 | case 5: 274 | pages[i] = pageFive 275 | break; 276 | default: 277 | // nothing 278 | return 279 | } 280 | } 281 | var page = push(pages) 282 | page.init() 283 | } // goUpTo 284 | 285 | function goDownTo(pageNumber) { 286 | // check if cleanup must be done for popped pages 287 | var count = navPane.depth-pageNumber 288 | for(var i = 0; i < count; i++) { 289 | if(navPane.get(navPane.depth-i-1)) { 290 | navPane.get(navPane.depth-i-1).cleanup() 291 | } 292 | } 293 | // pop all pages until targetPage will be on top 294 | // check if target page already is on the stack 295 | var targetIsUninitialized = false 296 | if(!navPane.get(pageNumber-1)) { 297 | targetIsUninitialized = true 298 | } 299 | // don't forget to set StackView.ForceLoad 300 | // otherwise if get() is null and get(null) means jump to root 301 | pop(navPane.get(pageNumber-1, StackView.ForceLoad)) 302 | if(targetIsUninitialized) { 303 | navPane.get(pageNumber-1).init() 304 | } 305 | } // goDownTo 306 | 307 | function goToPage(pageNumber) { 308 | if(pageNumber == navPane.depth) { 309 | // it's the current page 310 | return 311 | } 312 | if(pageNumber > navPane.depth) { 313 | goUpTo(pageNumber) 314 | return 315 | } 316 | goDownTo(pageNumber) 317 | } // goToPage 318 | } // navPane 319 | 320 | Component { 321 | id: pageOne 322 | PageOne { 323 | id: page 324 | // we only need this for initialItem 325 | // items on stack will init() after push() 326 | Component.onCompleted: { 327 | page.init() 328 | } 329 | } 330 | } // pageOne 331 | 332 | Component { 333 | id: pageTwo 334 | PageTwo { 335 | } 336 | } // pageTwo 337 | 338 | Component { 339 | id: pageThree 340 | PageThree { 341 | } 342 | } 343 | 344 | Component { 345 | id: pageFour 346 | PageFour { 347 | } 348 | } 349 | 350 | Component { 351 | id: pageFive 352 | PageFive { 353 | } 354 | } 355 | 356 | function switchPrimaryPalette(paletteIndex) { 357 | primaryPalette = myApp.primaryPalette(paletteIndex) 358 | } 359 | function switchAccentPalette(paletteIndex) { 360 | accentPalette = myApp.accentPalette(paletteIndex) 361 | } 362 | 363 | // we can loose the focus if Menu or Popup is opened 364 | function resetFocus() { 365 | navPane.focus = true 366 | } 367 | 368 | // 369 | PopupPalette { 370 | id: popup 371 | onAboutToHide: { 372 | resetFocus() 373 | } 374 | } 375 | footer: Rectangle{ 376 | id:footerId 377 | width: parent.width 378 | height: 40 379 | color:dropShadow 380 | RowLayout{ 381 | anchors.fill: parent 382 | spacing: 0 383 | ButtonRaised { 384 | text: qsTr("Home") 385 | onClicked: { 386 | navPane.pushOnePage(pageOne) 387 | } 388 | } 389 | ButtonRaised { 390 | text: qsTr("Recieve") 391 | onClicked: { 392 | navPane.pushOnePage(pageTwo) 393 | } 394 | } 395 | ButtonRaised { 396 | text: qsTr("Send") 397 | onClicked: { 398 | navPane.pushOnePage(pageThree) 399 | } 400 | } 401 | ButtonRaised { 402 | text: qsTr("Trade") 403 | onClicked: { 404 | navPane.pushOnePage(pageFour) 405 | } 406 | } 407 | ButtonRaised { 408 | text: qsTr("Message") 409 | onClicked: { 410 | navPane.pushOnePage(pageFive) 411 | } 412 | } 413 | } 414 | } 415 | 416 | } // app window 417 | -------------------------------------------------------------------------------- /pages/PageFive.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "../common" 8 | 9 | Flickable { 10 | id: flickable 11 | contentHeight: root.implicitHeight 12 | // StackView manages this, so please no anchors here 13 | // anchors.fill: parent 14 | property string name: "PageFive" 15 | property string title: qsTr("Ripple Client Message Center") 16 | Pane { 17 | id: root 18 | anchors.fill: parent 19 | ColumnLayout { 20 | anchors.right: parent.right 21 | anchors.left: parent.left 22 | LabelHeadline { 23 | leftPadding: 10 24 | text: qsTr("Hello My Message...") 25 | } 26 | HorizontalDivider {} 27 | RowLayout { 28 | LabelSubheading { 29 | topPadding: 6 30 | bottomPadding: 6 31 | leftPadding: 10 32 | rightPadding: 10 33 | wrapMode: Text.WordWrap 34 | text: qsTr("This is page 5 of 5 - the top most page\n\nNavigate back to previous page:\n* Button labeled 'POP'\n* Back Button placed top-left in Titlebar\n* on Android: System Back Button at bottom left\n\nNavigate back to the root using the FAB\n\nJump back to 'PageThree' using Button 'BACK TO 3'\n'PageFour' will automatically pop()\n\nButton 'FIND 3' tries to find 'PageThree' by property 'name'.\nFind will only work if page is instantiated. More details in blog entry.\n") 35 | } 36 | } 37 | HorizontalDivider{} 38 | RowLayout { 39 | // implicite fillWidth = true 40 | spacing: 10 41 | ButtonFlat { 42 | text: "Go Back" 43 | textColor: accentColor 44 | onClicked: { 45 | navPane.popOnePage() 46 | } 47 | } 48 | ButtonFlat { 49 | text: "Goto Send" 50 | onClicked: { 51 | var stackIndex = navPane.findPage("PageThree") 52 | if(stackIndex >= 0) { 53 | navPane.goToPage(stackIndex + 1) 54 | } else { 55 | statusLabel.text = qsTr("PageThree not found in StackView") 56 | } 57 | } 58 | } 59 | ButtonFlat { 60 | text: "Back To 3" 61 | onClicked: { 62 | navPane.goToPage(3) 63 | } 64 | } 65 | } // button row 66 | HorizontalDivider {} 67 | LabelSubheading { 68 | id: statusLabel 69 | visible: text.length 70 | text: "" 71 | color: "red" 72 | } 73 | } // col layout 74 | } // pane root 75 | ScrollIndicator.vertical: ScrollIndicator { } 76 | 77 | function whoAmI() { 78 | return qsTr("Message from Page Five") 79 | } 80 | // called immediately after push() 81 | function init() { 82 | console.log(qsTr("Init done from Five")) 83 | } 84 | // called immediately after pop() 85 | function cleanup() { 86 | console.log(qsTr("Cleanup done from Five")) 87 | } 88 | } // flickable 89 | -------------------------------------------------------------------------------- /pages/PageFour.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "../common" 8 | 9 | Flickable { 10 | id: flickable 11 | contentHeight: root.implicitHeight 12 | // StackView manages this, so please no anchors here 13 | // anchors.fill: parent 14 | property string name: "PageFour" 15 | property string title: qsTr("Trade For Ripple") 16 | Pane { 17 | id: root 18 | anchors.fill: parent 19 | ColumnLayout { 20 | anchors.right: parent.right 21 | anchors.left: parent.left 22 | LabelHeadline { 23 | leftPadding: 10 24 | text: qsTr("Hello Trader...") 25 | } 26 | HorizontalDivider {} 27 | RowLayout { 28 | LabelSubheading { 29 | topPadding: 6 30 | bottomPadding: 6 31 | leftPadding: 10 32 | rightPadding: 10 33 | wrapMode: Text.WordWrap 34 | text: qsTr("This is page 4 of 5\n\nNavigate back to previous page:\n* Button labeled 'POP'\n* Back Button placed top-left in Titlebar\n* on Android: System Back Button at bottom left\n\nNavigate forward to the next page 'PageFive' using the FAB or Button 'PUSH 5'\n\nBelow the buttons a text is displayed:\n* 'Message from Page Three' or\n* 'n/a' if PageThree is not loaded because we 'jumped' from 2 to 5\n\n") 35 | } 36 | } 37 | HorizontalDivider {} 38 | RowLayout { 39 | // implicite fillWidth = true 40 | spacing: 10 41 | ButtonFlat { 42 | text: "Go Back" 43 | textColor: accentColor 44 | onClicked: { 45 | navPane.popOnePage() 46 | } 47 | } 48 | ButtonFlat { 49 | text: "Goto Message" 50 | onClicked: { 51 | navPane.pushOnePage(pageFive) 52 | } 53 | } 54 | Item { 55 | // dummi placeholder 56 | Layout.preferredWidth : 1 57 | Layout.fillWidth: true 58 | } 59 | } // button row 60 | HorizontalDivider {} 61 | LabelSubheading { 62 | // to load the page if uninitialized, use: 63 | // text: navPane.get(2, StackView.ForceLoad).whoAmI() 64 | // default is StackView.DontLoad, so check for null ! 65 | text: navPane.get(2)? navPane.get(2, StackView.ForceLoad).whoAmI() : "n/a" 66 | } 67 | } // col layout 68 | } // pane root 69 | ScrollIndicator.vertical: ScrollIndicator { } 70 | 71 | function whoAmI() { 72 | return qsTr("Message from Page Four") 73 | } 74 | // called immediately after push() 75 | function init() { 76 | console.log(qsTr("Init done from Four")) 77 | } 78 | // called immediately after pop() 79 | function cleanup() { 80 | console.log(qsTr("Cleanup done from Four")) 81 | } 82 | } // flickable 83 | -------------------------------------------------------------------------------- /pages/PageOne.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "../common" 8 | 9 | Flickable { 10 | id: flickable 11 | contentHeight: root.implicitHeight 12 | // StackView manages this, so please no anchors here 13 | // anchors.fill: parent 14 | property string name: "PageOne" 15 | property string title: qsTr("Ripple Client Wallet") 16 | Pane { 17 | id: root 18 | anchors.fill: parent 19 | ColumnLayout { 20 | anchors.right: parent.right 21 | anchors.left: parent.left 22 | LabelHeadline { 23 | leftPadding: 10 24 | text: qsTr("About Ripple....") 25 | } 26 | HorizontalDivider {} 27 | RowLayout { 28 | LabelSubheading { 29 | topPadding: 6 30 | bottomPadding: 6 31 | leftPadding: 10 32 | rightPadding: 10 33 | wrapMode: Text.WordWrap 34 | text: qsTr("Ripple is a network of computers which use the Ripple consensus algorithm to atomically settle and record transactions on a secure distributed database, the Ripple Consensus Ledger (RCL). Because of its distributed nature, the RCL offers transaction immutability without a central operator. The RCL contains a built-in currency exchange and its path-finding algorithm finds competitive exchange rates across order books and currency pairs\n") 35 | } 36 | } 37 | HorizontalDivider {} 38 | RowLayout { 39 | // implicite fillWidth = true 40 | spacing: 10 41 | Item { 42 | // dummi placeholder 43 | Layout.preferredWidth : 1 44 | Layout.fillWidth: true 45 | } 46 | ButtonFlat { 47 | text: qsTr("Go Trade") 48 | onClicked: { 49 | navPane.pushOnePage(pageFour) 50 | } 51 | } 52 | Item { 53 | // dummi placeholder 54 | Layout.preferredWidth : 1 55 | Layout.fillWidth: true 56 | } 57 | } // button row 58 | } // col layou 59 | 60 | } // root 61 | ScrollIndicator.vertical: ScrollIndicator { } 62 | 63 | function whoAmI() { 64 | return qsTr("Message from Page One") 65 | } 66 | // called immediately after push() 67 | function init() { 68 | console.log(qsTr("Init done from One")) 69 | } 70 | // called immediately after pop() 71 | function cleanup() { 72 | console.log(qsTr("Cleanup done from One")) 73 | } 74 | } // flickable 75 | -------------------------------------------------------------------------------- /pages/PageThree.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "../common" 8 | 9 | Flickable { 10 | id: flickable 11 | contentHeight: root.implicitHeight 12 | // StackView manages this, so please no anchors here 13 | // anchors.fill: parent 14 | property string name: "PageThree" 15 | property string title: qsTr("Send Ripple To Some Ripple Wallet Address") 16 | 17 | Pane { 18 | id: root 19 | anchors.fill: parent 20 | ColumnLayout { 21 | anchors.right: parent.right 22 | anchors.left: parent.left 23 | LabelHeadline { 24 | leftPadding: 10 25 | text: qsTr("Hello Senders") 26 | } 27 | HorizontalDivider {} 28 | RowLayout { 29 | LabelSubheading { 30 | topPadding: 6 31 | bottomPadding: 6 32 | leftPadding: 10 33 | rightPadding: 10 34 | wrapMode: Text.WordWrap 35 | text: qsTr("This is page 3 of 5\nHere we're using another kind of Material Buttons: Flat Buttons\n\nNavigate back to previous page:\n* Button labeled 'POP'\n* Back Button placed top-left in Titlebar\n* on Android: System Back Button at bottom left\n\nNavigate forward to the next page 'PageFour' using the FAB or Button 'PUSH 4'\n\n") 36 | } 37 | } 38 | HorizontalDivider {} 39 | RowLayout { 40 | // implicite fillWidth = true 41 | spacing: 10 42 | ButtonFlat { 43 | text: "Go Back" 44 | textColor: accentColor 45 | onClicked: { 46 | navPane.popOnePage() 47 | } 48 | } 49 | ButtonFlat { 50 | text: "Goto Trader" 51 | onClicked: { 52 | navPane.pushOnePage(pageFour) 53 | } 54 | } 55 | Item { 56 | // dummi placeholder for up to 2 more buttons 57 | Layout.preferredWidth : 1 58 | Layout.fillWidth: true 59 | } 60 | } // button row 61 | } // col layout 62 | } // pane root 63 | ScrollIndicator.vertical: ScrollIndicator { } 64 | 65 | function whoAmI() { 66 | return qsTr("Message from Page Three") 67 | } 68 | // called immediately after push() 69 | function init() { 70 | console.log(qsTr("Init done from Three")) 71 | } 72 | // called immediately after pop() 73 | function cleanup() { 74 | console.log(qsTr("Cleanup done from Three")) 75 | } 76 | } // flickable 77 | 78 | -------------------------------------------------------------------------------- /pages/PageTwo.qml: -------------------------------------------------------------------------------- 1 | // ekke (Ekkehard Gentz) @ekkescorner 2 | import QtQuick 2.9 3 | import QtQuick.Layouts 1.3 4 | import QtQuick.Controls 2.2 5 | import QtQuick.Controls.Material 2.2 6 | import QtGraphicalEffects 1.0 7 | import "../common" 8 | 9 | Flickable { 10 | id: flickable 11 | contentHeight: root.implicitHeight 12 | // StackView manages this, so please no anchors here 13 | // anchors.fill: parent 14 | property string name: "PageTwo" 15 | property string title: qsTr("Recieve Ripple From Wallet Address") 16 | Pane { 17 | id: root 18 | anchors.fill: parent 19 | ColumnLayout { 20 | anchors.right: parent.right 21 | anchors.left: parent.left 22 | LabelHeadline { 23 | leftPadding: 10 24 | text: qsTr("Hello Recieve...") 25 | } 26 | HorizontalDivider {} 27 | RowLayout { 28 | LabelSubheading { 29 | topPadding: 6 30 | bottomPadding: 6 31 | leftPadding: 10 32 | rightPadding: 10 33 | wrapMode: Text.WordWrap 34 | text: qsTr("This is page 2 of 5\n\nNavigate back to previous page:\n* Button labeled 'POP'\n* Back Button placed top-left in Titlebar\n* on Android: System Back Button at bottom left\n\nNavigate forward to the next page 'PageThree' using the FAB or Button 'PUSH 3'\n\nButton labeled GOTO 5 jumps up to the top most page: PageFive. In this case PageThree and PageFour are NOT loaded - only Components are placed as placeholders in stack\n") 35 | } 36 | } 37 | HorizontalDivider {} 38 | RowLayout { 39 | // implicite fillWidth = true 40 | spacing: 10 41 | ButtonRaised { 42 | text: "Go Back" 43 | buttonColor: accentColor 44 | onClicked: { 45 | navPane.popOnePage() 46 | } 47 | } 48 | ButtonRaised { 49 | text: "Goto Sender" 50 | onClicked: { 51 | navPane.pushOnePage(pageThree) 52 | } 53 | } 54 | ButtonRaised { 55 | text: "GoTo Message" 56 | onClicked: { 57 | navPane.goToPage(5) 58 | } 59 | } 60 | } // button row 61 | } // col layout 62 | } // pane root 63 | ScrollIndicator.vertical: ScrollIndicator { } 64 | 65 | function whoAmI() { 66 | return qsTr("Message from Page Two") 67 | } 68 | // called immediately after push() 69 | function init() { 70 | console.log(qsTr("Init done from Two")) 71 | } 72 | // called immediately after pop() 73 | function cleanup() { 74 | console.log(qsTr("Cleanup done from Two")) 75 | } 76 | } // flickable 77 | -------------------------------------------------------------------------------- /qml.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | main.qml 4 | common/VerticalDivider.qml 5 | common/HorizontalDivider.qml 6 | common/SwitchWithLeftLabel.qml 7 | common/SimpleTextTitle.qml 8 | common/PopupPalette.qml 9 | common/LabelCaption.qml 10 | common/LabelBody.qml 11 | common/LabelBodySecondary.qml 12 | common/LabelSubheading.qml 13 | common/LabelTitle.qml 14 | common/LabelHeadline.qml 15 | common/LabelDisplay1.qml 16 | common/LabelDisplay2.qml 17 | common/LabelDisplay3.qml 18 | common/LabelDisplay4.qml 19 | common/FloatingActionButton.qml 20 | common/FloatingActionMiniButton.qml 21 | common/IconActive.qml 22 | common/IconInactive.qml 23 | common/IconColored.qml 24 | pages/PageOne.qml 25 | pages/PageTwo.qml 26 | pages/PageFour.qml 27 | pages/PageThree.qml 28 | pages/PageFive.qml 29 | common/ButtonRaised.qml 30 | common/ButtonFlat.qml 31 | common/StackTextTitle.qml 32 | common/SwipeArea.qml 33 | common/FlickableArea.qml 34 | 35 | 36 | -------------------------------------------------------------------------------- /stackedpages.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = app 2 | TARGET = stackedpages 3 | 4 | QT += qml quick core 5 | CONFIG += c++11 console 6 | 7 | HEADERS += \ 8 | applicationui.hpp \ 9 | uiconstants.hpp 10 | 11 | SOURCES += main.cpp \ 12 | applicationui.cpp 13 | 14 | lupdate_only { 15 | SOURCES += main.qml \ 16 | common/*.qml \ 17 | pages/*.qml 18 | } 19 | 20 | OTHER_FILES += images/black/*.png \ 21 | images/black/x18/*.png \ 22 | images/black/x36/*.png \ 23 | images/black/x48/*.png \ 24 | images/white/*.png \ 25 | images/white/x18/*.png \ 26 | images/white/x36/*.png \ 27 | images/white/x48/*.png \ 28 | translations/*.* \ 29 | images/LICENSE \ 30 | LICENSE \ 31 | *.md 32 | 33 | RESOURCES += \ 34 | translations.qrc \ 35 | qml.qrc \ 36 | images.qrc 37 | 38 | # Additional import path used to resolve QML modules in Qt Creator's code model 39 | QML_IMPORT_PATH = 40 | 41 | # Default rules for deployment. 42 | include(deployment.pri) 43 | 44 | lupdate_only { # that way those files will be skipped by C++ compiler 45 | SOURCES = *.qml \ 46 | pages/*.qml \ 47 | common/*.qml 48 | } 49 | #TRANSLATIONS += $$PWD/translations/cn.ts $$PWD/translations/en.ts 50 | 51 | # T R A N S L A T I O N S 52 | 53 | # if languages are added: 54 | # 1. rebuild project to generate *.qm 55 | # 2. add existing .qm files to translations.qrc 56 | 57 | # if changes to translatable strings: 58 | # 1. Run Tools-External-Linguist-Update 59 | # 2. Run Linguist and do translations 60 | # 3. Build and run on iOS and Android to verify translations 61 | # 4. Optional: if translations not done: Run Tools-External-Linguist-Release 62 | 63 | # Supported languages 64 | LANGUAGES = en zh_CN 65 | 66 | # used to create .ts files 67 | defineReplace(prependAll) { 68 | for(a,$$1):result += $$2$${a}$$3 69 | return($$result) 70 | } 71 | # Available translations 72 | tsroot = $$join(TARGET,,,.ts) 73 | tstarget = $$join(TARGET,,,_) 74 | TRANSLATIONS = $$PWD/translations/$$tsroot 75 | TRANSLATIONS += $$prependAll(LANGUAGES, $$PWD/translations/$$tstarget, .ts) 76 | # run LRELEASE to generate the qm files 77 | qtPrepareTool(LRELEASE, lrelease) 78 | for(tsfile, TRANSLATIONS) { 79 | command = $$LRELEASE $$tsfile 80 | system($$command)|error("Failed to run: $$command") 81 | } 82 | -------------------------------------------------------------------------------- /translations.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | translations/stackedpages.qm 4 | translations/stackedpages_cn.qm 5 | translations/stackedpages_en.qm 6 | translations/stackedpages_zh_CN.qm 7 | 8 | 9 | -------------------------------------------------------------------------------- /translations/stackedpages.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PageFive 6 | 7 | 8 | Ripple Client Message Center 9 | 10 | 11 | 12 | 13 | Hello My Message... 14 | 15 | 16 | 17 | 18 | This is page 5 of 5 - the top most page 19 | 20 | Navigate back to previous page: 21 | * Button labeled 'POP' 22 | * Back Button placed top-left in Titlebar 23 | * on Android: System Back Button at bottom left 24 | 25 | Navigate back to the root using the FAB 26 | 27 | Jump back to 'PageThree' using Button 'BACK TO 3' 28 | 'PageFour' will automatically pop() 29 | 30 | Button 'FIND 3' tries to find 'PageThree' by property 'name'. 31 | Find will only work if page is instantiated. More details in blog entry. 32 | 33 | 34 | 35 | 36 | 37 | PageThree not found in StackView 38 | 39 | 40 | 41 | 42 | Message from Page Five 43 | 44 | 45 | 46 | 47 | Init done from Five 48 | 49 | 50 | 51 | 52 | Cleanup done from Five 53 | 54 | 55 | 56 | 57 | PageFour 58 | 59 | 60 | Trade For Ripple 61 | 62 | 63 | 64 | 65 | Hello Trader... 66 | 67 | 68 | 69 | 70 | This is page 4 of 5 71 | 72 | Navigate back to previous page: 73 | * Button labeled 'POP' 74 | * Back Button placed top-left in Titlebar 75 | * on Android: System Back Button at bottom left 76 | 77 | Navigate forward to the next page 'PageFive' using the FAB or Button 'PUSH 5' 78 | 79 | Below the buttons a text is displayed: 80 | * 'Message from Page Three' or 81 | * 'n/a' if PageThree is not loaded because we 'jumped' from 2 to 5 82 | 83 | 84 | 85 | 86 | 87 | 88 | Message from Page Four 89 | 90 | 91 | 92 | 93 | Init done from Four 94 | 95 | 96 | 97 | 98 | Cleanup done from Four 99 | 100 | 101 | 102 | 103 | PageOne 104 | 105 | 106 | Ripple Client Wallet 107 | 108 | 109 | 110 | 111 | About Ripple.... 112 | 113 | 114 | 115 | 116 | Ripple is a network of computers which use the Ripple consensus algorithm to atomically settle and record transactions on a secure distributed database, the Ripple Consensus Ledger (RCL). Because of its distributed nature, the RCL offers transaction immutability without a central operator. The RCL contains a built-in currency exchange and its path-finding algorithm finds competitive exchange rates across order books and currency pairs 117 | 118 | 119 | 120 | 121 | 122 | Go Trade 123 | 124 | 125 | 126 | 127 | Message from Page One 128 | 129 | 130 | 131 | 132 | Init done from One 133 | 134 | 135 | 136 | 137 | Cleanup done from One 138 | 139 | 140 | 141 | 142 | PageThree 143 | 144 | 145 | Send Ripple To Some Ripple Wallet Address 146 | 147 | 148 | 149 | 150 | Hello Senders 151 | 152 | 153 | 154 | 155 | This is page 3 of 5 156 | Here we're using another kind of Material Buttons: Flat Buttons 157 | 158 | Navigate back to previous page: 159 | * Button labeled 'POP' 160 | * Back Button placed top-left in Titlebar 161 | * on Android: System Back Button at bottom left 162 | 163 | Navigate forward to the next page 'PageFour' using the FAB or Button 'PUSH 4' 164 | 165 | 166 | 167 | 168 | 169 | 170 | Message from Page Three 171 | 172 | 173 | 174 | 175 | Init done from Three 176 | 177 | 178 | 179 | 180 | Cleanup done from Three 181 | 182 | 183 | 184 | 185 | PageTwo 186 | 187 | 188 | Recieve Ripple From Wallet Address 189 | 190 | 191 | 192 | 193 | Hello Recieve... 194 | 195 | 196 | 197 | 198 | This is page 2 of 5 199 | 200 | Navigate back to previous page: 201 | * Button labeled 'POP' 202 | * Back Button placed top-left in Titlebar 203 | * on Android: System Back Button at bottom left 204 | 205 | Navigate forward to the next page 'PageThree' using the FAB or Button 'PUSH 3' 206 | 207 | Button labeled GOTO 5 jumps up to the top most page: PageFive. In this case PageThree and PageFour are NOT loaded - only Components are placed as placeholders in stack 208 | 209 | 210 | 211 | 212 | 213 | Message from Page Two 214 | 215 | 216 | 217 | 218 | Init done from Two 219 | 220 | 221 | 222 | 223 | Cleanup done from Two 224 | 225 | 226 | 227 | 228 | PopupPalette 229 | 230 | 231 | Material Red 232 | 233 | 234 | 235 | 236 | Material Pink 237 | 238 | 239 | 240 | 241 | Material Purple 242 | 243 | 244 | 245 | 246 | Material DeepPurple 247 | 248 | 249 | 250 | 251 | Material Indigo 252 | 253 | 254 | 255 | 256 | Material Blue 257 | 258 | 259 | 260 | 261 | Material LightBlue 262 | 263 | 264 | 265 | 266 | Material Cyan 267 | 268 | 269 | 270 | 271 | Material Teal 272 | 273 | 274 | 275 | 276 | Material Green 277 | 278 | 279 | 280 | 281 | Material LightGreen 282 | 283 | 284 | 285 | 286 | Material Lime 287 | 288 | 289 | 290 | 291 | Material Yellow 292 | 293 | 294 | 295 | 296 | Material Amber 297 | 298 | 299 | 300 | 301 | Material Orange 302 | 303 | 304 | 305 | 306 | Material DeepOrange 307 | 308 | 309 | 310 | 311 | Material Brown 312 | 313 | 314 | 315 | 316 | Material Grey 317 | 318 | 319 | 320 | 321 | Material BlueGrey 322 | 323 | 324 | 325 | 326 | SimpleTextTitle 327 | 328 | 329 | Light Theme 330 | 331 | 332 | 333 | 334 | Dark Theme 335 | 336 | 337 | 338 | 339 | Select Primary Color 340 | 341 | 342 | 343 | 344 | Select Accent Color 345 | 346 | 347 | 348 | 349 | StackTextTitle 350 | 351 | 352 | Light Theme 353 | 354 | 355 | 356 | 357 | Dark Theme 358 | 359 | 360 | 361 | 362 | Select Primary Color 363 | 364 | 365 | 366 | 367 | Select Accent Color 368 | 369 | 370 | 371 | 372 | main 373 | 374 | 375 | A simple Stacked - Pages APP 376 | 377 | 378 | 379 | 380 | Home 381 | 382 | 383 | 384 | 385 | Recieve 386 | 387 | 388 | 389 | 390 | Send 391 | 392 | 393 | 394 | 395 | Trade 396 | 397 | 398 | 399 | 400 | Message 401 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /translations/stackedpages_cn.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PageFive 6 | 7 | 8 | Ripple Client Message Center 9 | 10 | 11 | 12 | 13 | Hello My Message... 14 | 15 | 16 | 17 | 18 | This is page 5 of 5 - the top most page 19 | 20 | Navigate back to previous page: 21 | * Button labeled 'POP' 22 | * Back Button placed top-left in Titlebar 23 | * on Android: System Back Button at bottom left 24 | 25 | Navigate back to the root using the FAB 26 | 27 | Jump back to 'PageThree' using Button 'BACK TO 3' 28 | 'PageFour' will automatically pop() 29 | 30 | Button 'FIND 3' tries to find 'PageThree' by property 'name'. 31 | Find will only work if page is instantiated. More details in blog entry. 32 | 33 | 34 | 35 | 36 | 37 | PageThree not found in StackView 38 | 39 | 40 | 41 | 42 | Message from Page Five 43 | 44 | 45 | 46 | 47 | Init done from Five 48 | 49 | 50 | 51 | 52 | Cleanup done from Five 53 | 54 | 55 | 56 | 57 | PageFour 58 | 59 | 60 | Trade For Ripple 61 | 62 | 63 | 64 | 65 | Hello Trader... 66 | 67 | 68 | 69 | 70 | This is page 4 of 5 71 | 72 | Navigate back to previous page: 73 | * Button labeled 'POP' 74 | * Back Button placed top-left in Titlebar 75 | * on Android: System Back Button at bottom left 76 | 77 | Navigate forward to the next page 'PageFive' using the FAB or Button 'PUSH 5' 78 | 79 | Below the buttons a text is displayed: 80 | * 'Message from Page Three' or 81 | * 'n/a' if PageThree is not loaded because we 'jumped' from 2 to 5 82 | 83 | 84 | 85 | 86 | 87 | 88 | Message from Page Four 89 | 90 | 91 | 92 | 93 | Init done from Four 94 | 95 | 96 | 97 | 98 | Cleanup done from Four 99 | 100 | 101 | 102 | 103 | PageOne 104 | 105 | 106 | Ripple Client Wallet 107 | 108 | 109 | 110 | 111 | About Ripple.... 112 | 113 | 114 | 115 | 116 | Ripple is a network of computers which use the Ripple consensus algorithm to atomically settle and record transactions on a secure distributed database, the Ripple Consensus Ledger (RCL). Because of its distributed nature, the RCL offers transaction immutability without a central operator. The RCL contains a built-in currency exchange and its path-finding algorithm finds competitive exchange rates across order books and currency pairs 117 | 118 | 119 | 120 | 121 | 122 | Go Trade 123 | 124 | 125 | 126 | 127 | Message from Page One 128 | 129 | 130 | 131 | 132 | Init done from One 133 | 134 | 135 | 136 | 137 | Cleanup done from One 138 | 139 | 140 | 141 | 142 | PageThree 143 | 144 | 145 | Send Ripple To Some Ripple Wallet Address 146 | 147 | 148 | 149 | 150 | Hello Senders 151 | 152 | 153 | 154 | 155 | This is page 3 of 5 156 | Here we're using another kind of Material Buttons: Flat Buttons 157 | 158 | Navigate back to previous page: 159 | * Button labeled 'POP' 160 | * Back Button placed top-left in Titlebar 161 | * on Android: System Back Button at bottom left 162 | 163 | Navigate forward to the next page 'PageFour' using the FAB or Button 'PUSH 4' 164 | 165 | 166 | 167 | 168 | 169 | 170 | Message from Page Three 171 | 172 | 173 | 174 | 175 | Init done from Three 176 | 177 | 178 | 179 | 180 | Cleanup done from Three 181 | 182 | 183 | 184 | 185 | PageTwo 186 | 187 | 188 | Recieve Ripple From Wallet Address 189 | 190 | 191 | 192 | 193 | Hello Recieve... 194 | 195 | 196 | 197 | 198 | This is page 2 of 5 199 | 200 | Navigate back to previous page: 201 | * Button labeled 'POP' 202 | * Back Button placed top-left in Titlebar 203 | * on Android: System Back Button at bottom left 204 | 205 | Navigate forward to the next page 'PageThree' using the FAB or Button 'PUSH 3' 206 | 207 | Button labeled GOTO 5 jumps up to the top most page: PageFive. In this case PageThree and PageFour are NOT loaded - only Components are placed as placeholders in stack 208 | 209 | 210 | 211 | 212 | 213 | Message from Page Two 214 | 215 | 216 | 217 | 218 | Init done from Two 219 | 220 | 221 | 222 | 223 | Cleanup done from Two 224 | 225 | 226 | 227 | 228 | PopupPalette 229 | 230 | 231 | Material Red 232 | 233 | 234 | 235 | 236 | Material Pink 237 | 238 | 239 | 240 | 241 | Material Purple 242 | 243 | 244 | 245 | 246 | Material DeepPurple 247 | 248 | 249 | 250 | 251 | Material Indigo 252 | 253 | 254 | 255 | 256 | Material Blue 257 | 258 | 259 | 260 | 261 | Material LightBlue 262 | 263 | 264 | 265 | 266 | Material Cyan 267 | 268 | 269 | 270 | 271 | Material Teal 272 | 273 | 274 | 275 | 276 | Material Green 277 | 278 | 279 | 280 | 281 | Material LightGreen 282 | 283 | 284 | 285 | 286 | Material Lime 287 | 288 | 289 | 290 | 291 | Material Yellow 292 | 293 | 294 | 295 | 296 | Material Amber 297 | 298 | 299 | 300 | 301 | Material Orange 302 | 303 | 304 | 305 | 306 | Material DeepOrange 307 | 308 | 309 | 310 | 311 | Material Brown 312 | 313 | 314 | 315 | 316 | Material Grey 317 | 318 | 319 | 320 | 321 | Material BlueGrey 322 | 323 | 324 | 325 | 326 | SimpleTextTitle 327 | 328 | 329 | Light Theme 330 | 331 | 332 | 333 | 334 | Dark Theme 335 | 336 | 337 | 338 | 339 | Select Primary Color 340 | 341 | 342 | 343 | 344 | Select Accent Color 345 | 346 | 347 | 348 | 349 | StackTextTitle 350 | 351 | 352 | Light Theme 353 | 354 | 355 | 356 | 357 | Dark Theme 358 | 359 | 360 | 361 | 362 | Select Primary Color 363 | 364 | 365 | 366 | 367 | Select Accent Color 368 | 369 | 370 | 371 | 372 | main 373 | 374 | 375 | A simple Stacked - Pages APP 376 | 377 | 378 | 379 | 380 | Home 381 | 382 | 383 | 384 | 385 | Recieve 386 | 387 | 388 | 389 | 390 | Send 391 | 392 | 393 | 394 | 395 | Trade 396 | 397 | 398 | 399 | 400 | Message 401 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /translations/stackedpages_en.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PageFive 6 | 7 | 8 | Ripple Client Message Center 9 | 10 | 11 | 12 | 13 | Hello My Message... 14 | 15 | 16 | 17 | 18 | This is page 5 of 5 - the top most page 19 | 20 | Navigate back to previous page: 21 | * Button labeled 'POP' 22 | * Back Button placed top-left in Titlebar 23 | * on Android: System Back Button at bottom left 24 | 25 | Navigate back to the root using the FAB 26 | 27 | Jump back to 'PageThree' using Button 'BACK TO 3' 28 | 'PageFour' will automatically pop() 29 | 30 | Button 'FIND 3' tries to find 'PageThree' by property 'name'. 31 | Find will only work if page is instantiated. More details in blog entry. 32 | 33 | 34 | 35 | 36 | 37 | PageThree not found in StackView 38 | 39 | 40 | 41 | 42 | Message from Page Five 43 | 44 | 45 | 46 | 47 | Init done from Five 48 | 49 | 50 | 51 | 52 | Cleanup done from Five 53 | 54 | 55 | 56 | 57 | PageFour 58 | 59 | 60 | Trade For Ripple 61 | 62 | 63 | 64 | 65 | Hello Trader... 66 | 67 | 68 | 69 | 70 | This is page 4 of 5 71 | 72 | Navigate back to previous page: 73 | * Button labeled 'POP' 74 | * Back Button placed top-left in Titlebar 75 | * on Android: System Back Button at bottom left 76 | 77 | Navigate forward to the next page 'PageFive' using the FAB or Button 'PUSH 5' 78 | 79 | Below the buttons a text is displayed: 80 | * 'Message from Page Three' or 81 | * 'n/a' if PageThree is not loaded because we 'jumped' from 2 to 5 82 | 83 | 84 | 85 | 86 | 87 | 88 | Message from Page Four 89 | 90 | 91 | 92 | 93 | Init done from Four 94 | 95 | 96 | 97 | 98 | Cleanup done from Four 99 | 100 | 101 | 102 | 103 | PageOne 104 | 105 | 106 | Ripple Client Wallet 107 | 108 | 109 | 110 | 111 | About Ripple.... 112 | 113 | 114 | 115 | 116 | Ripple is a network of computers which use the Ripple consensus algorithm to atomically settle and record transactions on a secure distributed database, the Ripple Consensus Ledger (RCL). Because of its distributed nature, the RCL offers transaction immutability without a central operator. The RCL contains a built-in currency exchange and its path-finding algorithm finds competitive exchange rates across order books and currency pairs 117 | 118 | 119 | 120 | 121 | 122 | Go Trade 123 | 124 | 125 | 126 | 127 | Message from Page One 128 | 129 | 130 | 131 | 132 | Init done from One 133 | 134 | 135 | 136 | 137 | Cleanup done from One 138 | 139 | 140 | 141 | 142 | PageThree 143 | 144 | 145 | Send Ripple To Some Ripple Wallet Address 146 | 147 | 148 | 149 | 150 | Hello Senders 151 | 152 | 153 | 154 | 155 | This is page 3 of 5 156 | Here we're using another kind of Material Buttons: Flat Buttons 157 | 158 | Navigate back to previous page: 159 | * Button labeled 'POP' 160 | * Back Button placed top-left in Titlebar 161 | * on Android: System Back Button at bottom left 162 | 163 | Navigate forward to the next page 'PageFour' using the FAB or Button 'PUSH 4' 164 | 165 | 166 | 167 | 168 | 169 | 170 | Message from Page Three 171 | 172 | 173 | 174 | 175 | Init done from Three 176 | 177 | 178 | 179 | 180 | Cleanup done from Three 181 | 182 | 183 | 184 | 185 | PageTwo 186 | 187 | 188 | Recieve Ripple From Wallet Address 189 | 190 | 191 | 192 | 193 | Hello Recieve... 194 | 195 | 196 | 197 | 198 | This is page 2 of 5 199 | 200 | Navigate back to previous page: 201 | * Button labeled 'POP' 202 | * Back Button placed top-left in Titlebar 203 | * on Android: System Back Button at bottom left 204 | 205 | Navigate forward to the next page 'PageThree' using the FAB or Button 'PUSH 3' 206 | 207 | Button labeled GOTO 5 jumps up to the top most page: PageFive. In this case PageThree and PageFour are NOT loaded - only Components are placed as placeholders in stack 208 | 209 | 210 | 211 | 212 | 213 | Message from Page Two 214 | 215 | 216 | 217 | 218 | Init done from Two 219 | 220 | 221 | 222 | 223 | Cleanup done from Two 224 | 225 | 226 | 227 | 228 | PopupPalette 229 | 230 | 231 | Material Red 232 | 233 | 234 | 235 | 236 | Material Pink 237 | 238 | 239 | 240 | 241 | Material Purple 242 | 243 | 244 | 245 | 246 | Material DeepPurple 247 | 248 | 249 | 250 | 251 | Material Indigo 252 | 253 | 254 | 255 | 256 | Material Blue 257 | 258 | 259 | 260 | 261 | Material LightBlue 262 | 263 | 264 | 265 | 266 | Material Cyan 267 | 268 | 269 | 270 | 271 | Material Teal 272 | 273 | 274 | 275 | 276 | Material Green 277 | 278 | 279 | 280 | 281 | Material LightGreen 282 | 283 | 284 | 285 | 286 | Material Lime 287 | 288 | 289 | 290 | 291 | Material Yellow 292 | 293 | 294 | 295 | 296 | Material Amber 297 | 298 | 299 | 300 | 301 | Material Orange 302 | 303 | 304 | 305 | 306 | Material DeepOrange 307 | 308 | 309 | 310 | 311 | Material Brown 312 | 313 | 314 | 315 | 316 | Material Grey 317 | 318 | 319 | 320 | 321 | Material BlueGrey 322 | 323 | 324 | 325 | 326 | SimpleTextTitle 327 | 328 | 329 | Light Theme 330 | 331 | 332 | 333 | 334 | Dark Theme 335 | 336 | 337 | 338 | 339 | Select Primary Color 340 | 341 | 342 | 343 | 344 | Select Accent Color 345 | 346 | 347 | 348 | 349 | StackTextTitle 350 | 351 | 352 | Light Theme 353 | 354 | 355 | 356 | 357 | Dark Theme 358 | 359 | 360 | 361 | 362 | Select Primary Color 363 | 364 | 365 | 366 | 367 | Select Accent Color 368 | 369 | 370 | 371 | 372 | main 373 | 374 | 375 | A simple Stacked - Pages APP 376 | 377 | 378 | 379 | 380 | Home 381 | 382 | 383 | 384 | 385 | Recieve 386 | 387 | 388 | 389 | 390 | Send 391 | 392 | 393 | 394 | 395 | Trade 396 | 397 | 398 | 399 | 400 | Message 401 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /translations/stackedpages_zh_CN.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PageFive 6 | 7 | 8 | Ripple Client Message Center 9 | 10 | 11 | 12 | 13 | Hello My Message... 14 | 15 | 16 | 17 | 18 | This is page 5 of 5 - the top most page 19 | 20 | Navigate back to previous page: 21 | * Button labeled 'POP' 22 | * Back Button placed top-left in Titlebar 23 | * on Android: System Back Button at bottom left 24 | 25 | Navigate back to the root using the FAB 26 | 27 | Jump back to 'PageThree' using Button 'BACK TO 3' 28 | 'PageFour' will automatically pop() 29 | 30 | Button 'FIND 3' tries to find 'PageThree' by property 'name'. 31 | Find will only work if page is instantiated. More details in blog entry. 32 | 33 | 34 | 35 | 36 | 37 | PageThree not found in StackView 38 | 39 | 40 | 41 | 42 | Message from Page Five 43 | 44 | 45 | 46 | 47 | Init done from Five 48 | 49 | 50 | 51 | 52 | Cleanup done from Five 53 | 54 | 55 | 56 | 57 | PageFour 58 | 59 | 60 | Trade For Ripple 61 | 62 | 63 | 64 | 65 | Hello Trader... 66 | 67 | 68 | 69 | 70 | This is page 4 of 5 71 | 72 | Navigate back to previous page: 73 | * Button labeled 'POP' 74 | * Back Button placed top-left in Titlebar 75 | * on Android: System Back Button at bottom left 76 | 77 | Navigate forward to the next page 'PageFive' using the FAB or Button 'PUSH 5' 78 | 79 | Below the buttons a text is displayed: 80 | * 'Message from Page Three' or 81 | * 'n/a' if PageThree is not loaded because we 'jumped' from 2 to 5 82 | 83 | 84 | 85 | 86 | 87 | 88 | Message from Page Four 89 | 90 | 91 | 92 | 93 | Init done from Four 94 | 95 | 96 | 97 | 98 | Cleanup done from Four 99 | 100 | 101 | 102 | 103 | PageOne 104 | 105 | 106 | Ripple Client Wallet 107 | 108 | 109 | 110 | 111 | About Ripple.... 112 | 113 | 114 | 115 | 116 | Ripple is a network of computers which use the Ripple consensus algorithm to atomically settle and record transactions on a secure distributed database, the Ripple Consensus Ledger (RCL). Because of its distributed nature, the RCL offers transaction immutability without a central operator. The RCL contains a built-in currency exchange and its path-finding algorithm finds competitive exchange rates across order books and currency pairs 117 | 118 | 119 | 120 | 121 | 122 | Go Trade 123 | 124 | 125 | 126 | 127 | Message from Page One 128 | 129 | 130 | 131 | 132 | Init done from One 133 | 134 | 135 | 136 | 137 | Cleanup done from One 138 | 139 | 140 | 141 | 142 | PageThree 143 | 144 | 145 | Send Ripple To Some Ripple Wallet Address 146 | 147 | 148 | 149 | 150 | Hello Senders 151 | 152 | 153 | 154 | 155 | This is page 3 of 5 156 | Here we're using another kind of Material Buttons: Flat Buttons 157 | 158 | Navigate back to previous page: 159 | * Button labeled 'POP' 160 | * Back Button placed top-left in Titlebar 161 | * on Android: System Back Button at bottom left 162 | 163 | Navigate forward to the next page 'PageFour' using the FAB or Button 'PUSH 4' 164 | 165 | 166 | 167 | 168 | 169 | 170 | Message from Page Three 171 | 172 | 173 | 174 | 175 | Init done from Three 176 | 177 | 178 | 179 | 180 | Cleanup done from Three 181 | 182 | 183 | 184 | 185 | PageTwo 186 | 187 | 188 | Recieve Ripple From Wallet Address 189 | 190 | 191 | 192 | 193 | Hello Recieve... 194 | 195 | 196 | 197 | 198 | This is page 2 of 5 199 | 200 | Navigate back to previous page: 201 | * Button labeled 'POP' 202 | * Back Button placed top-left in Titlebar 203 | * on Android: System Back Button at bottom left 204 | 205 | Navigate forward to the next page 'PageThree' using the FAB or Button 'PUSH 3' 206 | 207 | Button labeled GOTO 5 jumps up to the top most page: PageFive. In this case PageThree and PageFour are NOT loaded - only Components are placed as placeholders in stack 208 | 209 | 210 | 211 | 212 | 213 | Message from Page Two 214 | 215 | 216 | 217 | 218 | Init done from Two 219 | 220 | 221 | 222 | 223 | Cleanup done from Two 224 | 225 | 226 | 227 | 228 | PopupPalette 229 | 230 | 231 | Material Red 232 | 233 | 234 | 235 | 236 | Material Pink 237 | 238 | 239 | 240 | 241 | Material Purple 242 | 243 | 244 | 245 | 246 | Material DeepPurple 247 | 248 | 249 | 250 | 251 | Material Indigo 252 | 253 | 254 | 255 | 256 | Material Blue 257 | 258 | 259 | 260 | 261 | Material LightBlue 262 | 263 | 264 | 265 | 266 | Material Cyan 267 | 268 | 269 | 270 | 271 | Material Teal 272 | 273 | 274 | 275 | 276 | Material Green 277 | 278 | 279 | 280 | 281 | Material LightGreen 282 | 283 | 284 | 285 | 286 | Material Lime 287 | 288 | 289 | 290 | 291 | Material Yellow 292 | 293 | 294 | 295 | 296 | Material Amber 297 | 298 | 299 | 300 | 301 | Material Orange 302 | 303 | 304 | 305 | 306 | Material DeepOrange 307 | 308 | 309 | 310 | 311 | Material Brown 312 | 313 | 314 | 315 | 316 | Material Grey 317 | 318 | 319 | 320 | 321 | Material BlueGrey 322 | 323 | 324 | 325 | 326 | SimpleTextTitle 327 | 328 | 329 | Light Theme 330 | 331 | 332 | 333 | 334 | Dark Theme 335 | 336 | 337 | 338 | 339 | Select Primary Color 340 | 341 | 342 | 343 | 344 | Select Accent Color 345 | 346 | 347 | 348 | 349 | StackTextTitle 350 | 351 | 352 | Light Theme 353 | 354 | 355 | 356 | 357 | Dark Theme 358 | 359 | 360 | 361 | 362 | Select Primary Color 363 | 364 | 365 | 366 | 367 | Select Accent Color 368 | 369 | 370 | 371 | 372 | main 373 | 374 | 375 | A simple Stacked - Pages APP 376 | 377 | 378 | 379 | 380 | Home 381 | 382 | 383 | 384 | 385 | Recieve 386 | 387 | 388 | 389 | 390 | Send 391 | 392 | 393 | 394 | 395 | Trade 396 | 397 | 398 | 399 | 400 | Message 401 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /uiconstants.hpp: -------------------------------------------------------------------------------- 1 | #ifndef UICONSTANTS_HPP 2 | // ekke (Ekkehard Gentz) @ekkescorner 3 | #define UICONSTANTS_HPP 4 | 5 | namespace ekke { 6 | namespace constants { 7 | 8 | /* 9 | * P R I M A R Y colors 10 | * from Google Material Style Guide: 11 | * http://www.google.com/design/spec/style/color.html#color-color-palette 12 | * selected colors for primary light - primary - primary dark: 13 | * light: 100 - primary: 500 - dark: 700 14 | * from Qt 5.7 Material Style: 15 | * http://doc-snapshots.qt.io/qt5-5.7/qtquickcontrols2-material.html#pre-defined-colors 16 | * 17 | * QStringList contains: 18 | * {primaryLightColor, primaryColor, primaryDarkColor 19 | * textOnPrimaryLight, textOnPrimary, textOnPrimaryDark 20 | * iconOnPrimaryLightFolder, iconOnPrimaryFolder, iconOnPrimaryDarkFolder} 21 | * 22 | * In Qt 5.7 there are more ways tp get access to Material colors: 23 | * http://code.qt.io/cgit/qt/qtquickcontrols2.git/tree/src/imports/controls/material/qquickmaterialstyle_p.h?h=5.7#n235 24 | * to get access from QML: 25 | * import QtQuick 2.5 26 | * import QtQuick.Controls 2.0 27 | * import QtQuick.Controls.Material 2.0 28 | * color: Material.color(Material.Purple, Material.Shade900 29 | * I'll expolain this in another sample app 30 | */ 31 | 32 | static const QStringList materialRed {"#FFCDD2", "#F44336", "#D32F2F", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 33 | static const QStringList materialPink {"#F8BBD0", "#E91E63", "#C2185B", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 34 | static const QStringList materialPurple{"#E1BEE7", "#9C27B0", "#7B1FA2", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 35 | static const QStringList materialDeepPurple{"#D1C4E9", "#673AB7", "#512DA8", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 36 | static const QStringList materialIndigo{"#C5CAE9", "#3F51B5", "#303F9F", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 37 | static const QStringList materialBlue{"#BBDEFB", "#2196F3", "#1976D2", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 38 | static const QStringList materialLightBlue{"#B3E5FC", "#03A9F4", "#0288D1", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 39 | static const QStringList materialCyan{"#B2EBF2", "#00BCD4", "#0097A7", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 40 | static const QStringList materialTeal{"#B2DFDB", "#009688", "#00796B", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 41 | static const QStringList materialGreen{"#C8E6C9", "#4CAF50", "#388E3C", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 42 | static const QStringList materialLightGreen{"#DCEDC8", "#8BC34A", "#689F38", "#000000", "#000000", "#000000", "black", "black", "black"}; 43 | static const QStringList materialLime{"#F0F4C3", "#CDDC39", "#AFB42B", "#000000", "#000000", "#000000", "black", "black", "black"}; 44 | static const QStringList materialYellow{"#FFF9C4", "#FFEB3B", "#FBC02D", "#000000", "#000000", "#000000", "black", "black", "black"}; 45 | static const QStringList materialAmber{"#FFECB3", "#FFC107", "#FFA000", "#000000", "#000000", "#000000", "black", "black", "black"}; 46 | static const QStringList materialOrange{"#FFE0B2", "#FF9800", "#F57C00", "#000000", "#000000", "#000000", "black", "black", "black"}; 47 | static const QStringList materialDeepOrange{"#FFCCBC", "#FF5722", "#E64A19", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 48 | static const QStringList materialBrown{"#D7CCC8", "#795548", "#5D4037", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 49 | static const QStringList materialGrey{"#F5F5F5", "#9E9E9E", "#616161", "#000000", "#000000", "#FFFFFF", "black", "black", "white"}; 50 | static const QStringList materialBlueGrey{"#CFD8DC", "#607D8B", "#455A64", "#000000", "#FFFFFF", "#FFFFFF", "black", "white", "white"}; 51 | 52 | /* 53 | * T H E M E Light and Dark --- Default: Light 54 | * Colors, Opacity from Google Material Style Guide 55 | * 56 | * QStringList contains: 57 | * {dividerColor, cardAndDialogBackground, primaryTextOpacity, secondaryTextOpacity, dividerOpacity, 58 | * iconActiveOpacity, iconInactiveOpacity, iconFolder, isDark, flatButtonTextColor} 59 | * 60 | */ 61 | static const QStringList darkPalette{"#FFFFFF", "#424242", "1.0", "0.70", "0.12", "1.0", "0.3", "white", "1", "#FFFFFF"}; 62 | static const QStringList lightPalette{"#000000", "#FFFFFF", "0.87", "0.54", "0.12", "0.54", "0.26", "black", "0", "#424242"}; 63 | 64 | } // namespace constants 65 | } // namespace ekke 66 | 67 | #endif // UICONSTANTS_HPP 68 | --------------------------------------------------------------------------------