First working PAC version
authorEugene Gagarin <mosfet07@ya.ru>
Mon, 27 Apr 2009 12:07:05 +0000 (16:07 +0400)
committerEugene Gagarin <mosfet07@ya.ru>
Mon, 27 Apr 2009 12:07:05 +0000 (16:07 +0400)
src/debs/outdiagram.py
src/debs/outtable.py
src/debs/search.py
src/files/outdiagram.py
src/files/outtable.py
src/files/search.py

index 1b235a4..ac81249 100755 (executable)
@@ -2,94 +2,90 @@
 # -*-coding: utf-8 -*-
 # vim: sw=4 ts=4 expandtab ai
 
-import gtk
-import gobject
-from random import randint
+from random import random
+from math import pi, cos, sin, sqrt
 
-class Out_Diag_Control(object):
-    def __init__(self, config):
-        win_width = config.get('window_width')
-        win_height = config.get('window_height')
-        self.out_ui = Out_Diag_Presentation(win_width, win_height)
+#==============================================================================
 
-    def show(self, filelist, fullsize):
-        self.out_ui.get_data(filelist, fullsize)
+class Cli_Presentation(object):
+    pass
 
-    def run(self):
-        self.out_ui.run()
+#==============================================================================
 
+class Gtk_Presentation(object):
+    def __init__(self, filelist, maxdata=10):
+        import gtk
+        import cairo
 
-class Out_Diag_Abstraction(object):
-    pass
+        drawing = gtk.DrawingArea()
+
+        # `maxdata` biggest files from list
+        filelist.sort(reverse=True)
+        del filelist[maxdata:]
+        self.filelist = filelist
 
+        # sum of sizes
+        fullsize = sum((f[0] for f in filelist))
 
-class Out_Diag_Presentation(gtk.Window):
-
-    def __init__(self, win_width, win_height):
-        gtk.Window.__init__(self)
-        self.width = win_width
-        self.height = win_height
-        self.set_default_size(self.width, self.height)
-        self.set_border_width(4)
-        self.connect('delete_event', gtk.main_quit) 
-
-        scrollwind = gtk.ScrolledWindow()
-        scrollwind.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        
-        self.area = gtk.DrawingArea()
-        self.area.set_size_request(win_width, win_height)
-        self.area.set_events(gtk.gdk.POINTER_MOTION_MASK | 
-                gtk.gdk.POINTER_MOTION_HINT_MASK )
-        self.area.connect("expose-event", self.expose_event)
-        self.pixmap = None        
-        
-        scrollwind.add_with_viewport(self.area)
-        self.add(scrollwind)
-
-    
-    def expose_event(self, widget, event):
-        if not self.pixmap:
-            self.build_pixmap()
-        x , y, width, height = event.area
-        widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], \
-                self.pixmap, x, y, x, y, width, height)
-        return False
-
-    def build_pixmap(self):
-        self.pixmap=gtk.gdk.Pixmap(self.window, self.width, self.height)
-        cm=self.pixmap.get_colormap()
-        self.color={}
-        self.color['black']=cm.alloc_color("black")
-        self.color['white']=cm.alloc_color("white")
-        self.gc=self.pixmap.new_gc()
-        self.gc.set_foreground(self.color['white'])
-        self.pixmap.draw_rectangle(self.gc, True, 0, 0, self.width, self.height)
-    
-    def draw_diag(self):
+        # sectors list
+        sectors = []
         start_angle = 0
