gnome-games r8578 - in trunk/glchess: glade src/lib src/lib/gtkui src/lib/scene/opengl src/lib/ui



Author: rancell
Date: Sun Jan 18 13:06:32 2009
New Revision: 8578
URL: http://svn.gnome.org/viewvc/gnome-games?rev=8578&view=rev

Log:
Added dialog to add new network profiles (Bug #564515)

Modified:
   trunk/glchess/glade/network_game.glade
   trunk/glchess/src/lib/gtkui/gtkui.py
   trunk/glchess/src/lib/gtkui/network.py
   trunk/glchess/src/lib/main.py
   trunk/glchess/src/lib/network.py
   trunk/glchess/src/lib/scene/opengl/texture.py
   trunk/glchess/src/lib/ui/ui.py

Modified: trunk/glchess/glade/network_game.glade
==============================================================================
--- trunk/glchess/glade/network_game.glade	(original)
+++ trunk/glchess/glade/network_game.glade	Sun Jan 18 13:06:32 2009
@@ -803,4 +803,304 @@
   </child>
 </widget>
 
+<widget class="GtkDialog" id="add_account_dialog">
+  <property name="border_width">12</property>
+  <property name="title" translatable="yes">Add Account</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <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="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">False</property>
+  <signal name="response" handler="_on_response" last_modification_time="Sun, 18 Jan 2009 10:20:28 GMT"/>
+  <signal name="delete_event" handler="_on_delete" last_modification_time="Sun, 18 Jan 2009 10:21:05 GMT"/>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="vbox5">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="hbuttonbox5">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="button7">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <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>
+
+	  <child>
+	    <widget class="GtkButton" id="add_button">
+	      <property name="visible">True</property>
+	      <property name="sensitive">False</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes" comments="Add Network Profile Dialog: Button to accept values and add profile">_Add Account</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkTable" id="table8">
+	  <property name="border_width">6</property>
+	  <property name="visible">True</property>
+	  <property name="n_rows">3</property>
+	  <property name="n_columns">2</property>
+	  <property name="homogeneous">False</property>
+	  <property name="row_spacing">6</property>
+	  <property name="column_spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label13">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes" comments="Add Network Profile Dialog: Label beside username entry">User _Name:</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="mnemonic_widget">username_entry</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">2</property>
+	      <property name="bottom_attach">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="username_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="has_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">â</property>
+	      <property name="activates_default">False</property>
+	      <signal name="changed" handler="_on_input_changed" last_modification_time="Sun, 18 Jan 2009 11:06:39 GMT"/>
+	      <signal name="activate" handler="_on_username_activate" last_modification_time="Sun, 18 Jan 2009 11:43:02 GMT"/>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">2</property>
+	      <property name="bottom_attach">3</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label18">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes" comments="Add Network Profile Dialog: Label beside server combo">_Server:</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">0</property>
+	      <property name="bottom_attach">1</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBox" id="server_combo">
+	      <property name="visible">True</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="changed" handler="_on_server_changed" last_modification_time="Sun, 18 Jan 2009 10:51:30 GMT"/>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">0</property>
+	      <property name="bottom_attach">1</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkTable" id="custom_server_table">
+	      <property name="n_rows">2</property>
+	      <property name="n_columns">2</property>
+	      <property name="homogeneous">False</property>
+	      <property name="row_spacing">6</property>
+	      <property name="column_spacing">6</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label19">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes" comments="Add Network Profile Dialog: Label beside custom hostname entry">_Host:</property>
+		  <property name="use_underline">True</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="mnemonic_widget">host_entry</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label20">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes" comments="Add Network Profile Dialog: Label beside custom port entry">_Port:</property>
+		  <property name="use_underline">True</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="mnemonic_widget">port_spin</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkEntry" id="host_entry">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="visibility">True</property>
+		  <property name="max_length">0</property>
+		  <property name="text"></property>
+		  <property name="has_frame">True</property>
+		  <property name="invisible_char">â</property>
+		  <property name="activates_default">False</property>
+		  <signal name="changed" handler="_on_input_changed" last_modification_time="Sun, 18 Jan 2009 11:06:29 GMT"/>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkSpinButton" id="port_spin">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="climb_rate">1</property>
+		  <property name="digits">0</property>
+		  <property name="numeric">True</property>
+		  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		  <property name="snap_to_ticks">False</property>
+		  <property name="wrap">False</property>
+		  <property name="adjustment">1 0 65535 1 10 0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">1</property>
+	      <property name="bottom_attach">2</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>

Modified: trunk/glchess/src/lib/gtkui/gtkui.py
==============================================================================
--- trunk/glchess/src/lib/gtkui/gtkui.py	(original)
+++ trunk/glchess/src/lib/gtkui/gtkui.py	Sun Jan 18 13:06:32 2009
@@ -436,31 +436,16 @@
 
     def addNetworkDialog(self, feedback):
         """Extends glchess.ui.UI"""
-        # Create the dialog
-        dialog = network.GtkNetworkGameDialog(self, feedback, self.__playerModel)
-        self.__joinGameDialogs.append(dialog)
-        
-        # Add the detected games into the dialog
-        #for (game, name) in self.__networkGames.iteritems():
-        #    dialog.addNetworkGame(name, game)
-        
-        return dialog
+        self.__networkDialog = network.GtkNetworkGameDialog(self, feedback)
+        return self.__networkDialog
                                  
     def addNetworkGame(self, name, game):
         """Extends glchess.ui.UI"""
-        self.__networkGames[game] = name
-        
-        # Update the open dialogs
-        for dialog in self.__joinGameDialogs:
-            dialog.addNetworkGame(name, game)
+        self.__networkDialog.addNetworkGame(name, game)
 
     def removeNetworkGame(self, game):
         """Extends glchess.ui.UI"""
-        self.__networkGames.pop(game)
-
-        # Update the open dialogs
-        for dialog in self.__joinGameDialogs:
-            dialog.removeNetworkGame(game)
+        self.__networkDialog.removeNetworkGame(game)
             
     def requestSave(self, title):
         """Extends glchess.ui.UI"""

Modified: trunk/glchess/src/lib/gtkui/network.py
==============================================================================
--- trunk/glchess/src/lib/gtkui/network.py	(original)
+++ trunk/glchess/src/lib/gtkui/network.py	Sun Jan 18 13:06:32 2009
@@ -10,19 +10,95 @@
 
 _ = gettext.gettext
 
+class GtkNetworkAddDialog:
+    def __init__(self, networkDialog, parent):
+        self.__networkDialog = networkDialog
+
+        # Load the UI
+        self.__gui = gtkui.loadGladeFile('network_game.glade', 'add_account_dialog')
+        self.__gui.signal_autoconnect(self)
+        
+        self.__gui.get_widget('add_account_dialog').set_transient_for(parent)
+        
+        # FIXME: Hard-coded servers       
+        # name, host, port
+        self.serverModel = gtk.ListStore(str, str, int)
+        # Translators: Add Network Profile Dialog: Connect to the GGZ Gaming Zone server (the default)
+        self.serverModel.set(self.serverModel.append(), 0, _("GGZ Gaming Zone"), 1, "gnome.ggzgamingzone.org", 2, 5688)
+        # Translators: Add Network Profile Dialog: Use a custom server
+        self.serverModel.set(self.serverModel.append(), 0, _("Custom"), 1, "", 2, 5688)
+        
+        widget = self.__gui.get_widget('server_combo')
+        widget.set_model(self.serverModel)
+        cell = gtk.CellRendererText()
+        widget.pack_start(cell, False)
+        widget.add_attribute(cell, 'text', 0)
+        widget.set_model(self.serverModel)
+        widget.set_active(0)
+
+    def setVisible(self, isVisible):
+        widget = self.__gui.get_widget('add_account_dialog')
+        if isVisible:
+            widget.present()
+        else:
+            widget.hide()
+            self.clear()
+            
+    def clear(self):
+        self.__gui.get_widget('server_combo').set_active(0)
+        self.__gui.get_widget('username_entry').set_text('')        
+            
+    def _on_server_changed(self, widget):
+        widget = self.__gui.get_widget('server_combo')
+        model = widget.get_model()
+        iter = widget.get_active_iter()
+        (host,) = model.get(iter, 1)
+        (port,) = model.get(iter, 2)
+        self.__gui.get_widget('host_entry').set_text(host)
+        self.__gui.get_widget('port_spin').set_value(port)
+        table = self.__gui.get_widget('custom_server_table')
+        if host == '':
+            table.show()
+        else:
+            table.hide()
+            
+    def have_data(self):
+        username = self.__gui.get_widget('username_entry').get_text()
+        host = self.__gui.get_widget('host_entry').get_text()
+        return username != '' and host != ''
+
+    def _on_input_changed(self, widget):
+        self.__gui.get_widget('add_button').set_sensitive(self.have_data())
+
+    def _on_username_activate(self, widget):
+        if self.have_data():
+            self._on_response(None, gtk.RESPONSE_OK)
+
+    def _on_response(self, widget, response_id):
+        username = self.__gui.get_widget('username_entry').get_text()
+        host = self.__gui.get_widget('host_entry').get_text()
+        port = self.__gui.get_widget('port_spin').get_value_as_int()
+        name = '%s %s' % (username, host) # FIXME
+        
+        if response_id == gtk.RESPONSE_OK:
+            profile = self.__networkDialog.feedback.addProfile((name, username, host, port))
+            self.__networkDialog.addProfile(profile, profile.name, useNow = True)
+        
+        self.__gui.get_widget('add_account_dialog').hide()
+        self.clear()
+            
+    def _on_delete(self, widget, event):
+        # Hide; don't delete this window
+        return True
+
 class GtkNetworkGameDialog(glchess.ui.NetworkController):
     """
     """
-    # The main UI and the ???
-    __mainUI = None
-    __gui = None
-
-    def __init__(self, mainUI, feedback, aiModel):
+    def __init__(self, mainUI, feedback):
         """Constructor for a new game dialog.
         
         'mainUI' is the main UI.
         'feedback' is the object to feedback events with.
-        'aiModel' is the AI models to use.
         """
         self.__mainUI = mainUI
         self.feedback = feedback
@@ -31,17 +107,26 @@
         self.__gui = gtkui.loadGladeFile('network_game.glade', 'network_game_dialog')
         self.__gui.signal_autoconnect(self)
         
-        self.profileModel = gtk.ListStore(gobject.TYPE_PYOBJECT, str)
-        iter = self.profileModel.append()
-        # Translators: Server Combo Box: Not connected to a server
-        self.profileModel.set(iter, 0, None, 1, _('Disconnected'))
+        # Selected profile
+        self.__profile = None
         
+        self.profileModel = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, str)
+        # Translators: Server Combo Box: Not connected to a server
+        self.profileModel.set(self.profileModel.append(), 0, None, 1, self._set_profile, 2, _('Disconnected'))
+        self.profileModelSuffixCount = 0
+        self.profileModel.set(self.profileModel.append(), 1, None)
+        self.profileModelSuffixCount += 1
+        # Translators: Server Combo Box: Add new profile
+        self.profileModel.set(self.profileModel.append(), 0, None, 1, self._new_profile, 2, _('New profile...'))
+        self.profileModelSuffixCount += 1
+
         widget = self.__gui.get_widget('server_combo')
         widget.set_model(self.profileModel)
