[Ocfs2-tools-commits] manish commits r714 - trunk/ocfs2console/ocfs2interface

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Sun Mar 20 23:32:04 CST 2005


Author: manish
Date: 2005-03-20 23:32:02 -0600 (Sun, 20 Mar 2005)
New Revision: 714

Added:
   trunk/ocfs2console/ocfs2interface/partitionview.py
Modified:
   trunk/ocfs2console/ocfs2interface/Makefile
   trunk/ocfs2console/ocfs2interface/console.py
   trunk/ocfs2console/ocfs2interface/fsck.py
   trunk/ocfs2console/ocfs2interface/menu.py
   trunk/ocfs2console/ocfs2interface/toolbar.py
Log:
Factored out PartitionView into its own file, more context on widget
sensitivity.


Modified: trunk/ocfs2console/ocfs2interface/Makefile
===================================================================
--- trunk/ocfs2console/ocfs2interface/Makefile	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/Makefile	2005-03-21 05:32:02 UTC (rev 714)
@@ -65,6 +65,7 @@
 	guiutil.py \
 	menu.py \
 	nodemap.py \
+	partitionview.py \
 	process.py \
 	toolbar.py \
 	tune.py

Modified: trunk/ocfs2console/ocfs2interface/console.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/console.py	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/console.py	2005-03-21 05:32:02 UTC (rev 714)
@@ -17,10 +17,9 @@
 
 import gtk
 
-import ocfs2
-
 from guiutil import set_props, error_box, query_text
 
+from partitionview import PartitionView
 from menu import Menu
 from toolbar import Toolbar
 from about import about, process_gui_args
@@ -33,114 +32,12 @@
 from clconfig import cluster_configurator
 from fsck import fsck_volume
 
-COLUMN_DEVICE = 0
-COLUMN_MOUNTPOINT = 1
-
-notebook_items = (
-    ('general', 'General',          General),
-    ('browser', 'File Listing',     Browser),
-    ('nodemap', 'Configured Nodes', NodeMap),
+info_items = (
+    ('General',          General),
+    ('File Listing',     Browser),
+    ('Configured Nodes', NodeMap),
 )
 
-class PartitionView(gtk.TreeView):
-    def __init__(self):
-        store = gtk.ListStore(str, str, str)
-
-        gtk.TreeView.__init__(self, store)
-
-        self.insert_column_with_attributes(-1, 'Device',
-                                           gtk.CellRendererText(),
-                                           text=COLUMN_DEVICE)
-        self.insert_column_with_attributes(-1, 'Mountpoint',
-                                           gtk.CellRendererText(),
-                                           text=COLUMN_MOUNTPOINT)
-
-        sel = self.get_selection()
-        sel.connect('changed', self.on_select)
-
-    def get_sel_values(self):
-        sel = self.get_selection()
-        store, iter = sel.get_selected()
-
-        if store and iter:
-            return store[iter]
-        else:
-            return (None, None)
-
-    def get_device(self):
-        selection = self.get_sel_values()
-        return selection[COLUMN_DEVICE]
-
-    def on_select(self, sel):
-        self.selected = True
-
-        device, mountpoint = self.get_sel_values()
-
-        if mountpoint:
-            self.mount_button.set_sensitive(False)
-            self.unmount_button.set_sensitive(True)
-        else:
-            self.mount_button.set_sensitive(True)
-            self.unmount_button.set_sensitive(False)
-
-        self.update_notebook(device)
-
-    def update_notebook(self, device):
-        for tag, d, info in notebook_items:
-            frame = getattr(self, tag + '_frame')
-            frame.child.destroy()
-
-            frame.add(info(device).widget)
-            frame.show_all()
-
-    def select_device(self, device):
-        for row in self.get_model():
-            if row[COLUMN_DEVICE] == device:
-               sel = self.get_selection()
-               sel.select_iter(row.iter)
-
-    def refresh_partitions(self):
-        def list_compare(store, a, b):
-            d1, m1 = store[a]
-            d2, m2 = store[b]
-
-            if m1 and not m2:
-                return -1
-            elif not m1 and m2:
-                return 1
-            else:
-                return cmp(d1, d2)
-
-        self.mount_button.set_sensitive(False)
-        self.unmount_button.set_sensitive(False)
-
-        filter = self.filter_entry.get_text()
-
-        old_device = self.get_device()
-
-        store = gtk.ListStore(str, str)
-        self.set_model(store)
-
-        self.store = store
-        self.sel = self.get_selection()
-        self.selected = False
-
-        store.set_sort_func(COLUMN_DEVICE, list_compare)
-        store.set_sort_column_id(COLUMN_DEVICE, gtk.SORT_ASCENDING)
-
-        ocfs2.partition_list(self.add_partition, data=old_device,
-                             filter=filter, fstype='ocfs2', async=True)
-
-        if len(store) and not self.selected:
-            self.sel.select_iter(store.get_iter_first())
-
-    def add_partition(self, device, mountpoint, fstype, old_device):
-        iter = self.store.append((device, mountpoint))
-
-        if device == old_device:
-            self.sel.select_iter(iter)
-            self.selected = True
-
 class Console(gtk.Window):
     def __init__(self):
         gtk.Window.__init__(self)
@@ -151,26 +48,44 @@
                         border_width=0)
         self.connect('delete_event', self.cleanup)
 
