Managed to gen something up. Didn't put any comments in it, so if it isn't
self explanatory, then just ask. I don't use this particular
implementation (I have some generic packages that I use to keep code down),
but I wanted to make something representative. I tested this in one of my
Gnoga playing projects. The big thing is Handle_On_Click gives you the
containing view type which allows you to modify other controls using the on
click from the button. You can also pass the on click event to other
parent views who may want to modify their own layouts based on that button
event. You would just need to add a public Add_On_Click_Listener (or
whatever name) procedure to Listener_View.View_Type (or whatever view you
create) and have it call the button's Add_On_Click_Listener procedure.
Button_For_Listeners is the extended class for Gnoga's Button_Type
Listener_View is just a test view type that would contain a Button among
other controls.
button_for_listeners.ads
-----------------------------------------------------------------------------------------------------------------------------------
with Gnoga.Gui.Element.Common;
with Ada.Containers.Vectors;
package Button_For_Listeners is
type Listener_Type is limited interface;
type Button_Type is new Gnoga.Gui.Element.Common.Button_Type with
private;
procedure Add_On_Click_Listener
(Self : in out Button_Type;
Listener : not null access Listener_Type'Class);
procedure Handle_On_Click(Listener : in out Listener_Type;
Source : in out Button_Type'Class) is
abstract;
private
type Listener_Class_Access is access all Listener_Type'Class;
package Vectors is new
Ada.Containers.Vectors(Natural,Listener_Class_Access);
type Button_Type is new Gnoga.Gui.Element.Common.Button_Type with record
On_Click_Listeners : Vectors.Vector;
end record;
end Button_For_Listeners;
button_for_listeners.adb
-----------------------------------------------------------------------------------------------------------------------------------
with Gnoga.Gui.Base;
package body Button_For_Listeners is
procedure Gnoga_On_Click(Object : in out Gnoga.Gui.Base.Base_Type'Class)
is
Cursor : Vectors.Cursor :=
Button_Type(Object).On_Click_Listeners.First;
begin
while Vectors.Has_Element(Cursor) loop
Vectors.Element(Cursor).Handle_On_Click(Button_Type(Object));
Cursor := Vectors.Next(Cursor);
end loop;
end Gnoga_On_Click;
procedure Add_On_Click_Listener
(Self : in out Button_Type;
Listener : not null access Listener_Type'Class) is
begin
Self.On_Click_Listeners.Append(Listener);
Self.On_Click_Handler(Gnoga_On_Click'Access);
end Add_On_Click_Listener;
end Button_For_Listeners;
listener_view.ads
-----------------------------------------------------------------------------------------------------------------------------------
with Gnoga.Gui.View;
with Gnoga.Gui.Base;
with Button_For_Listeners;
package Listener_View is
package Buttons renames Button_For_Listeners;
type View_Type is new Gnoga.Gui.View.View_Type
and Buttons.Listener_Type with private;
overriding
procedure Create
(Self : in out View_Type;
Parent : in out Gnoga.Gui.Base.Base_Type'Class;
ID : in String := "");
private
type Self_Ref_Type(Ref : access Buttons.Listener_Type'Class)
is limited null record;
type View_Type is new Gnoga.Gui.View.View_Type
and Buttons.Listener_Type with record
Button : Buttons.Button_Type;
Self_Reference : Self_Ref_Type(View_Type'Access);
end record;
overriding
procedure Handle_On_Click(Listener : in out View_Type;
Source : in out Buttons.Button_Type'Class);
end Listener_View;
listener_view.adb
-----------------------------------------------------------------------------------------------------------------------------------
package body Listener_View is
procedure Create(Self : in out View_Type;
Parent : in out Gnoga.Gui.Base.Base_Type'Class;
ID : in String := "") is
begin
Gnoga.Gui.View.View_Type(Self).Create(Parent);
Self.Button.Create(Self,"Test Button");
Self.Button.Add_On_Click_Listener(Self.Self_Reference.Ref);
end Create;
Test_Count : Natural := 0;
overriding
procedure Handle_On_Click(Listener : in out View_Type;
Source : in out Buttons.Button_Type'Class) is
begin
Listener.Button.Text("Testing: " & Integer'Image(Test_Count));
Test_Count := Test_Count + 1;
end Handle_On_Click;
end Listener_View;
On Sat, Jun 6, 2015 at 3:55 PM, Jeremiah Breeden <[email protected]
> wrote:
> I could provide some example code, but I would want to pretty it up at
> least a bit.
>
>
------------------------------------------------------------------------------
_______________________________________________
Gnoga-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gnoga-list