diff options
| author | Ian C <ianc@noddybox.co.uk> | 2005-09-16 00:21:58 +0000 | 
|---|---|---|
| committer | Ian C <ianc@noddybox.co.uk> | 2005-09-16 00:21:58 +0000 | 
| commit | f79195715c66530b0bda50242380812c5e670c00 (patch) | |
| tree | 398a99bb311bd0c8f1f8d2949827a78dfec28260 | |
| parent | 4c757b1080fe345a528f0659fe2af86779315e8d (diff) | |
Working version of the GUI
| -rw-r--r-- | simplegui.mod/simplegui.bmx | 338 | 
1 files changed, 324 insertions, 14 deletions
| diff --git a/simplegui.mod/simplegui.bmx b/simplegui.mod/simplegui.bmx index deb6dfc..712c61f 100644 --- a/simplegui.mod/simplegui.bmx +++ b/simplegui.mod/simplegui.bmx @@ -12,64 +12,131 @@ Import brl.Max2D  Import brl.Basic  Import noddybox.bitmapfont +Type TGUIFont +	Global font:TBitmapFont +End Type +  Type TWidget Abstract +	Field	enabled:Int  	Field	text:String  	Field	x:Int  	Field	y:Int  	Field	w:Int  	Field	h:Int -	Field	font:TBitmapFont  	Field	owner:TGUIHandler -	Field	callback() +	Field	callback(w:TWidget) +	Field	mouse_over:Int -	Method HandleKey(key:String) +	Method HandleKey(k:Int)  	End Method  	Method MouseEnter() +		mouse_over=True  	End Method  	Method MouseLeave() +		mouse_over=False  	End Method  	Method HandleClick()  	End Method  	Method Draw() Abstract +	 +	Function DrawBox(x:Int, y:Int, w:Int, h:Int) +		DrawLine(x,y,x+w-1,y) +		DrawLine(x+w-1,y,x+w-1,y+h-1) +		DrawLine(x+w-1,y+h-1,x,y+h-1) +		DrawLine(x,y+h-1,x,y) +	End Function + +	Function Draw3DBox(x:Int, y:Int, w:Int, h:Int, invert:Int, size:Int=2) +		Local f:Int +		 +		SetColor(200,200,200) +		DrawRect(x,y,w,h) + +		If invert +			SetColor(170,170,170) +		Else +			SetColor(230,230,230) +		EndIf + +		For f=0 Until size +			DrawLine(x+f,y+f,x+w-1-f,y+f) +			DrawLine(x+w-1-f,y+f,x+w-1-f,y+h-1-f) +		Next + +		If invert +			SetColor(230,230,230) +		Else +			SetColor(170,170,170) +		EndIf + +		For f=0 Until size +			DrawLine(x+w-1-f,y+h-1-f,x+f,y+h-1-f) +			DrawLine(x+f,y+h-1-f,x+f,y+f) +		Next +	End Function +  End Type  Type TLabel Extends TWidget -	Function Create:TLabel(font:TBitmapFont,x:Int, y:Int, text:String) +	Function Create:TLabel(gui:TGUIHandler,x:Int, y:Int, text:String)  		Local o:TLabel=New TLabel -		o.font=font +		o.enabled=True  		o.x=x  		o.y=y -		o.w=font.TextWidth(text)+2 -		o.h=font.MaxHeight()+1 +		o.w=TGUIFont.font.TextWidth(text)+2 +		o.h=TGUIFont.font.MaxHeight()+1  		o.text=text +		gui.Register(o)  		Return o  	End Function  	Method Draw() -		font.Draw(text,x+1,y+1) +		TGUIFont.font.Draw(text,x+1,y+1)  	End Method +  End Type  Type TText Extends TWidget  	Field	maxlen:Int -	Function Create:TText(font:TBitmapFont,x:Int, y:Int, text:String, maxlen:Int) +	Function Create:TText(gui:TGUIHandler,x:Int, y:Int, text:String, maxlen:Int, callback(w:TWidget)=Null)  		Local o:TText=New TText -		o.font=font +		o.enabled=True  		o.x=x  		o.y=y  		o.maxlen=maxlen -		o.w=font.MaxWidth()*(maxlen+1)+2 -		o.h=font.MaxHeight()+2 +		o.w=TGUIFont.font.MaxWidth()*(maxlen+1)+2 +		o.h=TGUIFont.font.MaxHeight()+2  		o.text=text +		o.callback=callback +		gui.Register(o)  		Return o  	End Function +	Method HandleClick() +		owner.SetFocus(Self) +	End Method +	 +	Method HandleKey(k:Int) +		If k=8 +			If text.length>0 +				text=text[0..text.length-1] +			EndIf +		Else If k=13 +			If callback<>Null +				callback(Self) +				owner.SetFocus(Null) +			EndIf +		Else If k>31 And k<127 And text.length<maxlen +			text:+Chr(k) +		EndIf +	End Method +	  	Method Draw()  		Local s:String=text @@ -82,7 +149,87 @@ Type TText Extends TWidget  		DrawRect(x,y,w,h) -		font.Draw(s,x+1,y+1) +		TGUIFont.font.Draw(s,x+1,y+1) +	End Method +End Type + +Type TCheckbox Extends TWidget +	Field	checked:Int +	 +	Function Create:TCheckbox(gui:TGUIHandler, x:Int, y:Int, text:String, callback(w:TWidget)=Null) +		Local o:TCheckbox=New TCheckbox +		o.enabled=True +		o.x=x +		o.y=y +		o.w=TGUIFont.font.TextWidth(" "+text)+4+TGUIFont.font.MaxHeight() +		o.h=TGUIFont.font.MaxHeight()+2 +		o.text=text +		o.callback=callback +		gui.Register(o) +		Return o +	End Function +	 +	Method HandleClick() +		checked=Not checked +		 +		If callback<>Null +			callback(Self) +		EndIf +	End Method +	 +	Method Draw() +		If (mouse_over) +			SetColor(255,255,255) +		Else +			SetColor(200,200,200) +		EndIf + +		DrawBox(x,y,TGUIFont.font.MaxHeight(),TGUIFont.font.MaxHeight()) +		 +		If checked +			SetColor(255,100,100) +			DrawRect(x+1,y+1,TGUIFont.font.MaxHeight()-2,TGUIFont.font.MaxHeight()-2) +		EndIf +		 +		TGUIFont.font.Draw(" "+text,x+2+TGUIFont.font.MaxHeight(),y+1) +	End Method +End Type + +Type TButton Extends TWidget + +	Field ox:Int +	Field oy:Int +	 +	Function Create:TButton(gui:TGUIHandler, x:Int, y:Int, w:Int, h:Int, text:String, callback(w:TWidget)) +		Local o:TButton=New TButton +		o.enabled=True +		o.x=x +		o.y=y +		o.w=w +		o.h=h +		o.text=text +		o.ox=x+w/2-TGUIFont.font.TextWidth(text)/2 +		o.oy=y+h/2-TGUIFont.font.TextHeight(text)/2 +		o.callback=callback +		gui.Register(o) +		Return o +	End Function +	 +	Method HandleClick() +		If callback<>Null +			callback(Self) +		EndIf +	End Method + +	Method Draw() +		If (mouse_over) +			SetColor(255,255,255) +			DrawBox(x,y,w,h) +		EndIf +		 +		Draw3DBox(x+1,y+1,w-2,h-2,False,2) +		 +		TGUIFont.font.Draw(text,ox,oy)  	End Method  End Type @@ -92,6 +239,8 @@ Type TGUIHandler  	'  	Field 	m_widgets:TList  	Field	m_focus:TWidget +	Field	m_over:TWidget +	Field	m_clicked:TWidget  	' Creates a new GUI handler  	'	 @@ -102,6 +251,8 @@ Type TGUIHandler  		o.m_widgets=CreateList()  		o.m_focus=Null +		o.m_over=Null +		o.m_clicked=Null  		Return o  	End Function @@ -113,6 +264,12 @@ Type TGUIHandler  		w.owner=Self  	End Method +	' Clear widgets +	' +	Method Clear() +		m_widgets.Clear() +	End Method +	  	' Set the keyboard focus (null for none)  	'  	Method SetFocus(w:TWidget) @@ -125,11 +282,164 @@ Type TGUIHandler  		Return m_focus  	End Method +	' Gets the last clicked widget +	' +	Method Clicked:TWidget() +		Local last:TWidget=m_clicked +		m_clicked=Null +		Return last +	End Method +	  	' Perform a loop and any necessary events  	'  	Method EventLoop() +		Local x:Int=MouseX() +		Local y:Int=MouseY() +		Local b:Int=KeyHit(KEY_MOUSELEFT)>0 +		 +		Local w:TWidget=LocateWidget(x,y) +		 +		For Local w:TWidget=EachIn m_widgets +			If w.enabled +				w.Draw() +			EndIf +		Next +		 +		If w<>m_over +			If m_over<>Null +				m_over.MouseLeave() +			EndIf +			m_over=w +			If m_over<>Null +				m_over.MouseEnter() +			EndIf +		EndIf +		 +		If w<>Null And w.enabled And b +			w.HandleClick() +			m_clicked=w +		EndIf +		 +		Local k:Int=GetChar() +		 +		If k<>0 And m_focus<>Null And m_focus.enabled +			m_focus.HandleKey(k) +		EndIf +	End Method +	 +	' Private method +	' +	Method LocateWidget:TWidget(x:Int,y:Int)  		For Local w:TWidget=EachIn m_widgets -			w.Draw() +			If x>=w.x And y>=w.y And x<w.x+w.w And y<w.y+w.h +				Return w +			EndIf  		Next +		Return Null  	End Method  End Type + + +Function GUINotify(s:String) +	Local back:TImage=CreateImage(GraphicsWidth(),GraphicsHeight(),1,0) +	GrabImage(back,0,0) +	 +	Local w:Int=Max(TGUIFont.font.TextWidth(s)+10,GraphicsWidth()/4) +	Local h:Int=TGUIFont.font.TextHeight(s)*5 +	Local x:Int=GraphicsWidth()/2-w/2 +	Local y=GraphicsHeight()/2-h/2 +	Local by=y+TGUIFont.font.TextHeight(s)*2.5 +	 +	Local gui:TGUIHandler=TGUIHandler.Create() +	 +	Local label:TLabel=TLabel.Create(gui,x+5,y+5,s) +	Local button:TButton=TButton.Create(gui,x+5,by,w-10,TGUIFont.font.TextHeight(s)+10,"OK",Null) +	 +	Local click:TWidget=Null +	 +	While click<>button +		Cls +		DrawImage(back,0,0) +		TWidget.Draw3DBox(x,y,w,h,False,2) +		gui.EventLoop() +		click=gui.Clicked() +		Flip +		FlushMem +	Wend +End Function + +Function GUIYesNo:Int(s:String) +	Local back:TImage=CreateImage(GraphicsWidth(),GraphicsHeight(),1,0) +	GrabImage(back,0,0) +	 +	Local w:Int=Max(TGUIFont.font.TextWidth(s)+10,GraphicsWidth()/4) +	Local h:Int=TGUIFont.font.TextHeight(s)*7 +	Local x:Int=GraphicsWidth()/2-w/2 +	Local y=GraphicsHeight()/2-h/2 +	Local by=y+TGUIFont.font.TextHeight(s)*2 +	 +	Local gui:TGUIHandler=TGUIHandler.Create() +	 +	Local label:TLabel=TLabel.Create(gui,x+5,y+5,s) +	Local yes:TButton=TButton.Create(gui,x+5,by,w-10,TGUIFont.font.TextHeight(s)+10,"Yes",Null) +	Local no:TButton=TButton.Create(gui,x+5,by+yes.h+2,w-10,TGUIFont.font.TextHeight(s)+10,"No",Null) +	 +	Local click:TWidget=Null +	 +	While click=Null +		Cls +		DrawImage(back,0,0) +		TWidget.Draw3DBox(x,y,w,h,False,2) +		gui.EventLoop() +		click=gui.Clicked() +		Flip +		FlushMem +	Wend +	 +	Return click=yes +End Function + + +Function GUIMenu(title:String, options:String[],x,y) +	Local f:Int +	Local back:TImage=CreateImage(GraphicsWidth(),GraphicsHeight(),1,0) +	GrabImage(back,0,0) +	 +	Local st:Int=TGUIFont.font.MaxHeight()*2 +	Local h:Int=TGUIFont.font.MaxHeight()*3 +	Local w:Int=TGUIFont.font.TextWidth(title)+30 +	 +	For f=0 Until options.length +		w=Max(w,TGUIFont.font.TextWidth(options[f])+30) +		h:+st +	Next +	 +	Local gui:TGUIHandler=TGUIHandler.Create() +	 +	Local label:TLabel=TLabel.Create(gui,x+5,y+2,title) +	Local button:TButton[]=New TButton[options.length] +	 +	For f=0 Until options.length +		button[f]=TButton.Create(gui,x+5,y+TGUIFont.font.MaxHeight()*2+f*st,w-10,st-2,options[f],Null) +	Next +	 +	Local click:TWidget=Null +	 +	While click=Null And KeyHit(KEY_MOUSERIGHT)=0 +		Cls +		DrawImage(back,0,0) +		TWidget.Draw3DBox(x,y,w,h,False,2) +		gui.EventLoop() +		click=gui.Clicked() +		Flip +		FlushMem +	Wend +	 +	For f=0 Until options.length +		If button[f]=click +			Return f +		EndIf +	Next +	 +	Return -1 +End Function | 
