Skip to content

Commit af19983

Browse files
committed
Support new mate-menus api
- Requires mate-menus 1.21.0 - Use Gobject-introspection - Migrate to python3
1 parent 80873ff commit af19983

File tree

6 files changed

+247
-174
lines changed

6 files changed

+247
-174
lines changed

Mozo/MainWindow.py

Lines changed: 67 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616
# License along with this library; if not, write to the Free Software
1717
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1818

19-
import matemenu
2019
import gi
2120
gi.require_version('Gtk', '3.0')
2221
gi.require_version('Gdk', '3.0')
22+
gi.require_version('MateMenu', '2.0')
2323
from gi.repository import GLib, Gio
2424
from gi.repository import Gtk, Gdk, GdkPixbuf
25+
from gi.repository import MateMenu
2526
import cgi
2627
import os
2728
import gettext
@@ -40,7 +41,6 @@
4041
from Mozo import util
4142

4243
class MainWindow:
43-
timer = None
4444
#hack to make editing menu properties work
4545
allow_update = True
4646
#drag-and-drop stuff
@@ -77,40 +77,38 @@ def __init__(self, datadir, version, argv):
7777
keyval, modifier = Gtk.accelerator_parse('F1')
7878
accelgroup.connect(keyval, modifier, Gtk.AccelFlags.VISIBLE, self.on_help_button_clicked)
7979
self.tree.get_object('mainwindow').add_accel_group(accelgroup)
80+
self.main_window = self.tree.get_object('mainwindow')
8081

8182
def run(self):
8283
self.loadMenus()
83-
self.editor.applications.tree.add_monitor(self.menuChanged, None)
84-
self.editor.settings.tree.add_monitor(self.menuChanged, None)
84+
self.editor.applications.tree.connect("changed", self.menuChanged)
85+
self.editor.settings.tree.connect("changed", self.menuChanged)
8586
self.tree.get_object('mainwindow').show_all()
8687
Gtk.main()
8788

8889
def menuChanged(self, *a):
89-
if self.timer:
90-
GLib.Source.remove(self.timer)
91-
self.timer = None
92-
self.timer = GLib.timeout_add(3, self.loadUpdates)
90+
self.loadUpdates()
9391

9492
def loadUpdates(self):
9593
if not self.allow_update:
96-
self.timer = None
9794
return False
9895
menu_tree = self.tree.get_object('menu_tree')
9996
item_tree = self.tree.get_object('item_tree')
10097
items, iter = item_tree.get_selection().get_selected()
10198
update_items = False
102-
item_id, separator_path = None, None
99+
update_type = None
100+
item_id = None
103101
if iter:
104102
update_items = True
105-
if items[iter][3].get_type() == matemenu.TYPE_DIRECTORY:
103+
if isinstance(items[iter][3], MateMenu.TreeDirectory):
106104
item_id = os.path.split(items[iter][3].get_desktop_file_path())[1]
107-
update_items = True
108-
elif items[iter][3].get_type() == matemenu.TYPE_ENTRY:
105+
update_type = MateMenu.TreeItemType.DIRECTORY
106+
elif isinstance(items[iter][3], MateMenu.TreeEntry):
109107
item_id = items[iter][3].get_desktop_file_id()
110-
update_items = True
111-
elif items[iter][3].get_type() == matemenu.TYPE_SEPARATOR:
112-
item_id = items.get_path(iter).to_string()
113-
update_items = True
108+
update_type = MateMenu.TreeItemType.ENTRY
109+
elif isinstance(items[iter][3], MateMenu.TreeSeparator):
110+
item_id = items.get_path(iter)
111+
update_type = MateMenu.TreeItemType.SEPARATOR
114112
menus, iter = menu_tree.get_selection().get_selected()
115113
update_menus = False
116114
menu_id = None
@@ -132,12 +130,13 @@ def loadUpdates(self):
132130
i = 0
133131
for item in item_tree.get_model():
134132
found = False
135-
if item[3].get_type() == matemenu.TYPE_ENTRY and item[3].get_desktop_file_id() == item_id:
136-
found = True
137-
if item[3].get_type() == matemenu.TYPE_DIRECTORY and item[3].get_desktop_file_path():
138-
if os.path.split(item[3].get_desktop_file_path())[1] == item_id:
133+
if update_type != MateMenu.TreeItemType.SEPARATOR:
134+
if isinstance (item[3], MateMenu.TreeEntry) and item[3].get_desktop_file_id() == item_id:
139135
found = True
140-
if item[3].get_type() == matemenu.TYPE_SEPARATOR:
136+
if isinstance (item[3], MateMenu.TreeDirectory) and item[3].get_desktop_file_path() and update_type == MateMenu.TreeItemType.DIRECTORY:
137+
if os.path.split(item[3].get_desktop_file_path())[1] == item_id:
138+
found = True
139+
if isinstance(item[3], MateMenu.TreeSeparator):
141140
if not isinstance(item_id, tuple):
142141
#we may not skip the increment via "continue"
143142
i += 1
@@ -155,7 +154,6 @@ def loadUpdates(self):
155154
self.on_item_tree_cursor_changed(item_tree)
156155
break
157156
i += 1
158-
self.timer = None
159157
return False
160158

