aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2021-09-28 17:57:08 +0200
committerMax Audron <audron@cocaine.farm>2021-09-28 18:15:50 +0200
commite72c83710442ec57410c4a523e003fdd37d3ffd8 (patch)
tree5760714679d446c60d326564aa6df5566fb1fdf6 /examples
parentstatetracker: first iteration of working rpc object (diff)
statetracker: cleanup code
Diffstat (limited to '')
-rw-r--r--examples/statetracker/Cargo.toml2
-rw-r--r--examples/statetracker/src/aliasmanager.rs20
-rw-r--r--examples/statetracker/src/command.rs19
-rw-r--r--examples/statetracker/src/main.rs43
-rw-r--r--examples/statetracker/src/server.rs31
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);