From 5f91a787afcebae37b5e22ab0dfe93b2a9794226 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sat, 6 May 2017 14:06:32 +1000 Subject: Draw method overriding implemented for Widgets, fixed for Menus, still needs cleaning up --- src/c_fl_menu.cpp | 2 +- src/c_fl_widget.cpp | 94 ++++++++++++++++++++++++++++++++++++++++------------ src/c_fl_widget.h | 8 +++++ src/fltk-widgets.adb | 77 ++++++++++++++++++++++++++++++++++++++++++ src/fltk-widgets.ads | 14 ++++++-- 5 files changed, 170 insertions(+), 25 deletions(-) diff --git a/src/c_fl_menu.cpp b/src/c_fl_menu.cpp index 630e63f..c9fb6d3 100644 --- a/src/c_fl_menu.cpp +++ b/src/c_fl_menu.cpp @@ -29,7 +29,7 @@ void My_Menu::draw() { void My_Menu::real_draw() { - Fl_Menu_::draw(); + //Fl_Menu_::draw(); } diff --git a/src/c_fl_widget.cpp b/src/c_fl_widget.cpp index 30c4de3..4e9f2fb 100644 --- a/src/c_fl_widget.cpp +++ b/src/c_fl_widget.cpp @@ -5,115 +5,167 @@ #include "c_fl_widget.h" +typedef void (hook)(void*); +typedef hook* hook_p; + + + + +class My_Widget : public Fl_Widget { + public: + using Fl_Widget::Fl_Widget; + friend void widget_set_draw_hook(WIDGET w, void * d); + friend void fl_widget_draw(WIDGET w); + friend WIDGET new_fl_widget(int x, int y, int w, int h, char* label); + protected: + void draw(); + void real_draw(); + hook_p draw_hook; +}; + + +void My_Widget::draw() { + (*draw_hook)(this->user_data()); +} + + +void My_Widget::real_draw() { + //Fl_Widget::draw(); +} + + +void widget_set_draw_hook(WIDGET w, void * d) { + reinterpret_cast(w)->draw_hook = reinterpret_cast(d); +} + + +void fl_widget_draw(WIDGET w) { + reinterpret_cast(w)->real_draw(); +} + + + + +WIDGET new_fl_widget(int x, int y, int w, int h, char* label) { + My_Widget *wd = new My_Widget(x, y, w, h, label); + return wd; +} + + +void free_fl_widget(WIDGET w) { + delete reinterpret_cast(w); +} + + void * fl_widget_get_user_data(WIDGET w) { - return reinterpret_cast(w)->user_data(); + return reinterpret_cast(w)->user_data(); } void fl_widget_set_user_data(WIDGET w, void * d) { - reinterpret_cast(w)->user_data(d); + reinterpret_cast(w)->user_data(d); } int fl_widget_get_box(WIDGET w) { - return reinterpret_cast(w)->box(); + return reinterpret_cast(w)->box(); } void fl_widget_set_box(WIDGET w, int b) { - reinterpret_cast(w)->box(static_cast(b)); + reinterpret_cast(w)->box(static_cast(b)); } const char* fl_widget_get_label(WIDGET w) { - return reinterpret_cast(w)->label(); + return reinterpret_cast(w)->label(); } void fl_widget_set_label(WIDGET w, const char* t) { - reinterpret_cast(w)->copy_label(t); + reinterpret_cast(w)->copy_label(t); } int fl_widget_get_label_font(WIDGET w) { - return reinterpret_cast(w)->labelfont(); + return reinterpret_cast(w)->labelfont(); } void fl_widget_set_label_font(WIDGET w, int f) { - reinterpret_cast(w)->labelfont(static_cast(f)); + reinterpret_cast(w)->labelfont(static_cast(f)); } int fl_widget_get_label_size(WIDGET w) { - return reinterpret_cast(w)->labelsize(); + return reinterpret_cast(w)->labelsize(); } void fl_widget_set_label_size(WIDGET w, int s) { - reinterpret_cast(w)->labelsize(static_cast(s)); + reinterpret_cast(w)->labelsize(static_cast(s)); } int fl_widget_get_label_type(WIDGET w) { - return reinterpret_cast(w)->labeltype(); + return reinterpret_cast(w)->labeltype(); } void fl_widget_set_label_type(WIDGET w, int l) { - reinterpret_cast(w)->labeltype(static_cast(l)); + reinterpret_cast(w)->labeltype(static_cast(l)); } void * fl_widget_get_parent(WIDGET w) { - return reinterpret_cast(w)->parent(); + return reinterpret_cast(w)->parent(); } void fl_widget_set_callback(WIDGET w, void * cb) { - reinterpret_cast(w)->callback(reinterpret_cast(cb)); + reinterpret_cast(w)->callback(reinterpret_cast(cb)); } int fl_widget_get_x(WIDGET w) { - return reinterpret_cast(w)->x(); + return reinterpret_cast(w)->x(); } int fl_widget_get_y(WIDGET w) { - return reinterpret_cast(w)->y(); + return reinterpret_cast(w)->y(); } int fl_widget_get_w(WIDGET w) { - return reinterpret_cast(w)->w(); + return reinterpret_cast(w)->w(); } int fl_widget_get_h(WIDGET w) { - return reinterpret_cast(w)->h(); + return reinterpret_cast(w)->h(); } void fl_widget_size(WIDGET w, int d, int h) { - reinterpret_cast(w)->size(d, h); + reinterpret_cast(w)->size(d, h); } void fl_widget_position(WIDGET w, int x, int y) { - reinterpret_cast(w)->position(x, y); + reinterpret_cast(w)->position(x, y); } void fl_widget_set_image(WIDGET w, void * img) { - reinterpret_cast(w)->image(reinterpret_cast(img)); + reinterpret_cast(w)->image(reinterpret_cast(img)); } diff --git a/src/c_fl_widget.h b/src/c_fl_widget.h index 3c20dc2..be83177 100644 --- a/src/c_fl_widget.h +++ b/src/c_fl_widget.h @@ -7,6 +7,14 @@ typedef void* WIDGET; +extern "C" void widget_set_draw_hook(WIDGET w, void * d); +extern "C" void fl_widget_draw(WIDGET w); + + +extern "C" WIDGET new_fl_widget(int x, int y, int w, int h, char* label); +extern "C" void free_fl_widget(WIDGET w); + + extern "C" void * fl_widget_get_user_data(WIDGET w); extern "C" void fl_widget_set_user_data(WIDGET w, void * d); diff --git a/src/fltk-widgets.adb b/src/fltk-widgets.adb index 9ec2350..96d7998 100644 --- a/src/fltk-widgets.adb +++ b/src/fltk-widgets.adb @@ -18,6 +18,24 @@ package body FLTK.Widgets is + procedure widget_set_draw_hook + (W, D : in System.Address); + pragma Import (C, widget_set_draw_hook, "widget_set_draw_hook"); + + procedure fl_widget_draw + (W : in System.Address); + pragma Import (C, fl_widget_draw, "fl_widget_draw"); + + function new_fl_widget + (X, Y, W, H : in Interfaces.C.int; + Text : in Interfaces.C.char_array) + return System.Address; + pragma Import (C, new_fl_widget, "new_fl_widget"); + + procedure free_fl_widget + (F : in System.Address); + pragma Import (C, free_fl_widget, "free_fl_widget"); + function fl_widget_get_box (W : in System.Address) return Interfaces.C.int; @@ -114,6 +132,65 @@ package body FLTK.Widgets is + procedure Draw_Hook (U : in System.Address); + pragma Convention (C, Draw_Hook); + + procedure Draw_Hook + (U : in System.Address) + is + Ada_Widget : access Widget'Class := + Widget_Convert.To_Pointer (U); + begin + Ada_Widget.Draw; + end Draw_Hook; + + + + + procedure Draw + (This : in out Widget) is + begin + fl_widget_draw (This.Void_Ptr); + end Draw; + + + + + procedure Finalize + (This : in out Widget) is + begin + if This.Void_Ptr /= System.Null_Address then + if This in Widget then + free_fl_widget (This.Void_Ptr); + end if; + end if; + end Finalize; + + + + + function Create + (X, Y, W, H : in Integer; + Text : in String) + return Widget is + begin + return This : Widget do + This.Void_Ptr := new_fl_widget + (Interfaces.C.int (X), + Interfaces.C.int (Y), + Interfaces.C.int (W), + Interfaces.C.int (H), + Interfaces.C.To_C (Text)); + fl_widget_set_user_data + (This.Void_Ptr, + Widget_Convert.To_Address (This'Unchecked_Access)); + widget_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); + end return; + end Create; + + + + function Parent (This : in Widget) return access FLTK.Widgets.Groups.Group'Class diff --git a/src/fltk-widgets.ads b/src/fltk-widgets.ads index d1c4b89..0ed0d2d 100644 --- a/src/fltk-widgets.ads +++ b/src/fltk-widgets.ads @@ -11,7 +11,7 @@ private with Ada.Unchecked_Conversion; package FLTK.Widgets is - type Widget is abstract new Wrapper with private; + type Widget is new Wrapper with private; type Widget_Callback is access procedure @@ -26,7 +26,7 @@ package FLTK.Widgets is function Create (X, Y, W, H : in Integer; Text : in String) - return Widget is abstract; + return Widget; function Parent @@ -132,13 +132,21 @@ package FLTK.Widgets is private - type Widget is abstract new Wrapper with + procedure Draw + (This : in out Widget); + + + type Widget is new Wrapper with record Callback : Widget_Callback; Current_Image : access FLTK.Images.Image'Class; end record; + overriding procedure Finalize + (This : in out Widget); + + package Widget_Convert is new System.Address_To_Access_Conversions (Widget'Class); -- package Callback_Convert is new System.Address_To_Access_Conversions (Widget_Callback); package Callback_Convert is -- cgit