Re: [patch] system-config-services multiple inits

Daniel J Walsh <[email protected]> Thu, 17 Feb 2005 17:38:33 -0500
Newsgroups gmane.linux.redhat.fedora.configuration
Message-ID <[email protected]>
Charlie Brej wrote:

> System-config-services currently only allows one level to be changed 
> at a time (before saving and changing runlevel). This is annoying when 
> adding a service to all init levels and gives poor visibility.
> The patch gives a fourth option on the Runlevel menu ("All"). This 
> allows you to edit all 3 levels on the same screen. It is not the 
> default option and at startup will default to one of the other three. 
> There is a screenshot at: 
> http://www.cs.man.ac.uk/~brejc8/temp/sevices.png
>
> This is my first time programming python so I probably did something 
> wrong (or at least not safely/optimally). At startup all 7 init level 
> columns are initiated but the runlevel menu selects which ones are 
> visible (3, 4, 5, 3-5). It is possible to view all or any (0-6) levels 
> by adding or changing the menu options. I did a bit of testing but I 
> again stress I am very (2 days) new to this.
>
> Minor points:
> I removed columns from class CheckList (allowing two text fields) as I 
> thought this might become confusing and the second field wasn't used 
> anyway.
>
> Glade has changed the numbers of images as well as adding a load of 
> stuff. I think this is because I am using a newer version but this 
> shouldn't change anything.
>
>  
>
Looks good.
update system-config-services 0.8.19-1

