Merge lp:~jordy-provost/terminator/custom_commands_submenus into lp:terminator/gtk3

Proposed by Jordy PROVOST
Status: Needs review
Proposed branch: lp:~jordy-provost/terminator/custom_commands_submenus
Merge into: lp:terminator/gtk3
Diff against target: 896 lines (+436/-394)
1 file modified
terminatorlib/plugins/custom_commands.py (+436/-394)
To merge this branch: bzr merge lp:~jordy-provost/terminator/custom_commands_submenus
Reviewer Review Type Date Requested Status
Alexander van Teijlingen (community) Approve
Jordy PROVOST (community) Approve
Terminator Pending
Review via email: mp+351362@code.launchpad.net

Commit message

- Permit to create submenus in a more graphical way (instead of using '/' in command names)
- Fixes for indentation coherence (first level is 4 spaces, second is 8, third is 12, etc...)
- Clean some trailing spaces, and spaces only lines

To post a comment you must log in.
Revision history for this message
Jordy PROVOST (jordy-provost) wrote :

Tested on Debian Stretch and Buster without any problem.
Indentation fix does not change the behaviour but improve readability for further changes.

review: Approve
Revision history for this message
Alexander van Teijlingen (a.vant) wrote :

Also tested on Debian [9] Stretch and working

x86_64 & python2

Good feature imo

review: Approve
Revision history for this message
Bryce Harrington (bryce) wrote :

Unfortunately the whitespace changes make it hard to spot the actual code changes, but conceptually this sounds interesting.

Revision history for this message
Jordy PROVOST (jordy-provost) wrote :

Ok, since the review is still pending, i suppose that the merge will not be accepted ?

