def create_documents_submenu(self, menu): recent_manager = gtk.recent_manager_get_default() chooser_menu = gtk.RecentChooserMenu(recent_manager) recent_item = self.append_menu_item(menu, _("Recent Documents"), "document-open-recent", None) recent_item.set_submenu(chooser_menu) def set_sensitivity_recent_menu(widget=None): recent_item.set_sensitive(recent_manager.props.size > 0) recent_manager.connect("changed", set_sensitivity_recent_menu) set_sensitivity_recent_menu() def open_recent_document(widget): self.open_uri(widget.get_current_uri()) chooser_menu.connect("item-activated", open_recent_document) chooser_menu.append(gtk.SeparatorMenuItem()) item = self.append_menu_item( chooser_menu, _("Clear Recent Documents"), "gtk-clear", _("Clear all items from the recent documents list")) clear_dialog = self.ClearRecentDocumentsDialog( self.applet, recent_manager.purge_items) def purge_items_cb(widget): clear_dialog.show_all() clear_dialog.deiconify() item.connect("activate", purge_items_cb)
def _get_recent_menu(self, limit=None, recent_menu=None): """Return a recent file menu.""" if recent_menu is None: recent_menu = gtk.RecentChooserMenu(self.app.recent_manager) filter_ = gtk.RecentFilter() filter_.add_mime_type("text/x-sql") recent_menu.add_filter(filter_) recent_menu.set_filter(filter_) recent_menu.set_show_not_found(False) recent_menu.set_sort_type(gtk.RECENT_SORT_MRU) recent_menu.connect("item-activated", self.on_recent_item_activated) if limit is not None: recent_menu.set_limit(limit) return recent_menu
def createRecentMenu(): """purge nonexistant (NA moved) items""" for i in recentmanager.get_items(): if str(i.get_applications()[0]) == 'gnoduino': file = urlparse.urlparse(i.get_uri()).path if os.path.exists(file) is False: recentmanager.remove_item(i.get_uri()) menuRecent = gtk.RecentChooserMenu(recentmanager) menuRecent.set_limit(10) menuRecent.set_sort_type(gtk.RECENT_SORT_MRU) filter = gtk.RecentFilter() filter.add_application("gnoduino") menuRecent.set_filter(filter) mi = gtk.MenuItem(_("Open Recent"), use_underline=True) mi.set_submenu(menuRecent) gui.get_object("filemenu").insert(mi, 2) menuRecent.connect("item_activated", recentMenuActivated)
def __init__(self, no_dialog=False): self.settings = EventCore() self.gui_is_active = False # during initialization any dialog (e.g. "Unit change") is not allowed # we set the final value later self.no_dialog = True self._batch_queue = [] self._undo_states = [] self.gui = gtk.Builder() gtk_build_file = get_ui_file_location(GTKBUILD_FILE) if gtk_build_file is None: gtk.main_quit() self.gui.add_from_file(gtk_build_file) if pycam.Utils.get_platform() == pycam.Utils.PLATFORM_WINDOWS: gtkrc_file = get_ui_file_location(GTKRC_FILE_WINDOWS) if gtkrc_file: gtk.rc_add_default_file(gtkrc_file) gtk.rc_reparse_all_for_settings(gtk.settings_get_default(), True) self.window = self.gui.get_object("ProjectWindow") self.settings.set("main_window", self.window) # show stock items on buttons # increase the initial width of the window (due to hidden elements) self.window.set_default_size(400, -1) # initialize the RecentManager (TODO: check for Windows) if False and pycam.Utils.get_platform( ) == pycam.Utils.PLATFORM_WINDOWS: # The pyinstaller binary for Windows fails mysteriously when trying # to display the stock item. # Error message: Gtk:ERROR:gtkrecentmanager.c:1942:get_icon_fallback: assertion failed: (retval != NULL) self.recent_manager = None else: try: self.recent_manager = gtk.recent_manager_get_default() except AttributeError: # GTK 2.12.1 seems to have problems with "RecentManager" on # Windows. Sadly this is the version, that is shipped with the # "appunti" GTK packages for Windows (April 2010). # see http://www.daa.com.au/pipermail/pygtk/2009-May/017052.html self.recent_manager = None # file loading self.last_dirname = None self.last_task_settings_uri = None self.last_model_uri = None # define callbacks and accelerator keys for the menu actions for objname, callback, data, accel_key in ( ("LoadTaskSettings", self.load_task_settings_file, None, "<Control>t"), ("SaveTaskSettings", self.save_task_settings_file, lambda: self.last_task_settings_uri, None), ("SaveAsTaskSettings", self.save_task_settings_file, None, None), ("OpenModel", self.load_model_file, None, "<Control>o"), ("Quit", self.destroy, None, "<Control>q"), ("GeneralSettings", self.toggle_preferences_window, None, "<Control>p"), ("UndoButton", self._restore_undo_state, None, "<Control>z"), ("HelpUserManual", self.show_help, "User_Manual", "F1"), ("HelpIntroduction", self.show_help, "Introduction", None), ("HelpSupportedFormats", self.show_help, "SupportedFormats", None), ("HelpModelTransformations", self.show_help, "ModelTransformations", None), ("HelpToolTypes", self.show_help, "ToolTypes", None), ("HelpProcessSettings", self.show_help, "ProcessSettings", None), ("HelpBoundsSettings", self.show_help, "BoundsSettings", None), ("HelpTaskSetup", self.show_help, "TaskSetup", None), ("HelpGCodeExport", self.show_help, "GCodeExport", None), ("HelpTouchOff", self.show_help, "TouchOff", None), ("HelpSimulation", self.show_help, "Simulation", None), ("Help3DView", self.show_help, "3D_View", None), ("HelpServerMode", self.show_help, "ServerMode", None), ("HelpCommandLine", self.show_help, "CommandlineExamples", None), ("HelpHotkeys", self.show_help, "KeyboardShortcuts", None), ("ProjectWebsite", self.show_help, "http://pycam.sourceforge.net", None), ("DevelopmentBlog", self.show_help, "http://fab.senselab.org/pycam", None), ("Forum", self.show_help, "http://sourceforge.net/projects/pycam/forums", None), ("BugTracker", self.show_help, "http://sourceforge.net/tracker/?group_id=237831&atid=1104176", None), ("FeatureRequest", self.show_help, "http://sourceforge.net/tracker/?group_id=237831&atid=1104179", None)): item = self.gui.get_object(objname) action = "activate" if data is None: item.connect(action, callback) else: item.connect(action, callback, data) if accel_key: key, mod = gtk.accelerator_parse(accel_key) accel_path = "<pycam>/%s" % objname item.set_accel_path(accel_path) gtk.accel_map_change_entry(accel_path, key, mod, True) # LinkButton does not work on Windows: https://bugzilla.gnome.org/show_bug.cgi?id=617874 if pycam.Utils.get_platform() == pycam.Utils.PLATFORM_WINDOWS: def open_url(widget, data=None): webbrowser.open(widget.get_uri()) gtk.link_button_set_uri_hook(open_url) # no undo is allowed at the beginning self.gui.get_object("UndoButton").set_sensitive(False) self.settings.register_event("model-change-before", self._store_undo_state) self.settings.register_event( "model-change-after", lambda: self.settings.emit_event("visual-item-updated")) # set the availability of ODE self.enable_ode_control = self.gui.get_object("SettingEnableODE") self.settings.add_item("enable_ode", self.enable_ode_control.get_active, self.enable_ode_control.set_active) self.settings.register_event("parallel-processing-changed", self.update_ode_settings) # configure drag-n-drop for config files and models self.settings.set("configure-drag-drop-func", self.configure_drag_and_drop) self.settings.get("configure-drag-drop-func")(self.window) # other events self.window.connect("destroy", self.destroy) self.window.connect("delete-event", self.destroy) # the settings window self.gui.get_object("CloseSettingsWindow").connect( "clicked", self.toggle_preferences_window, False) self.gui.get_object("ResetPreferencesButton").connect( "clicked", self.reset_preferences) self.preferences_window = self.gui.get_object("GeneralSettingsWindow") self.preferences_window.connect("delete-event", self.toggle_preferences_window, False) self._preferences_window_position = None self._preferences_window_visible = False # "about" window self.about_window = self.gui.get_object("AboutWindow") self.about_window.set_version(VERSION) self.gui.get_object("About").connect("activate", self.toggle_about_window, True) # we assume, that the last child of the window is the "close" button # TODO: fix this ugly hack! self.gui.get_object("AboutWindowButtons").get_children()[-1].connect( "clicked", self.toggle_about_window, False) self.about_window.connect("delete-event", self.toggle_about_window, False) # menu bar uimanager = gtk.UIManager() self.settings.set("gtk-uimanager", uimanager) self._accel_group = uimanager.get_accel_group() # send a "delete" event on "CTRL-w" for every window def handle_window_close(accel_group, window, *args): window.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)) self._accel_group.connect_group(ord('w'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_LOCKED, handle_window_close) self.settings.add_item("gtk-accel-group", lambda: self._accel_group) for obj in self.gui.get_objects(): if isinstance(obj, gtk.Window): obj.add_accel_group(self._accel_group) # preferences tab preferences_book = self.gui.get_object("PreferencesNotebook") def clear_preferences(): for child in preferences_book.get_children(): preferences_book.remove(child) def add_preferences_item(item, name): preferences_book.append_page(item, gtk.Label(name)) self.settings.register_ui_section("preferences", add_preferences_item, clear_preferences) for obj_name, label, priority in (("GeneralSettingsPrefTab", "General", -50), ("ProgramsPrefTab", "Programs", 50)): obj = self.gui.get_object(obj_name) obj.unparent() self.settings.register_ui("preferences", label, obj, priority) # general preferences general_prefs = self.gui.get_object("GeneralPreferencesBox") def clear_general_prefs(): for item in general_prefs.get_children(): general_prefs.remove(item) def add_general_prefs_item(item, name): general_prefs.pack_start(item, expand=False, padding=3) self.settings.register_ui_section("preferences_general", add_general_prefs_item, clear_general_prefs) for obj_name, priority in (("SettingEnableODE", 10), ("TaskSettingsDefaultFileBox", 30)): obj = self.gui.get_object(obj_name) obj.unparent() self.settings.register_ui("preferences_general", None, obj, priority) # set defaults self.cutter = None # add some dummies - to be implemented later ... self.settings.add_item("cutter", lambda: self.cutter) main_tab = self.gui.get_object("MainTabs") def clear_main_tab(): while main_tab.get_n_pages() > 0: main_tab.remove_page(0) def add_main_tab_item(item, name): main_tab.append_page(item, gtk.Label(name)) # TODO: move these to plugins, as well self.settings.register_ui_section("main", add_main_tab_item, clear_main_tab) main_window = self.gui.get_object("WindowBox") def clear_main_window(): main_window.foreach(lambda x: main_window.remove(x)) def add_main_window_item(item, name, **extra_args): # some widgets may want to override the defaults args = {"expand": False, "fill": False} args.update(extra_args) main_window.pack_start(item, **args) main_tab.unparent() self.settings.register_ui_section("main_window", add_main_window_item, clear_main_window) self.settings.register_ui("main_window", "Tabs", main_tab, -20, args_dict={ "expand": True, "fill": True }) # autoload task settings file on startup autoload_enable = self.gui.get_object("AutoLoadTaskFile") autoload_box = self.gui.get_object("StartupTaskFileBox") autoload_source = self.gui.get_object("StartupTaskFile") # TODO: fix the extension filter #for one_filter in get_filters_from_list(FILTER_CONFIG): # autoload_source.add_filter(one_filter) # autoload_source.set_filter(one_filter) def get_autoload_task_file(autoload_source=autoload_source): if autoload_enable.get_active(): return autoload_source.get_filename() else: return "" def set_autoload_task_file(filename): if filename: autoload_enable.set_active(True) autoload_box.show() autoload_source.set_filename(filename) else: autoload_enable.set_active(False) autoload_box.hide() autoload_source.unselect_all() def autoload_enable_switched(widget, box): if not widget.get_active(): set_autoload_task_file(None) else: autoload_box.show() autoload_enable.connect("toggled", autoload_enable_switched, autoload_box) self.settings.add_item("default_task_settings_file", get_autoload_task_file, set_autoload_task_file) def disable_gui(): self.menubar.set_sensitive(False) main_tab.set_sensitive(False) def enable_gui(): self.menubar.set_sensitive(True) main_tab.set_sensitive(True) self.settings.register_event("gui-disable", disable_gui) self.settings.register_event("gui-enable", enable_gui) # configure locations of external programs for auto_control_name, location_control_name, browse_button, key in ( ("ExternalProgramInkscapeAuto", "ExternalProgramInkscapeControl", "ExternalProgramInkscapeBrowse", "inkscape"), ("ExternalProgramPstoeditAuto", "ExternalProgramPstoeditControl", "ExternalProgramPstoeditBrowse", "pstoedit")): self.gui.get_object(auto_control_name).connect( "clicked", self._locate_external_program, key) location_control = self.gui.get_object(location_control_name) self.settings.add_item("external_program_%s" % key, location_control.get_text, location_control.set_text) self.gui.get_object(browse_button).connect( "clicked", self._browse_external_program_location, key) # set the icons (in different sizes) for all windows gtk.window_set_default_icon_list(*get_icons_pixbuffers()) # load menu data gtk_menu_file = get_ui_file_location(GTKMENU_FILE) if gtk_menu_file is None: gtk.main_quit() uimanager.add_ui_from_file(gtk_menu_file) # make the actions defined in the GTKBUILD file available in the menu actiongroup = gtk.ActionGroup("menubar") for action in [ action for action in self.gui.get_objects() if isinstance(action, gtk.Action) ]: actiongroup.add_action(action) # the "pos" parameter is optional since 2.12 - we can remove it later uimanager.insert_action_group(actiongroup, pos=-1) # the "recent files" sub-menu if not self.recent_manager is None: recent_files_menu = gtk.RecentChooserMenu(self.recent_manager) recent_files_menu.set_name("RecentFilesMenu") recent_menu_filter = gtk.RecentFilter() case_converter = pycam.Utils.get_case_insensitive_file_pattern for filter_name, patterns in FILTER_MODEL: if not isinstance(patterns, (list, set, tuple)): patterns = [patterns] # convert it into a mutable list (instead of set/tuple) patterns = list(patterns) for index in range(len(patterns)): patterns[index] = case_converter(patterns[index]) for pattern in patterns: recent_menu_filter.add_pattern(pattern) recent_files_menu.add_filter(recent_menu_filter) recent_files_menu.set_show_numbers(True) # non-local files (without "file://") are not supported. yet recent_files_menu.set_local_only(False) # most recent files to the top recent_files_menu.set_sort_type(gtk.RECENT_SORT_MRU) # show only ten files recent_files_menu.set_limit(10) uimanager.get_widget("/MenuBar/FileMenu/OpenRecentModelMenu")\ .set_submenu(recent_files_menu) recent_files_menu.connect("item-activated", self.load_recent_model_file) else: self.gui.get_object("OpenRecentModel").set_visible(False) # load the menubar and connect functions to its items self.menubar = uimanager.get_widget("/MenuBar") # dict of all merge-ids menu_merges = {} def clear_menu(menu_key): for merge in menu_merges.get(menu_key, []): uimanager.remove_ui(merge) def append_menu_item(menu_key, base_path, widget, name): merge_id = uimanager.new_merge_id() if widget: action_group = widget.props.action_group if not action_group in uimanager.get_action_groups(): uimanager.insert_action_group(action_group, -1) widget_name = widget.get_name() item_type = gtk.UI_MANAGER_MENUITEM else: widget_name = name item_type = gtk.UI_MANAGER_SEPARATOR uimanager.add_ui(merge_id, base_path, name, widget_name, item_type, False) if not menu_key in menu_merges: menu_merges[menu_key] = [] menu_merges[menu_key].append(merge_id) def get_menu_funcs(menu_key, base_path): append_func = lambda widget, name: \ append_menu_item(menu_key, base_path, widget, name) clear_func = lambda: clear_menu(menu_key) return append_func, clear_func for ui_name, base_path in (("view_menu", "/MenuBar/ViewMenu"), ("file_menu", "/MenuBar/FileMenu"), ("edit_menu", "/MenuBar/EditMenu"), ("export_menu", "/MenuBar/FileMenu/ExportMenu")): append_func, clear_func = get_menu_funcs(ui_name, base_path) self.settings.register_ui_section(ui_name, append_func, clear_func) self.settings.register_ui("file_menu", "Quit", self.gui.get_object("Quit"), 100) self.settings.register_ui("file_menu", "QuitSeparator", None, 95) self.settings.register_ui("main_window", "Main", self.menubar, -100) # initialize plugins self.plugin_manager = pycam.Plugins.PluginManager(core=self.settings) self.plugin_manager.import_plugins() # some more initialization self.reset_preferences() # TODO: preferences are not loaded until the new format is stable #self.load_preferences() #self.load_task_settings() self.settings.register_event("notify-file-saved", self.add_to_recent_file_list) self.settings.register_event("notify-file-opened", self.add_to_recent_file_list) # fallback - in case of a failure when opening a model file model = pycam.Importers.TestModel.get_test_model() self.settings.get("models").add_model(model, "Tiny pyramid") # Without this "gkt.main_iteration" loop the task settings file # control would not be updated in time. while gtk.events_pending(): gtk.main_iteration() autoload_task_filename = self.settings.get( "default_task_settings_file") if autoload_task_filename: self.open_task_settings_file(autoload_task_filename) self.update_all_controls() self.no_dialog = no_dialog if not self.no_dialog: # register a logging handler for displaying error messages pycam.Utils.log.add_gtk_gui(self.window, logging.ERROR) self.window.show()
from translate.storage import factory import gtk rf = gtk.RecentFilter() for name, extensions, mimetypes in factory.supported_files(): if extensions: for extension in extensions: if extension in ("txt"): continue rf.add_pattern("*.%s" % extension) for compress_extension in factory.decompressclass.keys(): rf.add_pattern("*.%s.%s" % (extension, compress_extension)) if mimetypes: for mimetype in mimetypes: rf.add_mime_type(mimetype) for app in ("virtaal", "poedit", "kbabel", "lokalize", "gtranslator"): rf.add_application(app) rm = gtk.recent_manager_get_default() rc = gtk.RecentChooserMenu() # For now we don't handle non-local files yet rc.set_local_only(True) rc.set_show_not_found(False) rc.set_show_numbers(True) rc.set_show_tips(True) rc.set_sort_type(gtk.RECENT_SORT_MRU) rc.add_filter(rf) rc.set_limit(15)
def create_ui(self): self.globalActionGroup = gtk.ActionGroup('WindowActions') self.globalActionGroup.add_actions([ ('FileMenu', None, '_File'), ('Open', gtk.STOCK_OPEN, '_Open', '<control>O', 'Open a file', self.file_open_cb), ('OpenRecent', None, '_Recently opened files...'), ('Quit', gtk.STOCK_QUIT, '_Quit', '<control>Q', 'Quit application', self.file_quit_cb), ('EditMenu', None, '_Edit'), ('HelpMenu', None, '_Help'), ('About', None, '_About', None, 'About application', self.help_about_cb), ]) self.openFileActionGroup = gtk.ActionGroup('FileActions') self.openFileActionGroup.add_actions([ ('Save', gtk.STOCK_SAVE, '_Save', '<control>S', 'Save file', self.file_save_cb), ('Play', None, '_Play', '<control>P', 'Play score', self.play_cb), ]) self.openFileActionGroup.set_sensitive(False) self.editPitchedActionGroup = gtk.ActionGroup('EditPitchedNoteActions') self.editPitchedActionGroup.add_actions([ ('OctaveUp', None, 'Octave _up', '<control>plus', 'Change note one octave up', self.octave_up_cb), ('OctaveDown', None, 'Octave _down', '<control>minus', 'Change note one octave down', self.octave_down_cb) ]) self.editPitchedActionGroup.set_sensitive(False) self.ui = gtk.UIManager() self.ui.insert_action_group(self.globalActionGroup, 0) self.ui.insert_action_group(self.editPitchedActionGroup, 0) self.ui.insert_action_group(self.openFileActionGroup, 0) self.ui.add_ui_from_string(""" <ui> <menubar name='Menubar'> <menu action='FileMenu'> <menuitem action='Open'/> <menuitem action='OpenRecent'/> <menuitem action='Save'/> <menuitem action='Play'/> <separator/> <menuitem action='Quit'/> </menu> <menu action='EditMenu'> <menuitem action='OctaveUp'/> <menuitem action='OctaveDown'/> </menu> <menu action='HelpMenu'> <menuitem action='About'/> </menu> </menubar> <toolbar name='Toolbar'> <toolitem action='Open'/> <toolitem action='Play'/> <separator/> <toolitem action='Quit'/> </toolbar> </ui>""") me = gtk.RecentChooserMenu() me.set_show_not_found(False) me.set_show_numbers(True) me.connect("item-activated", self.open_recent_cb) self.ui.get_widget('/Menubar/FileMenu/OpenRecent').set_submenu(me) self.add_accel_group(self.ui.get_accel_group())
def __init__(self, main): super(Toolbar, self).__init__(False, 1) self.main = main self.toolbox = self self.main_tb = gtk.Toolbar() self.main_tb.set_style(gtk.TOOLBAR_ICONS) # New KB button self.new_tb = gtk.ToolButton(gtk.STOCK_NEW) self.new_tb.set_tooltip_text('Create new KB') self.new_tb.connect("clicked", self._miau) self.main_tb.insert(self.new_tb, 0) self.new_tb.set_sensitive(False) # Load KB button self.load_tb = gtk.MenuToolButton(gtk.STOCK_OPEN) self.load_tb.set_tooltip_text('Load KB') self.load_tb.connect("clicked", self.load_kb) self.main_tb.insert(self.load_tb, 1) # Rcent files menu self.manager = gtk.recent_manager_get_default() self.recent_menu = gtk.RecentChooserMenu(self.manager) filter = gtk.RecentFilter() filter.add_pattern("*.kb") self.recent_menu.add_filter(filter) self.load_tb.set_menu(self.recent_menu) self.load_tb.set_arrow_tooltip_text('Recent opened KB') self.recent_menu.connect('item-activated', self.recent_kb) # Save KB button self.save_tb = gtk.ToolButton(gtk.STOCK_SAVE) self.save_tb.set_tooltip_text('Save current KB') self.save_tb.connect("clicked", self.save_kb) self.main_tb.insert(self.save_tb, 2) # Import button self.import_tb = gtk.ToolButton(gtk.STOCK_CONVERT) self.import_tb.set_tooltip_text('Import Nmap/CSV file') self.import_tb.connect("clicked", self.import_scan) self.main_tb.insert(self.import_tb, 3) # Editor button self.edit_tb = gtk.ToolButton(gtk.STOCK_EDIT) self.edit_tb.set_tooltip_text('Open editor') self.edit_tb.connect("clicked", self.load_editor) self.main_tb.insert(self.edit_tb, 4) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 5) # Proxy button self.proxy_tb = gtk.ToolButton(gtk.STOCK_CONNECT) self.proxy_tb.set_tooltip_text('Start TCP proxy') self.proxy_tb.connect("clicked", self._miau) self.proxy_tb.set_sensitive(False) self.main_tb.insert(self.proxy_tb, 6) # Web server button self.wserver_tb = gtk.ToolButton(gtk.STOCK_CONVERT) self.wserver_tb.set_tooltip_text('Run web server') self.wserver_tb.connect("clicked", self._miau) self.wserver_tb.set_sensitive(False) self.main_tb.insert(self.wserver_tb, 7) # Sniffer button self.sniffer_tb = gtk.ToolButton(gtk.STOCK_NETWORK) self.sniffer_tb.set_tooltip_text('Open network sniffer') self.sniffer_tb.connect("clicked", self.run_sniffer) self.main_tb.insert(self.sniffer_tb, 8) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 9) # Scapy button self.scapy_tb = gtk.ToolButton(gtk.STOCK_MEDIA_PLAY) self.scapy_tb.set_tooltip_text('Start Scapy') self.scapy_tb.connect("clicked", self.show_term) self.main_tb.insert(self.scapy_tb, 10) self.scapy_logo = gtk.Image() self.scapy_logo.set_from_file('lib' + os.sep + 'ui' + os.sep + 'data' + os.sep + 'python-icon.png') self.scapy_tb.set_icon_widget(self.scapy_logo) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 11) # Add target button self.add_tb = gtk.ToolButton(gtk.STOCK_ADD) self.add_tb.set_tooltip_text('Add a new target') self.add_tb.connect("clicked", self.add_target) self.main_tb.insert(self.add_tb, 12) # Preferences button self.prefs_tb = gtk.ToolButton(gtk.STOCK_PREFERENCES) self.prefs_tb.set_tooltip_text('Open preferences dialog') self.prefs_tb.connect("clicked", self.show_pref) self.main_tb.insert(self.prefs_tb, 13) # Log button self.log_tb = gtk.ToggleToolButton(gtk.STOCK_LEAVE_FULLSCREEN) self.log_tb.set_tooltip_text('Show/Hide Log panel') self.log_tb.connect("toggled", self.show_log) self.main_tb.insert(self.log_tb, 14) # KB button self.kb_tb = gtk.ToggleToolButton(gtk.STOCK_LEAVE_FULLSCREEN) self.kb_tb.set_tooltip_text('Show/Hide KB panel') self.kb_tb.connect("toggled", self.show_kb) self.main_tb.insert(self.kb_tb, 15) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 16) # Report button self.report_tb = gtk.ToolButton(gtk.STOCK_INDEX) self.report_tb.set_tooltip_text('Show KB report') self.report_tb.connect("clicked", self.report) self.main_tb.insert(self.report_tb, 17) # Exit button self.exit_tb = gtk.ToolButton(gtk.STOCK_QUIT) self.exit_tb.connect("clicked", self._bye) self.exit_tb.set_tooltip_text('Have a nice day ;-)') self.main_tb.insert(self.exit_tb, 18) # Separator self.sep = gtk.SeparatorToolItem() self.sep.set_expand(True) self.sep.set_draw(False) self.main_tb.insert(self.sep, 19) # About button self.about_tb = gtk.ToolButton(gtk.STOCK_ABOUT) self.about_tb.connect("clicked", self.create_about_dialog) self.about_tb.set_tooltip_text('About Inguma') self.main_tb.insert(self.about_tb, 20) # Throbber self.throbber = throbber.Throbber() self.throbber_tb = gtk.ToolItem() self.throbber_tb.add(self.throbber) self.main_tb.insert(self.throbber_tb, 21) self.toolbox.pack_start(self.main_tb, True, True) self.show_all()
def __init__(self): """initialise a new puzzle""" #Set the environment variables and default display settings self.local_path = os.path.realpath(os.path.dirname(sys.argv[0])) self.gladefile = os.path.join(self.local_path, 'assets', "findthatword.glade") self.show_title = True self.show_grid = True self.show_words = True self.show_solution = True #Initialise the Glade GUI environment self.widget_tree = gtk.glade.XML(self.gladefile, "MainWindow") self.widget_tree.signal_autoconnect(self) self.main_window = self.widget_tree.get_widget("MainWindow") #Draw the icon. Unofortunately, not all operating systems can accept SVGs if os.name == 'posix': icon_file = os.path.join(self.local_path, 'assets', "ftw_small.svg") self.main_window.set_icon_from_file(icon_file) else: icon_file = os.path.join(self.local_path, 'assets' "ftw_small.ico") self.main_window.set_icon_from_file(icon_file) #Disable printing support on Windows - the GTK page setup dialogue doesn't #work so the printed puzzle is incorrectly scaled to the page if os.name == 'nt' or os.name == 'ce': self.widget_tree.get_widget("PrintIcon").hide() self.widget_tree.get_widget("FilePageSetupMenuItem").hide() self.widget_tree.get_widget("FilePrintMenuItem").hide() self.widget_tree.get_widget("separatormenuitem2").hide() #Setup the Recent Files menu if the modules are available recent_widget = self.widget_tree.get_widget("FileRecentMenuItem") if RECENT_CHOOSER: recent_manager = gtk.recent_manager_get_default() recent_chooser = gtk.RecentChooserMenu(recent_manager) recent_filter = gtk.RecentFilter() recent_filter.add_pattern("*.ftw") recent_chooser.add_filter(recent_filter) recent_chooser.set_show_not_found(False) recent_chooser.connect("item-activated", self.on_RecentChooser_activate) recent_widget.set_submenu(recent_chooser) else: recent_widget.hide() #Create a permanent reference to frequently used widgets self.new_word_entry_widget = self.widget_tree.get_widget( "NewWordEntry") self.new_description_entry_widget = self.widget_tree.get_widget( "NewDescriptionEntry") self.words_view_widget = self.widget_tree.get_widget("WordsView") #Initialise the WordsView widget for i in range(0, 2): column = gtk.TreeViewColumn("Word", gtk.CellRendererText(), text=i) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self.words_view_widget.append_column(column) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) self.words_list = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) self.words_view_widget.set_model(self.words_list) self.words_view_widget_selection = self.words_view_widget.get_selection( ) #Manually connect signals where Glade provides no options self.widget_tree.get_widget("NarrativeEntry").get_buffer().connect( "changed", self.on_NarrativeWidget_changed) self.words_view_widget_selection.connect( 'changed', self.on_WordsListWidgetSelection_changed) #Initialise print settings self.print_settings = None self.print_settings = gtk.PrintSettings() self.page_setup = gtk.PageSetup() #Create and display a new puzzle self.dirty = False #Let's celelebrate being Welsh if datetime.date.today().month == 3 and datetime.date.today().day == 1: self.st_davids_day = True else: self.st_davids_day = False self.new_puzzle() #Find the name of a file passed on the command line if len(sys.argv) >= 2: self.load_file(sys.argv[len(sys.argv) - 1], "Filename")
def __init__(self, core, main): super(TopButtons,self).__init__(False, 1) self.main = main self.uicore = core self.toolbox = self self.dependency_check = self.main.dependency_check self.img_path = os.path.dirname(__file__) + os.sep + 'data' + os.sep self.options_dict = {'Hexadecimal':'x', 'String':'s', 'String no case':'i', 'Regexp':'r', 'Unicode':'u', 'Unicode no case':'U'} self.main_tb = gtk.Toolbar() self.main_tb.set_style(gtk.TOOLBAR_ICONS) # New file button self.new_tb = gtk.MenuToolButton(gtk.STOCK_NEW) self.new_tb.set_label("New") self.new_tb.set_tooltip_text('Open new file') self.new_tb.connect("clicked", self.new_file) self.main_tb.insert(self.new_tb, 0) # Rcent files menu self.manager = gtk.recent_manager_get_default() self.recent_menu = gtk.RecentChooserMenu(self.manager) self.new_tb.set_menu(self.recent_menu) self.new_tb.set_arrow_tooltip_text('Recent opened files') self.recent_menu.connect('item-activated', self.recent_kb) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 1) # PDF Streams search self.streams_tb = gtk.ToolButton(gtk.STOCK_INDEX) self.streams_tb.set_tooltip_text('Find PDF streams') self.streams_tb.connect("clicked", self.search_pdfstreams) self.streams_tb.set_sensitive(False) self.main_tb.insert(self.streams_tb, 2) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 3) # URL related buttons i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'response-headers.png') scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) self.urls = gtk.MenuToolButton(i, 'URL') #self.urls.set_icon_widget(i) self.urls.set_tooltip_text('URL plugins') self.urls_menu = gtk.Menu() i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'response-headers.png') scaled_buf = pixbuf.scale_simple(16,16,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) item = gtk.ImageMenuItem('Search for URL') item.set_image(i) item.connect("activate", self.show_urls) self.urls_menu.append(item) i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'response-body.png') scaled_buf = pixbuf.scale_simple(16,16,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) item = gtk.ImageMenuItem('Check URL') item.set_image(i) item.connect("activate", self.check_urls) self.urls_menu.append(item) i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'request-body.png') scaled_buf = pixbuf.scale_simple(16,16,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) item = gtk.ImageMenuItem('Check bad URL') item.set_image(i) item.connect("activate", self.check_bad_urls) self.urls_menu.append(item) self.urls_menu.show_all() self.urls.set_menu(self.urls_menu) self.urls_menu.show_all() self.main_tb.insert(self.urls, 4) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 5) # Visualizatin buttons self.visbin_tb = gtk.ToolButton(gtk.STOCK_ZOOM_FIT) self.visbin_tb.connect("clicked", self.execute, 'binvi') self.visbin_tb.set_tooltip_text('Visualize binary') self.visbin_tb.set_sensitive(False) self.main_tb.insert(self.visbin_tb, 6) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 7) # Binary analysis buttons self.vtotal_tb = gtk.ToolButton(gtk.STOCK_CONNECT) self.vtotal_tb.connect("clicked", self.send_to_virustotal) self.vtotal_tb.set_tooltip_text('Send to VirusTotal') self.vtotal_tb.set_sensitive(False) self.main_tb.insert(self.vtotal_tb, 8) self.threat_tb = gtk.ToolButton(gtk.STOCK_JUMP_TO) self.threat_tb.connect("clicked", self.execute, 'threat') self.threat_tb.set_tooltip_text('Search in Threat Expert') self.threat_tb.set_sensitive(False) self.main_tb.insert(self.threat_tb, 9) self.shellcode_tb = gtk.ToolButton(gtk.STOCK_FIND) self.shellcode_tb.connect("clicked", self.search_shellcode) self.shellcode_tb.set_tooltip_text('Search for Shellcode') self.shellcode_tb.set_sensitive(False) self.main_tb.insert(self.shellcode_tb, 10) # not yet working properly self.antivm_tb = gtk.ToolButton(gtk.STOCK_FIND_AND_REPLACE) self.antivm_tb.connect("clicked", self.search_antivm) self.antivm_tb.set_tooltip_text('Search for antivm tricks') self.antivm_tb.set_sensitive(False) self.main_tb.insert(self.antivm_tb, 11) self.packed_tb = gtk.ToolButton(gtk.STOCK_CONVERT) self.packed_tb.connect("clicked", self.check_packer) self.packed_tb.set_tooltip_text('Check if the PE file is packed') self.packed_tb.set_sensitive(False) self.main_tb.insert(self.packed_tb, 12) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 13) # Search components self.search_combo_tb = gtk.ToolItem() self.search_combo_align = gtk.Alignment(yalign=0.5) store = gtk.ListStore(gtk.gdk.Pixbuf, str) self.search_combo = gtk.ComboBox(store) rendererText = gtk.CellRendererText() rendererPix = gtk.CellRendererPixbuf() self.search_combo.pack_start(rendererPix, False) self.search_combo.pack_start(rendererText, True) self.search_combo.add_attribute(rendererPix, 'pixbuf', 0) self.search_combo.add_attribute(rendererText, 'text', 1) options = { 'String':gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + os.sep + 'data' + os.sep + 'icon_string_16.png'), 'String no case':gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + os.sep + 'data' + os.sep + 'icon_string_no_case_16.png'), 'Hexadecimal':gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + os.sep + 'data' + os.sep + 'icon_hexadecimal_16.png'), 'Regexp':gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + os.sep + 'data' + os.sep + 'icon_regexp_16.png') } for option in options.keys(): store.append([options[option], option]) self.search_combo.set_active(0) self.search_combo_align.add(self.search_combo) self.search_combo_tb.add(self.search_combo_align) self.main_tb.insert(self.search_combo_tb, 14) # Separator self.sep = gtk.SeparatorToolItem() self.sep.set_draw(False) self.main_tb.insert(self.sep, 15) self.search_entry_tb = gtk.ToolItem() self.search_entry = gtk.Entry(100) self.search_entry.set_text('Text to search') self.search_entry.set_icon_from_stock(1, gtk.STOCK_FIND) self.search_entry.set_icon_tooltip_text(1, 'Search') self.search_entry.connect("activate", self.search) self.search_entry.connect("icon-press", self.search) self.search_entry.connect('focus-in-event', self._clean, 'in') self.search_entry.connect('focus-out-event', self._clean, 'out') self.search_entry_tb.add(self.search_entry) self.main_tb.insert(self.search_entry_tb, 16) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 17) # Cheatsheet button self.cheatsheet_tb = gtk.ToolButton(gtk.STOCK_JUSTIFY_FILL) self.cheatsheet_tb.set_tooltip_text('Show assembler reference sheet') self.cheatsheet_tb.connect("clicked", self.create_cheatsheet_dialog) self.main_tb.insert(self.cheatsheet_tb, 18) # Separator self.sep = gtk.SeparatorToolItem() self.sep.set_expand(True) self.sep.set_draw(False) self.main_tb.insert(self.sep, 19) # Exit button self.exit_tb = gtk.ToolButton(gtk.STOCK_QUIT) self.exit_tb.set_label('Quit') self.exit_tb.connect("clicked", self.main.quit) self.exit_tb.set_tooltip_text('Have a nice day ;-)') self.main_tb.insert(self.exit_tb, 20) # Throbber self.throbber = throbber.Throbber() self.throbber_tb = gtk.ToolItem() self.throbber_tb.add(self.throbber) self.main_tb.insert(self.throbber_tb, 21) self.toolbox.pack_start(self.main_tb, True, True) self.show_all()
def __init__(self, ing): super(TopButtons,self).__init__(False, 1) self.ing = ing #self.main = self.ing.bokken self.toolbox = self self.img_path = 'lib' + os.sep + 'ui' + os.sep + 'bokken' + os.sep + 'data' + os.sep self.options_dict = {'Hexadecimal':'x', 'String':'s', 'String no case':'i', 'Regexp':'r', 'Unicode':'u', 'Unicode no case':'U'} self.main_tb = gtk.Toolbar() self.main_tb.set_style(gtk.TOOLBAR_ICONS) # New file button self.new_tb = gtk.MenuToolButton(gtk.STOCK_NEW) self.new_tb.set_tooltip_text('Open new file') self.new_tb.connect("clicked", self.new_file) self.main_tb.insert(self.new_tb, 0) # Rcent files menu self.manager = gtk.recent_manager_get_default() self.recent_menu = gtk.RecentChooserMenu(self.manager) self.new_tb.set_menu(self.recent_menu) self.new_tb.set_arrow_tooltip_text('Recent opened files') self.recent_menu.connect('item-activated', self.recent_kb) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 1) # PDF Streams search self.streams_tb = gtk.ToolButton(gtk.STOCK_INDEX) self.streams_tb.set_tooltip_text('Find PDF streams') self.streams_tb.connect("clicked", self.search_pdfstreams) self.streams_tb.set_sensitive(False) self.main_tb.insert(self.streams_tb, 2) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 3) # URL related buttons self.url_tb = gtk.ToolButton() i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'response-headers.png') scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) self.url_tb.set_icon_widget(i) self.url_tb.set_tooltip_text('URL') self.url_tb.connect("clicked", self.show_urls) self.url_tb.set_sensitive(False) self.main_tb.insert(self.url_tb, 4) self.check_url_tb = gtk.ToolButton() i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'response-body.png') scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) self.check_url_tb.set_icon_widget(i) self.check_url_tb.set_tooltip_text('Check URL') self.check_url_tb.connect("clicked", self.check_urls) self.check_url_tb.set_sensitive(False) self.main_tb.insert(self.check_url_tb, 5) self.bad_url_tb = gtk.ToolButton() i = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file(self.img_path + 'request-body.png') scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) i.set_from_pixbuf(scaled_buf) self.bad_url_tb.set_icon_widget(i) self.bad_url_tb.set_tooltip_text('Check bad URL') self.bad_url_tb.connect("clicked", self.check_bad_urls) self.bad_url_tb.set_sensitive(False) self.main_tb.insert(self.bad_url_tb, 6) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 7) # Visualizatin buttons self.visbin_tb = gtk.ToolButton(gtk.STOCK_ZOOM_FIT) self.visbin_tb.connect("clicked", self.execute, 'binvi') self.visbin_tb.set_tooltip_text('Visualize binary') self.visbin_tb.set_sensitive(False) self.main_tb.insert(self.visbin_tb, 8) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 9) # Binary analysis buttons self.vtotal_tb = gtk.ToolButton(gtk.STOCK_CONNECT) self.vtotal_tb.connect("clicked", self.send_to_virustotal) self.vtotal_tb.set_tooltip_text('Send to VirusTotal') self.vtotal_tb.set_sensitive(False) self.main_tb.insert(self.vtotal_tb, 10) self.threat_tb = gtk.ToolButton(gtk.STOCK_JUMP_TO) self.threat_tb.connect("clicked", self.execute, 'threat') self.threat_tb.set_tooltip_text('Search in Threat Expert') self.threat_tb.set_sensitive(False) self.main_tb.insert(self.threat_tb, 11) self.shellcode_tb = gtk.ToolButton(gtk.STOCK_FIND) self.shellcode_tb.connect("clicked", self.search_shellcode) self.shellcode_tb.set_tooltip_text('Search for Shellcode') self.shellcode_tb.set_sensitive(False) self.main_tb.insert(self.shellcode_tb, 12) # not yet working properly self.antivm_tb = gtk.ToolButton(gtk.STOCK_FIND_AND_REPLACE) self.antivm_tb.connect("clicked", self.search_antivm) self.antivm_tb.set_tooltip_text('Search for antivm tricks') self.antivm_tb.set_sensitive(False) self.main_tb.insert(self.antivm_tb, 13) self.packed_tb = gtk.ToolButton(gtk.STOCK_CONVERT) self.packed_tb.connect("clicked", self.check_packer) self.packed_tb.set_tooltip_text('Check if the PE file is packed') self.packed_tb.set_sensitive(False) self.main_tb.insert(self.packed_tb, 14) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 15) # Search components self.search_tb = gtk.ToolItem() self.search_label = gtk.Label(' Search: ') self.search_tb.add(self.search_label) self.main_tb.insert(self.search_tb, 16) self.search_combo_tb = gtk.ToolItem() self.search_combo = gtk.combo_box_new_text() options = ['Hexadecimal', 'String', 'String no case', 'Regexp', 'Unicode', 'Unicode no case'] for option in options: self.search_combo.append_text(option) self.search_combo_tb.add(self.search_combo) self.main_tb.insert(self.search_combo_tb, 17) # Separator self.sep = gtk.SeparatorToolItem() self.sep.set_draw(False) self.main_tb.insert(self.sep, 18) self.search_entry_tb = gtk.ToolItem() self.search_entry = gtk.Entry(100) self.search_entry_tb.add(self.search_entry) self.main_tb.insert(self.search_entry_tb, 19) self.search_tb = gtk.ToolButton(gtk.STOCK_FIND) self.search_tb.connect("clicked", self.search) self.search_tb.set_tooltip_text('Search') self.search_tb.set_sensitive(False) self.main_tb.insert(self.search_tb, 20) # Separator self.sep = gtk.SeparatorToolItem() self.main_tb.insert(self.sep, 21) # Exit button self.exit_tb = gtk.ToolButton(gtk.STOCK_QUIT) self.exit_tb.connect("clicked", self._bye) self.exit_tb.set_tooltip_text('Have a nice day ;-)') self.main_tb.insert(self.exit_tb, 22) # Separator self.sep = gtk.SeparatorToolItem() self.sep.set_expand(True) self.sep.set_draw(False) self.main_tb.insert(self.sep, 23) # About button self.about_tb = gtk.ToolButton(gtk.STOCK_ABOUT) self.about_tb.connect("clicked", self.create_about_dialog) self.about_tb.set_tooltip_text('About Bokken') self.main_tb.insert(self.about_tb, 24) # Throbber self.throbber = throbber.Throbber() self.throbber_tb = gtk.ToolItem() self.throbber_tb.add(self.throbber) self.main_tb.insert(self.throbber_tb, 25) self.toolbox.pack_start(self.main_tb, True, True) self.show_all()