Skip to content

Commit

Permalink
app: settings manager wip
Browse files Browse the repository at this point in the history
  • Loading branch information
darkfi committed Feb 5, 2025
1 parent bfda6fc commit 345f9cb
Show file tree
Hide file tree
Showing 17 changed files with 1,408 additions and 10 deletions.
26 changes: 26 additions & 0 deletions bin/app/data/confirm.obj
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Blender 4.0.2
# www.blender.org
mtllib confirm.mtl
o Plane
v -0.520000 0.000000 0.600000
v -0.520000 0.000000 -0.600000
v 0.500000 0.000000 0.000000
v -1.050000 0.000000 1.500000
v -1.050000 0.000000 -1.500000
v 1.500000 0.000000 0.000000
v -0.880000 0.000000 1.200000
v -0.880000 0.000000 -1.200000
v 1.160000 0.000000 0.000000
vn -0.0000 1.0000 -0.0000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
s 0
f 1/1/1 3/2/1 2/3/1
f 6/4/1 7/4/1 4/4/1
f 6/4/1 8/4/1 9/4/1
f 4/4/1 8/4/1 5/4/1
f 6/4/1 9/4/1 7/4/1
f 6/4/1 5/4/1 8/4/1
f 4/4/1 7/4/1 8/4/1
126 changes: 126 additions & 0 deletions bin/app/data/settings.obj
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# Blender 4.0.2
# www.blender.org
mtllib settings.mtl
o Plane.006
v -0.282843 0.000000 0.000000
v 0.000000 0.000000 0.282843
v -0.000000 0.000000 -0.282843
v 0.282843 0.000000 -0.000000
v -0.050000 0.000000 1.000000
v 0.050000 0.000000 0.900000
v -0.050000 0.000000 -0.900000
v 0.050000 0.000000 -1.000000
v -0.050000 0.000000 -0.335000
v 0.050000 0.000000 -0.335000
v 0.000000 0.000000 0.950000
v -0.000000 0.000000 -0.950000
v -0.000000 0.000000 -0.385000
v -0.050000 0.000000 0.331500
v 0.050000 0.000000 0.331500
v 0.000000 0.000000 0.381500
v -0.982843 0.000000 0.450000
v -0.700000 0.000000 0.732843
v -0.700000 0.000000 0.167157
v -0.417157 0.000000 0.450000
v -0.750000 0.000000 1.000000
v -0.650000 0.000000 0.900000
v -0.750000 0.000000 -0.900000
v -0.650000 0.000000 -1.000000
v -0.750000 0.000000 0.115000
v -0.650000 0.000000 0.115000
v -0.700000 0.000000 0.950000
v -0.700000 0.000000 -0.950000
v -0.700000 0.000000 0.065000
v -0.750000 0.000000 0.781500
v -0.650000 0.000000 0.781500
v -0.700000 0.000000 0.831500
v 0.417157 0.000000 -0.450000
v 0.700000 0.000000 -0.167157
v 0.700000 0.000000 -0.732843
v 0.982843 0.000000 -0.450000
v 0.650000 0.000000 1.000000
v 0.750000 0.000000 0.900000
v 0.650000 0.000000 -0.900000
v 0.750000 0.000000 -1.000000
v 0.650000 0.000000 -0.785000
v 0.750000 0.000000 -0.785000
v 0.700000 0.000000 0.950000
v 0.700000 0.000000 -0.950000
v 0.700000 0.000000 -0.835000
v 0.650000 0.000000 -0.118500
v 0.750000 0.000000 -0.118500
v 0.700000 0.000000 -0.068500
v -0.869706 0.000000 0.450000
v -0.700000 0.000000 0.619706
v -0.700000 0.000000 0.280294
v -0.530294 0.000000 0.450000
v 0.530294 0.000000 -0.450000
v 0.700000 0.000000 -0.280294
v 0.700000 0.000000 -0.619706
v 0.869706 0.000000 -0.450000
v -0.169706 0.000000 0.000000
v 0.000000 0.000000 0.169706
v -0.000000 0.000000 -0.169706
v 0.169706 0.000000 -0.000000
vn -0.0000 1.0000 -0.0000
vt 0.000000 0.000000
vt 1.000000 0.950000
vt 0.500000 1.000000
vt 0.500000 0.950000
vt 0.000000 1.000000
vt 0.000000 0.950000
vt 0.500000 0.000000
vt 0.000000 0.665000
vt 1.000000 0.000000
vt 0.500000 0.665000
vt 1.000000 1.000000
vt 1.000000 0.665000
s 0
f 1/1/1 59/1/1 3/1/1
f 10/2/1 12/3/1 13/4/1
f 13/4/1 7/5/1 9/6/1
f 11/7/1 14/8/1 5/1/1
f 6/9/1 16/10/1 11/7/1
f 19/1/1 49/1/1 51/1/1
f 29/4/1 24/11/1 28/3/1
f 29/4/1 23/5/1 25/6/1
f 27/7/1 30/8/1 21/1/1
f 22/9/1 32/10/1 27/7/1
f 34/1/1 53/1/1 33/1/1
f 42/2/1 44/3/1 45/4/1
f 45/4/1 39/5/1 41/6/1
f 37/1/1 48/10/1 46/8/1
f 38/9/1 48/10/1 43/7/1
f 4/1/1 58/1/1 2/1/1
f 10/2/1 8/11/1 12/3/1
f 13/4/1 12/3/1 7/5/1
f 11/7/1 16/10/1 14/8/1
f 6/9/1 15/12/1 16/10/1
f 20/1/1 50/1/1 18/1/1
f 29/4/1 26/2/1 24/11/1
f 29/4/1 28/3/1 23/5/1
f 27/7/1 32/10/1 30/8/1
f 22/9/1 31/12/1 32/10/1
f 35/1/1 56/1/1 36/1/1
f 42/2/1 40/11/1 44/3/1
f 45/4/1 44/3/1 39/5/1
f 37/1/1 43/7/1 48/10/1
f 38/9/1 47/12/1 48/10/1
f 19/1/1 52/1/1 20/1/1
f 18/1/1 49/1/1 17/1/1
f 34/1/1 56/1/1 54/1/1
f 33/1/1 55/1/1 35/1/1
f 3/1/1 60/1/1 4/1/1
f 2/1/1 57/1/1 1/1/1
f 1/1/1 57/1/1 59/1/1
f 19/1/1 17/1/1 49/1/1
f 34/1/1 54/1/1 53/1/1
f 4/1/1 60/1/1 58/1/1
f 20/1/1 52/1/1 50/1/1
f 35/1/1 55/1/1 56/1/1
f 19/1/1 51/1/1 52/1/1
f 18/1/1 50/1/1 49/1/1
f 34/1/1 36/1/1 56/1/1
f 33/1/1 53/1/1 55/1/1
f 3/1/1 59/1/1 60/1/1
f 2/1/1 58/1/1 57/1/1
26 changes: 26 additions & 0 deletions bin/app/data/switch.obj
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Blender 4.0.2
# www.blender.org
mtllib switch.mtl
o Plane.001
v -1.100000 0.000000 -0.500000
v 1.700000 0.000000 -0.200000
v -1.700000 0.000000 -0.200000
v 0.900000 0.000000 -0.500000
v 0.300000 0.000000 -1.400000
v 1.100000 0.000000 0.500000
v -1.700000 0.000000 0.200000
v 1.700000 0.000000 0.200000
v -0.900000 0.000000 0.500000
v -0.300000 0.000000 1.400000
vn -0.0000 1.0000 -0.0000
vt 0.200000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
s 0
f 4/1/1 3/2/1 2/3/1
f 9/1/1 8/2/1 7/3/1
f 2/3/1 5/1/1 4/1/1
f 4/1/1 1/4/1 3/2/1
f 9/1/1 6/4/1 8/2/1
f 7/3/1 10/1/1 9/1/1
4 changes: 4 additions & 0 deletions bin/app/gui/print_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ def print_node_info(parent_path, depth, indent):
child_type = "chat_edit"
case SceneNodeType.BUTTON:
child_type = "button"
case SceneNodeType.SETTING_ROOT:
child_type = "setting_root"
case SceneNodeType.SETTING:
child_type = "setting"

