Refactor code and add some editor functions
[erdslangetjie.git] / erdslangetjie / editor / editor.py
index 08c5f6b32bf987a7a81a4c7946540a7624a949fa..f2bf09b9d12e1afc071ebcebf914933a35a7149d 100644 (file)
@@ -1,23 +1,29 @@
 import sys
 import os
 import sys
 import os
-import kivy
 
 
-kivy.require('1.6.0')
+from erdslangetjie.constants import TILE_SIZE
 
 from kivy.app import App
 
 from kivy.app import App
-from kivy.logger import Logger, LoggerHistory
 from kivy.uix.widget import Widget
 from kivy.uix.floatlayout import FloatLayout
 from kivy.graphics import Color, Rectangle
 from kivy.uix.widget import Widget
 from kivy.uix.floatlayout import FloatLayout
 from kivy.graphics import Color, Rectangle
+from kivy.uix.label import Label
+from kivy.utils import platform
+from kivy.config import Config
 
 from erdslangetjie.data import filepath, load
 from erdslangetjie.level import Level
 
 
 
 from erdslangetjie.data import filepath, load
 from erdslangetjie.level import Level
 
 
+if platform() != 'android':
+    Config.set('graphics', 'width', '1326')
+    Config.set('graphics', 'height', '760')
+
+
 class EditorWindow(FloatLayout):
 
     def __init__(self, level):
 class EditorWindow(FloatLayout):
 
     def __init__(self, level):
-        super(EditorWindow, self).__init__(size=(648, 480))
+        super(EditorWindow, self).__init__(size=(1326, 760))
         if os.path.exists(filepath(level)):
             level_data = load(level)
             self.level = level
         if os.path.exists(filepath(level)):
             level_data = load(level)
             self.level = level
@@ -35,22 +41,68 @@ class EditorWindow(FloatLayout):
         level_data.close()
         self.level_obj.load_tiles()
 
         level_data.close()
         self.level_obj.load_tiles()
 
+        self.tool = None
+        self.tool_widgets = []
+
     def build(self):
         self.clear_widgets()
         tiles = self.level_obj.get_tiles()
     def build(self):
         self.clear_widgets()
         tiles = self.level_obj.get_tiles()
-        tile_size = 24
         bx, by = 0, 0
         bx, by = 0, 0
+        self.nodes = {}
         for tile_line in tiles:
             bx = 0
             for tile in tile_line:
         for tile_line in tiles:
             bx = 0
             for tile in tile_line:
-                node = Widget(size=(tile_size, tile_size), pos=(bx, by))
+                node = Widget(size=(TILE_SIZE, TILE_SIZE), pos=(bx, by))
+                node.bind(on_touch_down=self.change_node)
+                node.bind(on_touch_move=self.change_node)
                 with node.canvas:
                     Color(1, 1, 1)
                     Rectangle(pos=node.pos, size=node.size,
                             texture=tile.texture)
                 self.add_widget(node)
                 with node.canvas:
                     Color(1, 1, 1)
                     Rectangle(pos=node.pos, size=node.size,
                             texture=tile.texture)
                 self.add_widget(node)
-                bx += tile_size
-            by += tile_size
+                self.nodes[(bx, by)] = node
+                bx += TILE_SIZE
+            by += TILE_SIZE
+
+        name = Label(text="Level: [color=00ffcc]%s[/color]" % self.level,
+                markup=True, font_size=24, pos=(500, 360))
+        self.add_widget(name)
+
+        self.draw_toolbar()
+
+    def draw_toolbar(self):
+        for widget in self.tool_widgets:
+            widget.unbind(on_ref_press=self.change_tool)
+            self.remove_widget(widget)
+        self.tool_widgets = []
+        y = 300
+        for tool in ['wall', 'floor', 'add entrance', 'add exit']:
+            if self.tool == tool:
+                color = '00cccc'
+            else:
+                color = 'cccccc'
+            tool_label = Label(text='[color=%s][ref=%s]%s[/color]' %
+                    (color, tool, tool), markup=True, font_size=24,
+                    pos=(500, y))
+            y -= 50
+            tool_label.bind(on_ref_press=self.change_tool)
+            self.add_widget(tool_label)
+            self.tool_widgets.append(tool_label)
+
+    def change_tool(self, label, ref):
+        self.tool = ref
+        self.draw_toolbar()
+
+    def contained(self, node, pos):
+        if pos[0] < node.pos[0] or pos[0] > node.pos[0] + TILE_SIZE:
+            return False
+        if pos[1] < node.pos[1] or pos[1] > node.pos[1] + TILE_SIZE:
+            return False
+        return True
+
+    def change_node(self, node, touch):
+        if self.contained(node, touch.pos):
+            print touch, node, node.size, node.pos
 
 
 class EditorApp(App):
 
 
 class EditorApp(App):
@@ -70,10 +122,6 @@ def main():
         level = sys.argv[1]
     else:
         level = 'level1.txt'
         level = sys.argv[1]
     else:
         level = 'level1.txt'
-    # Uncomment to silence excessive logging
-    #for hdlr in Logger.handlers[:]:
-    #    if not isinstance(hdlr, LoggerHistory):
-    #        Logger.removeHandler(hdlr)
     EditorApp(level).run()
 
 
     EditorApp(level).run()