From 62df25ce8e090f53aef822c2b22c754fd4fca3e1 Mon Sep 17 00:00:00 2001 From: marcin Date: Mon, 7 Jul 2014 19:08:30 +0200 Subject: [PATCH] first push --- LeftPanel.qml | 245 +++++++++++++++++++++++++++ MiddlePanel.qml | 72 ++++++++ RightPanel.qml | 248 +++++++++++++++++++++++++++ bitmonero.pro | 17 ++ bitmonero.pro.user | 251 ++++++++++++++++++++++++++++ components/DashboardTable.qml | 177 ++++++++++++++++++++ components/Input.qml | 18 ++ components/Label.qml | 28 ++++ components/LineEdit.qml | 28 ++++ components/MenuButton.qml | 75 +++++++++ components/NetworkStatusItem.qml | 41 +++++ components/SearchInput.qml | 167 ++++++++++++++++++ components/StandardButton.qml | 46 +++++ components/TableDropdown.qml | 135 +++++++++++++++ components/TableHeader.qml | 154 +++++++++++++++++ components/TipItem.qml | 26 +++ deployment.pri | 27 +++ filter.cpp | 30 ++++ filter.h | 24 +++ images/ascSortIndicator.png | Bin 0 -> 288 bytes images/ascSortIndicatorActived.png | Bin 0 -> 287 bytes images/ascSortIndicatorPressed.png | Bin 0 -> 288 bytes images/backToWindowIcon.png | Bin 0 -> 233 bytes images/backToWindowIconHovered.png | Bin 0 -> 239 bytes images/closeIcon.png | Bin 0 -> 238 bytes images/connectedImage.png | Bin 0 -> 1951 bytes images/descSortIndicator.png | Bin 0 -> 301 bytes images/descSortIndicatorActived.png | Bin 0 -> 301 bytes images/descSortIndicatorPressed.png | Bin 0 -> 301 bytes images/disconnectedImage.png | Bin 0 -> 2088 bytes images/dropIndicator.png | Bin 0 -> 301 bytes images/dropdownOption1.png | Bin 0 -> 384 bytes images/dropdownSearch.png | Bin 0 -> 477 bytes images/dropdownSend.png | Bin 0 -> 514 bytes images/helpIcon.png | Bin 0 -> 220 bytes images/helpIconHovered.png | Bin 0 -> 220 bytes images/hseparator.png | Bin 0 -> 201 bytes images/lockIcon.png | Bin 0 -> 337 bytes images/magnifier.png | Bin 0 -> 560 bytes images/maximizeIcon.png | Bin 0 -> 212 bytes images/maximizeIconHovered.png | Bin 0 -> 215 bytes images/menuIndicator.png | Bin 0 -> 340 bytes images/minimizeIcon.png | Bin 0 -> 198 bytes images/minimizeIconHovered.png | Bin 0 -> 198 bytes images/moneroLogo.png | Bin 0 -> 2576 bytes images/statusConnected.png | Bin 0 -> 428 bytes images/statusDisconnected.png | Bin 0 -> 406 bytes images/tableOptions.png | Bin 0 -> 489 bytes images/tip.png | Bin 0 -> 217 bytes images/whatIsIcon.png | Bin 0 -> 365 bytes main.cpp | 20 +++ main.qml | 77 +++++++++ pages/AddressBook.qml | 5 + pages/Dashboard.qml | 125 ++++++++++++++ pages/History.qml | 5 + pages/Mining.qml | 6 + pages/Settings.qml | 6 + pages/Transfer.qml | 5 + qml.qrc | 57 +++++++ tabs/TweetsModel.qml | 88 ++++++++++ tabs/Twitter.qml | 124 ++++++++++++++ tabs/tweetSearch.js | 83 +++++++++ 62 files changed, 2410 insertions(+) create mode 100644 LeftPanel.qml create mode 100644 MiddlePanel.qml create mode 100644 RightPanel.qml create mode 100644 bitmonero.pro create mode 100644 bitmonero.pro.user create mode 100644 components/DashboardTable.qml create mode 100644 components/Input.qml create mode 100644 components/Label.qml create mode 100644 components/LineEdit.qml create mode 100644 components/MenuButton.qml create mode 100644 components/NetworkStatusItem.qml create mode 100644 components/SearchInput.qml create mode 100644 components/StandardButton.qml create mode 100644 components/TableDropdown.qml create mode 100644 components/TableHeader.qml create mode 100644 components/TipItem.qml create mode 100644 deployment.pri create mode 100644 filter.cpp create mode 100644 filter.h create mode 100644 images/ascSortIndicator.png create mode 100644 images/ascSortIndicatorActived.png create mode 100644 images/ascSortIndicatorPressed.png create mode 100644 images/backToWindowIcon.png create mode 100644 images/backToWindowIconHovered.png create mode 100644 images/closeIcon.png create mode 100644 images/connectedImage.png create mode 100644 images/descSortIndicator.png create mode 100644 images/descSortIndicatorActived.png create mode 100644 images/descSortIndicatorPressed.png create mode 100644 images/disconnectedImage.png create mode 100644 images/dropIndicator.png create mode 100644 images/dropdownOption1.png create mode 100644 images/dropdownSearch.png create mode 100644 images/dropdownSend.png create mode 100644 images/helpIcon.png create mode 100644 images/helpIconHovered.png create mode 100644 images/hseparator.png create mode 100644 images/lockIcon.png create mode 100644 images/magnifier.png create mode 100644 images/maximizeIcon.png create mode 100644 images/maximizeIconHovered.png create mode 100644 images/menuIndicator.png create mode 100644 images/minimizeIcon.png create mode 100644 images/minimizeIconHovered.png create mode 100644 images/moneroLogo.png create mode 100644 images/statusConnected.png create mode 100644 images/statusDisconnected.png create mode 100644 images/tableOptions.png create mode 100644 images/tip.png create mode 100644 images/whatIsIcon.png create mode 100644 main.cpp create mode 100644 main.qml create mode 100644 pages/AddressBook.qml create mode 100644 pages/Dashboard.qml create mode 100644 pages/History.qml create mode 100644 pages/Mining.qml create mode 100644 pages/Settings.qml create mode 100644 pages/Transfer.qml create mode 100644 qml.qrc create mode 100644 tabs/TweetsModel.qml create mode 100644 tabs/Twitter.qml create mode 100644 tabs/tweetSearch.js diff --git a/LeftPanel.qml b/LeftPanel.qml new file mode 100644 index 00000000..a33b0dda --- /dev/null +++ b/LeftPanel.qml @@ -0,0 +1,245 @@ +import QtQuick 2.2 +import "components" + +Rectangle { + id: panel + signal dashboardClicked() + signal historyClicked() + signal transferClicked() + signal settingsClicked() + signal addressBookClicked() + signal miningClicked() + + width: 260 + color: "#FFFFFF" + + Image { + id: logo + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 31 + source: "images/moneroLogo.png" + } + + Column { + id: column1 + anchors.left: parent.left + anchors.right: parent.right + anchors.top: logo.bottom + anchors.topMargin: 40 + spacing: 6 + + Label { + text: qsTr("Locked balance") + anchors.left: parent.left + anchors.leftMargin: 50 + } + + Row { + Item { + anchors.verticalCenter: parent.verticalCenter + height: 26 + width: 50 + + Image { + anchors.centerIn: parent + source: "images/lockIcon.png" + } + } + + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: "Arial" + font.pixelSize: 26 + color: "#000000" + text: "78.9239845" + } + } + + Item { //separator + anchors.left: parent.left + anchors.right: parent.right + height: 1 + } + + Label { + text: qsTr("Unlocked") + anchors.left: parent.left + anchors.leftMargin: 50 + } + + Text { + anchors.left: parent.left + anchors.leftMargin: 50 + font.family: "Arial" + font.pixelSize: 18 + color: "#000000" + text: "2324.9239845" + } + } + + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: menuRect.top + width: 1 + color: "#DBDBDB" + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + height: 1 + color: "#DBDBDB" + } + + Rectangle { + id: menuRect + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.top: column1.bottom + anchors.topMargin: 50 + color: "#1C1C1C" + + Column { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + property var previousButton: dashboardButton + MenuButton { + id: dashboardButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Dashboard") + symbol: qsTr("D") + dotColor: "#FFE00A" + checked: true + onClicked: { + parent.previousButton.checked = false + parent.previousButton = dashboardButton + panel.dashboardClicked() + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#505050" + height: 1 + } + + MenuButton { + id: transferButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Transfer") + symbol: qsTr("T") + dotColor: "#FF6C3C" + onClicked: { + parent.previousButton.checked = false + parent.previousButton = transferButton + panel.transferClicked() + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + color: transferButton.checked || historyButton.checked ? "#1C1C1C" : "#505050" + height: 1 + } + + MenuButton { + id: historyButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("History") + symbol: qsTr("H") + dotColor: "#6B0072" + onClicked: { + parent.previousButton.checked = false + parent.previousButton = historyButton + panel.historyClicked() + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + color: historyButton.checked || addressBookButton.checked ? "#1C1C1C" : "#505050" + height: 1 + } + + MenuButton { + id: addressBookButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Address book") + symbol: qsTr("B") + dotColor: "#FF4F41" + onClicked: { + parent.previousButton.checked = false + parent.previousButton = addressBookButton + panel.addressBookClicked() + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + color: addressBookButton.checked || miningButton.checked ? "#1C1C1C" : "#505050" + height: 1 + } + + MenuButton { + id: miningButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Mining") + symbol: qsTr("M") + dotColor: "#FFD781" + onClicked: { + parent.previousButton.checked = false + parent.previousButton = miningButton + panel.miningClicked() + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050" + height: 1 + } + + MenuButton { + id: settingsButton + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Settings") + symbol: qsTr("S") + dotColor: "#36B25C" + onClicked: { + parent.previousButton.checked = false + parent.previousButton = settingsButton + panel.settingsClicked() + } + } + } + + NetworkStatusItem { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + connected: true + } + } +} diff --git a/MiddlePanel.qml b/MiddlePanel.qml new file mode 100644 index 00000000..e3043a46 --- /dev/null +++ b/MiddlePanel.qml @@ -0,0 +1,72 @@ +import QtQuick 2.2 + +Rectangle { + color: "#F0EEEE" + + states: [ + State { + name: "Dashboard" + PropertyChanges { target: loader; source: "pages/Dashboard.qml" } + }, State { + name: "History" + PropertyChanges { target: loader; source: "pages/History.qml" } + }, State { + name: "Transfer" + PropertyChanges { target: loader; source: "pages/Transfer.qml" } + }, State { + name: "AddressBook" + PropertyChanges { target: loader; source: "pages/AddressBook.qml" } + }, State { + name: "Settings" + PropertyChanges { target: loader; source: "pages/Settings.qml" } + }, State { + name: "Mining" + PropertyChanges { target: loader; source: "pages/Mining.qml" } + } + ] + + Row { + id: styledRow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + Rectangle { height: 4; width: parent.width / 5; color: "#FFE00A" } + Rectangle { height: 4; width: parent.width / 5; color: "#6B0072" } + Rectangle { height: 4; width: parent.width / 5; color: "#FF6C3C" } + Rectangle { height: 4; width: parent.width / 5; color: "#FFD781" } + Rectangle { height: 4; width: parent.width / 5; color: "#FF4F41" } + } + + Loader { + id: loader + anchors.left: parent.left + anchors.right: parent.right + anchors.top: styledRow.bottom + anchors.bottom: parent.bottom + } + + Rectangle { + anchors.top: styledRow.bottom + anchors.bottom: parent.bottom + anchors.right: parent.right + width: 1 + color: "#DBDBDB" + } + + Rectangle { + anchors.top: styledRow.bottom + anchors.bottom: parent.bottom + anchors.left: parent.left + width: 1 + color: "#DBDBDB" + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: "#DBDBDB" + } +} diff --git a/RightPanel.qml b/RightPanel.qml new file mode 100644 index 00000000..f59ac3bc --- /dev/null +++ b/RightPanel.qml @@ -0,0 +1,248 @@ +import QtQuick 2.2 +import QtQuick.Window 2.0 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.2 +import "tabs" + +Rectangle { + width: 330 + + Row { + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 5 + anchors.rightMargin: 5 + + Rectangle { + width: 25 + height: 25 + radius: 5 + clip: true + color: helpArea.containsMouse ? "#DBDBDB" : "#FFFFFF" + + Rectangle { + width: 25 + height: 25 + radius: 5 + color: "#FFFFFF" + visible: helpArea.containsMouse + x: 1; y: 2 + } + + Image { + anchors.centerIn: parent + source: { + if(appWindow.whatIsEnable) + return "images/whatIsIcon.png" + return helpArea.containsMouse ? "images/helpIconHovered.png" : + "images/helpIcon.png" + } + } + + MouseArea { + id: helpArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + appWindow.whatIsEnable = !appWindow.whatIsEnable + } + } + } + + Rectangle { + width: 25 + height: 25 + radius: 5 + clip: true + color: minimizeArea.containsMouse ? "#DBDBDB" : "#FFFFFF" + + Rectangle { + width: 25 + height: 25 + radius: 5 + color: "#FFFFFF" + visible: minimizeArea.containsMouse + x: 1; y: 2 + } + + Image { + anchors.centerIn: parent + source: minimizeArea.containsMouse ? "images/minimizeIconHovered.png" : + "images/minimizeIcon.png" + } + + MouseArea { + id: minimizeArea + anchors.fill: parent + hoverEnabled: true + onClicked: appWindow.visibility = Window.Minimized + } + } + + Rectangle { + property bool checked: false + width: 25 + height: 25 + radius: 5 + clip: true + color: maximizeArea.containsMouse ? "#DBDBDB" : "#FFFFFF" + + Rectangle { + width: 25 + height: 25 + radius: 5 + color: "#FFFFFF" + visible: maximizeArea.containsMouse + x: 1; y: 2 + } + + Image { + anchors.centerIn: parent + source: { + if(parent.checked) + return maximizeArea.containsMouse ? "images/backToWindowIconHovered.png" : + "images/backToWindowIcon.png" + return maximizeArea.containsMouse ? "images/maximizeIconHovered.png" : + "images/maximizeIcon.png" + } + } + + MouseArea { + id: maximizeArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + parent.checked = !parent.checked + appWindow.visibility = parent.checked ? Window.FullScreen : + Window.Windowed + } + } + } + + Rectangle { + width: 25 + height: 25 + radius: 5 + clip: true + color: closeArea.containsMouse ? "#DBDBDB" : "#FFFFFF" + + Rectangle { + width: 25 + height: 25 + radius: 5 + color: "#FFFFFF" + visible: closeArea.containsMouse + x: 1; y: 2 + } + + Image { + anchors.centerIn: parent + source: "images/closeIcon.png" + } + + MouseArea { + id: closeArea + anchors.fill: parent + hoverEnabled: true + onClicked: Qt.quit() + } + } + } + + TabView { + id: tabView + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: styledRow.top + anchors.leftMargin: 14 + anchors.rightMargin: 14 + anchors.topMargin: 40 + + Tab { title: qsTr("Twitter"); source: "tabs/Twitter.qml" } + Tab { title: "News" } + Tab { title: "Help" } + Tab { title: "About" } + + style: TabViewStyle { + frameOverlap: 2 + tabOverlap: 0 + tab: Rectangle { + implicitHeight: 31 + implicitWidth: 68 + + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 12 + anchors.rightMargin: 12 + elide: Text.ElideRight + font.family: "Arial" + font.pixelSize: 14 + color: styleData.selected ? "#FF4E40" : "#4A4646" + text: styleData.title + } + + Rectangle { + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + width: 1 + color: "#DBDBDB" + visible: styleData.index !== tabView.count - 1 + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: styleData.selected ? "#FFFFFF" : "#DBDBDB" + } + } + + frame: Rectangle { + color: "#FFFFFF" + anchors.fill: parent + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 1 + height: 1 + color: "#DBDBDB" + } + } + } + } + + Row { + id: styledRow + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + + Rectangle { height: 8; width: parent.width / 5; color: "#FFE00A" } + Rectangle { height: 8; width: parent.width / 5; color: "#6B0072" } + Rectangle { height: 8; width: parent.width / 5; color: "#FF6C3C" } + Rectangle { height: 8; width: parent.width / 5; color: "#FFD781" } + Rectangle { height: 8; width: parent.width / 5; color: "#FF4F41" } + } + + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#DBDBDB" + } + + Rectangle { + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + width: 1 + color: "#DBDBDB" + } +} diff --git a/bitmonero.pro b/bitmonero.pro new file mode 100644 index 00000000..3904b44c --- /dev/null +++ b/bitmonero.pro @@ -0,0 +1,17 @@ +TEMPLATE = app + +QT += qml quick widgets + +SOURCES += main.cpp \ + filter.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Default rules for deployment. +include(deployment.pri) + +HEADERS += \ + filter.h diff --git a/bitmonero.pro.user b/bitmonero.pro.user new file mode 100644 index 00000000..d1aa9be3 --- /dev/null +++ b/bitmonero.pro.user @@ -0,0 +1,251 @@ + + + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.3.0 MinGW 32bit + Desktop Qt 5.3.0 MinGW 32bit + qt.53.win32_mingw482_kit + 0 + 0 + 0 + + G:/RPA/build-bitmonero-Desktop_Qt_5_3_0_MinGW_32bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + budowania + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + czyszczenia + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + G:/RPA/build-bitmonero-Desktop_Qt_5_3_0_MinGW_32bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + budowania + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + czyszczenia + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 2 + + + 0 + instalacji + + ProjectExplorer.BuildSteps.Deploy + + 1 + Zainstaluj lokalnie + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + bitmonero + + Qt4ProjectManager.Qt4RunConfiguration:G:/RPA/bitmonero/bitmonero.pro + + bitmonero.pro + false + false + + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.EnvironmentId + {20382c58-78e1-43a4-9d27-354b0656be87} + + + ProjectExplorer.Project.Updater.FileVersion + 15 + + diff --git a/components/DashboardTable.qml b/components/DashboardTable.qml new file mode 100644 index 00000000..dda95cd5 --- /dev/null +++ b/components/DashboardTable.qml @@ -0,0 +1,177 @@ +import QtQuick 2.0 +import "../components" + +ListView { + id: listView + clip: true + boundsBehavior: ListView.StopAtBounds + + property var previousItem + delegate: Rectangle { + id: delegate + height: 90 + width: listView.width + z: 0 + color: index % 2 ? "#F8F8F8" : "#FFFFFF" + function collapseDropdown() { dropdown.expanded = false } + + Row { + id: row1 + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 14 + + Rectangle { + id: dot + width: 14 + height: width + radius: width / 2 + color: out ? "#FF4F41" : "#36B05B" + } + + Item { //separator + width: 12 + height: 14 + } + + Text { + id: paymentIdText + width: text.length ? 122 : 0 + anchors.verticalCenter: dot.verticalCenter + font.family: "Arial" + font.bold: true + font.pixelSize: 19 + color: "#444444" + elide: Text.ElideRight + text: paymentId + } + + Item { //separator + width: paymentIdText.width ? 12 : 0 + height: 14 + } + + Text { + anchors.verticalCenter: dot.verticalCenter + width: parent.width - x - 12 + elide: Text.ElideRight + font.family: "Arial" + font.pixelSize: 14 + color: "#545454" + text: address + } + } + + Row { + anchors.left: parent.left + anchors.top: row1.bottom + anchors.topMargin: 8 + spacing: 12 + + Item { //separator + width: 14 + height: 14 + } + + Column { + anchors.top: parent.top + width: 202 + + Text { + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: 12 + color: "#545454" + text: qsTr("Date") + } + + Text { + font.family: "Arial" + font.pixelSize: 18 + color: "#000000" + text: date + } + } + + Column { + anchors.top: parent.top + width: 148 + + Text { + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: 12 + color: "#545454" + text: qsTr("Amount") + } + + Text { + font.family: "Arial" + font.pixelSize: 18 + color: "#000000" + text: amount + } + } + + Column { + anchors.top: parent.top + width: 148 + + Text { + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: 12 + color: "#545454" + text: qsTr("Balance") + } + + Row { + spacing: 2 + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 3 + font.family: "Arial" + font.pixelSize: 16 + color: out ? "#FF4F41" : "#36B05B" + text: out ? "↓" : "↑" + } + + Text { + anchors.bottom: parent.bottom + font.family: "Arial" + font.pixelSize: 18 + color: out ? "#FF4F41" : "#36B05B" + text: balance + } + } + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: "#DBDBDB" + } + + TableDropdown { + id: dropdown + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.bottomMargin: 11 + anchors.rightMargin: 5 + onExpandedChanged: { + if(listView.previousItem !== undefined && listView.previousItem !== delegate) + listView.previousItem.collapseDropdown() + if(expanded) { + listView.previousItem = delegate + listView.currentIndex = index + listView.currentItem.z = 2 + } + } + onCollapsed: delegate.z = 0 + } + } +} diff --git a/components/Input.qml b/components/Input.qml new file mode 100644 index 00000000..98acf532 --- /dev/null +++ b/components/Input.qml @@ -0,0 +1,18 @@ +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.2 +import QtQuick 2.2 + +TextField { + font.family: "Arial" + font.pixelSize: 18 + + style: TextFieldStyle { + textColor: "#3F3F3F" + placeholderTextColor: "#BABABA" + + background: Rectangle { + border.width: 0 + color: "transparent" + } + } +} diff --git a/components/Label.qml b/components/Label.qml new file mode 100644 index 00000000..35101ff1 --- /dev/null +++ b/components/Label.qml @@ -0,0 +1,28 @@ +import QtQuick 2.0 + +Item { + property alias text: label.text + property alias color: label.color + property int fontSize: 12 + width: icon.x + icon.width + height: icon.height + + Text { + id: label + anchors.bottom: parent.bottom + anchors.bottomMargin: 2 + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: parent.fontSize + color: "#555555" + } + + Image { + id: icon + anchors.verticalCenter: parent.verticalCenter + anchors.left: label.right + anchors.leftMargin: 5 + source: "../images/whatIsIcon.png" + visible: appWindow.whatIsEnable + } +} diff --git a/components/LineEdit.qml b/components/LineEdit.qml new file mode 100644 index 00000000..aad227ae --- /dev/null +++ b/components/LineEdit.qml @@ -0,0 +1,28 @@ +import QtQuick 2.0 + +Item { + property alias placeholderText: input.placeholderText + property alias text: input.text + height: 37 + + Rectangle { + anchors.fill: parent + anchors.bottomMargin: 1 + color: "#DBDBDB" + radius: 4 + } + + Rectangle { + anchors.fill: parent + anchors.topMargin: 1 + color: "#FFFFFF" + radius: 4 + } + + Input { + id: input + anchors.fill: parent + anchors.leftMargin: 11 + anchors.rightMargin: 11 + } +} diff --git a/components/MenuButton.qml b/components/MenuButton.qml new file mode 100644 index 00000000..59bd20c9 --- /dev/null +++ b/components/MenuButton.qml @@ -0,0 +1,75 @@ +import QtQuick 2.0 + +Rectangle { + id: button + property alias text: label.text + property bool checked: false + property alias dotColor: dot.color + property alias symbol: symbolText.text + signal clicked() + + height: 64 + color: checked ? "#FFFFFF" : "#1C1C1C" + + Item { + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + width: 50 + + Rectangle { + id: dot + anchors.centerIn: parent + width: 16 + height: width + radius: height / 2 + + Rectangle { + anchors.centerIn: parent + width: 12 + height: width + radius: height / 2 + color: "#1C1C1C" + visible: !button.checked && !buttonArea.containsMouse + } + } + + Text { + id: symbolText + anchors.centerIn: parent + font.pixelSize: 11 + font.bold: true + color: button.checked || buttonArea.containsMouse ? "#FFFFFF" : dot.color + visible: appWindow.ctrlPressed + } + } + + Image { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 20 + source: "../images/menuIndicator.png" + } + + Text { + id: label + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 50 + font.family: "Arial" + font.pixelSize: 18 + color: parent.checked ? "#000000" : "#FFFFFF" + } + + MouseArea { + id: buttonArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + if(parent.checked) + return + button.clicked() + parent.checked = true + } + } +} diff --git a/components/NetworkStatusItem.qml b/components/NetworkStatusItem.qml new file mode 100644 index 00000000..bf6cf303 --- /dev/null +++ b/components/NetworkStatusItem.qml @@ -0,0 +1,41 @@ +import QtQuick 2.0 + +Row { + id: item + property bool connected: false + + Item { + id: iconItem + anchors.bottom: parent.bottom + width: 50 + height: 50 + + Image { + anchors.centerIn: parent + source: item.connected ? "../images/statusConnected.png" : + "../images/statusDisconnected.png" + } + } + + Column { + anchors.bottom: parent.bottom + height: 53 + spacing: 3 + + Text { + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: 12 + color: "#545454" + text: qsTr("Network status") + } + + Text { + anchors.left: parent.left + font.family: "Arial" + font.pixelSize: 18 + color: item.connected ? "#FF6C3B" : "#AAAAAA" + text: item.connected ? qsTr("Connected") : qsTr("Disconnected") + } + } +} diff --git a/components/SearchInput.qml b/components/SearchInput.qml new file mode 100644 index 00000000..7505c5cd --- /dev/null +++ b/components/SearchInput.qml @@ -0,0 +1,167 @@ +import QtQuick 2.0 + +Item { + id: item + signal searchClicked(string text, int option) + height: 50 + + Rectangle { + anchors.fill: parent + color: "#DBDBDB" + radius: 10 + } + + Rectangle { + anchors.fill: parent + anchors.topMargin: 1 + color: "#FFFFFF" + radius: 10 + + Item { + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + width: 45 + + Image { + anchors.centerIn: parent + source: "../images/magnifier.png" + } + } + + Input { + id: input + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: dropdown.left + anchors.leftMargin: 45 + verticalAlignment: TextInput.AlignVCenter + placeholderText: qsTr("Search by...") + } + + Item { + id: dropdown + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: button.left + width: 154 + + Row { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + id: dropText + width: 114 - 12 + anchors.verticalCenter: parent.verticalCenter + font.family: "Arial" + font.pixelSize: 12 + color: "#4A4747" + text: "NAME" + } + + Image { + anchors.verticalCenter: parent.verticalCenter + source: "../images/hseparator.png" + } + + Item { + height: dropdown.height + width: 38 + + Image { + id: dropIndicator + anchors.centerIn: parent + source: "../images/dropIndicator.png" + rotation: droplist.height === 0 ? 0 : 180 + } + } + } + + MouseArea { + anchors.fill: parent + onClicked: droplist.height = droplist.height === 0 ? dropcolumn.height : 0 + } + } + + Rectangle { + id: droplist + property int currentOption: 0 + + width: 154 + height: 0 + clip: true + x: dropdown.x + y: dropdown.height + color: "#FFFFFF" + + Behavior on height { + NumberAnimation { duration: 100; easing.type: Easing.InQuad } + } + + ListModel { + id: dropdownModel + ListElement { name: "NAME" } + ListElement { name: "DESCRIPTION" } + ListElement { name: "ADDRESS" } + } + + Column { + id: dropcolumn + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + Repeater { + model: dropdownModel + delegate: Rectangle { + property bool isCurrent: name === dropText.text + anchors.left: parent.left + anchors.right: parent.right + height: 30 + color: delegateArea.pressed || isCurrent ? "#4A4646" : "#FFFFFF" + + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + elide: Text.ElideRight + anchors.leftMargin: 12 + anchors.rightMargin: 12 + font.family: "Arial" + font.pixelSize: 12 + color: delegateArea.pressed || parent.isCurrent ? "#FFFFFF" : "#4A4646" + text: name + } + + MouseArea { + id: delegateArea + anchors.fill: parent + onClicked: { + droplist.currentOption = index + droplist.height = 0 + dropText.text = name + } + } + } + } + } + } + + StandardButton { + id: button + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.margins: 6 + width: 80 + + shadowColor: "#8C0B00" + pressedColor: "#C60F00" + releasedColor: "#FF4F41" + text: qsTr("SEARCH") + onClicked: item.searchClicked(input.text, droplist.currentOption) + } + } +} diff --git a/components/StandardButton.qml b/components/StandardButton.qml new file mode 100644 index 00000000..027356e8 --- /dev/null +++ b/components/StandardButton.qml @@ -0,0 +1,46 @@ +import QtQuick 2.0 + +Item { + height: 37 + property string shadowColor + property string pressedColor + property string releasedColor + property string textColor: "#FFFFFF" + property alias text: label.text + signal clicked() + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: parent.height - 1 + y: buttonArea.pressed ? 1 : 0 + radius: 4 + color: parent.shadowColor + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: parent.height - 1 + y: buttonArea.pressed ? 0 : 1 + color: buttonArea.pressed ? parent.pressedColor : parent.releasedColor + radius: 4 + } + + Text { + id: label + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + font.pixelSize: 12 + color: parent.textColor + } + + MouseArea { + id: buttonArea + anchors.fill: parent + onClicked: parent.clicked() + } +} diff --git a/components/TableDropdown.qml b/components/TableDropdown.qml new file mode 100644 index 00000000..19186253 --- /dev/null +++ b/components/TableDropdown.qml @@ -0,0 +1,135 @@ +import QtQuick 2.0 + +Item { + id: dropdown + property bool expanded: false + signal collapsed() + width: 72 + height: 37 + + Item { + id: head + anchors.fill: parent + + Rectangle { + anchors.fill: parent + anchors.topMargin: dropdown.expanded ? 0 : 1 + radius: 3 + color: dropdown.expanded ? "#888888" : "#DBDBDB" + } + + Rectangle { + anchors.fill: parent + anchors.bottomMargin: dropdown.expanded ? 0 : 1 + radius: 3 + color: dropdown.expanded ? "#DBDBDB" : "#F0EEEE" + } + + Image { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 10 + source: "../images/tableOptions.png" + } + + Rectangle { + anchors.centerIn: parent + anchors.horizontalCenterOffset: 1 + height: 23 + width: 1 + color: dropdown.expanded ? "#FFFFFF" : "#DBDBDB" + } + + Image { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 10 + source: "../images/dropIndicator.png" + } + + MouseArea { + anchors.fill: parent + onPressed: dropdown.expanded = !dropdown.expanded + } + } + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: head.bottom + height: dropdown.expanded ? column.height : 0 + onHeightChanged: if(height === 0) dropdown.collapsed() + clip: true + + Behavior on height { + NumberAnimation { duration: 100; easing.type: Easing.InQuad } + } + + Column { + id: column + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + ListModel { + id: dataModel + ListElement { name: "text 1"; icon: "../images/dropdownOption1.png" } + ListElement { name: "longer text 2"; icon: "../images/dropdownSend.png" } + ListElement { name: "text3

lorem ipsum asdasd asdasd"; icon: "../images/dropdownSearch.png" } + } + + Repeater { + id: repeater + model: dataModel + + delegate: Rectangle { + id: delegate + anchors.left: parent.left + anchors.right: parent.right + height: 30 + color: delegateArea.containsMouse ? "#F0EEEE" : "#DBDBDB" + radius: index === repeater.count - 1 ? 5 : 0 + + Rectangle { + anchors.left: parent.left + anchors.top: parent.top + width: 5 + height: 5 + color: delegate.color + } + + Rectangle { + anchors.right: parent.right + anchors.top: parent.top + width: 5 + height: 5 + color: delegate.color + } + + Image { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 10 + source: icon + } + + MouseArea { + id: delegateArea + hoverEnabled: true + anchors.fill: parent + onEntered: { + var pos = rootItem.mapFromItem(delegate, 30, -20) + tipItem.text = name + tipItem.x = pos.x + if(tipItem.height > 30) + pos.y -= tipItem.height - 30 + tipItem.y = pos.y + tipItem.visible = true + } + onExited: tipItem.visible = false + } + } + } + } + } +} diff --git a/components/TableHeader.qml b/components/TableHeader.qml new file mode 100644 index 00000000..a2b3e544 --- /dev/null +++ b/components/TableHeader.qml @@ -0,0 +1,154 @@ +import QtQuick 2.0 + +Rectangle { + id: header + signal sortRequest(bool desc, int column) + property int activeSortColumn: -1 + + height: 31 + color: "#FFFFFF" + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: "#DBDBDB" + } + + ListModel { + id: columnsModel + ListElement { columnName: "Date"; columnWidth: 92 } + ListElement { columnName: "Amount"; columnWidth: 158 } + ListElement { columnName: "Balance"; columnWidth: 168 } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + + Rectangle { + height: 31 + width: 1 + color: "#DBDBDB" + } + + Repeater { + id: columnsRepeater + model: columnsModel + delegate: Rectangle { + id: delegate + property bool desc: false + height: 31 + width: columnWidth + + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: -2 + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 13 + anchors.rightMargin: 13 + elide: Text.ElideRight + font.family: "Arial" + font.pixelSize: 14 + color: { + if(delegateArea.pressed) + return "#FF4304" + return index === header.activeSortColumn || delegateArea.containsMouse ? "#FF6C3C" : "#4A4949" + } + text: columnName + } + + MouseArea { + id: delegateArea + hoverEnabled: true + anchors.fill: parent + onClicked: { + delegate.desc = !delegate.desc + header.activeSortColumn = index + header.sortRequest(delegate.desc, index) + } + } + + Row { + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.rightMargin: 9 + + Item { + width: 14 + anchors.top: parent.top + anchors.bottom: parent.bottom + + Image { + anchors.centerIn: parent + anchors.verticalCenterOffset: -2 + source: { + if(descArea.pressed) + return "../images/descSortIndicatorPressed.png" + return index === header.activeSortColumn || descArea.containsMouse ? "../images/descSortIndicatorActived.png" : + "../images/descSortIndicator.png" + } + } + + MouseArea { + id: descArea + hoverEnabled: true + anchors.fill: parent + onClicked: { + delegate.desc = true + header.activeSortColumn = index + header.sortRequest(delegate.desc, index) + } + } + } + + Item { + width: 14 + anchors.top: parent.top + anchors.bottom: parent.bottom + + Image { + anchors.centerIn: parent + anchors.verticalCenterOffset: -3 + source: { + if(ascArea.pressed) + return "../images/ascSortIndicatorPressed.png" + return index === header.activeSortColumn || ascArea.containsMouse ? "../images/ascSortIndicatorActived.png" : + "../images/ascSortIndicator.png" + } + } + + MouseArea { + id: ascArea + hoverEnabled: true + anchors.fill: parent + onClicked: { + delegate.desc = false + header.activeSortColumn = index + header.sortRequest(delegate.desc, index) + } + } + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: index === header.activeSortColumn ? "#FFFFFF" : "#DBDBDB" + } + + Rectangle { + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + width: 1 + color: "#DBDBDB" + } + } + } + } +} diff --git a/components/TipItem.qml b/components/TipItem.qml new file mode 100644 index 00000000..1b2c0a38 --- /dev/null +++ b/components/TipItem.qml @@ -0,0 +1,26 @@ +import QtQuick 2.0 + +Rectangle { + property alias text: content.text + width: content.width + 12 + height: content.height + 17 + color: "#FF6C3C" + radius: 3 + + Image { + anchors.top: parent.bottom + anchors.left: parent.left + anchors.leftMargin: 8 + source: "../images/tip.png" + } + + Text { + id: content + anchors.horizontalCenter: parent.horizontalCenter + y: 6 + lineHeight: 0.7 + font.family: "Arial" + font.pixelSize: 12 + color: "#FFFFFF" + } +} diff --git a/deployment.pri b/deployment.pri new file mode 100644 index 00000000..5441b63d --- /dev/null +++ b/deployment.pri @@ -0,0 +1,27 @@ +android-no-sdk { + target.path = /data/user/qt + export(target.path) + INSTALLS += target +} else:android { + x86 { + target.path = /libs/x86 + } else: armeabi-v7a { + target.path = /libs/armeabi-v7a + } else { + target.path = /libs/armeabi + } + export(target.path) + INSTALLS += target +} else:unix { + isEmpty(target.path) { + qnx { + target.path = /tmp/$${TARGET}/bin + } else { + target.path = /opt/$${TARGET}/bin + } + export(target.path) + } + INSTALLS += target +} + +export(INSTALLS) diff --git a/filter.cpp b/filter.cpp new file mode 100644 index 00000000..cf41f648 --- /dev/null +++ b/filter.cpp @@ -0,0 +1,30 @@ +#include "filter.h" +#include + +filter::filter(QObject *parent) : + QObject(parent) +{ + m_ctrlPressed = true; +} + +bool filter::eventFilter(QObject *obj, QEvent *ev) { + switch(ev->type()) { + case QEvent::KeyPress: { + QKeyEvent *ke = static_cast(ev); + if(ke->key() == Qt::Key_Control) { + emit ctrlPressed(); + m_ctrlPressed = true; + } + } break; + case QEvent::KeyRelease: { + QKeyEvent *ke = static_cast(ev); + if(ke->key() == Qt::Key_Control) { + emit ctrlReleased(); + m_ctrlPressed = false; + } + } break; + default: break; + } + + return QObject::eventFilter(obj, ev); +} diff --git a/filter.h b/filter.h new file mode 100644 index 00000000..e9bea569 --- /dev/null +++ b/filter.h @@ -0,0 +1,24 @@ +#ifndef FILTER_H +#define FILTER_H + +#include + +class filter : public QObject +{ + Q_OBJECT + +private: + bool m_ctrlPressed; + +public: + explicit filter(QObject *parent = 0); + +protected: + bool eventFilter(QObject *obj, QEvent *ev); + +signals: + void ctrlPressed(); + void ctrlReleased(); +}; + +#endif // FILTER_H diff --git a/images/ascSortIndicator.png b/images/ascSortIndicator.png new file mode 100644 index 0000000000000000000000000000000000000000..cc27dd614f1d9fdd624db6ebda40864ce4e046da GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^Ul&r;B5V#MIJWN8ZB*0xaro0UD_S zPj`k3=`C_9@HlcmKx2y0jXD|4uE&$ZtTNNzsojowE;^BMTh#UJ>1+jzrxf{Gg=>7& zmoomze!0Y?Vfr+`Sx&DWti6_R{e`9M!Np(YOwX((7QB7#Z@i6jWy_S@;^`BLJmhcx ZVN~Ag(eRbCU>nd444$rjF6*2UngFtSV-f%W literal 0 HcmV?d00001 diff --git a/images/ascSortIndicatorActived.png b/images/ascSortIndicatorActived.png new file mode 100644 index 0000000000000000000000000000000000000000..fe61f83f591546c96172bdb4a85bb1160734fc5d GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^UmXr;B5V#MIJWZ{EWWJgn;73j&x9 z1cs>1-rcR*&Tzxvr6LR0Ql2>dckZRvE=|_iD_K3kW!CKw#v6Tq_iM@SV0^1w)~f$! zp2}3dKRqfdOCDsacsAcL+9TUmr2l_SlsR{r?hN&ub8PLY+^I*n YKgzjVuFv)<1v-Jj)78&qol`;+06$@2FaQ7m literal 0 HcmV?d00001 diff --git a/images/ascSortIndicatorPressed.png b/images/ascSortIndicatorPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d29fe96be65b41d114783215fdbc591de0b1dc GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^Ul&r;B5V#MIIW7da0b2sp?0{JtN! zsgd)Y!Z{bogOW!sh+295`@Ha9jPtBwK9=L2>WyrkJ1T9t7;@uf)nCe6iaphE-uY?a z;~4+xRZDKRNPkQ#@PFuLBYEfY0-3!#-pU(GHJX1gspE5a)x~)Gyywg7K5tEnGV>-L Z5qH^`V6|JuGZW|r22WQ%mvv4FO#re5W4ZtU literal 0 HcmV?d00001 diff --git a/images/backToWindowIcon.png b/images/backToWindowIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1c3a6e074131947404535412333ee1af56dddf GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5n0T@ zz%2yAjF;}#{Q(M!mAFQfI2WZRmSpDVDTHL^rZO0q>l>Kp8=83K?S2SUAp=qooS#-w zo>-L1;Fyx1l&avCS(I9yUzA;};2doBV$Y@?pgKoS7sn8ZsYfSlZv}s85NQ>&bf{qg1;z-gfStzuP|wtXQ_7-s}MD|5GC3 U4>si-0~*HQ>FVdQ&MBb@0C87Lod5s; literal 0 HcmV?d00001 diff --git a/images/backToWindowIconHovered.png b/images/backToWindowIconHovered.png new file mode 100644 index 0000000000000000000000000000000000000000..4a27a0c69d7592457b0d149cbd0bbbaff40e8054 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5n0T@ zz%2yAjF;}#{Q(M!mAFQfI2WZRmSpDVDTHL^rZO0q>l>Kp8=83K?S2SUAp=qooS#-w zo>-L1;Fyx1l&avCS(I9yUzA;};2doBV$Y@?pgMO?7sn8ZsmXu-|F>rb0q1qPQyOIr z4v9Wu-ns36B*)An20smyK{CRLj};nNBgM_M6MYu>%4oDs<~Me-an|UNkdR=Q)+Us? TMZ56~&`1VPS3j3^P6%y{W;-5;Q!Scz*yiE~kEVo7Fxol0g`3K@`!;QX|b z^2DN42FH~Aq*MjB%%art{G#k)1?OP17kf7K0M)s9x;Tb#%uN0>Kl$_gMj%N1l<3Bm zG9mjnn8&HdDC&^tZ+GUzkN^Mc*?3qz)QlE#FW4-|wIPx*ydgz>*K7&SpG*w%DwRXk TczXW=O=R$N^>bP0l+XkK?E*(f literal 0 HcmV?d00001 diff --git a/images/connectedImage.png b/images/connectedImage.png new file mode 100644 index 0000000000000000000000000000000000000000..e21e73c4cb13aa02aa9e0d6f9469e7a4245814de GIT binary patch literal 1951 zcmV;Q2VnS#P)`*d0010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdKa%*!SLsK^Byt0e{00#F- zL_t(|ob8)UQrk)p$A3z_ef&-kxgDK%=@zPGXP z)qGp)u%vw}yBtAX7?poU#tkZQ1^2`zo!iLlfHSb+hDsWBjuXCL16J zQefCrsgw$(J_HJ2q_v(ZrTS8z0%)yM`5gnH);g2leW1`Hx7z{Q zl?hyp=gsS)jm*6nQIKL{y&G1iz=hU2un+K2jQ#}aT!)#_3T8&k9bR)CW|pU#@LTF_ zUTwliYu&*_k}h5tly*H#9t^bB;SxUUV5Q8x8qo=>sZ*Q-eY*^izok3+ocA0v2nu<+ z7%!@p@EVHTa*0ZntCK(C#Xz}Isw1JT^6ER7K~rh13#C*?!ZQtY?z{EgP|8M5{Ysgz ze^0b=zHok5NWPSClwop=^`2kAAL($83ALrvPjT{W1Fs&lJi1D!O88`6c_zC45q?vx zwf*3~fIm{-k@`w>dUW!ztG{hy^)4l3J`J*GWC9Rux^NGIV54>iY#)2~!~^~w2P3`# z9E|t|u#piD`S5k&;E8Vl&l_=Y{5L!M2fP4Q8*y-)(PCY7z<#m(C~9y#1U>^FUrd_= zHbS!}4vzc4Iq-|i`(^u#2fPw2dZIDlmHbL~tw5bbA+qTlj3>pe<-JABZ@ZaEOaZ(H z3NG(Y8yjt5iBTs}j2R>+UeyJV2II+_ivV>J4TJGy^gLy2eg(MUbZ~4>q~A-)&us~7 z5Z(uFF&_9GI0e1{cfdEEKMDWep-!R{lcKf`6HXTmSaEq@>_VV~&k^td#Gc3HbrR*k z=Q@e{!FZDGLWj2on-eqO$SJ?rq0Av>uq+Fi_K{?DAEGGhYenBpR~l=6684%p3nE zC)P<+0!P7k(wd2Mw8R+yL5hzsC-HGGo>W3tV2mGPj8ZYnxu@1ZYtXrKgga?-gcn6t z==XpzUe0{(zYE5bcn$tN%%!eJkrOhzdsDpw&Kkbk32@8cxRTlGHgO~huY*kfehS8u zZZMv7flru@WFGAiFbu|%Fc?o_p@YTSWNql|N&3IRcoI8uLl$q>`TBhk8L9C92@s4Y zf&5;Fe}*w^D0CsS199GQdH+ciZ@RMZ0k~ptTr||Z2qa9MU_#83j`E%XCqiTK+s&my zcgNyItCe&zd;S3Q+|VX;L*T4VqK?S^+@N0$e5LtD-#YwzG^d}TeK9%l^8OmQmL;)u-=m3mP}WH_!gzc~Z;QKcBA{+GVi#}(f2X798DhR+!g4i}|f8*Di312=69c)%+} lUDwn})P0Hn*FRu4_zz~`4%^ju_VfS%002ovPDHLkV1l?+urdGu literal 0 HcmV?d00001 diff --git a/images/descSortIndicator.png b/images/descSortIndicator.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3f1627194664af204e067377652a19a4a17461 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^UmJr;B5V#MIJWN5R7eJS^801GHKv ztQQd|l$h!$EAa8QfR`$Vp8WF1g|TN}EZl7?JE>svle9pg#ig5Hr0ILIn0p`KnscD$ z$)ANYkN)KpdBFH4*mi}}$^#s18jeEU)hzcyZ5n^FNmW=E`8i(tyO#grVTSt$6kPb3 mebxr|zLo!T`GP4>Nc@t0u+!}Dyh%U@F?hQAxvX;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^UmJr;B5V#MIK>gS^cSJS^-|3#N)B zEGe1vIKQgXg>h#|kr3|%FRdFk=Yk$6O#AcU-5PPv6S}8$Js%a_opfj3q!&-7HL`zT ze5dpJSlzRaY$6E^_iANY0+@C*F?y+UJ~L!oFOVI~U|o?ESHX=L4&MUVvq1(rS>`7(8A5T-G@yGywp^c4!X( literal 0 HcmV?d00001 diff --git a/images/descSortIndicatorPressed.png b/images/descSortIndicatorPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2397f74caecd12d26c3fa4f18cc7fe45a73ebb GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=HaS^bJkC@^(K2s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^UmJr;B5V#MIIW8+i{K@UWa`j7^`~ zBhYZ~@F};O3a8}sOq{|B-#!ZNaL~C~*}&TQyS~B0DK9e5Q)v0)X-~dQIij$g=ga}F zJCWP?t9>8yY8())h)+`FQ*AJoSimzWK}z^TS8^^_0=s?0wisU1wdNNOGuR)#=)%wZ m=XXaE-~4RpTWYhOToCV)&sb2C&wLc`*d0010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdKa%*!SLsK^Byt0e{00)3c zL_t(|ob8*zb=)=+$A8Mp-TPG#rUKIyh^`=;18@~nfmaoTsX*%rOkXhvZz?cdLFfv? zRA8zCeFqG7A&6XYS6XG0@c$m4xWHgA91dm%(2%>kJD%%07RH#y7*ix|xiMxvas2Y= z$@lY}EW^n7Npi(>r+St#9P^&Pdr1NJ;1Z~fF^i~e0pt_Me|mnA4whjEQ|0NZP)P^wy1i_t~AQlq%k@%@0oAR@tQ z)W(<|sFK_)EQnka{yP$HbttCHc}kp>(I_f>td7G}54;zVi*Nxys*!D>%3QEBl7^kp zY$9H%f-@c(OTb^+AM&ChtVLvj_mnwFSkZAyd>(TlBH0L^L$G(wQ{wE5CJIwk)Vu-8 zur1fWZM?do`wiac8ohG7m*_@#t#saYM5Hd3DP7TO5F2C6LPJHD^e^y6+KEVGj9F;7 zV}LHc58f%$wsq9Mcg|De?2HDsak`0qcWAz&?!Ct62*Er24t!GuZ}6e3)&8C+Pa5F0 zWS0l+lc`fab<$p|tlyMhFCyUu{|?QC_kWh2X2yAAHkug+V>X%@2jl3RX3k&!yO=%AjDs;7&5VOF8_kS^ zF&oW{gE1S;jDs;7&5VO_7L|L>xe6^XN^px-)>&(tWK08Ktu0O}+&>h~xs|o{+5R6D z>-*e1%}3z3=-S{*8$LVd%7nINxM1r)4_$;er{e#>(`c9}V!B9i07!K(v!TmefFDU2~=H7Q5K zTHC9a`HZiVSpfvk6O2cVt7KQ^(Bi{d7xNpSYm~0vL$kpfbWBr5<3rI{PZCO}(kX4m z{Q|TH^FHxUt%*u&G_N>q$zcn; z9_mnqTmskD+FX<49B*i`Od&CRqjWj&v+}L9uO6UzgI99ReY^%%*4j+xe538<5pq;v{A=JVkSSfpuCNV&??mKIMDEz1IE4hY6OmkN zbMpbZn~2}vfjq1l4NHZ!wuG%q{|WDow_(&;y8(UyYNfdxplR{Syo^^R@K>B$Dcu(y z7QFAJQ;+ilu#7{6(yf3i=iFk-GYl!^0RBt-;;)jBwTk&o-E!ASB7C`*`h{VwZJl#p z@%h!2-Z$J=VjRcQ@ilCfJ4mB#@03rYZQVo>AEOKN*3kwdAQ)-9NJpRHiTrcrb&tR1 zO54aXb<17qcR3k8iTi?g{V$129)`pi1#pdbt*`Mf_z&k?eR9c8i=glRF~XPP|GnlX zh{%fZ5EZuHje49yLsaTaSgRW^(4zzA+?t(IvH|`D`o+K) z4ddTMJqH5MGTrUP(A+JSCGIPLMd~Gv;qRQw2Iw+WKe4B&8TTI7z*~HUf1x=`YB0B) z;IK^%V6FTI4bnNcbk6l*cVn&XRe6Y6q94rb zoU5F3opWx|GdzVqyRcg(GzC#2yv=EhF}>z14G(uwZIsgt33Uq;`l-cJP$t{e48Qez z1^lvSm4p}BgtG}9yTT`-jrLc-jdN~;H}GC*UgLKl;FTZKz-}9Reau5W25W8Socjp; zs)irWdj-6Y64NQq0Bp~QTFv>U@b8^-@0D(WH@1x3q6LziMi1w5{BCI~KH|6H&#?lp z@MjC*TH=lP?Y=}$jj64|7clb+n3 z61u`e?lLNy(iUTMF`wjwdJ=#2NE!Y_xr_V$bw)Ge^f;3=*#Y$WwN}P*Q6H7Al^Atidb5j`%%=Hb7^$ks~?`)0$s*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4^UmJr;B5V#MIJWN5R7eJS^801GHKv ztQQd|l$h!$EAa8QfR`$Vp8WF1g|TN}EZl7?JE>svle9pg#ig5Hr0ILIn0p`KnscD$ z$)ANYkN)KpdBFH4*mi}}$^#s18jeEU)hzcyZ5n^FNmW=E`8i(tyO#grVTSt$6kPb3 mebxr|zLo!T`GP4>Nc@t0u+!}Dyh%U@F?hQAxvXEak-(K~n2LBS>i0fy;4^=}>4 zFnDiZIOM>Zz&^!^-HCe%qt^khB`j+hy)=06WJPccSiQSRnJ2he#=kaBT*NS z>7sjAY~QCS?a(SCp4tZ+1EefD+h$#x#I0~o;TV%eo73_=TH6}LKkVpA1! VRCU^6uL$%bgQu&X%Q~loCIBqoh?oEX literal 0 HcmV?d00001 diff --git a/images/dropdownSearch.png b/images/dropdownSearch.png new file mode 100644 index 0000000000000000000000000000000000000000..c7102e382c56d81158369d3f19147bc04911548d GIT binary patch literal 477 zcmV<30V4j1P)hzgUfi5;u(xN}8+s2^b2CsqF&;^n52k0+Kz_vGmQm|V(8vvdDt-9S8od=1A TC6vvS00000NkvXXu0mjfT@t{; literal 0 HcmV?d00001 diff --git a/images/dropdownSend.png b/images/dropdownSend.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca1cf51adac3843f3060772409d43519d8a4826 GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRx!3HE}ruUu)QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BW-s<^>H(?~ z1F3T^N=+=u%+FH@$;?e}%WV$nPGilO&m2Z>`J>n|;m zd9)@b{NO=8J*%A-OHa3!6$r>Ik(_!m;9uGamdhUmPastbo_Ne_)#SOd(`pgl`e2t|E-}wus zYBA0}5ajmL@XD{+qHj_LVKT>ec;zyN3oB^LAMjjJdOP$LLx%bR*$s1p{nFVtG)CVJ z%_==;binQdXM|aR*ZUAH(K%7PiY{UsCh5F+Ik#$Y<7100HTL{7`M>On?J@MwqUY&+*egXonfrUVs z*3%46Umjd=e|gkeBN@KWr}7V^O8)Tk?=_T2Hp*vR6!2R8!41Bxa?IZ=dsp63>3$+D z!+4&xEB-*{imw`yOYSoteDA+?4x>#=)cz&x_Bv}@5^f0a%>c#&gQu&X%Q~loCICB) B#&`e# literal 0 HcmV?d00001 diff --git a/images/helpIcon.png b/images/helpIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..373e6cca8d2da485546122599f86de6005f10785 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(0U`xw#m)s%EX7WqAsj$Z!;#Vfk}U9uEM{Qf z76M_$OLy!300qTLTq8=Hi&7IyGV}8kLNaqx84S$z4UF^+P4Zcv*aB6^fK&wMr^lZA!u6{1-oD!M< DV8uaS literal 0 HcmV?d00001 diff --git a/images/helpIconHovered.png b/images/helpIconHovered.png new file mode 100644 index 0000000000000000000000000000000000000000..164762637cd0a34533dc09f525ced03a9f701cee GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(0U`xw#m)s%EX7WqAsj$Z!;#Vfk}U9uEM{Qf z76M_$OLy!300qTLTq8=Hi&7IyGV}8kLNaqx84S$z4UF^+P4Zcv*aB6^fK&wMr8~FGN-6TFj7#NS<2x$ulSJ(4&o_?F1VQ}+|pn;WF>1cBT#53P(OpGtDnm{r-UW| D!5KYx literal 0 HcmV?d00001 diff --git a/images/hseparator.png b/images/hseparator.png new file mode 100644 index 0000000000000000000000000000000000000000..2429f44d47f36512b7d20a93a06a3dac0bc39548 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ee!3HD?6ZrQ7DVAa<&kznEsNqQI0P;BtJR*x3 z7`TN%nDNrxx<5ccu@cva66d1S#FEVXJcW?V+*AewbA1D2eM6J$JDVebDr7(^g7ec# z$`gxH85~pclTsDjGK*5n^NX^J6`X_3UhLV_15~Hz>Eal|F*Etk|Nr*PARr9Hhv!e++m;h5lg)vO89ZJ6T-G@yGywpHbTEaloG4XBxM&3gP0qG z7do4drHHILg131nOWE2VTx<%2A!nbfYm?rk?+mE^mTj_zN2#^ z>f|d0-pxK|M8)`ywt7|HAWOY)ZDg;ix{bx(-*``ZRP@f4ru{Q-5KhA{u8GQUXS*U7>%frycN<(j4>PXc;O8&CvZn(&uJKR+0000AfL0qBeIx* zfm;ZK886+f`vVjdD{+k|aV|-L1;Fyx1l&avCS(I9yUzA;};2doBV$Y@?pgJ8-7sn8ZsYfqtYw&x x-nf#5+cfl6B;Id&;BfoTLY2Al@`ofo#|XV;;}2MOq7bN$!PC{xWt~$(696kRKjHuY literal 0 HcmV?d00001 diff --git a/images/maximizeIconHovered.png b/images/maximizeIconHovered.png new file mode 100644 index 0000000000000000000000000000000000000000..92a3a2ab41cec38f5b5485477d9cc3891eb4845a GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dF8<0HkD{mW+Vkvg=4B-HR8jh3>AfL0qBeIx* zfm;ZK886+f`vVjdD{+k|aV|-L1;Fyx1l&avCS(I9yUzA;};2doBV$Y@?pgMg|7sn8ZsmXulCx4#b$Z^1>M~Mvx w#6U#b$#%()t4?kG>%XOwdBuc@Hy$uDWbWmN-7#xLI8ZBtr>mdKI;Vst0K98J8vpl+y98=B;^KCuO=kO8R(&QB{T zPb^Aha7@WhN>y;nEJ`iUFUl@fa1J(mv1d~cP~93&7sn8diM^LL7BU$MuwE!HVl3l) zciN%rafUn)TgN=HV4nJ za0`Jj!}Pi%oIWI!r{^V3So z6N^$A98>a>QWe}Xi&D$;i?WLqoP*6??Ag=4nJ za0`Jj!}Pi%oIWI!r{^V3So z6N^$A98>a>QWe}Xi&D$;i?WLqoP*6??Ag=!!J~Oy7Yj89ZJ6T-G@yGywoYlsGv6 literal 0 HcmV?d00001 diff --git a/images/moneroLogo.png b/images/moneroLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..8155c5fae9f9efb2a86a7e7b0ee3c19e8d0ccdee GIT binary patch literal 2576 zcmV+r3h(uaP)`*d0010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdKa%*!SLsK^Byt0e{010SG zL_t(|ob8)`kXBV0$3LthI7y-+j`;&jM-(j>&8%TIzLYXnj*y_Hj^SogW4f^DG-Qmh zrVU9GpgY=RQ!OmRtAZb@@xC!oV$DOdCz^{`z|Yj z^M3wW&U4SX_q_K$=RD7Oo`*p_Jv}sNFyOQ{kEf$+P1CzQj|T5STAMq8sQ`z*yEAF< zo};z74VVI)0?^pO8Vnq*&DR2pfk)`*+6D~;YcNna<@&L2wP)gnf;HH8TARlMOMJ`d z=<3ccH59DDzR}t|95CQWFS#we+)%Iv{ijm7y6Nb$uuDV18te<5z__4&SKOhYU=8|5 zUpOLUDy_{51q}sj&|hXGWD|iWXl?HHr%DDjQbi5=O>6TEpbZ#b&|`H@!6bbV_+ilD z4Pd01y1%?4Vz-HhX;C^6*neDD|pLSq=AlhVR zqic*2@I)vxvq4cG!>!JGnPg^G?O6r93H%jU2RsDaZ)SVTJWx^-@LAvr;Cx^dFc^3X zc*#G%)6AYL{VQtW!W4@EMOS9WCi25k`~AQLB_1(7YLAdqQ^6#Sl(Ycc@t+MQ_PoiN0s@cSW>&o0nY_E)0g6I;A>UJ{;xnj5_m$= zdHXUke{#&i72AMGSuV1-nnKcWAhl&4g|n@z3T}USfjp(Gc+>e1aCmfSHSk^FaWmT? z=@8%?pau9ca7fU1uB3Hlc7MUMV`vUu$=D0r9DjT>+k6oLhs-#{=I1uC4b6(AqqjzIa%R z_s4n(O=NP%@m%V6l$av(2nhv~^g-YYk@(hHJByk90r)iTB$RP1@YQPLB90_~(mfbh z8?}c=?Kb+-G~jl`$+2>Um|2gR&BG~F$Tj}^)Jwbn+d@az!|}zk3U(|oAt5g^kB~k| zUQOQAt-+arnwZ%ifp16RRIo23-rXijnp)<02MDos=rv*9;g1*VJTrT-$wMTyCFFPFtax#{T_F0&lrnS>>^rlhm_2`WTtXocCv|-3%nZ8UFG^v z+@dMN9`gQJydgYgX8$dDuZ-VB?W&=r1V%?!RrjU|dQWy?$Y2lfGhkC7J02GZ&A2SO z*K*+bNEXLr;;=+D#VBHP)E=4a`Cw;9@;{r|PT;{vei`(d$Ik@vy|~cBhNyph-(4<-kpWd^&J5&O8nc4UQDo#EnFe()`MR$$syMbQ@?J>X^L3;;qhMD~* zF*g3)@p~!53FH-Zdq3_`l}y26MaUH8X`C6$CV#S|b4i;=fR}MAX^3whC+TQ2`?qhe zBcBkRL}d=E5J|&;k4NGc%8WI$Zb^5MPlnH;wi2XRZD#d2!$s^cvtD1&C;d0j_tD=6 ze2L0f7gSn{k4YL*t1uxV&NG)iftDsSk+E~P9$d_X$`#&1+B{~#(Rh-fnT(zK8;bI4 z1>8vA2@>FCGuu?uImSodW51!jj_1FlnAuCfPa^RxeqqJD0Q@~@4<~=Xs)~Q_vm)_h zWyhB#Q?Mcv39gbMY`asf(IO8b?0*3@#N?FD+5KW|hKzrk%WR zdJN7j$>A4&tc(jKjVk$^IaJnhEh{;;G)+6`3_+;!#^7+fHKu6J-BFt zX|SZpl2+mVb4IwJw*fN;@&{xbN~L*>6$IQa^_7Htbz~k><8umZW?Lmq!Btj#5Z z#oq8q-l7~Qz+yA&k9o}IuuW16<*G|l%$GF3cDH;*Ygx=}i=+|YdJ`8nOIe9sz!iSy9B`Vb++k7*W~9RbD-yEoB$;uXq+C$Y%>INc z9eJ%_Ue%QAb`m~Gz4#Ab@!zZtAnpXh@WfDHUP0gMaW!EnhT=?TO1ZWJmzY@`(H}5U zCUSk;$)65mGucCBAhzfvS&>Nh6%yldj%AsAXEFL7E3fhT# mpZ5Y2%=Q literal 0 HcmV?d00001 diff --git a/images/statusConnected.png b/images/statusConnected.png new file mode 100644 index 0000000000000000000000000000000000000000..db18925e4e2173b4a6655a1e9c3a31426174a7d3 GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^Ahs9>8<6~|#v2QySc;uILpXq-h9ji|$mcBZh%9Dc z;1&X5#!GkW{(y9pxJHyX7o{eaWaj57gkwnq1%69061z15y#3pH@Q%1=Lj5C;(`=Zu1%6@44`aIFVVZGsM>zyYS2;Dfo=HRbyLRVg~ zWi-5AVY6KBD94qg+G5To=66DWRrgm-oTAvP8Wpa>QWe}Xi&D$;i?WLqoP*6??Ag=0AI)i39sWmfu;Tg3FnwI&hY;K3iaV-|ZuR@s+IkX-fkQ`;_ApTa*i!{qlZ# z2c>`I`cb%*ZHH%7#W}s^X%1%=L|ZXltcurCJFeKm{DI+{@!4=|1E$nx6_*%fRKM^lOZOZ=lZ^JYD@<);T3K0RYG9nwbCq literal 0 HcmV?d00001 diff --git a/images/tableOptions.png b/images/tableOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..3e07d2744dfc984416cc65c690a7133ccb066218 GIT binary patch literal 489 zcmV@0ebnBS{%qRu%BoOOEu4DhM@cVNilUL>Tu z8%jiAtKVncCwu@+7Qa`dN}@^+zzdJjdl9Q;HeMuDu5BBYyaoCdB)?>uI|8Owxe04Y zZgZR3iww+-9iJdc7@3FVdQ&MBb@02Qe}@&Et; literal 0 HcmV?d00001 diff --git a/images/whatIsIcon.png b/images/whatIsIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..373de4435deec0d5d463e62efd65f98759c6f08b GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eO!3HGrSK5O(EX7WqAsj$Z!;#Vf4nJ za0`Jj!}Pi%oIWI!r{^V3So z6N^$A98>a>QWe}Xi&D$;i?WLqoP*6??Ag=lJk?9 zIy*OR+T!ZZu)NUU;VJK%4F%rZ{0TlfzByYq8l>ea=W4-(4O2Dt7OU1W_RcZeBYiOK7tlitp00i_>zopr0JDvP Ap8x;= literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 00000000..10743122 --- /dev/null +++ b/main.cpp @@ -0,0 +1,20 @@ +#include +#include + +#include "filter.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + filter *eventFilter = new filter; + app.installEventFilter(eventFilter); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); + QObject *rootObject = engine.rootObjects().first(); + + QObject::connect(eventFilter, SIGNAL(ctrlPressed()), rootObject, SLOT(ctrlKeyPressed())); + QObject::connect(eventFilter, SIGNAL(ctrlReleased()), rootObject, SLOT(ctrlKeyReleased())); + + return app.exec(); +} diff --git a/main.qml b/main.qml new file mode 100644 index 00000000..a3e827ea --- /dev/null +++ b/main.qml @@ -0,0 +1,77 @@ +import QtQuick 2.2 +import QtQuick.Window 2.0 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import "components" + +ApplicationWindow { + id: appWindow + property bool whatIsEnable: false + property bool ctrlPressed: false + function ctrlKeyPressed() { ctrlPressed = true; } + function ctrlKeyReleased() { ctrlPressed = false; } + + visible: true + width: 1269 + height: 932 + color: "#FFFFFF" + x: (Screen.width - width) / 2 + y: (Screen.height - height) / 2 + flags: Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint + + Item { + id: rootItem + anchors.fill: parent + + MouseArea { + property var previousPosition + anchors.fill: parent + + onPressed: previousPosition = Qt.point(mouseX, mouseY) + onPositionChanged: { + if (pressedButtons == Qt.LeftButton) { + var dx = mouseX - previousPosition.x + var dy = mouseY - previousPosition.y + appWindow.x += dx + appWindow.y += dy + } + } + } + + LeftPanel { + id: leftPanel + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + onDashboardClicked: middlePanel.state = "Dashboard" + onHistoryClicked: middlePanel.state = "History" + onTransferClicked: middlePanel.state = "Transfer" + onAddressBookClicked: middlePanel.state = "AddressBook" + onMiningClicked: middlePanel.state = "Minning" + onSettingsClicked: middlePanel.state = "Settings" + } + + RightPanel { + id: rightPanel + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + } + + MiddlePanel { + id: middlePanel + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: leftPanel.right + anchors.right: rightPanel.left + state: "Dashboard" + } + + TipItem { + id: tipItem + text: "send to the same destination" + visible: false + z: 100 + } + } +} diff --git a/pages/AddressBook.qml b/pages/AddressBook.qml new file mode 100644 index 00000000..26d3c7c9 --- /dev/null +++ b/pages/AddressBook.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Rectangle { + color: "#000000" +} diff --git a/pages/Dashboard.qml b/pages/Dashboard.qml new file mode 100644 index 00000000..f8df1b18 --- /dev/null +++ b/pages/Dashboard.qml @@ -0,0 +1,125 @@ +import QtQuick 2.0 +import "../components" + +Rectangle { + color: "#F0EEEE" + + SearchInput { + id: searchInput + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 17 + z: 1 + } + + Text { + id: quickTransferText + anchors.left: parent.left + anchors.right: parent.right + anchors.top: searchInput.bottom + anchors.topMargin: 20 + elide: Text.ElideRight + anchors.margins: 17 + font.family: "Arial" + font.pixelSize: 18 + color: "#4A4949" + text: qsTr("Quick transfer") + } + + LineEdit { + id: quickTransferLine + anchors.left: parent.left + anchors.right: parent.right + anchors.top: quickTransferText.bottom + anchors.topMargin: 18 + anchors.leftMargin: 17 + anchors.rightMargin: 17 + } + + Row { + id: row + anchors.left: parent.left + anchors.right: parent.right + anchors.top: quickTransferLine.bottom + anchors.topMargin: 18 + anchors.leftMargin: 17 + anchors.rightMargin: 17 + spacing: 17 + + LineEdit { + id: amountLine + width: 148 + placeholderText: "amount..." + } + + StandardButton { + id: sendButton + width: 60 + text: qsTr("SEND") + shadowColor: "#FF4304" + releasedColor: "#FF6C3C" + pressedColor: "#FF4304" + } + + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: "Arial" + font.pixelSize: 12 + color: "#545454" + text: qsTr("lookng for security level and address book? go to Transfer tab") + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.top: row.bottom + anchors.topMargin: 17 + color: "#FFFFFF" + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + height: 1 + color: "#DBDBDB" + } + + TableHeader { + id: header + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 17 + anchors.leftMargin: 14 + anchors.rightMargin: 14 + onSortRequest: console.log("column: " + column + " desc: " + desc) + } + + ListModel { + id: testModel + ListElement { paymentId: "Malkolm T."; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: "Martin"; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: true } + ListElement { paymentId: "Martin"; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: true } + ListElement { paymentId: ""; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: ""; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: "Malkolm T."; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: ""; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: "Malkolm T."; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: "Malkolm T."; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + ListElement { paymentId: "Malkolm T."; address: "faef56b9acf67a7dba75ec01f403497049d7cff111628edfe7b57278554dc798"; date: "Jan 12, 2014 12:23 AM"; amount: "19301.870709159241"; balance: "0.000709159241"; out: false } + } + + DashboardTable { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: header.bottom + anchors.bottom: parent.bottom + anchors.leftMargin: 14 + anchors.rightMargin: 14 + model: testModel + } + } +} diff --git a/pages/History.qml b/pages/History.qml new file mode 100644 index 00000000..c972e631 --- /dev/null +++ b/pages/History.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Rectangle { + color: "#00FF00" +} diff --git a/pages/Mining.qml b/pages/Mining.qml new file mode 100644 index 00000000..af5804e7 --- /dev/null +++ b/pages/Mining.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Rectangle { + width: 100 + height: 62 +} diff --git a/pages/Settings.qml b/pages/Settings.qml new file mode 100644 index 00000000..af5804e7 --- /dev/null +++ b/pages/Settings.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Rectangle { + width: 100 + height: 62 +} diff --git a/pages/Transfer.qml b/pages/Transfer.qml new file mode 100644 index 00000000..eaf59bad --- /dev/null +++ b/pages/Transfer.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Rectangle { + color: "#0000FF" +} diff --git a/qml.qrc b/qml.qrc new file mode 100644 index 00000000..69d2c9f6 --- /dev/null +++ b/qml.qrc @@ -0,0 +1,57 @@ + + + main.qml + LeftPanel.qml + RightPanel.qml + MiddlePanel.qml + images/closeIcon.png + images/helpIcon.png + images/maximizeIcon.png + images/minimizeIcon.png + images/helpIconHovered.png + images/maximizeIconHovered.png + images/minimizeIconHovered.png + images/moneroLogo.png + components/Label.qml + images/whatIsIcon.png + images/lockIcon.png + components/MenuButton.qml + images/menuIndicator.png + pages/Dashboard.qml + pages/Transfer.qml + pages/History.qml + pages/AddressBook.qml + pages/Mining.qml + pages/Settings.qml + components/NetworkStatusItem.qml + images/statusConnected.png + images/statusDisconnected.png + components/Input.qml + components/SearchInput.qml + images/magnifier.png + components/StandardButton.qml + images/dropIndicator.png + images/hseparator.png + components/LineEdit.qml + components/TableHeader.qml + images/ascSortIndicator.png + images/ascSortIndicatorActived.png + images/ascSortIndicatorPressed.png + images/descSortIndicator.png + images/descSortIndicatorActived.png + images/descSortIndicatorPressed.png + images/backToWindowIcon.png + images/backToWindowIconHovered.png + components/DashboardTable.qml + components/TableDropdown.qml + images/tableOptions.png + images/dropdownOption1.png + images/dropdownSearch.png + images/dropdownSend.png + components/TipItem.qml + images/tip.png + tabs/Twitter.qml + tabs/tweetSearch.js + tabs/TweetsModel.qml + + diff --git a/tabs/TweetsModel.qml b/tabs/TweetsModel.qml new file mode 100644 index 00000000..19b77ab1 --- /dev/null +++ b/tabs/TweetsModel.qml @@ -0,0 +1,88 @@ +import QtQuick 2.2 +import "tweetSearch.js" as Helper + +Item { + id: wrapper + + // Insert valid consumer key and secret tokens below + // See https://dev.twitter.com/apps +//! [auth tokens] + property string tweetsMaxCount: "20" + property string consumerKey : "" + property string consumerSecret : "" +//! [auth tokens] + property string bearerToken : "" + + property variant model: tweets + property string from : "" + property string phrase : "" + + property int status: XMLHttpRequest.UNSENT + property bool isLoading: status === XMLHttpRequest.LOADING + property bool wasLoading: false + signal isLoaded + + ListModel { id: tweets } + + function encodePhrase(x) { return encodeURIComponent(x); } + + function reload() { + tweets.clear() + + if (from == "" && phrase == "") + return; + +//! [requesting] + var req = new XMLHttpRequest; + req.open("GET", "https://api.twitter.com/1.1/search/tweets.json?from=" + from + + "&count=" + tweetsMaxCount + "&q=" + encodePhrase(phrase)); + req.setRequestHeader("Authorization", "Bearer " + bearerToken); + req.onreadystatechange = function() { + status = req.readyState; + if (status === XMLHttpRequest.DONE) { + var objectArray = JSON.parse(req.responseText); + if (objectArray.errors !== undefined) + console.log("Error fetching tweets: " + objectArray.errors[0].message) + else { + for (var key in objectArray.statuses) { + var jsonObject = objectArray.statuses[key]; + tweets.append(jsonObject); + } + } + if (wasLoading == true) + wrapper.isLoaded() + } + wasLoading = (status === XMLHttpRequest.LOADING); + } + req.send(); +//! [requesting] + } + + + Component.onCompleted: { + if (consumerKey === "" || consumerSecret == "") { + console.log("setting demo token") + bearerToken = encodeURIComponent(Helper.demoToken()) + tweetsModel.phrase = "" + tweetsModel.from = "@monerocurrency" + reload() + return; + } + + var authReq = new XMLHttpRequest; + authReq.open("POST", "https://api.twitter.com/oauth2/token"); + authReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); + authReq.setRequestHeader("Authorization", "Basic " + Qt.btoa(consumerKey + ":" + consumerSecret)); + authReq.onreadystatechange = function() { + if (authReq.readyState === XMLHttpRequest.DONE) { + var jsonResponse = JSON.parse(authReq.responseText); + if (jsonResponse.errors !== undefined) + console.log("Authentication error: " + jsonResponse.errors[0].message) + else + bearerToken = jsonResponse.access_token; + } + } + authReq.send("grant_type=client_credentials"); + } + +} diff --git a/tabs/Twitter.qml b/tabs/Twitter.qml new file mode 100644 index 00000000..03c9be81 --- /dev/null +++ b/tabs/Twitter.qml @@ -0,0 +1,124 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import "tweetSearch.js" as Helper + +Item { + id: tab + ListModel { + id: testModel + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + ListElement { head: "Monero || #xmr"; foot: "@btcplanet Duis turpis arcu, varius nec rutrum in, adipiscing at enim. Donec quis consequat ipsum," } + } + + property int inAnimDur: 250 + property int counter: 0 + property alias isLoading: tweetsModel.isLoading + property var idx + property var ids + + Component.onCompleted: { + ids = new Array() + } + + function idInModel(id) { + for (var j = 0; j < ids.length; j++) + if (ids[j] === id) + return 1 + return 0 + } + + TweetsModel { + id: tweetsModel + onIsLoaded: { + console.debug("Reload") + idx = new Array() + for (var i = 0; i < tweetsModel.model.count; i++) { + var id = tweetsModel.model.get(i).id + if (!idInModel(id)) + idx.push(i) + } + console.debug(idx.length + " new tweets") + tab.counter = idx.length + } + } + + Timer { + id: timer + interval: 1; running: tab.counter; repeat: true + onTriggered: { + tab.counter--; + var id = tweetsModel.model.get(idx[tab.counter]).id + var item = tweetsModel.model.get(tab.counter) + listView.add({ "statusText": item.text, + "twitterName": item.user.screen_name, + "name" : item.user.name, + "userImage": item.user.profile_image_url, + "source": item.source, + "id": id, + "uri": Helper.insertLinks(item.user.url, item.user.entities), + "published": item.created_at }); + console.log(item.created_at) + ids.push(id) + } + } + + ListView { + id: listView + model: ListModel { id: finalModel } + anchors.fill: parent + clip: true + boundsBehavior: ListView.StopAtBounds + + function add(obj) { model.insert(0, obj) } + delegate: Rectangle { + height: 98 + width: listView.width + + Text { + id: headerText + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 16 + elide: Text.ElideRight + font.family: "Arial" + font.pixelSize: 18 + color: "#000000" + text: model.name + } + + Text { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerText.bottom + anchors.bottom: parent.bottom + anchors.topMargin: 10 + anchors.bottomMargin: 10 + wrapMode: Text.Wrap + elide: Text.ElideRight + font.family: "Arial" + font.pixelSize: 12 + color: "#535353" + text: model.statusText + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: "#DBDBDB" + } + } + } +} diff --git a/tabs/tweetSearch.js b/tabs/tweetSearch.js new file mode 100644 index 00000000..2d1c083f --- /dev/null +++ b/tabs/tweetSearch.js @@ -0,0 +1,83 @@ +.pragma library + +function formatDate(date) { + var da = new Date(date) + return da.toDateString() +} + +function demoToken() { + var a = new Array(22).join('A') + return a + String.fromCharCode(0x44, 0x69, 0x4a, 0x52, 0x51, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x74, 0x2b, 0x72, 0x6a, 0x6c, 0x2b, 0x71, + 0x6d, 0x7a, 0x30, 0x72, 0x63, 0x79, 0x2b, 0x42, 0x62, + 0x75, 0x58, 0x42, 0x42, 0x73, 0x72, 0x55, 0x48, 0x47, + 0x45, 0x67, 0x3d, 0x71, 0x30, 0x45, 0x4b, 0x32, 0x61, + 0x57, 0x71, 0x51, 0x4d, 0x62, 0x31, 0x35, 0x67, 0x43, + 0x5a, 0x4e, 0x77, 0x5a, 0x6f, 0x39, 0x79, 0x71, 0x61, + 0x65, 0x30, 0x68, 0x70, 0x65, 0x32, 0x46, 0x44, 0x73, + 0x53, 0x39, 0x32, 0x57, 0x41, 0x75, 0x30, 0x67) +} + +function linkForEntity(entity) { + return (entity.url ? entity.url : + (entity.screen_name ? 'https://twitter.com/' + entity.screen_name : + 'https://twitter.com/search?q=%23' + entity.text)) +} + +function textForEntity(entity) { + return (entity.display_url ? entity.display_url : + (entity.screen_name ? entity.screen_name : entity.text)) +} + +function insertLinks(text, entities) { + if (typeof text !== 'string') + return ""; + + if (!entities) + return text; + + // Add all links (urls, usernames and hashtags) to an array and sort them in + // descending order of appearance in text + var links = [] + if (entities.urls) + links = entities.urls.concat(entities.hashtags, entities.user_mentions) + else if (entities.url) + links = entities.url.urls + + links.sort(function(a, b) { return b.indices[0] - a.indices[0] }) + + for (var i = 0; i < links.length; i++) { + var offset = links[i].url ? 0 : 1 + text = text.substring(0, links[i].indices[0] + offset) + + '' + + textForEntity(links[i]) + '' + + text.substring(links[i].indices[1]) + } + return text.replace(/\n/g, '
'); +} + +function boldLinks(text, entities) { + if (typeof text !== 'string') + return ""; + + if (!entities) + return text; + + // Add all links (urls, usernames and hashtags) to an array and sort them in + // descending order of appearance in text + var links = [] + if (entities.urls) + links = entities.urls.concat(entities.hashtags, entities.user_mentions) + else if (entities.url) + links = entities.url.urls + + links.sort(function(a, b) { return b.indices[0] - a.indices[0] }) + + for (var i = 0; i < links.length; i++) { + var offset = links[i].url ? 0 : 1 + text = text.substring(0, links[i].indices[0] + offset) + + '' + textForEntity(links[i]) + '' + + text.substring(links[i].indices[1]) + } + return text.replace(/\n/g, '
'); +}