desc = f"{ws}{child_name}:{child_id}/"
desc += " "*(50 - len(desc))
Expand Down
2 changes: 2 additions & 0 deletions bin/app/pydrk/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class SceneNodeType:
CHAT_EDIT = 18
IMAGE = 18
BUTTON = 19
SETTING_ROOT = 24
SETTING = 25

class PropertyType:
NULL = 0
Expand Down
7 changes: 4 additions & 3 deletions bin/app/src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ use crate::{
mod node;
use node::create_darkirc;
mod schema;
use schema::get_window_scale_filename;
use schema::{get_window_scale_filename, settings};

macro_rules! d { ($($arg:tt)*) => { debug!(target: "app", $($arg)*); } }
macro_rules! t { ($($arg:tt)*) => { trace!(target: "app", $($arg)*); } }
Expand Down Expand Up @@ -173,8 +173,7 @@ impl App {

let window = window.setup(|me| Window::new(me, self.render_api.clone())).await;
self.sg_root.clone().link(window.clone());
schema::make(&self, window).await;
//schema::test::make(&self, window).await;
schema::make(&self, window.clone()).await;

d!("Schema loaded");

Expand All @@ -186,6 +185,8 @@ impl App {

#[cfg(not(feature = "enable-plugins"))]
w!("Plugins are disabled in this build");

settings::make(&self, window).await;
}

#[cfg(feature = "enable-plugins")]
Expand Down
2 changes: 2 additions & 0 deletions bin/app/src/app/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ pub fn create_editbox(name: &str) -> SceneNode {
let prop = Property::new("debug", PropertyType::Bool, PropertySubType::Null);
node.add_property(prop).unwrap();

node.add_signal("enter_pressed", "Enter key pressed", vec![]).unwrap();

node
}

Expand Down
94 changes: 94 additions & 0 deletions bin/app/src/app/schema/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,14 @@ use crate::{

mod chat;
mod menu;
pub mod settings;
pub mod test;

pub const COLOR_SCHEME: ColorScheme = ColorScheme::DarkMode;
//pub const COLOR_SCHEME: ColorScheme = ColorScheme::PaperLight;

mod android_ui_consts {
pub const SETTINGS_ICON_SIZE: f32 = 140.;
pub const NETSTATUS_ICON_SIZE: f32 = 140.;
pub const NETLOGO_SCALE: f32 = 50.;
pub const EMOJI_PICKER_ICON_SIZE: f32 = 100.;
Expand Down Expand Up @@ -109,6 +111,8 @@ mod ui_consts {
not(feature = "emulate-android")
))]
mod ui_consts {
pub const SETTINGS_ICON_SIZE: f32 = 60.;
pub const SETTINGS_LOGO_SCALE: f32 = 25.;
pub const NETSTATUS_ICON_SIZE: f32 = 60.;
pub const NETLOGO_SCALE: f32 = 25.;
pub const EMOJI_PICKER_ICON_SIZE: f32 = 40.;
Expand All @@ -129,6 +133,7 @@ enum ColorScheme {
pub async fn make(app: &App, window: SceneNodePtr) {
let mut cc = Compiler::new();
cc.add_const_f32("NETSTATUS_ICON_SIZE", NETSTATUS_ICON_SIZE);
cc.add_const_f32("SETTINGS_ICON_SIZE", NETSTATUS_ICON_SIZE);

let atom = &mut PropertyAtomicGuard::new();

Expand Down Expand Up @@ -396,6 +401,95 @@ pub async fn make(app: &App, window: SceneNodePtr) {
node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
netlayer_node.clone().link(net3_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.clone().set_expr(atom, Role::App, 0, code).unwrap();
prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
prop.clone().set_f32(atom, Role::App, 2, 1000.).unwrap();
prop.clone().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.render_api.clone(), app.ex.clone())).await;
window.clone().link(settingslayer_node.clone());

// Background
let node = create_vector_art("settings_btn_bg");
let prop = node.get_property("rect").unwrap();
prop.clone().set_f32(atom, Role::App, 0, NETSTATUS_ICON_SIZE / 2.).unwrap();
prop.clone().set_f32(atom, Role::App, 1, NETSTATUS_ICON_SIZE / 2.).unwrap();
prop.clone().set_expr(atom, Role::App, 2, expr::load_var("w")).unwrap();
prop.clone().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.render_api.clone(), app.ex.clone())).await;
settingslayer_node.clone().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.clone().set_f32(atom, Role::App, 0, 0.).unwrap();
prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
prop.clone().set_f32(atom, Role::App, 2, NETSTATUS_ICON_SIZE).unwrap();
prop.clone().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.clone().lookup_node("/window").unwrap().get_children();
let target_substrings = vec!["_chat_layer", "menu_layer", "settings_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.clone().lookup_node("/window/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.ex.clone())).await;
settingslayer_node.clone().link(node);

let emoji_meshes = emoji_picker::EmojiMeshes::new(
app.render_api.clone(),
app.text_shaper.clone(),
Expand Down
Loading

0 comments on commit 345f9cb

Please sign in to comment.