From 116a1589a6b49734f05e5ffdcbe6507470c0da12 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Wed, 5 Oct 2016 15:44:17 +1100 Subject: Added logo, made find/replace/about windows attention grabbing --- adapad.gpr | 2 +- logo.png | Bin 0 -> 6740 bytes src/editor_windows.adb | 24 ++++++ src/editor_windows.ads | 1 + src/fltk_binding/c_fl_image.cpp | 33 ++++++++ src/fltk_binding/c_fl_image.h | 20 +++++ src/fltk_binding/c_fl_png_image.cpp | 16 ++++ src/fltk_binding/c_fl_png_image.h | 15 ++++ src/fltk_binding/c_fl_widget.cpp | 6 ++ src/fltk_binding/c_fl_widget.h | 1 + src/fltk_binding/c_fl_window.cpp | 16 ++++ src/fltk_binding/c_fl_window.h | 3 + src/fltk_binding/fltk-images-rgb-png.adb | 49 ++++++++++++ src/fltk_binding/fltk-images-rgb-png.ads | 25 ++++++ src/fltk_binding/fltk-images-rgb.adb | 14 ++++ src/fltk_binding/fltk-images-rgb.ads | 20 +++++ src/fltk_binding/fltk-images.adb | 96 +++++++++++++++++++++++ src/fltk_binding/fltk-images.ads | 30 +++++++ src/fltk_binding/fltk-widgets-groups-windows.adb | 43 ++++++++++ src/fltk_binding/fltk-widgets-groups-windows.ads | 16 ++++ src/fltk_binding/fltk-widgets.adb | 28 +++++++ src/fltk_binding/fltk-widgets.ads | 15 +++- 22 files changed, 471 insertions(+), 2 deletions(-) create mode 100644 logo.png create mode 100644 src/fltk_binding/c_fl_image.cpp create mode 100644 src/fltk_binding/c_fl_image.h create mode 100644 src/fltk_binding/c_fl_png_image.cpp create mode 100644 src/fltk_binding/c_fl_png_image.h create mode 100644 src/fltk_binding/fltk-images-rgb-png.adb create mode 100644 src/fltk_binding/fltk-images-rgb-png.ads create mode 100644 src/fltk_binding/fltk-images-rgb.adb create mode 100644 src/fltk_binding/fltk-images-rgb.ads create mode 100644 src/fltk_binding/fltk-images.adb create mode 100644 src/fltk_binding/fltk-images.ads diff --git a/adapad.gpr b/adapad.gpr index c5128a4..71d5b60 100644 --- a/adapad.gpr +++ b/adapad.gpr @@ -29,7 +29,7 @@ project AdaPad is package Linker is -- should this be filed under C++ somehow? - for Default_Switches("Ada") use ("-lfltk"); + for Default_Switches("Ada") use ("-lfltk", "-lfltk_images"); end Linker; diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..48b65ec Binary files /dev/null and b/logo.png differ diff --git a/src/editor_windows.adb b/src/editor_windows.adb index 20ccbbd..0f013bc 100644 --- a/src/editor_windows.adb +++ b/src/editor_windows.adb @@ -8,11 +8,18 @@ with FLTK.Widgets.Groups; use FLTK.Widgets.Groups; with FLTK.Widgets.Groups.Windows; use FLTK.Widgets.Groups.Windows; +with FLTK.Images.RGB.PNG; +use FLTK.Images.RGB.PNG; package body Editor_Windows is + Logo : PNG_Image := Create ("logo.png"); + + + + -- Editor_Window functions and procedures function Create @@ -47,6 +54,7 @@ package body Editor_Windows is This.Editor.Set_Text_Font (Courier); This.Set_Resizable (This.Editor); This.Set_Size_Range (Min_Editor_Width, Min_Editor_Height); + This.Set_Icon (Logo); end return; end Create; @@ -203,6 +211,10 @@ package body Editor_Windows is My_Width : Integer := 350; My_Height : Integer := 250; + Logo_Line : Integer := 30; + Logo_Width : Integer := 50; + Logo_Height : Integer := 50; + Button_Width : Integer := 140; Button_Height : Integer := 40; @@ -221,6 +233,9 @@ package body Editor_Windows is return This : About_Window := (Double_Window'(Create (0, 0, My_Width, My_Height, "About Adapad")) with + Picture => Box'(Create + ((My_Width - Logo_Width) / 2, + Logo_Line, Logo_Width, Logo_Height, "")), Heading => Box'(Create (0, Heading_Line, My_Width, Heading_Size, Heading_Text)), Blurb => Box'(Create @@ -231,13 +246,18 @@ package body Editor_Windows is ((My_Width - Button_Width) / 2, Button_Line, Button_Width, Button_Height, "Close"))) do + This.Add (This.Picture); + This.Picture.Set_Image (Logo); This.Add (This.Heading); This.Heading.Set_Label_Size (Font_Size (Heading_Size)); This.Add (This.Blurb); This.Add (This.Author); This.Add (This.Dismiss); This.Dismiss.Set_Callback (Hide_CB'Access); + This.Set_Callback (Hide_CB'Access); + This.Set_Icon (Logo); + This.Set_Modal; end return; end Create; @@ -333,6 +353,8 @@ package body Editor_Windows is This.Start.Set_Callback (Find_M'Access); This.Set_Callback (Hide_CB'Access); + This.Set_Icon (Logo); + This.Set_Modal; end return; end Create; @@ -451,6 +473,8 @@ package body Editor_Windows is This.Start.Set_Callback (Replace_M'Access); This.Set_Callback (Hide_CB'Access); + This.Set_Icon (Logo); + This.Set_Modal; end return; end Create; diff --git a/src/editor_windows.ads b/src/editor_windows.ads index b6c6a00..7e6d42c 100644 --- a/src/editor_windows.ads +++ b/src/editor_windows.ads @@ -173,6 +173,7 @@ private type About_Window is new Double_Window with record + Picture : Box; Heading : Box; Blurb : Box; Author : Box; diff --git a/src/fltk_binding/c_fl_image.cpp b/src/fltk_binding/c_fl_image.cpp new file mode 100644 index 0000000..8222392 --- /dev/null +++ b/src/fltk_binding/c_fl_image.cpp @@ -0,0 +1,33 @@ + + +#include +#include "c_fl_image.h" + + +IMAGE new_fl_image(int w, int h, int d) { + Fl_Image *i = new Fl_Image(w, h, d); + return i; +} + + +void free_fl_image(IMAGE i) { + delete reinterpret_cast(i); +} + + + + +int fl_image_w(IMAGE i) { + return reinterpret_cast(i)->w(); +} + + +int fl_image_h(IMAGE i) { + return reinterpret_cast(i)->h(); +} + + +int fl_image_d(IMAGE i) { + return reinterpret_cast(i)->d(); +} + diff --git a/src/fltk_binding/c_fl_image.h b/src/fltk_binding/c_fl_image.h new file mode 100644 index 0000000..a4be6df --- /dev/null +++ b/src/fltk_binding/c_fl_image.h @@ -0,0 +1,20 @@ + + +#ifndef FL_IMAGE_GUARD +#define FL_IMAGE_GUARD + + +typedef void* IMAGE; + + +extern "C" IMAGE new_fl_image(int w, int h, int d); +extern "C" void free_fl_image(IMAGE i); + + +extern "C" int fl_image_w(IMAGE i); +extern "C" int fl_image_h(IMAGE i); +extern "C" int fl_image_d(IMAGE i); + + +#endif + diff --git a/src/fltk_binding/c_fl_png_image.cpp b/src/fltk_binding/c_fl_png_image.cpp new file mode 100644 index 0000000..16d5927 --- /dev/null +++ b/src/fltk_binding/c_fl_png_image.cpp @@ -0,0 +1,16 @@ + + +#include +#include "c_fl_png_image.h" + + +PNG_IMAGE new_fl_png_image(const char * f) { + Fl_PNG_Image *p = new Fl_PNG_Image(f); + return p; +} + + +void free_fl_png_image(PNG_IMAGE p) { + delete reinterpret_cast(p); +} + diff --git a/src/fltk_binding/c_fl_png_image.h b/src/fltk_binding/c_fl_png_image.h new file mode 100644 index 0000000..a67a5aa --- /dev/null +++ b/src/fltk_binding/c_fl_png_image.h @@ -0,0 +1,15 @@ + + +#ifndef FL_PNG_IMAGE_GUARD +#define FL_PNG_IMAGE_GUARD + + +typedef void* PNG_IMAGE; + + +extern "C" PNG_IMAGE new_fl_png_image(const char * f); +extern "C" void free_fl_png_image(PNG_IMAGE p); + + +#endif + diff --git a/src/fltk_binding/c_fl_widget.cpp b/src/fltk_binding/c_fl_widget.cpp index 9dea7ee..30c4de3 100644 --- a/src/fltk_binding/c_fl_widget.cpp +++ b/src/fltk_binding/c_fl_widget.cpp @@ -1,6 +1,7 @@ #include +#include #include "c_fl_widget.h" @@ -111,3 +112,8 @@ void fl_widget_position(WIDGET w, int x, int y) { reinterpret_cast(w)->position(x, y); } + +void fl_widget_set_image(WIDGET w, void * img) { + reinterpret_cast(w)->image(reinterpret_cast(img)); +} + diff --git a/src/fltk_binding/c_fl_widget.h b/src/fltk_binding/c_fl_widget.h index a9379f6..3c20dc2 100644 --- a/src/fltk_binding/c_fl_widget.h +++ b/src/fltk_binding/c_fl_widget.h @@ -33,6 +33,7 @@ extern "C" int fl_widget_get_w(WIDGET w); extern "C" int fl_widget_get_h(WIDGET w); extern "C" void fl_widget_size(WIDGET w, int d, int h); extern "C" void fl_widget_position(WIDGET w, int x, int y); +extern "C" void fl_widget_set_image(WIDGET w, void * img); #endif diff --git a/src/fltk_binding/c_fl_window.cpp b/src/fltk_binding/c_fl_window.cpp index 9c8dbc6..fbce39b 100644 --- a/src/fltk_binding/c_fl_window.cpp +++ b/src/fltk_binding/c_fl_window.cpp @@ -1,6 +1,7 @@ #include +#include #include "c_fl_window.h" @@ -40,3 +41,18 @@ void fl_window_size_range(WINDOW n, int lw, int lh, int hw, int hh, int dw, int reinterpret_cast(n)->size_range(lw, lh, hw, hh, dw, dh, a); } + +void fl_window_set_icon(WINDOW n, void * img) { + reinterpret_cast(n)->icon(reinterpret_cast(img)); +} + + +void fl_window_set_modal(WINDOW n) { + reinterpret_cast(n)->set_modal(); +} + + +void fl_window_set_non_modal(WINDOW n) { + reinterpret_cast(n)->set_non_modal(); +} + diff --git a/src/fltk_binding/c_fl_window.h b/src/fltk_binding/c_fl_window.h index 526811a..c382919 100644 --- a/src/fltk_binding/c_fl_window.h +++ b/src/fltk_binding/c_fl_window.h @@ -15,6 +15,9 @@ extern "C" void fl_window_show(WINDOW n); extern "C" void fl_window_hide(WINDOW n); extern "C" void fl_window_set_label(WINDOW n, char* text); extern "C" void fl_window_size_range(WINDOW n, int lw, int lh, int hw, int hh, int dw, int dh, int a); +extern "C" void fl_window_set_icon(WINDOW n, void * img); +extern "C" void fl_window_set_modal(WINDOW n); +extern "C" void fl_window_set_non_modal(WINDOW n); #endif diff --git a/src/fltk_binding/fltk-images-rgb-png.adb b/src/fltk_binding/fltk-images-rgb-png.adb new file mode 100644 index 0000000..ecb2f5e --- /dev/null +++ b/src/fltk_binding/fltk-images-rgb-png.adb @@ -0,0 +1,49 @@ + + +with Interfaces.C; +with System; +use type System.Address; + + +package body FLTK.Images.RGB.PNG is + + + function new_fl_png_image + (F : in Interfaces.C.char_array) + return System.Address; + pragma Import (C, new_fl_png_image, "new_fl_png_image"); + + procedure free_fl_png_image + (P : in System.Address); + pragma Import (C, free_fl_png_image, "free_fl_png_image"); + + + + + overriding procedure Finalize + (This : in out PNG_Image) is + begin + Finalize (RGB_Image (This)); + if This.Void_Ptr /= System.Null_Address then + if This in PNG_Image then + free_fl_png_image (This.Void_Ptr); + end if; + end if; + end Finalize; + + + + + function Create + (Filename : in String) + return PNG_Image is + begin + return This : PNG_Image do + This.Void_Ptr := new_fl_png_image + (Interfaces.C.To_C (Filename)); + end return; + end Create; + + +end FLTK.Images.RGB.PNG; + diff --git a/src/fltk_binding/fltk-images-rgb-png.ads b/src/fltk_binding/fltk-images-rgb-png.ads new file mode 100644 index 0000000..0b44cb0 --- /dev/null +++ b/src/fltk_binding/fltk-images-rgb-png.ads @@ -0,0 +1,25 @@ + + +package FLTK.Images.RGB.PNG is + + + type PNG_Image is new RGB_Image with private; + + + function Create + (Filename : in String) + return PNG_Image; + + +private + + + type PNG_Image is new RGB_Image with null record; + + + overriding procedure Finalize + (This : in out PNG_Image); + + +end FLTK.Images.RGB.PNG; + diff --git a/src/fltk_binding/fltk-images-rgb.adb b/src/fltk_binding/fltk-images-rgb.adb new file mode 100644 index 0000000..3556f74 --- /dev/null +++ b/src/fltk_binding/fltk-images-rgb.adb @@ -0,0 +1,14 @@ + + +package body FLTK.Images.RGB is + + + overriding procedure Finalize + (This : in out RGB_Image) is + begin + Finalize (Image (This)); + end Finalize; + + +end FLTK.Images.RGB; + diff --git a/src/fltk_binding/fltk-images-rgb.ads b/src/fltk_binding/fltk-images-rgb.ads new file mode 100644 index 0000000..ba47793 --- /dev/null +++ b/src/fltk_binding/fltk-images-rgb.ads @@ -0,0 +1,20 @@ + + +package FLTK.Images.RGB is + + + type RGB_Image is new Image with private; + + +private + + + type RGB_Image is new Image with null record; + + + overriding procedure Finalize + (This : in out RGB_Image); + + +end FLTK.Images.RGB; + diff --git a/src/fltk_binding/fltk-images.adb b/src/fltk_binding/fltk-images.adb new file mode 100644 index 0000000..bbd87c9 --- /dev/null +++ b/src/fltk_binding/fltk-images.adb @@ -0,0 +1,96 @@ + + +with Interfaces.C; +with System; +use type System.Address; + + +package body FLTK.Images is + + + function new_fl_image + (W, H, D : in Interfaces.C.int) + return System.Address; + pragma Import (C, new_fl_image, "new_fl_image"); + + procedure free_fl_image + (I : in System.Address); + pragma Import (C, free_fl_image, "free_fl_image"); + + function fl_image_w + (I : in System.Address) + return Interfaces.C.int; + pragma Import (C, fl_image_w, "fl_image_w"); + + function fl_image_h + (I : in System.Address) + return Interfaces.C.int; + pragma Import (C, fl_image_h, "fl_image_h"); + + function fl_image_d + (I : in System.Address) + return Interfaces.C.int; + pragma Import (C, fl_image_d, "fl_image_d"); + + + + + overriding procedure Finalize + (This : in out Image) is + begin + Finalize (Wrapper (This)); + if This.Void_Ptr /= System.Null_Address then + if This in Image then + free_fl_image (This.Void_Ptr); + end if; + end if; + end Finalize; + + + + + function Create + (Width, Height, Depth : in Natural) + return Image is + begin + return This : Image do + This.Void_Ptr := new_fl_image + (Interfaces.C.int (Width), + Interfaces.C.int (Height), + Interfaces.C.int (Depth)); + end return; + end Create; + + + + + function Get_W + (This : in Image) + return Natural is + begin + return Natural (fl_image_w (This.Void_Ptr)); + end Get_W; + + + + + function Get_H + (This : in Image) + return Natural is + begin + return Natural (fl_image_h (This.Void_Ptr)); + end Get_H; + + + + + function Get_D + (This : in Image) + return Natural is + begin + return Natural (fl_image_d (This.Void_Ptr)); + end Get_D; + + +end FLTK.Images; + diff --git a/src/fltk_binding/fltk-images.ads b/src/fltk_binding/fltk-images.ads new file mode 100644 index 0000000..88d7658 --- /dev/null +++ b/src/fltk_binding/fltk-images.ads @@ -0,0 +1,30 @@ + + +package FLTK.Images is + + + type Image is new Wrapper with private; + + + function Create + (Width, Height, Depth : in Natural) + return Image; + + + function Get_W (This : in Image) return Natural; + function Get_H (This : in Image) return Natural; + function Get_D (This : in Image) return Natural; + + +private + + + type Image is new Wrapper with null record; + + + overriding procedure Finalize + (This : in out Image); + + +end FLTK.Images; + diff --git a/src/fltk_binding/fltk-widgets-groups-windows.adb b/src/fltk_binding/fltk-widgets-groups-windows.adb index a0262e1..2d93bdd 100644 --- a/src/fltk_binding/fltk-widgets-groups-windows.adb +++ b/src/fltk_binding/fltk-widgets-groups-windows.adb @@ -2,6 +2,7 @@ with Interfaces.C; with System; +with FLTK.Images.RGB; use type System.Address; @@ -41,6 +42,18 @@ package body FLTK.Widgets.Groups.Windows is LW, LH, HW, HH, DW, DH, A : in Interfaces.C.int); pragma Import (C, fl_window_size_range, "fl_window_size_range"); + procedure fl_window_set_icon + (W, P : in System.Address); + pragma Import (C, fl_window_set_icon, "fl_window_set_icon"); + + procedure fl_window_set_modal + (W : in System.Address); + pragma Import (C, fl_window_set_modal, "fl_window_set_modal"); + + procedure fl_window_set_non_modal + (W : in System.Address); + pragma Import (C, fl_window_set_non_modal, "fl_window_set_non_modal"); + @@ -144,5 +157,35 @@ package body FLTK.Widgets.Groups.Windows is end Set_Size_Range; + + + procedure Set_Icon + (This : in out Window; + Pic : in out FLTK.Images.RGB.RGB_Image'Class) is + begin + fl_window_set_icon + (This.Void_Ptr, + Wrapper (Pic).Void_Ptr); + end Set_Icon; + + + + + procedure Set_Modal + (This : in out Window) is + begin + fl_window_set_modal (This.Void_Ptr); + end Set_Modal; + + + + + procedure Set_Non_Modal + (This : in out Window) is + begin + fl_window_set_non_modal (This.Void_Ptr); + end Set_Non_Modal; + + end FLTK.Widgets.Groups.Windows; diff --git a/src/fltk_binding/fltk-widgets-groups-windows.ads b/src/fltk_binding/fltk-widgets-groups-windows.ads index 2213563..96047ee 100644 --- a/src/fltk_binding/fltk-widgets-groups-windows.ads +++ b/src/fltk_binding/fltk-widgets-groups-windows.ads @@ -1,5 +1,8 @@ +with FLTK.Images.RGB; + + package FLTK.Widgets.Groups.Windows is @@ -37,6 +40,19 @@ package FLTK.Widgets.Groups.Windows is Keep_Aspect : in Boolean := False); + procedure Set_Icon + (This : in out Window; + Pic : in out FLTK.Images.RGB.RGB_Image'Class); + + + procedure Set_Modal + (This : in out Window); + + + procedure Set_Non_Modal + (This : in out Window); + + private diff --git a/src/fltk_binding/fltk-widgets.adb b/src/fltk_binding/fltk-widgets.adb index 0a159c7..c6ab5c0 100644 --- a/src/fltk_binding/fltk-widgets.adb +++ b/src/fltk_binding/fltk-widgets.adb @@ -5,6 +5,7 @@ with Interfaces.C.Strings; with System; with System.Address_To_Access_Conversions; with FLTK.Widgets.Groups; use FLTK.Widgets.Groups; +with FLTK.Images; use type System.Address; @@ -105,6 +106,10 @@ package body FLTK.Widgets is X, Y : in Interfaces.C.int); pragma Import (C, fl_widget_position, "fl_widget_position"); + procedure fl_widget_set_image + (W, I : in System.Address); + pragma Import (C, fl_widget_set_image, "fl_widget_set_image"); + @@ -319,5 +324,28 @@ package body FLTK.Widgets is end Reposition; + + + function Get_Image + (This : in Widget) + return access FLTK.Images.Image'Class is + begin + return This.Current_Image; + end Get_Image; + + + + + procedure Set_Image + (This : in out Widget; + Pic : in out FLTK.Images.Image'Class) is + begin + This.Current_Image := Pic'Unchecked_Access; + fl_widget_set_image + (This.Void_Ptr, + Wrapper (Pic).Void_Ptr); + end Set_Image; + + end FLTK.Widgets; diff --git a/src/fltk_binding/fltk-widgets.ads b/src/fltk_binding/fltk-widgets.ads index 05bba29..e692a65 100644 --- a/src/fltk_binding/fltk-widgets.ads +++ b/src/fltk_binding/fltk-widgets.ads @@ -1,6 +1,7 @@ with FLTK.Enums; use FLTK.Enums; +with FLTK.Images; limited with FLTK.Widgets.Groups; private with System; private with System.Address_To_Access_Conversions; @@ -98,12 +99,24 @@ package FLTK.Widgets is procedure Resize (This : in out Widget; W, H : in Integer); procedure Reposition (This : in out Widget; X, Y : in Integer); + + function Get_Image + (This : in Widget) + return access FLTK.Images.Image'Class; + + + procedure Set_Image + (This : in out Widget; + Pic : in out FLTK.Images.Image'Class); + + private type Widget is abstract new Wrapper with record - Callback : access Widget_Callback'Class; + Callback : access Widget_Callback'Class; + Current_Image : access FLTK.Images.Image'Class; end record; -- cgit