Skip to content

Commit

Permalink
Add set_menu
Browse files Browse the repository at this point in the history
  • Loading branch information
Ngo Iok Ui committed May 6, 2021
1 parent 3915f2b commit 64f4596
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 23 deletions.
2 changes: 1 addition & 1 deletion examples/custom_menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ fn main() {
window.set_menu(Some(vec![Menu::new(
"File",
vec![
MenuItem::new("Add Todo").with_accelerators("<Primary>+"),
MenuItem::new("Add Todo").with_accelerators("<Primary>T"),
MenuItem::Separator,
MenuItem::CloseWindow,
],
Expand Down
15 changes: 14 additions & 1 deletion src/platform_impl/linux/event_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use crate::{
};

use super::{
menu,
monitor::MonitorHandle,
window::{WindowId, WindowRequest},
DeviceId,
Expand Down Expand Up @@ -468,7 +469,6 @@ impl<T: 'static> EventLoop<T> {
}
WindowRequest::Redraw => window.queue_draw(),
WindowRequest::Menu(m) => {
// TODO other MenuItem variant
match m {
MenuItem::Custom(c) => {
if let Err(e) = event_tx.send(Event::MenuEvent {
Expand Down Expand Up @@ -552,6 +552,19 @@ impl<T: 'static> EventLoop<T> {
_ => {}
}
}
WindowRequest::SetMenu((menus, accel_group, menu)) => {
for i in menu.get_children() {
menu.remove(&i);
}

if let Some(menus) = menus {
let menubar =
menu::initialize(id, menus, &window_target.p.window_requests_tx, &accel_group);
dbg!("gell");
menu.pack_start(&menubar, false, false, 0);
menu.show_all();
}
}
}
}
}
Expand Down
21 changes: 7 additions & 14 deletions src/platform_impl/linux/menu.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
use std::sync::mpsc::Sender;

use gtk::{
prelude::*, AccelFlags, AccelGroup, ApplicationWindow, Menu, MenuBar, MenuItem, Orientation,
SeparatorMenuItem,
};
use gtk::{prelude::*, AccelFlags, AccelGroup, Menu, MenuBar, MenuItem, SeparatorMenuItem};

use super::window::{WindowId, WindowRequest};
use crate::menu::{Menu as RootMenu, MenuItem as RootMenuItem};
Expand All @@ -12,22 +9,18 @@ macro_rules! menuitem {
( $description:expr, $key:expr, $accel_group:ident ) => {{
let item = MenuItem::with_label($description);
let (key, mods) = gtk::accelerator_parse($key);
item.add_accelerator("activate", &$accel_group, key, mods, AccelFlags::VISIBLE);
item.add_accelerator("activate", $accel_group, key, mods, AccelFlags::VISIBLE);
Some(item)
}};
}

pub fn initialize(
window: &ApplicationWindow,
id: WindowId,
menus: Vec<RootMenu>,
tx: Sender<(WindowId, WindowRequest)>,
accel_group: AccelGroup,
) {
let id = WindowId(window.get_id());
let vbox = gtk::Box::new(Orientation::Vertical, 0);
tx: &Sender<(WindowId, WindowRequest)>,
accel_group: &AccelGroup,
) -> MenuBar {
let menubar = MenuBar::new();
window.add(&vbox);

for menu in menus {
let title = MenuItem::with_label(&menu.title);
let submenu = Menu::new();
Expand Down Expand Up @@ -72,5 +65,5 @@ pub fn initialize(
menubar.append(&title);
}

vbox.pack_start(&menubar, false, false, 0);
menubar
}
28 changes: 21 additions & 7 deletions src/platform_impl/linux/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use std::{

use gdk::{Cursor, EventMask, WindowEdge, WindowExt, WindowState};
use gdk_pixbuf::Pixbuf;
use gtk::{prelude::*, AccelGroup, ApplicationWindow};
use gtk::{prelude::*, AccelGroup, ApplicationWindow, Orientation};

use crate::{
dpi::{PhysicalPosition, PhysicalSize, Position, Size},
Expand Down Expand Up @@ -94,6 +94,10 @@ pub struct Window {
pub(crate) window: gtk::ApplicationWindow,
/// Window requests sender
pub(crate) window_requests_tx: Sender<(WindowId, WindowRequest)>,
/// Gtk Acceleration Group
pub(crate) accel_group: AccelGroup,
/// Gtk Menu
pub(crate) menu: gtk::Box,
scale_factor: Rc<AtomicI32>,
position: Rc<(AtomicI32, AtomicI32)>,
size: Rc<(AtomicI32, AtomicI32)>,
Expand All @@ -116,8 +120,8 @@ impl Window {
.borrow_mut()
.insert(window_id);

let group = AccelGroup::new();
window.add_accel_group(&group);
let accel_group = AccelGroup::new();
window.add_accel_group(&accel_group);

// Set Width/Height & Resizable
let win_scale_factor = window.get_scale_factor();
Expand Down Expand Up @@ -193,8 +197,11 @@ impl Window {
}

// Set Menu Bar
let menu = gtk::Box::new(Orientation::Vertical, 0);
if let Some(menus) = attributes.window_menu {
menu::initialize(&window, menus, window_requests_tx.clone(), group);
window.add(&menu);
let menubar = menu::initialize(window_id, menus, &window_requests_tx, &accel_group);
menu.pack_start(&menubar, false, false, 0);
}

// Rest attributes
Expand Down Expand Up @@ -292,6 +299,8 @@ impl Window {
window_id,
window,
window_requests_tx,
accel_group,
menu,
scale_factor,
position,
size,
Expand Down Expand Up @@ -410,9 +419,13 @@ impl Window {
}
}

// TODO
pub fn set_menu(&self, _menu: Option<Vec<Menu>>) {
debug!("`Window::set_menu` is ignored on linux")
pub fn set_menu(&self, menu: Option<Vec<Menu>>) {
if let Err(e) = self.window_requests_tx.send((
self.window_id,
WindowRequest::SetMenu((menu, self.accel_group.clone(), self.menu.clone())),
)) {
log::warn!("Fail to send menu request: {}", e);
}
}

pub fn set_visible(&self, visible: bool) {
Expand Down Expand Up @@ -603,6 +616,7 @@ pub enum WindowRequest {
WireUpEvents,
Redraw,
Menu(MenuItem),
SetMenu((Option<Vec<Menu>>, AccelGroup, gtk::Box)),
}

pub fn hit_test(window: &gdk::Window, cx: f64, cy: f64) -> WindowEdge {
Expand Down

0 comments on commit 64f4596

Please sign in to comment.