+        widget.set_active(0)
+        widget.set_row_separator_func(self._is_profile_model_separator)
         cell = gtk.CellRendererText()
         widget.pack_start(cell, False)
-        widget.add_attribute(cell, 'text', 1)
-        #FIXME: delay this: widget.set_active_iter(iter)
+        widget.add_attribute(cell, 'text', 2)
 
         # room object, index, name, num players, description, font weight, font style, icon_name
         self.roomModel = gtk.TreeStore(gobject.TYPE_PYOBJECT, int, str, str, str, int, int, str)
@@ -131,6 +216,8 @@
         buffer.create_mark('end', buffer.get_end_iter())
         
         mainUI.setTooltipStyle(self.__gui.get_widget('info_panel'))
+        
+        self.__addProfileDialog = GtkNetworkAddDialog(self, self.__gui.get_widget('network_game_dialog'))
 
     # Extended methods
         
@@ -138,8 +225,14 @@
         """Called by glchess.ui.NetworkController"""
         widget = self.__gui.get_widget('network_game_dialog')
         if isVisible:
-            widget.show()
+            widget.present()
+            
+            # Prompt for new profile if none configured
+            # FIXME: Make this clearer this is the count of non-profile elements in the combo
+            if len(self.profileModel) <= (self.profileModelSuffixCount + 1):
+                self.__addProfileDialog.setVisible(True)
         else:
