]> git.jsancho.org Git - guile-irrlicht.git/commitdiff
Cast to the proper wrapped object when a gui event is raised
authorJavier Sancho <jsf@jsancho.org>
Mon, 25 May 2020 07:26:17 +0000 (09:26 +0200)
committerJavier Sancho <jsf@jsancho.org>
Mon, 25 May 2020 07:26:17 +0000 (09:26 +0200)
irrlicht/foreign.scm
irrlicht/gui.scm
irrlicht/irr.scm
src/gui-element.cpp

index 9b55633accaf17ad17cdd39077f3cf93896032e9..96cec83bd0dd04c9dfca6a5c5c5757cf07992337 100644 (file)
@@ -22,7 +22,9 @@
   #:use-module (system foreign)
   #:use-module (irrlicht base)
   #:export (get-irrlicht-proc
-            null-object?))
+            null-object?
+            remember-wrapped
+            mem-wrapped))
 
 ;; We use a hash table to store foreign irrlicht methods related with their
 ;; classes
            proc))))
 
 (define (null-object? object)
-  (eq? (irr-pointer object) %null-pointer))
+  (null-pointer? (irr-pointer object)))
+
+;; Table for storing foreign irrlicht wrapped objects by its pointer address
+;; We can recover them later, when we have an address without knowing its type, like in
+;; events case
+(define wrapped-obj-table (make-hash-table))
+
+(define (remember-wrapped object)
+  (or (hash-ref wrapped-obj-table
+                (pointer-address (irr-pointer object)))
+      object))
+
+(define (mem-wrapped object)
+  (hash-set! wrapped-obj-table
+             (pointer-address (irr-pointer object))
+             object)
+  object)
index d7dd335653cb06413035e1b6a15b993681d78cec..597032a7f89dd4da2f0382a6a5e8922ec2e39a08 100644 (file)
          (id -1)
          (text "")
          (tooltiptext ""))
-    (let ((addButton (get-irrlicht-proc "addButton" gui-environment parent)))
-      (addButton gui-environment rectangle parent id text tooltiptext))))
+    (let* ((addButton (get-irrlicht-proc "addButton" gui-environment parent))
+           (button (addButton gui-environment rectangle parent id text tooltiptext)))
+      (mem-wrapped button))))
 
 (define-method (add-editbox! (gui-environment <gui-environment>) text rectangle . rest)
   (let-keywords rest #f
         ((border #t)
          (parent (make <gui-element>))
          (id -1))
-    (let ((addEditBox (get-irrlicht-proc "addEditBox" gui-environment parent)))
-      (addEditBox gui-environment text rectangle border parent id))))
+    (let* ((addEditBox (get-irrlicht-proc "addEditBox" gui-environment parent))
+           (editbox (addEditBox gui-environment text rectangle border parent id)))
+      (mem-wrapped editbox))))
 
 (define-method (add-image! (gui-environment <gui-environment>) image pos . rest)
   (let-keywords rest #f
          (parent (make <gui-element>))
          (id -1)
          (text ""))
-    (let ((addImage (get-irrlicht-proc "addImage" gui-environment parent)))
-      (addImage gui-environment image pos use-alpha-channel parent id text))))
+    (let* ((addImage (get-irrlicht-proc "addImage" gui-environment parent))
+           (img (addImage gui-environment image pos use-alpha-channel parent id text)))
+      (mem-wrapped img))))
 
 (define-method (add-listbox! (gui-environment <gui-environment>) rectangle . rest)
   (let-keywords rest #f
         ((parent (make <gui-element>))
          (id -1)
          (draw-background #f))
-    (let ((addListBox (get-irrlicht-proc "addListBox" gui-environment parent)))
-      (addListBox gui-environment rectangle parent id draw-background))))
+    (let* ((addListBox (get-irrlicht-proc "addListBox" gui-environment parent))
+           (listbox (addListBox gui-environment rectangle parent id draw-background)))
+      (mem-wrapped listbox))))
 
 (define-method (add-scrollbar! (gui-environment <gui-environment>) horizontal rectangle . rest)
   (let-keywords rest #f
         ((parent (make <gui-element>))
          (id -1))
-    (let ((addScrollBar (get-irrlicht-proc "addScrollBar" gui-environment parent)))
-      (addScrollBar gui-environment horizontal rectangle parent id))))
+    (let* ((addScrollBar (get-irrlicht-proc "addScrollBar" gui-environment parent))
+           (scrollbar (addScrollBar gui-environment horizontal rectangle parent id)))
+      (mem-wrapped scrollbar))))
 
 (define-method (add-static-text! (gui-environment <gui-environment>) text rectangle . rest)
   (let-keywords rest #f
          (parent (make <gui-element>))
          (id -1)
          (fill-background #f))
-    (let ((addStaticText (get-irrlicht-proc "addStaticText" gui-environment parent)))
-      (addStaticText gui-environment text rectangle border word-wrap parent
-                     id fill-background))))
+    (let* ((addStaticText (get-irrlicht-proc "addStaticText" gui-environment parent))
+           (static-text (addStaticText gui-environment text rectangle border word-wrap parent
+                                       id fill-background)))
+      (mem-wrapped static-text))))
 
 (define-method (draw-all (gui-environment <gui-environment>))
   ((get-irrlicht-proc "drawAll" gui-environment)
index 2a1f78849707df5fe4d9f8a4b3d9b2b9f01c35da..f220cdf094b3df50a6946cc2ddbddd4075499fca 100644 (file)
@@ -41,7 +41,7 @@
 
 (define-method (get-event-gui-caller (event <event>))
   (let ((SGUIEvent_Caller (get-irrlicht-proc "SGUIEvent_Caller" event)))
-    (SGUIEvent_Caller event)))
+    (remember-wrapped (SGUIEvent_Caller event))))
 
 (define-method (get-event-gui-type (event <event>))
   (let ((SGUIEvent_EventType (get-irrlicht-proc "SGUIEvent_EventType" event)))
index 39d3a414e9db798534a5eba7a03267eaf20bd2a4..6ee3dccc3dd395434ee5c51b0e78d7dd92cb0574 100644 (file)
 
 using namespace irr;
 
+template <typename T>
 SCM
 IGUIElement_getID (SCM gui_element)
 {
-  gui::IGUIElement* element = (gui::IGUIElement*) scm_to_irr_pointer (gui_element);
+  T element = (T) scm_to_irr_pointer (gui_element);
   return scm_from_int32 (element->getID ());
 }
 
 void
 init_gui_element (void)
 {
-  DEFINE_GSUBR ("IGUIElement_getID", 1, 0, 0, IGUIElement_getID);
+  DEFINE_GSUBR ("IGUIButton_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIButton*>);
+  DEFINE_GSUBR ("IGUIEditBox_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIEditBox*>);
+  DEFINE_GSUBR ("IGUIElement_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIElement*>);
+  DEFINE_GSUBR ("IGUIImage_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIImage*>);
+  DEFINE_GSUBR ("IGUIListBox_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIListBox*>);
+  DEFINE_GSUBR ("IGUIScrollBar_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIScrollBar*>);
+  DEFINE_GSUBR ("IGUIStaticText_getID", 1, 0, 0, IGUIElement_getID<gui::IGUIStaticText*>);
 }