-        for path, size, bsize in self.filelist:
-            end_angle = (bsize*360*64)/self.fullsize
-            print start_angle, end_angle
-            gc=self.pixmap.new_gc()
-            cm=self.pixmap.get_colormap()
-            col1 = cm.alloc_color(self.rand_color())
-            gc.set_foreground(col1)
-            gc.set_line_attributes(1,gtk.gdk.LINE_SOLID,gtk.gdk.CAP_NOT_LAST,gtk.gdk.JOIN_MITER)
-            self.pixmap.draw_arc(gc, True, 0, 0, self.width, self.height, start_angle, end_angle)
-            start_angle = start_angle + end_angle
-        self.area.queue_draw()
+        for bsize, name, size in filelist:
+            color = self.rand_color()
+            delta_angle = (float(bsize)/fullsize)*2*pi
+            end_angle = start_angle + delta_angle
+            color = self.rand_color()
+            sectors.append((start_angle, end_angle, color))
+            start_angle += delta_angle
+
+        drawing.connect('expose-event', self.expose_event, sectors)
+
+        self.toplevel = drawing
+
+    def expose_event(self, widget, event, sectors):
+        x, y, w, h, _ = widget.window.get_geometry()
+        R = min(w-w/3, h)/2 - 20
+
+        cr = widget.window.cairo_create()   # cairo context
+        cr.translate(w/2-w/6, h/2)          # moving coordinates
+
+        # drawing pie chart
+        for i, (start_angle, end_angle, color) in enumerate(sectors):
+            # drawing sector
+            cr.move_to(0, 0)
+            cr.set_source_rgb(*color)
+            cr.arc(0, 0, R, start_angle, end_angle)
+            cr.fill()
+
+            # to cartesian coordinates
+            delta_angle = end_angle - start_angle
+            x = R/1.7 * cos(start_angle+delta_angle/2)
+            y = R/1.7 * sin(start_angle+delta_angle/2)
+            area = 0.5*(delta_angle*R**2)   # sector area
+
+            # drawing text
+            cr.set_font_size(sqrt(area)/3)  # text size
+            text = str(i+1)                 # text string
+            xbearing, ybearing, textw, texth = cr.text_extents(text)[:4]
+            cr.move_to(x-(xbearing+textw/2), y-(ybearing+texth/2))  # text center
+            cr.set_source_rgb(.3, .3, .3)   # text color
+            cr.show_text(text)
+
+        cr.set_font_size(14)
+        cr.translate(w/2-w/6, -h/2+40)  # moving coordinates
+        cr.move_to(0, 0)
+
+        # drawing files list
+        for i, (bsize, name, size) in enumerate(self.filelist):
+            color = sectors[i][2]
+            cr.set_source_rgb(*color)
+            cr.rectangle(-20, 20*i+3, 14, -14)
+            cr.fill()
+
+            text = str(i+1) + '. ' + name + ' (' + str(size) + ')'
+            cr.move_to(0, 20*i)
+            cr.set_source_rgb(0, 0, 0)
+            cr.show_text(text)
 
     def rand_color(self):
-        r = randint(0, 65535)
-        g = randint(0, 65535)
-        b = randint(0, 65535)
-        return gtk.gdk.Color(r, g, b, 0)
-
-    def run(self):
-        self.show_all()
-        gobject.timeout_add(1000, self.draw_diag)
-        gtk.main()
-    
-    def get_data(self, filelist, fullsize):
-        self.filelist = filelist
-        self.fullsize = fullsize
+        return random(), random(), random()
index 3b27b08..7fc52ad 100755 (executable)
@@ -4,20 +4,21 @@
 
 #==============================================================================
 
-class Out_Table_Control(object):
-    def __init__(self):
-        self.out_ui = Out_Table_Presentation()
-
-    def show(self, filelist, flsize):
-        self.out_ui.show_result(filelist, flsize)
-
-    def get_ui(self):
-        return self.out_ui.get_ui()
-
-#==============================================================================
-
-class Out_Table_Abstraction(object):
-    pass
+# class OutTable_Control(object):
+#     def __init__(self):
+#         self.table_present = Gtk_Presentation()
+# 
+#     def show(self, filelist, flsize):
+#         self.table_present.show_result(filelist, flsize)
+# 
+#     def get_ui(self):
+#         return self.table_present.get_toplevel()
+# 
+# 
+# #==============================================================================
+# 
+# class OutTable_Abstraction(object):
+#     pass
 
 #==============================================================================
 
@@ -27,53 +28,50 @@ class Cli_Presentation(object):
 #==============================================================================
 
 class Gtk_Presentation(object):
-    def __init__(self):
+    def __init__(self, filelist):   ###
         import gtk
         import gobject
 
-        scrollwind = gtk.ScrolledWindow()
-        scrollwind.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
         # Определяем переменную в которой будет храниться выводимый список
         self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64)
-        self.treeview = gtk.TreeView(self.liststore)
+
+        for bsize, path, size in filelist:
+            self.liststore.append([path, size, bsize])
+
+        treeview = gtk.TreeView(self.liststore)
+
         # На таблетке не отображаються заголовки столбцов по умолчанию -
         # след строка заставляет их отображаться принудительно
