Esempio n. 1
0
    def show_recent(self, sender=None):
        dialog = gtk.RecentChooserDialog(
            _("Recent Files"), self, None,
            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
             gtk.RESPONSE_OK))

        filter = gtk.RecentFilter()
        filter.set_name("playitslowly")
        filter.add_application("playitslowly")
        dialog.add_filter(filter)

        filter2 = gtk.RecentFilter()
        filter2.set_name(_("All"))
        filter2.add_mime_type("audio/*")
        dialog.add_filter(filter2)

        dialog.set_local_only(False)

        dialog.set_filter(filter)

        if dialog.run() == gtk.RESPONSE_OK and dialog.get_current_item():
            uri = dialog.get_current_item().get_uri()
            self.filedialog.set_uri(dialog.get_current_item().get_uri())
            self.filechanged(uri=uri)
        dialog.destroy()
Esempio n. 2
0
    def __init__(self, ui, window):
        self._window = window
        self._manager = gtk.recent_manager_get_default()
        gtk.RecentChooserMenu.__init__(self, self._manager)

        self.set_sort_type(gtk.RECENT_SORT_MRU)
        self.set_show_tips(True)
        # Missing icons crash GTK on Win32
        if sys.platform == 'win32':
            self.set_show_icons(False)
            self.set_show_numbers(True)

        rfilter = gtk.RecentFilter()
        rfilter.add_pixbuf_formats()

        mimetypes, patterns = itertools.izip(constants.ZIP_FORMATS,
                                             constants.RAR_FORMATS,
                                             constants.TAR_FORMATS,
                                             constants.SZIP_FORMATS)

        for mimetype in itertools.chain.from_iterable(mimetypes):
            rfilter.add_mime_type(mimetype)

        # Win32 prefers file patterns instead of MIME types
        for pattern in itertools.chain.from_iterable(patterns):
            rfilter.add_pattern(pattern)

        self.add_filter(rfilter)
        self.connect('item_activated', self._load)
Esempio n. 3
0
    def welcome(self, action=None):
        """
        display a welcome window
        """
        page = gtk.Label()
        # welcome text
        text = """<span size="x-large" weight="bold">Welcome to odML-Editor</span>\n\nNow go ahead and <a href="#new">create a new document</a>."""
        for action in self.welcome_disabled_actions:
            self.enable_action(action, False)
        
        # display recently used files
        recent_filter = gtk.RecentFilter()
        odMLChooserDialog._setup_file_filter(recent_filter)
        files = filter(lambda i: recent_filter.filter(
            {'display_name': i.get_display_name(),
             'uri': i.get_uri(),
             'mime_type': i.get_mime_type()}),
            gtk.recent_manager_get_default().get_items())

        if files:
            text += """\n\nOr open a <b>recently used file</b>:\n"""
            text += "\n".join([u"""\u2022 <a href="%s">%s</a>""" % (i.get_uri(), i.get_display_name()) for i in files])
            
        page.set_markup(text)
        page.connect("activate-link", self.welcome_action)
        page.show()
        self.notebook.set_show_tabs(False)
        self.notebook.append_page(page)
Esempio n. 4
0
    def __create_action_group(self):
        # entry: name, stock id, label
        entries = [
            ("FileMenu", None, "_File"),
            ("EditMenu", None, "_Edit"),
            ("AddMenu", gtk.STOCK_ADD),
            ("HelpMenu", gtk.STOCK_HELP),
        ]

        for (key, val) in self.__class__.__dict__.items():
            if hasattr(val, "stock_id"):
                entries.append(
                    (val.name, val.stock_id, val.label, val.accelerator,
                     val.tooltip, getattr(self, key)))

        recent_action = gtk.RecentAction(name="OpenRecent",
                                         label="Open Recent",
                                         tooltip="Open Recent Files",
                                         stock_id=gtk.STOCK_OPEN)
        recent_action.connect("item-activated", self.open_recent)

        recent_filter = gtk.RecentFilter()
        OdmlChooserDialog.setup_file_filter(recent_filter)

        recent_action.set_sort_type(gtk.RECENT_SORT_MRU)
        recent_action.add_filter(recent_filter)
        recent_action.set_show_not_found(False)

        action_group = gtk.ActionGroup(name="EditorActions")
        self.editor_actions = action_group
        action_group.add_actions(entries)
        action_group.add_action(recent_action)
        return action_group
