From d6458841c9134a3b6d8ca260766fca64a72740aa Mon Sep 17 00:00:00 2001 From: Jedidiah Barber Date: Wed, 22 Jan 2025 15:40:12 +1300 Subject: Arc testing program and Valuator Format subprogram bugfix --- test/arc.adb | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 test/arc.adb (limited to 'test') diff --git a/test/arc.adb b/test/arc.adb new file mode 100644 index 0000000..88d2214 --- /dev/null +++ b/test/arc.adb @@ -0,0 +1,149 @@ + + +-- Programmed by Jedidiah Barber +-- Released into the public domain + + +-- Arc drawing test program functionality duplicated in Ada + + +with + + FLTK.Draw, + FLTK.Widgets.Groups.Windows.Double, + FLTK.Widgets.Valuators.Sliders.Value.Horizontal; + + +function Arc + return Integer +is + + + package FDR renames FLTK.Draw; + package WD renames FLTK.Widgets.Groups.Windows.Double; + package HV renames FLTK.Widgets.Valuators.Sliders.Value.Horizontal; + + + -- More convenient to have these all as floats instead of integers + Arg_Values : array (Positive range <>) of aliased Long_Float := + (140.0, 140.0, 50.0, 0.0, 360.0, 0.0); + + + type Drawing_Widget is new FLTK.Widgets.Widget with null record; + + procedure Draw + (This : in out Drawing_Widget) is + begin + FDR.Push_Clip (This.Get_X, This.Get_Y, This.Get_W, This.Get_H); + FDR.Set_Color (FLTK.Dark3_Color); + FDR.Rect_Fill (This.Get_X, This.Get_Y, This.Get_W, This.Get_H); + FDR.Push_Matrix; + if Arg_Values (6) > 0.001 then + FDR.Translate + (Long_Float (This.Get_X) + Long_Float (This.Get_W) / 2.0, + Long_Float (This.Get_Y) + Long_Float (This.Get_H) / 2.0); + FDR.Rotate (Arg_Values (6)); + FDR.Translate + (-1.0 * (Long_Float (This.Get_X) + Long_Float (This.Get_W) / 2.0), + -1.0 * (Long_Float (This.Get_Y) + Long_Float (This.Get_H) / 2.0)); + end if; + FDR.Set_Color (FLTK.White_Color); + FDR.Translate (Long_Float (This.Get_X), Long_Float (This.Get_Y)); + FDR.Begin_Complex_Polygon; + FDR.Arc (Arg_Values (1), Arg_Values (2), Arg_Values (3), Arg_Values (4), Arg_Values (5)); + FDR.Gap; + FDR.Arc (140.0, 140.0, 20.0, 0.0, -360.0); + FDR.End_Complex_Polygon; + FDR.Set_Color (FLTK.Red_Color); + FDR.Begin_Line; + FDR.Arc (Arg_Values (1), Arg_Values (2), Arg_Values (3), Arg_Values (4), Arg_Values (5)); + FDR.End_Line; + FDR.Pop_Matrix; + FDR.Pop_Clip; + end Draw; + + + The_Window : WD.Double_Window := WD.Forge.Create (300, 460, "Arc Testing"); + + The_Drawing : Drawing_Widget := + (FLTK.Widgets.Forge.Create (The_Window, 10, 10, 280, 280) + with null record); + + + type My_Slider is new HV.Horizontal_Value_Slider with record + Index : Integer range Arg_Values'Range; + end record; + + + -- Trying out some stack allocation for this one + + Slider_One : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 300, 240, 25, "X") + with Index => 1); + + Slider_Two : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 325, 240, 25, "Y") + with Index => 2); + + Slider_Three : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 350, 240, 25, "R") + with Index => 3); + + Slider_Four : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 375, 240, 25, "start") + with Index => 4); + + Slider_Five : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 400, 240, 25, "end") + with Index => 5); + + Slider_Six : aliased My_Slider := + (HV.Forge.Create (The_Window, 50, 425, 240, 25, "rotate") + with Index => 6); + + + type Slider_Access is access all My_Slider; + + Sliders : array (Positive range <>) of Slider_Access := + (Slider_One'Access, Slider_Two'Access, Slider_Three'Access, + Slider_Four'Access, Slider_Five'Access, Slider_Six'Access); + + + procedure Slider_Callback + (Item : in out FLTK.Widgets.Widget'Class) + is + Slide : My_Slider renames My_Slider (Item); + begin + Arg_Values (Slide.Index) := Slide.Get_Value; + The_Drawing.Redraw; + end Slider_Callback; + + +begin + + + for Place in Integer range 1 .. 6 loop + if Place <= 3 then + Sliders (Place).Set_Minimum (0.0); + Sliders (Place).Set_Maximum (300.0); + elsif Place = 6 then + Sliders (Place).Set_Minimum (0.0); + Sliders (Place).Set_Maximum (360.0); + else + Sliders (Place).Set_Minimum (-360.0); + Sliders (Place).Set_Maximum (360.0); + end if; + Sliders (Place).Set_Step_Bottom (1); + Sliders (Place).Set_Value (Arg_Values (Place)); + Sliders (Place).Set_Alignment (FLTK.Align_Left); + Sliders (Place).Set_Callback (Slider_Callback'Unrestricted_Access); + end loop; + + The_Window.Show_With_Args; + + return FLTK.Run; + + +end Arc; + + -- cgit