Added close buttons to notebook
authorEugene Gagarin <mosfet07@ya.ru>
Tue, 12 May 2009 12:50:30 +0000 (16:50 +0400)
committerEugene Gagarin <mosfet07@ya.ru>
Tue, 12 May 2009 12:50:30 +0000 (16:50 +0400)
src/files/search.py
src/misc.py

index 4868f90..24e423b 100755 (executable)
@@ -6,7 +6,7 @@ from os import walk
 from os.path import join, abspath, normcase, isdir, getsize
 from heapq import nlargest
 
-from misc import size_hum_read, _
+from misc import size_hum_read, _, NotebookWCloseBtns
 from config import config
 
 OUTTYPES = [
@@ -116,9 +116,9 @@ class Gtk_Presentation(object):
         import gtk
         global gtk  # for show_current_status()
 
-        self.nb = gtk.Notebook()
-        self.nb.set_scrollable(True)
-        self.nb.set_border_width(2)
+        self.nb = NotebookWCloseBtns()
+        self.nb.notebook.set_scrollable(True)
+        self.nb.notebook.set_border_width(2)
 
         #====================
         # Notebook
@@ -189,7 +189,8 @@ class Gtk_Presentation(object):
         cr_vbox.pack_start(hbox2, False, False, 0)
         cr_vbox.pack_start(hbox3, False, False, 0)
         cr_vbox.pack_end(hbox4, False, False, 0)
-        self.nb.append_page(cr_vbox, gtk.Label(_('Criteria')))
+
+        self.nb.new_tab(cr_vbox, _('Criteria'), noclose=True)
 
         #====================
         # Others
@@ -200,7 +201,7 @@ class Gtk_Presentation(object):
         self.context_id = self.statusbar.get_context_id('Current walked file')
 
         self.vbox = gtk.VBox()
-        self.vbox.pack_start(self.nb, True, True, 0)
+        self.vbox.pack_start(self.nb.notebook, True, True, 0)
         self.vbox.pack_end(self.statusbar, False, False, 0)
 
 #        self.show_out_toplevel(config['outtype'], [(1, 'path', 'bytesize')])
@@ -254,14 +255,12 @@ class Gtk_Presentation(object):
         self.statusbar.push(self.context_id, current_path)
         gtk.main_iteration()
 
-    def _new_page(self, child, label):
+    def _new_page(self, child, title):
         """Create new notebook page with search output."""
-        self.nb.append_page(child, gtk.Label(label))
-        #self.nb.set_current_page(-1)
-        #child.grab_focus()
-
-    def _close_page(self):
-        pass
+        pages = self.nb.notebook.get_n_pages()
+        self.nb.new_tab(child, title)
+        child.show_all()
+        self.nb.notebook.set_current_page(pages)
 
     def run(self):
         pass
@@ -274,7 +273,6 @@ class Gtk_Presentation(object):
         self.out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
 
         self._new_page(self.out_toplevel, outtype['label'])
-        self.out_toplevel.show_all()
 ###        out_submodule.Gtk_Presentation().show_results(results)
 
 #==============================================================================
index a8a964f..5127e6d 100755 (executable)
@@ -2,14 +2,7 @@
 # -*-coding: utf-8 -*-
 # vim: sw=4 ts=4 expandtab ai
 
-def size_hum_read(size):
-        """Return string with file size in b or Kb or Mb or Gb or Tb."""
-        for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']):
-            if size < 1024**(i+1):
-                return unit % (size/1024.**i)
-        return '>1024 Tb'
-
-#==============================================================================
+#=== Localization =============================================================
 
 import sys
 import gettext
@@ -27,3 +20,58 @@ except IOError:
     # Comment out before use pygettext
     def _(text):
         return text
+
+#==============================================================================
+
+def size_hum_read(size):
+    """Return string with file size in b or Kb or Mb or Gb or Tb."""
+    for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']):
+        if size < 1024**(i+1):
+            return unit % (size/1024.**i)
+    return '>1024 Tb'
+
+#==============================================================================
+
+class NotebookWCloseBtns(object):
+    """gtk.Notebook widget with close buttons."""
+
+    def __init__(self):
+        import gtk
+        global gtk
+
+        self.notebook = gtk.Notebook()
+
+    def new_tab(self, child, title, noclose=False):
+        self.notebook.append_page(child)
+
+        label = self.create_tab_label(child, title, noclose)
+        label.show_all()
+        self.notebook.set_tab_label(child, label)
+
+        pages = self.notebook.get_n_pages()
+        self.notebook.set_current_page(pages)
+
+    def create_tab_label(self, child, title, noclose):
+        label = gtk.Label(title)
+
+        image = gtk.Image()
+        image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
+
+        close_btn = gtk.Button()
+        close_btn.connect('clicked', self.close_tab, child)
+        close_btn.set_relief(gtk.RELIEF_NONE)
+        if noclose:
+            close_btn.set_sensitive(False)
+
+        close_btn.set_image(image)
+
+        hbox = gtk.HBox()
+        hbox.pack_start(label, True, True)
+        hbox.pack_end(close_btn, False, False)
+        return hbox
+
+    def close_tab(self, widget, child):
+        pagenum = self.notebook.page_num(child)
+        if pagenum != -1:
+            self.notebook.remove_page(pagenum)
+        child.destroy()