Example #1
0
    def __init__(self, session):
        super(TabbedEditorManager, self).__init__(session)

        self.last_switch_time = None
        self.panels = weakref.WeakKeyDictionary()

        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_name('SnakedWindow')
        self.window.set_role('Editor')
        self.window.connect('delete-event', self.on_delete_event)
        self.window.connect('focus-in-event', self.on_focus)

        # set border width handling, see self.on_state_event for more details
        self.window.connect('window-state-event', self.on_state_event)

        self.window.set_property('default-width', 800)
        self.window.set_property('default-height', 500)

        self.activator = ContextShortcutActivator(self.window, self.get_context)

        self.main_pane = gtk.VPaned()
        self.main_pane_position_set = False
        self.window.add(self.main_pane)

        self.note = gtk.Notebook()
        self.note.set_show_tabs(self.snaked_conf['SHOW_TABS'])
        self.note.set_scrollable(True)
        self.note.set_property('tab-hborder', 10)
        self.note.set_property('homogeneous', False)
        self.note.set_show_border(False)
        self.note.connect_after('switch-page', self.on_switch_page)
        self.note.connect('page_removed', self.on_page_removed)
        self.note.connect('page_reordered', self.on_page_reordered)
        self.note.props.tab_pos = tab_bar_pos_mapping.get(
        self.snaked_conf['TAB_BAR_PLACEMENT'], gtk.POS_TOP)
        self.main_pane.add1(self.note)

        register_shortcut('toggle-tabs-visibility', '<alt>F11', 'Window', 'Toggles tabs visibility')
        register_shortcut('next-editor', '<alt>Right', 'Window', 'Switches to next editor')
        register_shortcut('prev-editor', '<alt>Left', 'Window', 'Switches to previous editor')
        register_shortcut('next-editor-alt', '<ctrl>Page_Down', 'Window', 'Switches to next editor')
        register_shortcut('prev-editor-alt', '<ctrl>Page_Up', 'Window', 'Switches to previous editor')
        register_shortcut('move-tab-left', '<shift><ctrl>Page_Up', 'Window', 'Move tab to the left')
        register_shortcut('move-tab-right', '<shift><ctrl>Page_Down', 'Window', 'Move tab to the right')

        register_shortcut('fullscreen', 'F11', 'Window', 'Toggles fullscreen mode')

        register_shortcut('toggle-console', '<alt>grave', 'Window', 'Toggles console')
        register_shortcut('send-to-console', '<alt>Return', 'Window',
            'Send selection or buffer to console')

        if self.snaked_conf['RESTORE_POSITION'] and 'LAST_POSITION' in self.snaked_conf:
            pos, size = self.snaked_conf['LAST_POSITION']
            self.window.move(*pos)
            self.window.resize(*size)

        self.window.show_all()

        if self.snaked_conf['FULLSCREEN']:
            self.window.fullscreen()
