Esempio n. 1
0
    def finish_widget_creation(self):
        ManagedBase.finish_widget_creation(self, sel_marker_parent=self.widget)

        sash_pos_p = self.properties['sash_pos']
        if sash_pos_p.is_active():
            self.widget.SetSashPosition(sash_pos_p.get())
        else:
            sash_pos_p.set(self.widget.GetSashPosition())

        sash_gravity_p = self.properties['sash_gravity']
        if sash_gravity_p.is_active():
            self.widget.SetSashPosition(sash_gravity_p.get())

        min_pane_size_p = self.properties['min_pane_size']
        if min_pane_size_p.is_active():
            self.widget.SetMinimumPaneSize(min_pane_size_p.get())
        else:
            min_pane_size.set_value(self.widget.GetMinimumPaneSize())

        self.widget.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED,
                         self.on_sash_pos_changed)
        if self._window_1 and self._window_1.widget:
            if self.orientation == "wxSPLIT_VERTICAL":
                compat.SetToolTip(self._window_1.widget,
                                  _("Left splitter pane:\nAdd a sizer here"))
            else:
                compat.SetToolTip(self._window_1.widget,
                                  _("Top splitter pane:\nAdd a sizer here"))
        if self._window_2 and self._window_2.widget:
            if self.orientation == "wxSPLIT_VERTICAL":
                compat.SetToolTip(self._window_2.widget,
                                  _("Right splitter pane:\nAdd a sizer here"))
            else:
                compat.SetToolTip(self._window_2.widget,
                                  _("Bottom splitter pane:\nAdd a sizer here"))
