diff --git a/utils/resedit/data.py b/utils/resedit/data.py new file mode 100644 index 0000000..85b9dfb --- /dev/null +++ b/utils/resedit/data.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +from xml.dom import minidom + +def load(xmlfile, tag, has_name=True, do_array=None): + dom = minidom.parse(xmlfile) + xmlNodes = dom.getElementsByTagName(tag) + + dictionary = {} + for xmlNode in xmlNodes: + mdic = {} + # Name is stored as a property and not a node. + if(has_name): + name = xmlNode.attributes["name"].value + + # Process the nodes. + for bignode in filter(lambda x: x.nodeType==x.ELEMENT_NODE, xmlNode.childNodes): + # Load the nodes. + section = {} + array = [] + for node in filter(lambda x: x.nodeType==x.ELEMENT_NODE, + bignode.childNodes): + if bignode.nodeName in do_array: # Big ugly hack to use list instead of array. + array.append(node.firstChild.data) + else: # Normal way (but will overwrite lists). + section[node.nodeName] = node.firstChild.data + + if len(array) > 0: + mdic[bignode.nodeName] = array + else: + mdic[bignode.nodeName] = section + + # Append the element to the dictionary. + dictionary[name] = mdic + + dom.unlink() + return dictionary + +def save(xmlfile, basetag, tag, has_name=True): + print "TODO" + diff --git a/utils/resedit/data.pyc b/utils/resedit/data.pyc new file mode 100644 index 0000000..0d44609 Binary files /dev/null and b/utils/resedit/data.pyc differ diff --git a/utils/resedit/resedit.py b/utils/resedit/resedit.py new file mode 100755 index 0000000..4150247 --- /dev/null +++ b/utils/resedit/resedit.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +import space + +# Load the universe. +universe = space.space() +universe.loadSystems("../../dat/ssys.xml") +universe.loadPlanets("../../dat/planet.xml") +universe.debug() +universe.window() + diff --git a/utils/resedit/space.glade b/utils/resedit/space.glade new file mode 100644 index 0000000..41055f2 --- /dev/null +++ b/utils/resedit/space.glade @@ -0,0 +1,360 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> +<!--Generated with glade3 3.4.1 on Thu Feb 7 11:50:56 2008 --> +<glade-interface> + <widget class="GtkWindow" id="winSystems"> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="title" translatable="yes">Systems</property> + <property name="default_width">600</property> + <property name="default_height">420</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child> + <widget class="GtkHPaned" id="hpaned1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child> + <widget class="GtkTreeView" id="treSystems"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="headers_clickable">True</property> + </widget> + <packing> + <property name="resize">False</property> + <property name="shrink">True</property> + </packing> + </child> + <child> + <widget class="GtkLayout" id="layout1"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="width_request">67</property> + <property name="height_request">31</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Name:</property> + </widget> + <packing> + <property name="x">31</property> + <property name="y">26</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="inpName"> + <property name="width_request">134</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="truncate_multiline">True</property> + </widget> + <packing> + <property name="x">95</property> + <property name="y">31</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labPos"> + <property name="width_request">65</property> + <property name="height_request">25</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">X,Y</property> + </widget> + <packing> + <property name="x">242</property> + <property name="y">28</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="butRepos"> + <property name="width_request">75</property> + <property name="height_request">33</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Reposition</property> + <property name="response_id">0</property> + </widget> + <packing> + <property name="x">319</property> + <property name="y">23</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label2"> + <property name="width_request">103</property> + <property name="height_request">28</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Interference</property> + </widget> + <packing> + <property name="x">19</property> + <property name="y">75</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="width_request">402</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">6</property> + <property name="y">55</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spiInterference"> + <property name="width_request">74</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="adjustment">0 0 100 1 10 10</property> + </widget> + <packing> + <property name="x">117</property> + <property name="y">79</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="width_request">75</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Asteroids</property> + </widget> + <packing> + <property name="x">29</property> + <property name="y">114</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spiAsteroids"> + <property name="width_request">72</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="adjustment">0 0 100 1 10 10</property> + </widget> + <packing> + <property name="x">119</property> + <property name="y">113</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label4"> + <property name="width_request">68</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Stars</property> + </widget> + <packing> + <property name="x">32</property> + <property name="y">144</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spiStars"> + <property name="width_request">73</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="adjustment">0 0 100 1 10 10</property> + </widget> + <packing> + <property name="x">120</property> + <property name="y">143</property> + </packing> + </child> + <child> + <widget class="GtkVSeparator" id="vseparator1"> + <property name="width_request">20</property> + <property name="height_request">259</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">202</property> + <property name="y">72</property> + </packing> + </child> + <child> + <widget class="GtkDrawingArea" id="draSpace"> + <property name="width_request">180</property> + <property name="height_request">171</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">221</property> + <property name="y">88</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator2"> + <property name="width_request">204</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">5</property> + <property name="y">169</property> + </packing> + </child> + <child> + <widget class="GtkTreeView" id="treJumps"> + <property name="width_request">193</property> + <property name="height_request">86</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="headers_clickable">True</property> + </widget> + <packing> + <property name="x">10</property> + <property name="y">205</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="butAddJump"> + <property name="width_request">70</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Add</property> + <property name="response_id">0</property> + </widget> + <packing> + <property name="x">25</property> + <property name="y">298</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="butRmJump"> + <property name="width_request">70</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Delete</property> + <property name="response_id">0</property> + </widget> + <packing> + <property name="x">121</property> + <property name="y">298</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label5"> + <property name="width_request">126</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Jumps</property> + </widget> + <packing> + <property name="x">44</property> + <property name="y">184</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labSpace"> + <property name="width_request">100</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Space</property> + </widget> + <packing> + <property name="x">263</property> + <property name="y">69</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator3"> + <property name="width_request">190</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">218</property> + <property name="y">265</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="butSave"> + <property name="width_request">87</property> + <property name="height_request">38</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Save</property> + <property name="response_id">0</property> + </widget> + <packing> + <property name="x">227</property> + <property name="y">290</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="butDone"> + <property name="width_request">83</property> + <property name="height_request">41</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Done</property> + <property name="response_id">0</property> + </widget> + <packing> + <property name="x">322</property> + <property name="y">288</property> + </packing> + </child> + </widget> + <packing> + <property name="resize">True</property> + <property name="shrink">False</property> + </packing> + </child> + </widget> + </child> + <child> + <widget class="GtkStatusbar" id="staBottom"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="spacing">2</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/utils/resedit/space.py b/utils/resedit/space.py new file mode 100644 index 0000000..8e9d72d --- /dev/null +++ b/utils/resedit/space.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python + +try: + import gtk,gtk.glade + import gobject +except: + print "You do not have python gtk bindings, or you're missing glade libs" + print "To use Lephisto's resedit you must install them" + print "http://pygtk.org/ " + raise SystemExit + +import data + +class space: + + def __init__(self): + self.glade = "space.glade" + self.systemsXML = "../../dat/ssys.xml" + self.planetsXML = "../../dat/planet.xml" + self.loadSystems(self.systemsXML) + self.loadPlanets(self.planetsXML) + + def loadSystems(self, xmlfile): + self.systems = data.load(xmlfile, "ssys", True, ["jumps","fleets","planets"]) + + + def saveSystems(self, xmlfile): + print "TODO" + + + def loadPlanets(self, xmlfile): + self.planets = data.load(xmlfile, "planet", True, ["commodities"]) + + + def savePlanets(self, xmlfile): + print "TODO" + + + def window(self): + """ + create the window + """ + # --------------- SYSTEMS -------------------- + self.swtree = gtk.glade.XML(self.glade, "winSystems") + + # Hook events and stuff. + self.__swidget("winSystems").connect("destroy", self.__done) + self.__swidget("butDone").connect("clicked", self.__done) + self.__swidget("treSystems").connect("row-activated", self.__update) + + # Populate the tree. + self.tree_systems = gtk.TreeStore(str) + for system in self.systems: # Load the planets. + treenode = self.tree_systems.append(None, [system]) + for planet in self.systems[system]['planets']: + self.tree_systems.append(treenode, [planet]) + col = gtk.TreeViewColumn('Systems') + cell = gtk.CellRendererText() + self.__swidget("treSystems").append_column(col) + col.pack_start(cell, True) + col.add_attribute(cell, 'text', 0) + self.__swidget("treSystems").set_model(self.tree_systems) + + # Display the window and such. + self.__swidget("winSystems").show_all() + + # ---------------- PLANETS -------------------- + + # --------------------------------------------- + gtk.main() + + + def __swidget(self,wgtname): + """ + get a widget from the winSystems + """ + return self.swtree.get_widget(wgtname) + + + def __update(self, wgt=None, foo=None, bar=None): + """ + Update the window + """ + # Important thingies. + tree = self.__swidget("treSystems") + model = tree.get_model() + + # Get system. + sel = model.iter_nth_child(None, foo[0]) + sys_name = model.get_value( sel, 0 ) + system = self.systems[sys_name] + + # Load it all. + dic = { + "inpName":sys_name, + "spiInterference":system["general"]["interference"], + "spiAsteroids":system["general"]["asteroids"], + "spiStars":system["general"]["stars"], + "labPos":"%s,%s" % (system["pos"]["x"],system["pos"]["y"]) + } + for key, value in dic.items(): + self.__swidget(key).set_text(value) + + # Load jumps. + + jumps = gtk.ListStore(str) + for jump in system["jumps"]: # Load the planets. + treenode = jumps.append([jump]) + col = gtk.TreeViewColumn('Jumps') + cell = gtk.CellRendererText() + wgt = self.__swidget("treJumps") + if wgt.get_column(0): + wgt.remove_column( wgt.get_column(0) ) + wgt.append_column(col) + col.pack_start(cell, True) + col.add_attribute(cell, 'text', 0) + wgt.set_model(jumps) + + def __done(self, widget=None, data=None): + """ + Window is done + """ + gtk.main_quit() + + def debug(self): + print "SYSTEMS LOADED:" + print self.systems + print + print + print "PLANETS LOADED:" + print self.planets + diff --git a/utils/resedit/space.pyc b/utils/resedit/space.pyc new file mode 100644 index 0000000..1acd9b0 Binary files /dev/null and b/utils/resedit/space.pyc differ