Your techniques for MaxGUI

BlitzMax Forums/BlitzMax GUI Programming/Your techniques for MaxGUI

And in the meantime, I have a general question for anybody..


I have created a Type which contains within it my interface. All gadgets within that type are globals.

If I 'extend' that Type with a sub-type, will the sub-type's own gadgets be able to speak to (i.e. be children of) the Base Type's gadgets? If so, I can create a 'base' interface for use in many projects, and then simply 'extend' it with a custom interface type that is specific for each particular program's functions.

It's probably not the 'best' OOP solution in terms of separability, but I think it suits my needs well enough.


It's past midnight here so I'm off to bed otherwise I'd answer my own question tonight. I will test it out after work tomorrow afternoon.. if no one's responded. Just was looking for a quick answer if anyone had ever tried something like that before..



EDIT: I figured I'd include my current code, just for kicks. Please note this is the 'base' interface class I was describing. Eventually it will contain within it all "non-specific" framework functions, such as handling window open/close, menu function (i.e. opening up the options window which will allow you to change the resolution of the canvas), minimize/maximize events, window moving, etc.

After that's built, I'll extend an 'Application-Specific' Sub-Type upon the base class, which will add all the buttons, tabs, sliders, etc that pertain to my specific program -- not to mention the canvas operations (likely an OpenGL context). This is why I'll need the sub-type's gadgets to be able to child-group with the base class' window.


Note how the canvas moves around 'locked' to the 'interface window'. That was Kev's idea (thanks again!) to use an event hook upon the EVENT_WindowMove, since MDI isn't officially supported.


enough english, more blitzmax:

SuperStrict

Import MaxGUI.Drivers


Type TAppWind
	
Global	CanvasWindow:TGadget
Global	InterfaceWindow:TGadget
Global	InterfaceWindow_File:TGadget
Global	InterfaceWindow_Options:TGadget
Global	InterfaceWindow_Help:TGadget
Global	FileWindow:TGadget
Global 	OptionsWindow:TGadget
Global	HelpWindow:TGadget

Global CanvasWidth:Int = 400
Global CanvasHeight:Int = 300
Global InterfaceWidth:Int = 200


'Basic Setup Stuff in the 'Create' Function

Function Create:TAppWind(ApplicationTitle$)	
	If Not CanvasWindow
	AppTitle = ApplicationTitle
	
	Local style1:Int = WINDOW_TITLEBAR | WINDOW_MENU
	Local style2:Int = WINDOW_CLIENTCOORDS | WINDOW_TOOL 
	
	Local cx:Int = (ClientWidth(Desktop() ) - (canvasWidth+InterfaceWidth)) / 2
	Local cy:Int = (ClientHeight(Desktop() ) - CanvasHeight) / 2
	Local ix:Int = cx + canvasWidth + 1
	
	InterfaceWindow:TGadget = 		CreateWindow:TGadget(ApplicationTitle , ix , cy , InterfaceWidth , CanvasHeight , Null , style1 ) 
	CanvasWindow:TGadget = 			CreateWindow:TGadget(ApplicationTitle , 0 , 0 , CanvasWidth , CanvasHeight , Null , style2 ) 
	
	SetGadgetColor( CanvasWindow:TGadget , 0 , 0 , 0 , True ) 
	SetCanvasShape(GadgetX(InterfaceWindow),GadgetY(InterfaceWindow))
	
	InterfaceWindow_File:TGadget = 	CreateMenu( "File" , 100 , WindowMenu( InterfaceWindow:TGadget ) )
	InterfaceWindow_Options:TGadget = 	CreateMenu( "Options" , 200 , WindowMenu( InterfaceWindow:TGadget ) )
	InterfaceWindow_Help:TGadget = 	CreateMenu( "Help" , 300 , WindowMenu( InterfaceWindow:TGadget ) )
	UpdateWindowMenu( InterfaceWindow:TGadget )  
	
	
	OptionsWindow:TGadget = CreateWindow:TGadget("Options",ClientWidth(Desktop())/2-(200),ClientHeight(Desktop())/2-(90),400,180,Null,WINDOW_TITLEBAR|WINDOW_TOOL )
	HideGadget( OptionsWindow:TGadget ) 
	
	ActivateGadget(CanvasWindow) 
	ActivateGadget(InterfaceWindow) 
						
	AddHook EmitEventHook , AppWindEventManager
	
	EndIf
End Function



Function AppWindEventManager:Object(id:Int , data:Object , context:Object) 
	Local event:TEvent = TEvent(Data) 
	
	If event = Null Then Return Null
	
	Select event.id
		Case EVENT_WINDOWCLOSE
			Select event.source
				Case CanvasWindow , InterfaceWindow
					DisableGadget(CanvasWindow) 
					DisableGadget(InterfaceWindow) 
					
					If Confirm("Quit the application?")
						End
					Else
						resumemainapp()
					EndIf
						
									
				Case OptionsWindow , FileWindow , HelpWindow
						HideGadget(TGadget(event.source))
						ResumeMainApp() 				
			End Select

		Case EVENT_APPRESUME
			ResumeMainApp()
			
		Case EVENT_WINDOWMOVE
			Select event.source
				Case InterfaceWindow	
					InterfaceWindow_WM( event ) 
			End Select

		Case EVENT_MENUACTION
			Select event.data
				'These are Menu Events for the InterfaceWindow
				Case 100	'File
					'DisableGadget(InterfaceWindow) 	'no file window currently exists
					'DisableGadget(CanvasWindow)
					'ShowGadget(FileWindow)
				Case 200	'Options
					DisableGadget(InterfaceWindow) 
					DisableGadget(CanvasWindow)
					ShowGadget(OptionsWindow)
				Case 300	'Help
					'DisableGadget(InterfaceWindow) 	'no help window currently exists
					'DisableGadget(CanvasWindow)
					'ShowGadget(HelpWindow)
		End Select

	End Select
	
	Return data
End Function


Function InterfaceWindow_WM( event:TEvent )
	'if not in fullscreen mode..
		SetCanvasShape(event.x , event.y) 
	'else if in fullscreen mode.. do something else
End Function

Function SetCanvasShape(ix:Int,iy:Int) 
	SetGadgetShape(CanvasWindow,ix-CanvasWidth-1,iy,CanvasWidth,CanvasHeight)
End Function

Function ResumeMainApp()
	EnableGadget(CanvasWindow) 
	EnableGadget(InterfaceWindow) 
	ActivateGadget(CanvasWindow)
	
	
	'If Not GadgetHidden(FileWindow) then ActivateGadget(fileWindow) 	'no file window currently exists
	If Not GadgetHidden(OptionsWindow)Then ActivateGadget(OptionsWindow) 
	'If Not GadgetHidden(HelpWindow) Then ActivateGadget(HelpWindow)		'no help window currently exists
	
	
End Function

End Type





TAppWind.Create("Framework Application") 

Repeat
	WaitEvent()
		DebugLog CurrentEvent.tostring()
Forever