16
16
# License along with this library; if not, write to the Free Software
17
17
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
18
19
- import matemenu
20
19
import gi
21
20
gi .require_version ('Gtk' , '3.0' )
22
21
gi .require_version ('Gdk' , '3.0' )
22
+ gi .require_version ('MateMenu' , '2.0' )
23
23
from gi .repository import GLib , Gio
24
24
from gi .repository import Gtk , Gdk , GdkPixbuf
25
+ from gi .repository import MateMenu
25
26
import cgi
26
27
import os
27
28
import gettext
40
41
from Mozo import util
41
42
42
43
class MainWindow :
43
- timer = None
44
44
#hack to make editing menu properties work
45
45
allow_update = True
46
46
#drag-and-drop stuff
@@ -77,40 +77,38 @@ def __init__(self, datadir, version, argv):
77
77
keyval , modifier = Gtk .accelerator_parse ('F1' )
78
78
accelgroup .connect (keyval , modifier , Gtk .AccelFlags .VISIBLE , self .on_help_button_clicked )
79
79
self .tree .get_object ('mainwindow' ).add_accel_group (accelgroup )
80
+ self .main_window = self .tree .get_object ('mainwindow' )
80
81
81
82
def run (self ):
82
83
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 )
85
86
self .tree .get_object ('mainwindow' ).show_all ()
86
87
Gtk .main ()
87
88
88
89
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 ()
93
91
94
92
def loadUpdates (self ):
95
93
if not self .allow_update :
96
- self .timer = None
97
94
return False
98
95
menu_tree = self .tree .get_object ('menu_tree' )
99
96
item_tree = self .tree .get_object ('item_tree' )
100
97
items , iter = item_tree .get_selection ().get_selected ()
101
98
update_items = False
102
- item_id , separator_path = None , None
99
+ update_type = None
100
+ item_id = None
103
101
if iter :
104
102
update_items = True
105
- if items [iter ][3 ]. get_type () == matemenu . TYPE_DIRECTORY :
103
+ if isinstance ( items [iter ][3 ], MateMenu . TreeDirectory ) :
106
104
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 ) :
109
107
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
114
112
menus , iter = menu_tree .get_selection ().get_selected ()
115
113
update_menus = False
116
114
menu_id = None
@@ -132,12 +130,13 @@ def loadUpdates(self):
132
130
i = 0
133
131
for item in item_tree .get_model ():
134
132
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 :
139
135
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 ):
141
140
if not isinstance (item_id , tuple ):
142
141
#we may not skip the increment via "continue"
143
142
i += 1
@@ -155,7 +154,6 @@ def loadUpdates(self):
155
154
self .on_item_tree_cursor_changed (item_tree )
156
155
break
157
156
i += 1
158
- self .timer = None
159
157
return False
160
158
161
159
def findMenu (self , menus , path , iter , menu_id ):
@@ -179,43 +177,44 @@ def setupMenuTree(self):
179
177
column .set_spacing (4 )
180
178
cell = Gtk .CellRendererPixbuf ()
181
179
column .pack_start (cell , False )
182
- column .set_attributes (cell , pixbuf = 0 )
180
+ column .add_attribute (cell , ' pixbuf' , 0 )
183
181
cell = Gtk .CellRendererText ()
184
182
cell .set_fixed_size (- 1 , 25 )
185
183
column .pack_start (cell , True )
186
- column .set_attributes (cell , markup = 1 )
184
+ column .add_attribute (cell , ' markup' , 1 )
187
185
column .set_sizing (Gtk .TreeViewColumnSizing .FIXED )
188
186
menus .append_column (column )
189
187
menus .enable_model_drag_source (Gdk .ModifierType .BUTTON1_MASK , self .dnd_menus , Gdk .DragAction .COPY )
190
188
menus .enable_model_drag_dest (self .dnd_both , Gdk .DragAction .PRIVATE )
189
+ menus .get_selection ().set_mode (Gtk .SelectionMode .BROWSE )
191
190
192
191
def setupItemTree (self ):
193
192
items = self .tree .get_object ('item_tree' )
194
193
column = Gtk .TreeViewColumn (_ ('Show' ))
195
194
cell = Gtk .CellRendererToggle ()
196
195
cell .connect ('toggled' , self .on_item_tree_show_toggled )
197
196
column .pack_start (cell , True )
198
- column .set_attributes (cell , active = 0 )
197
+ column .add_attribute (cell , ' active' , 0 )
199
198
#hide toggle for separators
200
199
column .set_cell_data_func (cell , self ._cell_data_toggle_func )
201
200
items .append_column (column )
202
201
column = Gtk .TreeViewColumn (_ ('Item' ))
203
202
column .set_spacing (4 )
204
203
cell = Gtk .CellRendererPixbuf ()
205
204
column .pack_start (cell , False )
206
- column .set_attributes (cell , pixbuf = 1 )
205
+ column .add_attribute (cell , ' pixbuf' , 1 )
207
206
cell = Gtk .CellRendererText ()
208
207
cell .set_fixed_size (- 1 , 25 )
209
208
column .pack_start (cell , True )
210
- column .set_attributes (cell , markup = 2 )
209
+ column .add_attribute (cell , ' markup' , 2 )
211
210
items .append_column (column )
212
211
self .item_store = Gtk .ListStore (bool , GdkPixbuf .Pixbuf , str , object )
213
212
items .set_model (self .item_store )
214
213
items .enable_model_drag_source (Gdk .ModifierType .BUTTON1_MASK , self .dnd_items , Gdk .DragAction .COPY )
215
214
items .enable_model_drag_dest (self .dnd_items , Gdk .DragAction .PRIVATE )
216
215
217
216
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 ) :
219
218
renderer .set_property ('visible' , False )
220
219
else :
221
220
renderer .set_property ('visible' , True )
@@ -254,22 +253,19 @@ def loadMenu(self, iters, parent, depth=0):
254
253
def loadItems (self , menu , menu_path ):
255
254
self .item_store .clear ()
256
255
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 ) :
259
258
name = '---'
260
- icon = None
261
- elif item .get_type () == matemenu .TYPE_ENTRY :
259
+ elif isinstance (item , MateMenu .TreeEntry ):
262
260
if show :
263
- name = cgi .escape (item .get_display_name ())
261
+ name = cgi .escape (item .get_app_info (). get_display_name ())
264
262
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>'
267
264
else :
268
265
if show :
269
266
name = cgi .escape (item .get_name ())
270
267
else :
271
268
name = '<small><i>' + cgi .escape (item .get_name ()) + '</i></small>'
272
- icon = util .getIcon (item )
273
269
self .item_store .append ((show , icon , name , item ))
274
270
275
271
#this is a little timeout callback to insert new items after
@@ -346,11 +342,11 @@ def on_edit_delete_activate(self, menu):
346
342
if not iter :
347
343
return
348
344
item = items [iter ][3 ]
349
- if item . get_type () == matemenu . TYPE_ENTRY :
345
+ if isinstance ( item , MateMenu . TreeEntry ) :
350
346
self .editor .deleteItem (item )
351
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
347
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
352
348
self .editor .deleteMenu (item )
353
- elif item . get_type () == matemenu . TYPE_SEPARATOR :
349
+ elif isinstance ( item , MateMenu . TreeSeparator ) :
354
350
self .editor .deleteSeparator (item )
355
351
356
352
def on_edit_revert_to_original_activate (self , menu ):
@@ -359,9 +355,9 @@ def on_edit_revert_to_original_activate(self, menu):
359
355
if not iter :
360
356
return
361
357
item = items [iter ][3 ]
362
- if item . get_type () == matemenu . TYPE_ENTRY :
358
+ if isinstance ( item , MateMenu . TreeEntry ) :
363
359
self .editor .revertItem (item )
364
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
360
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
365
361
self .editor .revertMenu (item )
366
362
367
363
def on_edit_properties_activate (self , menu ):
@@ -370,13 +366,13 @@ def on_edit_properties_activate(self, menu):
370
366
if not iter :
371
367
return
372
368
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 ):
374
370
return
375
371
376
- if item . get_type () == matemenu . TYPE_ENTRY :
372
+ if isinstance ( item , MateMenu . TreeEntry ) :
377
373
file_path = os .path .join (util .getUserItemPath (), item .get_desktop_file_id ())
378
374
file_type = 'Item'
379
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
375
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
380
376
file_path = os .path .join (util .getUserDirectoryPath (), os .path .split (item .get_desktop_file_path ())[1 ])
381
377
file_type = 'Menu'
382
378
@@ -391,7 +387,10 @@ def on_edit_properties_activate(self, menu):
391
387
GLib .timeout_add (100 , self .waitForEditProcess , process , file_path )
392
388
393
389
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 ()
395
394
if iter is None :
396
395
return
397
396
menu_path = menus .get_path (iter )
@@ -404,6 +403,8 @@ def on_menu_tree_cursor_changed(self, treeview):
404
403
self .tree .get_object ('move_up_button' ).set_sensitive (False )
405
404
self .tree .get_object ('move_down_button' ).set_sensitive (False )
406
405
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 )
407
408
408
409
def on_menu_tree_drag_data_get (self , treeview , context , selection , target_id , etime ):
409
410
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
423
424
return False
424
425
item = self .drag_data
425
426
new_parent = menus [path ][2 ]
426
- if item . get_type () == matemenu . TYPE_ENTRY :
427
+ if isinstance ( item , MateMenu . TreeEntry ) :
427
428
self .editor .copyItem (item , new_parent )
428
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
429
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
429
430
if not self .editor .moveMenu (item , new_parent ):
430
431
self .loadUpdates ()
431
- elif item . get_type () == matemenu . TYPE_SEPARATOR :
432
+ elif isinstance ( item , MateMenu . TreeSeparator ) :
432
433
self .editor .moveSeparator (item , new_parent )
433
434
else :
434
435
context .finish (False , False , etime )
@@ -437,7 +438,7 @@ def on_menu_tree_drag_data_received(self, treeview, context, x, y, selection, in
437
438
438
439
def on_item_tree_show_toggled (self , cell , path ):
439
440
item = self .item_store [path ][3 ]
440
- if item . get_type () == matemenu . TYPE_SEPARATOR :
441
+ if isinstance ( item , MateMenu . TreeSeparator ) :
441
442
return
442
443
if self .item_store [path ][0 ]:
443
444
self .editor .setVisible (item , False )
@@ -446,7 +447,10 @@ def on_item_tree_show_toggled(self, cell, path):
446
447
self .item_store [path ][0 ] = not self .item_store [path ][0 ]
447
448
448
449
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 ()
450
454
if iter is None :
451
455
return
452
456
@@ -458,7 +462,7 @@ def on_item_tree_cursor_changed(self, treeview):
458
462
can_revert = self .editor .canRevert (item )
459
463
self .tree .get_object ('edit_revert_to_original' ).set_sensitive (can_revert )
460
464
461
- can_edit = not item . get_type () == matemenu . TYPE_SEPARATOR
465
+ can_edit = not isinstance ( item , MateMenu . TreeSeparator )
462
466
self .tree .get_object ('edit_properties' ).set_sensitive (can_edit )
463
467
self .tree .get_object ('properties_button' ).set_sensitive (can_edit )
464
468
@@ -517,7 +521,7 @@ def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, in
517
521
path , position = drop_info
518
522
target = items [path ][3 ]
519
523
# 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 ):
521
525
# append the selected item to the choosen menu
522
526
destination = target
523
527
elif position in types_before :
@@ -530,12 +534,12 @@ def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, in
530
534
else :
531
535
path = (len (items ) - 1 ,)
532
536
after = items [path ][3 ]
533
- if item . get_type () == matemenu . TYPE_ENTRY :
537
+ if isinstance ( item , MateMenu . TreeEntry ) :
534
538
self .editor .moveItem (item , destination , before , after )
535
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
539
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
536
540
if not self .editor .moveMenu (item , destination , before , after ):
537
541
self .loadUpdates ()
538
- elif item . get_type () == matemenu . TYPE_SEPARATOR :
542
+ elif isinstance ( item , MateMenu . TreeSeparator ) :
539
543
self .editor .moveSeparator (item , destination , before , after )
540
544
context .finish (True , True , etime )
541
545
elif str (selection .get_target ()) == 'text/plain' :
@@ -587,12 +591,12 @@ def on_move_up_button_clicked(self, button):
587
591
if path .get_indices ()[0 ] == 0 :
588
592
return
589
593
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 ) :
592
596
self .editor .moveItem (item , item .get_parent (), before = before )
593
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
597
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
594
598
self .editor .moveMenu (item , item .get_parent (), before = before )
595
- elif item . get_type () == matemenu . TYPE_SEPARATOR :
599
+ elif isinstance ( item , MateMenu . TreeSeparator ) :
596
600
self .editor .moveSeparator (item , item .get_parent (), before = before )
597
601
598
602
def on_move_down_button_clicked (self , button ):
@@ -606,11 +610,11 @@ def on_move_down_button_clicked(self, button):
606
610
return
607
611
item = items [path ][3 ]
608
612
after = items [path ][3 ]
609
- if item . get_type () == matemenu . TYPE_ENTRY :
613
+ if isinstance ( item , MateMenu . TreeEntry ) :
610
614
self .editor .moveItem (item , item .get_parent (), after = after )
611
- elif item . get_type () == matemenu . TYPE_DIRECTORY :
615
+ elif isinstance ( item , MateMenu . TreeDirectory ) :
612
616
self .editor .moveMenu (item , item .get_parent (), after = after )
613
- elif item . get_type () == matemenu . TYPE_SEPARATOR :
617
+ elif isinstance ( item , MateMenu . TreeSeparator ) :
614
618
self .editor .moveSeparator (item , item .get_parent (), after = after )
615
619
616
620
def on_mainwindow_undo (self , accelgroup , window , keyval , modifier ):
0 commit comments