aboutsummaryrefslogtreecommitdiff
path: root/src/message
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2021-12-01 16:21:43 +0100
committerMax Audron <audron@cocaine.farm>2021-12-01 16:21:43 +0100
commita23c1721eb73b20212716a38c052a41eb5960b83 (patch)
tree2fad678445cea6bb78dd07c7b3d4a4f734f79367 /src/message
parentadd sync proc macro (diff)
complete BufferViewConfig implementation
Diffstat (limited to '')
-rw-r--r--src/message/signalproxy/mod.rs14
-rw-r--r--src/message/signalproxy/objects/bufferview.rs255
2 files changed, 219 insertions, 50 deletions
diff --git a/src/message/signalproxy/mod.rs b/src/message/signalproxy/mod.rs
index d6490d4..dab57c2 100644
--- a/src/message/signalproxy/mod.rs
+++ b/src/message/signalproxy/mod.rs
@@ -66,22 +66,24 @@ impl SyncProxy {
}
/// Send an RpcCall
- fn rpc(&self, function: &str, params: VariantList) {}
+ fn rpc(&self, _function: &str, _params: VariantList) {}
}
/// A base Syncable Object
///
/// Provides default implementations for sending SyncMessages and
-/// RpcCalls so you usually only have to set the CLASS const
+/// RpcCalls so you usually only have to set the CLASS const.
+///
+/// If the object name has to be set implement the send_sync() function.
pub trait Syncable {
/// The Class of the object as transmitted in the SyncMessage
const CLASS: &'static str;
/// Send a SyncMessage.
- fn send_sync(&self, object_name: Option<&str>, function: &str, params: VariantList) {
+ fn send_sync(&self, function: &str, params: VariantList) {
crate::message::signalproxy::SYNC_PROXY.get().unwrap().sync(
Self::CLASS,
- object_name,
+ None,
function,
params,
);
@@ -128,7 +130,7 @@ where
where
Self: Sized,
{
- self.send_sync(None, "update", vec![self.to_network_map().into()]);
+ self.send_sync("update", vec![self.to_network_map().into()]);
}
/// Server -> Client: Update the whole object with received data
@@ -176,7 +178,7 @@ pub trait StatefulSyncableClient: Syncable + translation::NetworkMap {
where
Self: Sized,
{
- self.send_sync(None, "requestUpdate", vec![self.to_network_map().into()]);
+ self.send_sync("requestUpdate", vec![self.to_network_map().into()]);
}
}
diff --git a/src/message/signalproxy/objects/bufferview.rs b/src/message/signalproxy/objects/bufferview.rs
index 0e3c904..5b4ab3c 100644
--- a/src/message/signalproxy/objects/bufferview.rs
+++ b/src/message/signalproxy/objects/bufferview.rs
@@ -1,9 +1,16 @@
use std::{collections::HashMap, convert::TryFrom, convert::TryInto};
+use libquassel_derive::sync;
use libquassel_derive::{NetworkList, NetworkMap};
use crate::message::signalproxy::translation::Network;
-use crate::message::{StatefulSyncableClient, StatefulSyncableServer, SyncProxy, Syncable};
+
+#[allow(unused_imports)]
+use crate::message::StatefulSyncableClient;
+#[allow(unused_imports)]
+use crate::message::StatefulSyncableServer;
+use crate::message::Syncable;
+
use crate::primitive::{Variant, VariantList};
#[derive(Debug, Clone, PartialEq)]
@@ -53,7 +60,7 @@ impl super::NetworkList for BufferViewManager {
}
}
-#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)]
+#[derive(Debug, Default, Clone, PartialEq, NetworkList, NetworkMap)]
pub struct BufferViewConfig {
#[network(rename = "BufferList", network, variant = "VariantList")]
pub buffers: Vec<i32>,
@@ -78,8 +85,9 @@ pub struct BufferViewConfig {
pub hide_inactive_networks: bool,
#[network(rename = "disableDecoration")]
pub disable_decoration: bool,
+ // TODO use bitflags for buffertypes
#[network(rename = "allowedBufferTypes")]
- pub allowed_buffers_types: i32,
+ pub allowed_buffer_types: i32,
#[network(rename = "minimumActivity")]
pub minimum_activity: i32,
#[network(rename = "showSearch")]
@@ -88,35 +96,11 @@ pub struct BufferViewConfig {
#[allow(dead_code)]
impl BufferViewConfig {
- // TODO add sync to all functions
- // TODO requestAddBuffer(bufferId: BufferId, pos: Int)
- // TODO requestMoveBuffer(bufferId: BufferId, pos: Int)
- // TODO requestRemoveBuffer(bufferId: BufferId)
- // TODO requestRemoveBufferPermanently(bufferId: BufferId)
- // TODO requestSetBufferViewName(bufferViewName: QString)
- // /**
- // * Replaces all properties of the object with the content of the
- // * "properties" parameter. This parameter is in network representation.
- // */
- // DONE requestUpdate(properties: QVariantMap)
+ pub fn request_add_buffer(&self, id: i32, pos: usize) {
+ sync!("requestAddBuffer", [id, (pos as i32)]);
+ }
- // // S->C calls
- // DONE addBuffer(bufferId: BufferId, pos: Int)
- // DONE moveBuffer(bufferId: BufferId, pos: Int)
- // DONE removeBuffer(bufferId: BufferId)
- // DONE removeBufferPermanently(bufferId: BufferId)
- // TODO setAddNewBuffersAutomatically(addNewBuffersAutomatically: Bool)
- // TODO setAllowedBufferTypes(bufferTypes: Int)
- // TODO setBufferViewName(bufferViewName: QString)
- // TODO setDisableDecoration(disableDecoration: Bool)
- // TODO setHideInactiveBuffers(hideInactiveBuffers: Bool)
- // TODO setHideInactiveNetworks(hideInactiveNetworks: Bool)
- // TODO setMinimumActivity(activity: Int)
- // TODO setNetworkId(networkId: NetworkId)
- // TODO setShowSearch(showSearch: Bool)
- // TODO setSortAlphabetically(sortAlphabetically: Bool)
-
- fn add_buffer(&mut self, id: i32, pos: usize) {
+ pub fn add_buffer(&mut self, id: i32, pos: usize) {
if !self.buffers.contains(&id) {
self.buffers.insert(pos, id)
}
@@ -125,28 +109,36 @@ impl BufferViewConfig {
self.removed_buffers.remove(old_pos);
}
- if let Some(old_pos) = self.temporarily_removed_buffers.iter().position(|&x| x == id) {
+ if let Some(old_pos) = self
+ .temporarily_removed_buffers
+ .iter()
+ .position(|&x| x == id)
+ {
self.temporarily_removed_buffers.remove(old_pos);
}
#[cfg(feature = "server")]
- {
- // TODO replace the None with self.buffer_view_id
- self.send_sync(
- Some(&self.buffer_view_id.to_string()),
- "addBuffer",
- vec![id.into(), (pos as i32).into()],
- )
- }
+ sync!("addBuffer", [id, (pos as i32)]);
}
- fn move_buffer(&mut self, id: i32, pos: usize) {
+ pub fn request_move_buffer(&self, id: i32, pos: usize) {
+ sync!("requestMoveBuffer", [id, (pos as i32)]);
+ }
+
+ pub fn move_buffer(&mut self, id: i32, pos: usize) {
let old_pos = self.buffers.iter().position(|&x| x == id).unwrap();
self.buffers.remove(old_pos);
self.buffers.insert(pos, id);
+
+ #[cfg(feature = "server")]
+ sync!("moveBuffer", [id, (pos as i32)]);
}
- fn remove_buffer(&mut self, id: i32) {
+ pub fn request_remove_buffer(&mut self, id: i32) {
+ sync!("requestRemoveBuffer", [id]);
+ }
+
+ pub fn remove_buffer(&mut self, id: i32) {
if let Some(old_pos) = self.buffers.iter().position(|&x| x == id) {
self.buffers.remove(old_pos);
}
@@ -158,20 +150,34 @@ impl BufferViewConfig {
if !self.temporarily_removed_buffers.contains(&id) {
self.temporarily_removed_buffers.push(id)
}
+
+ #[cfg(feature = "server")]
+ sync!("removeBuffer", [id]);
}
- fn remove_buffer_permanently(&mut self, id: i32) {
+ pub fn request_remove_buffer_permanently(&mut self, id: i32) {
+ sync!("requestRemoveBufferPermanently", [id]);
+ }
+
+ pub fn remove_buffer_permanently(&mut self, id: i32) {
if let Some(old_pos) = self.buffers.iter().position(|&x| x == id) {
self.buffers.remove(old_pos);
}
- if let Some(old_pos) = self.temporarily_removed_buffers.iter().position(|&x| x == id) {
+ if let Some(old_pos) = self
+ .temporarily_removed_buffers
+ .iter()
+ .position(|&x| x == id)
+ {
self.temporarily_removed_buffers.remove(old_pos);
}
if !self.removed_buffers.contains(&id) {
self.removed_buffers.push(id)
}
+
+ #[cfg(feature = "server")]
+ sync!("removeBufferPermanently", [id]);
}
}
@@ -207,6 +213,42 @@ impl StatefulSyncableServer for BufferViewConfig {
Self: Sized,
{
match msg.slot_name.as_str() {
+ "requestAddBuffer" => self.add_buffer(
+ msg.params.remove(0).try_into().unwrap(),
+ i32::try_from(msg.params.remove(0)).unwrap() as usize,
+ ),
+ "requestMoveBuffer" => self.move_buffer(
+ msg.params.remove(0).try_into().unwrap(),
+ i32::try_from(msg.params.remove(0)).unwrap() as usize,
+ ),
+ "requestRemoveBuffer" => self.remove_buffer(msg.params.remove(0).try_into().unwrap()),
+ "requestRemoveBufferPermanently" => {
+ self.remove_buffer_permanently(msg.params.remove(0).try_into().unwrap())
+ }
+ "setAddNewBuffersAutomatically" => {
+ self.add_new_buffers_automatically = msg.params.remove(0).try_into().unwrap()
+ }
+ "setAllowedBufferTypes" => {
+ self.allowed_buffer_types = msg.params.remove(0).try_into().unwrap()
+ }
+ "setBufferViewName" => self.buffer_view_name = msg.params.remove(0).try_into().unwrap(),
+ "setDisableDecoration" => {
+ self.disable_decoration = msg.params.remove(0).try_into().unwrap()
+ }
+ "setHideInactiveBuffers" => {
+ self.hide_inactive_buffers = msg.params.remove(0).try_into().unwrap()
+ }
+ "setHideInactiveNetworks" => {
+ self.hide_inactive_networks = msg.params.remove(0).try_into().unwrap()
+ }
+ "setMinimumActivity" => {
+ self.minimum_activity = msg.params.remove(0).try_into().unwrap()
+ }
+ "setNetworkId" => self.network_id = msg.params.remove(0).try_into().unwrap(),
+ "setShowSearch" => self.show_search = msg.params.remove(0).try_into().unwrap(),
+ "setSortAlphabetically" => {
+ self.sort_alphabetically = msg.params.remove(0).try_into().unwrap()
+ }
_ => (),
}
}
@@ -214,4 +256,129 @@ impl StatefulSyncableServer for BufferViewConfig {
impl Syncable for BufferViewConfig {
const CLASS: &'static str = "BufferViewConfig";
+
+ fn send_sync(&self, function: &str, params: VariantList) {
+ crate::message::signalproxy::SYNC_PROXY.get().unwrap().sync(
+ Self::CLASS,
+ Some(&self.buffer_view_id.to_string()),
+ function,
+ params,
+ );
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ fn bufferviewconfig_sample() -> BufferViewConfig {
+ BufferViewConfig {
+ buffers: vec![1, 2, 3],
+ removed_buffers: vec![4, 5],
+ temporarily_removed_buffers: vec![6, 7],
+ ..Default::default()
+ }
+ }
+
+ #[test]
+ fn bufferviewconfig_add_buffer() {
+ // Add existing buffer, no change
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.add_buffer(1, 2);
+ assert_eq!(bufferviewconfig_sample(), buffer_view_config);
+
+ // Add new buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.add_buffer(10, 1);
+ assert_eq!(
+ BufferViewConfig {
+ buffers: vec![1, 10, 2, 3],
+ removed_buffers: vec![4, 5],
+ temporarily_removed_buffers: vec![6, 7],
+ ..Default::default()
+ },
+ buffer_view_config
+ );
+
+ // Add new buffer, remove from removed buffers
+ let mut buffer_view_config = BufferViewConfig {
+ buffers: vec![1, 2, 3],
+ removed_buffers: vec![4, 5, 10],
+ temporarily_removed_buffers: vec![6, 7, 10],
+ ..Default::default()
+ };
+ buffer_view_config.add_buffer(10, 1);
+ assert_eq!(
+ BufferViewConfig {
+ buffers: vec![1, 10, 2, 3],
+ removed_buffers: vec![4, 5],
+ temporarily_removed_buffers: vec![6, 7],
+ ..Default::default()
+ },
+ buffer_view_config
+ );
+ }
+
+ #[test]
+ fn bufferviewconfig_remove_buffer() {
+ // Remove already removed buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.remove_buffer(6);
+ assert_eq!(bufferviewconfig_sample(), buffer_view_config);
+
+ // Remove buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.remove_buffer(1);
+ assert_eq!(
+ BufferViewConfig {
+ buffers: vec![2, 3],
+ removed_buffers: vec![4, 5],
+ temporarily_removed_buffers: vec![6, 7, 1],
+ ..Default::default()
+ },
+ buffer_view_config
+ );
+ }
+
+ #[test]
+ fn bufferviewconfig_remove_buffer_permanently() {
+ // Remove already removed buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.remove_buffer_permanently(4);
+ assert_eq!(bufferviewconfig_sample(), buffer_view_config);
+
+ // Remove buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.remove_buffer_permanently(1);
+ assert_eq!(
+ BufferViewConfig {
+ buffers: vec![2, 3],
+ removed_buffers: vec![4, 5, 1],
+ temporarily_removed_buffers: vec![6, 7],
+ ..Default::default()
+ },
+ buffer_view_config
+ );
+ }
+
+ #[test]
+ fn bufferviewconfig_move_buffer() {
+ // Do nothing
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.move_buffer(1, 0);
+ assert_eq!(bufferviewconfig_sample(), buffer_view_config);
+
+ // Move buffer
+ let mut buffer_view_config = bufferviewconfig_sample();
+ buffer_view_config.move_buffer(1, 1);
+ assert_eq!(
+ BufferViewConfig {
+ buffers: vec![2, 1, 3],
+ removed_buffers: vec![4, 5],
+ temporarily_removed_buffers: vec![6, 7],
+ ..Default::default()
+ },
+ buffer_view_config
+ );
+ }
}