Better tool names
[erdslangetjie.git] / erdslangetjie / editor / editor.py
1 import sys
2 import os
3
4 from erdslangetjie.constants import TILE_SIZE
5
6 from kivy.app import App
7 from kivy.uix.widget import Widget
8 from kivy.uix.floatlayout import FloatLayout
9 from kivy.graphics import Color, Rectangle
10 from kivy.uix.label import Label
11 from kivy.utils import platform
12 from kivy.config import Config
13
14 from erdslangetjie.data import filepath, load
15 from erdslangetjie.level import Level
16
17
18 if platform() != 'android':
19     Config.set('graphics', 'width', '1326')
20     Config.set('graphics', 'height', '760')
21
22
23 class EditorWindow(FloatLayout):
24
25     def __init__(self, level):
26         super(EditorWindow, self).__init__(size=(1326, 760))
27         if os.path.exists(filepath(level)):
28             level_data = load(level)
29             self.level = level
30         elif os.path.exists(filepath('levels/' + level)):
31             level_data = load('levels/' + level)
32             self.level = 'levels/' + level
33         else:
34             print 'Unable to find %s - treating this as a new level' % level
35             level_data = load('levels/blank.txt')
36             if 'levels/' in level:
37                 self.level = level
38             else:
39                 self.level = 'levels/' + level
40         self.level_obj = Level(level_data)
41         level_data.close()
42         self.level_obj.load_tiles()
43
44         self.tool = None
45         self.tool_widgets = []
46
47     def build(self):
48         self.clear_widgets()
49         tiles = self.level_obj.get_tiles()
50         bx, by = 0, 0
51         self.nodes = {}
52         for tile_line in tiles:
53             bx = 0
54             for tile in tile_line:
55                 node = Widget(size=(TILE_SIZE, TILE_SIZE), pos=(bx, by))
56                 node.bind(on_touch_down=self.change_node)
57                 node.bind(on_touch_move=self.change_node)
58                 with node.canvas:
59                     Color(1, 1, 1)
60                     Rectangle(pos=node.pos, size=node.size,
61                             texture=tile.texture)
62                 self.add_widget(node)
63                 self.nodes[(bx, by)] = node
64                 bx += TILE_SIZE
65             by += TILE_SIZE
66
67         name = Label(text="Level: [color=00ffcc]%s[/color]" % self.level,
68                 markup=True, font_size=24, pos=(500, 360))
69         self.add_widget(name)
70
71         self.draw_toolbar()
72
73     def draw_toolbar(self):
74         for widget in self.tool_widgets:
75             widget.unbind(on_ref_press=self.change_tool)
76             self.remove_widget(widget)
77         self.tool_widgets = []
78         y = 300
79         for tool in ['wall', 'floor', 'add entrance', 'add exit']:
80             if self.tool == tool:
81                 color = '00cccc'
82             else:
83                 color = 'cccccc'
84             tool_label = Label(text='[color=%s][ref=%s]%s[/color]' %
85                     (color, tool, tool), markup=True, font_size=24,
86                     pos=(500, y))
87             y -= 50
88             tool_label.bind(on_ref_press=self.change_tool)
89             self.add_widget(tool_label)
90             self.tool_widgets.append(tool_label)
91
92     def change_tool(self, label, ref):
93         self.tool = ref
94         self.draw_toolbar()
95
96     def contained(self, node, pos):
97         if pos[0] < node.pos[0] or pos[0] > node.pos[0] + TILE_SIZE:
98             return False
99         if pos[1] < node.pos[1] or pos[1] > node.pos[1] + TILE_SIZE:
100             return False
101         return True
102
103     def change_node(self, node, touch):
104         if self.contained(node, touch.pos):
105             print touch, node, node.size, node.pos
106
107
108 class EditorApp(App):
109
110     def __init__(self, level):
111         self.level = level
112         super(EditorApp, self).__init__()
113
114     def build(self):
115         editor = EditorWindow(self.level)
116         editor.build()
117         return editor
118
119
120 def main():
121     if len(sys.argv) > 1:
122         level = sys.argv[1]
123     else:
124         level = 'level1.txt'
125     EditorApp(level).run()
126
127
128 if __name__ == '__main__':
129     main()