-        self.treeview.set_headers_visible(1)
-        self.liststore.append(['', '', 0])
+        treeview.set_headers_visible(1)
 
         # Создаем и настраиваем колонку с размером файла
         size_col = gtk.TreeViewColumn( 'Size')
-        cell = gtk.CellRendererText()
-        cell.set_property('width', 90)
-        size_col.pack_start(cell, True)
-        size_col.add_attribute(cell, 'text', 1)
-        self.treeview.append_column(size_col)
+        cell1 = gtk.CellRendererText()
+        cell1.set_property('width', 90)
+        size_col.pack_start(cell1, True)
+        size_col.add_attribute(cell1, 'text', 1)
+        treeview.append_column(size_col)
         # Создаем и настраиваем колонку с именем файла
         path_col = gtk.TreeViewColumn( 'Path')
         cell2 = gtk.CellRendererText()
         path_col.pack_start(cell2, True)
         path_col.add_attribute(cell2, 'text', 0)
-        self.treeview.append_column(path_col)
+        treeview.append_column(path_col)
 
         # Добавляем сортировку для колонок
-        self.treeview.set_search_column(1)
+        treeview.set_search_column(1)
         path_col.set_sort_column_id(0)
         size_col.set_sort_column_id(2)
 
-        scrollwind.add(self.treeview)
-        self.label = gtk.Label('full dir size = ')
-        
-        self.vbox = gtk.VBox(False, 5)
-        self.vbox.pack_start(scrollwind, True, True, 0)
-        self.vbox.pack_start(self.label, False, False,0)
-
-    def show_result(self, filelist, fullsize):
-        self.liststore.clear()
-        for stroka in filelist:
-            self.liststore.append(stroka)
-        flsizestr = 'full dir size = %s' % size_hum_read(fullsize)
-        self.label.set_text(flsizestr)
-
-    def get_ui(self):
-        return self.vbox
+        self.swin = gtk.ScrolledWindow()
+        self.swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.swin.add(treeview)
+###        self.swin.show_all()
+        self.toplevel = self.swin
+
+#     #=== Functions ============================================================
+#     def show_results(self, filelist):
+#         self.liststore.clear()
+#         for path, size, bsize in filelist:
+#             print path, size, bsize
+#             self.liststore.append([path, size, bsize])
index 8a39835..8b6d746 100755 (executable)
@@ -2,8 +2,7 @@
 # -*-coding: utf-8 -*-
 # vim: sw=4 ts=4 expandtab ai
 
-import gtk
-#import apt_pkg
+import apt_pkg
 from heapq import nlargest
 
 from misc import *
@@ -13,7 +12,7 @@ from misc import *
 class Control(object):
 
     def __init__(self, ui):
-        count = 7
+        count = 12
 
         print ui
         if ui == 'cli':
@@ -24,11 +23,12 @@ class Control(object):
         self.abstrac = Abstraction(self.present)
 
     def start_search(self, get_data):
-        deblist = [0, 0]
-#         for size, name in nlargest(count, self.abstrac.pkggetter()):
-#             deblist.append([name, size_hum_read(psize), size])
-        
-        self.search_present.show_out_toplevel(None, 'outtable', deblist)
+        deblist = []
+        count, outtype = get_data()
+        search_func = self.abstrac.pkggetter()
+        for size, name in nlargest(count, search_func):
+            deblist.append([int(size), name, size_hum_read(size)])
+        self.present.show_out_toplevel(None, outtype, deblist)
 
     def run(self):
         return self.present.toplevel
@@ -38,21 +38,21 @@ class Control(object):
 class Abstraction(object):
     def __init__(self, presentation):
         self.presentation = presentation
-#         apt_pkg.InitConfig()
-#         apt_pkg.InitSystem()
-#         self.cache = apt_pkg.GetCache()
-# 
-#     def pkggetter(self):
-#         self.fullsize = 0
-#         for pkg in self.cache.Packages:
-#             # pkg is from a list of packages, sorted by name.
-#             if pkg.CurrentState == apt_pkg.CurStateInstalled:
-#                 pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
-#                 self.fullsize = self.fullsize + pkgsize
-#                 yield pkgsize, pkg.Name
-# 
-#     def full(self):
-#         return self.fullsize
+        apt_pkg.InitConfig()
+        apt_pkg.InitSystem()
+        self.cache = apt_pkg.GetCache()
+
+    def pkggetter(self):
+        self.fullsize = 0
+        for pkg in self.cache.Packages:
+            # pkg is from a list of packages, sorted by name.
+            if pkg.CurrentState == apt_pkg.CurStateInstalled:
+                pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
+                self.fullsize = self.fullsize + pkgsize
+                yield pkgsize, pkg.Name
+
+    def full(self):
+        return self.fullsize
 
 
 #==============================================================================
