307 lines
8.6 KiB
Python
307 lines
8.6 KiB
Python
#!/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):
|
|
data.save("ssys.xml", self.systems, "Systems", "ssys", True,
|
|
{ "jumps":"jump", "fleets":"fleet", "planets":"planet" })
|
|
|
|
def loadPlanets(self, xmlfile):
|
|
self.planets = data.load(xmlfile, "planet", True, ["commodities"])
|
|
|
|
|
|
def savePlanets(self, xmlfile):
|
|
data.save("planet.xml", self.planets, "Planets", "planet", True,
|
|
{ "commodities":"commodity" })
|
|
|
|
def window(self):
|
|
"""
|
|
create the window
|
|
"""
|
|
# --------------- SYSTEMS --------------------
|
|
self.swtree = gtk.glade.XML(self.glade, "winSystems")
|
|
|
|
# Hook events and stuff.
|
|
hooks = {
|
|
"winSystems":["destroy",self.__done],
|
|
"treSystems":["row-activated", self.__update],
|
|
"butDone":["clicked", self.__done],
|
|
"butSave":["clicked",self.saveSystems],
|
|
"butZoomIn":["clicked", self.__space_zoomin],
|
|
"butZoomOut":["clicked", self.__space_zoomout]
|
|
}
|
|
for key, val in hooks.items():
|
|
self.__swidget(key).connect(val[0], val[1])
|
|
|
|
# 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)
|
|
|
|
self.zoom = 1
|
|
area = self.__swidget("draSpace")
|
|
area.set_events(gtk.gdk.EXPOSURE_MASK
|
|
| gtk.gdk.LEAVE_NOTIFY_MASK
|
|
| gtk.gdk.BUTTON_PRESS_MASK
|
|
| gtk.gdk.POINTER_MOTION_MASK
|
|
| gtk.gdk.POINTER_MOTION_HINT_MASK)
|
|
area.connect("expose-event", self.__space_draw)
|
|
area.connect("button-press-event", self.__space_down)
|
|
area.connect("motion-notify-event", self.__space_drag)
|
|
|
|
# Display the window and such.
|
|
self.__swidget("winSystems").show_all()
|
|
self.cur_system = ""
|
|
self.x = self.y = 0
|
|
self.lx = self.ly = 0
|
|
|
|
# ---------------- PLANETS --------------------
|
|
|
|
# ---------------------------------------------
|
|
gtk.main()
|
|
|
|
|
|
def __swidget(self,wgtname):
|
|
"""
|
|
get a widget from the winSystems
|
|
"""
|
|
return self.swtree.get_widget(wgtname)
|
|
|
|
|
|
def __update(self, wgt=None, index=None, iter=None):
|
|
"""
|
|
Update the window
|
|
"""
|
|
|
|
# Store the current values.
|
|
self.__store();
|
|
|
|
self.cur_system = self.__curSystem()
|
|
system = self.systems[self.cur_system]
|
|
|
|
# Load it all.
|
|
dic = {
|
|
"inpName":self.cur_system,
|
|
"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)
|
|
|
|
self.__space_draw()
|
|
|
|
def __store(self):
|
|
sys_name = self.__swidget("inpName").get_text()
|
|
|
|
# Renamed the current system.
|
|
if sys_name != self.cur_system:
|
|
self.systems[sys_name] = self.systems[self.cur_system] # Copy it over.
|
|
model = self.__swidget("treSystems").get_model()
|
|
|
|
# Must rename the node in the treeview.
|
|
for i in model:
|
|
if i[0] == self.cur_system:
|
|
i[0] = sys_name
|
|
break
|
|
|
|
# Update the jump paths.
|
|
for key, value in self.systems.items():
|
|
i = 0
|
|
for jump in value["jumps"]:
|
|
if jump == self.cur_system:
|
|
self.systems[key]["jumps"].pop(i)
|
|
self.systems[key]["Jumps"].append(sys_name)
|
|
i = i+1
|
|
|
|
# Delete the old system and change current to it.
|
|
del self.systems[self.cur_system] # Get rid of the old one.
|
|
self.cur_system = sys_name # Now use self.cur_system again.
|
|
|
|
try:
|
|
system = self.systems[self.cur_system]
|
|
except:
|
|
return # No system selected yet.
|
|
|
|
# Start to load all the input stuff.
|
|
# General crap.
|
|
self.__sinpStore(system, "spiStars", "general", "stars")
|
|
self.__sinpStore(system, "spiInterference", "general", "interference")
|
|
self.__sinpStore(system, "spiAsteroids", "general", "asteroids")
|
|
|
|
def __sinpStore(self, system, wgt, tag, minortag=None):
|
|
text = self.__swidget(wgt).get_text()
|
|
if minortag==None:
|
|
system[tag] = text
|
|
else:
|
|
system[tag][minortag] = text
|
|
|
|
def __curSystem(self):
|
|
# Important thingies.
|
|
tree = self.__swidget("treSystems")
|
|
model = tree.get_model()
|
|
iter = tree.get_selection().get_selected()[1]
|
|
p = model.iter_parent(iter)
|
|
if p == None:
|
|
return model.get_value(iter, 0)
|
|
else:
|
|
return model.get_value(p, 0)
|
|
|
|
def __done(self, widget=None, data=None):
|
|
"""
|
|
Window is done
|
|
"""
|
|
gtk.main_quit()
|
|
|
|
def __space_down(self, wgt, event):
|
|
if event.button == 1:
|
|
x = event.x
|
|
y = event.y
|
|
|
|
# Modify the current position.
|
|
if self.__swidget("butReposition").get_active() and self.cur_system != "":
|
|
wx, wy, ww, wh = self.__swidget("draSpace").get_allocation()
|
|
|
|
mx = x - (self.x*self.zoom + ww/2)
|
|
my = y - (self.y*self.zoom + wh/2)
|
|
|
|
system = self.systems[self.cur_system]
|
|
system["pos"]["x"] = str(mx)
|
|
system["pos"]["y"] = str(-my)
|
|
|
|
self.__space_draw()
|
|
|
|
self.__swidget("butReposition").set_active(False)
|
|
|
|
self.lx = x
|
|
self.ly = y
|
|
return True
|
|
|
|
def __space_drag(self, wgt, event):
|
|
x = event.x
|
|
y = event.y
|
|
state = event.state
|
|
|
|
wx, wy, ww, wh = self.__swidget("draSpace").get_allocation()
|
|
|
|
mx = x - (self.x*self.zoom + ww/2)
|
|
my = y - (self.y*self.zoom + wh/2)
|
|
|
|
self.__swidget("labCurPos").set_text("%d%d" % (mx, my))
|
|
|
|
if state & gtk.gdk.BUTTON1_MASK:
|
|
xrel = x - self.lx
|
|
yrel = y - self.ly
|
|
self.x = self.x + xrel/self.zoom
|
|
self.y = self.y + yrel/self.zoom
|
|
self.lx = x
|
|
self.ly = y
|
|
|
|
self.__space_draw()
|
|
|
|
return True
|
|
|
|
def __space_zoomout(self, wgt=None, event=None):
|
|
self.zoom = self.zoom/2
|
|
if self.zoom < 0.1:
|
|
self.zoom = 0.1
|
|
self.__space_draw()
|
|
|
|
def __space_zoomin(self, wgt=None, event=None):
|
|
self.zoom = self.zoom*2
|
|
if self.zoom > 4:
|
|
self.zoom = 4
|
|
self.__space_draw()
|
|
|
|
def __space_draw(self, wgt=None, event=None):
|
|
area = self.__swidget("draSpace")
|
|
style = area.get_syle()
|
|
gc = style.fg_gc[gtk.STATE_NORMAL]
|
|
bg_gc = style.bg_gc[gtk.STATE_NORMAL]
|
|
wx, wy, ww, wh = area.get_allocation()
|
|
cx = self.x*self.zoom + ww/2
|
|
cy = sefl.y*self.zoom + wh/2
|
|
r = 15
|
|
|
|
# Cleanup.
|
|
area.window.draw_rectangle(bg_gc, True, 0, 0, ww, wh)
|
|
area.window.draw_rectangle(gc, False, 0, 0, ww-1, wh-1)
|
|
|
|
for sys_name, system in self.systems.items():
|
|
sx = float(system["pos"]["x"])
|
|
sy = -float(system["pos"]["y"])
|
|
dx = cx+sx*self.zoom
|
|
dy = cy+sy*self.zoom
|
|
|
|
# Draw jumps.
|
|
for jump in system["jumps"]:
|
|
jsx = float(self.systems[jump]["pos"]["x"])
|
|
jsy = -float(self.systems[jump]["pos"]["y"])
|
|
jdx = cx+jsx*self.zoom
|
|
jdy = cy+jsy*self.zoom
|
|
|
|
area.window.draw_line(gc, dx, dy, jdx, jdy)
|
|
|
|
# Draw circle.
|
|
area.window.draw_arc(gc, True, dx-r/2, dy-r/2, r, r, 0, 360*64)
|
|
area.window.draw_arc(bg_gc, True, dxr/2+2, dy-r/2+2, r-4, r-4, 0, 360*64)
|
|
|
|
# Draw name.
|
|
layout = area.create_pango_layout(sys_name)
|
|
area.window.draw_layout(gc, dx+r/2+2, dy-r/2, layout)
|
|
|
|
def debug(self):
|
|
print "SYSTEMS LOADED:"
|
|
print self.systems
|
|
print
|
|
print
|
|
print "PLANETS LOADED:"
|
|
print self.planets
|
|
|