diff --git a/LeftPanel.qml b/LeftPanel.qml
index 59793659..93290bc6 100644
--- a/LeftPanel.qml
+++ b/LeftPanel.qml
@@ -36,6 +36,7 @@ Rectangle {
property alias unlockedBalanceText: unlockedBalanceText.text
property alias balanceText: balanceText.text
property alias networkStatus : networkStatus
+ property alias daemonProgress : daemonProgress
signal dashboardClicked()
signal historyClicked()
@@ -352,9 +353,16 @@ Rectangle {
id: networkStatus
anchors.left: parent.left
anchors.right: parent.right
- anchors.bottom: parent.bottom
+ anchors.bottom: (daemonProgress.visible)? daemonProgress.top : parent.bottom;
connected: false
}
+
+ DaemonProgress {
+ id: daemonProgress
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ }
}
// indicate disabled state
Desaturate {
diff --git a/components/DaemonProgress.qml b/components/DaemonProgress.qml
new file mode 100644
index 00000000..1ed533e3
--- /dev/null
+++ b/components/DaemonProgress.qml
@@ -0,0 +1,90 @@
+// Copyright (c) 2014-2015, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import QtQuick 2.0
+
+Item {
+ id: item
+ property int fillLevel: 0
+ height: 44
+ anchors.margins: 10
+ visible: false
+ //clip: true
+
+ function updateProgress(currentBlock,targetBlock){
+ if(targetBlock > 0) {
+ var progressLevel = ((currentBlock/targetBlock) * 100).toFixed(0);
+ fillLevel = progressLevel
+ console.log("target block: ",progressLevel)
+ progressText.text = qsTr("Synchronizing blocks %1/%2").arg(currentBlock.toFixed(0)).arg(targetBlock.toFixed(0));
+ console.log("Progress text: " + progressText.text);
+
+ // TODO: lower daemon block height cache, ttl and refresh interval?
+
+ item.visible = (currentBlock < targetBlock)
+
+ }
+ }
+
+ Rectangle {
+ id: bar
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ height: 18
+ //radius: 4
+ color: "#FFFFFF"
+
+ Rectangle {
+ id: fillRect
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.margins: 2
+ property int maxWidth: parent.width - 4
+ width: (maxWidth * fillLevel) / 100
+
+ color: {
+ if(item.fillLevel < 99) return "#FF6C3C"
+ //if(item.fillLevel < 99) return "#FFE00A"
+ return "#36B25C"
+ }
+
+ }
+ }
+
+ Text {
+ id:progressText
+ anchors.bottom: parent.bottom
+ font.family: "Arial"
+ font.pixelSize: 12
+ color: "#545454"
+ text: qsTr("Synchronizing blocks")
+ }
+
+}
diff --git a/main.qml b/main.qml
index 1a97a5d1..82f5c17f 100644
--- a/main.qml
+++ b/main.qml
@@ -221,6 +221,9 @@ ApplicationWindow {
if (splash.visible) {
hideProcessingSplash()
}
+ var dCurrentBlock = currentWallet.daemonBlockChainHeight();
+ var dTargetBlock = currentWallet.daemonBlockChainTargetHeight();
+ leftPanel.daemonProgress.updateProgress(dCurrentBlock,dTargetBlock);
// Store wallet after first refresh. To prevent broken wallet after a crash
// TODO: Move this to libwallet?
@@ -231,6 +234,7 @@ ApplicationWindow {
}
leftPanel.networkStatus.connected = currentWallet.connected
+
onWalletUpdate();
}
@@ -247,6 +251,7 @@ ApplicationWindow {
}
+
function walletsFound() {
var wallets = walletManager.findWallets(moneroAccountsDir);
if (wallets.length === 0) {
diff --git a/qml.qrc b/qml.qrc
index a44266b9..ad47ba44 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -116,5 +116,6 @@
lang/flags/italy.png
components/PasswordDialog.qml
components/ProcessingSplash.qml
+ components/DaemonProgress.qml
diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp
index 4dcf9add..9f0908b9 100644
--- a/src/libwalletqt/Wallet.cpp
+++ b/src/libwalletqt/Wallet.cpp
@@ -157,6 +157,12 @@ quint64 Wallet::daemonBlockChainHeight() const
return m_daemonBlockChainHeight;
}
+quint64 Wallet::daemonBlockChainTargetHeight() const
+{
+ m_daemonBlockChainTargetHeight = m_walletImpl->daemonBlockChainTargetHeight();
+ return m_daemonBlockChainTargetHeight;
+}
+
bool Wallet::refresh()
{
bool result = m_walletImpl->refresh();
diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h
index 1a6459d4..d3ca4085 100644
--- a/src/libwalletqt/Wallet.h
+++ b/src/libwalletqt/Wallet.h
@@ -92,6 +92,9 @@ public:
//! returns daemon's blockchain height
Q_INVOKABLE quint64 daemonBlockChainHeight() const;
+ //! returns daemon's blockchain target height
+ Q_INVOKABLE quint64 daemonBlockChainTargetHeight() const;
+
//! refreshes the wallet
Q_INVOKABLE bool refresh();
@@ -162,7 +165,7 @@ private:
mutable QTime m_daemonBlockChainHeightTime;
mutable quint64 m_daemonBlockChainHeight;
int m_daemonBlockChainHeightTtl;
-
+ mutable quint64 m_daemonBlockChainTargetHeight;
};