1 #!/usr/bin/env python 2 3 import QtConfigurator.Forms 4 import XSLForms.Prepare 5 import factory 6 import qtui 7 import qtxmldom 8 import os 9 10 class Configurator(QtConfigurator.Forms.Configurator): 11 12 # Standard attributes. 13 14 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 15 16 template_resources = { 17 "configuration" : "config.ui" 18 } 19 20 widget_resources = { 21 "hard-disk" : ("config_hard_disk.ui", "hard_disk"), 22 "memory-unit" : ("config_memory_unit.ui", "memory_unit"), 23 "storage-unit" : ("config_storage_unit.ui", "storage_unit") 24 #"hard-disks" : ("config_hard_disks.ui", "hard_disks"), 25 #"memory-units" : ("config_memory_units.ui", "memory_units"), 26 #"storage-units" : ("config_storage_units.ui", "storage_units") 27 } 28 29 document_resources = { 30 "base-system" : "config_base_system.xml", 31 "cpu" : "config_cpu.xml", 32 "hard-disk" : "config_hard_disk.xml", 33 "keyboard" : "config_keyboard.xml", 34 "mouse" : "config_mouse.xml", 35 "screen" : "config_screen.xml" 36 } 37 38 # Helper methods. 39 # NOTE: Should be moved to a superclass. 40 41 def prepare_document(self, document_identifier): 42 filename = self.document_resources[document_identifier] 43 return os.path.abspath(os.path.join(self.resource_dir, filename)) 44 45 def get_document(self, document_identifier): 46 return qtxmldom.parse(self.prepare_document(document_identifier)) 47 48 def get_elements(self, document_identifier): 49 doc = self.get_document(document_identifier) 50 return doc.getElementsByTagName(document_identifier + "-enum") 51 52 def populate_list(self, field, elements): 53 current_text = field.currentText() 54 while field.count() > 0: 55 field.removeItem(0) 56 item = 0 57 set = 0 58 for element in elements: 59 text = element.getAttribute("value") 60 field.insertItem(text) 61 if text == current_text: 62 field.setCurrentItem(item) 63 set = 1 64 item += 1 65 if not set: 66 field.setCurrentItem(0) 67 68 def prepare_template(self, template_identifier): 69 filename = self.template_resources[template_identifier] 70 return os.path.abspath(os.path.join(self.resource_dir, filename)) 71 72 def prepare_widget(self, template_identifier, widget_identifier, parent=None): 73 template_path = self.prepare_template(template_identifier) 74 fragment_name, widget_name = self.widget_resources[widget_identifier] 75 fragment_path = os.path.abspath(os.path.join(self.resource_dir, fragment_name)) 76 XSLForms.Prepare.ensure_qt_fragment(template_path, fragment_path, widget_name) 77 return qtui.QWidgetFactory.create(fragment_path, None, parent) 78 79 # Initialisation. 80 81 def __init__(self, *args, **kw): 82 QtConfigurator.Forms.Configurator.__init__(self, *args, **kw) 83 self.factory = factory.Factory(self.prepare_template("configuration")) 84 85 # Get field data. 86 # NOTE: This would be done for whole page updates in a Web application. 87 88 self.populate_list(self.base_system, self.get_elements("base-system")) 89 self.populate_list(self.keyboard, self.get_elements("keyboard")) 90 self.populate_list(self.mouse, self.get_elements("mouse")) 91 self.populate_list(self.screen, self.get_elements("screen")) 92 93 # General functionality. 94 95 def refresh(self, current_text=None): 96 97 # Ensure consistency. 98 # NOTE: This would be done for whole page updates in a Web application. 99 # NOTE: This would also be done for page updates where the information 100 # NOTE: involved was important. 101 102 current_text = current_text or self.base_system.currentText() 103 104 # Find the CPU socket and the interface of the current base system. 105 cpu_socket = None 106 interface = None 107 for element in self.get_elements("base-system"): 108 text = element.getAttribute("value") 109 if text == current_text: 110 cpu_socket = element.getAttribute("cpu-socket") 111 interface = element.getAttribute("interface") 112 113 # Find all valid CPUs. 114 valid = [] 115 for element in self.get_elements("cpu"): 116 if not element.hasAttribute("cpu-socket") or element.getAttribute("cpu-socket") == cpu_socket: 117 valid.append(element) 118 self.populate_list(self.cpu, valid) 119 120 # Find all valid hard disks. 121 valid = [] 122 for element in self.get_elements("hard-disk"): 123 if not element.hasAttribute("interface") or element.getAttribute("interface") == interface: 124 valid.append(element) 125 for hard_disk_value in self.factory.find_widgets(self, "hard_disk_value"): 126 self.populate_list(hard_disk_value, valid) 127 128 # Slots. 129 130 def baseSystemChanged(self, current_text): 131 self.refresh(current_text) 132 133 def addHardDisk(self): 134 #hard_disks = self.prepare_widget("configuration", "hard-disks") 135 #tab_pages = hard_disks.child("tab pages") 136 #tab = tab_pages.child("tab") 137 #self.hard_disks.addTab(tab, hard_disks.tabLabel(tab)) 138 #self.factory.connect(tab, self) 139 hard_disk = self.prepare_widget("configuration", "hard-disk", self.hard_disks) 140 self.hard_disks.layout().add(hard_disk) 141 hard_disk.show() 142 self.factory.connect(hard_disk, self) 143 144 # Perform the consistency check. 145 # NOTE: This is not as efficient as it could be since the general check 146 # NOTE: refreshes all fields, not just newly added ones. 147 self.refresh() 148 149 def addMemoryUnit(self): 150 #memory_units = self.prepare_widget("configuration", "memory-units") 151 #tab_pages = memory_units.child("tab pages") 152 #tab = tab_pages.child("tab") 153 #self.memory_units.addTab(tab, memory_units.tabLabel(tab)) 154 #self.factory.connect(tab, self) 155 memory_unit = self.prepare_widget("configuration", "memory-unit", self.memory_units) 156 self.memory_units.layout().add(memory_unit) 157 memory_unit.show() 158 self.factory.connect(memory_unit, self) 159 160 # Perform the consistency check. 161 # NOTE: This is not as efficient as it could be since the general check 162 # NOTE: refreshes all fields, not just newly added ones. 163 self.refresh() 164 165 def addStorageUnit(self): 166 #storage_units = self.prepare_widget("configuration", "storage-units") 167 #tab_pages = storage_units.child("tab pages") 168 #tab = tab_pages.child("tab") 169 #self.storage_units.addTab(tab, storage_units.tabLabel(tab)) 170 #self.factory.connect(tab, self) 171 storage_unit = self.prepare_widget("configuration", "storage-unit", self.storage_units) 172 self.storage_units.layout().add(storage_unit) 173 storage_unit.show() 174 self.factory.connect(storage_unit, self) 175 176 # Perform the consistency check. 177 # NOTE: This is not as efficient as it could be since the general check 178 # NOTE: refreshes all fields, not just newly added ones. 179 self.refresh() 180 181 def removeHardDisk(self): 182 #page = self.hard_disks.currentPage() 183 #self.hard_disks.removePage(page) 184 #page.deleteLater() 185 remove_hard_disk = self.sender() 186 hard_disk = remove_hard_disk.parent() 187 self.hard_disks.layout().remove(hard_disk) 188 hard_disk.deleteLater() 189 190 def removeMemoryUnit(self): 191 #page = self.memory_units.currentPage() 192 #self.memory_units.removePage(page) 193 #page.deleteLater() 194 remove_memory_unit = self.sender() 195 memory_unit = remove_memory_unit.parent() 196 self.memory_units.layout().remove(memory_unit) 197 memory_unit.deleteLater() 198 199 def removeStorageUnit(self): 200 #page = self.storage_units.currentPage() 201 #self.storage_units.removePage(page) 202 #page.deleteLater() 203 remove_storage_unit = self.sender() 204 storage_unit = remove_storage_unit.parent() 205 self.storage_units.layout().remove(storage_unit) 206 storage_unit.deleteLater() 207 208 def updateConfig(self): 209 self.refresh() 210 211 def exportConfig(self): 212 print "configuration.exportConfig(): Not implemented yet" 213 214 # vim: tabstop=4 expandtab shiftwidth=4