From 4b58b0c73896d54c0591464136000c759af93fb7 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Fri, 29 Jan 2010 13:12:33 +0000 Subject: [PATCH] Refactor navigate_terminals from Terminator to Window --- terminatorlib/notebook.py | 3 +- terminatorlib/paned.py | 3 +- terminatorlib/terminator.py | 65 ----------------------------------- terminatorlib/window.py | 68 ++++++++++++++++++++++++++++++++++++- 4 files changed, 71 insertions(+), 68 deletions(-) diff --git a/terminatorlib/notebook.py b/terminatorlib/notebook.py index f1999ecd..dc2badcd 100755 --- a/terminatorlib/notebook.py +++ b/terminatorlib/notebook.py @@ -117,7 +117,8 @@ class Notebook(Container, gtk.Notebook): 'group-tab': top_window.group_tab, 'ungroup-tab': top_window.ungroup_tab, 'move-tab': top_window.move_tab, - 'tab-new': top_window.tab_new} + 'tab-new': top_window.tab_new, + 'navigate': top_window.navigate_terminal} if maker.isinstance(widget, 'Terminal'): for signal in signals: diff --git a/terminatorlib/paned.py b/terminatorlib/paned.py index da59c65f..e603cc61 100755 --- a/terminatorlib/paned.py +++ b/terminatorlib/paned.py @@ -92,7 +92,8 @@ class Paned(Container): 'ungroup-tab': top_window.ungroup_tab, 'move-tab': top_window.move_tab, 'maximise': [top_window.zoom, False], - 'tab-new': top_window.tab_new} + 'tab-new': top_window.tab_new, + 'navigate': top_window.navigate_terminal} for signal in signals: args = [] diff --git a/terminatorlib/terminator.py b/terminatorlib/terminator.py index 471f5859..28afa1a0 100755 --- a/terminatorlib/terminator.py +++ b/terminatorlib/terminator.py @@ -71,7 +71,6 @@ class Terminator(Borg): (id(terminal), type(terminal))) self.terminals.append(terminal) terminal.connect('ungroup-all', self.ungroup_all) - terminal.connect('navigate', self.navigate_terminal) def deregister_terminal(self, terminal): """De-register a terminal widget""" @@ -101,70 +100,6 @@ class Terminator(Borg): for terminal in self.terminals: terminal.reconfigure() - def navigate_terminal(self, terminal, direction): - """Nagivate around the terminals""" - current = self.terminals.index(terminal) - length = len(self.terminals) - next = None - - if length <= 1: - return - - if direction == 'next': - next = current + 1 - if next >= length: - next = 0 - elif direction == 'prev': - next = current - 1 - if next < 0: - next = length - 1 - elif direction in ['left', 'right', 'up', 'down']: - window = get_top_window(terminal) - layout = window.get_visible_terminals() - - allocation = terminal.get_allocation() - possibles = [] - - # Get the co-ordinate of the appropriate edge for this direction - edge = util.get_edge(allocation, direction) - # Find all visible terminals which are, in their entirity, in the - # direction we want to move - for term in layout: - rect = layout[term] - if util.get_nav_possible(edge, rect, direction): - possibles.append(term) - - if len(possibles) == 0: - return - - # Find out how far away each of the possible terminals is, then - # find the smallest distance. The winning terminals are all of - # those who are that distance away. - offsets = {} - for term in possibles: - rect = layout[term] - offsets[term] = util.get_nav_offset(edge, rect, direction) - keys = offsets.values() - keys.sort() - winners = [k for k, v in offsets.iteritems() if v == keys[0]] - next = self.terminals.index(winners[0]) - - if len(winners) > 1: - # Break an n-way tie with the cursor position - cursor_x, cursor_y = terminal.get_cursor_position() - cursor_x = cursor_x + allocation.x - cursor_y = cursor_y + allocation.y - for term in winners: - rect = layout[term] - if util.get_nav_tiebreak(direction, cursor_x, cursor_y, rect): - next = self.terminals.index(term) - break; - else: - err('Unknown navigation direction: %s' % direction) - - if next is not None: - self.terminals[next].grab_focus() - def create_group(self, name): """Create a new group""" if name not in self.groups: diff --git a/terminatorlib/window.py b/terminatorlib/window.py index ba153ee7..0db8e2c9 100755 --- a/terminatorlib/window.py +++ b/terminatorlib/window.py @@ -10,6 +10,7 @@ import gtk import glib from util import dbg, err +import util from translation import _ from version import APP_NAME from container import Container @@ -261,7 +262,8 @@ class Window(Container, gtk.Window): 'group-tab': self.group_tab, 'ungroup-tab': self.ungroup_tab, 'move-tab': self.move_tab, - 'tab-new': self.tab_new} + 'tab-new': self.tab_new, + 'navigate': self.navigate_terminal} for signal in signals: self.connect_child(widget, signal, signals[signal]) @@ -498,6 +500,70 @@ class Window(Container, gtk.Window): notebook.reorder_child(child, page) + def navigate_terminal(self, terminal, direction): + """Navigate around terminals""" + _containers, terminals = util.enumerate_descendants(self) + current = terminals.index(terminal) + length = len(terminals) + next = None + + if length <= 1: + return + + if direction == 'next': + next = current + 1 + if next >= length: + next = 0 + elif direction == 'prev': + next = current - 1 + if next < 0: + next = length - 1 + elif direction in ['left', 'right', 'up', 'down']: + layout = self.get_visible_terminals() + allocation = terminal.get_allocation() + possibles = [] + + # Get the co-ordinate of the appropriate edge for this direction + edge = util.get_edge(allocation, direction) + # Find all visible terminals which are, in their entirity, in the + # direction we want to move + for term in layout: + rect = layout[term] + if util.get_nav_possible(edge, rect, direction): + possibles.append(term) + + if len(possibles) == 0: + return + + # Find out how far away each of the possible terminals is, then + # find the smallest distance. The winning terminals are all of + # those who are that distance away. + offsets = {} + for term in possibles: + rect = layout[term] + offsets[term] = util.get_nav_offset(edge, rect, direction) + keys = offsets.values() + keys.sort() + winners = [k for k, v in offsets.iteritems() if v == keys[0]] + next = terminals.index(winners[0]) + + if len(winners) > 1: + # Break an n-way tie using the cursor position + cursor_x, cursor_y = terminal.get_cursor_position() + cursor_x = cursor_x + allocation.x + cursor_y = cursor_y + allocation.y + for term in winners: + rect = layout[term] + if util.get_nav_tiebreak(direction, cursor_x, cursor_y, + rect): + next = terminals.index(term) + break; + else: + err('Unknown navigation direction: %s' % direction) + + if next is not None: + terminals[next].grab_focus() + class WindowTitle(object): """Class to handle the setting of the window title"""