161159
def findMenu(self, menus, path, iter, menu_id):
@@ -179,43 +177,44 @@ def setupMenuTree(self):
179177
column.set_spacing(4)
180178
cell = Gtk.CellRendererPixbuf()
181179
column.pack_start(cell, False)
182-
column.set_attributes(cell, pixbuf=0)
180+
column.add_attribute(cell, 'pixbuf', 0)
183181
cell = Gtk.CellRendererText()
184182
cell.set_fixed_size(-1, 25)
185183
column.pack_start(cell, True)
186-
column.set_attributes(cell, markup=1)
184+
column.add_attribute(cell, 'markup', 1)
187185
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
188186
menus.append_column(column)
189187
menus.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, self.dnd_menus, Gdk.DragAction.COPY)
190188
menus.enable_model_drag_dest(self.dnd_both, Gdk.DragAction.PRIVATE)
189+
menus.get_selection().set_mode(Gtk.SelectionMode.BROWSE)
191190

192191
def setupItemTree(self):
193192
items = self.tree.get_object('item_tree')
194193
column = Gtk.TreeViewColumn(_('Show'))
195194
cell = Gtk.CellRendererToggle()
196195
cell.connect('toggled', self.on_item_tree_show_toggled)
197196
column.pack_start(cell, True)
198-
column.set_attributes(cell, active=0)
197+
column.add_attribute(cell, 'active', 0)
199198
#hide toggle for separators
200199
column.set_cell_data_func(cell, self._cell_data_toggle_func)
201200
items.append_column(column)
202201
column = Gtk.TreeViewColumn(_('Item'))
203202
column.set_spacing(4)
204203
cell = Gtk.CellRendererPixbuf()
205204
column.pack_start(cell, False)
206-
column.set_attributes(cell, pixbuf=1)
205+
column.add_attribute(cell, 'pixbuf', 1)
207206
cell = Gtk.CellRendererText()
208207
cell.set_fixed_size(-1, 25)
209208
column.pack_start(cell, True)
210-
column.set_attributes(cell, markup=2)
209+
column.add_attribute(cell, 'markup', 2)
211210
items.append_column(column)
212211
self.item_store = Gtk.ListStore(bool, GdkPixbuf.Pixbuf, str, object)
213212
items.set_model(self.item_store)
214213
items.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, self.dnd_items, Gdk.DragAction.COPY)
215214
items.enable_model_drag_dest(self.dnd_items, Gdk.DragAction.PRIVATE)
216215

217216
def _cell_data_toggle_func(self, tree_column, renderer, model, treeiter, data=None):
218-
if model[treeiter][3].get_type() == matemenu.TYPE_SEPARATOR:
217+
if isinstance(model[treeiter][3], MateMenu.TreeSeparator):
219218
renderer.set_property('visible', False)
220219
else:
221220
renderer.set_property('visible', True)
@@ -254,22 +253,19 @@ def loadMenu(self, iters, parent, depth=0):
254253
def loadItems(self, menu, menu_path):
255254
self.item_store.clear()
256255
for item, show in self.editor.getItems(menu):
257-
menu_icon = None
258-
if item.get_type() == matemenu.TYPE_SEPARATOR:
256+
icon = util.getIcon(item)
257+
if isinstance(item, MateMenu.TreeSeparator):
259258
name = '---'
260-
icon = None
261-
elif item.get_type() == matemenu.TYPE_ENTRY:
259+
elif isinstance(item, MateMenu.TreeEntry):
262260
if show:
263-
name = cgi.escape(item.get_display_name())
261+
name = cgi.escape(item.get_app_info().get_display_name())
264262
else:
265-
name = '<small><i>' + cgi.escape(item.get_display_name()) + '</i></small>'
266-
icon = util.getIcon(item)
263+
name = '<small><i>' + cgi.escape(item.get_app_info().get_display_name()) + '</i></small>'
267264
else:
268265
if show:
269266
name = cgi.escape(item.get_name())
270267
else:
271268
name = '<small><i>' + cgi.escape(item.get_name()) + '</i></small>'
272-
icon = util.getIcon(item)
273269
self.item_store.append((show, icon, name, item))
274270