Esempio n. 5
0
    def __init__(self, app):
        self.app = app
        #NOTE: filehandling and drawwindow are very tightly coupled
        self.save_dialog = None

        ag = app.builder.get_object('FileActions')

        rf = gtk.RecentFilter()
        rf.add_application('mypaint')
        ra = app.find_action("OpenRecent")
        ra.add_filter(rf)

        for action in ag.list_actions():
            self.app.kbm.takeover_action(action)

        self._filename = None
        self.current_file_observers = []
        self.file_opened_observers = []
        self.active_scrap_filename = None
        self.lastsavefailed = False
        self.set_recent_items()

        self.file_filters = [
            # (name, patterns)
            (_("All Recognized Formats"), ("*.ora", "*.png", "*.jpg", "*.jpeg")
             ),
            (_("OpenRaster (*.ora)"), ("*.ora", )),
            (_("PNG (*.png)"), ("*.png", )),
            (_("JPEG (*.jpg; *.jpeg)"), ("*.jpg", "*.jpeg")),
        ]
        self.saveformats = [
            # (name, extension, options)
            (_("By extension (prefer default format)"), None, {}),  # 0
            (_("OpenRaster (*.ora)"), '.ora', {}),  # 1
            (_("PNG solid with background (*.png)"), '.png', {
                'alpha': False
            }),  # 2
            (_("PNG transparent (*.png)"), '.png', {
                'alpha': True
            }),  # 3
            (_("Multiple PNG transparent (*.XXX.png)"), '.png', {
                'multifile': True
            }),  # 4
            (_("JPEG 90% quality (*.jpg; *.jpeg)"), '.jpg', {
                'quality': 90
            }),  # 5
        ]
        self.ext2saveformat = {
            ".ora": (SAVE_FORMAT_ORA, "image/openraster"),
            ".png": (SAVE_FORMAT_PNGSOLID, "image/png"),
            ".jpeg": (SAVE_FORMAT_JPEG, "image/jpeg"),
            ".jpg": (SAVE_FORMAT_JPEG, "image/jpeg"),
        }
        self.config2saveformat = {
            'openraster': SAVE_FORMAT_ORA,
            'jpeg-90%': SAVE_FORMAT_JPEG,
            'png-solid': SAVE_FORMAT_PNGSOLID,
        }
Esempio n. 6
0
    def welcome(self, action=None):
        """
        display a welcome window
        """
        page = gtk.Label()
        # welcome text
        text = """<span size="x-large" weight="bold">Welcome to odML-Editor</span>\n\n"""
        # show python 2 deprecation warning
        if not sys.version_info > (3, 0):
            text += """<span foreground="red">DeprecationWarning: Python 2 has been deprecated.\n"""
            text += """odML support for Python 2 will be dropped August 2020.</span>\n\n"""
        text += """Now go ahead and <a href="#new">create a new document</a>."""
        for curr_action in self.welcome_disabled_actions:
            self.enable_action(curr_action, False)

        # display recently used files
        recent_filter = gtk.RecentFilter()
        OdmlChooserDialog.setup_file_filter(recent_filter)

        # Now, we need to pass in a separate struct 'gtk.RecentFilterInfo',
        # for each recently used file, for the filtering process by the
        # recent_filter.filter() method. If the 'filter' return True,
        # the file is included, else not included.
        recent_odml_files = []
        max_recent_items = 12

        all_recent_files = gtk.RecentManager.get_default().get_items()
        filter_info = gtk.RecentFilterInfo()
        filter_info.contains = recent_filter.get_needed()

        for i in all_recent_files:
            if not i.exists():
                continue
            filter_info.display_name = i.get_display_name()
            filter_info.uri = i.get_uri()
            filter_info.mime_type = i.get_mime_type()
            if recent_filter.filter(filter_info):
                recent_odml_files.append(i)

        recent_odml_files.sort(key=lambda x: x.get_age())
        recent_odml_files = recent_odml_files[:max_recent_items]

        if recent_odml_files:
            text += "\n\nOr open a <b>recently used file</b>:\n"
            text += "\n".join([
                u"\u2022 <a href='%s'>%s</a>" %
                (i.get_uri(), i.get_display_name()) for i in recent_odml_files
            ])

        page.set_markup(text)
        page.connect("activate-link", self.welcome_action)
        page.show()
        self.notebook.set_show_tabs(False)
        self.notebook.append_page(page)
