[fractal/split-async-state-ui-appop-mgmt: 3/3] Move stuff in state from AppOp to UI
- From: Alejandro Domínguez <aledomu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal/split-async-state-ui-appop-mgmt: 3/3] Move stuff in state from AppOp to UI
- Date: Mon, 28 Dec 2020 17:50:54 +0000 (UTC)
commit 28e4087b6819c4e51a902ae95ff699a50374aae2
Author: Alejandro Domínguez <adomu net-c com>
Date: Sat Dec 5 15:45:02 2020 +0100
Move stuff in state from AppOp to UI
fractal-gtk/src/appop/state.rs | 155 +++++++----------------------------------
fractal-gtk/src/meson.build | 1 +
fractal-gtk/src/ui/mod.rs | 1 +
fractal-gtk/src/ui/state.rs | 106 ++++++++++++++++++++++++++++
4 files changed, 133 insertions(+), 130 deletions(-)
---
diff --git a/fractal-gtk/src/appop/state.rs b/fractal-gtk/src/appop/state.rs
index e92b5729..09233c94 100644
--- a/fractal-gtk/src/appop/state.rs
+++ b/fractal-gtk/src/appop/state.rs
@@ -1,26 +1,38 @@
-use gio::prelude::*;
-use gtk::prelude::*;
-use libhandy::prelude::*;
-
use super::RoomSearchPagination;
use crate::actions::AppState;
use crate::appop::AppOp;
+use gtk::prelude::*;
impl AppOp {
pub fn set_state(&mut self, state: AppState) {
self.state = state;
match self.state {
- AppState::Login => self.set_stack_state("login"),
- AppState::NoRoom | AppState::Room => {
- self.set_stack_state("main_view");
- self.set_chat_state(state);
+ AppState::Login => self.ui.set_stack_state("login"),
+ AppState::NoRoom => {
+ self.ui.set_stack_state("main_view");
+ self.ui.set_chat_state(None);
+ self.active_room = None;
+ self.clear_tmp_msgs();
+ }
+ AppState::Room => {
+ let msg = if let Some(active_room_id) = self.active_room.as_ref() {
+ self.unsent_messages
+ .get(active_room_id)
+ .map(|(msg_text, msg_number)| (msg_text.as_str(), msg_number.clone()))
+ .unwrap_or_default()
+ } else {
+ Default::default()
+ };
+
+ self.ui.set_stack_state("main_view");
+ self.ui.set_chat_state(Some(msg));
}
- AppState::Directory => self.set_deck_state(Some("directory"), state),
- AppState::Loading => self.set_stack_state("loading"),
- AppState::AccountSettings => self.set_deck_state(Some("account-settings"), state),
- AppState::RoomSettings => self.set_deck_state(Some("room-settings"), state),
- AppState::MediaViewer => self.set_deck_state(Some("media-viewer"), state),
+ AppState::Directory => self.ui.set_deck_state(Some("directory"), state),
+ AppState::Loading => self.ui.set_stack_state("loading"),
+ AppState::AccountSettings => self.ui.set_deck_state(Some("account-settings"), state),
+ AppState::RoomSettings => self.ui.set_deck_state(Some("room-settings"), state),
+ AppState::MediaViewer => self.ui.set_deck_state(Some("media-viewer"), state),
};
//set focus for room directory
@@ -34,121 +46,4 @@ impl AppOp {
self.search_rooms();
}
}
-
- fn set_deck_state(&self, view: Option<&str>, state: AppState) {
- let deck = self
- .ui
- .builder
- .get_object::<libhandy::Deck>("main_deck")
- .expect("Could not find main_deck in ui file");
- let stack = self
- .ui
- .builder
- .get_object::<gtk::Stack>("subview_stack")
- .expect("Could not find subview_stack in ui file");
- let app = gio::Application::get_default().unwrap();
-
- let global_back = app.lookup_action("back");
-
- let direction = match state {
- AppState::Room | AppState::NoRoom => libhandy::NavigationDirection::Back,
- _ => libhandy::NavigationDirection::Forward,
- };
-
- if let Some(v) = view {
- stack.set_visible_child_name(v);
- }
-
- if deck.get_adjacent_child(direction).is_some() {
- deck.navigate(direction);
- if direction == libhandy::NavigationDirection::Forward {
- // Disable global back while in a subview
- global_back.map(|a| a.set_property("enabled", &false));
- }
- }
- }
-
- fn set_stack_state(&self, state: &str) {
- self.ui
- .builder
- .get_object::<gtk::Stack>("main_content_stack")
- .expect("Can't find main_content_stack in ui file.")
- .set_visible_child_name(state);
- }
-
- fn set_chat_state(&mut self, state: AppState) {
- let deck = self
- .ui
- .builder
- .get_object::<libhandy::Deck>("main_deck")
- .expect("Could not find main_deck in ui file");
- let stack = self
- .ui
- .builder
- .get_object::<gtk::Stack>("room_view_stack")
- .expect("Can't find room_view_stack in ui file.");
- let headerbar = self
- .ui
- .builder
- .get_object::<libhandy::HeaderBar>("room_header_bar")
- .expect("Can't find room_header_bar in ui file.");
-
- match state {
- AppState::NoRoom => {
- self.set_state_no_room(&headerbar);
- self.ui
- .leaflet
- .navigate(libhandy::NavigationDirection::Back);
- stack.set_visible_child_name("noroom");
- }
- AppState::Room => {
- self.set_state_room(&headerbar);
- self.ui
- .leaflet
- .navigate(libhandy::NavigationDirection::Forward);
- stack.set_visible_child_name("room_view");
- }
- _ => (),
- }
-
- if deck
- .get_adjacent_child(libhandy::NavigationDirection::Back)
- .is_some()
- {
- deck.navigate(libhandy::NavigationDirection::Back);
- }
- }
-
- fn set_state_room(&self, headerbar: &libhandy::HeaderBar) {
- for ch in headerbar.get_children().iter() {
- ch.show();
- }
-
- self.ui.sventry.view.grab_focus();
-
- let msg = self
- .active_room
- .as_ref()
- .and_then(|active_room_id| self.unsent_messages.get(active_room_id))
- .cloned()
- .unwrap_or_default();
- if let Some(buffer) = self.ui.sventry.view.get_buffer() {
- buffer.set_text(&msg.0);
-
- let iter = buffer.get_iter_at_offset(msg.1);
- buffer.place_cursor(&iter);
- }
- }
-
- // WORKAROUND this is needed because NoRoom isn't a real app state
- fn set_state_no_room(&mut self, headerbar: &libhandy::HeaderBar) {
- for ch in headerbar.get_children().iter() {
- ch.hide();
-
- // Select new active room in the sidebar
- self.ui.roomlist.unselect();
- }
- self.active_room = None;
- self.clear_tmp_msgs();
- }
}
diff --git a/fractal-gtk/src/meson.build b/fractal-gtk/src/meson.build
index 5f1d687b..d10bc490 100644
--- a/fractal-gtk/src/meson.build
+++ b/fractal-gtk/src/meson.build
@@ -108,6 +108,7 @@ app_sources = files(
'ui/notify.rs',
'ui/room_settings.rs',
'ui/start_chat.rs',
+ 'ui/state.rs',
'ui/user.rs',
'util/i18n.rs',
'util/mod.rs',
diff --git a/fractal-gtk/src/ui/mod.rs b/fractal-gtk/src/ui/mod.rs
index d4599e32..21caf751 100644
--- a/fractal-gtk/src/ui/mod.rs
+++ b/fractal-gtk/src/ui/mod.rs
@@ -17,6 +17,7 @@ pub mod member;
pub mod notify;
pub mod room_settings;
pub mod start_chat;
+pub mod state;
pub mod user;
pub struct UI {
diff --git a/fractal-gtk/src/ui/state.rs b/fractal-gtk/src/ui/state.rs
new file mode 100644
index 00000000..a03da58b
--- /dev/null
+++ b/fractal-gtk/src/ui/state.rs
@@ -0,0 +1,106 @@
+use super::UI;
+use crate::actions::AppState;
+use gio::prelude::*;
+use gtk::prelude::*;
+use libhandy::prelude::*;
+
+impl UI {
+ pub fn set_deck_state(&self, view: Option<&str>, state: AppState) {
+ let deck = self
+ .builder
+ .get_object::<libhandy::Deck>("main_deck")
+ .expect("Could not find main_deck in ui file");
+ let stack = self
+ .builder
+ .get_object::<gtk::Stack>("subview_stack")
+ .expect("Could not find subview_stack in ui file");
+ let app = gio::Application::get_default().unwrap();
+
+ let global_back = app.lookup_action("back");
+
+ let direction = match state {
+ AppState::Room | AppState::NoRoom => libhandy::NavigationDirection::Back,
+ _ => libhandy::NavigationDirection::Forward,
+ };
+
+ if let Some(v) = view {
+ stack.set_visible_child_name(v);
+ }
+
+ if deck.get_adjacent_child(direction).is_some() {
+ deck.navigate(direction);
+ if direction == libhandy::NavigationDirection::Forward {
+ // Disable global back while in a subview
+ global_back.map(|a| a.set_property("enabled", &false));
+ }
+ }
+ }
+
+ pub fn set_stack_state(&self, state: &str) {
+ self.builder
+ .get_object::<gtk::Stack>("main_content_stack")
+ .expect("Can't find main_content_stack in ui file.")
+ .set_visible_child_name(state);
+ }
+
+ pub fn set_chat_state(&mut self, msg: Option<(&str, i32)>) {
+ let deck = self
+ .builder
+ .get_object::<libhandy::Deck>("main_deck")
+ .expect("Could not find main_deck in ui file");
+ let stack = self
+ .builder
+ .get_object::<gtk::Stack>("room_view_stack")
+ .expect("Can't find room_view_stack in ui file.");
+ let headerbar = self
+ .builder
+ .get_object::<libhandy::HeaderBar>("room_header_bar")
+ .expect("Can't find room_header_bar in ui file.");
+
+ match msg {
+ None => {
+ self.set_state_no_room(&headerbar);
+ self.leaflet.navigate(libhandy::NavigationDirection::Back);
+ stack.set_visible_child_name("noroom");
+ }
+ Some((msg_text, msg_number)) => {
+ self.set_state_room(&headerbar, msg_text, msg_number);
+ self.leaflet
+ .navigate(libhandy::NavigationDirection::Forward);
+ stack.set_visible_child_name("room_view");
+ }
+ }
+
+ if deck
+ .get_adjacent_child(libhandy::NavigationDirection::Back)
+ .is_some()
+ {
+ deck.navigate(libhandy::NavigationDirection::Back);
+ }
+ }
+
+ fn set_state_room(&self, headerbar: &libhandy::HeaderBar, msg_text: &str, msg_number: i32) {
+ for ch in headerbar.get_children().iter() {
+ ch.show();
+ }
+
+ self.sventry.view.grab_focus();
+
+ if let Some(buffer) = self.sventry.view.get_buffer() {
+ buffer.set_text(msg_text);
+
+ let iter = buffer.get_iter_at_offset(msg_number);
+ buffer.place_cursor(&iter);
+ }
+ }
+
+ // WORKAROUND this is needed because NoRoom isn't a real app state
+ fn set_state_no_room(&mut self, headerbar: &libhandy::HeaderBar) {
+ for ch in headerbar.get_children().iter() {
+ ch.hide();
+
+ // Select new active room in the sidebar
+ self.roomlist.unselect();
+ }
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]