From 3d85922fcc3e64b2425ff27f1ab97199a12b3a59 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Mon, 30 Aug 2021 12:33:45 -0700 Subject: [PATCH] Split code into method --- src/status_menu.rs | 56 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/status_menu.rs b/src/status_menu.rs index 58174817..78c14fd3 100644 --- a/src/status_menu.rs +++ b/src/status_menu.rs @@ -77,32 +77,8 @@ impl StatusMenu { let menu = item.menu().unwrap(); // XXX unwrap? let layout = menu.get_layout(0, -1, &[]).await?.1; - menu.connect_layout_updated(clone!(@weak obj => move |_revision, parent| { - let mut menus = obj.inner().menus.borrow_mut(); - - if let Some(Menu { box_, children }) = menus.remove(&parent) { - let mut next_child = box_.first_child(); - while let Some(child) = next_child { - next_child = child.next_sibling(); - box_.remove(&child); - } - - fn remove_child_menus(menus: &mut HashMap, children: Vec) { - for i in children { - if let Some(menu) = menus.remove(&i) { - remove_child_menus(menus, menu.children); - } - } - } - remove_child_menus(&mut menus, children); - - glib::MainContext::default().spawn_local(clone!(@weak obj => async move { - match obj.inner().dbus_menu.get_layout(parent, -1, &[]).await { - Ok((_, layout)) => obj.populate_menu(&box_, &layout), - Err(err) => eprintln!("Failed to call 'GetLayout': {}", err), - } - })); - } + menu.connect_layout_updated(clone!(@weak obj => move |revision, parent| { + obj.layout_updated(revision, parent); })); obj.inner().item.set(item); @@ -118,6 +94,34 @@ impl StatusMenu { StatusMenuInner::from_instance(self) } + fn layout_updated(&self, _revision: u32, parent: i32) { + let mut menus = self.inner().menus.borrow_mut(); + + if let Some(Menu { box_, children }) = menus.remove(&parent) { + let mut next_child = box_.first_child(); + while let Some(child) = next_child { + next_child = child.next_sibling(); + box_.remove(&child); + } + + fn remove_child_menus(menus: &mut HashMap, children: Vec) { + for i in children { + if let Some(menu) = menus.remove(&i) { + remove_child_menus(menus, menu.children); + } + } + } + remove_child_menus(&mut menus, children); + + glib::MainContext::default().spawn_local(clone!(@weak self as self_ => async move { + match self_.inner().dbus_menu.get_layout(parent, -1, &[]).await { + Ok((_, layout)) => self_.populate_menu(&box_, &layout), + Err(err) => eprintln!("Failed to call 'GetLayout': {}", err), + } + })); + } + } + fn populate_menu(&self, box_: >k4::Box, layout: &Layout) { let mut children = Vec::new();