+            self.__addProfileDialog.setVisible(False)
             widget.hide()
             
     def setSensitive(self, isSensitive):
@@ -154,10 +247,12 @@
     def clearError(self):
         self.__gui.get_widget('info_panel').hide()
 
-    def addProfile(self, profile, name):
+    def addProfile(self, profile, name, useNow = False):
         """Called by glchess.ui.UIController"""
-        iter = self.profileModel.append()
-        self.profileModel.set(iter, 0, profile, 1, name)
+        iter = self.profileModel.insert(len(self.profileModel) - self.profileModelSuffixCount)
+        self.profileModel.set(iter, 0, profile, 1, self._set_profile, 2, name)        
+        if self.__profile is None and useNow:
+            self.__gui.get_widget('server_combo').set_active_iter(iter)
 
     def setBusy(self, isBusy):
         """Called by glchess.ui.UIController"""
@@ -462,6 +557,26 @@
         # Inform the child class
         self.__mainUI.feedback.onGameStart(game)
         
+    def _is_profile_model_separator(self, model, iter):
+        return model.get(iter, 1)[0] is None
+
+    def _set_profile(self, profile):
+        if profile != self.__profile:
+            self.__profile = profile
+            self.feedback.setProfile(profile)
+            
+    def __selectActiveProfile(self):
+        iter = self.profileModel.get_iter_first()
+        while iter is not None:
+            if self.__profile == self.profileModel.get_value(iter, 0):
+                break
+            iter = self.profileModel.iter_next(iter)
+        self.__gui.get_widget('server_combo').set_active_iter(iter)
+
+    def _new_profile(self, profile):
+        self.__selectActiveProfile()
+        self.__addProfileDialog.setVisible(True)
+
     # Gtk+ signal handlers
     
     def _on_table_selected(self, selection):