Esempio n. 7
0
    def __init__(self, app):
        self.app = app
        #NOTE: filehandling and drawwindow are very tightly coupled
        self.save_dialog = None

        ag = app.builder.get_object('FileActions')

        ra = gtk.RecentAction('OpenRecent', _('Open Recent'), _('Open Recent files'), None)
        ra.set_show_tips(True)
        ra.set_show_numbers(True)
        rf = gtk.RecentFilter()
        rf.add_application('mypaint')
        ra.add_filter(rf)
        ra.set_sort_type(gtk.RECENT_SORT_MRU)
        ra.connect('item-activated', self.open_recent_cb)
        ag.add_action(ra)

        for action in ag.list_actions():
            self.app.kbm.takeover_action(action)

        self._filename = None
        self.current_file_observers = []
        self.file_opened_observers = []
        self.active_scrap_filename = None
        self.lastsavefailed = False
        self.set_recent_items()

        self.file_filters = [ #(name, patterns)
        (_("All Recognized Formats"), ("*.ora", "*.png", "*.jpg", "*.jpeg")),
        (_("OpenRaster (*.ora)"), ("*.ora",)),
        (_("PNG (*.png)"), ("*.png",)),
        (_("JPEG (*.jpg; *.jpeg)"), ("*.jpg", "*.jpeg")),
        ]
        self.saveformats = [ #(name, extension, options)
        (_("By extension (prefer default format)"), None, {}), #0
        (_("OpenRaster (*.ora)"), '.ora', {}), #1
        (_("PNG solid with background (*.png)"), '.png', {'alpha': False}), #2
        (_("PNG transparent (*.png)"), '.png', {'alpha': True}), #3
        (_("Multiple PNG transparent (*.XXX.png)"), '.png', {'multifile': True}), #4
        (_("JPEG 90% quality (*.jpg; *.jpeg)"), '.jpg', {'quality': 90}), #5
        (_("One PNG image for animation frame (*-XXX.png)"), '.png', {'animation': True}), #6
        (_("Animation video (*.avi)"), '.avi', {}), #7
        ]
        self.ext2saveformat = {
        '.ora': SAVE_FORMAT_ORA, 
        '.png': SAVE_FORMAT_PNGSOLID, 
        '.jpeg': SAVE_FORMAT_JPEG, 
        '.jpg': SAVE_FORMAT_JPEG}
        self.config2saveformat = {
        'openraster': SAVE_FORMAT_ORA,
        'jpeg-90%': SAVE_FORMAT_JPEG,
        'png-solid': SAVE_FORMAT_PNGSOLID,
        }
Esempio n. 8
0
  def __create_filter(self):
		"""
		Create a filter for the recent menu.

		@param self: Reference to the RecentMenu instance.
		@type self: A RecentMenu object.

		@return: A filter for the recent menu.
		@rtype: A gtk.RecentFilter object.
		"""
		recent_filter = gtk.RecentFilter()
		recent_filter.add_application("gedit")
		return recent_filter    
Esempio n. 9
0
 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