@@ -78,24 +78,28 @@ class Gtk_Presentation(object):
         qty_label = gtk.Label('Debian packages quantity')
 
         # "Packages quantity" spin
-        qty_spin = gtk.SpinButton()
-        qty_spin.set_numeric(True)
-        qty_spin.set_range(0, 65536)
-        qty_spin.set_increments(1, 10)
+        self.qty_spin = gtk.SpinButton()
+        self.qty_spin.set_numeric(True)
+        self.qty_spin.set_range(0, 65536)
+        self.qty_spin.set_increments(1, 10)
+        self.qty_spin.set_value(count)
 
         # "Start" button
         start_btn = gtk.Button('Start')
-        start_btn.connect('released', self.start_btn_released)
+        start_btn.connect('released', self.start_btn_released, start_func)
 
         # Output selection
-        outtable_rbtn = gtk.RadioButton(None, 'Table')
-        outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
-        out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
-        out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn]
+        self.outtable_rbtn = gtk.RadioButton(None, 'Table')
+        self.outtable_rbtn.set_name('outtable')
+        outdiagram_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Diagram')
+        outdiagram_rbtn.set_name('outdiagram')
+        out1_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 1')
+        out1_rbtn.set_name('outanother1')
+        out_rbtns = [self.outtable_rbtn, outdiagram_rbtn, out1_rbtn]
 
         hbox = gtk.HBox(False, 4)
         hbox.pack_start(qty_label, False, False, 0)
-        hbox.pack_start(qty_spin, False, False, 0)
+        hbox.pack_start(self.qty_spin, False, False, 0)
         hbox.pack_start(start_btn, False, False, 0)
         for btn in reversed(out_rbtns):
             hbox.pack_end(btn, False, False, 0)
@@ -117,23 +121,26 @@ class Gtk_Presentation(object):
     #=== Functions ============================================================
     def start_btn_released(self, btn, start_func):
         self.stopit = False
-        self.butt_stop.set_sensitive(True)
-        self.butt_start.set_sensitive(False)
-        start_func(self.get_data, self.get_stopit, self.currfilelbl, self.kill_wind)
+        start_func(self.get_data)
 
     def get_data(self):
-        return int(self.qty_spin.get_value())
+        for btn in self.outtable_rbtn.get_group():
+            if btn.get_active():
+                out = btn.get_name()
+        return int(self.qty_spin.get_value()), out
 
     #=== Output type selecting ================================================
-    def show_out_toplevel(self, btn, outtype):
+    def show_out_toplevel(self, btn, outtype, results):
         print 'Entering <' + outtype + '> output mode...'
-
-        out_present = __import__('files.' + outtype, None, None, outtype)   ###
-        toplevel = out_present.Gtk_Presentation().get_toplevel()
-        ###self.vbox.remove(self.vbox.get_children()[2])
-        #self.vbox.add(toplevel)
-        self.vbox.pack_start(toplevel)
-
-#     def run(self):
-#         self.show_all()
-#         gtk.main()
+        out_submodule = __import__('debs.' + outtype, None, None, outtype)
+
+        try:
+            self.current_outtoplevel.destroy()
+        except:
+            pass
+
+        out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
+        self.current_outtoplevel = out_toplevel
+        self.vbox.add(out_toplevel)
+        out_toplevel.show_all()
+#        out_submodule.Gtk_Presentation().show_results(results)
index b309dca..b333057 100755 (executable)
@@ -2,87 +2,91 @@
 # -*-coding: utf-8 -*-
 # vim: sw=4 ts=4 expandtab ai
 
-import gtk
-import gobject
-from random import randint
+from random import random
+from math import pi, cos, sin, sqrt
+import os.path
 
+#==============================================================================
 
-class Control(object):
-    def __init__(self, config):
-        win_width = config.get('window_width')
-        win_height = config.get('window_height')
-        self.out_ui = Out_Diag_Presentation(win_width, win_height)
-
-    def show(self, filelist, fullsize):
-        self.out_ui.get_data(filelist, fullsize)
-
-    def run(self):
-        self.out_ui.run()
-
-
-class Abstraction(object):
+class Cli_Presentation(object):
     pass
 
