From 64b7e631d8f657113154e99b73bf32200a5276b2 Mon Sep 17 00:00:00 2001
From: Ingo Ruhnke <grumbel@gmx.de>
Date: Tue, 29 Apr 2008 17:22:00 +0200
Subject: [PATCH] Mouse clicks can now connect ports

---
 gui/inputcfg.py | 68 +++++++++++++++++++++++++++----------------------
 1 file changed, 37 insertions(+), 31 deletions(-)

diff --git a/gui/inputcfg.py b/gui/inputcfg.py
index dc53664..9227192 100755
--- a/gui/inputcfg.py
+++ b/gui/inputcfg.py
@@ -47,7 +47,7 @@ class Port:
         self.group.connect("leave-notify-event", self.on_leave)
 
     def on_button_press(self, item, target_item, event):
-        pass
+        inputcfg.drag_start(self)
 
     def on_enter(self, *rest):
         self.is_active = True
@@ -158,7 +158,8 @@ class Control:
         return self.width
 
     def layout(self):
-        height = 40 + max(len(self.in_ports), len(self.out_ports)) * 20
+        spacing = 26
+        height = 45 + max(len(self.in_ports), len(self.out_ports)) * spacing
         self.mainbox.set_properties(height=height)
 
         self.mainbox.set_properties(x=self.x, y=self.y)
@@ -166,9 +167,9 @@ class Control:
         self.title.set_properties(x=self.x+100, y=self.y+5)
 
         for i in range(len(self.in_ports)):
-            self.in_ports[i].set_pos(self.x, self.y+40+20*i)
+            self.in_ports[i].set_pos(self.x, self.y+45+spacing*i)
         for i in range(len(self.out_ports)):
-            self.out_ports[i].set_pos(self.x, self.y+40+20*i)
+            self.out_ports[i].set_pos(self.x, self.y+45+spacing*i)
 
     def add_in_port(self, name):
         self.in_ports.append(InPort(name, self))
@@ -187,7 +188,7 @@ class Control:
 class Connection:
     def __init__(self, portIn, portOut, root):
         self.portIn  = portIn
-        self.portOut = portOut
+        self.portOut = portOut       
 
         self.path = goocanvas.Path(parent=root,
                                    line_width=2, stroke_color="black")
@@ -211,12 +212,29 @@ class InputCfg:
         gtk.main_quit()
 
     def motion(self, item, event):
-        self.connection1.layout() # FIXME: Fugly
-        self.connection2.layout() # FIXME: Fugly
-        self.connection3.layout() # FIXME: Fugly
+        for i in self.connections:
+            i.layout()
+
+    def drag_start(self, port):
+        print port, self.start_port
+        if self.start_port:
+            if (isinstance(port, InPort) and isinstance(self.start_port, InPort)) or \
+                    (isinstance(port, OutPort) and isinstance(self.start_port, OutPort)):
+                print "can't connect ports of the same type"
+                self.start_port = None
+            elif port.control == self.start_port.control:
+                print "Can't connect ports of the same control"
+                self.start_port = None
+            else:
+                self.connections.append(Connection(self.start_port, port, self.root))
+                self.start_port = None
+        else:
+            self.start_port = port
 
     def __init__(self):
         self.drag = False
+        self.start_port = None
+        self.connections = []
 
         # create a new window
         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
@@ -235,11 +253,18 @@ class InputCfg:
 
         self.window.show()
 
-        root = self.canvas.get_root_item()
+        self.root = self.canvas.get_root_item()
 
         self.canvas.connect("motion-notify-event", self.motion)
 
-        self.control1 = Control("EvDev", root)
+        self.control3 = Control("Xbox360 Gamepad", self.root)
+        self.control3.add_in_port("btn0")
+        self.control3.add_in_port("btn1")
+        self.control3.add_out_port("abs5")
+        self.control3.add_out_port("abs6")
+        self.control3.set_pos(10, 300)
+
+        self.control1 = Control("EvDev", self.root)
         self.control1.add_out_port("abs1")
         self.control1.add_out_port("abs2")
         self.control1.add_out_port("abs3")
@@ -248,32 +273,13 @@ class InputCfg:
         self.control1.add_out_port("abs6")
         self.control1.set_pos(10, 10)
 
-        self.control2 = Control("UInput", root)
+        self.control2 = Control("UInput", self.root)
         self.control2.add_in_port("btn0")
         self.control2.add_in_port("btn1")
         self.control2.add_in_port("btn2")
         self.control2.add_out_port("abs5")
         self.control2.add_out_port("abs6")
-        self.control2.set_pos(250, 10)
-
-
-        self.control3 = Control("Xbox360 Gamepad", root)
-        self.control3.add_in_port("btn0")
-        self.control3.add_in_port("btn1")
-        self.control3.add_out_port("abs5")
-        self.control3.add_out_port("abs6")
-        self.control3.set_pos(10, 200)
-
-        self.connection1 = Connection(self.control1.out_ports[0],
-                                     self.control2.in_ports[0],
-                                     root)
-        self.connection2 = Connection(self.control1.out_ports[4],
-                                     self.control2.in_ports[1],
-                                     root)
-        self.connection3 = Connection(self.control3.out_ports[1],
-                                      self.control2.in_ports[2],
-                                      root)
-
+        self.control2.set_pos(300, 10)
 
     def main(self):
         gtk.main()