>------------------------------------------------------------------------
>
>Index: src/checklist.py
>===================================================================
>RCS file: /usr/local/CVS/redhat-config-services/src/checklist.py,v
>retrieving revision 1.2
>diff -u -3 -p -r1.2 checklist.py
>--- src/checklist.py	5 Feb 2004 23:27:42 -0000	1.2
>+++ src/checklist.py	15 Feb 2005 19:25:53 -0000
>@@ -22,42 +22,33 @@ class CheckList (gtk.TreeView):
>     """A class (derived from gtk.TreeView) that provides a list of
>     checkbox / text string pairs"""
> 
>-    # override this to make your own columns if necessary
>-    def create_columns(self, columns):
>-        # add the string columns to the tree view widget
>-        for i in range(1, columns + 1):
>-            renderer = gtk.CellRendererText()
>-            column = gtk.TreeViewColumn('Text', renderer, text=i)
>-            column.set_clickable(gtk.FALSE)
>-            self.append_column(column)
>-
>     # XXX need to handle the multicolumn case better still....
>-    def __init__ (self, columns = 1, custom_store=None):
>+    def __init__ (self, custom_store=None):
> 
> 	if not custom_store:
>-	    self.store = gtk.TreeStore(gobject.TYPE_BOOLEAN,
>-				       gobject.TYPE_STRING,
>-				       gobject.TYPE_STRING)
>+	    self.store = gtk.TreeStore(gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,
>+                                   gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_STRING)
> 	else:
> 	    self.store = custom_store
>-	    
>+
>         gtk.TreeView.__init__ (self, self.store)
>         
>-        # XXX we only handle two text columns right now
>-        if custom_store == None and columns > 2:
>-            raise RuntimeError, "CheckList supports a maximum of 2 columns"
>-	
>-        self.columns = columns
>-	
>-        self.checkboxrenderer = gtk.CellRendererToggle()
>-        column = gtk.TreeViewColumn('', self.checkboxrenderer, active=0)
>-        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
>-        column.set_fixed_width(40)
>-        column.set_clickable(gtk.TRUE)
>-        self.checkboxrenderer.connect ("toggled", self.toggled_item)        
>-        self.append_column(column)
>+        self.checkboxrenderer = [None,None,None,None,None,None,None,None]
>+        
>+        for i in range(0, 7):
>+            self.checkboxrenderer[i] = gtk.CellRendererToggle()
>+            column = gtk.TreeViewColumn("Init %d" % i, self.checkboxrenderer[i], active=i)
>+            column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
>+            column.set_fixed_width(40)
>+            column.set_clickable(gtk.TRUE)
>+            self.checkboxrenderer[i].connect ("toggled", self.toggled_item, i)
>+            self.append_column(column)
>+            
> 
>-	self.create_columns(columns)
>+        renderer = gtk.CellRendererText()
>+        column = gtk.TreeViewColumn('Text', renderer, text=7)
>+        column.set_clickable(gtk.FALSE)
>+        self.append_column(column)
> 
>         self.set_rules_hint(gtk.FALSE)
>         self.set_headers_visible(gtk.FALSE)
>@@ -68,32 +59,29 @@ class CheckList (gtk.TreeView):
>         # iterate over them all
>         self.num_rows = 0
> 
>-    def append_row (self, textList, init_value):
>+    def append_row (self, text, init_valueList):
>         """Add a row to the list.
>         text: text to display in the row
>         init_value: initial state of the indicator"""
> 
>-        textList = ("",) + textList        
>         iter = self.store.append(None)
>-        self.store.set_value(iter, 0, init_value)
>+        for i in range(0, 7):
>+            self.store.set_value(iter, i, int(init_valueList[i]))
> 
>         # add the text for the number of columns we have
>-        i = 1
>-        for text in textList[1:self.columns + 1]:
>-            self.store.set_value(iter, i, textList[i])
>-            i = i + 1
>+        self.store.set_value(iter, 7, text)
> 
>         self.num_rows = self.num_rows + 1
> 
> 
>-    def toggled_item(self, data, row):
>+    def toggled_item(self, data, row, column):
>         """Set a function to be called when the value of a row is toggled.
>         The  function will be called with two arguments, the clicked item
>         in the row and a string for which row was clicked."""
>         
>         iter = self.store.get_iter((int(row),))
>-        val = self.store.get_value(iter, 0)
>-        self.store.set_value(iter, 0, not val)
>+        val = self.store.get_value(iter, column)
>+        self.store.set_value(iter, column, not val)
> 
> 
>     def clear (self):
>@@ -102,12 +90,12 @@ class CheckList (gtk.TreeView):
>         self.num_rows = 0
> 
> 
>-    def get_active(self, row):
>+    def get_active(self, row, column):
>         """Return FALSE or TRUE as to whether or not the row is toggled
>         similar to GtkToggleButtons"""
> 
>         iter = self.store.get_iter((row,))
>-        return self.store.get_value(iter, 0)
>+        return self.store.get_value(iter, column)
> 
> 
>     def set_active(self, row, is_active):
>@@ -121,7 +109,7 @@ class CheckList (gtk.TreeView):
>         "Get the text from row and column"
> 
>         iter = self.store.get_iter((row,))
>-        return self.store.get_value(iter, column)
>+        return self.store.get_value(iter, 7)
> 
> 
>     def set_column_title(self, column, title):
>@@ -154,6 +142,21 @@ class CheckList (gtk.TreeView):
>         col = self.get_column(column)
>         if col:
>             col.set_sizing(sizing)
>+
>+    def set_column_visible(self, column, visible):
>+        "Set the column visibility"
>+
>+        col = self.get_column(column)
>+        if col:
>+            col.set_visible(visible)
>+
>+    def set_headers_visible(self, visible):
>+        "Set the column visibility"
>+
>+        if visible != 0:
>+            gtk.TreeView.set_headers_visible(self, gtk.TRUE)
>+        else:
>+            gtk.TreeView.set_headers_visible(self, gtk.FALSE)
> 
>     def set_column_sort_id(self, column, id):
>         "Set the sort id of column to id"
>Index: src/serviceconf.glade
>===================================================================
>RCS file: /usr/local/CVS/redhat-config-services/src/serviceconf.glade,v
>retrieving revision 1.18
>diff -u -3 -p -r1.18 serviceconf.glade
>--- src/serviceconf.glade	24 Mar 2004 16:59:37 -0000	1.18
>+++ src/serviceconf.glade	15 Feb 2005 19:25:53 -0000
>@@ -104,6 +104,11 @@
>   <property name="modal">False</property>
>   <property name="resizable">True</property>
>   <property name="destroy_with_parent">False</property>
>+  <property name="decorated">True</property>
>+  <property name="skip_taskbar_hint">False</property>
>+  <property name="skip_pager_hint">False</property>
>+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
>+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
>   <property name="has_separator">True</property>
> 
>   <child internal-child="vbox">
>@@ -123,6 +128,7 @@
> 	      <property name="can_default">True</property>
> 	      <property name="can_focus">True</property>
> 	      <property name="relief">GTK_RELIEF_NORMAL</property>
>+	      <property name="focus_on_click">True</property>
> 	      <property name="response_id">-9</property>
> 
> 	      <child>
>@@ -132,6 +138,10 @@
> 		  <property name="yalign">0.5</property>
> 		  <property name="xscale">0</property>
> 		  <property name="yscale">0</property>
>+		  <property name="top_padding">0</property>
>+		  <property name="bottom_padding">0</property>
>+		  <property name="left_padding">0</property>
>+		  <property name="right_padding">0</property>
> 
> 		  <child>
> 		    <widget class="GtkHBox" id="hbox1">
>@@ -191,6 +201,7 @@
> 	      <property name="label">gtk-cancel</property>
> 	      <property name="use_stock">True</property>
> 	      <property name="relief">GTK_RELIEF_NORMAL</property>
>+	      <property name="focus_on_click">True</property>
> 	      <property name="response_id">-6</property>
> 	    </widget>
> 	  </child>
>@@ -203,6 +214,7 @@
> 	      <property name="label">gtk-save</property>
> 	      <property name="use_stock">True</property>
> 	      <property name="relief">GTK_RELIEF_NORMAL</property>
>+	      <property name="focus_on_click">True</property>
> 	      <property name="response_id">-8</property>
> 	    </widget>
> 	  </child>
>@@ -226,6 +238,7 @@
> 	      <property name="visible">True</property>
> 	      <property name="can_focus">True</property>
> 	      <property name="relief">GTK_RELIEF_NONE</property>
>+	      <property name="focus_on_click">True</property>
> 
> 	      <child>
> 		<widget class="GtkImage" id="image44">
>@@ -249,6 +262,8 @@
> 	  <child>
> 	    <widget class="GtkEventBox" id="eventbox1">
> 	      <property name="visible">True</property>
>+	      <property name="visible_window">True</property>
>+	      <property name="above_child">False</property>
> 
> 	      <child>
> 		<widget class="GtkLabel" id="label4">
>@@ -291,6 +306,11 @@ Do you want to save the changes?</proper
>   <property name="modal">False</property>
>   <property name="resizable">True</property>
>   <property name="destroy_with_parent">False</property>
>+  <property name="decorated">True</property>
>+  <property name="skip_taskbar_hint">False</property>
>+  <property name="skip_pager_hint">False</property>
>+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
>+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
>   <property name="has_separator">True</property>
> 
>   <child internal-child="vbox">
>@@ -312,6 +332,7 @@ Do you want to save the changes?</proper
> 	      <property name="label">gtk-cancel</property>
> 	      <property name="use_stock">True</property>
> 	      <property name="relief">GTK_RELIEF_NORMAL</property>
>+	      <property name="focus_on_click">True</property>
> 	      <property name="response_id">-6</property>
> 	    </widget>
> 	  </child>
>@@ -324,6 +345,7 @@ Do you want to save the changes?</proper
> 	      <property name="label">gtk-ok</property>
> 	      <property name="use_stock">True</property>
> 	      <property name="relief">GTK_RELIEF_NORMAL</property>
>+	      <property name="focus_on_click">True</property>
> 	      <property name="response_id">-5</property>
> 	    </widget>
> 	  </child>
>@@ -393,7 +415,7 @@ Do you want to save the changes?</proper
> </widget>
> 
> <widget class="GtkWindow" id="winMain">
>-  <property name="width_request">550</property>
>+  <property name="width_request">600</property>
>   <property name="height_request">450</property>
>   <property name="visible">True</property>
>   <property name="title" translatable="yes">Service Configuration</property>
>@@ -402,6 +424,11 @@ Do you want to save the changes?</proper
>   <property name="modal">False</property>
>   <property name="resizable">True</property>
>   <property name="destroy_with_parent">False</property>
>+  <property name="decorated">True</property>
>+  <property name="skip_taskbar_hint">False</property>
>+  <property name="skip_pager_hint">False</property>
>+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
>+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
> 
>   <child>
>     <widget class="GtkVBox" id="vbox2">
>@@ -432,7 +459,7 @@ Do you want to save the changes?</proper
> 		      <accelerator key="s" modifiers="GDK_CONTROL_MASK" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image112">
>+			<widget class="GtkImage" id="image176">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-save</property>
> 			  <property name="icon_size">1</property>
>@@ -454,7 +481,7 @@ Do you want to save the changes?</proper
> 		      <accelerator key="l" modifiers="GDK_CONTROL_MASK" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image113">
>+			<widget class="GtkImage" id="image177">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-undo</property>
> 			  <property name="icon_size">1</property>
>@@ -468,7 +495,7 @@ Do you want to save the changes?</proper
> 		  </child>
> 
> 		  <child>
>-		    <widget class="GtkMenuItem" id="separator2">
>+		    <widget class="GtkSeparatorMenuItem" id="separator2">
> 		      <property name="visible">True</property>
> 		    </widget>
> 		  </child>
>@@ -481,7 +508,7 @@ Do you want to save the changes?</proper
> 		      <signal name="activate" handler="on_mnuExit_activate" last_modification_time="Tue, 16 Mar 2004 19:59:51 GMT"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image114">
>+			<widget class="GtkImage" id="image178">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-quit</property>
> 			  <property name="icon_size">1</property>
>@@ -538,7 +565,7 @@ Do you want to save the changes?</proper
> 		      <signal name="activate" handler="on_add_service_activate" last_modification_time="Wed, 09 Jul 2003 13:25:47 GMT"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image115">
>+			<widget class="GtkImage" id="image179">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-add</property>
> 			  <property name="icon_size">1</property>
>@@ -559,7 +586,7 @@ Do you want to save the changes?</proper
> 		      <signal name="activate" handler="on_delete_service_activate" last_modification_time="Wed, 09 Jul 2003 13:25:47 GMT"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image116">
>+			<widget class="GtkImage" id="image180">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-delete</property>
> 			  <property name="icon_size">1</property>
>@@ -573,7 +600,7 @@ Do you want to save the changes?</proper
> 		  </child>
> 
> 		  <child>
>-		    <widget class="GtkMenuItem" id="separator4">
>+		    <widget class="GtkSeparatorMenuItem" id="separator4">
> 		      <property name="visible">True</property>
> 		    </widget>
> 		  </child>
>@@ -587,9 +614,9 @@ Do you want to save the changes?</proper
> 		      <accelerator key="s" modifiers="GDK_CONTROL_MASK | GDK_MOD1_MASK" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image117">
>+			<widget class="GtkImage" id="image181">
> 			  <property name="visible">True</property>
>-			  <property name="stock">gtk-go-forward</property>
>+			  <property name="stock">gtk-media-forward</property>
> 			  <property name="icon_size">1</property>
> 			  <property name="xalign">0.5</property>
> 			  <property name="yalign">0.5</property>
>@@ -609,7 +636,7 @@ Do you want to save the changes?</proper
> 		      <accelerator key="t" modifiers="GDK_CONTROL_MASK | GDK_MOD1_MASK" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image118">
>+			<widget class="GtkImage" id="image182">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-stop</property>
> 			  <property name="icon_size">1</property>
>@@ -631,7 +658,7 @@ Do you want to save the changes?</proper
> 		      <accelerator key="r" modifiers="GDK_CONTROL_MASK | GDK_MOD1_MASK" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image119">
>+			<widget class="GtkImage" id="image183">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-refresh</property>
> 			  <property name="icon_size">1</property>
>@@ -663,7 +690,7 @@ Do you want to save the changes?</proper
> 		      <property name="visible">True</property>
> 		      <property name="label" translatable="yes">Runlevel _3</property>
> 		      <property name="use_underline">True</property>
>-		      <property name="active">False</property>
>+		      <property name="active">True</property>
> 		      <signal name="toggled" handler="on_optRL3_toggled" last_modification_time="Tue, 04 Mar 2003 18:28:41 GMT"/>
> 		      <accelerator key="3" modifiers="GDK_CONTROL_MASK" signal="activate"/>
> 		    </widget>
>@@ -686,12 +713,24 @@ Do you want to save the changes?</proper
> 		      <property name="visible">True</property>
> 		      <property name="label" translatable="yes">Runlevel _5</property>
> 		      <property name="use_underline">True</property>
>-		      <property name="active">True</property>
>+		      <property name="active">False</property>
> 		      <property name="group">optRL3</property>
> 		      <signal name="toggled" handler="on_optRL5_toggled" last_modification_time="Tue, 04 Mar 2003 18:29:19 GMT"/>
> 		      <accelerator key="5" modifiers="GDK_CONTROL_MASK" signal="activate"/>
> 		    </widget>
> 		  </child>
>+
>+		  <child>
>+		    <widget class="GtkRadioMenuItem" id="optRLA">
>+		      <property name="visible">True</property>
>+		      <property name="label" translatable="yes">Runlevel _All</property>
>+		      <property name="use_underline">True</property>
>+		      <property name="active">False</property>
>+		      <property name="group">optRL3</property>
>+		      <signal name="toggled" handler="on_optRLA_toggled" last_modification_time="Mon, 14 Feb 2005 14:46:50 GMT"/>
>+		      <accelerator key="0" modifiers="GDK_CONTROL_MASK" signal="activate"/>
>+		    </widget>
>+		  </child>
> 		</widget>
> 	      </child>
> 	    </widget>
>@@ -715,7 +754,7 @@ Do you want to save the changes?</proper
> 		      <accelerator key="F1" modifiers="0" signal="activate"/>
> 
> 		      <child internal-child="image">
>-			<widget class="GtkImage" id="image120">
>+			<widget class="GtkImage" id="image184">
> 			  <property name="visible">True</property>
> 			  <property name="stock">gtk-help</property>
> 			  <property name="icon_size">1</property>
>@@ -745,6 +784,7 @@ Do you want to save the changes?</proper
> 	  <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
> 	  <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
> 	  <property name="tooltips">True</property>
>+	  <property name="show_arrow">True</property>
> 
> 	  <child>
> 	    <placeholder/>
>@@ -846,7 +886,7 @@ Do you want to save the changes?</proper
> 	      <child>
> 		<widget class="GtkScrolledWindow" id="swindow">
> 		  <property name="border_width">2</property>
>-		  <property name="width_request">150</property>
>+		  <property name="width_request">220</property>
> 		  <property name="visible">True</property>
> 		  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
> 		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
>@@ -886,6 +926,8 @@ Do you want to save the changes?</proper
> 			      <property name="border_width">2</property>
> 			      <property name="visible">True</property>
> 			      <property name="editable">False</property>
>+			      <property name="overwrite">False</property>
>+			      <property name="accepts_tab">True</property>
> 			      <property name="justification">GTK_JUSTIFY_LEFT</property>
> 			      <property name="wrap_mode">GTK_WRAP_WORD</property>
> 			      <property name="cursor_visible">True</property>
>@@ -948,6 +990,8 @@ Do you want to save the changes?</proper
> 			      <property name="border_width">2</property>
> 			      <property name="visible">True</property>
> 			      <property name="editable">False</property>
>+			      <property name="overwrite">False</property>
>+			      <property name="accepts_tab">True</property>
> 			      <property name="justification">GTK_JUSTIFY_LEFT</property>
> 			      <property name="wrap_mode">GTK_WRAP_WORD</property>
> 			      <property name="cursor_visible">True</property>
>Index: src/serviceconf.py
>===================================================================
>RCS file: /usr/local/CVS/redhat-config-services/src/serviceconf.py,v
>retrieving revision 1.41
>diff -u -3 -p -r1.41 serviceconf.py
>--- src/serviceconf.py	28 Jan 2005 13:31:09 -0000	1.41
>+++ src/serviceconf.py	15 Feb 2005 19:25:54 -0000
>@@ -164,6 +164,7 @@ class Gui:
>               "on_optRL3_toggled" : self.on_optRL3_toggled,
>               "on_optRL4_toggled" : self.on_optRL4_toggled,
>               "on_optRL5_toggled" : self.on_optRL5_toggled ,
>+              "on_optRLA_toggled" : self.on_optRLA_toggled ,
>               "on_pmnStart_activate" : self.on_btnStart_clicked,
>               "on_pmnStop_activate" : self.on_btnStop_clicked,
>               "on_pmnRestart_activate" : self.on_btnRestart_clicked } )
>@@ -184,10 +185,7 @@ class Gui:
>         self.optRL3 = self.xml.get_widget("optRL3")
>         self.optRL4 = self.xml.get_widget("optRL4")
>         self.optRL5 = self.xml.get_widget("optRL5")
>-        
>-        self.optRL3= self.xml.get_widget("optRL3")
>-        self.optRL4= self.xml.get_widget("optRL4")
>-        self.optRL5= self.xml.get_widget("optRL5")
>+        self.optRLA = self.xml.get_widget("optRLA")
> 
>         #toolbars
>         self.tbrSave = self.xml.get_widget("tbrSave")
>@@ -257,9 +255,10 @@ class Gui:
>         self.clstServices.get_selection ().connect ("changed", self.changed,None)
> 
>         self.clstServices.connect("button_press_event", self.local_button_press_cb)
>-        self.clstServices.checkboxrenderer.connect("toggled", self.toggled_service)
>-        self.clstServices.set_column_title(0,_("Start at Boot"))
>-        self.clstServices.set_column_title(1,_("Services"))
>+        for i in range(0, 7):
>+            self.clstServices.checkboxrenderer[i].connect("toggled", self.toggled_service)
>+            self.clstServices.set_column_title(i,"Init" " %d" % i)
>+        self.clstServices.set_column_title(7,_("Services"))
>         #self.clstServices.set_column_justification(0,GTK.JUSTIFY_CENTER)
>         #self.clstServices.set_column_justification(1,GTK.JUSTIFY_LEFT)
>         #self.clstServices.set_column_auto_resize(0,1)
>@@ -267,20 +266,37 @@ class Gui:
> 
>         self.popup_menu = gtk.MenuItem()
> 
>+
>+
>+        self.optRL3.set_active(0)
>+        self.optRL4.set_active(0)
>+        self.optRL5.set_active(0)
>+        self.optRLA.set_active(0)
>+        
>+        self.clstServices.set_column_visible(0, 0)
>+        self.clstServices.set_column_visible(1, 0)
>+        self.clstServices.set_column_visible(2, 0)
>+        self.clstServices.set_column_visible(3, 0)
>+        self.clstServices.set_column_visible(4, 0)
>+        self.clstServices.set_column_visible(5, 0)
>+        self.clstServices.set_column_visible(6, 0)
>         if self.editing_runlevel == "3" or self.editing_runlevel == "2" or self.editing_runlevel == "1":
>+            self.clstServices.set_column_visible(3, 1)
>             self.optRL3.set_active(1)
> 
>-        elif self.editing_runlevel == "5" :
>-            self.optRL5.set_active(1)
>-
>         elif self.editing_runlevel == "4" :
>+            self.clstServices.set_column_visible(4, 1)
>             self.optRL4.set_active(1)
> 
>+        else:
>+            self.clstServices.set_column_visible(5, 1)
>+            self.optRL5.set_active(1)
>+
>         self.save_revert_sensitive(0)
>         
>         self.clstServices.get_selection().select_path ((0,))
>         self.changed(self.clstServices.get_selection(), None)
>-        self.current_selected_service = self.clstServices.get_text(0,1)
>+        self.current_selected_service = self.clstServices.get_text(0,7)
> 
>         self.winMain.show()
> 
>@@ -315,13 +331,13 @@ class Gui:
>                         gtk.main_iteration()
>                     else:
>                         gtk.mainiteration()
>-            self.allservices, self.dict_services = self.ServiceMethods.get_service_list(self.editing_runlevel, idle_func)
>+            self.allservices, self.dict_services = self.ServiceMethods.get_service_list(idle_func)
>             self.dict_services_orig = self.ServiceMethods.dict_services_orig
>             self.lblEditing.set_text(_("Editing Runlevel: ") + self.editing_runlevel)
>             self.already_init = 1
>         
>         for servicename in self.allservices:
>-            self.clstServices.append_row((servicename, ""), int(self.dict_services[servicename][0][int(self.editing_runlevel)]))
>+                self.clstServices.append_row(servicename, self.dict_services[servicename][0])
> 
>         self.winMain.set_sensitive(1)
>         self.winMain.get_toplevel().window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
>@@ -334,7 +350,7 @@ class Gui:
>             (model, iter) = result
>             if iter != None:
>                 row = model.get_path(iter)[0]
>-                self.text_in_row = self.clstServices.get_text(int(row),1)
>+                self.text_in_row = self.clstServices.get_text(int(row),7)
>                 self.set_text_buffer()
>                 self.set_text_status()
>         
>@@ -367,28 +383,25 @@ class Gui:
>             message=result[1]
>         self.txtStatusBuffer.set_text(message.strip())
> 
>-    def toggled_service(self, data, row):
>+    def toggled_service(self, column, row):
>         """Populates txtDesc with the service description of the service selected in clstServices"""
>-        self.text_in_row = self.clstServices.get_text(int(row),1)
>-        current_runlevel = int(self.editing_runlevel)
>-        self.current_selected = self.clstServices.get_text(int(row),1)
>+        self.text_in_row = self.clstServices.get_text(int(row),7)
>+        self.current_selected = self.clstServices.get_text(int(row),7)
> 
>         #make sure we aren't updating
>         if self.am_updating != 1:
> 
>             # enables and disables the save and revert buttons/menus
>             # if something has been changed from it's orig setting
>+            self.save_revert_sensitive(0)
>             for i in range(0,len(self.ServiceMethods.dict_services_orig)):
>-                self.checking_service = self.clstServices.get_text(i,1)
>-                service_enabled = int("%d" % self.clstServices.get_active(i))
>+                self.checking_service = self.clstServices.get_text(i,7)
>                 
>-
>-                if service_enabled == self.ServiceMethods.dict_services_orig[self.checking_service][0][current_runlevel]:
>-                    self.save_revert_sensitive(0)
>-                    
>-                elif service_enabled != self.ServiceMethods.dict_services_orig[self.checking_service][0][current_runlevel]:
>-                    self.save_revert_sensitive(1)
>-                    break
>+                for level in range(0, 7):
>+                    service_enabled = int("%d" % self.clstServices.get_active(i, level))
>+                    if service_enabled != self.ServiceMethods.dict_services_orig[self.checking_service][0][level]:
>+                        self.save_revert_sensitive(1)
>+                        return self.text_in_row
> 
> 
>         return self.text_in_row
>@@ -424,6 +437,14 @@ class Gui:
>             return gtk.TRUE
>         self.editing_runlevel = "3"
>         self.lblEditing.set_text(_("Editing Runlevel: ") + self.editing_runlevel)
>+        self.clstServices.set_column_visible(0, 0)
>+        self.clstServices.set_column_visible(1, 0)
>+        self.clstServices.set_column_visible(2, 0)
>+        self.clstServices.set_column_visible(3, 1)
>+        self.clstServices.set_column_visible(4, 0)
>+        self.clstServices.set_column_visible(5, 0)
>+        self.clstServices.set_column_visible(6, 0)
>+        self.clstServices.set_headers_visible(0)        
>         self.populateList()
> 
> 
>@@ -441,13 +462,16 @@ class Gui:
>             return gtk.TRUE
>         self.editing_runlevel = "4"
>         self.lblEditing.set_text(_("Editing Runlevel: ") + self.editing_runlevel)
>+        self.clstServices.set_column_visible(0, 0)
>+        self.clstServices.set_column_visible(1, 0)
>+        self.clstServices.set_column_visible(2, 0)
>+        self.clstServices.set_column_visible(3, 0)
>+        self.clstServices.set_column_visible(4, 1)
>+        self.clstServices.set_column_visible(5, 0)
>+        self.clstServices.set_column_visible(6, 0)
>+        self.clstServices.set_headers_visible(0)        
>         self.populateList()
> 
>-    def on_edit_runlevel(self, button):
>-        self.optRL3.set_sensitive(not self.dirty)
>-        self.optRL4.set_sensitive(not self.dirty)
>-        self.optRL5.set_sensitive(not self.dirty)
>-        
>     def on_optRL5_toggled(self, button):
>         """calls populateList() to repopulate the checklist for runlevel 5"""
>         if self.previous==button:
>@@ -460,8 +484,44 @@ class Gui:
>             return gtk.TRUE
>         self.editing_runlevel = "5"
>         self.lblEditing.set_text(_("Editing Runlevel: ") + self.editing_runlevel)
>+        self.clstServices.set_column_visible(0, 0)
>+        self.clstServices.set_column_visible(1, 0)
>+        self.clstServices.set_column_visible(2, 0)
>+        self.clstServices.set_column_visible(3, 0)
>+        self.clstServices.set_column_visible(4, 0)
>+        self.clstServices.set_column_visible(5, 1)
>+        self.clstServices.set_column_visible(6, 0)
>+        self.clstServices.set_headers_visible(0)        
>+        self.populateList()
>+
>+    def on_optRLA_toggled(self, button):
>+        """calls populateList() to repopulate the checklist for all runlevels"""
>+        if self.previous==button:
>+            return
>+        if button.get_active() != gtk.TRUE:
>+            self.previous=button
>+            return
>+        if self.check_dirty() == gtk.RESPONSE_CANCEL:
>+            self.previous.set_active(1)
>+            return gtk.TRUE
>+        self.editing_runlevel = "All"
>+        self.lblEditing.set_text(_("Editing Runlevel: ") + _("All"))
>+        self.clstServices.set_column_visible(0, 0)
>+        self.clstServices.set_column_visible(1, 0)
>+        self.clstServices.set_column_visible(2, 0)
>+        self.clstServices.set_column_visible(3, 1)
>+        self.clstServices.set_column_visible(4, 1)
>+        self.clstServices.set_column_visible(5, 1)
>+        self.clstServices.set_column_visible(6, 0)
>+        self.clstServices.set_headers_visible(1)
>         self.populateList()
> 
>+    def on_edit_runlevel(self, button):
>+        self.optRL3.set_sensitive(not self.dirty)
>+        self.optRL4.set_sensitive(not self.dirty)
>+        self.optRL5.set_sensitive(not self.dirty)
>+        self.optRLA.set_sensitive(not self.dirty)
>+
>     def check_dirty(self):
>         rc=gtk.RESPONSE_YES
>         """Check to see if the user has any unsaved changes."""
>@@ -544,10 +604,11 @@ class Gui:
>     def on_mnuSave_clicked(self, args):
>         """Commits the changes made for each service"""
>         for i in range(0,len(self.ServiceMethods.dict_services)):
>-            servicename = self.clstServices.get_text(i,1)
>-            service_enabled = "%d" % self.clstServices.get_active(i)
>-            self.ServiceMethods.save_changes(servicename, service_enabled, self.editing_runlevel)
>-
>+            servicename = self.clstServices.get_text(i,7)
>+            for level in range(0, 7):
>+                service_enabled = int("%d" % self.clstServices.get_active(i, level))
>+                if service_enabled != self.ServiceMethods.dict_services_orig[servicename][0][level]:
>+                    self.ServiceMethods.save_changes(servicename, service_enabled, level)
>         self.save_revert_sensitive(0)
> 
>     def quit(self,arg1=None,arg2=None):
>@@ -570,7 +631,7 @@ class Gui:
>         """calls ServiceMethods.service_action_results and displays the results in a dialog box"""
> 
>         self.winMain.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
>-        results = self.ServiceMethods.service_action_results(servicename, action_type, self.editing_runlevel)
>+        results = self.ServiceMethods.service_action_results(servicename, action_type, self.ServiceMethods.get_runlevel())
> 
>         if int(results[0]) != 0:
>             dlg = gtk.MessageDialog(self.winMain, 0, gtk.MESSAGE_ERROR,
>@@ -626,8 +687,8 @@ class Gui:
>     def local_button_press_cb (self, clist, event):
>         """checks to see if the third mouse button was clicked. If it was, then bring up the popup menu"""
>         row=clist.get_path_at_pos (int(event.x),int(event.y))[0][0]
>-        self.text_in_row = self.clstServices.get_text(int(row),1)
>-        self.current_selected = self.clstServices.get_text(int(row),1)
>+        self.text_in_row = self.clstServices.get_text(int(row),7)
>+        self.current_selected = self.clstServices.get_text(int(row),7)
>         self.set_text_buffer()
>         self.set_text_status()
>         if (event.button == 3):
>Index: src/servicemethods.py
>===================================================================
>RCS file: /usr/local/CVS/redhat-config-services/src/servicemethods.py,v
>retrieving revision 1.22
>diff -u -3 -p -r1.22 servicemethods.py
>--- src/servicemethods.py	4 Jan 2005 16:48:13 -0000	1.22
>+++ src/servicemethods.py	15 Feb 2005 19:25:54 -0000
>@@ -87,19 +87,15 @@ class ServiceMethods:
>         #runlevel = self.get_runlevel()
>         dirlist = os.listdir("/etc/rc.d/rc%s" % editing_runlevel + ".d")
> 
>-        have_match = -1
>+        have_match = 0
> 
>-        while have_match == -1:
>-            #for i in range(0,len(dirlist)):
>-            for direntry in dirlist:
>-                # check for start links only, we don't care if there is a kill link
>-                if re.match(r'^[S][0-9][0-9]' + servicename, direntry ):
>-                    have_match = 1
>-                    break
>-            # no match    
>-            if have_match != 1:
>-               have_match = 0
>-               
>+         #for i in range(0,len(dirlist)):
>+        for direntry in dirlist:
>+            # check for start links only, we don't care if there is a kill link
>+            if re.match(r'^[S][0-9][0-9]' + servicename, direntry ):
>+                have_match = 1
>+                break
>+              
>         return have_match
> 
> 
>@@ -182,7 +178,7 @@ class ServiceMethods:
> 
>             
>                 
>-    def get_service_list(self, editing_runlevel, idle_func):
>+    def get_service_list(self, idle_func):
>         """populates the self.dict_services, self.dict_services_orig dictionaries and the self.allservices list with service information including whether or not a service is configured to start in runlevels 0-6, as well as whether it is an xinetd service, as well as service descriptions."""
>         self.dict_services= {}
>         # this will be an unmodified self.dict_services
>@@ -244,8 +240,6 @@ class ServiceMethods:
>                     runlevels[i] = 0
>                 else:
>                     runlevels[i] = 1
>-            # configured = 1 if configured already
>-            # configured = self.check_if_on(servicename, editing_runlevel)
> 
>             self.dict_services[servicename] = [runlevels, 0, self.get_descriptions(initscript)]
>             self.dict_services_orig[servicename] = [runlevels, 0]
>@@ -307,20 +301,10 @@ class ServiceMethods:
>                 
>                 #check to make sure we are an initscript and not an xinetd service
>                 if int(self.dict_services[servicename][1]) == 0:
>-                    # if it's toggled on
>-                    if self.dict_services[servicename][0][int(editing_runlevel)] == "1":
>-                        self.chkconfig_add_del(servicename, 1, editing_runlevel)
>-                    # if it's toggled off
>-                    elif self.dict_services[servicename][0][int(editing_runlevel)] == "0":
>-                        self.chkconfig_add_del(servicename, 0, editing_runlevel)
>+                    self.chkconfig_add_del(servicename, service_enabled, editing_runlevel)
>                 # for xinetd services
>-                elif int(self.dict_services[servicename][1]) == 1:
>-                    # if it's toggled on
>-                    if self.dict_services[servicename][0][int(editing_runlevel)] == "1":
>-                        self.xinet_add_del(servicename, 1)
>-                    # if it's toggled off
>-                    elif self.dict_services[servicename][0][int(editing_runlevel)] == "0":
>-                        self.xinet_add_del(servicename, 0)
>+                else:
>+                    self.xinet_add_del(servicename, service_enabled)
> 
> 
> 
>  
>

-- 
Fedora-config-list mailing list
[email protected]
http://www.redhat.com/mailman/listinfo/fedora-config-list