|
@@ -32,6 +32,7 @@ use crate::{
|
|
|
gfx::gfxtag,
|
|
gfx::gfxtag,
|
|
|
prop::{PropertyAtomicGuard, PropertyFloat32, Role},
|
|
prop::{PropertyAtomicGuard, PropertyFloat32, Role},
|
|
|
scene::{SceneNodePtr, Slot},
|
|
scene::{SceneNodePtr, Slot},
|
|
|
|
|
+ sfx,
|
|
|
shape,
|
|
shape,
|
|
|
ui::{emoji_picker, Button, Layer, Text, VectorArt, VectorShape, Video},
|
|
ui::{emoji_picker, Button, Layer, Text, VectorArt, VectorShape, Video},
|
|
|
util::i18n::I18nBabelFish,
|
|
util::i18n::I18nBabelFish,
|
|
@@ -423,6 +424,138 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
window.link(node);
|
|
window.link(node);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Navbar Settings Button
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ // Layer
|
|
|
|
|
+ let settingslayer_node = create_layer("settings_button_layer");
|
|
|
|
|
+ let prop = settingslayer_node.get_property("rect").unwrap();
|
|
|
|
|
+ let code = cc.compile("w - NETSTATUS_ICON_SIZE - SETTINGS_ICON_SIZE").unwrap();
|
|
|
|
|
+ prop.set_expr(atom, Role::App, 0, code).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 1, 0.).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 2, 1000.).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 3, 1000.).unwrap();
|
|
|
|
|
+ settingslayer_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
|
|
|
|
|
+ settingslayer_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
|
|
|
|
|
+ let settingslayer_node =
|
|
|
|
|
+ settingslayer_node.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
+ content.link(settingslayer_node.clone());
|
|
|
|
|
+
|
|
|
|
|
+ // Background
|
|
|
|
|
+ let node = create_vector_art("settings_btn_bg");
|
|
|
|
|
+ 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", true).unwrap();
|
|
|
|
|
+ node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
|
|
|
|
|
+ let shape = shape::create_settings([0., 0.94, 1., 1.]).scaled(20.);
|
|
|
|
|
+ let node =
|
|
|
|
|
+ node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
+ settingslayer_node.link(node);
|
|
|
|
|
+
|
|
|
|
|
+ // Button
|
|
|
|
|
+ let node = create_button("settings_btn");
|
|
|
|
|
+ node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
|
|
|
|
|
+ let prop = node.get_property("rect").unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 0, 0.).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 1, 0.).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 2, NETSTATUS_ICON_SIZE).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 3, NETSTATUS_ICON_SIZE).unwrap();
|
|
|
|
|
+
|
|
|
|
|
+ let sg_root = app.sg_root.clone();
|
|
|
|
|
+ let settings = move || {
|
|
|
|
|
+ info!(target: "app::chat", "clicked settings");
|
|
|
|
|
+ let atom = &mut PropertyAtomicGuard::new();
|
|
|
|
|
+
|
|
|
|
|
+ // Hide all relevant window children nodes
|
|
|
|
|
+ // Messy.
|
|
|
|
|
+ //
|
|
|
|
|
+ // Some suggestions:
|
|
|
|
|
+ // 1. Something closer to a router, that would be a accessible globally,
|
|
|
|
|
+ // which essentially holds a vector of references to SceneNodes
|
|
|
|
|
+ // representing the app navigation history.
|
|
|
|
|
+ // When the user changes the route, it would make invisible (or later remove
|
|
|
|
|
+ // elements from the tree for optimization purposes) the node of the last SceneNodes
|
|
|
|
|
+ // in the vector and all its children, recursively;
|
|
|
|
|
+ // and append a new SceneNode pointer, which is the new "route" chosen by the user,
|
|
|
|
|
+ // and draw it and its children recursively.
|
|
|
|
|
+ // Note that this would implicitly handle nested routes (like
|
|
|
|
|
+ // /window/somewhere1/view1 to /window/somewhere1/view2, if the last element of the
|
|
|
|
|
+ // router currently points to view1 and we call router.goto("./view2")).
|
|
|
|
|
+ //
|
|
|
|
|
+ // 2. Support of wildcard in lookups in .get_children() or another method, like this "*_chat_layer".
|
|
|
|
|
+ let windows = sg_root.lookup_node("/window/content/chat").unwrap().get_children();
|
|
|
|
|
+ let target_substrings = vec!["_chat_layer", "menu_layer"];
|
|
|
|
|
+ for node in windows.iter() {
|
|
|
|
|
+ if target_substrings.iter().any(|&s| node.name.contains(s)) {
|
|
|
|
|
+ if let Err(e) = node.set_property_bool(atom, Role::App, "is_visible", false) {
|
|
|
|
|
+ debug!("Failed to set property 'is_visible' on node: {:?}", e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Show settings
|
|
|
|
|
+ let settings_node = sg_root.lookup_node("/window/content/settings_layer").unwrap();
|
|
|
|
|
+ settings_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let (slot, recvr) = Slot::new("settings_clicked");
|
|
|
|
|
+ node.register("click", slot).unwrap();
|
|
|
|
|
+ let settings2 = settings.clone();
|
|
|
|
|
+ let listen_click = app.ex.spawn(async move {
|
|
|
|
|
+ while let Ok(_) = recvr.recv().await {
|
|
|
|
|
+ settings2();
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ app.tasks.lock().unwrap().push(listen_click);
|
|
|
|
|
+
|
|
|
|
|
+ let node = node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
+ settingslayer_node.link(node);
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ let emoji_meshes = emoji_picker::EmojiMeshes::new(app.renderer.clone(), EMOJI_PICKER_ICON_SIZE);
|
|
|
|
|
+
|
|
|
|
|
+ let emoji_meshes2 = emoji_meshes.clone();
|
|
|
|
|
+ let _ = std::thread::spawn(move || {
|
|
|
|
|
+ for i in (0..500).step_by(20) {
|
|
|
|
|
+ for j in i..(i + 20) {
|
|
|
|
|
+ emoji_meshes2.lock().get(j);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ let channels_tree = db.open_tree_default("channels").expect("cannot open channels tree");
|
|
|
|
|
+ let contacts_tree = db.open_tree_default("contacts").expect("cannot open contacts tree");
|
|
|
|
|
+
|
|
|
|
|
+ // Initialize default channels if tree is empty
|
|
|
|
|
+ if channels_tree.is_empty().unwrap() {
|
|
|
|
|
+ for channel_name in DEFAULT_CHANNELS {
|
|
|
|
|
+ let channel = Channel { name: channel_name.to_string(), secret: None };
|
|
|
|
|
+ let mut val = vec![];
|
|
|
|
|
+ channel.encode(&mut val).unwrap();
|
|
|
|
|
+ channels_tree.insert(channel_name.to_string().as_bytes(), &val).unwrap();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Seed the joined-channels file with defaults on first run.
|
|
|
|
|
+ ensure_joined_channels_seeded();
|
|
|
|
|
+
|
|
|
|
|
+ // Create chat container layer
|
|
|
|
|
+ let chat_layer = create_layer("chat");
|
|
|
|
|
+ let prop = chat_layer.get_property("rect").unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 0, 0.).unwrap();
|
|
|
|
|
+ prop.set_f32(atom, Role::App, 1, 0.).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();
|
|
|
|
|
+ chat_layer.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
|
|
|
|
|
+ chat_layer.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
|
|
|
|
|
+ let chat_layer = chat_layer
|
|
|
|
|
+ .setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
|
|
|
|
|
+ .await;
|
|
|
|
|
+ content.link(chat_layer.clone());
|
|
|
|
|
+
|
|
|
let netlayer_node = create_layer("netstatus_layer");
|
|
let netlayer_node = create_layer("netstatus_layer");
|
|
|
let prop = netlayer_node.get_property("rect").unwrap();
|
|
let prop = netlayer_node.get_property("rect").unwrap();
|
|
|
let code = cc.compile("w - NETSTATUS_ICON_SIZE").unwrap();
|
|
let code = cc.compile("w - NETSTATUS_ICON_SIZE").unwrap();
|
|
@@ -438,7 +571,7 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
let netlayer_node = netlayer_node
|
|
let netlayer_node = netlayer_node
|
|
|
.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
|
|
.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
|
|
|
.await;
|
|
.await;
|
|
|
- content.link(netlayer_node.clone());
|
|
|
|
|
|
|
+ chat_layer.link(netlayer_node.clone());
|
|
|
|
|
|
|
|
let node = create_vector_art("net0");
|
|
let node = create_vector_art("net0");
|
|
|
let prop = node.get_property("rect").unwrap();
|
|
let prop = node.get_property("rect").unwrap();
|
|
@@ -549,14 +682,16 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
while let Ok(_) = recvr.recv().await {
|
|
while let Ok(_) = recvr.recv().await {
|
|
|
i!("Reconnect button clicked");
|
|
i!("Reconnect button clicked");
|
|
|
|
|
|
|
|
- /*
|
|
|
|
|
// Toggle the overlay layer
|
|
// Toggle the overlay layer
|
|
|
- let overlay = sg_root.lookup_node("/window/content/netstatus_overlay").unwrap();
|
|
|
|
|
- let visible = !overlay.get_property_bool("is_visible").unwrap();
|
|
|
|
|
|
|
+ let overlay = sg_root.lookup_node("/window/content/chat/netstatus_overlay").unwrap();
|
|
|
|
|
+ let is_visible = overlay.get_property_bool("is_visible").unwrap();
|
|
|
|
|
+ if !is_visible {
|
|
|
|
|
+ sfx::play_cloak();
|
|
|
|
|
+ }
|
|
|
let atom = &mut redraw.make_guard(gfxtag!("netstatus overlay toggle"));
|
|
let atom = &mut redraw.make_guard(gfxtag!("netstatus overlay toggle"));
|
|
|
- overlay.set_property_bool(atom, Role::App, "is_visible", visible).unwrap();
|
|
|
|
|
- */
|
|
|
|
|
|
|
+ overlay.set_property_bool(atom, Role::App, "is_visible", !is_visible).unwrap();
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
// Show netstat-klik icon
|
|
// Show netstat-klik icon
|
|
|
let netstat_klik =
|
|
let netstat_klik =
|
|
|
sg_root.lookup_node("/window/content/netstatus_layer/netstat_klik").unwrap();
|
|
sg_root.lookup_node("/window/content/netstatus_layer/netstat_klik").unwrap();
|
|
@@ -591,6 +726,7 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
e!("Failed to hide netstat_klik: {e}");
|
|
e!("Failed to hide netstat_klik: {e}");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ */
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
app.tasks.lock().unwrap().push(reconnect_task);
|
|
app.tasks.lock().unwrap().push(reconnect_task);
|
|
@@ -614,7 +750,7 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
let overlay_node = overlay_node
|
|
let overlay_node = overlay_node
|
|
|
.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
|
|
.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
|
|
|
.await;
|
|
.await;
|
|
|
- content.link(overlay_node.clone());
|
|
|
|
|
|
|
+ chat_layer.link(overlay_node.clone());
|
|
|
|
|
|
|
|
// Placeholder single-color background filling the whole overlay
|
|
// Placeholder single-color background filling the whole overlay
|
|
|
let node = create_vector_art("overlay_bg");
|
|
let node = create_vector_art("overlay_bg");
|
|
@@ -714,127 +850,9 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
overlay_node.link(node);
|
|
overlay_node.link(node);
|
|
|
|
|
|
|
|
- // Navbar Settings Button
|
|
|
|
|
-
|
|
|
|
|
- /*
|
|
|
|
|
- // Layer
|
|
|
|
|
- let settingslayer_node = create_layer("settings_button_layer");
|
|
|
|
|
- let prop = settingslayer_node.get_property("rect").unwrap();
|
|
|
|
|
- let code = cc.compile("w - NETSTATUS_ICON_SIZE - SETTINGS_ICON_SIZE").unwrap();
|
|
|
|
|
- prop.set_expr(atom, Role::App, 0, code).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 1, 0.).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 2, 1000.).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 3, 1000.).unwrap();
|
|
|
|
|
- settingslayer_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
|
|
|
|
|
- settingslayer_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
|
|
|
|
|
- let settingslayer_node =
|
|
|
|
|
- settingslayer_node.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
- content.link(settingslayer_node.clone());
|
|
|
|
|
-
|
|
|
|
|
- // Background
|
|
|
|
|
- let node = create_vector_art("settings_btn_bg");
|
|
|
|
|
- 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", true).unwrap();
|
|
|
|
|
- node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
|
|
|
|
|
- let shape = shape::create_settings([0., 0.94, 1., 1.]).scaled(20.);
|
|
|
|
|
- let node =
|
|
|
|
|
- node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
- settingslayer_node.link(node);
|
|
|
|
|
-
|
|
|
|
|
- // Button
|
|
|
|
|
- let node = create_button("settings_btn");
|
|
|
|
|
- node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
|
|
|
|
|
- let prop = node.get_property("rect").unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 0, 0.).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 1, 0.).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 2, NETSTATUS_ICON_SIZE).unwrap();
|
|
|
|
|
- prop.set_f32(atom, Role::App, 3, NETSTATUS_ICON_SIZE).unwrap();
|
|
|
|
|
-
|
|
|
|
|
- let sg_root = app.sg_root.clone();
|
|
|
|
|
- let settings = move || {
|
|
|
|
|
- info!(target: "app::chat", "clicked settings");
|
|
|
|
|
- let atom = &mut PropertyAtomicGuard::new();
|
|
|
|
|
-
|
|
|
|
|
- // Hide all relevant window children nodes
|
|
|
|
|
- // Messy.
|
|
|
|
|
- //
|
|
|
|
|
- // Some suggestions:
|
|
|
|
|
- // 1. Something closer to a router, that would be a accessible globally,
|
|
|
|
|
- // which essentially holds a vector of references to SceneNodes
|
|
|
|
|
- // representing the app navigation history.
|
|
|
|
|
- // When the user changes the route, it would make invisible (or later remove
|
|
|
|
|
- // elements from the tree for optimization purposes) the node of the last SceneNodes
|
|
|
|
|
- // in the vector and all its children, recursively;
|
|
|
|
|
- // and append a new SceneNode pointer, which is the new "route" chosen by the user,
|
|
|
|
|
- // and draw it and its children recursively.
|
|
|
|
|
- // Note that this would implicitly handle nested routes (like
|
|
|
|
|
- // /window/somewhere1/view1 to /window/somewhere1/view2, if the last element of the
|
|
|
|
|
- // router currently points to view1 and we call router.goto("./view2")).
|
|
|
|
|
- //
|
|
|
|
|
- // 2. Support of wildcard in lookups in .get_children() or another method, like this "*_chat_layer".
|
|
|
|
|
- let windows = sg_root.lookup_node("/window/content/chat").unwrap().get_children();
|
|
|
|
|
- let target_substrings = vec!["_chat_layer", "menu_layer"];
|
|
|
|
|
- for node in windows.iter() {
|
|
|
|
|
- if target_substrings.iter().any(|&s| node.name.contains(s)) {
|
|
|
|
|
- if let Err(e) = node.set_property_bool(atom, Role::App, "is_visible", false) {
|
|
|
|
|
- debug!("Failed to set property 'is_visible' on node: {:?}", e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // Show settings
|
|
|
|
|
- let settings_node = sg_root.lookup_node("/window/content/settings_layer").unwrap();
|
|
|
|
|
- settings_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- let (slot, recvr) = Slot::new("settings_clicked");
|
|
|
|
|
- node.register("click", slot).unwrap();
|
|
|
|
|
- let settings2 = settings.clone();
|
|
|
|
|
- let listen_click = app.ex.spawn(async move {
|
|
|
|
|
- while let Ok(_) = recvr.recv().await {
|
|
|
|
|
- settings2();
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- app.tasks.lock().unwrap().push(listen_click);
|
|
|
|
|
-
|
|
|
|
|
- let node = node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
|
|
|
|
|
- settingslayer_node.link(node);
|
|
|
|
|
- */
|
|
|
|
|
-
|
|
|
|
|
- let emoji_meshes = emoji_picker::EmojiMeshes::new(app.renderer.clone(), EMOJI_PICKER_ICON_SIZE);
|
|
|
|
|
-
|
|
|
|
|
- let emoji_meshes2 = emoji_meshes.clone();
|
|
|
|
|
- let _ = std::thread::spawn(move || {
|
|
|
|
|
- for i in (0..500).step_by(20) {
|
|
|
|
|
- for j in i..(i + 20) {
|
|
|
|
|
- emoji_meshes2.lock().get(j);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- let channels_tree = db.open_tree_default("channels").expect("cannot open channels tree");
|
|
|
|
|
- let contacts_tree = db.open_tree_default("contacts").expect("cannot open contacts tree");
|
|
|
|
|
-
|
|
|
|
|
- // Initialize default channels if tree is empty
|
|
|
|
|
- if channels_tree.is_empty().unwrap() {
|
|
|
|
|
- for channel_name in DEFAULT_CHANNELS {
|
|
|
|
|
- let channel = Channel { name: channel_name.to_string(), secret: None };
|
|
|
|
|
- let mut val = vec![];
|
|
|
|
|
- channel.encode(&mut val).unwrap();
|
|
|
|
|
- channels_tree.insert(channel_name.to_string().as_bytes(), &val).unwrap();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // Seed the joined-channels file with defaults on first run.
|
|
|
|
|
- ensure_joined_channels_seeded();
|
|
|
|
|
-
|
|
|
|
|
menu::make(
|
|
menu::make(
|
|
|
app,
|
|
app,
|
|
|
- content.clone(),
|
|
|
|
|
|
|
+ chat_layer.clone(),
|
|
|
i18n_fish,
|
|
i18n_fish,
|
|
|
channels_tree.clone(),
|
|
channels_tree.clone(),
|
|
|
contacts_tree.clone(),
|
|
contacts_tree.clone(),
|
|
@@ -842,7 +860,6 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
emoji_meshes.clone(),
|
|
emoji_meshes.clone(),
|
|
|
)
|
|
)
|
|
|
.await;
|
|
.await;
|
|
|
- let chat_layer = app.sg_root.lookup_node("/window/content/chat").unwrap();
|
|
|
|
|
|
|
|
|
|
// Create chat layers only for joined channels/contacts, in joined order.
|
|
// Create chat layers only for joined channels/contacts, in joined order.
|
|
|
for name in read_joined_channels() {
|
|
for name in read_joined_channels() {
|
|
@@ -870,11 +887,11 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
|
|
|
)
|
|
)
|
|
|
.await;
|
|
.await;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
wallet::make(app, content.clone(), i18n_fish).await;
|
|
wallet::make(app, content.clone(), i18n_fish).await;
|
|
|
|
|
|
|
|
// Setup wallet button after wallet layer is created
|
|
// Setup wallet button after wallet layer is created
|
|
|
- let menu_layer = app.sg_root.lookup_node("/window/content/chat/menu_layer").unwrap();
|
|
|
|
|
- menu::setup_wallet_button(app, menu_layer, i18n_fish).await;
|
|
|
|
|
|
|
+ menu::setup_wallet_button(app, chat_layer, i18n_fish).await;
|
|
|
|
|
|
|
|
// @@@ Debug stuff @@@
|
|
// @@@ Debug stuff @@@
|
|
|
//let chatview_node = app.sg_root.lookup_node("/window/content/chat/dev_chat_layer").unwrap();
|
|
//let chatview_node = app.sg_root.lookup_node("/window/content/chat/dev_chat_layer").unwrap();
|