summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2005-09-16 00:21:58 +0000
committerIan C <ianc@noddybox.co.uk>2005-09-16 00:21:58 +0000
commitf79195715c66530b0bda50242380812c5e670c00 (patch)
tree398a99bb311bd0c8f1f8d2949827a78dfec28260
parent4c757b1080fe345a528f0659fe2af86779315e8d (diff)
Working version of the GUI
-rw-r--r--simplegui.mod/simplegui.bmx338
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