[gtkada] Help needed creating custom gtkada widget
Dmitry A. Kazakov
mailbox at dmitry-kazakov.de
Mon Jan 11 21:54:06 CET 2016
Here, fixed initialization. So far that the thingy starts, no further.
bbs_widget_dial.ads -------------------------------->
with Ada.Text_IO;
with Gtkada.Types;
with Gtk.Main;
with Gtkada.Builder;
with Gtk.Widget;
with Gtk.Misc;
with Gtk.Level_Bar;
with Gtk.Progress_Bar;
with Gtk.Drawing_Area;
with Gdk.Window;
with Glib;
use type Glib.Gdouble;
use type Glib.Gint;
with Glib.Object;
with Cairo;
package bbs_widget_dial is
type bbs_dial_record is new Gtk.Drawing_Area.Gtk_Drawing_Area_Record
with private;
type bbs_dial is access all bbs_dial_record'class;
function Get_Type return Glib.GType;
procedure gtk_new(self : in out bbs_dial);
procedure initialize(self : not null access bbs_dial_record'class;
minimum : float; maximum : float);
procedure setup(self : not null access bbs_dial_record'class;
minimum : float; maximum : float;
parent : Gdk.Gdk_Window);
procedure draw(self : in out bbs_dial_record'class);
procedure set_value(self : in out bbs_dial_record'Class; value : Float);
procedure Get_Preferred_Height
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Minimum_Height : out Glib.Gint;
Natural_Height : out Glib.Gint);
procedure Get_Preferred_Height_For_Width
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Width : Glib.Gint;
Minimum_Height : out Glib.Gint;
Natural_Height : out Glib.Gint);
-- procedure Get_Preferred_Size
-- (Widget : not null access Gtk.Widget.Gtk_Widget_Record;
-- Minimum_Size : out Gtk_Requisition;
-- Natural_Size : out Gtk_Requisition);
procedure Get_Preferred_Width
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Minimum_Width : out Glib.Gint;
Natural_Width : out Glib.Gint);
procedure Get_Preferred_Width_For_Height
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Height : Glib.Gint;
Minimum_Width : out Glib.Gint;
Natural_Width : out Glib.Gint);
private
type bbs_dial_record is new Gtk.Drawing_Area.Gtk_Drawing_Area_Record
with
record
min : Float;
max : Float;
value : Float;
end record;
klass : aliased Glib.Object.Ada_GObject_Class :=
Glib.Object.Uninitialized_Class;
function draw_dial(Self : access Gtk.Widget.Gtk_Widget_Record'Class;
context : Cairo.Cairo_Context) return boolean;
end bbs_widget_dial;
bbs_widget_dial.adb -------------------------------->
package body bbs_widget_dial is
function Get_Type return Glib.GType is
begin
Glib.Object.Initialize_Class_Record
(Ancestor => Gtk.Drawing_Area.Get_Type,
Class_Record => Klass,
Type_Name => "bbs_dial",
Signals => Glib.Object.No_Signals,
Parameters => Glib.Object.Null_Parameter_Types);
Ada.Text_IO.Put_Line("Dial get_type called");
return Klass.The_Type;
end;
procedure gtk_new(self : in out bbs_dial) is
begin
self := new bbs_dial_record;
initialize (self, 0.0, 10.0);
Ada.Text_IO.Put_Line("Dial allocated");
end;
procedure initialize(self : not null access bbs_dial_record'class;
minimum : float; maximum : float) is
begin
Glib.Object.G_New(Object => self,
Typ => Get_Type);
self.min := minimum;
self.max := maximum;
Gtk.Drawing_Area.Initialize(self);
self.On_Draw(draw_dial'access, True);
Ada.Text_IO.Put_Line("Dial initialized");
end;
procedure setup(self : not null access bbs_dial_record'class;
minimum : float; maximum : float;
parent : Gdk.Gdk_Window) is
begin
self.min := minimum;
self.max := maximum;
self.Set_Window(parent);
self.Set_Has_Window(True);
Ada.Text_IO.Put_Line("Dial setup");
end;
procedure draw(self : in out bbs_dial_record'Class) is
begin
self.Queue_Draw;
end;
procedure set_value(self : in out bbs_dial_record'Class; value :
Float) is
begin
self.value := value;
self.Queue_Draw;
end;
procedure Get_Preferred_Height
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Minimum_Height : out Glib.Gint;
Natural_Height : out Glib.Gint) is
begin
Ada.Text_IO.Put_Line("Dial get preferred height");
Minimum_Height := 100;
Natural_Height := 100;
end;
procedure Get_Preferred_Height_For_Width
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Width : Glib.Gint;
Minimum_Height : out Glib.Gint;
Natural_Height : out Glib.Gint) is
begin
Ada.Text_IO.Put_Line("Dial get preferred height for width");
Minimum_Height := 100;
Natural_Height := 100;
end;
-- procedure Get_Preferred_Size
-- (Widget : not null access Gtk.Widget.Gtk_Widget_Record;
-- Minimum_Size : out Gtk_Requisition;
-- Natural_Size : out Gtk_Requisition);
procedure Get_Preferred_Width
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Minimum_Width : out Glib.Gint;
Natural_Width : out Glib.Gint) is
begin
Ada.Text_IO.Put_Line("Dial get preferred width");
Minimum_Width := 100;
Natural_Width := 100;
end;
procedure Get_Preferred_Width_For_Height
(self : not null access Gtk.Widget.Gtk_Widget_Record;
Height : Glib.Gint;
Minimum_Width : out Glib.Gint;
Natural_Width : out Glib.Gint) is
begin
Ada.Text_IO.Put_Line("Dial get preferred width for height");
Minimum_Width := 100;
Natural_Width := 100;
end;
function draw_dial(Self : access Gtk.Widget.Gtk_Widget_Record'Class;
context : Cairo.Cairo_Context) return boolean is
begin
Ada.Text_IO.Put_Line("Dial drawing");
Cairo.Translate(context, 100.0, 100.0);
Cairo.Set_Line_Width(context, 1.0);
Cairo.Set_Source_Rgb(context, 0.0, 0.0, 0.0);
Cairo.Arc(context, 0.0, 0.0, 50.0, 0.0, 6.28);
for x in 0 .. 9 loop
Cairo.Rotate(context, Glib.Gdouble(6.28/10.0));
Cairo.Move_To(context, 0.0, 40.0);
Cairo.Line_To(context, 0.0, 50.0);
Cairo.Move_To(context, -5.0, 60.0);
Cairo.Show_Text(context, Integer'Image(x + 1));
end loop;
Cairo.Stroke(context);
-- Cairo.Rotate(context,
Glib.Gdouble(bbs_dial_record(self).value*6.28/10.0));
Cairo.Set_Source_Rgb(context, 1.0, 0.0, 0.0);
Cairo.Move_To(context, 0.0, -10.0);
Cairo.Line_To(context, 5.0, 0.0);
Cairo.Line_To(context, 0.0, 40.0);
Cairo.Line_To(context, -5.0, 0.0);
Cairo.Line_To(context, 0.0, -10.0);
Cairo.Stroke(context);
return True;
end;
end bbs_widget_dial;
test_bbs.adb ------------------------>
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Text_IO; use Ada.Text_IO;
with Gdk.Event; use Gdk.Event;
with Gtk.Box; use Gtk.Box;
with Gtk.Button; use Gtk.Button;
with Gtk.Window; use Gtk.Window;
with Gtk.Widget; use Gtk.Widget;
with bbs_widget_dial; use bbs_widget_dial;
with Gtk.Main;
procedure Test_BBS is
Window : Gtk_Window;
Box : Gtk_VBox;
Dial : bbs_dial;
begin
Gtk.Main.Init;
Gtk.Window.Gtk_New (Window);
Window.Set_Title ("Test BBS");
Gtk_New_VBox (Box);
Add (Window, Box);
Gtk_New (Dial);
Box.Pack_Start (Dial);
Window.Show_All;
Gtk.Main.Main;
exception
when Error : others =>
Put_Line ("Fatal error: " & Exception_Information (Error));
end Test_BBS;
More information about the gtkada
mailing list