@@ -481,9 +596,10 @@
         """Gtk+ callback"""
         model = widget.get_model()
         iter = widget.get_active_iter()
+        (method,) = model.get(iter, 1)
         (profile,) = model.get(iter, 0)
-        self.feedback.setProfile(profile)
-    
+        method(profile)
+
     def _on_chat_entry_activate(self, widget):
         """Gtk+ callback"""
         text = widget.get_text()

Modified: trunk/glchess/src/lib/main.py
==============================================================================
--- trunk/glchess/src/lib/main.py	(original)
+++ trunk/glchess/src/lib/main.py	Sun Jan 18 13:06:32 2009
@@ -409,7 +409,7 @@
     def onNewNetworkGame(self):
         """Called by ui.UIFeedback"""
         self.networkDialog.setVisible(True)
-
+        
     def onQuit(self):
         """Called by ui.UIFeedback"""
         self.application.quit()

Modified: trunk/glchess/src/lib/network.py
==============================================================================
--- trunk/glchess/src/lib/network.py	(original)
+++ trunk/glchess/src/lib/network.py	Sun Jan 18 13:06:32 2009
@@ -57,7 +57,7 @@
     def setValue(self, value):
         assert(self.type is GGZLine.TYPE_FIELD)
         self.value = value
-        self.text = '%s=%s' % (self.name, value)
+        self.text = '%s=%s\n' % (self.name, value)
 
 class GGZConfig:
     
