From 1e205182f6ed6a2dcae68179aadff8c4b82b5c53 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Mon, 14 Nov 2016 12:07:00 +1100 Subject: Added Menu_Buttons to FLTK binding, added rightclick menu to Editor --- src/adapad.adb | 14 ++++- src/fltk_binding/c_fl_menu_button.cpp | 21 +++++++ src/fltk_binding/c_fl_menu_button.h | 18 ++++++ .../fltk-widgets-menus-menu_buttons.adb | 73 ++++++++++++++++++++++ .../fltk-widgets-menus-menu_buttons.ads | 35 +++++++++++ src/windows-editor.adb | 23 ++++++- src/windows-editor.ads | 9 ++- to_do.txt | 2 +- 8 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 src/fltk_binding/c_fl_menu_button.cpp create mode 100644 src/fltk_binding/c_fl_menu_button.h create mode 100644 src/fltk_binding/fltk-widgets-menus-menu_buttons.adb create mode 100644 src/fltk_binding/fltk-widgets-menus-menu_buttons.ads diff --git a/src/adapad.adb b/src/adapad.adb index e197097..dd5afd5 100644 --- a/src/adapad.adb +++ b/src/adapad.adb @@ -516,7 +516,7 @@ begin declare use FLTK.Widgets.Menus; - Bar : Menu_Cursor := Editor.Get_Menu; + Bar : Menu_Cursor := Editor.Get_Menu_Bar; begin Bar.Add (Text => "&File", Flags => Flag_Submenu); Bar.Add ("File/&New", New_CB'Access, Mod_Ctrl + 'n'); @@ -550,6 +550,18 @@ begin end; + declare + use FLTK.Widgets.Menus; + Pop : Menu_Cursor := Editor.Get_Rightclick_Menu; + begin + Pop.Add ("Cu&t", Cut_CB'Access); + Pop.Add ("&Copy", Copy_CB'Access); + Pop.Add ("&Paste", Paste_CB'Access); + Pop.Add ("&Delete", Delete_CB'Access, No_Key, Flag_Divider); + Pop.Add ("Select &All", Select_All_CB'Access); + end; + + Find.Set_Find_Callback (Do_Find_CB'Access); Replace.Set_Replace_Callback (Do_Replace_CB'Access); Buffer.Add_Modify_Callback (Mod_CB'Access); diff --git a/src/fltk_binding/c_fl_menu_button.cpp b/src/fltk_binding/c_fl_menu_button.cpp new file mode 100644 index 0000000..864dd3e --- /dev/null +++ b/src/fltk_binding/c_fl_menu_button.cpp @@ -0,0 +1,21 @@ + + +#include +#include "c_fl_menu_button.h" + + +MENUBUTTON new_fl_menu_button(int x, int y, int w, int h, char* label) { + Fl_Menu_Button *m = new Fl_Menu_Button(x, y, w, h, label); + return m; +} + + +void free_fl_menu_button(MENUBUTTON m) { + delete reinterpret_cast(m); +} + + +void fl_menu_button_type(MENUBUTTON m, unsigned int t) { + reinterpret_cast(m)->type(t); +} + diff --git a/src/fltk_binding/c_fl_menu_button.h b/src/fltk_binding/c_fl_menu_button.h new file mode 100644 index 0000000..8c089b6 --- /dev/null +++ b/src/fltk_binding/c_fl_menu_button.h @@ -0,0 +1,18 @@ + + +#ifndef FL_MENU_BUTTON_GUARD +#define FL_MENU_BUTTON_GUARD + + +typedef void* MENUBUTTON; + + +extern "C" MENUBUTTON new_fl_menu_button(int x, int y, int w, int h, char* label); +extern "C" void free_fl_menu_button(MENUBUTTON m); + + +extern "C" void fl_menu_button_type(MENUBUTTON m, unsigned int t); + + +#endif + diff --git a/src/fltk_binding/fltk-widgets-menus-menu_buttons.adb b/src/fltk_binding/fltk-widgets-menus-menu_buttons.adb new file mode 100644 index 0000000..8347099 --- /dev/null +++ b/src/fltk_binding/fltk-widgets-menus-menu_buttons.adb @@ -0,0 +1,73 @@ + + +with Interfaces.C; +with System; +use type System.Address; + + +package body FLTK.Widgets.Menus.Menu_Buttons is + + + function new_fl_menu_button + (X, Y, W, H : in Interfaces.C.int; + Text : in Interfaces.C.char_array) + return System.Address; + pragma Import (C, new_fl_menu_button, "new_fl_menu_button"); + + procedure free_fl_menu_button + (M : in System.Address); + pragma Import (C, free_fl_menu_button, "free_fl_menu_button"); + + procedure fl_menu_button_type + (M : in System.Address; + T : in Interfaces.C.unsigned); + pragma Import (C, fl_menu_button_type, "fl_menu_button_type"); + + + + + procedure Finalize + (This : in out Menu_Button) is + begin + Finalize (Menu (This)); + if This.Void_Ptr /= System.Null_Address then + if This in Menu_Button then + free_fl_menu_button (This.Void_Ptr); + end if; + end if; + end Finalize; + + + + + function Create + (X, Y, W, H : in Integer; + Text : in String) + return Menu_Button is + begin + return This : Menu_Button do + This.Void_Ptr := new_fl_menu_button + (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)); + end return; + end Create; + + + + + procedure Set_Popup_Kind + (This : in out Menu_Button; + Pop : in Popup_Buttons) is + begin + fl_menu_button_type (This.Void_Ptr, Popup_Buttons'Pos (Pop)); + end Set_Popup_Kind; + + +end FLTK.Widgets.Menus.Menu_Buttons; + diff --git a/src/fltk_binding/fltk-widgets-menus-menu_buttons.ads b/src/fltk_binding/fltk-widgets-menus-menu_buttons.ads new file mode 100644 index 0000000..5527abc --- /dev/null +++ b/src/fltk_binding/fltk-widgets-menus-menu_buttons.ads @@ -0,0 +1,35 @@ + + +package FLTK.Widgets.Menus.Menu_Buttons is + + + type Menu_Button is new Menu with private; + + + -- signifies which mouse buttons cause the menu to appear + type Popup_Buttons is (No_Popup, Popup1, Popup2, Popup12, Popup3, Popup13, Popup23, Popup123); + + + function Create + (X, Y, W, H : in Integer; + Text : in String) + return Menu_Button; + + + procedure Set_Popup_Kind + (This : in out Menu_Button; + Pop : in Popup_Buttons); + + +private + + + type Menu_Button is new Menu with null record; + + + overriding procedure Finalize + (This : in out Menu_Button); + + +end FLTK.Widgets.Menus.Menu_Buttons; + diff --git a/src/windows-editor.adb b/src/windows-editor.adb index d995f7a..ca4bacf 100644 --- a/src/windows-editor.adb +++ b/src/windows-editor.adb @@ -4,6 +4,7 @@ with FLTK.Enums; use FLTK.Enums; with FLTK.Widgets.Groups.Windows.Double; with FLTK.Widgets.Groups.Text_Displays.Text_Editors; with FLTK.Widgets.Menus.Menu_Bars; +with FLTK.Widgets.Menus.Menu_Buttons; with FLTK.Text_Buffers; @@ -14,6 +15,7 @@ package body Windows.Editor is package TD renames FLTK.Widgets.Groups.Text_Displays; package TE renames FLTK.Widgets.Groups.Text_Displays.Text_Editors; package MB renames FLTK.Widgets.Menus.Menu_Bars; + package MU renames FLTK.Widgets.Menus.Menu_Buttons; @@ -41,13 +43,18 @@ package body Windows.Editor is Editor => TE.Text_Editor'(TE.Create (0, Menu_Height, Width, Height - Menu_Height, "")), Bar => MB.Menu_Bar'(MB.Create - (0, 0, Width, Menu_Height, ""))) do + (0, 0, Width, Menu_Height, "")), + Popup => MU.Menu_Button'(MU.Create + (0, 0, Width, Height, ""))) do This.Add (This.Editor); This.Add (This.Bar); This.Bar.Set_Box (No_Box); + This.Editor.Add (This.Popup); + This.Popup.Set_Popup_Kind (MU.Popup3); This.Editor.Set_Text_Font (Courier); This.Set_Resizable (This.Editor); + This.Editor.Set_Resizable (This.Popup); This.Set_Size_Range (Min_Editor_Width, Min_Editor_Height); This.Set_Icon (Logo); end return; @@ -86,12 +93,22 @@ package body Windows.Editor is - function Get_Menu + function Get_Menu_Bar (This : in out Editor_Window) return FLTK.Widgets.Menus.Menu_Cursor is begin return Ref : FLTK.Widgets.Menus.Menu_Cursor (This.Bar'Access); - end Get_Menu; + end Get_Menu_Bar; + + + + + function Get_Rightclick_Menu + (This : in out Editor_Window) + return FLTK.Widgets.Menus.Menu_Cursor is + begin + return Ref : FLTK.Widgets.Menus.Menu_Cursor (This.Popup'Access); + end Get_Rightclick_Menu; diff --git a/src/windows-editor.ads b/src/windows-editor.ads index 8012e09..e3d36e0 100644 --- a/src/windows-editor.ads +++ b/src/windows-editor.ads @@ -6,6 +6,7 @@ with FLTK.Text_Buffers; with FLTK.Widgets.Groups.Text_Displays; private with FLTK.Widgets.Groups.Text_Displays.Text_Editors; private with FLTK.Widgets.Menus.Menu_Bars; +private with FLTK.Widgets.Menus.Menu_Buttons; package Windows.Editor is @@ -42,7 +43,12 @@ package Windows.Editor is Buff : in out FLTK.Text_Buffers.Text_Buffer); - function Get_Menu + function Get_Menu_Bar + (This : in out Editor_Window) + return FLTK.Widgets.Menus.Menu_Cursor; + + + function Get_Rightclick_Menu (This : in out Editor_Window) return FLTK.Widgets.Menus.Menu_Cursor; @@ -106,6 +112,7 @@ private type Editor_Window is new FLTK.Widgets.Groups.Windows.Double.Double_Window with record Bar : aliased FLTK.Widgets.Menus.Menu_Bars.Menu_Bar; + Popup : aliased FLTK.Widgets.Menus.Menu_Buttons.Menu_Button; Editor : FLTK.Widgets.Groups.Text_Displays.Text_Editors.Text_Editor; end record; diff --git a/to_do.txt b/to_do.txt index 1d0fcca..918f4e6 100644 --- a/to_do.txt +++ b/to_do.txt @@ -3,8 +3,8 @@ To Do: - change build to be dynamically linked +- fix rightclick menu resizing - improve replace, undo/redo, jump to -- add right click menu - grey out menu entries when appropriate - suppress unnecessary left/right scrollbar - clean up menu widget code -- cgit