-        pv = PartitionView()
+        notebook = gtk.Notebook()
+        notebook.set_tab_pos(gtk.POS_TOP)
 
+        info_frames = []
+
+        for desc, info in info_items:
+            frame = gtk.Frame()
+            set_props(frame, shadow=gtk.SHADOW_NONE,
+                             border_width=0)
+
+            notebook.add_with_properties(frame, 'tab_label', desc)
+
+            info_frames.append((frame, info))
+
+        self.pv = PartitionView(info_frames)
+
         vbox = gtk.VBox()
         self.add(vbox)
 
-        self.menu = Menu(self)
+        menu = Menu(self)
 
-        menubar = self.menu.get_widget(pv)
+        menubar, unmounted_items = menu.get_widgets()
         vbox.pack_start(menubar, expand=False, fill=False)
 
-        self.toolbar = Toolbar(self)
+        self.pv.add_unmount_widgets(unmounted_items)
 
-        tb, buttons, pv.filter_entry = self.toolbar.get_widgets(pv)
+        toolbar = Toolbar(self)
+
+        tb, buttons, filter_entry = toolbar.get_widgets()
         vbox.pack_start(tb, expand=False, fill=False)
 
-        for k, v in buttons.iteritems():
-            setattr(pv, k + '_button', v)
+        self.pv.add_mount_widgets(buttons['unmount'])
+        self.pv.add_unmount_widgets(buttons['mount'])
 
-        pv.filter_entry.connect('activate', self.filter_update, pv)
+        filter_entry.connect('activate', self.refresh)
 
+        self.pv.set_filter_entry(filter_entry)
+
         vpaned = gtk.VPaned()
         vpaned.set_border_width(4)
         vbox.pack_start(vpaned, expand=True, fill=True)
@@ -178,40 +93,28 @@
         scrl_win = gtk.ScrolledWindow()
         set_props(scrl_win, hscrollbar_policy=gtk.POLICY_AUTOMATIC,
                             vscrollbar_policy=gtk.POLICY_AUTOMATIC)
-        scrl_win.add(pv)
+        scrl_win.add(self.pv)
         vpaned.pack1(scrl_win)
 
-        notebook = gtk.Notebook()
-        notebook.set_tab_pos(gtk.POS_TOP)
         vpaned.pack2(notebook)
 
-        for tag, desc, info in notebook_items:
-            frame = gtk.Frame()
-            set_props(frame, shadow=gtk.SHADOW_NONE,
-                             border_width=0)
-
-            tag = tag + '_frame'
-            setattr(pv, tag, frame)
-
-            frame.add(info().widget)
-            frame.show_all()
-
-            notebook.add_with_properties(frame, 'tab_label', desc)
-
-        pv.refresh_partitions()
-        pv.grab_focus()
-
+        self.pv.grab_focus()
         self.show_all()
 
+        self.refresh()
+
     def cleanup(self, *args):
         gtk.main_quit()
 
-    def about(self, pv):
+    def about(self):
         about(self)
 
-    def mount(self, pv):
-        device, mountpoint = pv.get_sel_values()
+    def refresh(self, *args):
+        self.pv.refresh_partitions()
 
+    def mount(self):
+        device, mountpoint = self.pv.get_sel_values()
+
         mountpoint = query_text(self, 'Mountpoint')
         if not mountpoint:
             return
@@ -229,19 +132,15 @@
             else:
                 error_box(self, '%s: Could not mount %s' % (output, device))
 
-        pv.refresh_partitions()
+    def unmount(self):
+        device, mountpoint = self.pv.get_sel_values()
 
-    def unmount(pv):
-        device, mountpoint = pv.get_sel_values()
-
         command = ('umount', mountpoint)
 
         p = Process(command, 'Unmount', 'Unmounting...', self, spin_now=False)
         success, output, killed = p.reap()
 
