Просмотр исходного кода

app: improved blockchain network status indicator

- Indicator colors are updated and a new net state is added
- DrkPlugin now listens to the scan progress and updates the indicator state accordingly
epiphany 2 месяцев назад
Родитель
Сommit
2dc6311a48

+ 25 - 3
bin/app/src/app/schema/wallet/netstatus.rs

@@ -62,8 +62,10 @@ pub async fn make(
     node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
     node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
-    let mut shape = shape::create_blockchain_netlogo1([1., 0., 0.25, 1.]);
+    let mut shape = shape::create_blockchain_netlogo1([1., 0.15, 0.30, 1.]);
     shape.join(shape::create_blockchain_netlogo2([0.27, 0.4, 0.4, 1.]));
+    shape.join(shape::create_blockchain_netlogo3([0.27, 0.4, 0.4, 1.]));
+    shape.join(shape::create_blockchain_netlogo4([0.27, 0.4, 0.4, 1.]));
     let net0_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net0_node);
 
@@ -76,8 +78,10 @@ pub async fn make(
     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
     node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
-    let mut shape = shape::create_blockchain_netlogo1([1., 0.6, 0., 1.]);
-    shape.join(shape::create_blockchain_netlogo2([0.27, 0.4, 0.4, 1.]));
+    let mut shape = shape::create_blockchain_netlogo1([0.73, 0.62, 1., 1.]);
+    shape.join(shape::create_blockchain_netlogo2([0.73, 0.62, 1., 1.]));
+    shape.join(shape::create_blockchain_netlogo3([0.27, 0.4, 0.4, 1.]));
+    shape.join(shape::create_blockchain_netlogo4([0.27, 0.4, 0.4, 1.]));
     let net1_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net1_node);
 
@@ -92,8 +96,26 @@ pub async fn make(
     node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
     let mut shape = shape::create_blockchain_netlogo1([0.49, 0.57, 1., 1.]);
     shape.join(shape::create_blockchain_netlogo2([0.49, 0.57, 1., 1.]));
+    shape.join(shape::create_blockchain_netlogo3([0.49, 0.57, 1., 1.]));
+    shape.join(shape::create_blockchain_netlogo4([0.27, 0.4, 0.4, 1.]));
     let net2_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net2_node);
 
+    let node = create_vector_art("net3");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, NETSTATUS_ICON_SIZE / 2.).unwrap();
+    prop.set_f32(atom, Role::App, 1, NETSTATUS_ICON_SIZE / 2.).unwrap();
+    prop.set_expr(atom, Role::App, 2, expr::load_var("w")).unwrap();
+    prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
+    node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
+    node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
+    let mut shape = shape::create_blockchain_netlogo1([0., 0.94, 1., 1.]);
+    shape.join(shape::create_blockchain_netlogo2([0., 0.94, 1., 1.]));
+    shape.join(shape::create_blockchain_netlogo3([0., 0.94, 1., 1.]));
+    shape.join(shape::create_blockchain_netlogo4([0., 0.94, 1., 1.]));
+    let net3_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
+    netlayer_node.link(net3_node);
+
     netlayer_node
 }

+ 11 - 0
bin/app/src/main.rs

@@ -465,10 +465,12 @@ async fn load_plugins(
         let net0 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net0").unwrap();
         let net1 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net1").unwrap();
         let net2 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net2").unwrap();
+        let net3 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net3").unwrap();
 
         let net0_is_visible = PropertyBool::wrap(&net0, Role::App, "is_visible", 0).unwrap();
         let net1_is_visible = PropertyBool::wrap(&net1, Role::App, "is_visible", 0).unwrap();
         let net2_is_visible = PropertyBool::wrap(&net2, Role::App, "is_visible", 0).unwrap();
+        let net3_is_visible = PropertyBool::wrap(&net3, Role::App, "is_visible", 0).unwrap();
 
         while let Ok(data) = recvr.recv().await {
             let status: u8 = deserialize(&data).unwrap();
@@ -479,16 +481,25 @@ async fn load_plugins(
                     net0_is_visible.set(atom, false);
                     net1_is_visible.set(atom, true);
                     net2_is_visible.set(atom, false);
+                    net3_is_visible.set(atom, false);
                 },
                 2 => {
                     net0_is_visible.set(atom, false);
                     net1_is_visible.set(atom, false);
                     net2_is_visible.set(atom, true);
+                    net3_is_visible.set(atom, false);
+                },
+                3 => {
+                    net0_is_visible.set(atom, false);
+                    net1_is_visible.set(atom, false);
+                    net2_is_visible.set(atom, false);
+                    net3_is_visible.set(atom, true);
                 },
                 _ => {
                     net0_is_visible.set(atom, true);
                     net1_is_visible.set(atom, false);
                     net2_is_visible.set(atom, false);
+                    net3_is_visible.set(atom, false);
                 }
             }
         }

