Code archives/BlitzPlus Gui/Multiple Options
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| A simple way to handle loads of boolean options in a program | |||||
One way of handling lots of boolean options that your program may have. A lot better than typing loads of CreateButton and SetButtonState lines anyway.
[codebox]
Const PICSON=$1, SOUNDON=$2, MUSICON=$4, VISAIDON=$8, AUTOON=$10, BLOCKON=$20
Const BIGWINON=$40, CLEARON=$80, NINTHON=$100, TENTHON=$200
Const BITSUSED=$3F, NUMPREFS=10
Const DEFAULTPREFS=SOUNDON Or MUSICON Or BIGWINON
Const CANCELLED=0, CHANGED=1
Const ESCAPE=1
Const KEY_PRESSED=$101
Const GADGET_ACTION=$401
Const CLOSE_WINDOW=$803, ACTIVATE_WINDOW=$804
Const CLICK_BUTTON=1, CHECK_BOX=2, RADIO_BUTTON=3
Global preferences, newprefs, changedprefs, centrex, centrey, prefsloop, testbit, gadloop
Dim gadgets(9)
;we don't really need these next four lines - they just make the main loop
;a bit shorter in reporting actions - see the commented lines in the
;change_prefs function where the checkbox gadgets are created - if you uncomment
;those lines - then remove or comment these ones out.
Dim gadtext$(9)
Restore gadnames
For gadloop=0 To 9
Read gadtext$(gadloop)
Next
;-----------------------------------------
centrex=(ClientWidth(Desktop()) Shr 1)
centrey=(ClientHeight(Desktop()) Shr 1)
main_window=CreateWindow( "Main Program",centrex-125,centrey-150,250,300,0,35)
SetMinWindowSize main_window
prefsbutton=CreateButton("Prefs",10,10,60,20,main_window)
textbox=CreateTextArea(10,40,230,250,main_window)
SetTextAreaColor textbox,$FF,$FF,$80,True
preferences=DEFAULTPREFS
Repeat
WaitEvent()
event=EventID()
Select event
Case GADGET_ACTION
evsource=EventSource()
If evsource=prefsbutton
If change_prefs()
;make changes to program
change$=""
changedprefs=newprefs Xor preferences
For prefsloop=0 To NUMPREFS-1
testbit=1 Shl prefsloop
If changedprefs And testbit
;this preference has changed
change$=gadtext$(prefsloop)
If newprefs And testbit Then change$=change$+" ON" Else change$=change$+" OFF"
;alternative example
;Select testbit
; Case PICSON If newprefs and testbit then turn pics on else turn pics off
; Case MUSICON If newprefs and testbit then turn music on else turn it off
; etc...
;End Select
EndIf
If change$<>"" Then AddTextAreaText textbox,change$+Chr$(13)+Chr$(10): change$=""
Next
preferences=newprefs
Else
AddTextAreaText textbox,"Cancelled"+Chr$(13)+Chr$(10)
EndIf
AddTextAreaText textbox,"============="+Chr$(13)+Chr$(10)
EndIf
Case CLOSE_WINDOW
finished=True
Case KEY_PRESSED
If EventData()=ESCAPE Then finished=True
End Select
Until finished
End
;#########################################
Function change_prefs()
Local numgads, enabled;,gadtext$
Window=CreateWindow( "Change Prefs",centrex-100,centrey-150,200,300,main_window,49)
SetMinWindowSize window
;see comment at top for these next three commented lines, and commented local string above
;Restore gadnames
For gadnum=0 To NUMPREFS-1
; Read gadtext$
; gadgets(gadnum)=CreateButton(gadtext$,10,5+(gadnum * 25),150,20,window,CHECKBOX)
;remove or comment next line if uncommenting above
gadgets(gadnum)=CreateButton(gadtext$(gadnum),10,5+(gadnum * 25),150,20,window,CHECK_BOX)
SetButtonState gadgets(gadnum),1 And (preferences Shr gadnum)
Next
ok=CreateButton("OK",10,270,60,20,window)
cancel=CreateButton("Cancel",130,270,60,20,window)
DisableGadget ok
enabled=False
action=-1
Repeat
WaitEvent()
event=EventID()
Select event
Case CLOSE_WINDOW
If EventSource()=window
action=CANCELLED
Else
End
EndIf
Case GADGET_ACTION
Select EventSource()
Case ok action=CHANGED
Case cancel action=CANCELLED
Default
newprefs=0
For gadnum=0 To NUMPREFS-1
newprefs=newprefs Or (ButtonState(gadgets(gadnum)) Shl gadnum)
Next
If (newprefs Xor preferences)
If Not(enabled) Then EnableGadget ok: enabled=True
Else
If enabled Then DisableGadget ok: enabled=False
EndIf
End Select
Case ACTIVATE_WINDOW
If EventSource()<>window
ActivateWindow window
EndIf
Case KEY_PRESSED ;doesn't work if checkbox clicked - but $105 event reported
If EventData()=ESCAPE Then action=CANCELLED
End Select
Until action > -1
FreeGadget window
Return action
End Function
;#########################################
.gadnames
Data "Pictures","Sound","Music","Visual-aid","Auto-change number","Block illegal moves"
Data "Big window","Clear selected number","Ninth","Tenth"
[/codebox]
N.B. The action performed by this code so far as the Activate_Window and Close_Window actions are concerned in the change_prefs() function depend upon whether the program is running in debug mode or not. I haven't quite figured out why the Activate_Window takes precedence over Close_Window when debugging is switched off.
Try clicking the Main Window's close button when the prefs window is open - in both debug and non-debug modes to see what I mean. And no - it's not Blitz that ends the program in debug mode - you can check that by change the "End" command to "ActivateWindow window" in change_prefs.
-----
One thing of note - if you click on a check-box so that there is a dotted rectangle around it, and then press F10 - have a look at what event is reported in the debug window. The EventSource() and EventData() are both 0 though. This happens when any gadget has a dotted rectangle around it - even ordinary buttons.
Nothing serious - but thought I'd mention it since I noticed it. As far as I know, $2004 is when you grab something with the mouse - like the title-bar or a slider bar, and $2005 is when you release the mouse in the same circumstances. |
Comments
None.
Code Archives Forum