-        if success:
-            pv.refresh_partitions()
-        else:
+        if not success:
             if killed:
                 error_box(self, 'umount died unexpectedly! Your system is '
                                 'probably in an inconsistent state. You '
@@ -250,38 +149,24 @@
                 error_box(self, '%s: Could not unmount %s mounted on %s' %
                                 (output, device, mountpoint))
 
-    def refresh(self, pv):
-        pv.refresh_partitions()
+    def format(self):
+        format_partition(self, self.pv.get_device())
 
-        if len(pv.get_model()) == 0:
-            pv.update_notebook(None)
+    def relabel(self):
+        tune_label(self, self.pv.get_device())
 
-    def format(self, pv):
-        format_partition(self, pv.get_device())
-        pv.refresh_partitions()
+    def node_num(self):
+        tune_nodes(self, self.pv.get_device())
 
-    def relabel(self, pv):
-        tune_label(self, pv.get_device())
-        pv.refresh_partitions()
+    def check(self):
+        fsck_volume(self, self.pv.get_device(), check=True)
 
-    def node_num(self, pv):
-        tune_nodes(self, pv.get_device())
-        pv.refresh_partitions()
+    def repair(self):
+        fsck_volume(self, self.pv.get_device(), check=False)
 
-    def check(self, pv):
-        fsck_volume(self, pv.get_device(), check=True)
-        pv.refresh_partitions()
-
-    def repair(self, pv):
-        fsck_volume(self, pv.get_device(), check=False)
-        pv.refresh_partitions()
-
-    def clconfig(self, pv):
+    def clconfig(self):
         cluster_configurator(self)
 
-    def filter_update(self, entry, pv):
-        refresh(pv)
-
 def main():
     process_gui_args()
     console = Console()

Modified: trunk/ocfs2console/ocfs2interface/fsck.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/fsck.py	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/fsck.py	2005-03-21 05:32:02 UTC (rev 714)
@@ -15,13 +15,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
 
-import os
-
 import gobject
 import gtk
 
 from guiutil import set_props
 
+base_command = ('fsck.ocfs2',)
+
 try:
     import vte
 except ImportError:
@@ -52,8 +52,8 @@
     frame.add(hbox)
 
     terminal = vte.Terminal()
-    terminal.set_scrollback_lines(2048)
-    terminal.set_font_from_string('monospace 12')
+    terminal.set_scrollback_lines(8192)
+    #terminal.set_font_from_string('monospace 12')
     hbox.pack_start(terminal)
 
     scrollbar = gtk.VScrollbar()
@@ -96,14 +96,14 @@
     dialog.finished = True
 
 def fsck_command(device, check):
-    command = ['fsck.ocfs2']
+    command = list(base_command)
 
     if check:
         command.append('-n')
     else:
         command.append('-y')
 
-    command.append(device)
+    command.append("'%s'" % device)
 
     realcommand = '%s; sleep 1' % ' '.join(command)
 

Modified: trunk/ocfs2console/ocfs2interface/menu.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/menu.py	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/menu.py	2005-03-21 05:32:02 UTC (rev 714)
@@ -25,36 +25,36 @@
     stock_about = ''
 
 file_menu_data = (
-    ('/_File',                     None,         None,      0, '<Branch>'),
-    ('/File/_Quit',                None,         'cleanup', 0, '<StockItem>',
+    ('/_File',                     None,         None,       0, '<Branch>'),
+    ('/File/_Quit',                None,         'cleanup',  0, '<StockItem>',
      gtk.STOCK_QUIT)
 )
 
 help_menu_data = (
-    ('/_Help',                     None,         None,      0, '<Branch>'),
-    ('/Help/_About',               None,         'about',   0, '<StockItem>',
+    ('/_Help',                     None,         None,       0, '<Branch>'),
+    ('/Help/_About',               None,         'about',    0, '<StockItem>',
      stock_about)
 )
 
 if fsck_ok:
     task_menu_fsck_data = (
-        ('/Tasks/Chec_k...',       '<control>K', 'check'),
-        ('/Tasks/_Repair...',      '<control>R', 'repair'),
-        ('/Tasks/---',             None,         None,      0, '<Separator>')
+        ('/Tasks/Chec_k...',       '<control>K', 'check',    'refresh'),
+        ('/Tasks/_Repair...',      '<control>R', 'repair',   'refresh', True),
+        ('/Tasks/---',             None,         None,       0, '<Separator>')
     )
 else:
     task_menu_fsck_data = ()
 
 task_menu_head_data = (
-    ('/_Tasks',                    None,         None,      0, '<Branch>'),
-    ('/Tasks/_Format...',          '<control>F', 'format'),
-    ('/Tasks/---',                 None,         None,      0, '<Separator>')
+    ('/_Tasks',                    None,         None,       0, '<Branch>'),
+    ('/Tasks/_Format...',          '<control>F', 'format',   'refresh'),
+    ('/Tasks/---',                 None,         None,       0, '<Separator>')
 )
 
 task_menu_tail_data = (
-    ('/Tasks/Change _Label...',    None,         'relabel'),
-    ('/Tasks/Edit _Node Count...', None,         'node_num'),
-    ('/Tasks/---',                 None,         None,      0, '<Separator>'),
+    ('/Tasks/Change _Label...',    None,         'relabel',  'refresh', True),
+    ('/Tasks/Edit _Node Count...', None,         'node_num', 'refresh', True),
+    ('/Tasks/---',                 None,         None,       0, '<Separator>'),
     ('/Tasks/_Cluster Config...',  None,         'clconfig')
 )
 
@@ -68,31 +68,59 @@
 
         self.items = []
 
-        for i in menu_data:
-            item = list(i)
+        for data in menu_data:
+            item = list(data)
 
-            if i[2]:
+            data_list = [None] * 6
+            data_list[0:len(data)] = data
+
+            path, accel, callback, sub_callback, item_type, extra = data_list
+
+            if item_type is True:
+                del item[4:]
+
+            if callback:
                 def make_cb():
-                    callback = getattr(window, i[2])
+                    cb = getattr(window, callback)
 
-                    def cb(d, a, w):
-                        callback(d)
+                    if sub_callback:
+                        del item[3:]
 
-                    return cb
+                        sub_cb = getattr(window, sub_callback)
 
+                        def cb_func(a, w):
+                            cb()
+                            sub_cb()
+                    else:
+                        def cb_func(a, w):
+                            cb()
+
+                    return cb_func
+
                 item[2] = make_cb()
 
             self.items.append(tuple(item))
 
-    def get_widget(self, data=None):
+    def get_widgets(self):
         accel_group = gtk.AccelGroup()
         self.window.add_accel_group(accel_group)
 
-        self.item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
-        self.item_factory.create_items(self.items, data)
+        item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
+        item_factory.create_items(self.items)
 
-        return self.item_factory.get_widget('<main>')
+        menu_bar = item_factory.get_widget('<main>')
 
+        widgets = []
+        
+        for data in menu_data:
+            if len(data) >= 5 and data[4] is True:
+                path = data[0].replace('_', '')
+                widgets.append(item_factory.get_item('<main>%s' % path))
+
+        self.window.item_factory = item_factory
+                  
+        return menu_bar, widgets
+
 def main():
     def dummy(*args):
         gtk.main_quit()
@@ -100,16 +128,18 @@
     window = gtk.Window()
     window.connect('delete_event', dummy)
 
+    window.refresh = dummy
+
     for i in menu_data:
         if i[2]:
             setattr(window, i[2], dummy)
 
-    menubar = Menu(window)
+    menu = Menu(window)
 
     vbox = gtk.VBox()
     window.add(vbox)
 
-    vbox.add(menubar.get_widget())
+    vbox.add(menu.get_widgets()[0])
 
     window.show_all()
 

Added: trunk/ocfs2console/ocfs2interface/partitionview.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/partitionview.py	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/partitionview.py	2005-03-21 05:32:02 UTC (rev 714)
@@ -0,0 +1,161 @@
+# OCFS2Console - GUI frontend for OCFS2 management and debugging
+# Copyright (C) 2002, 2005 Oracle.  All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
+
+import gtk
+
+import ocfs2
+
+COLUMN_DEVICE = 0
+COLUMN_MOUNTPOINT = 1
+
+class PartitionView(gtk.TreeView):
+    def __init__(self, info_frames=()):
+        store = gtk.ListStore(str, str, str)
+
+        gtk.TreeView.__init__(self, store)
+
+        self.insert_column_with_attributes(-1, 'Device',
+                                           gtk.CellRendererText(),
+                                           text=COLUMN_DEVICE)
+        self.insert_column_with_attributes(-1, 'Mountpoint',
+                                           gtk.CellRendererText(),
+                                           text=COLUMN_MOUNTPOINT)
+
+        sel = self.get_selection()
+        sel.connect('changed', self.on_select)
+
+        self.filter_entry = None
+
+        self.mount_widgets = []
+        self.unmount_widgets = []
+
+        self.info_frames = tuple(info_frames)
+
+    def get_sel_values(self):
+        sel = self.get_selection()
+        store, iter = sel.get_selected()
+
+        if store and iter:
+            return store[iter]
+        else:
+            return (None, None)
+
+    def get_device(self):
+        selection = self.get_sel_values()
+        return selection[COLUMN_DEVICE]
+
+    def on_select(self, sel):
+        self.selected = True
+
+        device, mountpoint = self.get_sel_values()
+
+        if mountpoint:
+            self.set_widgets_sensitive(self.mount_widgets, True)
+            self.set_widgets_sensitive(self.unmount_widgets, False)
+        else:
+            self.set_widgets_sensitive(self.mount_widgets, False)
+            self.set_widgets_sensitive(self.unmount_widgets, True)
+
+        self.update_info(device)
+
+    def update_info(self, device):
+        for frame, info in self.info_frames:
+            if frame.child:
+                frame.child.destroy()
+
+            frame.add(info(device).widget)
+            frame.show_all()
+
+    def select_device(self, device):
+        for row in self.get_model():
+            if row[COLUMN_DEVICE] == device:
+               sel = self.get_selection()
+               sel.select_iter(row.iter)
+
+    def refresh_partitions(self):
+        def list_compare(store, a, b):
+            d1, m1 = store[a]
+            d2, m2 = store[b]
+
+            if m1 and not m2:
+                return -1
+            elif not m1 and m2:
+                return 1
+            else:
+                return cmp(d1, d2)
+
+        self.set_widgets_sensitive(self.mount_widgets, False)
+        self.set_widgets_sensitive(self.unmount_widgets, False)
+
+        if self.filter_entry:
+            filter = self.filter_entry.get_text()
+        else:
+            filter = None
+
+        old_device = self.get_device()
+
+        store = gtk.ListStore(str, str)
+        self.set_model(store)
+
+        self.store = store
+        self.sel = self.get_selection()
+        self.selected = False
+
+        store.set_sort_func(COLUMN_DEVICE, list_compare)
+        store.set_sort_column_id(COLUMN_DEVICE, gtk.SORT_ASCENDING)
+
+        ocfs2.partition_list(self.add_partition, data=old_device,
+                             filter=filter, fstype='ocfs2', async=True)
+
+        if len(store):
+            if not self.selected:
+                self.sel.select_iter(store.get_iter_first())
+        else:
+            self.update_info(None)
+
+    def add_partition(self, device, mountpoint, fstype, old_device):
+        iter = self.store.append((device, mountpoint))
+
+        if device == old_device:
+            self.sel.select_iter(iter)
+            self.selected = True
+
+    def set_filter_entry(self, entry):
+        self.filter_entry = entry
+
+    def add_to_widget_list(self, widget_list, widgets):
+        try:
+            widget_list.extend(widgets)
+        except TypeError:
+            widget_list.append(widgets)
+
+    def add_mount_widgets(self, widgets):
+        self.add_to_widget_list(self.mount_widgets, widgets)
+
+    def add_unmount_widgets(self, widgets):
+        self.add_to_widget_list(self.unmount_widgets, widgets)
+            
+    def set_widgets_sensitive(self, widgets, sensitive=True):
+        for widget in widgets:
+            widget.set_sensitive(sensitive)
+
+def main():
+    console = Console()
+    gtk.main()
+
+if __name__ == '__main__':
+    main()

Modified: trunk/ocfs2console/ocfs2interface/toolbar.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/toolbar.py	2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/toolbar.py	2005-03-21 05:32:02 UTC (rev 714)
@@ -27,23 +27,25 @@
     def __init__(self, window):
         self.window = window
 
-    def get_widgets(self, data=None):
+    def get_widgets(self):
         toolbar = gtk.Toolbar()
         items = {}
 
-        for i in toolbar_data:
+        for data in toolbar_data:
+            label, stock_id, callback = data
+
             def make_cb():
-                callback = getattr(self.window, i[2])
+                cb = getattr(self.window, callback)
 
-                def cb(w, d=None):
-                    callback(d)
+                def cb_func(w):
+                    cb()
 
-                return cb
+                return cb_func
 
             icon = gtk.Image()
-            icon.set_from_stock(i[1], gtk.ICON_SIZE_BUTTON)
-            items[i[2]] = toolbar.append_item(i[0], i[0], None, icon,
-                                              make_cb(), data)
+            icon.set_from_stock(stock_id, gtk.ICON_SIZE_BUTTON)
+            items[callback] = toolbar.append_item(label, label, None, icon,
+                                                  make_cb())
 
         toolbar.append_space()
 



More information about the Ocfs2-tools-commits mailing list