+ 33 - 5
bin/app/src/plugin/drk.rs

@@ -17,7 +17,7 @@
  */
 
 use darkfi::{
-    system::{StoppableTask, sleep},
+    system::{Publisher, PublisherPtr, StoppableTask, sleep},
     tx::Transaction,
     util::parse::encode_base10,
 };
@@ -125,6 +125,7 @@ pub struct DrkPlugin {
     node: SceneNodeWeak,
     sg_root: SceneNodePtr,
     tasks: OnceLock<Vec<smol::Task<()>>>,
+    scan_progress_pub: PublisherPtr<(u32, u32)>,
 
     drk: Arc<RwLock<Drk>>,
     build_tx_channel: smol::channel::Sender<BuildTxRequest>,
@@ -203,6 +204,7 @@ impl DrkPlugin {
             tasks: OnceLock::new(),
             drk: drk.into_ptr(),
             build_tx_channel: build_tx_tx,
+            scan_progress_pub: Publisher::new(),
         });
 
         let local_ex = smol::LocalExecutor::new();
@@ -634,6 +636,31 @@ impl DrkPlugin {
         let drk = self.drk.clone();
         let (shell_sender, shell_receiver) = unbounded();
         let ex_ = ex.clone();
+        let progress_sub = self.scan_progress_pub.clone().subscribe().await;
+
+        let scan_progress_task = local_ex.spawn(async move {
+            let mut first_height = None;
+            loop {
+                let (height, final_height) = progress_sub.receive().await;
+                if first_height.is_none() {
+                    first_height = Some(height);
+                }
+                let progress: f64 = match final_height-first_height.unwrap() {
+                    0 => 0.,
+                    _ => (height-first_height.unwrap()) as f64 / (final_height-first_height.unwrap()) as f64,
+                };
+                let status: u8 = if progress > 0.5 {
+                    2
+                } else {
+                    1
+                };
+                if let Some(node) = self2.node.upgrade() {
+                    let _ = node.trigger("connect", serialize(&status)).await;
+                }
+            }
+        });
+
+        let self2 = self.clone();
 
         // Task that handles the RPC subscription with retry logic
         let subscribe_task = local_ex.spawn(async move {
@@ -644,10 +671,11 @@ impl DrkPlugin {
                 let drk = drk.clone();
                 let endpoint = endpoint.clone();
                 let ex = ex_.clone();
+                let progress_pub = self2.scan_progress_pub.clone();
 
-                let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&1u8)).await;
+                let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&0u8)).await;
 
-                if let Err(e) = drk.read().await.scan_blocks(&mut vec![], Some(&shell_sender), &false).await {
+                if let Err(e) = drk.read().await.scan_blocks(&mut vec![], Some(&shell_sender), &false, Some(progress_pub)).await {
                     e!("Failed during drk scanning: {e}");
                     let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&0u8)).await;
 
@@ -657,7 +685,7 @@ impl DrkPlugin {
                     continue
                 }
 
-                let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&2u8)).await;
+                let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&3u8)).await;
 
                 match subscribe_blocks(&drk, subscribe_rpc_task, shell_sender.clone(), endpoint, &ex).await {
                     Ok(()) => {
@@ -691,7 +719,7 @@ impl DrkPlugin {
             }
         });
 
-        let mut all_tasks = vec![subscribe_task, subscribe_recv_task];
+        let mut all_tasks = vec![scan_progress_task, subscribe_task, subscribe_recv_task];
         all_tasks.extend(tasks);
         self.tasks.set(all_tasks).unwrap();
     }

Разница между файлами не показана из-за своего большого размера
+ 0 - 1959
bin/app/src/shape/blockchain_netlogo1.rs


Разница между файлами не показана из-за своего большого размера
+ 1959 - 5247
bin/app/src/shape/blockchain_netlogo2.rs


Разница между файлами не показана из-за своего большого размера
+ 2855 - 0
bin/app/src/shape/blockchain_netlogo3.rs


Разница между файлами не показана из-за своего большого размера
+ 2438 - 0
bin/app/src/shape/blockchain_netlogo4.rs


+ 4 - 0
bin/app/src/shape/mod.rs

@@ -45,6 +45,10 @@ mod blockchain_netlogo1;
 pub use blockchain_netlogo1::create_blockchain_netlogo1;
 mod blockchain_netlogo2;
 pub use blockchain_netlogo2::create_blockchain_netlogo2;
+mod blockchain_netlogo3;
+pub use blockchain_netlogo3::create_blockchain_netlogo3;
+mod blockchain_netlogo4;
+pub use blockchain_netlogo4::create_blockchain_netlogo4;
 
 //mod settings;
 //pub use settings::{create_right_border, create_settings};

Некоторые файлы не были показаны из-за большого количества измененных файлов