275271
#this is a little timeout callback to insert new items after
@@ -346,11 +342,11 @@ def on_edit_delete_activate(self, menu):
346342
if not iter:
347343
return
348344
item = items[iter][3]
349-
if item.get_type() == matemenu.TYPE_ENTRY:
345+
if isinstance(item, MateMenu.TreeEntry):
350346
self.editor.deleteItem(item)
351-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
347+
elif isinstance(item, MateMenu.TreeDirectory):
352348
self.editor.deleteMenu(item)
353-
elif item.get_type() == matemenu.TYPE_SEPARATOR:
349+
elif isinstance(item, MateMenu.TreeSeparator):
354350
self.editor.deleteSeparator(item)
355351

356352
def on_edit_revert_to_original_activate(self, menu):
@@ -359,9 +355,9 @@ def on_edit_revert_to_original_activate(self, menu):
359355
if not iter:
360356
return
361357
item = items[iter][3]
362-
if item.get_type() == matemenu.TYPE_ENTRY:
358+
if isinstance(item, MateMenu.TreeEntry):
363359
self.editor.revertItem(item)
364-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
360+
elif isinstance(item, MateMenu.TreeDirectory):
365361
self.editor.revertMenu(item)
366362

367363
def on_edit_properties_activate(self, menu):
@@ -370,13 +366,13 @@ def on_edit_properties_activate(self, menu):
370366
if not iter:
371367
return
372368
item = items[iter][3]
373-
if item.get_type() not in (matemenu.TYPE_ENTRY, matemenu.TYPE_DIRECTORY):
369+
if not isinstance(item, MateMenu.TreeEntry) and not isinstance(item, MateMenu.TreeDirectory):
374370
return
375371

376-
if item.get_type() == matemenu.TYPE_ENTRY:
372+
if isinstance(item, MateMenu.TreeEntry):
377373
file_path = os.path.join(util.getUserItemPath(), item.get_desktop_file_id())
378374
file_type = 'Item'
379-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
375+
elif isinstance(item, MateMenu.TreeDirectory):
380376
file_path = os.path.join(util.getUserDirectoryPath(), os.path.split(item.get_desktop_file_path())[1])
381377
file_type = 'Menu'
382378

@@ -391,7 +387,10 @@ def on_edit_properties_activate(self, menu):
391387
GLib.timeout_add(100, self.waitForEditProcess, process, file_path)
392388

393389
def on_menu_tree_cursor_changed(self, treeview):
394-
menus, iter = treeview.get_selection().get_selected()
390+
selection = treeview.get_selection()
391+
if selection is None:
392+
return
393+
menus, iter = selection.get_selected()
395394
if iter is None:
396395
return
397396
menu_path = menus.get_path(iter)
@@ -404,6 +403,8 @@ def on_menu_tree_cursor_changed(self, treeview):
404403
self.tree.get_object('move_up_button').set_sensitive(False)
405404
self.tree.get_object('move_down_button').set_sensitive(False)
406405
self.tree.get_object('new_separator_button').set_sensitive(False)
406+
self.tree.get_object('properties_button').set_sensitive(False)
407+
self.tree.get_object('delete_button').set_sensitive(False)
407408