+#==============================================================================
 
 class Gtk_Presentation(object):
+    def __init__(self, filelist, maxdata=10):
+        import gtk
+        import cairo
 
-    def __init__(self):
-
-        self.area = gtk.DrawingArea()
-        self.area.set_size_request(250, 200) ###
-        self.area.set_events(gtk.gdk.POINTER_MOTION_MASK |
-                             gtk.gdk.POINTER_MOTION_HINT_MASK )
-        self.area.connect('expose-event', self.expose_event)
-        self.pixmap = None
-
-    def expose_event(self, widget, event):
-        if not self.pixmap:
-            self.build_pixmap()
-        x, y, width, height = event.area
-        widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL],
-                                    self.pixmap, x, y, x, y, width, height)
-        return False
-
-    def build_pixmap(self):
-        #self.pixmap = gtk.gdk.Pixmap(self.window, self.width, self.height)
-        self.pixmap = gtk.gdk.Pixmap(None, 250, 200, 8) ###
-        cm = self.pixmap.get_colormap()
-        self.color = {}
-        self.color['black'] = cm.alloc_color('black')
-        self.color['white'] = cm.alloc_color('white')
-        self.gc = self.pixmap.new_gc()
-        self.gc.set_foreground(self.color['white'])
-        self.pixmap.draw_rectangle(self.gc, True, 0, 0, self.width, self.height)
-
-    def draw_diag(self):
-        start_angle = 0
-        for path, size, bsize in self.filelist:
-            end_angle = (bsize*360*64)/self.fullsize
-            print start_angle, end_angle
-            gc = self.pixmap.new_gc()
-            cm = self.pixmap.get_colormap()
-            col1 = cm.alloc_color(self.rand_color())
-            gc.set_foreground(col1)
-            gc.set_line_attributes(1,gtk.gdk.LINE_SOLID,gtk.gdk.CAP_NOT_LAST,gtk.gdk.JOIN_MITER)
-            self.pixmap.draw_arc(gc, True, 0, 0, self.width, self.height, start_angle, end_angle)
-            start_angle = start_angle + end_angle
-        self.area.queue_draw()
+        drawing = gtk.DrawingArea()
 
-    def rand_color(self):
-        r = randint(0, 65535)
-        g = randint(0, 65535)
-        b = randint(0, 65535)
-        return gtk.gdk.Color(r, g, b, 0)
+        # `maxdata` biggest files from list
+        filelist.sort(reverse=True)
+        del filelist[maxdata:]
+        self.filelist = filelist
 
-    def run(self):
-        self.show_all()
-        gobject.timeout_add(1000, self.draw_diag)
-        gtk.main()
+        # sum of sizes
+        fullsize = sum((f[0] for f in filelist))
 
-    def get_data(self, filelist, fullsize):
-        self.filelist = filelist
-        self.fullsize = fullsize
+        # sectors list
+        sectors = []
+        start_angle = 0
+        for bsize, name, size in filelist:
+            color = self.rand_color()
+            delta_angle = (float(bsize)/fullsize)*2*pi
+            end_angle = start_angle + delta_angle
+            color = self.rand_color()
+            sectors.append((start_angle, end_angle, color))
+            start_angle += delta_angle
+
+        drawing.connect('expose-event', self.expose_event, sectors)
+
+        self.toplevel = drawing
+
+    def expose_event(self, widget, event, sectors):
+        x, y, w, h, _ = widget.window.get_geometry()
+        R = min(w-w/3, h)/2 - 20
+
+        cr = widget.window.cairo_create()   # cairo context
+        cr.translate(w/2-w/6, h/2)          # moving coordinates
+
+        # drawing pie chart
+        for i, (start_angle, end_angle, color) in enumerate(sectors):
+            # drawing sector
+            cr.move_to(0, 0)
+            cr.set_source_rgb(*color)
+            cr.arc(0, 0, R, start_angle, end_angle)
+            cr.fill()
+
+            # to cartesian coordinates
+            delta_angle = end_angle - start_angle
+            x = R/1.7 * cos(start_angle+delta_angle/2)
+            y = R/1.7 * sin(start_angle+delta_angle/2)
+            area = 0.5*(delta_angle*R**2)   # sector area
+
+            # drawing text
+            cr.set_font_size(sqrt(area)/3)  # text size
+            text = str(i+1)                 # text string
+            xbearing, ybearing, textw, texth = cr.text_extents(text)[:4]
+            cr.move_to(x-(xbearing+textw/2), y-(ybearing+texth/2))  # text center
+            cr.set_source_rgb(.3, .3, .3)   # text color
+            cr.show_text(text)
+
+        cr.set_font_size(14)
+        cr.translate(w/2-w/6, -h/2+40)  # moving coordinates
+        cr.move_to(0, 0)
+
+        # drawing files list
+        for i, (bsize, name, size) in enumerate(self.filelist):
+            color = sectors[i][2]
+            cr.set_source_rgb(*color)
+            cr.rectangle(-20, 20*i+3, 14, -14)
+            cr.fill()
+
+            text = str(i+1) + '. ' + os.path.basename(name) + ' (' + str(size) + ')'
+            cr.move_to(0, 20*i)
+            cr.set_source_rgb(0, 0, 0)
+            cr.show_text(text)
 
