diff options
Diffstat (limited to '')
| -rw-r--r-- | examples/statetracker/Cargo.toml | 2 | ||||
| -rw-r--r-- | examples/statetracker/src/aliasmanager.rs | 20 | ||||
| -rw-r--r-- | examples/statetracker/src/command.rs | 19 | ||||
| -rw-r--r-- | examples/statetracker/src/main.rs | 43 | ||||
| -rw-r--r-- | examples/statetracker/src/server.rs | 31 |
5 files changed, 86 insertions, 29 deletions
diff --git a/examples/statetracker/Cargo.toml b/examples/statetracker/Cargo.toml index fa78217..b73411b 100644 --- a/examples/statetracker/Cargo.toml +++ b/examples/statetracker/Cargo.toml @@ -10,8 +10,6 @@ libquassel = { path = "../../", features = ["framing", "all-quassel-features"] } druid = { git = "https://github.com/linebender/druid", features = ["im"] } druid-widget-nursery = { path = "/home/audron/repo/github.com/linebender/druid-widget-nursery" } -# iced = { version = "0.3", features = ["tokio"]} - anyhow = "*" tracing = "0.1" diff --git a/examples/statetracker/src/aliasmanager.rs b/examples/statetracker/src/aliasmanager.rs index 9247c22..afa8c91 100644 --- a/examples/statetracker/src/aliasmanager.rs +++ b/examples/statetracker/src/aliasmanager.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use druid::widget::Label; +use druid::widget::{Align, Label}; use druid::{lens, Lens, Point, WidgetPod}; use druid::{widget::Flex, Widget}; @@ -48,18 +48,24 @@ impl Widget<Arc<AliasManager>> for AliasManagerWidget { ) { let aliases = lens!(AliasManager, aliases); - let mut widget: Flex<Arc<AliasManager>> = Flex::column(); + let mut names: Flex<Arc<AliasManager>> = Flex::column(); + let mut sign: Flex<Arc<AliasManager>> = Flex::column(); + let mut expansions: Flex<Arc<AliasManager>> = Flex::column(); + // TODO optimise this whole thing aliases.with(data, |aliases| { for alias in aliases { - widget.add_child( - Flex::row() - .with_child(Label::new(alias.name.clone())) - .with_child(Label::new(alias.expansion.clone())), - ) + names.add_child(Align::right(Label::new(alias.name.clone()))); + sign.add_child(Label::new("=>")); + expansions.add_child(Align::left(Label::new(alias.expansion.clone()))); } }); + let widget: Flex<Arc<AliasManager>> = Flex::row() + .with_flex_child(names, 1.0) + .with_flex_child(sign, 1.0) + .with_flex_child(expansions, 1.0); + self.inner = WidgetPod::new(widget).boxed(); ctx.children_changed(); diff --git a/examples/statetracker/src/command.rs b/examples/statetracker/src/command.rs index fc221c6..2d83edf 100644 --- a/examples/statetracker/src/command.rs +++ b/examples/statetracker/src/command.rs @@ -1,8 +1,17 @@ -use druid::Selector; -use libquassel::message::objects::{Alias, AliasManager}; +use druid::{Selector, SingleUse}; +use libquassel::{ + message::{ + objects::{Alias, AliasManager}, + SyncMessage, + }, + primitive::VariantMap, +}; pub const CONNECT: Selector = Selector::new("connect"); -pub const ADD_MESSAGE: Selector<crate::Message> = Selector::new("add_message"); +pub const ADD_MESSAGE: Selector<SingleUse<crate::Message>> = Selector::new("add_message"); -pub const ALIASMANAGER_INIT: Selector<AliasManager> = Selector::new("aliasmanager_init"); -pub const ALIASMANAGER_ADD_ALIAS: Selector<Alias> = Selector::new("aliasmanager_add_alias"); +pub const ALIASMANAGER_INIT: Selector<SingleUse<AliasManager>> = Selector::new("aliasmanager_init"); +pub const ALIASMANAGER_UPDATE: Selector<SingleUse<SyncMessage>> = + Selector::new("aliasmanager_update"); +pub const ALIASMANAGER_ADD_ALIAS: Selector<SingleUse<Alias>> = + Selector::new("aliasmanager_add_alias"); diff --git a/examples/statetracker/src/main.rs b/examples/statetracker/src/main.rs index 7213000..3177b39 100644 --- a/examples/statetracker/src/main.rs +++ b/examples/statetracker/src/main.rs @@ -1,14 +1,18 @@ #![feature(type_name_of_val)] -use std::sync::Arc; +use std::{ops::Deref, sync::Arc}; use aliasmanager::AliasManagerWidget; use druid::{ + lens, 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 libquassel::message::NetworkMap; + use tracing::debug; use crate::server::{Message, ServerWidget}; @@ -31,7 +35,8 @@ struct StateTracker { messages: Arc<Vec<server::Message>>, alias_manager: Arc<AliasManager>, connected: bool, - test: i32, + #[data(ignore)] + syncer: Syncer, } impl StateTracker { @@ -43,7 +48,7 @@ impl StateTracker { aliases: Vec::new(), }), connected: false, - test: 0, + syncer: Syncer {}, } } @@ -96,19 +101,43 @@ impl AppDelegate<StateTracker> for StateTrackerDelegate { debug!("got ADD_MESSAGE command"); let list = Arc::make_mut(&mut data.messages); - list.push(msg.clone()); + list.push(msg.take().unwrap()); } 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()); + alias_manager.add_alias(alias.take().unwrap()); 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()); + data.alias_manager = Arc::new(alias_manager.take().unwrap()); + } else if let Some(msg) = cmd.get(command::ALIASMANAGER_UPDATE) { + let syncer = data.syncer.clone(); + let mut alias_manager = Arc::make_mut(&mut data.alias_manager).clone(); + alias_manager.handle_syncmessage(syncer, msg.take().unwrap()); + data.alias_manager = Arc::new(alias_manager); } druid::Handled::No } } +// TODO make this somehow deref or smth +#[derive(Clone)] +pub struct Syncer; +impl libquassel::message::SyncProxy for Syncer { + fn sync( + &self, + class_name: &str, + object_name: Option<&str>, + function: &str, + params: libquassel::primitive::VariantList, + ) { + todo!() + } + + fn rpc(&self, function: &str, params: libquassel::primitive::VariantList) { + todo!() + } +} + fn main() { // pretty_env_logger::init(); @@ -120,8 +149,6 @@ fn main() { // 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() diff --git a/examples/statetracker/src/server.rs b/examples/statetracker/src/server.rs index ac9c550..6d56662 100644 --- a/examples/statetracker/src/server.rs +++ b/examples/statetracker/src/server.rs @@ -1,16 +1,19 @@ use anyhow::{bail, Error}; +use std::convert::TryFrom; + use druid::{ widget::{ Align, Button, Checkbox, Container, Controller, ControllerHost, Flex, Label, TextBox, }, - Command, Data, ExtEventSink, Lens, Target, Widget, WidgetExt, + Command, Data, ExtEventSink, Lens, SingleUse, Target, Widget, WidgetExt, }; use libquassel::{ deserialize::Deserialize, frame::QuasselCodec, message::{self, objects, ConnAck, HandshakeMessage, Init}, + primitive::VariantMap, }; use futures::{ @@ -130,7 +133,7 @@ impl Server { .unwrap(), }; - ctx.submit_command(command::ADD_MESSAGE, msg, Target::Global) + ctx.submit_command(command::ADD_MESSAGE, SingleUse::new(msg), Target::Global) .unwrap(); } } @@ -170,16 +173,30 @@ impl Server { match message::Message::parse(buf) { Ok((_size, res)) => { + let re = res.clone(); + #[allow(unused_variables)] - match &res { - message::Message::SyncMessage(msg) => (), + match res { + message::Message::SyncMessage(msg) => match msg.class_name.as_str() { + "AliasManager" => match msg.slot_name.as_str() { + "update" => ctx + .submit_command( + command::ALIASMANAGER_UPDATE, + SingleUse::new(msg), + Target::Global, + ) + .unwrap(), + _ => (), + }, + _ => (), + }, message::Message::RpcCall(msg) => (), message::Message::InitRequest(msg) => (), - message::Message::InitData(msg) => match &msg.init_data { + message::Message::InitData(msg) => match msg.init_data { objects::Types::AliasManager(alias_manager) => ctx .submit_command( command::ALIASMANAGER_INIT, - alias_manager.clone(), + SingleUse::new(alias_manager), Target::Global, ) .unwrap(), @@ -189,7 +206,7 @@ impl Server { message::Message::HeartBeatReply(msg) => (), } - return Ok(Message::SignalProxy(res)); + return Ok(Message::SignalProxy(re)); } Err(e) => { bail!("failed to parse message {}", e); |