408409
def on_menu_tree_drag_data_get(self, treeview, context, selection, target_id, etime):
409410
menus, iter = treeview.get_selection().get_selected()
@@ -423,12 +424,12 @@ def on_menu_tree_drag_data_received(self, treeview, context, x, y, selection, in
423424
return False
424425
item = self.drag_data
425426
new_parent = menus[path][2]
426-
if item.get_type() == matemenu.TYPE_ENTRY:
427+
if isinstance(item, MateMenu.TreeEntry):
427428
self.editor.copyItem(item, new_parent)
428-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
429+
elif isinstance(item, MateMenu.TreeDirectory):
429430
if not self.editor.moveMenu(item, new_parent):
430431
self.loadUpdates()
431-
elif item.get_type() == matemenu.TYPE_SEPARATOR:
432+
elif isinstance(item, MateMenu.TreeSeparator):
432433
self.editor.moveSeparator(item, new_parent)
433434
else:
434435
context.finish(False, False, etime)
@@ -437,7 +438,7 @@ def on_menu_tree_drag_data_received(self, treeview, context, x, y, selection, in
437438

438439
def on_item_tree_show_toggled(self, cell, path):
439440
item = self.item_store[path][3]
440-
if item.get_type() == matemenu.TYPE_SEPARATOR:
441+
if isinstance(item, MateMenu.TreeSeparator):
441442
return
442443
if self.item_store[path][0]:
443444
self.editor.setVisible(item, False)
@@ -446,7 +447,10 @@ def on_item_tree_show_toggled(self, cell, path):
446447
self.item_store[path][0] = not self.item_store[path][0]
447448

448449
def on_item_tree_cursor_changed(self, treeview):
449-
items, iter = treeview.get_selection().get_selected()
450+
selection = treeview.get_selection()
451+
if selection is None:
452+
return
453+
items, iter = selection.get_selected()
450454
if iter is None:
451455
return
452456

@@ -458,7 +462,7 @@ def on_item_tree_cursor_changed(self, treeview):
458462
can_revert = self.editor.canRevert(item)
459463
self.tree.get_object('edit_revert_to_original').set_sensitive(can_revert)
460464

461-
can_edit = not item.get_type() == matemenu.TYPE_SEPARATOR
465+
can_edit = not isinstance(item, MateMenu.TreeSeparator)
462466
self.tree.get_object('edit_properties').set_sensitive(can_edit)
463467
self.tree.get_object('properties_button').set_sensitive(can_edit)
464468

@@ -517,7 +521,7 @@ def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, in
517521
path, position = drop_info
518522
target = items[path][3]
519523
# move the item to the directory, if the item was dropped into it
520-
if (target.get_type() == matemenu.TYPE_DIRECTORY) and (position in types_into):
524+
if isinstance(target, MateMenu.TreeDirectory) and (position in types_into):
521525
# append the selected item to the choosen menu
522526
destination = target
523527
elif position in types_before:
@@ -530,12 +534,12 @@ def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, in
530534
else:
531535
path = (len(items) - 1,)
532536
after = items[path][3]
533-
if item.get_type() == matemenu.TYPE_ENTRY:
537+
if isinstance(item, MateMenu.TreeEntry):
534538
self.editor.moveItem(item, destination, before, after)
535-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
539+
elif isinstance(item, MateMenu.TreeDirectory):
536540
if not self.editor.moveMenu(item, destination, before, after):
537541
self.loadUpdates()
538-
elif item.get_type() == matemenu.TYPE_SEPARATOR:
542+
elif isinstance(item, MateMenu.TreeSeparator):
539543
self.editor.moveSeparator(item, destination, before, after)
540544
context.finish(True, True, etime)
541545
elif str(selection.get_target()) == 'text/plain':
@@ -587,12 +591,12 @@ def on_move_up_button_clicked(self, button):
587591
if path.get_indices()[0] == 0:
588592
return
589593
item = items[path][3]
590-
before = items[(path[0] - 1,)][3]
591-
if item.get_type() == matemenu.TYPE_ENTRY:
594+
before = items[(path.get_indices()[0] - 1,)][3]
595+
if isinstance(item, MateMenu.TreeEntry):
592596
self.editor.moveItem(item, item.get_parent(), before=before)
593-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
597+
elif isinstance(item, MateMenu.TreeDirectory):
594598
self.editor.moveMenu(item, item.get_parent(), before=before)
595-
elif item.get_type() == matemenu.TYPE_SEPARATOR:
599+
elif isinstance(item, MateMenu.TreeSeparator):
596600
self.editor.moveSeparator(item, item.get_parent(), before=before)
597601

598602
def on_move_down_button_clicked(self, button):
@@ -606,11 +610,11 @@ def on_move_down_button_clicked(self, button):
606610
return
607611
item = items[path][3]
608612
after = items[path][3]
609-
if item.get_type() == matemenu.TYPE_ENTRY:
613+
if isinstance(item, MateMenu.TreeEntry):
610614
self.editor.moveItem(item, item.get_parent(), after=after)
611-
elif item.get_type() == matemenu.TYPE_DIRECTORY:
615+
elif isinstance(item, MateMenu.TreeDirectory):
612616
self.editor.moveMenu(item, item.get_parent(), after=after)
613-
elif item.get_type() == matemenu.TYPE_SEPARATOR:
617+
elif isinstance(item, MateMenu.TreeSeparator):
614618
self.editor.moveSeparator(item, item.get_parent(), after=after)
615619

616620
def on_mainwindow_undo(self, accelgroup, window, keyval, modifier):

0 commit comments

Comments
 (0)