Esempio n. 10
0
    def __init__(self, exec_path=None):
        self.recent_manager = gtk.recent_manager_get_default()
        self.recent_filter = gtk.RecentFilter()
        self.recent_filter.add_application(self.app_name)
        self._stored_comparisons = []
        # Should be argv[0] to support roundtripping in uninstalled use
        if exec_path:
            self.app_exec = os.path.abspath(exec_path)

        if not os.path.exists(self.recent_path):
            os.makedirs(self.recent_path)

        self._clean_recent_files()
        self._update_recent_files()
        self.recent_manager.connect("changed", self._update_recent_files)
Esempio n. 11
0
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)
Esempio n. 12
0
    def on_open_file(self, *args):
        dlg = gtk.FileChooserDialog(_(u"Select file"), self,
                                    gtk.FILE_CHOOSER_ACTION_OPEN,
                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                     gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        dlg.set_current_folder(self.app.config.get("editor.recent_folder", ""))
        dlg.set_select_multiple(True)
        filter = gtk.FileFilter()
        filter.set_name(_(u"All files (*)"))
        filter.add_pattern("*")
        dlg.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name(_(u"SQL files (*.sql)"))
        filter.add_pattern("*.sql")
        dlg.add_filter(filter)
        dlg.set_filter(filter)
        recent_chooser = gtk.RecentChooserWidget(self.app.recent_manager)
        filter = gtk.RecentFilter()
        filter.add_mime_type("text/x-sql")
        filter.set_name(_(u"SQL files (*.sql)"))
        recent_chooser.add_filter(filter)
        recent_chooser.set_filter(filter)
        recent_chooser.set_show_not_found(False)
        recent_chooser.set_sort_type(gtk.RECENT_SORT_MRU)
        recent_chooser.set_show_icons(True)
        recent_chooser.set_show_tips(True)

        def dlg_set_uri(chooser, dlg):
            if chooser.get_current_uri():
                dlg.set_uri(chooser.get_current_uri())

        recent_chooser.connect("selection-changed", dlg_set_uri, dlg)
        recent_chooser.connect("item-activated",
                               lambda chooser: dlg.response(gtk.RESPONSE_OK))
        exp = gtk.Expander(_(u"_Recent files:"))
        exp.add(recent_chooser)
        exp.set_use_underline(True)
        dlg.set_extra_widget(exp)
        recent_chooser.show()
        if dlg.run() == gtk.RESPONSE_OK:
            [self.editor_create(fname) for fname in dlg.get_filenames()]
            self.app.config.set("editor.recent_folder",
                                dlg.get_current_folder())
        dlg.destroy()
Esempio n. 13
0
    def __init__(self, ui, window):
        self._window = window
        self._manager = gtk.recent_manager_get_default()
        gtk.RecentChooserMenu.__init__(self, self._manager)

        self.set_sort_type(gtk.RECENT_SORT_MRU)
        self.set_show_tips(True)

        rfilter = gtk.RecentFilter()
        rfilter.add_pixbuf_formats()
        rfilter.add_mime_type('application/x-zip')
        rfilter.add_mime_type('application/zip')
        rfilter.add_mime_type('application/x-rar')
        rfilter.add_mime_type('application/x-tar')
        rfilter.add_mime_type('application/x-gzip')
        rfilter.add_mime_type('application/x-bzip2')
        rfilter.add_mime_type('application/x-cbz')
        rfilter.add_mime_type('application/x-cbr')
        rfilter.add_mime_type('application/x-cbt')
        self.add_filter(rfilter)

        self.connect('item_activated', self._load)
Esempio n. 14
0
    def __init__(self, app):
        self.app = app
        self.builder = gtk.Builder()
        self.builder.add_from_file(
            os.path.join(get_ui_dir(), "startupwizard.ui"))
        self.builder.connect_signals(self)

        self.window = self.builder.get_object("window1")

        self.recent_chooser = self.builder.get_object("recentchooser2")
        # FIXME: gtk creates a combo box with only one item, but there is no
        # simple way to hide it.
        filter = gtk.RecentFilter()
        filter.set_name(_("Projects"))
        filter.add_pattern("*.xptv")
        self.recent_chooser.add_filter(filter)

        self.app.projectManager.connect("new-project-failed",
                                        self._projectFailedCb)
        self.app.projectManager.connect("new-project-loaded",
                                        self._projectLoadedCb)
        self.app.projectManager.connect("new-project-loading",
                                        self._projectLoadingCb)
Esempio n. 15
0
    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()
Esempio n. 16
0
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.

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()
Esempio n. 17
0
    def __init__(self, app):
        self.app = app
        self.save_dialog = None

        # File filters definitions, for dialogs
        self.file_filters = [
            # (name, patterns)
            (_("All Recognized Formats"), ("*.ora", "*.png", "*.jpg", "*.jpeg")
             ),
            (_("OpenRaster (*.ora)"), ("*.ora", )),
            (_("PNG (*.png)"), ("*.png", )),
            (_("JPEG (*.jpg; *.jpeg)"), ("*.jpg", "*.jpeg")),
        ]

        # Recent filter, for the menu.
        # Better to use a regex with re.IGNORECASE than
        # .upper()==.upper() hacks since internally, filenames are
        # Unicode and capitalization rules like Turkish's dotless "i"
        # exist. One day we want all the formats GdkPixbuf can load to
        # be supported in the dialog.

        file_regex_exts = set()
        for name, patts in self.file_filters:
            for p in patts:
                e = p.replace("*.", "", 1)
                file_regex_exts.add(re.escape(e))
        file_re = r'[.](?:' + ('|'.join(file_regex_exts)) + r')$'
        logger.debug("Using regex /%s/i for filtering recent files", file_re)
        self._file_extension_regex = re.compile(file_re, re.IGNORECASE)
        rf = gtk.RecentFilter()
        rf.add_pattern('')
        # The blank-string pattern is eeded so the custom func will
        # get URIs at all, despite the needed flags below.
        rf.add_custom(func=self._recentfilter_func,
                      needed=(gtk.RecentFilterFlags.APPLICATION
                              | gtk.RecentFilterFlags.URI))
        ra = app.find_action("OpenRecent")
        ra.add_filter(rf)

        ag = app.builder.get_object('FileActions')
        for action in ag.list_actions():
            self.app.kbm.takeover_action(action)

        self._filename = None
        self.current_file_observers = []
        self.file_opened_observers = []
        self.active_scrap_filename = None
        self.lastsavefailed = False
        self._update_recent_items()

        saveformat_keys = [
            SAVE_FORMAT_ANY,
            SAVE_FORMAT_ORA,
            SAVE_FORMAT_PNGSOLID,
            SAVE_FORMAT_PNGTRANS,
            SAVE_FORMAT_PNGMULTI,
            SAVE_FORMAT_JPEG,
        ]
        saveformat_values = [
            # (name, extension, options)
            (_("By extension (prefer default format)"), None, {}),
            (_("OpenRaster (*.ora)"), '.ora', {}),
            (_("PNG solid with background (*.png)"), '.png', {
                'alpha': False
            }),
            (_("PNG transparent (*.png)"), '.png', {
                'alpha': True
            }),
            (_("Multiple PNG transparent (*.XXX.png)"), '.png', {
                'multifile': True
            }),
            (_("JPEG 90% quality (*.jpg; *.jpeg)"), '.jpg', {
                'quality': 90
            }),
        ]
        self.saveformats = OrderedDict(zip(saveformat_keys, saveformat_values))
        self.ext2saveformat = {
            ".ora": (SAVE_FORMAT_ORA, "image/openraster"),
            ".png": (SAVE_FORMAT_PNGAUTO, "image/png"),
            ".jpeg": (SAVE_FORMAT_JPEG, "image/jpeg"),
            ".jpg": (SAVE_FORMAT_JPEG, "image/jpeg"),
        }
        self.config2saveformat = {
            'openraster': SAVE_FORMAT_ORA,
            'jpeg-90%': SAVE_FORMAT_JPEG,
            'png-solid': SAVE_FORMAT_PNGSOLID,
        }

        self.__statusbar_context_id = None
Esempio n. 18
0
    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")
Esempio n. 19
0
    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()