1 module declgtk.components.menu; 2 3 import declgtk.components.component; 4 import declgtk.util; 5 import declgtk.queue; 6 import declui.components.menu; 7 import gtk.Application : Application; 8 import gio.Menu; 9 import gio.MenuItem; 10 import gio.SimpleAction; 11 import gio.Application : GioApplication = Application; 12 import std.uuid; 13 14 /** 15 A GTK menubar. 16 */ 17 class GtkMenuBar : GtkComponent!Menu, IMenuBar, IApplicationProxy 18 { 19 private IApplicationProxy _application; 20 21 override Menu createInstance() 22 { 23 return new Menu(); 24 } 25 26 override void add(IMenu menu) 27 { 28 auto gtkMenu = asGtk!GtkMenu(menu); 29 gtkMenu.application = this; 30 queue(menu => menu.appendSubmenu(gtkMenu.text, gtkMenu.getWidget)); 31 } 32 33 void application(IApplicationProxy app) 34 { 35 _application = app; 36 } 37 38 override Application application() pure @nogc @safe nothrow 39 { 40 return _application.application(); 41 } 42 43 override GioApplication gioApplication() 44 { 45 return _application.gioApplication; 46 } 47 } 48 49 /** 50 A GTK menu. 51 */ 52 class GtkMenu : GtkComponent!Menu, IMenu, IApplicationProxy 53 { 54 private string _text; 55 private IApplicationProxy _application; 56 57 override Menu createInstance() 58 { 59 return new Menu(); 60 } 61 62 override string text() 63 { 64 return _text; 65 } 66 67 override void text(string text) 68 { 69 _text = text; 70 } 71 72 override void add(IMenu menu) 73 { 74 assert(0); 75 } 76 77 override void add(IMenuButton menubutton) 78 { 79 auto gtkMenuButton = menubutton.asGtk!GtkMenuButton; 80 gtkMenuButton.application = this; 81 queue((widget) 82 { 83 auto menuWidget = gtkMenuButton.getWidget(); 84 assert(menuWidget !is null, "Menu widget is null"); 85 widget.appendItem(menuWidget); 86 }); 87 } 88 89 void application(IApplicationProxy app) 90 { 91 _application = app; 92 } 93 94 override Application application() pure @nogc @safe nothrow 95 { 96 return _application.application(); 97 } 98 99 override GioApplication gioApplication() 100 { 101 return _application.gioApplication; 102 } 103 } 104 105 /** 106 A GTK menu button. 107 */ 108 class GtkMenuButton : GtkComponent!MenuItem, IMenuButton, IApplicationProxy 109 { 110 private string _text; 111 private immutable string _uuid; 112 private IApplicationProxy _application; 113 114 this() 115 { 116 _uuid = randomUUID().toString(); 117 } 118 119 override MenuItem createInstance() 120 { 121 return new MenuItem("(unnamed menubutton)", "app." ~ _uuid); 122 } 123 124 override string text() 125 { 126 return _text; 127 } 128 129 override void text(string text) 130 { 131 _text = text; 132 queue((widget) 133 { 134 widget.setLabel(text); 135 }); 136 } 137 138 override void delegate() onClick() 139 { 140 assert(0); 141 } 142 143 override void onClick(void delegate() callback) 144 { 145 queue((MenuItem widget) 146 { 147 MenuItem item = widget; 148 auto action = new SimpleAction(_uuid, null); 149 action.addOnActivate((variant, action) 150 { 151 callback(); 152 executeGtkQueue(); 153 }); 154 gioApplication.addAction(action); 155 }); 156 } 157 158 void application(IApplicationProxy app) 159 { 160 _application = app; 161 } 162 163 override Application application() 164 { 165 return _application.application; 166 } 167 168 override GioApplication gioApplication() 169 { 170 return _application.gioApplication; 171 } 172 }