@@ -105,8 +105,22 @@
                     line.setValue(value)
                     return
             elif wasInSection and not inSection:
-                self.lines.insert(index, GGZLine('%s=%s' % (name, value), section))
+                line = GGZLine('%s=%s\n' % (name, value))
+                line.section = section
+                self.lines.insert(index, line)
                 return
+        
+        # New section            
+        if not wasInSection:
+            if len(self.lines) > 0:
+                self.lines.append(GGZLine('\n'))
+            line = GGZLine('[%s]\n' % section)
+            line.section = section
+            self.lines.append(line)
+
+        line = GGZLine('%s=%s\n' % (name, value))
+        line.section = section
+        self.lines.append(line)
     
     def removeSection(self, name):
         keptLines = []
@@ -149,6 +163,21 @@
             server.password = None
 
         return server
+    
+    def updateServer(self, name, username, host, port):
+        self.setField(name, 'Host', host)
+        self.setField(name, 'Port', port)
+        self.setField(name, 'Login', username)
+        self.setField(name, 'Type', GGZConfig.TYPE_GUEST) # FIXME: Hardcoded
+        
+        try:
+            servers = self.getField('Servers', 'ProfileList')
+        except KeyError, e:
+            self.setField('Servers', 'ProfileList', name.replace(' ', '\\ '))
+        else:
+            self.setField('Servers', 'ProfileList', servers + ' ' + name.replace(' ', '\\ '))
+
+        self.save()
                 
     def save(self):
         lines = []
@@ -431,6 +460,28 @@
         self.buffer = ''
         self.profile = None
         self.decoder = None
+        
+    def addProfile(self, profile):
+        """Called by ui.NetworkFeedback"""
+        (name, username, host, port) = profile
+
+        # Make name unique
+        n = name
+        dupCount = 1
+        while True:
+            try:
+                self.ui.ggzConfig.getServer(n)
+            except KeyError:
+                break
+            else:
+                dupCount += 1
+                n = '%s (%d)' % (name, dupCount)
+        name = n
+        
+        self.ui.ggzConfig.updateServer(name, username, host, port)
+        
+        # FIXME: Return value is temporary
+        return self.ui.ggzConfig.getServer(name)
 
     def setProfile(self, profile):
         """Called by ui.NetworkFeedback"""

Modified: trunk/glchess/src/lib/scene/opengl/texture.py
==============================================================================
--- trunk/glchess/src/lib/scene/opengl/texture.py	(original)
+++ trunk/glchess/src/lib/scene/opengl/texture.py	Sun Jan 18 13:06:32 2009
@@ -129,7 +129,7 @@
                          self.__width,     # Width
                          self.__height,    # Height
                          0,                # Border
-                         GL_RGB,           # Format
+                         self.__format,    # Format
                          GL_UNSIGNED_BYTE, # Type
                          self.__data)
         
@@ -143,7 +143,7 @@
         if self.__texture is None:
             self.__texture = self.__generate()
             self.__data = None
-        
+
         # Use texture
         glBindTexture(GL_TEXTURE_2D, self.__texture)
         

Modified: trunk/glchess/src/lib/ui/ui.py
==============================================================================
--- trunk/glchess/src/lib/ui/ui.py	(original)
+++ trunk/glchess/src/lib/ui/ui.py	Sun Jan 18 13:06:32 2009
@@ -33,6 +33,9 @@
 class NetworkFeedback:
     """Template class for feedback from a network game selector"""
     
+    def addProfile(self, profile):
+        assert(False)
+    
     def setProfile(self, profile):
         assert(False)
     
@@ -313,7 +316,7 @@
         """
         """
         assert(False)
-
+        
     def onQuit(self):
         """Called when the user quits the program"""
         assert(False)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]