From 1a15d4bc4121bf99e0aa96b63bba0a33f632805a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 8 Sep 2026 14:10:03 -0700 Subject: [PATCH 1/3] Styles/MenuButton: fix default icon, add an example menu --- demo/Views/ControlsView.vala | 37 +++++++++++++++++++++++++++++----- lib/Styles/Gtk/MenuButton.scss | 5 ++--- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/demo/Views/ControlsView.vala b/demo/Views/ControlsView.vala index 4f7043a9d..9824de5ea 100644 --- a/demo/Views/ControlsView.vala +++ b/demo/Views/ControlsView.vala @@ -23,6 +23,32 @@ public class ControlsView : DemoPage { tooltip_text = "Gtk.ToggleButton.icon_name" }; + var reply_menuitem = new GLib.MenuItem ("Reply", null); + reply_menuitem.set_attribute_value ("verb-icon", "mail-reply-sender-symbolic"); + + var reply_all_menuitem = new GLib.MenuItem ("Reply All", null); + reply_all_menuitem.set_attribute_value ("verb-icon", "mail-reply-all-symbolic"); + + var forward_menuitem = new GLib.MenuItem ("Forward", null); + forward_menuitem.set_attribute_value ("verb-icon", "mail-forward-symbolic"); + + var button_menu = new GLib.Menu (); + button_menu.append_item (reply_menuitem); + button_menu.append_item (reply_all_menuitem); + button_menu.append_item (forward_menuitem); + + var button_section = new GLib.MenuItem.section (null, button_menu); + button_section.set_attribute_value ("display-hint", "circular-buttons"); + + var menu_model = new GLib.Menu (); + menu_model.append_item (button_section); + menu_model.append ("Move", null); + menu_model.append ("Delete", null); + + var menu_button = new Gtk.MenuButton () { + menu_model = menu_model + }; + var back_button = new Granite.BackButton ("Granite.BackButton") { halign = START }; @@ -59,6 +85,7 @@ public class ControlsView : DemoPage { var image_button_box = new Granite.Box (VERTICAL, HALF); image_button_box.append (imagebutton); image_button_box.append (toggle_imagebutton); + image_button_box.append (menu_button); image_button_box.append (destructive_imagebutton); image_button_box.append (suggested_imagebutton); @@ -135,12 +162,12 @@ public class ControlsView : DemoPage { var description_switch_item = new GLib.MenuItem (null, null); description_switch_item.set_attribute_value ("custom", "description-switch"); - var menu_model = new GLib.Menu (); - menu_model.append_item (header_item); - menu_model.append_item (switch_item); - menu_model.append_item (description_switch_item); + var header_menu_model = new GLib.Menu (); + header_menu_model.append_item (header_item); + header_menu_model.append_item (switch_item); + header_menu_model.append_item (description_switch_item); - var switchbutton_popover = new Gtk.PopoverMenu.from_model (menu_model) { + var switchbutton_popover = new Gtk.PopoverMenu.from_model (header_menu_model) { has_arrow = false }; switchbutton_popover.add_child (header_switchmodelbutton, "header"); diff --git a/lib/Styles/Gtk/MenuButton.scss b/lib/Styles/Gtk/MenuButton.scss index e32f9be93..94f82912a 100644 --- a/lib/Styles/Gtk/MenuButton.scss +++ b/lib/Styles/Gtk/MenuButton.scss @@ -1,7 +1,6 @@ menubutton { - arrow { - // Use non-arrow icon when no direction specified, assuming use case as a - // main menu button + // Assuming use case as a main menu button + > button.image-button arrow.down { -gtk-icon-source: -gtk-icontheme("open-menu-symbolic"); } } From a6d74a9d2be69dc13c13a998171cd3905c061ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Fri, 11 Sep 2026 09:15:22 -0700 Subject: [PATCH 2/3] Put switchmodelbutton in the same menu --- demo/Views/ControlsView.vala | 83 +++++++++++++++++------------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/demo/Views/ControlsView.vala b/demo/Views/ControlsView.vala index 9824de5ea..760cf6e62 100644 --- a/demo/Views/ControlsView.vala +++ b/demo/Views/ControlsView.vala @@ -32,6 +32,34 @@ public class ControlsView : DemoPage { var forward_menuitem = new GLib.MenuItem ("Forward", null); forward_menuitem.set_attribute_value ("verb-icon", "mail-forward-symbolic"); + var switchbutton_header = new Granite.HeaderLabel ("SwitchModelButton") { + margin_top = 12 + }; + + var header_switchmodelbutton = new Granite.SwitchModelButton ("As a Header"); + header_switchmodelbutton.add_css_class (Granite.HeaderLabel.Size.H4.to_string ()); + + var switchmodelbutton = new Granite.SwitchModelButton ("Default"); + + var description_switchmodelbutton = new Granite.SwitchModelButton ("With A Description") { + active = true, + description = "A description of additional affects related to the activation state of this switch" + }; + + var header_item = new GLib.MenuItem (null, null); + header_item.set_attribute_value ("custom", "header"); + + var switch_item = new GLib.MenuItem (null, null); + switch_item.set_attribute_value ("custom", "switch"); + + var description_switch_item = new GLib.MenuItem (null, null); + description_switch_item.set_attribute_value ("custom", "description-switch"); + + var switch_section = new GLib.Menu (); + switch_section.append_item (switch_item); + switch_section.append_item (description_switch_item); + switch_section.append_item (header_item); + var button_menu = new GLib.Menu (); button_menu.append_item (reply_menuitem); button_menu.append_item (reply_all_menuitem); @@ -40,15 +68,24 @@ public class ControlsView : DemoPage { var button_section = new GLib.MenuItem.section (null, button_menu); button_section.set_attribute_value ("display-hint", "circular-buttons"); + var menuitem_section = new GLib.Menu (); + menuitem_section.append ("Move", null); + menuitem_section.append ("Delete", null); + var menu_model = new GLib.Menu (); menu_model.append_item (button_section); - menu_model.append ("Move", null); - menu_model.append ("Delete", null); + menu_model.append_section ("SwitchModelButton", switch_section); + menu_model.append_section ( null, menuitem_section); var menu_button = new Gtk.MenuButton () { menu_model = menu_model }; + var menu_button_popover = (Gtk.PopoverMenu) menu_button.popover; + menu_button_popover.add_child (header_switchmodelbutton, "header"); + menu_button_popover.add_child (switchmodelbutton, "switch"); + menu_button_popover.add_child (description_switchmodelbutton, "description-switch"); + var back_button = new Granite.BackButton ("Granite.BackButton") { halign = START }; @@ -139,46 +176,6 @@ public class ControlsView : DemoPage { mode_switch.secondary_icon_tooltip_text = ("Dark background"); mode_switch.valign = Gtk.Align.CENTER; - var switchbutton_header = new Granite.HeaderLabel ("SwitchModelButton") { - margin_top = 12 - }; - - var header_switchmodelbutton = new Granite.SwitchModelButton ("Header"); - header_switchmodelbutton.add_css_class (Granite.HeaderLabel.Size.H4.to_string ()); - - var switchmodelbutton = new Granite.SwitchModelButton ("Default"); - - var description_switchmodelbutton = new Granite.SwitchModelButton ("A SwitchModelButton With A Description") { - active = true, - description = "A description of additional affects related to the activation state of this switch" - }; - - var header_item = new GLib.MenuItem (null, null); - header_item.set_attribute_value ("custom", "header"); - - var switch_item = new GLib.MenuItem (null, null); - switch_item.set_attribute_value ("custom", "switch"); - - var description_switch_item = new GLib.MenuItem (null, null); - description_switch_item.set_attribute_value ("custom", "description-switch"); - - var header_menu_model = new GLib.Menu (); - header_menu_model.append_item (header_item); - header_menu_model.append_item (switch_item); - header_menu_model.append_item (description_switch_item); - - var switchbutton_popover = new Gtk.PopoverMenu.from_model (header_menu_model) { - has_arrow = false - }; - switchbutton_popover.add_child (header_switchmodelbutton, "header"); - switchbutton_popover.add_child (switchmodelbutton, "switch"); - switchbutton_popover.add_child (description_switchmodelbutton, "description-switch"); - - var popover_button = new Gtk.MenuButton () { - direction = Gtk.ArrowType.UP - }; - popover_button.popover = switchbutton_popover; - var scale_header = new Granite.HeaderLabel ("Scale"); var hscale = new Gtk.Scale.with_range (HORIZONTAL, 0, 1, 0.01) { @@ -226,8 +223,6 @@ public class ControlsView : DemoPage { box.append (checkradio_box); box.append (mode_switch_label); box.append (mode_switch); - box.append (switchbutton_header); - box.append (popover_button); box.append (scale_header); box.append (scale_box); From c802eb37ce66f4a9c6af5f604e0543f036c44185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 17 Sep 2026 06:50:13 -0700 Subject: [PATCH 3/3] Update ControlsView.vala Co-authored-by: Leonhard --- demo/Views/ControlsView.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/Views/ControlsView.vala b/demo/Views/ControlsView.vala index 62645db39..216e0d974 100644 --- a/demo/Views/ControlsView.vala +++ b/demo/Views/ControlsView.vala @@ -75,7 +75,7 @@ public class ControlsView : DemoPage { var menu_model = new GLib.Menu (); menu_model.append_item (button_section); menu_model.append_section ("SwitchModelButton", switch_section); - menu_model.append_section ( null, menuitem_section); + menu_model.append_section (null, menuitem_section); var menu_button = new Gtk.MenuButton () { menu_model = menu_model