Unfortunately, i will be forced to maintain a confidential/personnal fork of this addon (i must use it for my everyday's work as my custom commands config file contains 66 entries - and the "/" thing seems like a workaround). :'(

Unmerged revisions

1804. By Jordy PROVOST

Add graphical way to create submenus and fixes for identation coherence (4spaces)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'terminatorlib/plugins/custom_commands.py'
--- terminatorlib/plugins/custom_commands.py 2017-02-06 11:09:36 +0000
+++ terminatorlib/plugins/custom_commands.py 2018-07-26 15:00:50 +0000
@@ -7,7 +7,7 @@
77
8# Fix imports when testing this file directly8# Fix imports when testing this file directly
9if __name__ == '__main__':9if __name__ == '__main__':
10 sys.path.append( os.path.join(os.path.dirname(__file__), "../.."))10 sys.path.append( os.path.join(os.path.dirname(__file__), "../.."))
1111
12from gi.repository import Gtk12from gi.repository import Gtk
13from gi.repository import GObject13from gi.repository import GObject
@@ -16,7 +16,7 @@
16from terminatorlib.translation import _16from terminatorlib.translation import _
17from terminatorlib.util import get_config_dir, err, dbg, gerr17from terminatorlib.util import get_config_dir, err, dbg, gerr
1818
19(CC_COL_ENABLED, CC_COL_NAME, CC_COL_COMMAND) = range(0,3)19(CC_COL_ENABLED, CC_COL_NAME, CC_COL_COMMAND, CC_COL_CUSTOMSUBMENU) = range(0,4)
2020
21# Every plugin you want Terminator to load *must* be listed in 'AVAILABLE'21# Every plugin you want Terminator to load *must* be listed in 'AVAILABLE'
22AVAILABLE = ['CustomCommandsMenu']22AVAILABLE = ['CustomCommandsMenu']
@@ -28,217 +28,233 @@
28 conf_file = os.path.join(get_config_dir(),"custom_commands")28 conf_file = os.path.join(get_config_dir(),"custom_commands")
2929
30 def __init__( self):30 def __init__( self):
31 config = Config()31 config = Config()
32 sections = config.plugin_get_config(self.__class__.__name__)32 sections = config.plugin_get_config(self.__class__.__name__)
33 if not isinstance(sections, dict):33 if not isinstance(sections, dict):
34 return34 return
35 noord_cmds = []35 noord_cmds = []
36 for part in sections:36 for part in sections:
37 s = sections[part]37 s = sections[part]
38 if not (s.has_key("name") and s.has_key("command")):38 if not (s.has_key("name") and s.has_key("command")):
39 print "CustomCommandsMenu: Ignoring section %s" % s39 print "CustomCommandsMenu: Ignoring section %s" % s
40 continue40 continue
41 name = s["name"]41 name = s["name"]
42 command = s["command"]42 command = s["command"]
43 enabled = s["enabled"] and s["enabled"] or False43 enabled = s["enabled"] and s["enabled"] or False
44 if s.has_key("position"):44 try:
45 self.cmd_list[int(s["position"])] = {'enabled' : enabled,45 customsubmenu = s["submenu"]
46 'name' : name,46 except:
47 'command' : command47 customsubmenu = ''
48 }48 if s.has_key("position"):
49 else:49 self.cmd_list[int(s["position"])] = {'enabled' : enabled,
50 noord_cmds.append(
51 {'enabled' : enabled,
52 'name' : name,50 'name' : name,
53 'command' : command51 'command' : command,
54 }52 'submenu' : customsubmenu
55 )53 }
54 else:
55 noord_cmds.append(
56 {'enabled' : enabled,
57 'name' : name,
58 'command' : command,
59 'submenu' : customsubmenu
60 }
61 )
62
56 for cmd in noord_cmds:63 for cmd in noord_cmds:
57 self.cmd_list[len(self.cmd_list)] = cmd64 self.cmd_list[len(self.cmd_list)] = cmd
5865
66
59 def callback(self, menuitems, menu, terminal):67 def callback(self, menuitems, menu, terminal):
60 """Add our menu items to the menu"""68 """Add our menu items to the menu"""
61 submenus = {}
62 item = Gtk.MenuItem.new_with_mnemonic(_('_Custom Commands'))69 item = Gtk.MenuItem.new_with_mnemonic(_('_Custom Commands'))
63 menuitems.append(item)70 menuitems.append(item)
6471 pluginsubmenu = Gtk.Menu()
65 submenu = Gtk.Menu()72 item.set_submenu(pluginsubmenu)
66 item.set_submenu(submenu)
67
68 menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Preferences'))73 menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Preferences'))
69 menuitem.connect("activate", self.configure)74 menuitem.connect("activate", self.configure)
70 submenu.append(menuitem)75 pluginsubmenu.append(menuitem)
71
72 menuitem = Gtk.SeparatorMenuItem()76 menuitem = Gtk.SeparatorMenuItem()
73 submenu.append(menuitem)77 pluginsubmenu.append(menuitem)
78 try:
79 customsubmenus = sorted(set(self.cmd_list[key]['submenu'] for key in sorted(self.cmd_list.keys())))
80 except:
81 customsubmenus = []
82
83 submenus_dict = {}
84 for customsubmenustr in customsubmenus:
85 if customsubmenustr != '':
86 menuitem = Gtk.MenuItem(_(customsubmenustr))
87 pluginsubmenu.append(menuitem)
88 customsubmenu = Gtk.Menu()
89 menuitem.set_submenu(customsubmenu)
90 submenus_dict[customsubmenustr] = customsubmenu
7491
75 theme = Gtk.IconTheme.get_default()92 theme = Gtk.IconTheme.get_default()
93
76 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ] :94 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ] :
77 if not command['enabled']:95 if not command['enabled']:
78 continue96 continue
79 exe = command['command'].split(' ')[0]97 exe = command['command'].split(' ')[0]
80 iconinfo = theme.choose_icon([exe], Gtk.IconSize.MENU, Gtk.IconLookupFlags.USE_BUILTIN)98 iconinfo = theme.choose_icon([exe], Gtk.IconSize.MENU, Gtk.IconLookupFlags.USE_BUILTIN)
81 leaf_name = command['name'].split('/')[-1]99 if iconinfo:
82 branch_names = command['name'].split('/')[:-1]100 image = Gtk.Image()
83 target_submenu = submenu101 image.set_from_icon_name(exe, Gtk.IconSize.MENU)
84 parent_submenu = submenu102 menuitem = Gtk.ImageMenuItem(command['name'])
85 for idx in range(len(branch_names)):103 menuitem.set_image(image)
86 lookup_name = '/'.join(branch_names[0:idx+1])104 else:
87 target_submenu = submenus.get(lookup_name, None)105 menuitem = Gtk.MenuItem(command["name"])
88 if not target_submenu:106 terminals = terminal.terminator.get_target_terms(terminal)
89 item = Gtk.MenuItem(_(branch_names[idx]))107 menuitem.connect("activate", self._execute, {'terminals' : terminals, 'command' : command['command'] })
90 parent_submenu.append(item)108 if command['submenu'] and command['submenu'] != '':
91 target_submenu = Gtk.Menu()109 customsubmenustr = command['submenu']
92 item.set_submenu(target_submenu)110 customsubmenu = submenus_dict[customsubmenustr]
93 submenus[lookup_name] = target_submenu111 customsubmenu.append(menuitem)
94 parent_submenu = target_submenu112 else:
95 if iconinfo:113 pluginsubmenu.append(menuitem)
96 image = Gtk.Image()114
97 image.set_from_icon_name(exe, Gtk.IconSize.MENU)115
98 menuitem = Gtk.ImageMenuItem(leaf_name)
99 menuitem.set_image(image)
100 else:
101 menuitem = Gtk.MenuItem(leaf_name)
102 terminals = terminal.terminator.get_target_terms(terminal)
103 menuitem.connect("activate", self._execute, {'terminals' : terminals, 'command' : command['command'] })
104 target_submenu.append(menuitem)
105
106 def _save_config(self):116 def _save_config(self):
107 config = Config()117 config = Config()
108 config.plugin_del_config(self.__class__.__name__)118 config.plugin_del_config(self.__class__.__name__)
109 i = 0119 i = 0
110 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ] :120 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ] :
111 enabled = command['enabled']121 enabled = command['enabled']
112 name = command['name']122 name = command['name']
113 command = command['command']123 try:
114 124 submenu = command['submenu']
115 item = {}125 except:
116 item['enabled'] = enabled126 submenu = ''
117 item['name'] = name127 command = command['command']
118 item['command'] = command128
119 item['position'] = i129 item = {}
120130 item['enabled'] = enabled
121 config.plugin_set(self.__class__.__name__, name, item)131 item['name'] = name
122 i = i + 1132 item['command'] = command
123 config.save()133 item['position'] = i
134 item['submenu'] = submenu
135
136 config.plugin_set(self.__class__.__name__, name, item)
137 i = i + 1
138 config.save()
124139
125 def _execute(self, widget, data):140 def _execute(self, widget, data):
126 command = data['command']141 command = data['command']
127 if command[-1] != '\n':142 if command[-1] != '\n':
128 command = command + '\n'143 command = command + '\n'
129 for terminal in data['terminals']:144 for terminal in data['terminals']:
130 terminal.vte.feed_child(command, len(command))145 terminal.vte.feed_child(command, len(command))
131146
132 def configure(self, widget, data = None):147 def configure(self, widget, data = None):
133 ui = {}148 ui = {}
134 dbox = Gtk.Dialog(149 dbox = Gtk.Dialog(
135 _("Custom Commands Configuration"),150 _("Custom Commands Configuration"),
136 None,151 None,
137 Gtk.DialogFlags.MODAL,152 Gtk.DialogFlags.MODAL,
138 (153 (
139 _("_Cancel"), Gtk.ResponseType.REJECT,154 _("_Cancel"), Gtk.ResponseType.REJECT,
140 _("_OK"), Gtk.ResponseType.ACCEPT155 _("_OK"), Gtk.ResponseType.ACCEPT
141 )156 )
142 )157 )
143 dbox.set_transient_for(widget.get_toplevel())158 dbox.set_transient_for(widget.get_toplevel())
144159
145 icon_theme = Gtk.IconTheme.get_default()160 icon_theme = Gtk.IconTheme.get_default()
146 if icon_theme.lookup_icon('terminator-custom-commands', 48, 0):161 if icon_theme.lookup_icon('terminator-custom-commands', 48, 0):
147 dbox.set_icon_name('terminator-custom-commands')162 dbox.set_icon_name('terminator-custom-commands')
148 else:163 else:
149 dbg('Unable to load Terminator custom command icon')164 dbg('Unable to load Terminator custom command icon')
150 icon = dbox.render_icon(Gtk.STOCK_DIALOG_INFO, Gtk.IconSize.BUTTON)165 icon = dbox.render_icon(Gtk.STOCK_DIALOG_INFO, Gtk.IconSize.BUTTON)
151 dbox.set_icon(icon)166 dbox.set_icon(icon)
152167
153 store = Gtk.ListStore(bool, str, str)168 store = Gtk.ListStore(bool, str, str, str)
154169
155 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ]:170 for command in [ self.cmd_list[key] for key in sorted(self.cmd_list.keys()) ]:
156 store.append([command['enabled'], command['name'], command['command']])171 store.append([command['enabled'], command['name'], command['command'], command['submenu']])
157 172 treeview = Gtk.TreeView(store)
158 treeview = Gtk.TreeView(store)173
159 #treeview.connect("cursor-changed", self.on_cursor_changed, ui)174 selection = treeview.get_selection()
160 selection = treeview.get_selection()175 selection.set_mode(Gtk.SelectionMode.SINGLE)
161 selection.set_mode(Gtk.SelectionMode.SINGLE)176 selection.connect("changed", self.on_selection_changed, ui)
162 selection.connect("changed", self.on_selection_changed, ui)177 ui['treeview'] = treeview
163 ui['treeview'] = treeview178
164179 renderer = Gtk.CellRendererToggle()
165 renderer = Gtk.CellRendererToggle()180 renderer.connect('toggled', self.on_toggled, ui)
166 renderer.connect('toggled', self.on_toggled, ui)181 column = Gtk.TreeViewColumn(_("Enabled"), renderer, active=CC_COL_ENABLED)
167 column = Gtk.TreeViewColumn(_("Enabled"), renderer, active=CC_COL_ENABLED)182 treeview.append_column(column)
168 treeview.append_column(column)183
169184 renderer = Gtk.CellRendererText()
170 renderer = Gtk.CellRendererText()185 column = Gtk.TreeViewColumn(_("Name"), renderer, text=CC_COL_NAME)
171 column = Gtk.TreeViewColumn(_("Name"), renderer, text=CC_COL_NAME)186 treeview.append_column(column)
172 treeview.append_column(column)187
173188 renderer = Gtk.CellRendererText()
174 renderer = Gtk.CellRendererText()189 column = Gtk.TreeViewColumn(_("Submenu"), renderer, text=CC_COL_CUSTOMSUBMENU)
175 column = Gtk.TreeViewColumn(_("Command"), renderer, text=CC_COL_COMMAND)190 treeview.append_column(column)
176 treeview.append_column(column)191
177192 renderer = Gtk.CellRendererText()
178 scroll_window = Gtk.ScrolledWindow()193 column = Gtk.TreeViewColumn(_("Command"), renderer, text=CC_COL_COMMAND)
179 scroll_window.set_size_request(500, 250)194 treeview.append_column(column)
180 scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)195
181 scroll_window.add_with_viewport(treeview)196 scroll_window = Gtk.ScrolledWindow()
182197 scroll_window.set_size_request(500, 250)
183 hbox = Gtk.HBox()198 scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
184 hbox.pack_start(scroll_window, True, True, 0)199 scroll_window.add_with_viewport(treeview)
185 dbox.vbox.pack_start(hbox, True, True, 0)200
186201 hbox = Gtk.HBox()
187 button_box = Gtk.VBox()202 hbox.pack_start(scroll_window, True, True, 0)
188203 dbox.vbox.pack_start(hbox, True, True, 0)
189 button = Gtk.Button(_("Top"))204
190 button_box.pack_start(button, False, True, 0)205 button_box = Gtk.VBox()
191 button.connect("clicked", self.on_goto_top, ui) 206
192 button.set_sensitive(False)207 button = Gtk.Button(_("Top"))
193 ui['button_top'] = button208 button_box.pack_start(button, False, True, 0)
194209 button.connect("clicked", self.on_goto_top, ui)
195 button = Gtk.Button(_("Up"))210 button.set_sensitive(False)
196 button_box.pack_start(button, False, True, 0)211 ui['button_top'] = button
197 button.connect("clicked", self.on_go_up, ui)212
198 button.set_sensitive(False)213 button = Gtk.Button(_("Up"))
199 ui['button_up'] = button214 button_box.pack_start(button, False, True, 0)
200215 button.connect("clicked", self.on_go_up, ui)
201 button = Gtk.Button(_("Down"))216 button.set_sensitive(False)
202 button_box.pack_start(button, False, True, 0)217 ui['button_up'] = button
203 button.connect("clicked", self.on_go_down, ui) 218
204 button.set_sensitive(False)219 button = Gtk.Button(_("Down"))
205 ui['button_down'] = button220 button_box.pack_start(button, False, True, 0)
206221 button.connect("clicked", self.on_go_down, ui)
207 button = Gtk.Button(_("Last"))222 button.set_sensitive(False)
208 button_box.pack_start(button, False, True, 0)223 ui['button_down'] = button
209 button.connect("clicked", self.on_goto_last, ui) 224
210 button.set_sensitive(False)225 button = Gtk.Button(_("Last"))
211 ui['button_last'] = button226 button_box.pack_start(button, False, True, 0)
212227 button.connect("clicked", self.on_goto_last, ui)
213 button = Gtk.Button(_("New"))228 button.set_sensitive(False)
214 button_box.pack_start(button, False, True, 0)229 ui['button_last'] = button
215 button.connect("clicked", self.on_new, ui) 230
216 ui['button_new'] = button231 button = Gtk.Button(_("New"))
217232 button_box.pack_start(button, False, True, 0)
218 button = Gtk.Button(_("Edit"))233 button.connect("clicked", self.on_new, ui)
219 button_box.pack_start(button, False, True, 0)234 ui['button_new'] = button
220 button.set_sensitive(False)235
221 button.connect("clicked", self.on_edit, ui) 236 button = Gtk.Button(_("Edit"))
222 ui['button_edit'] = button237 button_box.pack_start(button, False, True, 0)
223238 button.set_sensitive(False)
224 button = Gtk.Button(_("Delete"))239 button.connect("clicked", self.on_edit, ui)
225 button_box.pack_start(button, False, True, 0)240 ui['button_edit'] = button
226 button.connect("clicked", self.on_delete, ui) 241
227 button.set_sensitive(False)242 button = Gtk.Button(_("Delete"))
228 ui['button_delete'] = button243 button_box.pack_start(button, False, True, 0)
229244 button.connect("clicked", self.on_delete, ui)
230245 button.set_sensitive(False)
231246 ui['button_delete'] = button
232 hbox.pack_start(button_box, False, True, 0)247
233 self.dbox = dbox248 hbox.pack_start(button_box, False, True, 0)
234 dbox.show_all()249 self.dbox = dbox
235 res = dbox.run()250 dbox.show_all()
236 if res == Gtk.ResponseType.ACCEPT:251 res = dbox.run()
237 self.update_cmd_list(store)252 if res == Gtk.ResponseType.ACCEPT:
238 self._save_config()253 self.update_cmd_list(store)
239 del(self.dbox)254 self._save_config()
240 dbox.destroy()255 del(self.dbox)
241 return256 dbox.destroy()
257 return
242258
243259
244 def update_cmd_list(self, store):260 def update_cmd_list(self, store):
@@ -246,223 +262,249 @@
246 self.cmd_list = {}262 self.cmd_list = {}
247 i=0263 i=0
248 while iter:264 while iter:
249 (enabled, name, command) = store.get(iter,265 (enabled, name, command, submenu) = store.get(iter,
250 CC_COL_ENABLED,266 CC_COL_ENABLED,
251 CC_COL_NAME,267 CC_COL_NAME,
252 CC_COL_COMMAND)268 CC_COL_COMMAND,
253 self.cmd_list[i] = {'enabled' : enabled,269 CC_COL_CUSTOMSUBMENU)
254 'name': name,270 self.cmd_list[i] = {'enabled' : enabled,
255 'command' : command}271 'name': name,
256 iter = store.iter_next(iter)272 'command' : command,
257 i = i + 1273 'submenu' : submenu}
258 274 iter = store.iter_next(iter)
275 i = i + 1
276
259277
260 def on_toggled(self, widget, path, data):278 def on_toggled(self, widget, path, data):
261 treeview = data['treeview']279 treeview = data['treeview']
262 store = treeview.get_model()280 store = treeview.get_model()
263 iter = store.get_iter(path)281 iter = store.get_iter(path)
264 (enabled, name, command) = store.get(iter,282 (enabled, name, command, submenu) = store.get(iter,
265 CC_COL_ENABLED,283 CC_COL_ENABLED,
266 CC_COL_NAME,284 CC_COL_NAME,
267 CC_COL_COMMAND285 CC_COL_COMMAND,
268 )286 CC_COL_CUSTOMSUBMENU)
269 store.set_value(iter, CC_COL_ENABLED, not enabled)287 store.set_value(iter, CC_COL_ENABLED, not enabled)
270288
271289
272 def on_selection_changed(self,selection, data=None):290 def on_selection_changed(self,selection, data=None):
273 treeview = selection.get_tree_view()291 treeview = selection.get_tree_view()
274 (model, iter) = selection.get_selected()292 (model, iter) = selection.get_selected()
275 data['button_top'].set_sensitive(iter is not None)293 data['button_top'].set_sensitive(iter is not None)
276 data['button_up'].set_sensitive(iter is not None)294 data['button_up'].set_sensitive(iter is not None)
277 data['button_down'].set_sensitive(iter is not None)295 data['button_down'].set_sensitive(iter is not None)
278 data['button_last'].set_sensitive(iter is not None)296 data['button_last'].set_sensitive(iter is not None)
279 data['button_edit'].set_sensitive(iter is not None)297 data['button_edit'].set_sensitive(iter is not None)
280 data['button_delete'].set_sensitive(iter is not None)298 data['button_delete'].set_sensitive(iter is not None)
281299
282 def _create_command_dialog(self, enabled_var = False, name_var = "", command_var = ""):300 def _create_command_dialog(self, enabled_var = False, name_var = "", command_var = "", submenu_var = ""):
283 dialog = Gtk.Dialog(301 dialog = Gtk.Dialog(
284 _("New Command"),302 _("New Command"),
285 None,303 None,
286 Gtk.DialogFlags.MODAL,304 Gtk.DialogFlags.MODAL,
287 (305 (
288 _("_Cancel"), Gtk.ResponseType.REJECT,306 Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT,
289 _("_OK"), Gtk.ResponseType.ACCEPT307 Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT
290 )308 )
291 )309 )
292 dialog.set_transient_for(self.dbox)310 dialog.set_transient_for(self.dbox)
293 table = Gtk.Table(3, 2)311 table = Gtk.Table(3, 2)
294312
295 label = Gtk.Label(label=_("Enabled:"))313 label = Gtk.Label(label=_("Enabled:"))
296 table.attach(label, 0, 1, 0, 1)314 table.attach(label, 0, 1, 0, 1)
297 enabled = Gtk.CheckButton()315 enabled = Gtk.CheckButton()
298 enabled.set_active(enabled_var)316 enabled.set_active(enabled_var)
299 table.attach(enabled, 1, 2, 0, 1)317 table.attach(enabled, 1, 2, 0, 1)
300318
301 label = Gtk.Label(label=_("Name:"))319 label = Gtk.Label(label=_("Name:"))
302 table.attach(label, 0, 1, 1, 2)320 table.attach(label, 0, 1, 1, 2)
303 name = Gtk.Entry()321 name = Gtk.Entry()
304 name.set_text(name_var)322 name.set_text(name_var)
305 table.attach(name, 1, 2, 1, 2)323 table.attach(name, 1, 2, 1, 2)
306 324
307 label = Gtk.Label(label=_("Command:"))325 label = Gtk.Label(label=_("Submenu:"))
308 table.attach(label, 0, 1, 2, 3)326 table.attach(label, 0, 1, 2, 3)
309 command = Gtk.Entry()327 submenu = Gtk.Entry()
310 command.set_text(command_var)328 submenu.set_text(submenu_var)
311 table.attach(command, 1, 2, 2, 3)329 table.attach(submenu, 1, 2, 2, 3)
312330
313 dialog.vbox.pack_start(table, True, True, 0)331 label = Gtk.Label(label=_("Command:"))
314 dialog.show_all()332 table.attach(label, 0, 1, 3, 4)
315 return (dialog,enabled,name,command)333 command = Gtk.Entry()
334 command.set_text(command_var)
335 table.attach(command, 1, 2, 3, 4)
336
337 dialog.vbox.pack_start(table, True, True, 0)
338 dialog.show_all()
339 return (dialog,enabled,name,command,submenu)
316340
317 def on_new(self, button, data):341 def on_new(self, button, data):
318 (dialog,enabled,name,command) = self._create_command_dialog()342 (dialog,enabled,name,command,submenu) = self._create_command_dialog()
319 res = dialog.run()343 res = dialog.run()
320 item = {}344 item = {}
321 if res == Gtk.ResponseType.ACCEPT:345 if res == Gtk.ResponseType.ACCEPT:
322 item['enabled'] = enabled.get_active()346 item['enabled'] = enabled.get_active()
323 item['name'] = name.get_text()347 item['name'] = name.get_text()
324 item['command'] = command.get_text()348 item['submenu'] = submenu.get_text()
325 if item['name'] == '' or item['command'] == '':349 item['command'] = command.get_text()
326 err = Gtk.MessageDialog(dialog,350 if item['name'] == '' or item['command'] == '':
327 Gtk.DialogFlags.MODAL,351 err = Gtk.MessageDialog(dialog,
328 Gtk.MessageType.ERROR,352 Gtk.DialogFlags.MODAL,
329 Gtk.ButtonsType.CLOSE,353 Gtk.MessageType.ERROR,
330 _("You need to define a name and command")354 Gtk.ButtonsType.CLOSE,
331 )355 _("You need to define a name and command")
332 err.run()356 )
333 err.destroy()357 err.run()
334 else:358 err.destroy()
335 # we have a new command359 else:
336 store = data['treeview'].get_model()360 # we have a new command
337 iter = store.get_iter_first()361 store = data['treeview'].get_model()
338 name_exist = False362 iter = store.get_iter_first()
339 while iter != None:363 name_exist = False
340 if store.get_value(iter,CC_COL_NAME) == item['name']:364 while iter != None:
341 name_exist = True365 if store.get_value(iter,CC_COL_NAME) == item['name']:
342 break366 name_exist = True
343 iter = store.iter_next(iter)367 break
344 if not name_exist:368 iter = store.iter_next(iter)
345 store.append((item['enabled'], item['name'], item['command']))369 if not name_exist:
346 else:370 store.append((item['enabled'], item['name'], item['command'], item['submenu']))
347 gerr(_("Name *%s* already exist") % item['name'])371 else:
348 dialog.destroy()372 gerr(_("Name *%s* already exist") % item['name'])
373 dialog.destroy()
374
349375
350 def on_goto_top(self, button, data):376 def on_goto_top(self, button, data):
351 treeview = data['treeview']377 treeview = data['treeview']
352 selection = treeview.get_selection()378 selection = treeview.get_selection()
353 (store, iter) = selection.get_selected()379 (store, iter) = selection.get_selected()
354 380
355 if not iter:381 if not iter:
356 return382 return
357 firstiter = store.get_iter_first()383
358 store.move_before(iter, firstiter)384 firstiter = store.get_iter_first()
385 store.move_before(iter, firstiter)
386
359387
360 def on_go_up(self, button, data):388 def on_go_up(self, button, data):
361 treeview = data['treeview']389 treeview = data['treeview']
362 selection = treeview.get_selection()390 selection = treeview.get_selection()
363 (store, iter) = selection.get_selected()391 (store, iter) = selection.get_selected()
364 392
365 if not iter:393 if not iter:
366 return394 return
367395
368 tmpiter = store.get_iter_first()396 tmpiter = store.get_iter_first()
369397
370 if(store.get_path(tmpiter) == store.get_path(iter)):398 if(store.get_path(tmpiter) == store.get_path(iter)):
371 return399 return
372400
373 while tmpiter:401 while tmpiter:
374 next = store.iter_next(tmpiter)402 next = store.iter_next(tmpiter)
375 if(store.get_path(next) == store.get_path(iter)):403
376 store.swap(iter, tmpiter)404 if(store.get_path(next) == store.get_path(iter)):
377 break405 store.swap(iter, tmpiter)
406 break
407
378 tmpiter = next408 tmpiter = next
379409
410
380 def on_go_down(self, button, data):411 def on_go_down(self, button, data):
381 treeview = data['treeview']412 treeview = data['treeview']
382 selection = treeview.get_selection()413 selection = treeview.get_selection()
383 (store, iter) = selection.get_selected()414 (store, iter) = selection.get_selected()
384 415
385 if not iter:416 if not iter:
386 return417 return
387 next = store.iter_next(iter)418 next = store.iter_next(iter)
388 if next:419 if next:
389 store.swap(iter, next)420 store.swap(iter, next)
421
390422
391 def on_goto_last(self, button, data):423 def on_goto_last(self, button, data):
392 treeview = data['treeview']424 treeview = data['treeview']
393 selection = treeview.get_selection()425 selection = treeview.get_selection()
394 (store, iter) = selection.get_selected()426 (store, iter) = selection.get_selected()
395 427
396 if not iter:428 if not iter:
397 return429 return
398 lastiter = iter430
399 tmpiter = store.get_iter_first()431 lastiter = iter
400 while tmpiter:432 tmpiter = store.get_iter_first()
401 lastiter = tmpiter433
402 tmpiter = store.iter_next(tmpiter)434 while tmpiter:
403 435 lastiter = tmpiter
404 store.move_after(iter, lastiter)436 tmpiter = store.iter_next(tmpiter)
405437
406 438 store.move_after(iter, lastiter)
439
440
407 def on_delete(self, button, data):441 def on_delete(self, button, data):
408 treeview = data['treeview']442 treeview = data['treeview']
409 selection = treeview.get_selection()443 selection = treeview.get_selection()
410 (store, iter) = selection.get_selected()444 (store, iter) = selection.get_selected()
411 if iter:445
412 store.remove(iter)446 if iter:
413 447 store.remove(iter)
414 return448
415 449 return
450
451
416 def on_edit(self, button, data):452 def on_edit(self, button, data):
417 treeview = data['treeview']453 treeview = data['treeview']
418 selection = treeview.get_selection()454 selection = treeview.get_selection()
419 (store, iter) = selection.get_selected()455 (store, iter) = selection.get_selected()
420 456
421 if not iter:457 if not iter:
422 return458 return
423 459
424 (dialog,enabled,name,command) = self._create_command_dialog(460 (dialog,enabled,name,command,submenu) = self._create_command_dialog(
425 enabled_var = store.get_value(iter, CC_COL_ENABLED),461 enabled_var = store.get_value(iter, CC_COL_ENABLED),
426 name_var = store.get_value(iter, CC_COL_NAME),462 name_var = store.get_value(iter, CC_COL_NAME),
427 command_var = store.get_value(iter, CC_COL_COMMAND)463 command_var = store.get_value(iter, CC_COL_COMMAND),
428 )464 submenu_var=store.get_value(iter, CC_COL_CUSTOMSUBMENU)
429 res = dialog.run()465 )
430 item = {}466
431 if res == Gtk.ResponseType.ACCEPT:467 res = dialog.run()
432 item['enabled'] = enabled.get_active()468 item = {}
433 item['name'] = name.get_text()469
434 item['command'] = command.get_text()470 if res == Gtk.ResponseType.ACCEPT:
435 if item['name'] == '' or item['command'] == '':471 item['enabled'] = enabled.get_active()
436 err = Gtk.MessageDialog(dialog,472 item['name'] = name.get_text()
437 Gtk.DialogFlags.MODAL,473 item['command'] = command.get_text()
438 Gtk.MessageType.ERROR,474 item['submenu'] = submenu.get_text()
439 Gtk.ButtonsType.CLOSE,475
440 _("You need to define a name and command")476 if item['name'] == '' or item['command'] == '':
441 )477 err = Gtk.MessageDialog(dialog,
442 err.run()478 Gtk.DialogFlags.MODAL,
443 err.destroy()479 Gtk.MessageType.ERROR,
444 else:480 Gtk.ButtonsType.CLOSE,
445 tmpiter = store.get_iter_first()481 _("You need to define a name and command")
446 name_exist = False482 )
447 while tmpiter != None:483 err.run()
448 if store.get_path(tmpiter) != store.get_path(iter) and store.get_value(tmpiter,CC_COL_NAME) == item['name']:484 err.destroy()
449 name_exist = True485 else:
450 break486 tmpiter = store.get_iter_first()
451 tmpiter = store.iter_next(tmpiter)487 name_exist = False
452 if not name_exist:488 while tmpiter != None:
453 store.set(iter,489 if store.get_path(tmpiter) != store.get_path(iter) and store.get_value(tmpiter,CC_COL_NAME) == item['name']:
454 CC_COL_ENABLED,item['enabled'],490 name_exist = True
455 CC_COL_NAME, item['name'],491 break
456 CC_COL_COMMAND, item['command']492 tmpiter = store.iter_next(tmpiter)
457 )493 if not name_exist:
458 else:494 store.set(iter,
459 gerr(_("Name *%s* already exist") % item['name'])495 CC_COL_ENABLED,item['enabled'],
460496 CC_COL_NAME, item['name'],
461 dialog.destroy()497 CC_COL_COMMAND, item['command'],
462 498 CC_COL_CUSTOMSUBMENU, item['submenu']
463 499 )
500 else:
501 gerr(_("Name *%s* already exist") % item['name'])
502
503 dialog.destroy()
504
505
464if __name__ == '__main__':506if __name__ == '__main__':
465 c = CustomCommandsMenu()507 c = CustomCommandsMenu()
466 c.configure(None, None)508 c.configure(None, None)
467 Gtk.main()509 Gtk.main()
468510

Subscribers

People subscribed via source and target branches

to status/vote changes: