enhancing tabs

** reordering tabs change term_list accordingly (almost though... think there is still a bug there)
  ** Ctrl-Shift-PageUp/PageDown will shift the first parent tab to the left/right (g-t like)
This commit is contained in:
Emmanuel Bretelle 2008-05-23 00:59:30 +01:00
parent 9d72385231
commit ac77dc6783
1 changed files with 91 additions and 1 deletions

View File

@ -612,7 +612,13 @@ text/plain
elif keyname in ('Up', 'Down', 'Left', 'Right'): elif keyname in ('Up', 'Down', 'Left', 'Right'):
self.terminator.resizeterm (self, keyname) self.terminator.resizeterm (self, keyname)
return (True) return (True)
elif keyname == 'Page_Down':
self.terminator.move_tab(self, 'right')
return (True)
elif keyname == 'Page_Up':
self.terminator.move_tab(self, 'left')
return (True)
mask = gtk.gdk.CONTROL_MASK mask = gtk.gdk.CONTROL_MASK
if (event.state & mask) == mask: if (event.state & mask) == mask:
if keyname == 'Page_Down': if keyname == 'Page_Down':
@ -1002,6 +1008,7 @@ class Terminator:
parent.insert_page(pane, None, page) parent.insert_page(pane, None, page)
parent.set_tab_label_text(pane, widget._vte.get_window_title()) parent.set_tab_label_text(pane, widget._vte.get_window_title())
parent.set_tab_label_packing(pane, True, True, gtk.PACK_START) parent.set_tab_label_packing(pane, True, True, gtk.PACK_START)
parent.set_tab_reorderable(pane, True)
parent.set_current_page(page) parent.set_current_page(page)
@ -1046,10 +1053,70 @@ class Terminator:
return (terminal) return (terminal)
def on_page_reordered(self, notebook, child, page_num): def on_page_reordered(self, notebook, child, page_num):
#page has been reordered, we need to get the
# first term and last term
dbg ("Reordered: %d"%page_num) dbg ("Reordered: %d"%page_num)
nbpages = notebook.get_n_pages()
if nbpages == 1:
dbg("[ERROR] only one page in on_page_reordered")
first = self._notebook_first_term(notebook.get_nth_page(page_num))
last = self._notebook_last_term(notebook.get_nth_page(page_num))
firstidx = self.term_list.index(first)
lastidx = self.term_list.index(last)
termslice = self.term_list[firstidx:lastidx+1]
#remove them from the list
for term in termslice:
self.term_list.remove(term)
if page_num == 0:
#first page, we insert before the first term of next page
nexttab = notebook.get_nth_page(1)
sibling = self._notebook_first_term(nexttab)
siblingindex = self.term_list.index(sibling)
for term in termslice:
self.term_list.insert(siblingindex, term)
siblingindex += 1
else:
#other pages, we insert after the last term of previous page
previoustab = notebook.get_nth_page(page_num - 1)
sibling = self._notebook_last_term(previoustab)
print sibling
siblingindex = self.term_list.index(sibling)
for term in termslice:
siblingindex += 1
self.term_list.insert(siblingindex, term)
#for page reorder, we need to get the first term of a notebook
def notebook_first_term(self, notebook):
return self._notebook_first_term(notebook.get_nth_page(0))
def _notebook_first_term(self, child):
if isinstance(child, TerminatorTerm):
return child
elif isinstance(child, gtk.Paned):
return self._notebook_first_term(child.get_child1())
elif isinstance(child, gtk.Notebook):
return self._notebook_first_term(child.get_nth_page(0))
dbg("[ERROR] unsupported class %s in _notebook_first_term" % child.__class__.__name__)
return None
#for page reorder, we need to get the last term of a notebook
def notebook_last_term(self, notebook):
return self._notebook_last_term(notebook.get_nth_page(notebook.get_n_pages()-1))
def _notebook_last_term(self, child):
if isinstance(child, TerminatorTerm):
return child
elif isinstance(child, gtk.Paned):
return self._notebook_first_term(child.get_child2())
elif isinstance(child, gtk.Notebook):
return self._notebook_first_term(child.get_nth_page(child.get_n_pages()-1))
dbg("[ERROR] unsupported class %s in _notebook_last_term" % child.__class__.__name__)
return None
def newtab(self,widget): def newtab(self,widget):
terminal = TerminatorTerm (self, self.profile, None, widget.get_cwd()) terminal = TerminatorTerm (self, self.profile, None, widget.get_cwd())
parent = widget.get_parent () parent = widget.get_parent ()
@ -1057,6 +1124,7 @@ class Terminator:
if isinstance(parent, gtk.Paned) or isinstance(parent, gtk.Window): if isinstance(parent, gtk.Paned) or isinstance(parent, gtk.Window):
#no notebook yet. #no notebook yet.
notebook = gtk.Notebook() notebook = gtk.Notebook()
notebook.set_tab_pos(gtk.POS_TOP)
notebook.connect('page-reordered',self.on_page_reordered) notebook.connect('page-reordered',self.on_page_reordered)
notebook.set_property('homogeneous', True) notebook.set_property('homogeneous', True)
notebook.set_tab_reorderable(widget, True) notebook.set_tab_reorderable(widget, True)
@ -1159,6 +1227,8 @@ class Terminator:
grandparent.remove_page(page) grandparent.remove_page(page)
grandparent.insert_page(sibling, None,page) grandparent.insert_page(sibling, None,page)
grandparent.set_tab_label_packing(sibling, True, True, gtk.PACK_START) grandparent.set_tab_label_packing(sibling, True, True, gtk.PACK_START)
grandparent.set_tab_reorderable(sibling, True)
else: else:
grandparent.remove (parent) grandparent.remove (parent)
@ -1307,6 +1377,26 @@ class Terminator:
notebook.next_page() notebook.next_page()
return return
def move_tab(self, term, direction):
dbg("moving to direction %s" % direction)
(notebook, page) = self.get_first_notebook_page(term)
page_num = notebook.page_num(page)
nbpages = notebook.get_n_pages()
#dbg ("%s %s %s %s" % (page_num, nbpages,notebook, page))
if page_num == 0 and direction == 'left':
new_page_num = nbpages
elif page_num == nbpages - 1 and direction == 'right':
new_page_num = 0
elif direction == 'left':
new_page_num = page_num - 1
elif direction == 'right':
new_page_num = page_num + 1
else:
dbg("[ERROR] unhandled combination in move_tab: direction = %s page_num = %d" % (direction, page_num))
return False
notebook.reorder_child(page, new_page_num)
return True
def get_first_parent_notebook(self, widget): def get_first_parent_notebook(self, widget):
if isinstance (widget, gtk.Window): if isinstance (widget, gtk.Window):
return None return None