ecere/gui/Window: Fixed support for changing active WindowController
authorJerome St-Louis <jerome@ecere.com>
Thu, 16 Apr 2015 18:14:05 +0000 (14:14 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 15 Oct 2015 00:19:41 +0000 (20:19 -0400)
- Note: 'window' member should no longer be set

ecere/src/gui/Window.ec
samples/guiAndGfx/bitmapsAndKB/KBController/controller.ec

index 6572e81..68e4f79 100644 (file)
@@ -9780,7 +9780,22 @@ private:
    property subclass(DisplayDriver) _displayDriver  { get { return !formDesigner ? dispDriver : null; } }
 
    WindowController controller;
-   public property WindowController controller { get { return controller; } set { delete controller; controller = value; if(controller) incref controller; } }
+   public property WindowController controller
+   {
+      get { return controller; }
+      set
+      {
+         if(controller)
+            controller.setWindow(null);
+         delete controller;
+         controller = value;
+         if(controller)
+         {
+            incref controller;
+            controller.setWindow(this);
+         }
+      }
+   }
 };
 
 public class CommonControl : Window
@@ -9969,7 +9984,7 @@ class WindowControllerInterface : ControllableWindow
 
    bool OnMouseMove(int x, int y, Modifiers mods)
    {
-      bool result = ((bool(*)(Window, WindowController, int, int, Modifiers))(void *)controller.OnMouseMove)((Window)controller.controlled, controller, x, y, mods);
+      bool result = controller.OnMouseMove ? ((bool(*)(Window, WindowController, int, int, Modifiers))(void *)controller.OnMouseMove)((Window)controller.controlled, controller, x, y, mods) : true;
       if(result)
       {
          bool(* onMouseMove)(Window, int, int, Modifiers) = (void *)controller.windowVTbl[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnMouseMove];
@@ -10147,37 +10162,41 @@ class WindowControllerInterface : ControllableWindow
 
 public class WindowController<class V>
 {
-public:
-   property Window window
+   void setWindow(Window value)
    {
-      set
+      uint size = class(Window).vTblSize;
+      if(value)
       {
-         uint size = class(Window).vTblSize;
-         if(value)
+         delete windowVTbl;
+         windowVTbl = new void *[size];
+         memcpy(windowVTbl, value._vTbl, size * sizeof(void *));
+         if(value._vTbl == value._class._vTbl)
          {
-            windowVTbl = new void *[size];
-            memcpy(windowVTbl, value._vTbl, size * sizeof(void *));
-            if(value._vTbl == value._class._vTbl)
-            {
-               value._vTbl = new void *[value._class.vTblSize];
-               memcpy(value._vTbl + size, value._class._vTbl + size, (value._class.vTblSize - size) * sizeof(void *));
-            }
+            value._vTbl = new void *[value._class.vTblSize];
+            memcpy(value._vTbl + size, value._class._vTbl + size, (value._class.vTblSize - size) * sizeof(void *));
+         }
+         {
+            int c;
+            for(c = 0; c < size; c++)
             {
-               int c;
-               for(c = 0; c < size; c++)
-               {
-                  void * function = class(WindowControllerInterface)._vTbl[c];
-                  if(function && function != DefaultFunction)
-                     value._vTbl[c] = function;
-                  else
-                     value._vTbl[c] = windowVTbl[c];
-               }
+               void * function = class(WindowControllerInterface)._vTbl[c];
+               if(function && function != DefaultFunction)
+                  value._vTbl[c] = function;
+               else
+                  value._vTbl[c] = windowVTbl[c];
             }
          }
-         else
-            memcpy(value._vTbl, windowVTbl, class(Window).vTblSize * sizeof(void *));
-         window = value;
       }
+      else if(window)
+      {
+         memcpy(window._vTbl, windowVTbl, class(Window).vTblSize * sizeof(void *));
+         delete windowVTbl;
+      }
+      window = value;
+   }
+public:
+   property Window window
+   {
       get { return window; }
    }
    property V controlled
@@ -10205,7 +10224,7 @@ public:
    virtual void V::OnUnloadGraphics(WindowController controller);
 
 private:
-   int (** windowVTbl)();
+   public int (** windowVTbl)();
    V controlled;
    Window window;
 
index 44604e6..495cddd 100644 (file)
@@ -90,7 +90,7 @@ class MainWindow : Window
    hasClose = true;
    size = { 576, 432 };
 
-   controller = WorldObjectController { this };
+   controller = WorldObjectController { };
 
    bool OnCreate()
    {