Thanks for example :) Perhaps a good thing to add to the docs directory,
example of multiple event listeners. Ok with that?

On Tue, Jun 9, 2015 at 8:48 AM Jeremiah Breeden <[email protected]>
wrote:

> 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
>
------------------------------------------------------------------------------
_______________________________________________
Gnoga-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gnoga-list

Reply via email to