Esempio n. 2
0
 def on_text(self, event):
     import re
     validation_re = re.compile(r'^[a-zA-Z_]+[\w:.0-9-]*$')
     name = event.GetString()
     OK = bool(validation_re.match(name))
     if not OK:
         self.klass.SetBackgroundColour(wx.RED)
         compat.SetToolTip(self.klass, "Class name not valid")
     else:
         #if name in [c.widget.klass for c in common.root.children or []]:
         if self.toplevel and name in self.toplevel_names:
             self.klass.SetBackgroundColour(wx.RED)
             compat.SetToolTip(
                 self.klass,
                 "Class name already in use for toplevel window")
             OK = False
         elif name in self.class_names:
             # if the class name is in use already, indicate in yellow
             self.klass.SetBackgroundColour(wx.Colour(255, 255, 0, 255))
             compat.SetToolTip(self.klass, "Class name not unique")
             if self.toplevel and name in self.toplevel_names: OK = False
         else:
             self.klass.SetBackgroundColour(
                 compat.wx_SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
             compat.SetToolTip(self.klass, "")
     self.klass.Refresh()
     self.btnOK.Enable(OK)
     event.Skip()
Esempio n. 3
0
 def _set_tooltips(self):
     # set tooltips
     for c in (self.label_6, self.label):
         compat.SetToolTip(
             c,
             "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut"
         )
     for c in (self.label_7, self.event_handler):
         compat.SetToolTip(
             c,
             "Enter the name of an event handler method; this will be created as stub"
         )
     for c in (self.label_8, self.name):
         compat.SetToolTip(
             c,
             "optional: enter a name to store the menu item as attribute of the menu bar"
         )
     for c in (self.label_10, self.id):
         compat.SetToolTip(c, "optional: enter wx ID")
     compat.SetToolTip(self.move_up, "Move selected item up (Alt-Up)")
     compat.SetToolTip(self.move_down, "Move selected item down (Alt-Down)")
     compat.SetToolTip(
         self.items, "For navigation use the mouse or the up/down arrows")
     compat.SetToolTip(
         self.move_left,
         "Move the selected item up by one menu level (Alt-Left)")
     compat.SetToolTip(
         self.move_right,
         "Move the selected item down by one menu level (Alt-Right)")
    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_6 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_2 = wx.FlexGridSizer(5, 2, 0, 0)
        label_6 = wx.StaticText(self, wx.ID_ANY, "Label:")
        grid_sizer_2.Add(label_6, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4)
        grid_sizer_2.Add(self.label, 1, wx.EXPAND, 0)
        label_7 = wx.StaticText(self, wx.ID_ANY, "Event Handler:")
        grid_sizer_2.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4)
        grid_sizer_2.Add(self.event_handler, 1, wx.EXPAND, 0)
        label_8 = wx.StaticText(self, wx.ID_ANY, "(Attribute) Name:")
        grid_sizer_2.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4)
        grid_sizer_2.Add(self.name, 1, wx.EXPAND, 0)
        label_9 = wx.StaticText(self, wx.ID_ANY, "Help String:")
        grid_sizer_2.Add(label_9, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4)
        grid_sizer_2.Add(self.help_str, 1, wx.EXPAND, 0)
        label_10 = wx.StaticText(self, wx.ID_ANY, "ID:")
        grid_sizer_2.Add(label_10, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4)
        grid_sizer_2.Add(self.id, 0, 0, 0)
        grid_sizer_2.AddGrowableCol(1)
        sizer_5.Add(grid_sizer_2, 2, wx.EXPAND, 0)
        sizer_5.Add(self.check_radio, 0, wx.ALL | wx.EXPAND, 4)
        sizer_5.Add((20, 20), 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 0)
        sizer_6.Add(self.ok, 0, wx.ALL, 5)
        sizer_6.Add(self.cancel, 0, wx.ALL, 5)
        sizer_5.Add(sizer_6, 0, wx.EXPAND, 0)
        sizer_1.Add(sizer_5, 0, wx.EXPAND, 0)
        sizer_2.Add(self.move_left, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8)
        sizer_2.Add(self.move_right, 0, wx.BOTTOM | wx.RIGHT | wx.TOP, 8)
        sizer_2.Add(self.move_up, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8)
        sizer_2.Add(self.move_down, 0, wx.BOTTOM | wx.RIGHT | wx.TOP, 8)
        sizer_2.Add((20, 20), 1, wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_2.Add(self.add, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8)
        sizer_2.Add(self.remove, 0, wx.BOTTOM | wx.TOP, 8)
        sizer_2.Add(self.add_sep, 0, wx.ALL, 8)
        sizer_2.Add((20, 20), 2, wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_1.Add(sizer_2, 0, wx.EXPAND, 0)
        sizer_1.Add(self.menu_items, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        self.Layout()

        # set tooltips
        for c in (label_6, self.label):
            compat.SetToolTip(c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut")
        for c in (label_7, self.event_handler):
            compat.SetToolTip(c, "Enter the name of an event handler method; this will be created as stub")
        for c in (label_8, self.name):
            compat.SetToolTip(c, "optional: enter a name to store the menu item as attribute of the menu bar")
        for c in (label_10, self.id):
            compat.SetToolTip(c, "optional: enter wx ID")
        compat.SetToolTip( self.move_up, "Move selected item up" )
        compat.SetToolTip( self.move_down, "Move selected item down" )
        compat.SetToolTip( self.menu_items, "For navigation use the mouse or the up/down arrows" )
        compat.SetToolTip( self.move_left,  "Move the selected item up by one menu level" )
        compat.SetToolTip( self.move_right, "Move the selected item down by one menu level" )
Esempio n. 5
0
    def _insert_tab(self, index, label):
        # add tab/page
        tabs_p = self.properties["tabs"]
        tabs = tabs_p.get()  # the value will be modified in place
        tabs.insert(index, [
            label,
        ])
        tabs_p.set(tabs)
        self.children.insert(index, None)

        # adjust pos of the following pages
        for i, page in enumerate(self.children[index + 1:]):
            pos_p = page.properties["pos"]
            pos_p.set(index + 1 + i)

        # create panel and node, add to tree
        editor = EditPanel(self.next_pane_name(), self, index)

        if self.widget:
            # add to widget
            editor.create()
            compat.SetToolTip(editor.widget,
                              _("Notebook page pane:\nAdd a sizer here"))
            self.vs_insert_tab(index)

            try:
                wx.CallAfter(editor.sel_marker.update)
            except AttributeError:
                #self._logger.exception(_('Internal Error'))
                if config.debugging: raise

            self.widget.SetSelection(index)

        self.properties["tabs"].update_display()
        return editor
Esempio n. 6
0
    def insert_tab(self, index, label, add_panel=True, add_sizer=False):
        # add tab/page; called from GUI
        self.properties["tabs"].insert(index, [
            label,
        ])

        # create panel and node, add to tree
        self.insert_item(None, index)  # placeholder
        if add_panel:
            if not isinstance(add_panel, compat.unicode):
                add_panel = self.next_pane_name()
            editor = panel.EditPanel(add_panel, self, index)
            if add_sizer:
                sizer = edit_sizers._builder(editor, 0)
        else:
            # just add a slot
            editor = edit_base.Slot(self, index)

        if self.widget:
            # add to widget
            editor.create()
            compat.SetToolTip(editor.widget,
                              _("Notebook page pane:\nAdd a sizer here"))
            self.vs_insert_tab(index)

            try:
                wx.CallAfter(editor.sel_marker.update)
            except AttributeError:
                #self._logger.exception(_('Internal Error'))
                if config.debugging: raise

            self.widget.SetSelection(index)

        self.properties["tabs"].update_display()
        misc.rebuild_tree(self)
Esempio n. 7
0
    def create_widget(self):
        self._error_message = None
        if self.show_design and common.root.language == "python" and config.preferences.allow_custom_widgets:
            # update path
            import os, sys
            dirname = os.path.dirname(common.root.filename)
            if not dirname in sys.path: sys.path.insert(0, dirname)
            # build code
            code_gen = common.code_writers["python"]
            code_gen.new_project(common.root)
            builder = code_gen.obj_builders["CustomWidget"]

            # replace e.g. "self.%s"%name with "self.widget"
            original_widget_access = builder.format_widget_access(self)
            widget_access = "self.widget"
            original_parent_access = builder.format_widget_access(
                self.parent_window)
            parent_access = "self.parent_window.widget"
            code_gen.cache(self, "attribute_access", widget_access)
            code_gen.cache(self.parent_window, "attribute_access",
                           parent_access)

            lines = []
            if self.check_prop_truth("extracode"):
                lines.append(self.extracode)
            if self.check_prop_truth("extracode_pre"):
                lines.append(self.extracode_pre)
            lines += builder.get_code(self)[0]
            if self.check_prop_truth("extracode_post"):
                lines.append(self.extracode_post)
            if self.check_prop_truth("extraproperties"):
                lines += code_gen.generate_code_extraproperties(self)
            code = "\n".join(lines)
            if self.check_prop_truth("extracode_pre") or self.check_prop_truth(
                    "extracode_post"):
                # replace widget and parent access in manually entered extra code
                code = code.replace(original_widget_access, widget_access)
                code = code.replace(original_parent_access, parent_access)
            # execute code
            before = set(sys.modules.keys())
            try:
                exec(code)
                after = set(sys.modules.keys())
                for modulename in (after - before):
                    if modulename in code: print(modulename)
                return
            except:
                exc_type, exc_value, exc_traceback = sys.exc_info()
                self._error_message = "%s: %s" % (exc_type, exc_value)
                if self.widget: self.widget.Destroy()
        # default / fallback in case of exception
        self.widget = wx.Window(self.parent_window.widget,
                                wx.ID_ANY,
                                style=wx.BORDER_SUNKEN
                                | wx.FULL_REPAINT_ON_RESIZE)
        self.widget.Bind(wx.EVT_PAINT, self.on_paint)
        self.widget.Bind(wx.EVT_ERASE_BACKGROUND, self.on_erase_background)
        if self._error_message:
            compat.SetToolTip(self.widget, self._error_message)
Esempio n. 8
0
def _cancel():
    if not common.adding_widget: return
    common.adding_widget = common.adding_sizer = False
    common.widget_to_add = None
    if currently_under_mouse is not None:
        currently_under_mouse.SetCursor(wx.STANDARD_CURSOR)
    common.app_tree.SetCursor(wx.STANDARD_CURSOR)
    compat.SetToolTip(common.app_tree, "")
    common.main.user_message("Canceled")
Esempio n. 9
0
 def __set_properties(self):
     # begin wxGlade: UIBugDialog.__set_properties
     self.SetTitle(_("Error Dialog"))
     self.SetSize((600, 400))
     self.SetFocus()
     self.tc_details.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
     self.tc_howto_report.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
     compat.SetToolTip( self.btn_copy, _("Copy error details to clipboard") )
     self.btn_ok.SetDefault()
Esempio n. 10
0
 def createBrowseButton( self):
     "Create the browse-button control"
     ID = wx.NewId()
     button =wx.Button(self, ID, misc.wxstr(self.buttonText))
     compat.SetToolTip(button, self.toolTip)
     w = button.GetTextExtent(self.buttonText)[0] + 10
     button.SetMinSize((w, -1))
     wx.EVT_BUTTON(button, ID, self.OnBrowse)
     return button
Esempio n. 11
0
 def on_text(self, event):
     import re
     validation_re  = re.compile(r'^[a-zA-Z_]+[\w-]*(\[\w*\])*$')
     name = event.GetString()
     OK = bool( validation_re.match( name ) )
     if not OK:
         self.klass.SetBackgroundColour(wx.RED)
         compat.SetToolTip(self.klass, "Class name not valid")
     else:
         #if name in [c.widget.klass for c in common.app_tree.root.children or []]:
         if name in self.class_names:
             # if the class name is in use already, indicate in yellow
             self.klass.SetBackgroundColour(wx.YELLOW)
             compat.SetToolTip(self.klass, "Class name not unique")
             if self.toplevel: OK = False
         else:
             self.klass.SetBackgroundColour(wx.WHITE)
             compat.SetToolTip(self.klass, "")
     self.klass.Refresh()
     self.btnOK.Enable(OK)
     event.Skip()
 def _set_tooltips(self):
     # set tooltips
     for c in (self.label_6, self.label):
         compat.SetToolTip(c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut")
     for c in (self.label_7, self.handler):
         compat.SetToolTip(c, "Enter the name of an event handler method; this will be created as stub")
     for c in (self.label_10, self.id):
         compat.SetToolTip(c, "optional: enter wx ID")
     for c in (self.label_9, self.short_help):
         compat.SetToolTip(c , "This will be displayed as tooltip" )
     for c in (self.label_9b, self.long_help):
         compat.SetToolTip( c, "This will be displayed in the status bar" )
     compat.SetToolTip( self.move_up, "Move selected item up" )
     compat.SetToolTip( self.move_down, "Move selected item down" )
     compat.SetToolTip( self.items, "For navigation use the mouse or the up/down arrows" )
Esempio n. 13
0
def builder(parent, index, klass=None, base=None, name=None):
    "factory function for EditFrame objects"
    global last_choices
    if klass is None or base is None:
        import window_dialog
        base_classes = ['wxFrame', 'wxMDIChildFrame']
        klass = 'wxFrame' if common.root.language.lower(
        ) == 'xrc' else 'MyFrame'

        dialog = window_dialog.WindowDialog(klass, base_classes,
                                            'Select frame class', True,
                                            options, last_choices)
        compat.SetToolTip(dialog.option_controls[0], _option_help)
        res = dialog.show()
        dialog.Destroy()
        if res is None: return None
        klass, base = res
        last_choices[:] = dialog.get_options()  # remember for next time
        if config.debugging and last_choices[1]: XXX  # provoke an error
        name = dialog.get_next_name("frame")
        interactive = True
    else:
        interactive = False  # last_choices not to be obeyed

    if base == "wxFrame":
        base_class = EditFrame
    else:
        base_class = EditMDIChildFrame
    editor = base_class(name, parent, index, klass, name,
                        "wxDEFAULT_FRAME_STYLE")
    editor.properties['size'].set((400, 300), activate=True)
    editor.design.update_label()

    if interactive and last_choices[0]:
        # add a default panel and vertical sizer to the frame
        import edit_sizers, widgets.panel.panel
        panel_editor = widgets.panel.panel.builder(editor, 0)
        edit_sizers._builder(panel_editor, 0)
    else:
        # just add a slot
        Slot(editor, 0)

    editor.create()

    return editor
Esempio n. 14
0
    def insert_tab(self, index, label):
        # add tab/page this needs to be done before EditPanel calls self.virtual_sizer.add_item
        tabs_p = self.properties["tabs"]
        tabs = tabs_p.get()  # the value will be modified in place
        tabs.insert(index, [
            label,
        ])
        tabs_p.set(tabs)
        self.pages.insert(index, None)

        # adjust pos of the following pages
        for i, page in enumerate(self.pages[index + 1:]):
            pos_p = page.properties["pos"]
            pos_p.set(index + 2 + i)

        # create panel and node, add to tree
        pos = index + 1
        window = EditPanel(self.next_pane_name(), self, -1, self.virtual_sizer,
                           pos)
        window._dont_destroy = True
        window.node = node = Node(window)

        #common.app_tree.add(node, self.node, index)
        self.virtual_sizer.add_item(window, pos)
        common.app_tree.insert(node, self.node, index)

        if self.widget:
            # add to widget
            window.create()
            compat.SetToolTip(window.widget,
                              _("Notebook page pane:\nAdd a sizer here"))
            self.virtual_sizer.insert_tab(index)

            try:
                wx.CallAfter(window.sel_marker.update)
            except AttributeError:
                #self._logger.exception(_('Internal Error'))
                if config.debugging: raise

            self.widget.SetSelection(index)

        self.properties["tabs"].update_display()
Esempio n. 15
0
 def on_mouse_events(self, event):
     if not self._drag_ongoing and not event.IsButton():
         message = None
         # set cursor to indicate a possible drop
         x,y = event.GetPosition()
         editor = self.find_editor_by_pos(x, y, toplevels_only=False)
         if editor is not None:
             if not common.adding_widget:
                 self.SetCursor(wx.STANDARD_CURSOR)
             else:
                 # check whether the item can be dropped here
                 compatible, message = editor.check_drop_compatibility()
                 if compatible:
                     self.SetCursor(wx.CROSS_CURSOR) # a Cursor instance
                 else:
                     compat.SetCursor(self, wx.CURSOR_NO_ENTRY)
         else:
             self.SetCursor(wx.STANDARD_CURSOR)
         compat.SetToolTip(self, message or "")
     event.Skip()
Esempio n. 16
0
    def insert_tab(self, index, label):

        # add tab/page this needs to be done before EditPanel calls self.virtual_sizer.add_item
        tabs_p = self.properties["tabs"]
        tabs = tabs_p.get()
        tabs.insert(index, [
            label,
        ])
        tabs_p.set(tabs)
        self.pages.insert(index, None)
        # adjust pos of the following pages
        for i, page in enumerate(self.pages[index + 1:]):
            pos_p = page.properties["pos"]
            pos_p.set(index + 2 + i)

        pos = index + 1
        window = EditPanel(self.next_pane_name(suggestion=label), self, -1,
                           self.virtual_sizer, pos)
        window._dont_destroy = True
        node = Node(window)

        window.node = node
        common.app_tree.add(node, self.node)

        if self.widget:
            window.create()
            compat.SetToolTip(window.widget,
                              _("Notebook page pane:\nAdd a sizer here"))
            self.virtual_sizer.insert_tab(index)

            try:
                wx.CallAfter(window.sel_marker.update)
            except AttributeError:
                #self._logger.exception(_('Internal Error'))
                import os
                if 'WINGDB_ACTIVE' in os.environ: raise
        self.properties["tabs"].update_display()
Esempio n. 17
0
    def set_tabs(self, old_names, indices):
        """tabs: list of strings
        indices: the current indices of the tabs or None for a new tab; re-ordering is currently not supported"""
        keep_indices = [i for i in indices if i is not None]
        if keep_indices != sorted(keep_indices):
            raise ValueError("Re-ordering is not yet implemented")
        keep_indices = set(keep_indices)
        new_names = old_names[:]

        # set tab labels of existing pages, if modified
        for (name, ), index in zip(self.tabs, indices):
            if index is not None and old_names[index] != name:
                new_names[index] = [
                    name,
                ]
                if self.widget:
                    self.widget.SetPageText(index, name)

        # remove tabs
        for index in range(len(old_names) - 1, -1, -1):
            if not index in keep_indices:
                self._is_removing_pages = True
                self.virtual_sizer.remove_tab(
                    index)  # remove from sizer; does not delete window
                self.pages[index].remove(False)  # delete the page content
                del self.pages[index]  # delete from page list
                del new_names[index]  # delete from list of names
                self._is_removing_pages = False

        # insert/add tabs
        added = None
        for i, (name, ) in enumerate(self.tabs):
            index = indices[i]
            if index is not None: continue  # old tab to be kept

            # actually add/insert
            new_names.insert(
                i, [
                    name,
                ]
            )  # this needs to be done before EditPanel calls self.virtual_sizer.add_item
            self.pages.insert(i, None)
            # create panel and node, add to tree
            pos = i + 1
            window = EditPanel(self.next_pane_name(name), self, -1,
                               self.virtual_sizer, pos)
            window._dont_destroy = True
            node = window.node = Node(window)

            # adjust pos of the following pages
            for p, page in enumerate(self.pages[i + 1:]):
                pos_p = page.properties["pos"]
                pos_p.set(i + 2 + p)

            self.virtual_sizer.add_item(window, pos)
            common.app_tree.insert(node, self.node, i)
            # add to widget
            if self.widget:
                window.create()
                compat.SetToolTip(window.widget,
                                  _("Notebook page pane:\nAdd a sizer here"))
                self.virtual_sizer.insert_tab(i)

                try:
                    wx.CallAfter(window.sel_marker.update)
                except AttributeError:
                    import os
                    if 'WINGDB_ACTIVE' in os.environ: raise

                added = i  # remember last added index for selection

        # select the last added tab
        if added is not None and self.widget:
            self.widget.SetSelection(added)
Esempio n. 18
0
 def finish_widget_creation(self, *args, **kwds):
     "Binds the popup menu handler and connects some event handlers to self.widgets; set tooltip string"
     if not self.widget: return
     self.widget.Bind(wx.EVT_RIGHT_DOWN, self.popup_menu)
     if self.WX_CLASS in ("wxStatusBar", ): return
     compat.SetToolTip(self.widget, self._get_tooltip_string())
Esempio n. 19
0
    def _set_tooltips(self):
        # set tooltips
        for c in (self.label_6, self.label):
            compat.SetToolTip(
                c,
                "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut"
            )
        for c in (self.label_7, self.event_handler):
            compat.SetToolTip(
                c,
                "Enter the name of an event handler method; this will be created as stub.\n\n"
                "Alternatively, for Python you may supply a lambda function like e.g.:\n"
                "lambda evt: self.on_menu_item('item x')")
        for c in (self.label_8, self.name):
            compat.SetToolTip(
                c,
                "optional: enter a name to store the menu item as attribute of the menu bar"
            )
        for c in (self.label_10, self.id):
            compat.SetToolTip(c, "optional: enter wx ID")
        compat.SetToolTip(self.move_up, "Move selected item up (Alt-Up)")
        compat.SetToolTip(self.move_down, "Move selected item down (Alt-Down)")
        compat.SetToolTip(
            self.items, "For navigation use the mouse or the up/down arrows")
        compat.SetToolTip(
            self.move_left,
            "Move the selected item up by one menu level (Alt-Left)")
        compat.SetToolTip(
            self.move_right,
            "Move the selected item down by one menu level (Alt-Right)")

        compat.SetToolTip(self.ok, "Alt+O or Alt+Enter or Ctrl+Enter")
        compat.SetToolTip(self.cancel, "Alt+C or Alt+F4")
        compat.SetToolTip(self.add, "Alt+A")
        compat.SetToolTip(self.remove, "Alt+R")
        compat.SetToolTip(self.add_sep, "Alt+S")
Esempio n. 20
0
    def set_tabs(self, old_names,
                 indices):  # called from tabs proberty on Apply button
        """tabs: list of strings
        indices: the current indices of the tabs or None for a new tab; re-ordering is currently not supported"""
        keep_indices = [i for i in indices if i is not None]
        if keep_indices != sorted(keep_indices):
            raise ValueError("Re-ordering is not yet implemented")
        keep_indices = set(keep_indices)
        new_names = old_names[:]

        # set tab labels of existing pages, if modified
        for (name, ), index in zip(self.tabs, indices):
            if index is not None and old_names[index] != name:
                new_names[index] = [
                    name,
                ]
                if self.widget:
                    self.widget.SetPageText(index, name)

        # remove tabs
        for index in range(len(old_names) - 1, -1, -1):
            if not index in keep_indices:
                self._is_removing_pages = True
                self.virtual_sizer.remove_tab(
                    index)  # remove from sizer; does not delete window
                self.pages[index]._remove(
                )  # delete the page content without setting the focus
                common.app_tree.remove(
                    self.pages[index].node)  # remove from tree
                del self.pages[index]  # delete from page list
                del new_names[index]  # delete from list of names
                self._is_removing_pages = False

        # insert/add tabs
        added = None
        for i, (name, ) in enumerate(self.tabs):
            index = indices[i]
            if index is not None:
                # old tab to be kept, just ensure that pos is correct
                pos_p = self.pages[i].properties["pos"]
                if pos_p.value != i + 1: pos_p.set(i + 1)
                continue

            # actually add/insert
            new_names.insert(
                i, [
                    name,
                ]
            )  # this needs to be done before EditPanel calls self.virtual_sizer.add_item
            self.pages.insert(i, None)
            # create panel and node, add to tree
            pos = i + 1
            suggestion = "%s_%s" % (self.name, name)
            window = EditPanel(self.next_pane_name(suggestion), self, -1,
                               self.virtual_sizer, pos)
            window._dont_destroy = True
            node = window.node = Node(window)

            # adjust pos of the following pages
            for p, page in enumerate(self.pages[i + 1:]):
                pos_p = page.properties["pos"]
                pos_p.set(i + 2 + p)

            self.virtual_sizer.add_item(window, pos)
            common.app_tree.insert(node, self.node, i, select=False)

            if self.widget:
                # add to widget
                window.create()
                compat.SetToolTip(window.widget,
                                  _("Notebook page pane:\nAdd a sizer here"))
                self.virtual_sizer.insert_tab(i)

                try:
                    wx.CallAfter(window.sel_marker.update)
                except AttributeError:
                    if config.debugging: raise

                added = i  # remember last added index for selection

        # select the last added tab
        if added is not None and self.widget:
            self.widget.SetSelection(added)

        # update tree labels
        for node in self.node.children:
            node.refresh(refresh_label=True, refresh_image=False)