From owner-p4-projects@FreeBSD.ORG Sat Jun 9 07:54:31 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 994D616A46E; Sat, 9 Jun 2007 07:54:31 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 565E916A468 for ; Sat, 9 Jun 2007 07:54:31 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 4020813C4B7 for ; Sat, 9 Jun 2007 07:54:31 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l597sVVJ022232 for ; Sat, 9 Jun 2007 07:54:31 GMT (envelope-from andrew@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l597sU1B022220 for perforce@freebsd.org; Sat, 9 Jun 2007 07:54:30 GMT (envelope-from andrew@freebsd.org) Date: Sat, 9 Jun 2007 07:54:30 GMT Message-Id: <200706090754.l597sU1B022220@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to andrew@freebsd.org using -f From: Andrew Turner To: Perforce Change Reviews Cc: Subject: PERFORCE change 121252 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Jun 2007 07:54:32 -0000 http://perforce.freebsd.org/chv.cgi?CH=121252 Change 121252 by andrew@andrew_hermies on 2007/06/09 07:53:40 - Add the facund.Computer class to allow communication between the UI and the network - Add a Connect and Disconnect button below the computer list - Add the local computer to the display - Fix facund.network.Connection to close the connection properly The front and back ends can now communicate with each other when the connect button is clicked. The only messages passed however are connection start and stop. Affected files ... .. //depot/projects/soc2007/andrew-update/frontend/facund-fe.glade#2 edit .. //depot/projects/soc2007/andrew-update/frontend/facund.py#5 edit .. //depot/projects/soc2007/andrew-update/frontend/facund/__init__.py#4 edit .. //depot/projects/soc2007/andrew-update/frontend/facund/computer.py#1 add .. //depot/projects/soc2007/andrew-update/frontend/facund/gui/computer_model.py#4 edit .. //depot/projects/soc2007/andrew-update/frontend/facund/gui/main_window.py#4 edit .. //depot/projects/soc2007/andrew-update/frontend/facund/network/__init__.py#4 edit Differences ... ==== //depot/projects/soc2007/andrew-update/frontend/facund-fe.glade#2 (text+ko) ==== @@ -1,6 +1,6 @@ - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -180,11 +180,53 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + True - True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Connect + + + 5 + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Disconnect + + + 5 + 1 + + + + + False + 10 + 1 + + False @@ -204,6 +246,8 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + ==== //depot/projects/soc2007/andrew-update/frontend/facund.py#5 (text+ko) ==== @@ -27,7 +27,7 @@ import socket -import facund.gui, facund.network +import facund, facund.gui, facund.network #try: @@ -39,6 +39,9 @@ if __name__ == "__main__": model = facund.gui.ComputerTreeModel() + localComputer = facund.Computer("Fake disconnected computer", '/tmp/facund') + model.addComputer(localComputer) + mainWindow = facund.gui.MainWindow('facund-fe.glade') mainWindow.setComputerTreeModel(model) ==== //depot/projects/soc2007/andrew-update/frontend/facund/__init__.py#4 (text+ko) ==== @@ -24,4 +24,6 @@ # SUCH DAMAGE. # +from computer import Computer + __all__ = ["gui", "network"] ==== //depot/projects/soc2007/andrew-update/frontend/facund/gui/computer_model.py#4 (text+ko) ==== @@ -33,23 +33,31 @@ def __init__(self): gtk.TreeStore.__init__(self, gobject.TYPE_STRING) - self.addComputer("Test") - #self.removeComputer("Test") + self.__computers = {} - def addComputer(self, computer, base_dirs = None): + def addComputer(self, computer): '''Adds a computer to the computer tree view''' - if base_dirs is None: - base_dirs = ["Foo", "Bar"] + + computer_name = computer.getName() + if self.__computers.has_key(computer_name): + # TODO: This should either raise an exception or just replace the item and update the tree view + return + self.__computers[computer_name] = computer # Add the computer iter = self.append(None) - self.set(iter, 0, computer) + self.set(iter, 0, computer_name) # Add the children - for dir in base_dirs: + for dir in computer.getDirs(): child_iter = self.append(iter) self.set(child_iter, 0, dir) + def getComputer(self, position): + '''Returns the computer at the given position in the tree''' + name = self[position][0] + return self.__computers[name] + def removeComputer(self, computer): '''Removes a computer from the computer tree. TODO: Implement''' iter = self.get_iter_from_string(computer) ==== //depot/projects/soc2007/andrew-update/frontend/facund/gui/main_window.py#4 (text+ko) ==== @@ -34,20 +34,64 @@ def __init__(self, glade_file): gtk.gdk.threads_init() - self.xml = gtk.glade.XML(glade_file) - self.widget = self.xml.get_widget('facundWindow') - self.widget.connect('destroy', lambda *w: gtk.main_quit()) + + self.__xml = gtk.glade.XML(glade_file) + self.__widget = self.__xml.get_widget('facundWindow') + self.__widget.connect('destroy', lambda *w: gtk.main_quit()) def setComputerTreeModel(self, model): '''Sets the model to use to for the computer tree''' - treeView = self.xml.get_widget('computerView') + self.__computerTreeModel = model + treeView = self.__xml.get_widget('computerView') treeView.set_model(model) cell = gtk.CellRendererText() column = gtk.TreeViewColumn("Computer", cell, text=0) treeView.append_column(column) + treeView.connect('cursor-changed', self.onSelectComputer) + + # Add signal handlers to connect/disconnect + connectedButton = self.__xml.get_widget('connectButton') + connectedButton.connect('clicked', self.onConnectClick) + disconnectedButton = self.__xml.get_widget('disconnectButton') + disconnectedButton.connect('clicked', self.onDisconnectClick) + + def setConnected(self, connected): + connectedButton = self.__xml.get_widget('connectButton') + disconnectedButton = self.__xml.get_widget('disconnectButton') + + connectedButton.set_sensitive(not connected) + disconnectedButton.set_sensitive(connected) + + def __getCurrentComputer(self, treeView): + '''Finds the currently selected computer''' + cursor = treeView.get_cursor() + position = cursor[0][0] + computer = self.__computerTreeModel.getComputer(position) + return computer + + def onConnectClick(self, widget): + '''Signal handler for the connect button''' + treeView = self.__xml.get_widget('computerView') + computer = self.__getCurrentComputer(treeView) + computer.connect() + self.setConnected(computer.getConnectionStatus()) + + def onDisconnectClick(self, widget): + '''Signal handler for the connect button''' + treeView = self.__xml.get_widget('computerView') + computer = self.__getCurrentComputer(treeView) + computer.disconnect() + self.setConnected(computer.getConnectionStatus()) + + def onSelectComputer(self, widget): + '''Signal handler for when the selected item is changed''' + computer = self.__getCurrentComputer(widget) + # Marke the computer as (dis)connected + self.setConnected(computer.getConnectionStatus()) + def run(self): '''Displays the main window. Does't return''' - self.widget.show() + self.__widget.show() gtk.main() ==== //depot/projects/soc2007/andrew-update/frontend/facund/network/__init__.py#4 (text+ko) ==== @@ -34,18 +34,25 @@ self.bufSize = 1024 self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.socket.connect(server) - self.socket.send("") + self.socket.send("") self.parser = xml.sax.make_parser() self.parser.setContentHandler(self) - # Mark the class as ready and able to have __del__ called + self.canClose = False + # Mark the class as ready and able to disconnect self.isReady = True - def __del__(self): + def disconnect(self): if self.isReady: + self.isReady = False + # Send a connection close + self.socket.send("") + + # Wait for the server to close the connection + while not self.canClose: + self.interact() self.parser.close() - self.socket.send("") def interact(self): '''Reads data from the connection and passes it to the @@ -56,3 +63,9 @@ def startElement(self, name, attributes): print "> " + name + def endElement(self, name): + print "< " + name + # The server send a close message + if name == "facund-server": + self.canClose = True +