From 80c9f9e9f74f746bba86b4790ac7d41fb9e8e137 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sun, 2 Oct 2016 00:35:40 -0300 Subject: [PATCH] Initial textbox development. Also: - Frame container. - Radio buttons. - Check boxes - New events (BeforeUpdateDisplay, BeforeUnload, OnLoad, BeginDrag, EndDrag - __UI_Darken& function (_RGB32 intensity manipulator) - Improved rounded rectangles. - Improved event dispatcher routine. - Improved textbox behavior. --- UI.bas | 1450 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 1172 insertions(+), 278 deletions(-) diff --git a/UI.bas b/UI.bas index b139133..d281b1f 100644 --- a/UI.bas +++ b/UI.bas @@ -1,10 +1,7 @@ OPTION _EXPLICIT -DECLARE LIBRARY - SUB glutSetCursor (BYVAL style&) -END DECLARE - $RESIZE:ON +_RESIZE OFF TYPE ObjectTYPE ID AS LONG @@ -15,149 +12,336 @@ TYPE ObjectTYPE Left AS INTEGER Width AS INTEGER Height AS INTEGER + Font AS INTEGER BackColor AS _UNSIGNED LONG ForeColor AS _UNSIGNED LONG BackStyle AS _BYTE - BorderStyle AS _BYTE + HasBorder AS _BYTE + Align AS _BYTE BorderColor AS _UNSIGNED LONG Value AS _FLOAT Min AS _FLOAT Max AS _FLOAT + InputViewStart AS LONG + Cursor AS LONG + PrevCursor AS LONG + FieldArea AS LONG + Selected AS _BYTE + SelectionStart AS LONG Resizable AS _BYTE CanDrag AS _BYTE + CanHaveFocus AS _BYTE Enabled AS _BYTE END TYPE REDIM SHARED __UI_Captions(1 TO 100) AS STRING REDIM SHARED __UI_Texts(1 TO 100) AS STRING -REDIM SHARED __UI_Objects(1 TO 100) AS ObjectTYPE +REDIM SHARED __UI_Controls(0 TO 100) AS ObjectTYPE + +DIM SHARED __UI_Fonts(2) AS LONG +__UI_Fonts(0) = 16 +__UI_Fonts(1) = 8 +__UI_Fonts(2) = __UI_LoadFont("cyberbit.ttf", 14, "") DIM SHARED __UI_MouseX AS INTEGER, __UI_MouseY AS INTEGER DIM SHARED __UI_PrevMouseX AS INTEGER, __UI_PrevMouseY AS INTEGER DIM SHARED __UI_MouseButton1 AS _BYTE, __UI_MouseButton2 AS _BYTE -DIM SHARED __UI_PrevMouseButton1 AS _BYTE, __UI_MouseButton2 AS _BYTE +DIM SHARED __UI_PrevMouseButton1 AS _BYTE, __UI_PrevMouseButton2 AS _BYTE +DIM SHARED __UI_PreviewTop AS INTEGER, __UI_PreviewLeft AS INTEGER +DIM SHARED __UI_MouseIsDown AS _BYTE, __UI_MouseDownOnID AS LONG +DIM SHARED __UI_KeyIsDown AS _BYTE, __UI_KeyDownOnID AS LONG +DIM SHARED __UI_ShiftIsDown AS _BYTE, __UI_CtrlIsDown AS _BYTE +DIM SHARED __UI_AltIsDown AS _BYTE +DIM SHARED __UI_LastMouseClick AS DOUBLE +DIM SHARED __UI_DragX AS INTEGER, __UI_DragY AS INTEGER +DIM SHARED __UI_DefaultButtonID AS LONG DIM SHARED __UI_KeyHit AS LONG DIM SHARED __UI_Focus AS LONG DIM SHARED __UI_HoveringID AS LONG -DIM SHARED __UI_HasResized AS _BYTE +DIM SHARED __UI_IsDragging AS _BYTE, __UI_DraggingID AS LONG +DIM SHARED __UI_HasInput AS _BYTE +DIM SHARED __UI_UnloadSignal AS _BYTE +DIM SHARED __UI_ExitTriggered AS _BYTE +DIM SHARED __UI_Loaded AS _BYTE +DIM SHARED __UI_FirstDisplay AS _BYTE +DIM SHARED __UI_SelectedText AS STRING 'Object types: CONST __UI_Type_Form = 1 -CONST __UI_Type_Button = 2 -CONST __UI_Type_Label = 3 -CONST __UI_Type_TextBox = 4 +CONST __UI_Type_Frame = 2 +CONST __UI_Type_Button = 3 +CONST __UI_Type_Label = 4 CONST __UI_Type_CheckBox = 5 -CONST __UI_Type_ComboBox = 6 -CONST __UI_Type_Frame = 7 -CONST __UI_Type_ListBox = 8 -CONST __UI_Type_RadioButton = 9 -CONST __UI_Type_Menu = 10 +CONST __UI_Type_RadioButton = 6 +CONST __UI_Type_ComboBox = 7 +CONST __UI_Type_TextBox = 8 +CONST __UI_Type_MultiLineTextBox = 9 +CONST __UI_Type_ListBox = 10 +CONST __UI_Type_Menu = 11 +CONST __UI_Type_ProgressBar = 12 +CONST __UI_Type_HScrollBar = 13 +CONST __UI_Type_VScrollBar = 14 -'BackStyles: +'Back styles: CONST __UI_Opaque = 0 CONST __UI_Transparent = -1 +'Text alignment +CONST __UI_Left = 0 +CONST __UI_Center = 1 +CONST __UI_Right = 2 + 'Global constants CONST __UI_True = -1 CONST __UI_False = 0 DIM NewID AS LONG, ParentID AS LONG -NewID = __UI_NewObject(__UI_Type_Form, 0) -__UI_Objects(NewID).Name = "Form1" -__UI_Objects(NewID).Width = 640 -__UI_Objects(NewID).Height = 400 -__UI_Objects(NewID).ForeColor = _RGB32(0, 0, 0) -__UI_Objects(NewID).BackColor = _RGB32(161, 161, 161) -__UI_Objects(NewID).Resizable = __UI_False -__UI_Objects(NewID).Enabled = __UI_True +NewID = __UI_NewObject(__UI_Type_Form, "Form1", 0) +__UI_Controls(NewID).Width = 640 +__UI_Controls(NewID).Height = 400 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).BackColor = _RGB32(235, 233, 237) +__UI_Controls(NewID).Enabled = __UI_True __UI_SetCaption "Form1", "Hello, world!" -NewID = __UI_NewObject(__UI_Type_Button, 0) -__UI_Objects(NewID).Name = "Button1" -__UI_Objects(NewID).Top = 100 -__UI_Objects(NewID).Left = 100 -__UI_Objects(NewID).Width = 200 -__UI_Objects(NewID).Height = 20 -__UI_Objects(NewID).ForeColor = _RGB32(0, 0, 0) -__UI_Objects(NewID).Enabled = __UI_True +NewID = __UI_NewObject(__UI_Type_Button, "Button1", 0) +__UI_Controls(NewID).Top = 100 +__UI_Controls(NewID).Left = 100 +__UI_Controls(NewID).Width = 200 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(255, 255, 255) +__UI_Controls(NewID).BackColor = _RGB32(105, 177, 94) +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_Controls(NewID).Enabled = __UI_True __UI_SetCaption "Button1", "Click me" -NewID = __UI_NewObject(__UI_Type_Button, 0) -__UI_Objects(NewID).Name = "Button2" -__UI_Objects(NewID).Top = 200 -__UI_Objects(NewID).Left = 100 -__UI_Objects(NewID).Width = 200 -__UI_Objects(NewID).Height = 20 -__UI_Objects(NewID).ForeColor = _RGB32(0, 0, 0) -__UI_Objects(NewID).Enabled = __UI_True -__UI_SetCaption "Button2", "Make resizable" +NewID = __UI_NewObject(__UI_Type_Button, "Button2", 0) +__UI_Controls(NewID).Top = 200 +__UI_Controls(NewID).Left = 100 +__UI_Controls(NewID).Width = 200 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(255, 255, 255) +__UI_Controls(NewID).BackColor = _RGB32(51, 152, 219) +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "Button2", "Make this form resizable" -NewID = __UI_NewObject(__UI_Type_Label, 0) -__UI_Objects(NewID).Name = "Label1" -__UI_Objects(NewID).Top = 30 -__UI_Objects(NewID).Left = 10 -__UI_Objects(NewID).Width = 400 -__UI_Objects(NewID).Height = 20 -__UI_Objects(NewID).ForeColor = _RGB32(238, 238, 200) -__UI_Objects(NewID).BackColor = _RGB32(33, 100, 78) -__UI_Objects(NewID).Enabled = __UI_True +NewID = __UI_NewObject(__UI_Type_TextBox, "Textbox1", 0) +__UI_Controls(NewID).Top = 250 +__UI_Controls(NewID).Left = 30 +__UI_Controls(NewID).Width = 300 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).Font = 0 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).BackColor = __UI_Controls(__UI_GetID("Form1")).BackColor +__UI_Controls(NewID).HasBorder = __UI_True +__UI_Controls(NewID).BorderColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "Textbox1", "Edit me" + +NewID = __UI_NewObject(__UI_Type_Button, "DragButton", 0) +__UI_Controls(NewID).Top = 300 +__UI_Controls(NewID).Left = 100 +__UI_Controls(NewID).Width = 200 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(255, 255, 255) +__UI_Controls(NewID).BackColor = _RGB32(188, 152, 116) +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "DragButton", "Make frame draggable" + +NewID = __UI_NewObject(__UI_Type_Label, "Label1", 0) +__UI_Controls(NewID).Top = 30 +__UI_Controls(NewID).Left = 10 +__UI_Controls(NewID).Width = 400 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).Font = 2 +__UI_Controls(NewID).ForeColor = _RGB32(238, 238, 200) +__UI_Controls(NewID).BackColor = _RGB32(33, 100, 78) +__UI_Controls(NewID).Align = __UI_Center +__UI_Controls(NewID).Enabled = __UI_True __UI_SetCaption "Label1", "Waiting for you to click" -NewID = __UI_NewObject(__UI_Type_Label, 0) -__UI_Objects(NewID).Name = "Label2" -__UI_Objects(NewID).Top = 230 -__UI_Objects(NewID).Left = 30 -__UI_Objects(NewID).Width = 200 -__UI_Objects(NewID).Height = 20 -__UI_Objects(NewID).ForeColor = _RGB32(0, 0, 0) -__UI_Objects(NewID).BackColor = _RGB32(161, 161, 161) -__UI_Objects(NewID).CanDrag = __UI_True -__UI_Objects(NewID).Enabled = __UI_True -__UI_SetCaption "Label2", "Resizable: OFF" +NewID = __UI_NewObject(__UI_Type_Label, "FocusLabel", 0) +__UI_Controls(NewID).Top = 55 +__UI_Controls(NewID).Left = 10 +__UI_Controls(NewID).Width = 400 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "FocusLabel", "No object has focus now" +__UI_Controls(NewID).Font = 1 + +NewID = __UI_NewObject(__UI_Type_Label, "HoverLabel", 0) +__UI_Controls(NewID).Top = 75 +__UI_Controls(NewID).Left = 10 +__UI_Controls(NewID).Width = 400 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_Controls(NewID).Font = 1 +NewID = __UI_NewObject(__UI_Type_Label, "Label2", 0) +__UI_Controls(NewID).Top = 350 +__UI_Controls(NewID).Left = 30 +__UI_Controls(NewID).Width = 300 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).BackStyle = __UI_Transparent +__UI_Controls(NewID).HasBorder = __UI_False +__UI_Controls(NewID).BorderColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True + +NewID = __UI_NewObject(__UI_Type_Frame, "Frame1", 0) +__UI_Controls(NewID).Top = 30 +__UI_Controls(NewID).Left = 430 +__UI_Controls(NewID).Width = 200 +__UI_Controls(NewID).Height = 110 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).BackColor = __UI_Controls(__UI_GetID("Form1")).BackColor +__UI_Controls(NewID).HasBorder = __UI_True +__UI_Controls(NewID).BorderColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "Frame1", "A cute container" + +NewID = __UI_NewObject(__UI_Type_RadioButton, "Option1", __UI_GetID("Frame1")) +__UI_Controls(NewID).Top = 15 +__UI_Controls(NewID).Left = 15 +__UI_Controls(NewID).Width = 110 +__UI_Controls(NewID).Height = 10 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_Controls(NewID).Value = __UI_True +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_SetCaption "Option1", "Option 1" +__UI_Controls(NewID).Font = 2 + +NewID = __UI_NewObject(__UI_Type_RadioButton, "Option2", __UI_GetID("Frame1")) +__UI_Controls(NewID).Top = 40 +__UI_Controls(NewID).Left = 15 +__UI_Controls(NewID).Width = 110 +__UI_Controls(NewID).Height = 10 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_SetCaption "Option2", "Option 2" +__UI_Controls(NewID).Font = 2 + +NewID = __UI_NewObject(__UI_Type_CheckBox, "Check1", __UI_GetID("Frame1")) +__UI_Controls(NewID).Top = 65 +__UI_Controls(NewID).Left = 15 +__UI_Controls(NewID).Width = 110 +__UI_Controls(NewID).Height = 10 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_SetCaption "Check1", "Checkbox 1" +__UI_Controls(NewID).Font = 2 + +NewID = __UI_NewObject(__UI_Type_CheckBox, "Check2", __UI_GetID("Frame1")) +__UI_Controls(NewID).Top = 90 +__UI_Controls(NewID).Left = 15 +__UI_Controls(NewID).Width = 110 +__UI_Controls(NewID).Height = 10 +__UI_Controls(NewID).ForeColor = _RGB32(0, 0, 0) +__UI_Controls(NewID).Enabled = __UI_True +__UI_Controls(NewID).Value = __UI_True +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_SetCaption "Check2", "Checkbox 2" +__UI_Controls(NewID).Font = 2 + +NewID = __UI_NewObject(__UI_Type_Button, "OkButton", 0) +__UI_Controls(NewID).Top = 350 +__UI_Controls(NewID).Left = 550 +__UI_Controls(NewID).Width = 70 +__UI_Controls(NewID).Height = 20 +__UI_Controls(NewID).ForeColor = _RGB32(255, 255, 255) +__UI_Controls(NewID).BackColor = _RGB32(51, 152, 219) +__UI_Controls(NewID).CanHaveFocus = __UI_True +__UI_Controls(NewID).Enabled = __UI_True +__UI_SetCaption "OkButton", "OK" +__UI_DefaultButtonID = NewID -SCREEN _NEWIMAGE(__UI_Objects(__UI_GetID("Form1")).Width, __UI_Objects(__UI_GetID("Form1")).Height, 32) -IF __UI_Objects(__UI_GetID("Form1")).Resizable THEN _RESIZE ON -_FONT _LOADFONT("cyberbit.ttf", 14, "BOLD") 'Main loop DO - __UI_UpdateDisplay + IF __UI_Loaded = __UI_False THEN __UI_Load + + __UI_ProcessInput + IF __UI_HasInput OR __UI_FirstDisplay = __UI_False OR _ + __UI_Controls(__UI_Focus).Type = __UI_Type_TextBox THEN + __UI_FirstDisplay = __UI_True + __UI_EventDispatcher + __UI_UpdateDisplay + END IF _LIMIT 30 LOOP +'--------------------------------------------------------------------------------- +SUB __UI_Load + DIM i AS LONG + SCREEN _NEWIMAGE(__UI_Controls(__UI_GetID("Form1")).Width, __UI_Controls(__UI_GetID("Form1")).Height, 32) + DO UNTIL _SCREENEXISTS: _LIMIT 10: LOOP + + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).ParentID THEN + IF __UI_Controls(i).Width + __UI_Controls(i).Left > __UI_Controls(__UI_Controls(i).ParentID).Width THEN + __UI_Controls(i).Width = __UI_Controls(__UI_Controls(i).ParentID).Width - __UI_Controls(i).Left + END IF + END IF + + IF __UI_Controls(i).Type = __UI_Type_TextBox THEN + __UI_Controls(i).FieldArea = __UI_Controls(i).Width \ _FONTWIDTH(__UI_Fonts(__UI_Controls(i).Font)) + END IF + NEXT + + __UI_Loaded = __UI_True + __UI_OnLoad +END SUB + 'Event procedures: --------------------------------------------------------------- 'Generated at design time - code inside CASE statements to be added by programmer. '--------------------------------------------------------------------------------- SUB __UI_Click (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" + CASE "OKBUTTON" + SYSTEM CASE "BUTTON1" STATIC State AS _BYTE, TotalStops AS _BYTE State = State + 1: IF State > 3 THEN State = 1 SELECT CASE State CASE 1 - __UI_Objects(__UI_GetID("Label1")).Enabled = __UI_True + __UI_Controls(__UI_GetID("Label1")).Enabled = __UI_True __UI_Captions(__UI_GetID("Label1")) = "You clicked the button!" CASE 2 __UI_Captions(__UI_GetID("Label1")) = "Aren't you the clicker? You'd better stop it" CASE 3 - __UI_Objects(__UI_GetID("Label1")).Enabled = __UI_False + __UI_Controls(__UI_GetID("Label1")).Enabled = __UI_False __UI_Captions(__UI_GetID("Label1")) = "Stop it." - IF TotalStops < 3 THEN + IF TotalStops < 2 THEN TotalStops = TotalStops + 1 ELSE - __UI_Objects(__UI_GetID("Button1")).Enabled = __UI_False + __UI_Controls(__UI_GetID("Button1")).Enabled = __UI_False __UI_Captions(__UI_GetID("Label1")) = "I told you to stop it." END IF END SELECT CASE "BUTTON2" - __UI_Objects(__UI_GetID("Form1")).Resizable = NOT __UI_Objects(__UI_GetID("Form1")).Resizable - IF __UI_Objects(__UI_GetID("Form1")).Resizable THEN - __UI_Captions(__UI_GetID("Label2")) = "Resizable:ON" + __UI_Controls(__UI_GetID("Form1")).Resizable = NOT __UI_Controls(__UI_GetID("Form1")).Resizable + IF __UI_Controls(__UI_GetID("Form1")).Resizable THEN + __UI_Captions(__UI_GetID("Button2")) = "Form is resizable" ELSE - __UI_Captions(__UI_GetID("Label2")) = "Resizable:OFF" + __UI_Captions(__UI_GetID("Button2")) = "Form is not resizable" + END IF + CASE "DRAGBUTTON" + __UI_Controls(__UI_GetID("frame1")).CanDrag = NOT __UI_Controls(__UI_GetID("frame1")).CanDrag + IF __UI_Controls(__UI_GetID("frame1")).CanDrag THEN + __UI_Captions(__UI_GetID("DragButton")) = "Frame is draggable" + ELSE + __UI_Captions(__UI_GetID("DragButton")) = "Frame is not draggable" END IF CASE "LABEL1" __UI_Captions(__UI_GetID("Label1")) = "I'm not a button..." @@ -165,33 +349,33 @@ SUB __UI_Click (id AS LONG) END SUB SUB __UI_MouseEnter (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" CASE "LABEL1" - IF __UI_Objects(__UI_GetID("Label1")).Enabled THEN - __UI_Objects(__UI_GetID("Label1")).BackColor = _RGB32(127, 172, 127) + IF __UI_Controls(__UI_GetID("Label1")).Enabled THEN + __UI_Controls(__UI_GetID("Label1")).BackColor = _RGB32(127, 172, 127) END IF END SELECT END SUB SUB __UI_MouseLeave (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" CASE "LABEL1" - IF __UI_Objects(__UI_GetID("Label1")).Enabled THEN - __UI_Objects(__UI_GetID("Label1")).BackColor = _RGB32(33, 100, 78) + IF __UI_Controls(__UI_GetID("Label1")).Enabled THEN + __UI_Controls(__UI_GetID("Label1")).BackColor = _RGB32(33, 100, 78) END IF END SELECT END SUB SUB __UI_FocusIn (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" @@ -202,7 +386,7 @@ SUB __UI_FocusIn (id AS LONG) END SUB SUB __UI_FocusOut (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" @@ -213,7 +397,7 @@ SUB __UI_FocusOut (id AS LONG) END SUB SUB __UI_MouseDown (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" @@ -224,7 +408,7 @@ SUB __UI_MouseDown (id AS LONG) END SUB SUB __UI_MouseUp (id AS LONG) - SELECT CASE UCASE$(RTRIM$(__UI_Objects(id).Name)) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) CASE "FORM1" CASE "BUTTON1" @@ -234,215 +418,853 @@ SUB __UI_MouseUp (id AS LONG) END SELECT END SUB +SUB __UI_BeforeUpdateDisplay + STATIC Iterations AS LONG + Iterations = Iterations + 1 + + IF __UI_Focus THEN + __UI_SetCaption "FocusLabel", "Focus is on " + RTRIM$(__UI_Controls(__UI_Focus).Name) + END IF + + IF __UI_HoveringID THEN + __UI_SetCaption "HoverLabel", "Hovering " + RTRIM$(__UI_Controls(__UI_HoveringID).Name) + END IF + + IF __UI_IsDragging = __UI_False THEN + __UI_SetCaption "Label2", "Screen repainted" + STR$(Iterations) + " times." + ELSE + __UI_SetCaption "Label2", "Dragging..." + STR$(__UI_PreviewLeft) + "," + STR$(__UI_PreviewTop) + END IF +END SUB + +SUB __UI_BeforeUnload + 'STATIC it + 'it = it + 1 + 'IF it < 3 THEN __UI_UnloadSignal = __UI_False +END SUB + +SUB __UI_OnLoad + +END SUB + +SUB __UI_BeginDrag (id AS LONG) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) + CASE "FORM1" + + CASE "BUTTON1" + + CASE "LABEL1" + + CASE "LABEL2" + END SELECT +END SUB + +SUB __UI_EndDrag (id AS LONG) + SELECT CASE UCASE$(RTRIM$(__UI_Controls(id).Name)) + CASE "FORM1" + + CASE "BUTTON1" + + CASE "LABEL1" + + CASE "LABEL2" + END SELECT +END SUB + '--------------------------------------------------------------------------------- 'Internal procedures: ------------------------------------------------------------ '--------------------------------------------------------------------------------- SUB __UI_ProcessInput DIM OldScreen&, OldFont& - DIM __UI_HasInput AS _BYTE + STATIC __UI_CurrentTitle AS STRING + STATIC __UI_CurrentResizeStatus AS _BYTE - DO - 'Mouse input: - WHILE _MOUSEINPUT - WEND + __UI_HasInput = __UI_False - __UI_MouseX = _MOUSEX - __UI_MouseY = _MOUSEY - __UI_MouseButton1 = _MOUSEBUTTON(1) - __UI_MouseButton2 = _MOUSEBUTTON(2) + __UI_ExitTriggered = _EXIT + IF __UI_ExitTriggered AND 1 THEN __UI_ExitTriggered = __UI_True: __UI_HasInput = __UI_True -if __UI_mousex<>__UI_ + 'Mouse input: + WHILE _MOUSEINPUT + WEND - 'Keyboard input: - __UI_KeyHit = _KEYHIT + __UI_MouseX = _MOUSEX + __UI_MouseY = _MOUSEY + __UI_MouseButton1 = _MOUSEBUTTON(1) + __UI_MouseButton2 = _MOUSEBUTTON(2) - 'Resize event: - IF _RESIZE AND __UI_Objects(__UI_GetID("Form1")).Resizable THEN - __UI_Objects(__UI_GetID("Form1")).Width = _RESIZEWIDTH - __UI_Objects(__UI_GetID("Form1")).Height = _RESIZEHEIGHT - OldScreen& = _DEST - OldFont& = _FONT - SCREEN _NEWIMAGE(__UI_Objects(__UI_GetID("Form1")).Width, __UI_Objects(__UI_GetID("Form1")).Height, 32) - _FONT OldFont& - _FREEIMAGE OldScreen& - __UI_HasResized = __UI_True + IF __UI_PrevMouseX <> __UI_MouseX THEN _ + __UI_HasInput = __UI_True: __UI_PrevMouseX = __UI_MouseX + IF __UI_PrevMouseY <> __UI_MouseY THEN _ + __UI_HasInput = __UI_True: __UI_PrevMouseY = __UI_MouseY + IF __UI_PrevMouseButton1 <> __UI_MouseButton1 THEN _ + __UI_HasInput = __UI_True: __UI_PrevMouseButton1 = __UI_MouseButton1 + IF __UI_PrevMouseButton2 <> __UI_MouseButton2 THEN _ + __UI_HasInput = __UI_True: __UI_PrevMouseButton2 = __UI_MouseButton2 + + 'Keyboard input: + __UI_KeyHit = _KEYHIT + IF __UI_KeyHit THEN __UI_HasInput = __UI_True + + 'Resize event: + '1- Triggered programatically: + IF __UI_Controls(__UI_GetID("Form1")).Resizable <> __UI_CurrentResizeStatus THEN + __UI_CurrentResizeStatus = __UI_Controls(__UI_GetID("Form1")).Resizable + IF __UI_CurrentResizeStatus THEN + _RESIZE ON + ELSE + _RESIZE OFF END IF - _LIMIT 30 - LOOP UNTIL __UI_HasInput + END IF + + '2- Triggered by manually resizing: + IF _RESIZE AND __UI_Controls(__UI_GetID("Form1")).Resizable THEN + __UI_Controls(__UI_GetID("Form1")).Width = _RESIZEWIDTH + __UI_Controls(__UI_GetID("Form1")).Height = _RESIZEHEIGHT + OldScreen& = _DEST + OldFont& = _FONT + SCREEN _NEWIMAGE(__UI_Controls(__UI_GetID("Form1")).Width, __UI_Controls(__UI_GetID("Form1")).Height, 32) + IF LEN(__UI_CurrentTitle) THEN _TITLE __UI_CurrentTitle + _FONT OldFont& + _FREEIMAGE OldScreen& + __UI_HasInput = __UI_True + END IF + + 'Update main window title if needed + IF __UI_CurrentTitle <> __UI_Captions(__UI_GetID("Form1")) THEN + __UI_CurrentTitle = __UI_Captions(__UI_GetID("Form1")) + _TITLE __UI_CurrentTitle + __UI_HasInput = __UI_True + END IF END SUB '--------------------------------------------------------------------------------- SUB __UI_UpdateDisplay DIM i AS LONG, TempCaption$, TempColor~& - STATIC __UI_CurrentTitle AS STRING - STATIC __UI_CurrentResizeStatus AS _BYTE + DIM CaptionIndent AS INTEGER + DIM ContainerOffsetLeft AS INTEGER, ContainerOffsetTop AS INTEGER - __UI_ProcessInput - - IF __UI_Objects(__UI_GetID("Form1")).Resizable <> __UI_CurrentResizeStatus THEN - __UI_CurrentResizeStatus = __UI_Objects(__UI_GetID("Form1")).Resizable - IF __UI_CurrentResizeStatus THEN - _RESIZE ON - __UI_HasResized = -1 - ELSE - _RESIZE OFF - __UI_HasResized = -1 - END IF - END IF - - 'Update main window properties if needed - IF __UI_CurrentTitle <> __UI_Captions(__UI_GetID("Form1")) OR __UI_HasResized THEN - __UI_CurrentTitle = __UI_Captions(__UI_GetID("Form1")) - _TITLE __UI_CurrentTitle - __UI_HasResized = __UI_False - END IF + __UI_BeforeUpdateDisplay 'Main window: - COLOR __UI_Objects(__UI_GetID("Form1")).ForeColor, __UI_Objects(__UI_GetID("Form1")).BackColor + COLOR __UI_Controls(__UI_GetID("Form1")).ForeColor, __UI_Controls(__UI_GetID("Form1")).BackColor CLS - FOR i = 1 TO UBOUND(__UI_Objects) - IF __UI_Objects(i).ID THEN - 'Hover detection - IF __UI_MouseX >= __UI_Objects(i).Left AND _ - __UI_MouseX <= __UI_Objects(i).Left + __UI_Objects(i).Width - 1 AND _ - __UI_MouseY >= __UI_Objects(i).Top AND _ - __UI_MouseY <= __UI_Objects(i).Top + __UI_Objects(i).Height - 1 THEN + IF __UI_IsDragging AND NOT (_KEYDOWN(100305) OR _KEYDOWN(100306)) THEN + 'Draw the alignment grid + DIM GridX AS INTEGER, GridY AS INTEGER + + FOR GridX = 0 TO __UI_Controls(__UI_GetID("Form1")).Width STEP 10 + FOR GridY = 0 TO __UI_Controls(__UI_GetID("Form1")).Height STEP 10 + PSET (GridX, GridY), __UI_Controls(__UI_GetID("Form1")).ForeColor + NEXT + NEXT + + LINE (__UI_PreviewLeft, __UI_PreviewTop)-STEP(__UI_Controls(__UI_DraggingID).Width - 1, __UI_Controls(__UI_DraggingID).Height - 1), __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), B + END IF + + 'Hover detection + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).ID THEN + IF __UI_Controls(i).ParentID THEN + ContainerOffsetTop = __UI_Controls(__UI_Controls(i).ParentID).Top + ContainerOffsetLeft = __UI_Controls(__UI_Controls(i).ParentID).Left + ELSE + ContainerOffsetTop = 0 + ContainerOffsetLeft = 0 + END IF + + IF __UI_MouseX >= ContainerOffsetLeft + __UI_Controls(i).Left AND _ + __UI_MouseX <= ContainerOffsetLeft + __UI_Controls(i).Left + __UI_Controls(i).Width - 1 AND _ + __UI_MouseY >= ContainerOffsetTop + __UI_Controls(i).Top AND _ + __UI_MouseY <= ContainerOffsetTop + __UI_Controls(i).Top + __UI_Controls(i).Height - 1 THEN __UI_HoveringID = i END IF END IF NEXT - 'Mouse cursor - IF __UI_HoveringID THEN - IF __UI_Objects(__UI_HoveringID).CanDrag THEN - glutSetCursor 5 - ELSE - glutSetCursor 0 - END IF - END IF + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).ID THEN + IF __UI_Controls(i).Font THEN + _FONT __UI_Fonts(__UI_Controls(i).Font) + ELSE + 'First font in __UI_Fonts is used as default + _FONT __UI_Fonts(1) + END IF - FOR i = 1 TO UBOUND(__UI_Objects) - IF __UI_Objects(i).ID THEN TempCaption$ = __UI_Captions(i) - DO WHILE _PRINTWIDTH(TempCaption$) > __UI_Objects(i).Width + DO WHILE _PRINTWIDTH(TempCaption$) > __UI_Controls(i).Width TempCaption$ = MID$(TempCaption$, 1, LEN(TempCaption$) - 1) LOOP - IF i = __UI_HoveringID AND __UI_Objects(i).Enabled THEN - TempColor~& = __UI_Darken(__UI_Objects(__UI_GetID("Form1")).BackColor, 80) + IF __UI_Controls(i).ParentID THEN + ContainerOffsetTop = __UI_Controls(__UI_Controls(i).ParentID).Top + ContainerOffsetLeft = __UI_Controls(__UI_Controls(i).ParentID).Left ELSE - TempColor~& = __UI_Objects(__UI_GetID("Form1")).BackColor + ContainerOffsetTop = 0 + ContainerOffsetLeft = 0 END IF - SELECT CASE __UI_Objects(i).Type + SELECT CASE __UI_Controls(i).Type CASE __UI_Type_Button - LINE (__UI_Objects(i).Left, __UI_Objects(i).Top)-STEP(__UI_Objects(i).Width - 1, __UI_Objects(i).Height - 1), TempColor~&, BF - - LINE (__UI_Objects(i).Left, __UI_Objects(i).Top)-STEP(__UI_Objects(i).Width - 1, __UI_Objects(i).Height - 1), __UI_Objects(i).ForeColor, B - - IF __UI_Objects(i).Enabled THEN - COLOR __UI_Objects(i).ForeColor, TempColor~& + IF ((__UI_MouseIsDown AND i = __UI_MouseDownOnID) OR _ + (__UI_KeyIsDown AND i = __UI_KeyDownOnID)) AND _ + __UI_Controls(i).Enabled THEN + TempColor~& = __UI_Darken(__UI_Controls(i).BackColor, 70) + ELSEIF i = __UI_HoveringID AND __UI_Controls(i).Enabled THEN + TempColor~& = __UI_Darken(__UI_Controls(i).BackColor, 90) + ELSEIF __UI_Controls(i).Enabled = __UI_False THEN + TempColor~& = _RGB32(208, 213, 216) ELSE - COLOR __UI_Darken(__UI_Objects(__UI_GetID("Form1")).BackColor, 80), TempColor~& + TempColor~& = __UI_Controls(i).BackColor + END IF + + IF ((__UI_HoveringID = i OR __UI_Focus = i) AND _ + __UI_Controls(i).Enabled AND __UI_MouseDownOnID <> i AND _ + __UI_KeyDownOnID <> i) OR _ + (__UI_DefaultButtonID = i AND __UI_Controls(__UI_Focus).Type <> __UI_Type_Button) THEN + __UI_DrawRectangle __UI_Controls(i).Left + 2, __UI_Controls(i).Top + 2, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 50), __UI_True + END IF + + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_True + + IF __UI_Controls(i).Enabled THEN + COLOR __UI_Controls(i).ForeColor, TempColor~& + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), TempColor~& END IF _PRINTMODE _FILLBACKGROUND - _PRINTSTRING (__UI_Objects(i).Left + (__UI_Objects(i).Width \ 2 - _PRINTWIDTH(TempCaption$) \ 2), __UI_Objects(i).Top + ((__UI_Objects(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + (__UI_Controls(i).Width \ 2 - _PRINTWIDTH(TempCaption$) \ 2), ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ CASE __UI_Type_Label - IF __UI_Objects(i).BackStyle = __UI_Opaque THEN - _PRINTMODE _KEEPBACKGROUND - LINE (__UI_Objects(i).Left, __UI_Objects(i).Top)-STEP(__UI_Objects(i).Width - 1, __UI_Objects(i).Height - 1), __UI_Objects(i).BackColor, BF - ELSE + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN _PRINTMODE _FILLBACKGROUND - END IF - - IF __UI_Objects(i).BorderStyle = __UI_True THEN - LINE (__UI_Objects(i).Left, __UI_Objects(i).Top)-STEP(__UI_Objects(i).Width - 1, __UI_Objects(i).Height - 1), __UI_Objects(i).BorderColor, B - END IF - - IF __UI_Objects(i).Enabled THEN - COLOR __UI_Objects(i).ForeColor ELSE - COLOR __UI_Darken(__UI_Objects(__UI_GetID("Form1")).BackColor, 80) + _PRINTMODE _KEEPBACKGROUND END IF - _PRINTSTRING (__UI_Objects(i).Left + (__UI_Objects(i).Width \ 2 - _PRINTWIDTH(TempCaption$) \ 2), __UI_Objects(i).Top + ((__UI_Objects(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + CaptionIndent = 0 + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BackColor, __UI_Controls(i).BackColor, __UI_True + END IF + + IF __UI_Controls(i).HasBorder = __UI_True THEN + CaptionIndent = 5 + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_False + END IF + + IF __UI_Controls(i).Enabled THEN + COLOR __UI_Controls(i).ForeColor, __UI_Controls(i).BackColor + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), __UI_Controls(i).BackColor + END IF + + SELECT CASE __UI_Controls(i).Align + CASE __UI_Left + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + CASE __UI_Center + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + (__UI_Controls(i).Width \ 2 - _PRINTWIDTH(TempCaption$) \ 2), ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + CASE __UI_Right + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + (__UI_Controls(i).Width - _PRINTWIDTH(TempCaption$)) - CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + END SELECT + CASE __UI_Type_Frame + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + _PRINTMODE _FILLBACKGROUND + ELSE + _PRINTMODE _KEEPBACKGROUND + END IF + + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + __UI_DrawRectangle __UI_Controls(i).Left, __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BackColor, __UI_Controls(i).BackColor, __UI_True + END IF + + CaptionIndent = 0 + IF __UI_Controls(i).HasBorder = __UI_True THEN + CaptionIndent = 5 + __UI_DrawRectangle __UI_Controls(i).Left, __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_False + END IF + + IF __UI_Controls(i).Enabled THEN + COLOR __UI_Controls(i).ForeColor, __UI_Controls(i).BackColor + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), __UI_Controls(i).BackColor + END IF + + SELECT CASE __UI_Controls(i).Align + CASE __UI_Left + _PRINTSTRING (__UI_Controls(i).Left + CaptionIndent, __UI_Controls(i).Top - _FONTHEIGHT \ 2), TempCaption$ + CASE __UI_Center + _PRINTSTRING (__UI_Controls(i).Left + (__UI_Controls(i).Width \ 2 - _PRINTWIDTH(TempCaption$) \ 2), __UI_Controls(i).Top - _FONTHEIGHT \ 2), TempCaption$ + CASE __UI_Right + _PRINTSTRING (__UI_Controls(i).Left + (__UI_Controls(i).Width - _PRINTWIDTH(TempCaption$)) - CaptionIndent, __UI_Controls(i).Top - _FONTHEIGHT \ 2), TempCaption$ + END SELECT + CASE __UI_Type_RadioButton + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + _PRINTMODE _FILLBACKGROUND + ELSE + _PRINTMODE _KEEPBACKGROUND + END IF + + DIM CircleDiameter AS INTEGER + __UI_DrawRadioButton __UI_Controls(i).Value, _ + ContainerOffsetLeft + __UI_Controls(i).Left, _ + ContainerOffsetTop + __UI_Controls(i).Top + __UI_Controls(i).Height \ 2, _ + CircleDiameter + + CaptionIndent = 0 + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BackColor, __UI_Controls(i).BackColor, __UI_True + END IF + + IF __UI_Controls(i).HasBorder = __UI_True THEN + CaptionIndent = 5 + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_False + END IF + + CaptionIndent = CaptionIndent + CircleDiameter + + IF __UI_Controls(i).Enabled THEN + COLOR __UI_Controls(i).ForeColor, __UI_Controls(i).BackColor + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), __UI_Controls(i).BackColor + END IF + + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + IF __UI_Focus = i THEN + LINE (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent - 2, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2) - 2)-STEP(_PRINTWIDTH(TempCaption$) + 4, _FONTHEIGHT + 4), __UI_Darken(__UI_Controls(i).BackColor, 70), B , 63 + END IF + CASE __UI_Type_CheckBox + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + _PRINTMODE _FILLBACKGROUND + ELSE + _PRINTMODE _KEEPBACKGROUND + END IF + + DIM CheckBoxSize AS INTEGER + __UI_DrawCheckBox __UI_Controls(i).Value, _ + ContainerOffsetLeft + __UI_Controls(i).Left, _ + ContainerOffsetTop + __UI_Controls(i).Top + __UI_Controls(i).Height \ 3, _ + CheckBoxSize + + CaptionIndent = 0 + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BackColor, __UI_Controls(i).BackColor, __UI_True + END IF + + IF __UI_Controls(i).HasBorder = __UI_True THEN + CaptionIndent = 5 + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_False + END IF + + CaptionIndent = CaptionIndent + CheckBoxSize + + IF __UI_Controls(i).Enabled THEN + COLOR __UI_Controls(i).ForeColor, __UI_Controls(i).BackColor + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), __UI_Controls(i).BackColor + END IF + + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + IF __UI_Focus = i THEN + LINE (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent - 2, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2) - 2)-STEP(_PRINTWIDTH(TempCaption$) + 4, _FONTHEIGHT + 4), __UI_Darken(__UI_Controls(i).BackColor, 70), B , 63 + END IF + CASE __UI_Type_TextBox + IF __UI_Controls(i).InputViewStart = 0 THEN __UI_Controls(i).InputViewStart = 1 + + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + _PRINTMODE _FILLBACKGROUND + ELSE + _PRINTMODE _KEEPBACKGROUND + END IF + + IF (__UI_HoveringID = i OR __UI_Focus = i) AND _ + __UI_Controls(i).Enabled THEN + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left + 2, ContainerOffsetTop + __UI_Controls(i).Top + 2, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 50), __UI_True + END IF + + CaptionIndent = 0 + IF __UI_Controls(i).BackStyle = __UI_Opaque THEN + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BackColor, __UI_Controls(i).BackColor, __UI_True + END IF + + IF __UI_Controls(i).HasBorder = __UI_True THEN + CaptionIndent = 5 + __UI_DrawRectangle ContainerOffsetLeft + __UI_Controls(i).Left, ContainerOffsetTop + __UI_Controls(i).Top, __UI_Controls(i).Width, __UI_Controls(i).Height, __UI_Controls(i).BorderColor, TempColor~&, __UI_False + END IF + + IF __UI_Controls(i).Enabled AND LEN(__UI_Texts(i)) THEN + COLOR __UI_Controls(i).ForeColor, __UI_Controls(i).BackColor + ELSE + COLOR __UI_Darken(__UI_Controls(__UI_GetID("Form1")).BackColor, 80), __UI_Controls(i).BackColor + END IF + + IF LEN(__UI_Texts(i)) THEN + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), MID$(__UI_Texts(i), __UI_Controls(i).InputViewStart, __UI_Controls(i).FieldArea) + ELSE + _PRINTSTRING (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2)), TempCaption$ + END IF + + IF __UI_Controls(i).Selected THEN + DIM s1 AS LONG, s2 AS LONG + DIM ss1 AS LONG, ss2 AS LONG + s1 = __UI_Controls(i).SelectionStart + s2 = __UI_Controls(i).Cursor + IF s1 > s2 THEN + SWAP s1, s2 + IF __UI_Controls(i).InputViewStart > 1 THEN + ss1 = s1 - __UI_Controls(i).InputViewStart + 1 + ELSE + ss1 = s1 + END IF + ss2 = s2 - s1 + IF ss1 + ss2 > __UI_Controls(__UI_Focus).FieldArea THEN ss2 = __UI_Controls(__UI_Focus).FieldArea - ss1 + ELSE + ss1 = s1 + ss2 = s2 - s1 + IF ss1 < __UI_Controls(i).InputViewStart THEN ss1 = 0: ss2 = s2 - __UI_Controls(i).InputViewStart + 1 + IF ss1 > __UI_Controls(i).InputViewStart THEN ss1 = ss1 - __UI_Controls(i).InputViewStart + 1: ss2 = s2 - s1 + END IF + __UI_SelectedText = MID$(__UI_Texts(i), s1 + 1, s2 - s1) + + LINE (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent + ss1 * _FONTWIDTH, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2))-STEP(ss2 * _FONTWIDTH, _FONTHEIGHT), _RGBA32(0, 0, 0, 50), BF + END IF + + IF __UI_Focus = i THEN + STATIC SetCursor#, cursorBlink%% + IF TIMER - SetCursor# > .4 THEN + SetCursor# = TIMER + cursorBlink%% = NOT cursorBlink%% + END IF + IF cursorBlink%% THEN + LINE (ContainerOffsetLeft + __UI_Controls(i).Left + CaptionIndent + (__UI_Controls(i).Cursor - (__UI_Controls(i).InputViewStart - 1)) * _FONTWIDTH, ContainerOffsetTop + __UI_Controls(i).Top + ((__UI_Controls(i).Height \ 2) - _FONTHEIGHT \ 2))-STEP(0, _FONTHEIGHT), _RGB32(0, 0, 0) + END IF + END IF END SELECT END IF NEXT - __UI_EventDispatcher - _DISPLAY END SUB +'--------------------------------------------------------------------------------- +FUNCTION __UI_Darken~& (WhichColor~&, ByHowMuch%) + __UI_Darken~& = _RGB32(_RED(WhichColor~&) * (ByHowMuch% / 100), _GREEN(WhichColor~&) * (ByHowMuch% / 100), _BLUE(WhichColor~&) * (ByHowMuch% / 100)) +END FUNCTION + +SUB __UI_DrawRectangle (x1 AS SINGLE, y1 AS SINGLE, Width&, Height&, BorderColor~&, BackColor~&, Fill%%) + 'Rounded rectangles code adapted from stylin + '(http://www.qb64.net/forum/index.php?topic=4168.msg42352#msg42352) + 'Rounded rectangles filling code provided courtesy of ___vincent + + DIM x2 AS SINGLE, y2 AS SINGLE + DIM radius AS SINGLE, ul_radius AS SINGLE, ur_radius AS SINGLE + DIM a AS SINGLE, b AS SINGLE, e AS SINGLE + DIM ll_radius AS SINGLE, lr_radius AS SINGLE + + radius = 5 + ul_radius = radius + ur_radius = radius + ll_radius = radius + lr_radius = radius + + x2 = x1 + Width& - 1 + y2 = y1 + Height& - 1 + + IF (x2 < x1) THEN SWAP x1, x2 + IF (y2 < y1) THEN SWAP y1, y2 + + DIM w AS SINGLE: w = x2 - x1 + 1 + DIM h AS SINGLE: h = y2 - y1 + 1 + + IF Fill%% THEN + LINE (x1, y1 + radius)-(x2, y2 - radius), BackColor~&, BF + + a = radius + b = 0 + e = -a + + DO WHILE a >= b + LINE (x1 + radius - b, y1 + radius - a)-(x2 - radius + b, y1 + radius - a), BackColor~&, BF + LINE (x1 + radius - a, y1 + radius - b)-(x2 - radius + a, y1 + radius - b), BackColor~&, BF + LINE (x1 + radius - b, y2 - radius + a)-(x2 - radius + b, y2 - radius + a), BackColor~&, BF + LINE (x1 + radius - a, y2 - radius + b)-(x2 - radius + a, y2 - radius + b), BackColor~&, BF + + b = b + 1 + e = e + b + b + IF e > 0 THEN + a = a - 1 + e = e - a - a + END IF + LOOP + END IF + + ' Top. + LINE (x1 + ul_radius - 1, y1)-(x2 - ur_radius + 1, y1), BorderColor~& + ' Bottom. + LINE (x1 + ll_radius - 1, y2)-(x2 - lr_radius + 1, y2), BorderColor~& + ' Left. + LINE (x1, y1 + ul_radius - 1)-(x1, y2 - ll_radius + 1), BorderColor~& + ' Right. + LINE (x2, y1 + ur_radius - 1)-(x2, y2 - lr_radius + 1), BorderColor~& + + ' Upper-left. + CIRCLE (x1 + ul_radius, y1 + ul_radius), ul_radius, BorderColor~&, _PI * 0.5, _PI, 1 + ' Upper-right. + CIRCLE (x2 - ur_radius, y1 + ur_radius), ur_radius, BorderColor~&, 0.0, _PI * 0.5, 1 + ' Lower-left. + CIRCLE (x1 + ll_radius, y2 - ll_radius), ll_radius, BorderColor~&, _PI, _PI * 1.5, 1 + ' Lower-right. + CIRCLE (x2 - lr_radius, y2 - lr_radius), lr_radius, BorderColor~&, _PI * 1.5, 0.0, 1 +END SUB + SUB __UI_EventDispatcher - STATIC __UI_MouseIsDown AS _BYTE, __UI_MouseDownOnID AS LONG - STATIC __UI_LastMouseClick AS DOUBLE STATIC __UI_LastHoveringID AS LONG - STATIC __UI_DragX AS INTEGER, __UI_DragY AS INTEGER - STATIC __UI_IsDragging AS _BYTE + DIM i AS LONG IF __UI_HoveringID = 0 THEN EXIT SUB + $IF WIN THEN + 'Alt+F4 - Windows + IF ((_KEYDOWN(100308) OR _KEYDOWN(100307)) AND __UI_KeyHit = -15872) OR __UI_ExitTriggered THEN + __UI_UnloadSignal = __UI_True + __UI_BeforeUnload + IF __UI_UnloadSignal THEN SYSTEM + END IF + $ELSE + IF __UI_ExitTriggered THEN + __UI_UnloadSignal = __UI_True + __UI_BeforeUnload + IF __UI_UnloadSignal THEN SYSTEM + END IF + $END IF + + 'MouseEnter, MouseLeave IF __UI_LastHoveringID <> __UI_HoveringID THEN IF __UI_LastHoveringID THEN __UI_MouseLeave __UI_LastHoveringID __UI_MouseEnter __UI_HoveringID END IF + IF __UI_Controls(__UI_HoveringID).CanDrag THEN _MOUSESHOW "link" ELSE _MOUSESHOW "default" + + 'FocusIn, FocusOut + IF __UI_KeyHit = 9 AND __UI_IsDragging = __UI_False THEN 'TAB + DIM __UI_FocusSearch AS LONG + __UI_FocusSearch = __UI_Focus + DO + IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN + __UI_FocusSearch = (__UI_FocusSearch + UBOUND(__UI_Controls) - 2) MOD UBOUND(__UI_Controls) + 1 + ELSE + __UI_FocusSearch = __UI_FocusSearch MOD UBOUND(__UI_Controls) + 1 + END IF + IF __UI_FocusSearch = __UI_Focus THEN + 'Full circle. No objects can have focus + EXIT DO + END IF + + IF __UI_Controls(__UI_FocusSearch).CanHaveFocus AND __UI_Controls(__UI_FocusSearch).Enabled THEN + IF __UI_Focus THEN __UI_FocusOut __UI_Focus + __UI_Focus = __UI_FocusSearch + __UI_FocusIn __UI_Focus + EXIT DO + END IF + LOOP + END IF + + 'MouseDown, MouseUp, BeginDrag IF __UI_MouseButton1 THEN IF __UI_MouseIsDown = __UI_False THEN + IF __UI_Controls(__UI_HoveringID).CanHaveFocus AND __UI_Controls(__UI_HoveringID).Enabled THEN __UI_Focus = __UI_HoveringID __UI_MouseIsDown = __UI_True __UI_MouseDownOnID = __UI_HoveringID - IF __UI_Objects(__UI_HoveringID).CanDrag THEN + IF __UI_Controls(__UI_HoveringID).CanDrag THEN IF __UI_IsDragging = __UI_False THEN - __UI_IsDragging = -1 + __UI_IsDragging = __UI_True + __UI_DraggingID = __UI_HoveringID + __UI_BeginDrag __UI_DraggingID __UI_DragY = __UI_MouseY __UI_DragX = __UI_MouseX END IF + ELSEIF __UI_Controls(__UI_HoveringID).Type = __UI_Type_TextBox THEN + _FONT __UI_Fonts(__UI_Controls(__UI_HoveringID).Font) + IF NOT __UI_Controls(__UI_HoveringID).Selected THEN + __UI_Controls(__UI_HoveringID).Selected = __UI_True + __UI_Controls(__UI_HoveringID).SelectionStart = ((__UI_MouseX - __UI_Controls(__UI_HoveringID).Left) / _FONTWIDTH) + (__UI_Controls(__UI_HoveringID).InputViewStart - 1) + __UI_Controls(__UI_HoveringID).Cursor = __UI_Controls(__UI_HoveringID).SelectionStart + ELSE + __UI_Controls(__UI_HoveringID).Cursor = ((__UI_MouseX - __UI_Controls(__UI_HoveringID).Left) / _FONTWIDTH) + (__UI_Controls(__UI_HoveringID).InputViewStart - 1) + IF __UI_Controls(__UI_HoveringID).Cursor = __UI_Controls(__UI_HoveringID).SelectionStart THEN + __UI_Controls(__UI_HoveringID).Selected = __UI_False + END IF + END IF END IF __UI_MouseDown __UI_HoveringID ELSE - __UI_MouseIsDown = __UI_True IF __UI_MouseDownOnID <> __UI_HoveringID AND __UI_MouseDownOnID > 0 THEN - __UI_MouseUp __UI_MouseDownOnID - ELSEIF __UI_MouseDownOnID = __UI_HoveringID THEN - __UI_MouseDown __UI_MouseDownOnID + __UI_MouseDownOnID = 0 END IF END IF ELSE IF __UI_MouseIsDown THEN - __UI_IsDragging = 0 + IF __UI_IsDragging THEN + __UI_EndDrag __UI_DraggingID + __UI_IsDragging = __UI_False + 'Snap the previously dragged object to the grid (unless Ctrl is down): + __UI_Controls(__UI_DraggingID).Top = __UI_PreviewTop + __UI_Controls(__UI_DraggingID).Left = __UI_PreviewLeft + __UI_DraggingID = 0 + END IF + + 'Click + IF TIMER - __UI_LastMouseClick > .2 THEN + IF __UI_MouseDownOnID = __UI_HoveringID AND __UI_HoveringID > 0 THEN + IF __UI_Controls(__UI_HoveringID).Enabled THEN + SELECT CASE __UI_Controls(__UI_HoveringID).Type + CASE __UI_Type_RadioButton + __UI_SetRadioButtonValue __UI_HoveringID + CASE __UI_Type_CheckBox + __UI_Controls(__UI_HoveringID).Value = NOT __UI_Controls(__UI_HoveringID).Value + CASE __UI_Type_TextBox + _FONT __UI_Fonts(__UI_Controls(__UI_HoveringID).Font) + __UI_Controls(__UI_HoveringID).Cursor = ((__UI_MouseX - __UI_Controls(__UI_HoveringID).Left) / _FONTWIDTH) + (__UI_Controls(__UI_HoveringID).InputViewStart - 1) + IF __UI_Controls(__UI_HoveringID).Cursor > LEN(__UI_Texts(__UI_HoveringID)) THEN __UI_Controls(__UI_HoveringID).Cursor = LEN(__UI_Texts(__UI_HoveringID)) + IF __UI_Controls(__UI_HoveringID).SelectionStart = __UI_Controls(__UI_HoveringID).Cursor THEN + __UI_Controls(__UI_HoveringID).Selected = __UI_False + END IF + END SELECT + __UI_Click __UI_HoveringID + __UI_LastMouseClick = TIMER + __UI_MouseDownOnID = 0 + END IF + END IF + END IF + __UI_MouseIsDown = __UI_False __UI_MouseUp __UI_HoveringID END IF END IF - IF __UI_MouseIsDown = __UI_False AND TIMER - __UI_LastMouseClick > .2 THEN - IF __UI_MouseDownOnID = __UI_HoveringID AND __UI_HoveringID > 0 THEN - IF __UI_Objects(__UI_HoveringID).Enabled THEN - __UI_Click __UI_HoveringID - __UI_LastMouseClick = TIMER - __UI_MouseDownOnID = 0 + 'Drag update + IF __UI_IsDragging AND __UI_DraggingID > 0 THEN + __UI_Controls(__UI_DraggingID).Top = __UI_Controls(__UI_DraggingID).Top + (__UI_MouseY - __UI_DragY) + __UI_DragY = __UI_MouseY + + __UI_Controls(__UI_DraggingID).Left = __UI_Controls(__UI_DraggingID).Left + (__UI_MouseX - __UI_DragX) + __UI_DragX = __UI_MouseX + + 'Draw preview rectangle to show where the object will be snapped + '(Ctrl overrides snapping): + IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN + __UI_PreviewTop = __UI_Controls(__UI_DraggingID).Top + __UI_PreviewLeft = __UI_Controls(__UI_DraggingID).Left + ELSE + __UI_PreviewTop = __UI_Controls(__UI_DraggingID).Top + DO UNTIL __UI_PreviewTop MOD 10 = 0 + __UI_PreviewTop = __UI_PreviewTop - 1 + LOOP + IF ABS(__UI_PreviewTop - __UI_Controls(__UI_DraggingID).Top) > 5 THEN + __UI_PreviewTop = __UI_Controls(__UI_DraggingID).Top + DO UNTIL __UI_PreviewTop MOD 10 = 0 + __UI_PreviewTop = __UI_PreviewTop + 1 + LOOP + END IF + __UI_PreviewLeft = __UI_Controls(__UI_DraggingID).Left + DO UNTIL __UI_PreviewLeft MOD 10 = 0 + __UI_PreviewLeft = __UI_PreviewLeft - 1 + LOOP + IF ABS(__UI_PreviewLeft - __UI_Controls(__UI_DraggingID).Left) > 5 THEN + __UI_PreviewLeft = __UI_Controls(__UI_DraggingID).Left + DO UNTIL __UI_PreviewLeft MOD 10 = 0 + __UI_PreviewLeft = __UI_PreviewLeft + 1 + LOOP END IF END IF END IF - IF __UI_IsDragging THEN - __UI_Objects(__UI_MouseDownOnID).Top = __UI_Objects(__UI_MouseDownOnID).Top + (__UI_MouseY - __UI_DragY) - __UI_Objects(__UI_MouseDownOnID).Left = __UI_Objects(__UI_MouseDownOnID).Left + (__UI_MouseX - __UI_DragX) + 'Keyboard handler + IF __UI_KeyHit = 100303 OR __UI_KeyHit = 100304 THEN __UI_ShiftIsDown = __UI_True + IF __UI_KeyHit = -100303 OR __UI_KeyHit = -100304 THEN __UI_ShiftIsDown = __UI_False + IF __UI_KeyHit = 100305 OR __UI_KeyHit = 100306 THEN __UI_CtrlIsDown = __UI_True + IF __UI_KeyHit = -100305 OR __UI_KeyHit = -100306 THEN __UI_CtrlIsDown = __UI_False + IF __UI_KeyHit = 100307 OR __UI_KeyHit = 100308 THEN __UI_AltIsDown = __UI_True + IF __UI_KeyHit = -100307 OR __UI_KeyHit = -100308 THEN __UI_AltIsDown = __UI_False + + IF __UI_Focus THEN + 'Enter activates the default button, if any + IF __UI_IsDragging = __UI_False AND _ + __UI_KeyHit = -13 AND _ + __UI_DefaultButtonID > 0 AND _ + __UI_Controls(__UI_Focus).Type <> __UI_Type_MultiLineTextBox AND _ + __UI_Controls(__UI_Focus).Type <> __UI_Type_Button THEN + 'Enter released and there is a default button + __UI_Click __UI_DefaultButtonID + ELSE + SELECT CASE __UI_Controls(__UI_Focus).Type + CASE __UI_Type_Button, __UI_Type_RadioButton, __UI_Type_CheckBox + 'Emulate mouse down/click + IF __UI_IsDragging = __UI_False AND _ + __UI_KeyHit = 32 AND _ + __UI_Controls(__UI_Focus).Enabled THEN + 'Space bar down on a button + IF __UI_KeyIsDown = __UI_False AND __UI_KeyDownOnID = 0 THEN + __UI_KeyDownOnID = __UI_Focus + __UI_KeyIsDown = __UI_True + END IF + ELSEIF __UI_IsDragging = __UI_False AND _ + __UI_KeyHit = -32 AND _ + __UI_Controls(__UI_Focus).Enabled THEN + 'Space bar released and a button has focus + IF __UI_KeyIsDown AND __UI_Focus = __UI_KeyDownOnID THEN + IF __UI_Controls(__UI_KeyDownOnID).Type = __UI_Type_RadioButton THEN + __UI_SetRadioButtonValue __UI_KeyDownOnID + ELSEIF __UI_Controls(__UI_KeyDownOnID).Type = __UI_Type_CheckBox THEN + __UI_Controls(__UI_KeyDownOnID).Value = NOT __UI_Controls(__UI_KeyDownOnID).Value + END IF + __UI_Click __UI_Focus + END IF + __UI_KeyDownOnID = 0 + __UI_KeyIsDown = __UI_False + END IF + CASE __UI_Type_TextBox + DIM Clip$, FindLF% + DIM s1 AS LONG, s2 AS LONG + SELECT CASE __UI_KeyHit + CASE 32 TO 126 'Printable ASCII characters + IF __UI_KeyHit = ASC("v") OR __UI_KeyHit = ASC("V") THEN 'Paste from clipboard (Ctrl+V) + IF __UI_CtrlIsDown THEN + Clip$ = _CLIPBOARD$ + FindLF% = INSTR(Clip$, CHR$(13)) + IF FindLF% > 0 THEN Clip$ = LEFT$(Clip$, FindLF% - 1) + FindLF% = INSTR(Clip$, CHR$(10)) + IF FindLF% > 0 THEN Clip$ = LEFT$(Clip$, FindLF% - 1) + IF LEN(RTRIM$(LTRIM$(Clip$))) > 0 THEN + IF NOT __UI_Controls(__UI_Focus).Selected THEN + IF __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) THEN + __UI_Texts(__UI_Focus) = __UI_Texts(__UI_Focus) + Clip$ + __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) + ELSE + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor) + Clip$ + MID$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor + 1) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor + LEN(Clip$) + END IF + ELSE + s1 = __UI_Controls(__UI_Focus).SelectionStart + s2 = __UI_Controls(__UI_Focus).Cursor + IF s1 > s2 THEN SWAP s1, s2 + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), s1) + Clip$ + MID$(__UI_Texts(__UI_Focus), s2 + 1) + __UI_Controls(__UI_Focus).Cursor = s1 + LEN(Clip$) + __UI_Controls(__UI_Focus).Selected = __UI_False + END IF + END IF + __UI_KeyHit = 0 + END IF + ELSEIF __UI_KeyHit = ASC("c") OR __UI_KeyHit = ASC("C") THEN 'Copy selection to clipboard (Ctrl+C) + IF __UI_CtrlIsDown THEN + _CLIPBOARD$ = __UI_SelectedText + __UI_KeyHit = 0 + END IF + ELSEIF __UI_KeyHit = ASC("x") OR __UI_KeyHit = ASC("X") THEN 'Cut selection to clipboard (Ctrl+X) + IF __UI_CtrlIsDown THEN + _CLIPBOARD$ = __UI_SelectedText + __UI_DeleteSelection + __UI_KeyHit = 0 + END IF + ELSEIF __UI_KeyHit = ASC("a") OR __UI_KeyHit = ASC("A") THEN 'Select all text (Ctrl+A) + IF __UI_CtrlIsDown THEN + __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) + __UI_Controls(__UI_Focus).SelectionStart = 0 + __UI_Controls(__UI_Focus).Selected = __UI_True + __UI_KeyHit = 0 + END IF + END IF + + IF __UI_KeyHit THEN + IF NOT __UI_Controls(__UI_Focus).Selected THEN + IF __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) THEN + __UI_Texts(__UI_Focus) = __UI_Texts(__UI_Focus) + CHR$(__UI_KeyHit) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor + 1 + ELSE + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor) + CHR$(__UI_KeyHit) + MID$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor + 1) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor + 1 + END IF + ELSE + END IF + END IF + CASE 8 'Backspace + IF LEN(__UI_Texts(__UI_Focus)) > 0 THEN + IF NOT __UI_Controls(__UI_Focus).Selected THEN + IF __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) THEN + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), LEN(__UI_Texts(__UI_Focus)) - 1) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor - 1 + ELSEIF __UI_Controls(__UI_Focus).Cursor > 1 THEN + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor - 1) + MID$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor + 1) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor - 1 + ELSEIF __UI_Controls(__UI_Focus).Cursor = 1 THEN + __UI_Texts(__UI_Focus) = RIGHT$(__UI_Texts(__UI_Focus), LEN(__UI_Texts(__UI_Focus)) - 1) + __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor - 1 + END IF + ELSE + __UI_DeleteSelection + END IF + END IF + CASE 21248 'Delete + IF NOT __UI_Controls(__UI_Focus).Selected THEN + IF LEN(__UI_Texts(__UI_Focus)) > 0 THEN + IF __UI_Controls(__UI_Focus).Cursor = 0 THEN + __UI_Texts(__UI_Focus) = RIGHT$(__UI_Texts(__UI_Focus), LEN(__UI_Texts(__UI_Focus)) - 1) + ELSEIF __UI_Controls(__UI_Focus).Cursor > 0 AND __UI_Controls(__UI_Focus).Cursor <= LEN(__UI_Texts(__UI_Focus)) - 1 THEN + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor) + MID$(__UI_Texts(__UI_Focus), __UI_Controls(__UI_Focus).Cursor + 2) + END IF + END IF + ELSE + __UI_DeleteSelection + END IF + CASE 19200 'Left arrow key + __UI_CheckSelection __UI_Focus + IF __UI_Controls(__UI_Focus).Cursor > 0 THEN __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor - 1 + CASE 19712 'Right arrow key + __UI_CheckSelection __UI_Focus + IF __UI_Controls(__UI_Focus).Cursor < LEN(__UI_Texts(__UI_Focus)) THEN __UI_Controls(__UI_Focus).Cursor = __UI_Controls(__UI_Focus).Cursor + 1 + CASE 18176 'Home + __UI_CheckSelection __UI_Focus + __UI_Controls(__UI_Focus).Cursor = 0 + CASE 20224 'End + __UI_CheckSelection __UI_Focus + __UI_Controls(__UI_Focus).Cursor = LEN(__UI_Texts(__UI_Focus)) + END SELECT + + __UI_CursorAdjustments + END SELECT + END IF + ELSE + 'Enter activates the default button, if any + IF __UI_IsDragging = __UI_False AND _ + __UI_KeyHit = -13 AND _ + __UI_DefaultButtonID > 0 THEN + 'Enter released and there is a default button + __UI_Click __UI_DefaultButtonID + END IF END IF __UI_LastHoveringID = __UI_HoveringID END SUB +'--------------------------------------------------------------------------------- +SUB __UI_CheckSelection (id) + IF __UI_ShiftIsDown THEN + IF NOT __UI_Controls(id).Selected THEN + __UI_Controls(id).Selected = __UI_True + __UI_Controls(id).SelectionStart = __UI_Controls(id).Cursor + END IF + ELSE + __UI_Controls(id).Selected = __UI_False + END IF +END SUB + '--------------------------------------------------------------------------------- FUNCTION __UI_GetID (ObjectName$) DIM i AS LONG - FOR i = 1 TO UBOUND(__UI_Objects) - IF __UI_Objects(i).ID > 0 AND UCASE$(RTRIM$(__UI_Objects(i).Name)) = UCASE$(ObjectName$) THEN + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).ID > 0 AND UCASE$(RTRIM$(__UI_Controls(i).Name)) = UCASE$(ObjectName$) THEN __UI_GetID = i EXIT FUNCTION END IF @@ -452,32 +1274,38 @@ FUNCTION __UI_GetID (ObjectName$) END FUNCTION '--------------------------------------------------------------------------------- -FUNCTION __UI_NewObject (ObjType AS INTEGER, ParentID AS LONG) +FUNCTION __UI_NewObject (ObjType AS INTEGER, ObjName AS STRING, ParentID AS LONG) DIM NextSlot AS LONG, i AS LONG IF ObjType = __UI_Type_Form THEN 'Make sure no other Form object exists, as Form is the main window - FOR i = 1 TO UBOUND(__UI_Objects) - IF __UI_Objects(i).Type = __UI_Type_Form THEN ERROR 5: EXIT FUNCTION + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).Type = __UI_Type_Form THEN ERROR 5: EXIT FUNCTION NEXT END IF - 'Find an empty slot for the new object - FOR NextSlot = 1 TO UBOUND(__UI_Objects) - IF __UI_Objects(NextSlot).ID = __UI_False THEN EXIT FOR + 'Make sure this ObjName is unique: + FOR i = 1 TO UBOUND(__UI_Controls) + IF UCASE$(RTRIM$(__UI_Controls(i).Name)) = UCASE$(RTRIM$(ObjName)) THEN ERROR 5: EXIT FUNCTION NEXT - IF NextSlot > UBOUND(__UI_Objects) THEN - 'No empty slots. We must increase __UI_Objects() and its helper arrays - REDIM _PRESERVE __UI_Objects(1 TO NextSlot + 99) AS ObjectTYPE + 'Find an empty slot for the new object + FOR NextSlot = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(NextSlot).ID = __UI_False THEN EXIT FOR + NEXT + + IF NextSlot > UBOUND(__UI_Controls) THEN + 'No empty slots. We must increase __UI_Controls() and its helper arrays + REDIM _PRESERVE __UI_Controls(0 TO NextSlot + 99) AS ObjectTYPE REDIM _PRESERVE __UI_Captions(1 TO NextSlot + 99) AS STRING REDIM _PRESERVE __UI_Texts(1 TO NextSlot + 99) AS STRING END IF - '__UI_DestroyObject __UI_Objects(NextSlot) - __UI_Objects(NextSlot).ID = NextSlot - __UI_Objects(NextSlot).ParentID = ParentID - __UI_Objects(NextSlot).Type = ObjType + '__UI_DestroyObject __UI_Controls(NextSlot) + __UI_Controls(NextSlot).ID = NextSlot + __UI_Controls(NextSlot).ParentID = ParentID + __UI_Controls(NextSlot).Type = ObjType + __UI_Controls(NextSlot).Name = ObjName __UI_NewObject = NextSlot END FUNCTION @@ -512,85 +1340,85 @@ END FUNCTION ' __UI_EmptyObject.Event.KeyHit = 0 'END SUB -'--------------------------------------------------------------------------------- -FUNCTION __UI_ParentID& (Object$) - __UI_ParentID& = __UI_Objects(__UI_GetID(Object$)).ParentID -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_ParentID& (Object$) +' __UI_ParentID& = __UI_Controls(__UI_GetID(Object$)).ParentID +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Type% (Object$) - __UI_Type% = __UI_Objects(__UI_GetID(Object$)).ParentID -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Type% (Object$) +' __UI_Type% = __UI_Controls(__UI_GetID(Object$)).ParentID +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Name$ (ID) - __UI_Name$ = RTRIM$(__UI_Objects(ID).Name) -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Name$ (ID) +' __UI_Name$ = RTRIM$(__UI_Controls(ID).Name) +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Top% (Object$) - __UI_Top% = __UI_Objects(__UI_GetID(Object$)).Top -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Top% (Object$) +' __UI_Top% = __UI_Controls(__UI_GetID(Object$)).Top +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Left% (Object$) - __UI_Left% = __UI_Objects(__UI_GetID(Object$)).Left -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Left% (Object$) +' __UI_Left% = __UI_Controls(__UI_GetID(Object$)).Left +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Width% (Object$) - __UI_Width% = __UI_Objects(__UI_GetID(Object$)).Width -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Width% (Object$) +' __UI_Width% = __UI_Controls(__UI_GetID(Object$)).Width +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Height% (Object$) - __UI_Height% = __UI_Objects(__UI_GetID(Object$)).Height -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Height% (Object$) +' __UI_Height% = __UI_Controls(__UI_GetID(Object$)).Height +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_BackColor~& (Object$) - __UI_BackColor~& = __UI_Objects(__UI_GetID(Object$)).BackColor -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_BackColor~& (Object$) +' __UI_BackColor~& = __UI_Controls(__UI_GetID(Object$)).BackColor +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_ForeColor~& (Object$) - __UI_ForeColor~& = __UI_Objects(__UI_GetID(Object$)).ForeColor -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_ForeColor~& (Object$) +' __UI_ForeColor~& = __UI_Controls(__UI_GetID(Object$)).ForeColor +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_BackStyle%% (Object$) - __UI_BackStyle%% = __UI_Objects(__UI_GetID(Object$)).BackStyle -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_BackStyle%% (Object$) +' __UI_BackStyle%% = __UI_Controls(__UI_GetID(Object$)).BackStyle +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Value## (Object$) - __UI_Value## = __UI_Objects(__UI_GetID(Object$)).Value -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Value## (Object$) +' __UI_Value## = __UI_Controls(__UI_GetID(Object$)).Value +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Min## (Object$) - __UI_Min## = __UI_Objects(__UI_GetID(Object$)).Min -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Min## (Object$) +' __UI_Min## = __UI_Controls(__UI_GetID(Object$)).Min +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Max## (Object$) - __UI_Max## = __UI_Objects(__UI_GetID(Object$)).Max -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Max## (Object$) +' __UI_Max## = __UI_Controls(__UI_GetID(Object$)).Max +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Enabled%% (Object$) - __UI_Enabled%% = __UI_Objects(__UI_GetID(Object$)).Enabled -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Enabled%% (Object$) +' __UI_Enabled%% = __UI_Controls(__UI_GetID(Object$)).Enabled +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_CanDrag%% (Object$) - __UI_CanDrag%% = __UI_Objects(__UI_GetID(Object$)).CanDrag -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_CanDrag%% (Object$) +' __UI_CanDrag%% = __UI_Controls(__UI_GetID(Object$)).CanDrag +'END FUNCTION -'--------------------------------------------------------------------------------- -FUNCTION __UI_Caption$ (Object$) - __UI_Caption$ = __UI_Captions(__UI_GetID(Object$)) -END FUNCTION +''--------------------------------------------------------------------------------- +'FUNCTION __UI_Caption$ (Object$) +' __UI_Caption$ = __UI_Captions(__UI_GetID(Object$)) +'END FUNCTION '--------------------------------------------------------------------------------- SUB __UI_SetCaption (Object$, NewCaption$) @@ -602,6 +1430,72 @@ SUB __UI_SetText (Object$, NewText$) __UI_Texts(__UI_GetID(Object$)) = NewText$ END SUB -FUNCTION __UI_Darken~& (WhichColor~&, ByHowMuch%) - __UI_Darken~& = _RGB32(_RED(WhichColor~&) * (ByHowMuch% / 100), _GREEN(WhichColor~&) * (ByHowMuch% / 100), _BLUE(WhichColor~&) * (ByHowMuch% / 100)) +'--------------------------------------------------------------------------------- +FUNCTION __UI_LoadFont& (FontFile$, Size%, Parameters$) + DIM Handle& + Handle& = _LOADFONT(FontFile$, Size%, Parameters$) + IF Handle& <= 0 THEN Handle& = 16 + __UI_LoadFont& = Handle& END FUNCTION + +'--------------------------------------------------------------------------------- +SUB __UI_DrawRadioButton (Checked%%, Left&, Top&, CircleDiameter%) + DIM i AS SINGLE + CircleDiameter% = 10 + + CIRCLE (Left& + CircleDiameter% / 3, Top&), CircleDiameter% / 2, _RGB32(0, 0, 0) + + IF Checked%% THEN + FOR i = CircleDiameter% / 3 TO 1 STEP -.1 + CIRCLE (Left& + CircleDiameter% / 3, Top&), i, _RGB32(0, 0, 0) + NEXT + END IF +END SUB + +'--------------------------------------------------------------------------------- +SUB __UI_SetRadioButtonValue (id) + 'Radio buttons will change value of others in the same group + DIM i AS LONG + + FOR i = 1 TO UBOUND(__UI_Controls) + IF __UI_Controls(i).Type = __UI_Type_RadioButton AND _ + __UI_Controls(i).ParentID = __UI_Controls(id).ParentID THEN + __UI_Controls(i).Value = __UI_False + END IF + NEXT + __UI_Controls(id).Value = __UI_True +END SUB + +'--------------------------------------------------------------------------------- +SUB __UI_DrawCheckBox (Checked%%, Left&, Top&, BoxSize%) + DIM i AS SINGLE + BoxSize% = 10 + + LINE (Left&, Top& - BoxSize% / 2)-STEP(BoxSize%, BoxSize%), _RGB32(0, 0, 0), B + + IF Checked%% THEN + LINE (Left&, Top& - BoxSize% / 2)-STEP(BoxSize%, BoxSize%), _RGB32(0, 0, 0) + LINE (Left&, Top& + BoxSize% / 2)-STEP(BoxSize%, -BoxSize%), _RGB32(0, 0, 0) + END IF +END SUB + +'--------------------------------------------------------------------------------- +SUB __UI_DeleteSelection + DIM s1 AS LONG, s2 AS LONG + s1 = __UI_Controls(__UI_Focus).SelectionStart + s2 = __UI_Controls(__UI_Focus).Cursor + IF s1 > s2 THEN SWAP s1, s2 + __UI_Texts(__UI_Focus) = LEFT$(__UI_Texts(__UI_Focus), s1) + MID$(__UI_Texts(__UI_Focus), s2 + 1) + __UI_Controls(__UI_Focus).Selected = __UI_False + __UI_Controls(__UI_Focus).Cursor = s1 +END SUB + +SUB __UI_CursorAdjustments + IF __UI_Controls(__UI_Focus).Cursor > __UI_Controls(__UI_Focus).PrevCursor THEN + IF __UI_Controls(__UI_Focus).Cursor - __UI_Controls(__UI_Focus).InputViewStart + 2 > __UI_Controls(__UI_Focus).FieldArea THEN __UI_Controls(__UI_Focus).InputViewStart = (__UI_Controls(__UI_Focus).Cursor - __UI_Controls(__UI_Focus).FieldArea) + 2 + ELSEIF __UI_Controls(__UI_Focus).Cursor < __UI_Controls(__UI_Focus).PrevCursor THEN + IF __UI_Controls(__UI_Focus).Cursor < __UI_Controls(__UI_Focus).InputViewStart - 1 THEN __UI_Controls(__UI_Focus).InputViewStart = __UI_Controls(__UI_Focus).Cursor + END IF + __UI_Controls(__UI_Focus).PrevCursor = __UI_Controls(__UI_Focus).Cursor + IF __UI_Controls(__UI_Focus).InputViewStart < 1 THEN __UI_Controls(__UI_Focus).InputViewStart = 1 +END SUB