Example #2
0
class TabbedEditorManager(snaked.core.manager.EditorManager):
    def __init__(self, session):
        super(TabbedEditorManager, self).__init__(session)

        self.last_switch_time = None
        self.panels = weakref.WeakKeyDictionary()

        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('delete-event', self.on_delete_event)

        self.window.set_property('default-width', 800)
        self.window.set_property('default-height', 500)

        self.activator = ContextShortcutActivator(self.window, self.get_context)

        self.main_pane = gtk.VPaned()
        self.main_pane_position_set = False
        self.window.add(self.main_pane)

        self.note = gtk.Notebook()
        self.note.set_show_tabs(self.snaked_conf['SHOW_TABS'])
        self.note.set_scrollable(True)
        self.note.set_property('tab-hborder', 10)
        self.note.set_property('homogeneous', False)
        self.note.connect_after('switch-page', self.on_switch_page)
        self.note.connect('page_removed', self.on_page_removed)
        self.note.connect('page_reordered', self.on_page_reordered)
        self.note.props.tab_pos = tab_bar_pos_mapping.get(
        self.snaked_conf['TAB_BAR_PLACEMENT'], gtk.POS_TOP)
        self.main_pane.add1(self.note)

        register_shortcut('toggle-tabs-visibility', '<alt>F11', 'Window', 'Toggles tabs visibility')
        register_shortcut('next-editor', '<alt>Right', 'Window', 'Switches to next editor')
        register_shortcut('prev-editor', '<alt>Left', 'Window', 'Switches to previous editor')
        register_shortcut('next-editor-alt', '<ctrl>Page_Down', 'Window', 'Switches to next editor')
        register_shortcut('prev-editor-alt', '<ctrl>Page_Up', 'Window', 'Switches to previous editor')
        register_shortcut('move-tab-left', '<shift><ctrl>Page_Up', 'Window', 'Move tab to the left')
        register_shortcut('move-tab-right', '<shift><ctrl>Page_Down', 'Window', 'Move tab to the right')

        register_shortcut('fullscreen', 'F11', 'Window', 'Toggles fullscreen mode')

        register_shortcut('toggle-console', '<alt>grave', 'Window', 'Toggles console')

        if self.snaked_conf['RESTORE_POSITION'] and 'LAST_POSITION' in self.snaked_conf:
            pos, size = self.snaked_conf['LAST_POSITION']
            self.window.move(*pos)
            self.window.resize(*size)

        self.window.show_all()

        if self.snaked_conf['FULLSCREEN']:
            self.window.fullscreen()

    def get_context(self):
        widget = self.note.get_nth_page(self.note.get_current_page())
        for e in self.editors:
            if e.widget is widget:
                return (e,)

        return (None,)

    def manage_editor(self, editor):
        label = gtk.Label('Unknown')
        self.note.append_page(editor.widget, label)
        self.note.set_tab_reorderable(editor.widget, True)
        self.focus_editor(editor)
        editor.view.grab_focus()

    def focus_editor(self, editor):
        idx = self.note.page_num(editor.widget)
        self.note.set_current_page(idx)

    def update_top_level_title(self):
        idx = self.note.get_current_page()
        if idx < 0:
            return

        editor = self.get_context()[0]
        if editor:
            title = editor.get_window_title.emit()

        if not title:
            title = self.note.get_tab_label_text(self.note.get_nth_page(idx))

        if title is not None:
            self.window.set_title(title)

    def set_editor_title(self, editor, title):
        self.note.set_tab_label_text(editor.widget, title)
        if self.note.get_current_page() == self.note.page_num(editor.widget):
            self.update_top_level_title()

    def on_delete_event(self, *args):
        self.quit(self.get_context()[0])

    def close_editor(self, editor):
        idx = self.note.page_num(editor.widget)
        self.note.remove_page(idx)
        editor.editor_closed.emit()

    def set_editor_shortcuts(self, editor):
        self.plugin_manager.bind_shortcuts(self.activator, editor)

        if hasattr(self, 'editor_shortcuts_binded'):
            return

        self.editor_shortcuts_binded = True

        self.activator.bind_to_name('quit', self.quit)
        self.activator.bind_to_name('close-window', self.close_editor)
        self.activator.bind_to_name('save', self.save)
        self.activator.bind_to_name('next-editor', self.switch_to, 1)
        self.activator.bind_to_name('prev-editor', self.switch_to, -1)
        self.activator.bind_to_name('next-editor-alt', self.switch_to, 1)
        self.activator.bind_to_name('prev-editor-alt', self.switch_to, -1)
        self.activator.bind_to_name('new-file', self.new_file_action)
        self.activator.bind_to_name('show-preferences', self.show_preferences)
        self.activator.bind_to_name('fullscreen', self.fullscreen)
        self.activator.bind_to_name('toggle-tabs-visibility', self.toggle_tabs)

        self.activator.bind_to_name('place-spot', self.add_spot_with_feedback)
        self.activator.bind_to_name('goto-last-spot', self.goto_last_spot)
        self.activator.bind_to_name('goto-next-spot', self.goto_next_prev_spot, True)
        self.activator.bind_to_name('goto-prev-spot', self.goto_next_prev_spot, False)

        self.activator.bind_to_name('move-tab-left', self.move_tab, False)
        self.activator.bind_to_name('move-tab-right', self.move_tab, True)

        self.activator.bind_to_name('toggle-console', self.toggle_console)

        self.activator.bind('Escape', self.process_escape)

    def quit(self, editor):
        self.snaked_conf['LAST_POSITION'] = self.window.get_position(), self.window.get_size()

        if self.main_pane_position_set:
            _, _, _, wh, _ = self.window.window.get_geometry()
            self.snaked_conf['PANEL_HEIGHT'] = wh - self.main_pane.get_position()

        self.window.hide()
        super(TabbedEditorManager, self).quit(editor)

    def save(self, editor):
        editor.save()

    def set_transient_for(self, editor, window):
        window.set_transient_for(self.window)

    def on_switch_page(self, *args):
        self.update_top_level_title()

    def on_page_removed(self, note, child, idx):
        for e in self.editors:
            if e.widget is child:
                spot = self.get_last_spot(None, e)
                if spot:
                    note.set_current_page(note.page_num(spot.editor().widget))
                    return

        if idx > 0:
            note.set_current_page(idx - 1)

    def switch_to(self, editor, dir):
        if self.last_switch_time is None or time.time() - self.last_switch_time > 5:
            self.add_spot(editor)

        self.last_switch_time = time.time()

        idx = ( self.note.get_current_page() + dir ) % self.note.get_n_pages()
        self.note.set_current_page(idx)

    def fullscreen(self, editor):
        self.snaked_conf['FULLSCREEN'] = not self.snaked_conf['FULLSCREEN']
        if self.snaked_conf['FULLSCREEN']:
            self.window.fullscreen()
        else:
            self.window.unfullscreen()

    def toggle_tabs(self, editor):
        self.note.set_show_tabs(not self.note.get_show_tabs())
        self.snaked_conf['SHOW_TABS'] = self.note.get_show_tabs()

    @snaked.core.editor.Editor.stack_add_request
    def on_stack_add_request(self, editor, widget, on_popup):
        self.panels[widget] = on_popup

    @snaked.core.editor.Editor.stack_popup_request
    def on_stack_popup_request(self, editor, widget):
        if widget in self.panels:
            for w in self.panels:
                if w is not widget and w is self.main_pane.get_child2():
                    self.main_pane.remove(w)

            if not self.main_pane_position_set:
                self.main_pane_position_set = True
                _, _, _, wh, _ = self.window.window.get_geometry()
                self.main_pane.set_position(wh - self.snaked_conf['PANEL_HEIGHT'])

            self.main_pane.add2(widget)
            widget.show()

            if self.panels[widget]:
                self.panels[widget](widget, editor)

    def toggle_console(self, editor):
        from snaked.core.console import toggle_console
        toggle_console(editor)

    def on_page_reordered(self, note, child, num):
        for i, e in enumerate(self.editors):
            if e.widget is child:
                self.editors[i], self.editors[num] = self.editors[num], self.editors[i]
                break

    def move_tab(self, editor, is_right):
        pos = self.note.page_num(editor.widget)
        if is_right:
            pos += 1
        else:
            pos -= 1

        if pos < 0 or pos >= self.note.get_n_pages():
            editor.message('This is dead end')
            return

        self.note.reorder_child(editor.widget, pos)

    def activate_main_window(self):
        self.window.present()
        self.window.present_with_time(gtk.get_current_event_time())