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

app: add WIP main menu with theme switching buttons

darkfi 9 часов назад
Родитель
Сommit
f8557e2201

+ 2 - 2
bin/app/src/app/schema/chat.rs

@@ -141,7 +141,7 @@ mod ui_consts {
 mod ui_consts {
     // Chat UI
     pub const CHANNEL_LABEL_X: f32 = 100.;
-    pub const CHANNEL_LABEL_Y: f32 = 18.;
+    pub const CHANNEL_LABEL_Y: f32 = 14.;
     pub const BACKARROW_SCALE: f32 = 15.;
     pub const BACKARROW_X: f32 = 38.;
     pub const BACKARROW_Y: f32 = 30.;
@@ -448,7 +448,7 @@ pub async fn make(
     prop.set_default_expr(2, expr::load_var("w")).unwrap();
     prop.set_default_f32(3, CHATEDIT_HEIGHT).unwrap();
     node.get_property("font_size").unwrap().set_default_f32(0, FONTSIZE).unwrap();
-    node.set_property_str(atom, Role::App, "text", "").unwrap();
+    //node.set_property_str(atom, Role::App, "text", "").unwrap();
     let prop = node.get_property("text_color").unwrap();
     prop.set_default_f32_multi(&[1., 1., 1., 1.]).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();

+ 5 - 12
bin/app/src/app/schema/menu/mod.rs

@@ -30,7 +30,7 @@ use crate::{
     db::AppDbPtr,
     expr,
     gfx::gfxtag,
-    mesh::{COLOR_BLUE, COLOR_CYAN},
+    mesh::COLOR_CYAN,
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     sfx, shape,
@@ -90,7 +90,7 @@ mod ui_consts {
     pub const CHANNEL_LABEL_FONTSIZE: f32 = 18.;
     pub const BACKARROW_BG_W: f32 = 80.;
     pub const CHANNELS_TITLE_X: f32 = BACKARROW_BG_W + CHANNEL_LABEL_X;
-    pub const CHANNELS_TITLE_Y: f32 = 14.;
+    pub const CHANNELS_TITLE_Y: f32 = 18.;
     pub const MENU_SEP_SIZE: f32 = 1.;
     pub const MENU_HANDLE_PAD: f32 = 100.;
     pub const MENU_FADE: f32 = 600.;
@@ -300,20 +300,13 @@ pub async fn make(
     // so it is only shown on the main chat screen.
     let node = create_vector_art("main_menu_btn_bg");
     let prop = node.get_property("rect").unwrap();
-    prop.set_default_f32(0, 0.).unwrap();
-    prop.set_default_f32(1, 0.).unwrap();
+    prop.set_default_f32(0, BACKARROW_BG_W / 2.).unwrap();
+    prop.set_default_f32(1, CHANNEL_HEADER_HEIGHT / 2.).unwrap();
     prop.set_default_f32(2, BACKARROW_BG_W).unwrap();
     prop.set_default_f32(3, CHANNEL_HEADER_HEIGHT).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
-    let mut shape = VectorShape::new();
-    shape.add_filled_box(
-        expr::const_f32(0.),
-        expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        COLOR_BLUE,
-    );
+    let shape = shape::create_darkfi_logo([1., 1., 1., 1.]).scaled(20.);
     node.set_property_shape(atom, Role::App, "shape", shape).unwrap();
     let node =
         node.setup(|me| VectorArt::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;

+ 139 - 21
bin/app/src/app/schema/mod.rs

@@ -30,7 +30,7 @@ use crate::{
     db::AppDbPtr,
     expr::{self, Compiler},
     gfx::gfxtag,
-    mesh::COLOR_GREEN,
+    mesh::rgba,
     prop::{PropertyAtomicGuard, PropertyEnum, PropertyFloat32, PropertyStr, Role},
     scene::{SceneNodePtr, Slot},
     sfx, shape,
@@ -316,6 +316,23 @@ pub async fn make(
         .await;
     content.link(main_menu_layer.clone());
 
+    // Input capture: a button covering the entire layer at the lowest
+    // priority. Interactive menu widgets above it swallow input first;
+    // anything else lands here so it cannot fall through the overlay to
+    // the screens behind it.
+    let node = create_button("input_capture_btn");
+    node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
+    node.set_property_u32(atom, Role::App, "priority", 0).unwrap();
+    let prop = node.get_property("rect").unwrap();
+    prop.set_default_f32(0, 0.).unwrap();
+    prop.set_default_f32(1, 0.).unwrap();
+    prop.set_default_expr(2, expr::load_var("w")).unwrap();
+    prop.set_default_expr(3, expr::load_var("h")).unwrap();
+    let node =
+        node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    main_menu_layer.link(node);
+
     // Menu box: starts below the title bar, fills half the screen width
     // and the total screen height. Blue placeholder fill.
     let node = create_vector_art("menu_box");
@@ -332,61 +349,162 @@ pub async fn make(
         expr::const_f32(0.),
         expr::load_var("w"),
         expr::load_var("h"),
-        [0.2, 0.2, 0.2, 0.6],
+        [0., 0., 0., 1.],
     );
     node.set_property_shape(atom, Role::App, "shape", shape).unwrap();
     let node =
         node.setup(|me| VectorArt::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     main_menu_layer.link(node);
 
+    let node = create_text("theme_txt_label");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_default_f32(0, 0.).unwrap();
+    prop.set_default_f32(1, 0.).unwrap();
+    prop.set_default_f32(2, 1000.).unwrap();
+    prop.set_default_f32(3, 1000.).unwrap();
+    node.get_property("font_size").unwrap().set_default_f32(0, 40.).unwrap();
+    node.set_property_str(atom, Role::App, "text", "THEME").unwrap();
+    let prop = node.get_property("text_color").unwrap();
+    prop.set_default_f32_multi(&[1., 1., 1., 1.]).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
+
+    let label_node = node
+        .setup(|me| {
+            Text::new(
+                me,
+                window_scale.clone(),
+                app.renderer.clone(),
+                i18n_fish.clone(),
+                app.redraw_trigger.clone(),
+            )
+        })
+        .await;
+    main_menu_layer.link(label_node.clone());
+
+    let node = create_text("curr_theme_label");
+    let prop = node.get_property("rect").unwrap();
+    let code = cc.compile("w / 2").unwrap();
+    prop.set_default_expr(0, code).unwrap();
+    prop.set_default_f32(1, 0.).unwrap();
+    prop.set_default_f32(2, 1000.).unwrap();
+    prop.set_default_f32(3, 1000.).unwrap();
+    node.get_property("font_size").unwrap().set_default_f32(0, 40.).unwrap();
+    node.set_property_str(atom, Role::App, "text", "THEME").unwrap();
+    let prop = node.get_property("text_color").unwrap();
+    prop.set_default_f32_multi(&[1., 1., 1., 1.]).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
+
+    let node = node
+        .setup(|me| {
+            Text::new(
+                me,
+                window_scale.clone(),
+                app.renderer.clone(),
+                i18n_fish.clone(),
+                app.redraw_trigger.clone(),
+            )
+        })
+        .await;
+    let theme_label = PropertyStr::wrap(&node, Role::App, "text", 0).unwrap();
+    main_menu_layer.link(node);
+
+    // PADDING: 40
+    // BTN_H: 120
+    // BTN_GAP: 10
+
     // Switch theme button (green bg). Toggles /setting/theme between
     // the scifi and minimal themes; the engine-owned watcher applies
     // the live switch.
-    let node = create_vector_art("switch_theme_btn_bg");
+    let node = create_vector_art("theme_btn_bg");
     let prop = node.get_property("rect").unwrap();
-    prop.set_default_f32(0, MAIN_MENU_PADDING).unwrap();
-    prop.set_default_f32(1, MAIN_MENU_HEADER_HEIGHT + MAIN_MENU_PADDING).unwrap();
-    let code = cc.compile("w / 2 - 2 * MAIN_MENU_PADDING").unwrap();
-    prop.set_default_expr(2, code).unwrap();
-    prop.set_default_f32(3, SWITCH_THEME_BTN_H).unwrap();
+    let code = cc.compile("w - 40 - 120 - 10 - 120").unwrap();
+    prop.set_default_expr(0, code).unwrap();
+    prop.set_default_f32(1, 40.).unwrap();
+    prop.set_default_f32(2, 120.).unwrap();
+    prop.set_default_f32(3, 120.).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
     let mut shape = VectorShape::new();
-    shape.add_filled_box(
+    shape.add_outline(
         expr::const_f32(0.),
         expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        COLOR_GREEN,
+        expr::const_f32(120.),
+        expr::const_f32(120.),
+        2.,
+        rgba!(0x14AEB8ff),
+    );
+    shape.add_outline(
+        expr::const_f32(120. + 10.),
+        expr::const_f32(0.),
+        expr::const_f32(2. * 120. + 10.),
+        expr::const_f32(120.),
+        2.,
+        rgba!(0x14AEB8ff),
     );
     node.set_property_shape(atom, Role::App, "shape", shape).unwrap();
     let node =
         node.setup(|me| VectorArt::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     main_menu_layer.link(node);
 
-    let node = create_button("switch_theme_btn");
+    let node = create_button("prev_theme_btn");
     node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    node.set_property_u32(atom, Role::App, "priority", 1).unwrap();
     let prop = node.get_property("rect").unwrap();
-    prop.set_default_f32(0, MAIN_MENU_PADDING).unwrap();
-    prop.set_default_f32(1, MAIN_MENU_HEADER_HEIGHT + MAIN_MENU_PADDING).unwrap();
-    let code = cc.compile("w / 2 - 2 * MAIN_MENU_PADDING").unwrap();
-    prop.set_default_expr(2, code).unwrap();
-    prop.set_default_f32(3, SWITCH_THEME_BTN_H).unwrap();
+    let code = cc.compile("w - 40 - 120 - 10 - 120").unwrap();
+    prop.set_default_expr(0, code).unwrap();
+    prop.set_default_f32(1, 40.).unwrap();
+    prop.set_default_f32(2, 120.).unwrap();
+    prop.set_default_f32(3, 120.).unwrap();
+
+    let sg_root = app.sg_root.clone();
+    let redraw = app.redraw_trigger.clone();
+    let ex = app.ex.clone();
+    let (slot, recvr) = Slot::new("prev_theme_clicked");
+    node.register("click", slot).unwrap();
+    let theme_label2 = theme_label.clone();
+    let listen_click = ex.spawn(async move {
+        while recvr.recv().await.is_ok() {
+            i!("clicked prev theme");
+            let setting_node = sg_root.lookup_node("/setting").unwrap();
+            let theme_prop = PropertyEnum::wrap(&setting_node, Role::User, "theme", 0).unwrap();
+            let prev = if theme_prop.get() == "scifi" { "minimal" } else { "scifi" };
+            let atom = &mut redraw.make_guard(gfxtag!("prev theme"));
+            theme_prop.set(atom, prev);
+            theme_label2.set(atom, prev);
+        }
+    });
+    app.tasks.lock().push(listen_click);
+
+    let node =
+        node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    main_menu_layer.link(node);
+
+    let node = create_button("next_theme_btn");
+    node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    node.set_property_u32(atom, Role::App, "priority", 1).unwrap();
+    let prop = node.get_property("rect").unwrap();
+    let code = cc.compile("w - 40 - 120").unwrap();
+    prop.set_default_expr(0, code).unwrap();
+    prop.set_default_f32(1, 40.).unwrap();
+    prop.set_default_f32(2, 120.).unwrap();
+    prop.set_default_f32(3, 120.).unwrap();
 
     let sg_root = app.sg_root.clone();
     let redraw = app.redraw_trigger.clone();
     let ex = app.ex.clone();
-    let (slot, recvr) = Slot::new("switch_theme_clicked");
+    let (slot, recvr) = Slot::new("next_theme_clicked");
     node.register("click", slot).unwrap();
     let listen_click = ex.spawn(async move {
         while recvr.recv().await.is_ok() {
-            i!("clicked switch theme");
+            i!("clicked next theme");
             let setting_node = sg_root.lookup_node("/setting").unwrap();
             let theme_prop = PropertyEnum::wrap(&setting_node, Role::User, "theme", 0).unwrap();
             let next = if theme_prop.get() == "scifi" { "minimal" } else { "scifi" };
-            let atom = &mut redraw.make_guard(gfxtag!("switch theme"));
+            let atom = &mut redraw.make_guard(gfxtag!("next theme"));
             theme_prop.set(atom, next);
+            theme_label.set(atom, next);
         }
     });
     app.tasks.lock().push(listen_click);

+ 4 - 11
bin/app/src/app/schema/wallet/main.rs

@@ -25,7 +25,7 @@ use crate::{
     },
     expr,
     gfx::{gfxtag, Point},
-    mesh::{COLOR_BLUE, COLOR_CYAN, COLOR_TEAL},
+    mesh::{COLOR_CYAN, COLOR_TEAL},
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
@@ -225,20 +225,13 @@ pub async fn make(
     // button takes on the wallet subscreens.
     let node = create_vector_art("main_menu_btn_bg");
     let prop = node.get_property("rect").unwrap();
-    prop.set_default_f32(0, 0.).unwrap();
-    prop.set_default_f32(1, 0.).unwrap();
+    prop.set_default_f32(0, BACKARROW_BG_W / 2.).unwrap();
+    prop.set_default_f32(1, HEADER_HEIGHT / 2.).unwrap();
     prop.set_default_f32(2, BACKARROW_BG_W).unwrap();
     prop.set_default_f32(3, HEADER_HEIGHT).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
-    let mut shape = VectorShape::new();
-    shape.add_filled_box(
-        expr::const_f32(0.),
-        expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        COLOR_BLUE,
-    );
+    let shape = shape::create_darkfi_logo([1., 1., 1., 1.]).scaled(20.);
     node.set_property_shape(atom, Role::App, "shape", shape).unwrap();
     let node =
         node.setup(|me| VectorArt::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;

+ 145 - 0
bin/app/src/shape/darkfi_logo.rs

@@ -0,0 +1,145 @@
+/* This file is part of DarkFi (https://dark.fi)
+ *
+ * Copyright (C) 2020-2026 Dyne.org foundation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
+pub fn create_darkfi_logo(color: Color) -> VectorShape {
+    VectorShape {
+        verts: vec![
+            ShapeVertex::from_xy(0.0, -0.374527, color),
+            ShapeVertex::from_xy(0.019118, -0.372644, color),
+            ShapeVertex::from_xy(0.037501, -0.367068, color),
+            ShapeVertex::from_xy(0.054444, -0.358012, color),
+            ShapeVertex::from_xy(0.069294, -0.345825, color),
+            ShapeVertex::from_xy(0.081481, -0.330975, color),
+            ShapeVertex::from_xy(0.090537, -0.314033, color),
+            ShapeVertex::from_xy(0.096113, -0.295649, color),
+            ShapeVertex::from_xy(0.097996, -0.276531, color),
+            ShapeVertex::from_xy(0.096113, -0.257413, color),
+            ShapeVertex::from_xy(0.090537, -0.23903, color),
+            ShapeVertex::from_xy(0.081481, -0.222088, color),
+            ShapeVertex::from_xy(0.069294, -0.207238, color),
+            ShapeVertex::from_xy(0.054444, -0.195051, color),
+            ShapeVertex::from_xy(0.037501, -0.185995, color),
+            ShapeVertex::from_xy(0.019118, -0.180418, color),
+            ShapeVertex::from_xy(0.0, -0.178535, color),
+            ShapeVertex::from_xy(-0.019118, -0.180418, color),
+            ShapeVertex::from_xy(-0.037501, -0.185995, color),
+            ShapeVertex::from_xy(-0.054444, -0.195051, color),
+            ShapeVertex::from_xy(-0.069294, -0.207238, color),
+            ShapeVertex::from_xy(-0.081481, -0.222088, color),
+            ShapeVertex::from_xy(-0.090537, -0.23903, color),
+            ShapeVertex::from_xy(-0.096113, -0.257413, color),
+            ShapeVertex::from_xy(-0.097996, -0.276531, color),
+            ShapeVertex::from_xy(-0.096113, -0.295649, color),
+            ShapeVertex::from_xy(-0.090537, -0.314033, color),
+            ShapeVertex::from_xy(-0.081481, -0.330975, color),
+            ShapeVertex::from_xy(-0.069294, -0.345825, color),
+            ShapeVertex::from_xy(-0.054444, -0.358012, color),
+            ShapeVertex::from_xy(-0.037501, -0.367068, color),
+            ShapeVertex::from_xy(-0.019118, -0.372644, color),
+            ShapeVertex::from_xy(-0.0, -0.492595, color),
+            ShapeVertex::from_xy(0.042152, -0.488444, color),
+            ShapeVertex::from_xy(0.082684, -0.476149, color),
+            ShapeVertex::from_xy(0.120039, -0.456182, color),
+            ShapeVertex::from_xy(0.15278, -0.429312, color),
+            ShapeVertex::from_xy(0.179651, -0.39657, color),
+            ShapeVertex::from_xy(0.199617, -0.359215, color),
+            ShapeVertex::from_xy(0.211912, -0.318683, color),
+            ShapeVertex::from_xy(0.216064, -0.276531, color),
+            ShapeVertex::from_xy(0.211912, -0.234379, color),
+            ShapeVertex::from_xy(0.199617, -0.193847, color),
+            ShapeVertex::from_xy(0.179651, -0.156493, color),
+            ShapeVertex::from_xy(0.15278, -0.123751, color),
+            ShapeVertex::from_xy(0.120039, -0.096881, color),
+            ShapeVertex::from_xy(0.082684, -0.076914, color),
+            ShapeVertex::from_xy(0.042152, -0.064619, color),
+            ShapeVertex::from_xy(-0.0, -0.060467, color),
+            ShapeVertex::from_xy(-0.042152, -0.064619, color),
+            ShapeVertex::from_xy(-0.082684, -0.076914, color),
+            ShapeVertex::from_xy(-0.120039, -0.096881, color),
+            ShapeVertex::from_xy(-0.15278, -0.123751, color),
+            ShapeVertex::from_xy(-0.179651, -0.156493, color),
+            ShapeVertex::from_xy(-0.199617, -0.193847, color),
+            ShapeVertex::from_xy(-0.211912, -0.234379, color),
+            ShapeVertex::from_xy(-0.216064, -0.276531, color),
+            ShapeVertex::from_xy(-0.211912, -0.318683, color),
+            ShapeVertex::from_xy(-0.199617, -0.359215, color),
+            ShapeVertex::from_xy(-0.179651, -0.39657, color),
+            ShapeVertex::from_xy(-0.15278, -0.429312, color),
+            ShapeVertex::from_xy(-0.120039, -0.456182, color),
+            ShapeVertex::from_xy(-0.082684, -0.476149, color),
+            ShapeVertex::from_xy(-0.042152, -0.488444, color),
+            ShapeVertex::from_xy(0.0, 0.863409, color),
+            ShapeVertex::from_xy(-1.0, -0.863196, color),
+            ShapeVertex::from_xy(1.0, -0.863196, color),
+            ShapeVertex::from_xy(-0.441695, -0.276531, color),
+            ShapeVertex::from_xy(-0.391302, -0.350744, color),
+            ShapeVertex::from_xy(-0.403298, -0.217013, color),
+            ShapeVertex::from_xy(-0.403298, -0.33605, color),
+            ShapeVertex::from_xy(-0.356577, -0.159782, color),
+            ShapeVertex::from_xy(-0.356577, -0.393281, color),
+            ShapeVertex::from_xy(-0.306856, -0.107038, color),
+            ShapeVertex::from_xy(-0.306856, -0.446025, color),
+            ShapeVertex::from_xy(-0.189599, -0.022866, color),
+            ShapeVertex::from_xy(-0.189599, -0.530196, color),
+            ShapeVertex::from_xy(-0.059518, 0.022687, color),
+            ShapeVertex::from_xy(-0.059518, -0.57575, color),
+            ShapeVertex::from_xy(-0.131092, 0.005326, color),
+            ShapeVertex::from_xy(-0.131092, -0.558389, color),
+            ShapeVertex::from_xy(-0.252187, -0.060807, color),
+            ShapeVertex::from_xy(-0.252187, -0.492256, color),
+            ShapeVertex::from_xy(0.059518, 0.022687, color),
+            ShapeVertex::from_xy(0.059518, -0.57575, color),
+            ShapeVertex::from_xy(0.189599, -0.022866, color),
+            ShapeVertex::from_xy(0.189599, -0.530196, color),
+            ShapeVertex::from_xy(0.252187, -0.060807, color),
+            ShapeVertex::from_xy(0.131092, 0.005326, color),
+            ShapeVertex::from_xy(0.131092, -0.558389, color),
+            ShapeVertex::from_xy(0.306856, -0.107038, color),
+            ShapeVertex::from_xy(0.306856, -0.446025, color),
+            ShapeVertex::from_xy(0.441695, -0.276531, color),
+            ShapeVertex::from_xy(0.403298, -0.33605, color),
+            ShapeVertex::from_xy(0.403298, -0.217013, color),
+            ShapeVertex::from_xy(0.368573, -0.378586, color),
+            ShapeVertex::from_xy(0.356577, -0.393281, color),
+            ShapeVertex::from_xy(0.356577, -0.159782, color),
+            ShapeVertex::from_xy(0.252187, -0.492256, color),
+            ShapeVertex::from_xy(-0.0, -0.581612, color),
+            ShapeVertex::from_xy(-0.0, 0.028549, color),
+        ],
+        indices: vec![
+            8, 41, 9, 22, 55, 23, 9, 42, 10, 24, 55, 56, 10, 43, 11, 24, 57, 25, 11, 44, 12, 25,
+            58, 26, 12, 45, 13, 26, 59, 27, 13, 46, 14, 0, 33, 1, 27, 60, 28, 14, 47, 15, 1, 34, 2,
+            28, 61, 29, 15, 48, 16, 2, 35, 3, 30, 61, 62, 16, 49, 17, 3, 36, 4, 30, 63, 31, 17, 50,
+            18, 4, 37, 5, 31, 32, 0, 18, 51, 19, 5, 38, 6, 20, 51, 52, 6, 39, 7, 20, 53, 21, 7, 40,
+            8, 22, 53, 54, 8, 40, 41, 22, 54, 55, 9, 41, 42, 24, 23, 55, 10, 42, 43, 24, 56, 57,
+            11, 43, 44, 25, 57, 58, 12, 44, 45, 26, 58, 59, 13, 45, 46, 0, 32, 33, 27, 59, 60, 14,
+            46, 47, 1, 33, 34, 28, 60, 61, 15, 47, 48, 2, 34, 35, 30, 29, 61, 16, 48, 49, 3, 35,
+            36, 30, 62, 63, 17, 49, 50, 4, 36, 37, 31, 63, 32, 18, 50, 51, 5, 37, 38, 20, 19, 51,
+            6, 38, 39, 20, 52, 53, 7, 39, 40, 22, 21, 53, 65, 78, 99, 64, 100, 77, 96, 95, 66, 65,
+            68, 72, 65, 72, 74, 91, 96, 66, 98, 91, 66, 65, 74, 82, 65, 82, 76, 86, 98, 66, 89, 86,
+            66, 65, 76, 80, 65, 80, 78, 89, 66, 84, 66, 65, 99, 84, 66, 99, 70, 68, 65, 66, 95, 93,
+            66, 93, 92, 67, 70, 65, 69, 67, 65, 64, 66, 94, 66, 92, 94, 69, 65, 64, 71, 69, 64, 64,
+            94, 97, 64, 97, 90, 73, 71, 64, 81, 73, 64, 64, 90, 87, 64, 87, 85, 75, 81, 64, 79, 75,
+            64, 64, 85, 88, 64, 88, 83, 77, 79, 64, 64, 83, 100,
+        ],
+    }
+}

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

@@ -22,6 +22,9 @@ pub use back_arrow::create_back_arrow;
 mod close;
 pub use close::create_close_icon;
 
+mod darkfi_logo;
+pub use darkfi_logo::create_darkfi_logo;
+
 mod send_arrow;
 pub use send_arrow::create_send_arrow;