-    #=== Toplevel widget for embedding to search area =========================
-    def get_toplevel(self):
-        return self.area
+    def rand_color(self):
+        return random(), random(), random()
index 6529d6d..7fc52ad 100755 (executable)
@@ -35,7 +35,7 @@ class Gtk_Presentation(object):
         # Определяем переменную в которой будет храниться выводимый список
         self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64)
 
-        for path, size, bsize in filelist:
+        for bsize, path, size in filelist:
             self.liststore.append([path, size, bsize])
 
         treeview = gtk.TreeView(self.liststore)
index e554f4e..7e7c7f2 100755 (executable)
@@ -27,11 +27,11 @@ class Control(object):
 
     def start_search(self, get_data, get_stopit, label, kill_func):
         filelist = []
-        start_path, count = get_data()
+        start_path, count, outtype = get_data()
         search_func = self.abstrac.filegetter(start_path, get_stopit, label)
         for fsize, fpath in nlargest(count, search_func):
-            filelist.append([fpath, size_hum_read(fsize), int(fsize)])
-        self.present.show_out_toplevel(None, 'outtable', filelist)
+            filelist.append([int(fsize), fpath, size_hum_read(fsize)])
+        self.present.show_out_toplevel(None, outtype, filelist)
 
     def run(self):
         return self.present.toplevel
@@ -117,11 +117,15 @@ class Gtk_Presentation(object):
         self.stop_btn.connect('clicked', self.stop_btn_clicked)
 
         # Output selection
-        outtable_rbtn = gtk.RadioButton(None, 'Table')
-        outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
-        out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
-        out2_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 2')
-        out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn, out2_rbtn]
+        self.outtable_rbtn = gtk.RadioButton(None, 'Table')
+        self.outtable_rbtn.set_name('outtable')
+        outdiagram_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Diagram')
+        outdiagram_rbtn.set_name('outdiagram')
+        out1_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 1')
+        out1_rbtn.set_name('outanother1')
+        out2_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 2')
+        out2_rbtn.set_name('outanother2')
+        out_rbtns = [self.outtable_rbtn, outdiagram_rbtn, out1_rbtn, out2_rbtn]
 
         hbox = gtk.HBox(False, 4)
         hbox.pack_start(qty_label, False, False, 0)
@@ -164,7 +168,10 @@ class Gtk_Presentation(object):
         self.start_btn.set_sensitive(True)
 
     def get_data(self):
-        return self.path_entry.get_text(), int(self.qty_spin.get_value())
+        for btn in self.outtable_rbtn.get_group():
+            if btn.get_active():
+                out = btn.get_name()
+        return self.path_entry.get_text(), int(self.qty_spin.get_value()), out
 
     def get_stopit(self):
         return self.stopit
@@ -173,12 +180,14 @@ class Gtk_Presentation(object):
     def show_out_toplevel(self, btn, outtype, results):
         print 'Entering <' + outtype + '> output mode...'
         out_submodule = __import__('files.' + outtype, None, None, outtype)
-        out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
 
         try:
-            self.vbox.remove(self.vbox.get_children()[2])
+            self.current_outtoplevel.destroy()
         except:
             pass
+
+        out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
+        self.current_outtoplevel = out_toplevel
         self.vbox.add(out_toplevel)
         out_toplevel.show_all()
 #        out_submodule.Gtk_Presentation().show_results(results)