aboutsummaryrefslogtreecommitdiff
path: root/examples/statetracker/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/statetracker/src/main.rs')
-rw-r--r--examples/statetracker/src/main.rs131
1 files changed, 131 insertions, 0 deletions
diff --git a/examples/statetracker/src/main.rs b/examples/statetracker/src/main.rs
new file mode 100644
index 0000000..7213000
--- /dev/null
+++ b/examples/statetracker/src/main.rs
@@ -0,0 +1,131 @@
+#![feature(type_name_of_val)]
+
+use std::sync::Arc;
+
+use aliasmanager::AliasManagerWidget;
+use druid::{
+ widget::{Align, Either, Flex, Label, List, Split},
+ AppDelegate, Command,
+};
+use druid::{AppLauncher, Data, Env, Lens, LocalizedString, Widget, WidgetExt, WindowDesc};
+use libquassel::message::objects::AliasManager;
+use tracing::debug;
+
+use crate::server::{Message, ServerWidget};
+
+const SPACING: f64 = 10.0;
+
+const VERTICAL_WIDGET_SPACING: f64 = 20.0;
+const WINDOW_TITLE: LocalizedString<StateTracker> = LocalizedString::new("StateTracker");
+
+mod command;
+mod connect;
+mod formatter;
+mod server;
+
+mod aliasmanager;
+
+#[derive(Clone, Data, Lens)]
+struct StateTracker {
+ server: server::Server,
+ messages: Arc<Vec<server::Message>>,
+ alias_manager: Arc<AliasManager>,
+ connected: bool,
+ test: i32,
+}
+
+impl StateTracker {
+ fn new() -> StateTracker {
+ StateTracker {
+ server: server::Server::default(),
+ messages: Arc::new(Vec::new()),
+ alias_manager: Arc::new(AliasManager {
+ aliases: Vec::new(),
+ }),
+ connected: false,
+ test: 0,
+ }
+ }
+
+ fn widget() -> impl Widget<StateTracker> {
+ let either = Either::new(
+ |server, _env| server.connected,
+ Split::columns(
+ Flex::column()
+ .with_child(Label::new("AliasManager"))
+ .with_child(AliasManagerWidget::new().lens(StateTracker::alias_manager)),
+ List::new(|| {
+ Label::new(|item: &Message, _env: &_| format!("{:#?}", item)).padding(10.0)
+ })
+ .scroll()
+ .vertical()
+ .lens(StateTracker::messages),
+ )
+ .expand(),
+ ServerWidget::new()
+ .fix_width(200.0)
+ .lens(StateTracker::server),
+ );
+
+ let layout = Flex::column()
+ .with_flex_child(either, 1.0)
+ .with_spacer(VERTICAL_WIDGET_SPACING);
+
+ Align::centered(layout)
+ }
+}
+
+struct StateTrackerDelegate;
+impl AppDelegate<StateTracker> for StateTrackerDelegate {
+ fn command(
+ &mut self,
+ ctx: &mut druid::DelegateCtx,
+ _target: druid::Target,
+ cmd: &Command,
+ data: &mut StateTracker,
+ _env: &Env,
+ ) -> druid::Handled {
+ if let Some(_) = cmd.get(command::CONNECT) {
+ debug!("got CONNECT command");
+
+ data.connect(ctx.get_external_handle());
+ data.connected = true;
+
+ return druid::Handled::Yes;
+ } else if let Some(msg) = cmd.get(command::ADD_MESSAGE) {
+ debug!("got ADD_MESSAGE command");
+
+ let list = Arc::make_mut(&mut data.messages);
+ list.push(msg.clone());
+ } else if let Some(alias) = cmd.get(command::ALIASMANAGER_ADD_ALIAS) {
+ let mut alias_manager = Arc::make_mut(&mut data.alias_manager).clone();
+ alias_manager.add_alias(alias.to_owned());
+ data.alias_manager = Arc::new(alias_manager);
+ } else if let Some(alias_manager) = cmd.get(command::ALIASMANAGER_INIT) {
+ data.alias_manager = Arc::new(alias_manager.to_owned());
+ }
+
+ druid::Handled::No
+ }
+}
+
+fn main() {
+ // pretty_env_logger::init();
+
+ // describe the main window
+ let main_window = WindowDesc::new(StateTracker::widget())
+ .title(WINDOW_TITLE)
+ .window_size((400.0, 400.0));
+
+ // create the initial app state
+ let initial_state = StateTracker::new();
+
+ // let state = Arc::new(RwLock::new(initial_state));
+
+ // start the application
+ AppLauncher::with_window(main_window)
+ .log_to_console()
+ .delegate(StateTrackerDelegate)
+ .launch(initial_state)
+ .expect("Failed to launch application");
+}