Only now do you understand the true power
BlitzMax Forums/BlitzMax Programming/Only now do you understand the true power
| ||
My brief excursion into wxWidgets left me with one idea I picked up from looking at the program structure. Instead of using global variables for all my controls, I am separating the application into types with fields for the different gadgets. Instead of having a bunch of global variables like ScriptEditorWindow I can just use the app.scripteditor.window field. Using the context argument with event hooks, all event handling for the relevant controls can be done easily in one place. I thought this might help some other people, since I have been using MaxGUI for a long time, but never thought to be this organized about it:SuperStrict Import maxgui.maxgui Import maxgui.win32maxguiex Import maxgui.proxygadgets Import "LoadMenu.bmx" Import "../Common/Framewerk/Framewerk.bmx" Type TScriptEditor Field window:TGadget Field textarea:TGadget Method Delete() RemoveHook EmitEventHook,EventHook,Self EndMethod Method Init(group:TGadget) window=CreateWindow("Script",0,0,600,400,group,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_RESIZABLE|WINDOW_MENU) textarea=CreateTextArea(0,0,window.ClientWidth(),window.ClientHeight(),window) SetGadgetLayout textarea,1,1,1,1 LoadMenu "script.mnu",WindowMenu(window) UpdateWindowMenu(window) AddHook EmitEventHook,EventHook,Self EndMethod Method Open() ShowGadget window ActivateGadget window EndMethod Method Close() ActivateGadget window.parent HideGadget window EndMethod Function EventHook:Object(id:Int,data:Object,context:Object) Local event:TEvent=TEvent(data) Local scripteditor:TScriptEditor=TScriptEditor(context) If event Select event.id Case EVENT_WINDOWCLOSE If event.source=scripteditor.window scripteditor.close() Return Null EndIf Case EVENT_MENUACTION Select String(TGadget(event.source).extra) Case "ScriptEditor" scripteditor.open() Return Null Case "CloseProgram" End Case "RunScriptFile" Local file:String=RequestFile("Open File","Lua Script (*.lua):lua;Text Files (*.txt):txt;All Files:*") If file TScript.errorstring="" If LoadScript(file) Else If TScript.errorstring Notify TScript.errorstring,1 Else Notify "Failed to load script ~q"+file+"~q.",1 EndIf EndIf EndIf Return Null Case "OpenScript" Local file:String=RequestFile("Open File","Lua Script (*.lua):lua;Text Files (*.txt):txt;All Files:*") If file Local source$=LoadString(file) If source SetGadgetText scripteditor.textarea,source ShowGadget scripteditor.window If WindowMinimized(scripteditor.window) RestoreWindow scripteditor.window ActivateGadget scripteditor.window EndIf EndIf Return Null Case "CloseScriptEditor" scripteditor.close() Return Null EndSelect EndSelect EndIf Return data EndFunction EndType |
| ||
For a minute there, I thought Xylvan was back... |
| ||
In fact, you can create a class like this:Type TEventHandler Method New() AddHook EmitEventHook,EventHook,Self EndMethod Method Delete() RemoveHook EmitEventHook,EventHook,Self EndMethod Method ProcessEvent:TEvent(event:TEvent) Abstract Function EventHook:Object(id:Int,data:Object,context:Object) Local event:TEvent=TEvent(data) If event Return TEventHandler(context).ProcessEvent(event) Else Return data EndFunction EndType And your app components are done like this: SuperStrict Import maxgui.maxgui Import maxgui.win32maxguiex Import maxgui.proxygadgets Import "../LoadMenu.bmx" Import "../../../Common/Framewerk/Framewerk.bmx" Import "../EventHandler.bmx" Type TScriptEditor Extends TEventHandler Field menufile:String="script.mnu" Field window:TGadget Field textarea:TGadget Method Init(group:TGadget) window=CreateWindow("Script",0,0,600,400,group,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_RESIZABLE|WINDOW_MENU|WINDOW_HIDDEN) textarea=CreateTextArea(0,0,window.ClientWidth(),window.ClientHeight(),window) SetGadgetLayout textarea,1,1,1,1 If LoadMenu(menufile,WindowMenu(window)) UpdateWindowMenu(window) Else Notify "Failed to load menu file ~q"+menufile+"~q.",1 EndIf EndMethod Method Open() ShowGadget window ActivateGadget window EndMethod Method Close() ActivateGadget window.parent HideGadget window EndMethod Method ProcessEvent:TEvent(event:TEvent) Select event.id Case EVENT_WINDOWCLOSE If event.source=window close() Return Null EndIf EndSelect Return event EndMethod EndType |
| ||
...but MaxGui is missing some decent snowflakes and bloom effects... |