From 55ebfe617a5f621bccd8ade1c09a203c30341999 Mon Sep 17 00:00:00 2001 From: Felix Rabe Date: Sun, 27 May 2007 04:50:04 +0200 Subject: [PATCH] Lots of changes --- galcon_protocol.py | 8 +-- gtkgalcon.py | 140 +++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 109 insertions(+), 39 deletions(-) diff --git a/galcon_protocol.py b/galcon_protocol.py index 49b9427..6ff8a84 100644 --- a/galcon_protocol.py +++ b/galcon_protocol.py @@ -214,7 +214,7 @@ class GalconUDPProtocol(DatagramProtocol): self.client.delta(self.server_name, self.universe) -def list_games(email, name, passwd, platform="linux2", version="1.2.0", host="imitationpickles.org"): +def list_servers(email, name, passwd, platform="linux2", version="1.2.0", host="imitationpickles.org"): d = defer.Deferred() factory = GalconHTTPFactory(d, email, name, passwd, platform, version) reactor.connectTCP(host, 80, factory) @@ -253,13 +253,13 @@ class GalconHTTPProtocol(http.HTTPClient): lines = response.split('\n') current_version = lines[0].split()[1].split(".") servers = lines[3:] - formatted = [] + server_list = [] for server in servers: try: owner_allowed, name, version, more = server.split('|') owner, allowed = owner_allowed.split('\t') num, unknown, addr, digest, status = more.split('\t') - formatted.append({ + server_list.append({ 'owner': owner, 'name': name, 'version': version, @@ -270,7 +270,7 @@ class GalconHTTPProtocol(http.HTTPClient): }) except: pass - self.deferred.callback((current_version, formatted)) + self.deferred.callback((current_version, server_list)) except: self.deferred.errback() diff --git a/gtkgalcon.py b/gtkgalcon.py index dae66e4..0b3334e 100755 --- a/gtkgalcon.py +++ b/gtkgalcon.py @@ -4,8 +4,7 @@ """ GtkGalcon. -Depends on PyGTKShell >= 1.90.2. -See http://felixrabe.textdriven.com/pygtk-shell/ +Depends on PyGTK Shell. """ # Copyright (C) 2007 Michael Carter @@ -32,6 +31,8 @@ See http://felixrabe.textdriven.com/pygtk-shell/ from PyGTKShell.Config import _config _config["main-loop-integrate-twisted"] = True from PyGTKShell.RawConsole import * +arrow_cursor = gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW) +watch_cursor = gtk.gdk.Cursor(gtk.gdk.WATCH) gtkgalcon_version = (0,0,5) @@ -42,10 +43,13 @@ def gnome_hig(widget): """ Adds suitable Gnome-HIG layout to the given widget, like borders. - If this turns out to be generally useful, move it to PyGTK Shell. + If this turns out to be generally useful, I'll move it to PyGTK Shell. """ if isinstance(widget, gtk.Window): - widget.set_border_width(12) + outer_vbox = widget(VBox()) + inner_vbox = gnome_hig(outer_vbox(VBox())) + inner_vbox.set_border_width(12) + return (outer_vbox, inner_vbox) if isinstance(widget, gtk.Table): widget.set_col_spacings(6) widget.set_row_spacings(6) @@ -62,9 +66,9 @@ class GalconChatWindow(WindowF12RawConsoleMixin): def __init__(self): super(GalconChatWindow, self).__init__() self.set_default_size(400, 300) - gnome_hig(self).set_title("GtkGalcon Chat") + self.set_title("GtkGalcon Chat") - vbox = gnome_hig(self(VBox())) + outer_vbox, vbox = gnome_hig(self) vbox(MarkupLabel("Galcon Chat")) @@ -79,29 +83,87 @@ class GalconChatWindow(WindowF12RawConsoleMixin): class GalconServerListWindow(WindowF12RawConsoleMixin): + """ + Window displaying the list of Galcon servers. + """ + + column_name_list = "owner name version num addr digest status".split() - def __init__(self, current_version, servers): + def __init__(self, email, name, passwd, platform, version): super(GalconServerListWindow, self).__init__() - gnome_hig(self).set_title("Galcon Server List") - self.set_default_size(400, 300) + self.__enppv = (email, name, passwd, platform, version) + self.set_title("Galcon Server List") + self.set_default_size(600, 400) + self.set_position(gtk.WIN_POS_CENTER) - vbox = gnome_hig(self(VBox())) - vbox(LeftLabel("Current version: %s" % ".".join(current_version)), - False, False) + outer_vbox, self.inner_vbox = gnome_hig(self) - sw = vbox(Frame())(ScrolledWindow()) + hbox = gnome_hig(self.inner_vbox(HBox(), False, False)) + self.version_label = hbox(LeftLabel("")) + self.set_current_version() + self.version_label.set_sensitive(False) + + self.refresh_button = hbox(Button("Refresh List"), pack_end = True) + self.refresh_button.connect("clicked", self.__refresh) + + sw = self.inner_vbox(Frame())(ScrolledWindow()) self.treeview = sw(TreeView()) - model = gtk.ListStore(str, str, str, int, str, str, str) - keys = "owner name version num addr digest status".split() - for server in servers: - model.append(tuple([server[i] for i in keys])) - for i, key in enumerate(keys): - col = gtk.TreeViewColumn(key.capitalize()) + self.treeview.set_sensitive(False) + + for i, name in enumerate(self.column_name_list): + col = gtk.TreeViewColumn(name.capitalize()) self.treeview.append_column(col) cell = gtk.CellRendererText() col.pack_start(cell, True) col.add_attribute(cell, "text", i) + + self.statusbar = outer_vbox(Statusbar(), False, False) + self.statusbar_cid = cid = self.statusbar.get_context_id("msg") + + def set_current_version(self, current_version = None): + self.version_label.set_sensitive(False) + if current_version is None: + self.version_label.set_text("Current version: ???") + else: + self.version_label.set_text("Current version: %s" % + ".".join(current_version)) + self.version_label.set_sensitive(True) + + def set_server_list(self, server_list = None): + model = gtk.ListStore(str, str, str, int, str, str, str) + self.treeview.set_sensitive(False) + if server_list is not None: + for server in server_list: + model.append(tuple([server[i] for i in + self.column_name_list])) + self.treeview.set_sensitive(True) self.treeview.set_model(model) + + def __refresh(self, button): + self.window.set_cursor(watch_cursor) + self.inner_vbox.set_sensitive(False) + self.statusbar.push(self.statusbar_cid, + "Retrieving server list...") + deferred = galcon_protocol.list_servers(*self.__enppv) + deferred.addCallback(self.__server_list_callback) + deferred.addErrback(self.__server_list_errback) + + def __server_list_callback(self, (current_version, server_list)): + self.set_current_version(current_version) + self.set_server_list(server_list) + self.statusbar.pop(self.statusbar_cid) + self.inner_vbox.set_sensitive(True) + self.window.set_cursor(arrow_cursor) + + def __server_list_errback(self, error): + print error + self.set_sensitive(True) + self.window.set_cursor(arrow_cursor) + cid = self.statusbar_cid + self.statusbar.pop(cid) + gtk.gdk.beep() + mid = self.statusbar.push(cid, "Retrieving server list failed") + gobject.timeout_add(4000, lambda: self.statusbar.remove(cid, mid)) class GalconLoginWindow(WindowF12RawConsoleMixin): @@ -112,10 +174,11 @@ class GalconLoginWindow(WindowF12RawConsoleMixin): def __init__(self): super(GalconLoginWindow, self).__init__() self.set_title("GtkGalcon Login") - outer_vbox = self(VBox()) - inner_vbox = outer_vbox(VBox()) - inner_vbox.set_border_width(12) - table = gnome_hig(inner_vbox(Table(), False, False)) + self.set_position(gtk.WIN_POS_CENTER) + + outer_vbox, self.inner_vbox = gnome_hig(self) + + table = gnome_hig(self.inner_vbox(Table(), False, False)) table.add_rows() table.attach_cell(LeftLabel("Email Address:")) @@ -139,35 +202,42 @@ class GalconLoginWindow(WindowF12RawConsoleMixin): self.statusbar = outer_vbox(Statusbar(), False, False) self.statusbar_cid = cid = self.statusbar.get_context_id("msg") mid = self.statusbar.push(cid, "Enter your login details") - gobject.timeout_add(3000, lambda: self.statusbar.remove(cid, mid)) + gobject.timeout_add(4000, lambda: self.statusbar.remove(cid, mid)) - def __login(self, button): - button.set_sensitive(False) - self.statusbar.push(self.statusbar_cid, - "Retrieving server list...") + def __get_email_name_passwd_platform_version(self): email = self.email_entry.get_text() name = self.name_entry.get_text() passwd = self.passwd_entry.get_text() platform = "linux2" version = "1.2.1" - - deferred = galcon_protocol.list_games(email, name, passwd, - platform, version) + return (email, name, passwd, platform, version) + + def __login(self, button): + self.window.set_cursor(watch_cursor) + self.inner_vbox.set_sensitive(False) + self.statusbar.push(self.statusbar_cid, + "Retrieving server list...") + enppv = self.__get_email_name_passwd_platform_version() + deferred = galcon_protocol.list_servers(*enppv) deferred.addCallback(self.__server_list_callback) deferred.addErrback(self.__server_list_errback) - def __server_list_callback(self, (current_version, servers)): - w = GalconServerListWindow(current_version, servers) + def __server_list_callback(self, (current_version, server_list)): + enppv = self.__get_email_name_passwd_platform_version() + w = GalconServerListWindow(*enppv) + w.set_current_version(current_version) + w.set_server_list(server_list) gobject.idle_add(self.destroy) def __server_list_errback(self, error): print error - self.login_button.set_sensitive(True) + self.inner_vbox.set_sensitive(True) + self.window.set_cursor(arrow_cursor) cid = self.statusbar_cid self.statusbar.pop(cid) gtk.gdk.beep() mid = self.statusbar.push(cid, "Retrieving server list failed") - gobject.timeout_add(3000, lambda: self.statusbar.remove(cid, mid)) + gobject.timeout_add(4000, lambda: self.statusbar.remove(cid, mid)) def main(argv): -- 2.11.4.GIT