# -*- coding: utf-8 -*- # h-client, a client for an h-source server (such as http://www.h-node.com) # Copyright (C) 2011 Antonio Gallo # # # h-client 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 3 of the License, or # (at your option) any later version. # # h-client 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 h-client. If not, see . import pygtk pygtk.require('2.0') import gtk from hlibrary import * class hclient: #the device that has to be displaced in the right window currentDevice = None currentDeviceCode = None #get the active text from a combo #combo: the gtk combo instance #default: default value if the active index < 0 def getActive(self, combo, default = 'not-specified'): model = combo.get_model() active = combo.get_active() if active < 0: return default else: return model[active][0] #update the current device object by taking the values from the entries def applyChanges(self,widget): self.currentDevice.setModel(self.modelNameEntry.get_text()) otherNamesBuffer = self.otherNamesText.get_buffer() startiter, enditer = otherNamesBuffer.get_bounds() self.currentDevice.setOtherNames(otherNamesBuffer.get_text(startiter, enditer)) self.currentDevice.setSubtype(self.getActive(self.subtypeCombo)) self.currentDevice.setYear(self.getActive(self.commYearCombo)) self.currentDevice.setInterface(self.getActive(self.interfaceCombo)) self.currentDevice.setDistributions([]) self.currentDevice.addDistributions(self.distributionEntry.get_text()) self.currentDevice.setKernel(self.kernelEntry.get_text()) self.currentDevice.setHowItWorks(self.getActive(self.howItWorksCombo)) self.currentDevice.setDriver(self.driverEntry.get_text()) descriptionBuffer = self.descriptionText.get_buffer() startiter, enditer = descriptionBuffer.get_bounds() self.currentDevice.setDescription(descriptionBuffer.get_text(startiter, enditer)) #reset the modifications def resetChanges(self,widget): self.setEntries() #set the device that has to be displaced in the right window #and fill the entries def setCurrentDevice(self, selection): model, path = selection.get_selected() if path: #get the code: code = model.get_value(path, 1) if code in self.client.devices: #set the current device self.currentDevice = self.client.devices[code][0] self.currentDeviceCode = code #get the device #device = self.client.devices[code][0] self.setEntries() #make sensitive the apply button if self.currentDevice.getType() != 'unknown': self.enableButtons() else: self.disableButtons() self.setDeviceInfoLabel() else: #make non sensitive the apply button self.disableButtons() self.currentDevice = None self.currentDeviceCode = None #self.updateStatus() #enable the bottom buttons def enableButtons(self): self.applyButton.set_sensitive(True) self.resetButton.set_sensitive(True) self.submitButton.set_sensitive(True) #disable the bottom buttons def disableButtons(self): self.applyButton.set_sensitive(False) self.resetButton.set_sensitive(False) self.submitButton.set_sensitive(False) #set the top label def setDeviceInfoLabel(self): if self.currentDeviceCode != None: self.bigIcon.set_from_file("img/devices/big/"+self.currentDevice.getIcon()) if self.client.devices[self.currentDeviceCode][2] == 'insert': self.deviceInfoLabel.set_markup("this device is not present in the server database,\n would you like to insert it?") else: self.deviceInfoLabel.set_markup("this device is already present in the server database,\n would you like to update it?") #set the pyGTK device entries def setEntries(self): if self.currentDevice != None: #set the type entry self.setTypeEntry() #set the model entry self.setModelEntry() #set the other names entry self.setOtherNamesEntry() #set the vendorid:productid entry self.setVendorIdProductIDCode() #set the subtype entry (in the case of printers) self.setSubtypeEntry() #set the commercialization year entry self.setCommYearEntry() #set the interface entry self.setInterfaceEntry() #set the distribution entry self.setDistributionEntry() #set the kernel entry self.setKernelEntry() #set the howItWorks entry self.setHowItWorksEntry() #set the driver entry self.setDriverEntry() #set the description entry self.setDescriptionEntry() #set the subtype entry (in the case pf printers) def setTypeEntry(self): if self.currentDevice.getType() in self.client.getTypes(): index = self.client.getTypes().index(self.currentDevice.getType()) else: index = 0 self.typeCombo.set_active(index) #set the model name entry def setModelEntry(self): self.modelNameEntry.set_text(self.currentDevice.getModel()) #set the other names entry def setOtherNamesEntry(self): textbuffer = gtk.TextBuffer(table=None) textbuffer.set_text(self.currentDevice.getOtherNames()) self.otherNamesText.set_buffer(textbuffer) #set the vendorid:productid entry def setVendorIdProductIDCode(self): self.vendorIdProductIdEntry.set_text(self.currentDevice.getVendorId() + ':' + self.currentDevice.getProductId()) #set the subtype entry (in the case pf printers) def setSubtypeEntry(self): self.subtypeCombo.get_model().clear() for subtype in self.currentDevice.getSubtypes(): self.subtypeCombo.append_text(subtype) if self.currentDevice.getSubtype() in self.currentDevice.getSubtypes(): index = self.currentDevice.getSubtypes().index(self.currentDevice.getSubtype()) else: index = 0 self.subtypeCombo.set_active(index) #set the year of commercialization def setCommYearEntry(self): self.commYearCombo.get_model().clear() for year in self.currentDevice.getYears(): self.commYearCombo.append_text(year) if self.currentDevice.getYear() in self.currentDevice.getYears(): index = self.currentDevice.getYears().index(self.currentDevice.getYear()) else: index = 0 self.commYearCombo.set_active(index) #set the interface def setInterfaceEntry(self): self.interfaceCombo.get_model().clear() for interface in self.currentDevice.getInterfaces(): self.interfaceCombo.append_text(interface) if self.currentDevice.getInterface() in self.currentDevice.getInterfaces(): index = self.currentDevice.getInterfaces().index(self.currentDevice.getInterface()) else: index = 0 self.interfaceCombo.set_active(index) #set the distribution entry def setDistributionEntry(self): self.distributionEntry.set_text(self.currentDevice.createDistroEntry()) #set the kernel libre entry def setKernelEntry(self): self.kernelEntry.set_text(self.currentDevice.getKernel()) #set the howItWorks entry def setHowItWorksEntry(self): self.howItWorksCombo.get_model().clear() for option in self.currentDevice.getHowItWorksOptions(): self.howItWorksCombo.append_text(option) if self.currentDevice.getHowItWorks() in self.currentDevice.getHowItWorksOptions(): index = self.currentDevice.getHowItWorksOptions().index(self.currentDevice.getHowItWorks()) else: index = 0 self.howItWorksCombo.set_active(index) #set the driver entry def setDriverEntry(self): self.driverEntry.set_text(self.currentDevice.getDriver()) #set the description entry def setDescriptionEntry(self): textbuffer = gtk.TextBuffer(table=None) textbuffer.set_text(self.currentDevice.getDescription()) self.descriptionText.set_buffer(textbuffer) #set the node def setNode(self,widget): self.client.logout() self.client.errors = [] self.client.setNode(self.serverEntry.get_text()) self.updateStatus() self.synchronize(None) self.prefWindow.destroy() #close the preferences window def closePref(self,widget): self.prefWindow.destroy() #login to the server def login(self,widget): self.client.login(self.usernameEntry.get_text(),self.passwordEntry.get_text()) self.updateStatus() if self._submitFlag: if self.client.isLogged(): self.applyChanges(None) if self.client.submit(self.currentDeviceCode): self.synchronize(None) else: self.printErrors() self._submitFlag = False #self.printErrors() self.loginWindow.destroy() #submit data to the server def submit(self,widget): self.applyChanges(None) self.licenseNoticeWindow.destroy() if self.client.isLogged(): if self.client.submit(self.currentDeviceCode): self.synchronize(None) else: self.printErrors() else: self._submitFlag = True self.openLoginWindow(None) #logout to the server def logout(self,widget): self.client.logout() self.updateStatus() #self.printErrors() #close the login window def closeLoginWindow(self,widget): self._submitFlag = False self.updateStatus() self.loginWindow.destroy() #close the license notice window def closeLicenseNoticeWindow(self,widget): self.licenseNoticeWindow.destroy() #open the dialog with the software info def openInfoWindow(self,widget): about = gtk.AboutDialog() about.set_program_name("h-node client") #about.set_version("") about.set_copyright("(c) Antonio Gallo") about.set_comments("simple client for h-node.com, licensed under the GPLv3") about.set_website("http://www.h-node.com") #about.set_logo(gtk.gdk.pixbuf_new_from_file("battery.png")) about.run() about.destroy() #close the window containing the list of allowed distribusions def closeDistroHelperWindow(self,widget): self.distroHelperWindow.destroy() #update the distribution entry def setDistributions(self,widget): self.currentDevice.setDistributions(self._tempDistributions) self.distributionEntry.set_text(self.currentDevice.createDistroEntry()) self.distroHelperWindow.destroy() #add a distrocode to the self._tempDistributions property def addTempDistribution(self,widget,data): if widget.get_active(): self._tempDistributions.append(data) else: try: del self._tempDistributions[self._tempDistributions.index(data)] except: pass #print self._tempDistributions #window containing the list of allowed distribusions def openDistroHelperWindow(self,widget,data,a = None,b = None): #used to temporarily save the list of distributions from the distribution entry or from the distribution checkButtons self._tempDistributions = [] self.distroHelperWindow = gtk.Window(gtk.WINDOW_TOPLEVEL) self.distroHelperWindow.set_title("choose the distribution") self.distroHelperWindow.set_position(gtk.WIN_POS_CENTER) self.distroHelperWindow.set_icon_from_file("img/icon.png") self.distroHelperWindow.set_size_request(300, -1) self.distroHelperWindow.set_transient_for(self.window) self.distroHelperWindow.set_modal(True) self.vboxCh = gtk.VBox(False, 0) self.vboxCh.set_border_width(10) self.distroHelperWindow.add(self.vboxCh) #fill the self._tempDistributions list with the distros already contained inside the distribution entry checkedDistros = self.distributionEntry.get_text().split(',') for distro in checkedDistros: if distro != '' and self.client.distroIsAllowed(distro.lstrip().rstrip()): self._tempDistributions.append(distro.lstrip().rstrip()) #create and pack the checkButtons for distroCode,distroLabel in self.client.allowedDistros.iteritems(): chbutton = gtk.CheckButton(distroLabel) if distroCode in self._tempDistributions: chbutton.set_active(True) chbutton.connect("clicked", self.addTempDistribution,distroCode) self.vboxCh.pack_start(chbutton, True, True, 2) hbox = gtk.HBox(False, 0) hbox.set_border_width(10) applyButton = gtk.Button(stock=gtk.STOCK_APPLY) closeButton = gtk.Button(stock=gtk.STOCK_CANCEL) applyButton.connect("clicked", self.setDistributions) closeButton.connect("clicked", self.closeDistroHelperWindow) hbox.pack_end(applyButton, False, True, 0) hbox.pack_end(closeButton, False, True, 3) self.vboxCh.pack_start(hbox, False, True, 0) self.distroHelperWindow.show_all() #start the window containing the license notice def openLicenseNoticeWindow(self,widget): result = self.client.getLicenseNotice(); if result: #window for preferences self.licenseNoticeWindow = gtk.Window(gtk.WINDOW_TOPLEVEL) self.licenseNoticeWindow.set_title("license notice") self.licenseNoticeWindow.set_position(gtk.WIN_POS_CENTER) self.licenseNoticeWindow.set_icon_from_file("img/icon.png") self.licenseNoticeWindow.set_size_request(300, -1) self.licenseNoticeWindow.set_transient_for(self.window) self.licenseNoticeWindow.set_modal(True) vbox = gtk.VBox(False, 0) vbox.set_border_width(10) self.licenseNoticeWindow.add(vbox) #print result ##if result #description input sw = gtk.ScrolledWindow() #sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) noticeText = gtk.TextView() #noticeText.set_decorated(False) noticeText.set_editable(False) #noticeText.modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(50,100,150) ) noticeText.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#a3a3a3") ) noticeText.set_wrap_mode(gtk.WRAP_CHAR) textbuffer = gtk.TextBuffer(table=None) textbuffer.set_text(result) noticeText.set_buffer(textbuffer) sw.add(noticeText) #sw.show() #sw.show_all() vbox.pack_start(sw, False, True, 5) hbox = gtk.HBox(False, 0) hbox.set_border_width(10) applyButton = gtk.Button(stock=gtk.STOCK_APPLY) closeButton = gtk.Button(stock=gtk.STOCK_CANCEL) applyButton.connect("clicked", self.submit) closeButton.connect("clicked", self.closeLicenseNoticeWindow) hbox.pack_end(applyButton, False, True, 0) hbox.pack_end(closeButton, False, True, 3) vbox.pack_start(hbox, False, True, 0) self.licenseNoticeWindow.show_all() else: self.printErrors() #start the login window def openLoginWindow(self,widget): #window for preferences self.loginWindow = gtk.Window(gtk.WINDOW_TOPLEVEL) self.loginWindow.set_title("login") self.loginWindow.set_position(gtk.WIN_POS_CENTER) self.loginWindow.set_icon_from_file("img/icon.png") self.loginWindow.set_size_request(300, -1) self.loginWindow.set_transient_for(self.window) self.loginWindow.set_modal(True) self.window.connect("delete_event", self.delete_event_login) #self.prefWindow.set_size_request(300, -1) vbox = gtk.VBox(False, 0) self.loginWindow.add(vbox) table = gtk.Table(4, 2, True) table.set_border_width(10) label = gtk.Label("login to the server") label.set_use_markup(True) vbox.pack_start(label, False, True, 0) vbox.pack_start(table, False, True, 0) ### username usernameLabel = gtk.Label("username:") usernameLabel.set_alignment(0.95,0.5) #add the label table.attach(usernameLabel, 0, 1, 0, 1) self.usernameEntry = gtk.Entry() #add the input to the table table.attach(self.usernameEntry, 1, 2, 0, 1) ### password passwordLabel = gtk.Label("password:") passwordLabel.set_alignment(0.95,0.5) #add the label table.attach(passwordLabel, 0, 1, 1, 2) self.passwordEntry = gtk.Entry() self.passwordEntry.set_visibility(False) #add the input to the table table.attach(self.passwordEntry, 1, 2, 1, 2) ### create new account label = gtk.Label("Create new account") label.set_use_markup(True) label.set_alignment(0.98,0.5) #add the label table.attach(label, 0, 2, 2, 3) ### request new password label = gtk.Label("Request new password") label.set_use_markup(True) label.set_alignment(0.98,0.5) #add the label table.attach(label, 0, 2, 3, 4) hbox = gtk.HBox(False, 0) hbox.set_border_width(10) applyButton = gtk.Button(stock=gtk.STOCK_APPLY) closeButton = gtk.Button(stock=gtk.STOCK_CANCEL) applyButton.connect("clicked", self.login) closeButton.connect("clicked", self.closeLoginWindow) hbox.pack_end(applyButton, False, True, 0) hbox.pack_end(closeButton, False, True, 3) vbox.pack_start(hbox, False, True, 0) self.loginWindow.show_all() #start the preferences window def openPrefWindow(self,widget): #window for preferences self.prefWindow = gtk.Window(gtk.WINDOW_TOPLEVEL) self.prefWindow.set_title("preferences") self.prefWindow.set_position(gtk.WIN_POS_CENTER) self.prefWindow.set_icon_from_file("img/icon.png") self.prefWindow.set_size_request(300, -1) self.prefWindow.set_transient_for(self.window) self.prefWindow.set_modal(True) vbox = gtk.VBox(False, 0) self.prefWindow.add(vbox) table = gtk.Table(1, 2, True) table.set_border_width(10) vbox.pack_start(table, False, True, 0) ### server serverLabel = gtk.Label("Server URL:") #add the label table.attach(serverLabel, 0, 1, 0, 1) self.serverEntry = gtk.Entry() self.serverEntry.set_text(self.client.getNode()) #add the input to the table table.attach(self.serverEntry, 1, 2, 0, 1) hbox = gtk.HBox(False, 0) hbox.set_border_width(10) applyButton = gtk.Button(stock=gtk.STOCK_APPLY) closeButton = gtk.Button(stock=gtk.STOCK_CLOSE) applyButton.connect("clicked", self.setNode) closeButton.connect("clicked", self.closePref) hbox.pack_end(applyButton, False, True, 0) hbox.pack_end(closeButton, False, True, 3) vbox.pack_start(hbox, False, True, 0) #applyButton.connect("clicked", self.applyChanges) self.prefWindow.show_all() #synchronize with the server XML database def synchronize(self,widget): self.client.sync() self.printErrors() #print self.client.errors self.setEntries() self.setDeviceInfoLabel() self.setDeviceTree() def printErrors(self): #destroy the error bar HBox if hasattr(self, "errorBarHBox"): self.errorBarHBox.destroy() if len(self.client.errors) > 0: self.client.errors = list(set(self.client.errors)) #self.errorBar.set_shadow_type(gtk.SHADOW_ETCHED_IN) self.errorBarHBox = gtk.HBox(False, 0) for error in self.client.errors: label = gtk.Label(error) self.errorBarHBox.pack_start(label, False, True, 10) self.errorBar.add_with_viewport(self.errorBarHBox) self.errorBar.show_all() self.client.errors = [] #check if the user is logged #hide or show the login/logout buttons def updateStatus(self): if self.client.isLogged() == True: self.loginButton.hide() self.logoutButton.show() info = self.client.getUserInfo() if info != False: self.statusLabel.set_markup("hello "+info['username']+", you are logged in") if self.currentDeviceCode != None: self.submitButton.set_sensitive(True) else: self.loginButton.show() self.logoutButton.hide() self.statusLabel.set_markup("you are not logged in") self.printErrors() #delete event of the login window def delete_event_login(self, widget, event, data=None): self._submitFlag = False return False #update the devices' tree def setDeviceTree(self): #get the current selection ts, itera = self.tree.get_selection().get_selected() if itera: path = ts.get_path(itera) self.treestore = gtk.TreeStore(str,str,int,gtk.gdk.Pixbuf,int) pci = self.treestore.append(None, ["Your PCI Devices","",800,gtk.gdk.pixbuf_new_from_file('img/title_png.png'),4]) usb = self.treestore.append(None, ["Your USB Devices","",800,gtk.gdk.pixbuf_new_from_file('img/title_png.png'),4]) for key,dev in self.client.devices.iteritems(): if key[0] == 'p': self.treestore.append(pci, [dev[0].getType(),key,400,gtk.gdk.pixbuf_new_from_file('img/devices/small/'+dev[0].getIcon()),4]) if key[0] == 'u': self.treestore.append(usb, [dev[0].getType(),key,400,gtk.gdk.pixbuf_new_from_file('img/devices/small/'+dev[0].getIcon()),4]) self.tree.set_model(self.treestore) selection = self.tree.get_selection() selection.connect('changed', self.setCurrentDevice) self.tree.expand_all() #select the device on the tree if itera: self.tree.get_selection().select_path(path) else: #select the first device self.tree.get_selection().select_path(0) ts, itera = self.tree.get_selection().get_selected() if itera: next = ts.iter_nth_child(itera, 0) path = ts.get_path(next) self.tree.get_selection().select_path(path) def delete_event(self, widget, event, data=None): self.client.logout() os.system('rm -f tmp/cookies.txt') os.system('rm -f tmp/temp') gtk.main_quit() return False def __init__(self): #does it have to submit after the login? self._submitFlag = False #start the client object self.client = Client('www.sandbox.h-node.com') self.client.createDevices() # Create the main window self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("h-client") self.window.set_icon_from_file("img/icon.png") self.window.set_size_request(700, -1) self.window.set_position(gtk.WIN_POS_CENTER) self.window.connect("delete_event", self.delete_event) #self.window.set_border_width(0) vbox = gtk.VBox(False, 0) #add the bottom box self.window.add(vbox) self.centerWindow = gtk.HBox(False, 0) self.bottomWindow = gtk.HBox(False, 0) self.errorBar = gtk.ScrolledWindow() self.errorBar.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER) self.errorBar.set_border_width(5) self.errorBar.set_size_request(-1,50) self.bottomWindow.add(self.errorBar) self.errorBarHBox = gtk.HBox(False, 0) self.errorBar.add_with_viewport(self.errorBarHBox) self.errorBar.show_all() ## build the toolbar ## toolbar = gtk.Toolbar() toolbar.set_tooltips(True) #toolbar.set_style(gtk.TOOLBAR_BOTH) pref = gtk.ToolButton(gtk.STOCK_PREFERENCES) pref.set_tooltip_text('Preferences') pref.connect("clicked", self.openPrefWindow) sync = gtk.ToolButton(gtk.STOCK_REFRESH) sync.set_tooltip_text('Synchronize with the server: this will override the entries of your devices') sync.connect("clicked", self.synchronize) info = gtk.ToolButton(gtk.STOCK_INFO) info.set_tooltip_text('Information') info.connect("clicked",self.openInfoWindow); toolbar.insert(sync, 0) toolbar.insert(pref, 1) toolbar.insert(info, 2) toolbar.show_all() vbox.pack_start(toolbar, True, True, 0) vbox.pack_start(self.centerWindow, True, True, 0) vbox.pack_start(self.bottomWindow, True, True, 0) vbox.show() ## build the left window ## #start the left vertical box self.leftWindow = gtk.VBox(False, 0) #self.leftWindow.set_border_width(5) self.centerWindow.pack_start(self.leftWindow, True, True, 0) #treeFrame.add(self.leftWindow) #self.centerWindow.pack_start(self.rframe, True, True, 5) #self.leftWindow.pack_start(gtk.Label("Your hardware:"), False, True, 5) self.tree = gtk.TreeView() self.tree.set_headers_visible(False) self.devices = gtk.TreeViewColumn("Your PCI and USB devices") device_icon = gtk.CellRendererPixbuf() self.devices.pack_start(device_icon, True) self.devices.add_attribute(device_icon, 'pixbuf', 3) #self.devices.set_cell_data_func(device_icon, self.setTreeViewCell) device_name = gtk.CellRendererText() self.devices.pack_start(device_name, True) self.devices.add_attribute(device_name, "text", 0) self.devices.add_attribute(device_name, "xpad", 4) self.devices.add_attribute(device_name, "weight", 2) self.tree.append_column(self.devices) treesw = gtk.ScrolledWindow() treesw.set_size_request(110,401) treesw.set_shadow_type(gtk.SHADOW_ETCHED_IN) treesw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) treesw.add(self.tree) self.leftWindow.set_border_width(5) self.leftWindow.pack_start(treesw, False, True, 0) self.leftWindow.show_all() #treeFrame.add(self.leftWindow) ## build the right window ## #right top rthbox = gtk.HBox(False, 0) rthbox.set_border_width(5) #login button self.loginButton = gtk.Button("Login") self.loginButton.set_sensitive(True) self.loginButton.connect("clicked", self.openLoginWindow) rthbox.pack_start(self.loginButton, False, True, 0) #login button self.logoutButton = gtk.Button("Logout") self.logoutButton.set_sensitive(True) self.logoutButton.connect("clicked", self.logout) rthbox.pack_start(self.logoutButton, False, True, 0) #status label self.statusLabel = gtk.Label("") self.statusLabel.set_use_markup(True) rthbox.pack_end(self.statusLabel, False, True, 0) #top image self.tihbox = gtk.HBox(False, 0) self.bigIcon = gtk.Image() self.bigIcon.set_from_file("img/devices/big/unknown.png") self.tihbox.pack_end(self.bigIcon, False, True, 0) self.deviceInfoLabel = gtk.Label("") self.deviceInfoLabel.set_use_markup(True) self.tihbox.pack_start(self.deviceInfoLabel, False, True, 3) #create the entries notebook = gtk.Notebook() notebook.set_tab_pos(gtk.POS_TOP) notebook.show() label_base = gtk.Label("Base") label_adv = gtk.Label("Advanced") self.rightTable = gtk.Table(5, 2, False) self.rightTableAdvances = gtk.Table(6, 2, False) self.rightTable.set_border_width(5) self.rightTableAdvances.set_border_width(5) self.rightTable.set_row_spacings(3) self.rightTableAdvances.set_row_spacings(3) notebook.append_page(self.rightTable, label_base) notebook.append_page(self.rightTableAdvances, label_adv) ###type entry #year of commercialization label self.typeLabel = gtk.Label("Select the device category (if not correct):") self.typeLabel.set_alignment(0.75,0.5) #add the label self.rightTable.attach(self.typeLabel, 0, 1, 0, 1) self.typeCombo = gtk.combo_box_new_text() for dtype in self.client.getTypes(): self.typeCombo.append_text(dtype) #add the combo to the table self.rightTable.attach(self.typeCombo, 1, 2, 0, 1) ### model #model name label self.modelNameLabel = gtk.Label("Model name:") self.modelNameLabel.set_alignment(0.94,0.5) #add the label self.rightTable.attach(self.modelNameLabel, 0, 1, 1, 2) #model name input self.modelNameEntry = gtk.Entry() #add the input to the table self.rightTable.attach(self.modelNameEntry, 1, 2, 1, 2) ### other names #other names label self.otherNamesLabel = gtk.Label("Possible other names of the device:\n( write one name per row )") self.otherNamesLabel.set_use_markup(True) self.otherNamesLabel.set_alignment(0.83,0.5) self.otherNamesLabel.set_justify(gtk.JUSTIFY_RIGHT) self.rightTable.attach(self.otherNamesLabel, 0, 1, 2, 3) #other names text area s = gtk.ScrolledWindow() s.set_shadow_type(gtk.SHADOW_ETCHED_IN) s.set_size_request(-1,50) s.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.otherNamesText = gtk.TextView() #self.otherNamesText.set_size_request(-1,60) self.otherNamesText.set_wrap_mode(gtk.WRAP_CHAR) self.otherNamesText.set_left_margin(5) self.otherNamesText.set_right_margin(5) s.add(self.otherNamesText) s.show() s.show_all() self.rightTable.attach(s, 1, 2, 2, 3) ### vendorid:productid #vendorid:productid label self.vendorIdProductIdLabel = gtk.Label("VendorID:productID code:") self.vendorIdProductIdLabel.set_alignment(0.88,0.5) #add the label self.rightTableAdvances.attach(self.vendorIdProductIdLabel, 0, 1, 0, 1) #vendorid:productid input self.vendorIdProductIdEntry = gtk.Entry() #set as not editable self.vendorIdProductIdEntry.set_editable(False) #add the input to the table self.rightTableAdvances.attach(self.vendorIdProductIdEntry, 1, 2, 0, 1) ###subtype #subtype label self.subtypeLabel = gtk.Label("Subtype:") self.subtypeLabel.set_alignment(0.94,0.5) #add the label self.rightTableAdvances.attach(self.subtypeLabel, 0, 1, 1, 2) #subtype input self.subtypeCombo = gtk.combo_box_new_text() #add the input to the table self.rightTableAdvances.attach(self.subtypeCombo, 1, 2, 1, 2) ###year of commercialization #year of commercialization label self.commYearLabel = gtk.Label("Year of commercialization:") self.commYearLabel.set_alignment(0.87,0.5) #add the label self.rightTableAdvances.attach(self.commYearLabel, 0, 1, 2, 3) self.commYearCombo = gtk.combo_box_new_text() #add the combo to the table self.rightTableAdvances.attach(self.commYearCombo, 1, 2, 2, 3) ###interface #interface label self.interfaceLabel = gtk.Label("Interface:") self.interfaceLabel.set_alignment(0.94,0.5) #add the label self.rightTableAdvances.attach(self.interfaceLabel, 0, 1, 3, 4) self.interfaceCombo = gtk.combo_box_new_text() self.interfaceCombo.append_text('not-specified') self.interfaceCombo.set_active(0) #add the combo to the table self.rightTableAdvances.attach(self.interfaceCombo, 1, 2, 3, 4) ### distribution #distribution label self.distributionLabel = gtk.Label("Distribution used: ") self.distributionLabel.set_alignment(0.95,0.5) #add the label self.rightTable.attach(self.distributionLabel, 0, 1, 3, 4) #distribution input self.distributionEntry = gtk.Entry() self.distributionEntry.connect("button-press-event", self.openDistroHelperWindow) #add the input self.rightTable.attach(self.distributionEntry, 1, 2, 3, 4) ### kernel #kernel label self.kernelLabel = gtk.Label("Kernel libre version:") self.kernelLabel.set_alignment(0.92,0.5) #add the label self.rightTableAdvances.attach(self.kernelLabel, 0, 1, 4, 5) #kernel input self.kernelEntry = gtk.Entry() #add the input self.rightTableAdvances.attach(self.kernelEntry, 1, 2, 4, 5) ###how it works #how it works label self.howItWorksLabel = gtk.Label("Does it work?") self.howItWorksLabel.set_alignment(0.95,0.5) #add the label self.rightTable.attach(self.howItWorksLabel, 0, 1, 4, 5) self.howItWorksCombo = gtk.combo_box_new_text() #add the combo to the table self.rightTable.attach(self.howItWorksCombo, 1, 2, 4, 5) ### driver #driver label self.driverLabel = gtk.Label("Free driver used:") self.driverLabel.set_alignment(0.94,0.5) #add the label self.rightTableAdvances.attach(self.driverLabel, 0, 1, 5, 6) #driver input self.driverEntry = gtk.Entry() #add the input self.rightTableAdvances.attach(self.driverEntry, 1, 2, 5, 6) ### description #description label self.descriptionLabel = gtk.Label("Description:") self.descriptionLabel.set_alignment(0,0.5) #description input sw = gtk.ScrolledWindow() sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.descriptionText = gtk.TextView() self.descriptionText.set_wrap_mode(gtk.WRAP_CHAR) self.descriptionText.set_left_margin(5) self.descriptionText.set_right_margin(5) sw.add(self.descriptionText) sw.show() sw.show_all() ##add the input #self.rightTable.attach(sw, 1, 2, 7, 8) self.rightTable.show_all() #apply and submit buttons hboxBelowEntries = gtk.HBox(False, 0) #apply button self.applyButton = gtk.Button(stock=gtk.STOCK_APPLY) self.applyButton.set_sensitive(False) self.applyButton.connect("clicked", self.applyChanges) self.applyButton.set_tooltip_text('apply your local modifications: no change will be applied to the server') #reset button self.resetButton = gtk.Button(stock=gtk.STOCK_REVERT_TO_SAVED) self.resetButton.set_sensitive(False) self.resetButton.connect("clicked", self.resetChanges) self.resetButton.set_tooltip_text('restore the entries') #submit button self.submitButton = gtk.Button("Submit") self.submitButton.set_sensitive(False) self.submitButton.connect("clicked", self.openLicenseNoticeWindow) self.submitButton.set_tooltip_text('submit your modifications to the server') #create the device tree self.setDeviceTree() hboxBelowEntries.pack_end(self.applyButton, False, True, 0) hboxBelowEntries.pack_end(self.resetButton, False, True, 0) hboxBelowEntries.pack_start(self.submitButton, False, True, 0) hboxBelowEntries.show_all() #lFrame = gtk.Frame() #lFrame.add(rhbox) #lFrame.set_border_width(5) #start the left vertical box self.rightWindow = gtk.VBox(False, 0) self.rightWindow.pack_start(self.tihbox, True, True, 3) self.rightWindow.pack_start(notebook, False, True, 3) self.rightWindow.pack_start(self.descriptionLabel, False, True, 3) self.rightWindow.pack_start(sw, False, True, 0) self.rightWindow.pack_start(hboxBelowEntries, False, True, 10) #self.rightWindow.show_all() rhbox = gtk.HBox(False, 0) rhbox.pack_start(self.rightWindow, True, True, 5) rvbox = gtk.VBox(False, 0) rvbox.pack_start(rthbox, True, True, 0) rvbox.pack_start(rhbox, True, True, 0) self.centerWindow.pack_start(rvbox, True, True, 0) #self.rframe.add(self.rightWindow) #self.rframe.set_border_width(30) self.centerWindow.show_all() self.bottomWindow.show_all() self.leftWindow.show() self.window.show() self.synchronize(None) self.updateStatus() #self.logoutButton.hide() def main(): gtk.main() if __name__ == "__main__": Client = hclient() main()