summaryrefslogtreecommitdiff
path: root/gfxmenu.mod/gfxmenu.bmx
diff options
context:
space:
mode:
Diffstat (limited to 'gfxmenu.mod/gfxmenu.bmx')
-rw-r--r--gfxmenu.mod/gfxmenu.bmx412
1 files changed, 205 insertions, 207 deletions
diff --git a/gfxmenu.mod/gfxmenu.bmx b/gfxmenu.mod/gfxmenu.bmx
index 92ce08c..26364d5 100644
--- a/gfxmenu.mod/gfxmenu.bmx
+++ b/gfxmenu.mod/gfxmenu.bmx
@@ -1,207 +1,205 @@
-' Copyright (c) 2006 Ian Cowburn
-'
-' Permission is hereby granted, free of charge, to any person obtaining a copy of
-' this software and associated documentation files (the "Software"), to deal in
-' the Software without restriction, including without limitation the rights to
-' use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-' of the Software, and to permit persons to whom the Software is furnished to do
-' so, subject to the following conditions:
-'
-' The above copyright notice and this permission notice shall be included in all
-' copies or substantial portions of the Software.
-'
-' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-' SOFTWARE.
-'
-' $Id$
-'
-Rem
-bbdoc: noddybox.gfxmenu
-EndRem
-Module noddybox.gfxmenu
-
-ModuleInfo "Framework: Simple Graphical Menu"
-ModuleInfo "Copyright: Ian Cowburn -- released under the MIT License"
-ModuleInfo "Author: Ian Cowburn"
-ModuleInfo "Version: $Revision$"
-
-
-Strict
-Import brl.linkedlist
-Import brl.max2d
-
-Rem
-bbdoc: Allows a menu backdrop to be automatically processed. Derive a class from this to use.
-EndRem
-Type TGfxMenuBackdrop Abstract
- Rem
- bbdoc: Create a menu backdrop element.
- returns: The created elemnt.
- about: Notice that this is a method, rather than the usual function creator.
- EndRem
- Method Create:TGfxMenuBackdrop() Abstract
- Rem
- bbdoc: Called by the menu to update the backdrop.
- EndRem
- Method Update() Abstract
-End Type
-
-Rem
-bbdoc: Defines a graphical menu.
-EndRem
-Type TGfxMenu
- Field list:TList
- Field bdrop:TList
- Field mbdown:Int
- Field r:Int
- Field g:Int
- Field b:Int
- Field over_r:Int
- Field over_g:Int
- Field over_b:Int
- Field fade:Int
-
- Rem
- bbdoc: Create a menu.
- returns: The created menu.
- about: @backdrop is the backdrop to create (null for no backdrop). @num is the number of backdrop items to create.
- SetColor() is called with @r, @g and @b when the mouse is not over an item, overwise SetColor() is
- called with @over_r, @over_g and @over_b when the item is active. @fade is the amount colours will alter as the
- mouse hovers over buttons. Set this to 255 to make colour changes instant.
- EndRem
- Function Create:TGfxMenu(r:Int=164, g:Int=164, b:Int=164, over_r:Int=255, over_g:Int=255, over_b:Int=255, fade:Int=5, backdrop:TGfxMenuBackdrop=Null, num:Int=0)
- Local menu:TGfxMenu=New TGfxMenu
-
- menu.list=New TList
- menu.bdrop=New TList
- menu.mbdown=False
-
- menu.r=r
- menu.g=g
- menu.b=b
- menu.over_r=over_r
- menu.over_g=over_g
- menu.over_b=over_b
- menu.fade=fade
-
- If backdrop
- For Local f:Int=0 Until num
- menu.bdrop.AddLast(backdrop.Create())
- Next
- EndIf
-
- Return menu
- End Function
-
- Rem
- bbdoc: Adds a menu item.
- returns: The created menu.
- about: @x and @y are the position to draw the image at. If @x is -1 then the image is centred. @i is the image.
- @id is the value returned from @Render() for this menu item. Don't use -1 for this!
- EndRem
- Method Add(x:Int, y:Int, i:TImage, id:Int)
- list.AddLast(TGfxMenuOpt.Create(x,y,i,id,r,g,b))
- End Method
-
- Rem
- bbdoc: Renders and updates the menu.
- returns: The selected item, or -1 if nothing clicked.
- about: Set @hide to True to hide the menu (the backdrop is still updated). SetColor() may have changed when this routine exits.
- EndRem
- Method Render:Int(hide:Int)
- For Local p:TGfxMenuBackdrop=EachIn bdrop
- p.Update()
- Next
-
- If hide
- Return -1
- EndIf
-
- Local in:Int=-1
- Local mx:Int=MouseX()
- Local my:Int=MouseY()
- Local any:Int=False
-
- For Local opt:TGfxMenuOpt=EachIn list
- If opt.InBox(mx,my)
- opt.r=Towards(over_r,opt.r)
- opt.g=Towards(over_g,opt.g)
- opt.b=Towards(over_b,opt.b)
- SetColor(opt.r,opt.g,opt.b)
-
- If MouseDown(1)
- mbdown=True
- DrawImage(opt.i,opt.x,opt.y+2)
- any=True
- Else
- DrawImage(opt.i,opt.x,opt.y)
- If mbdown
- in=opt.id
- EndIf
- mbdown=False
- EndIf
- Else
- opt.r=Towards(r,opt.r)
- opt.g=Towards(g,opt.g)
- opt.b=Towards(b,opt.b)
- SetColor(opt.r,opt.g,opt.b)
- DrawImage(opt.i,opt.x,opt.y)
- EndIf
- Next
-
- If Not any
- mbdown=False
- EndIf
-
- Return in
- End Method
-
- Method Towards:Int(dest:Int, val:Int)
- If val<dest
- Return Min(dest,val+fade)
- ElseIf val>dest
- Return Max(dest,val-fade)
- EndIf
-
- Return val
- End Method
-End Type
-
-Private
-
-Type TGfxMenuOpt
- Field x:Int
- Field y:Int
- Field i:TImage
- Field id:Int
- Field r:Int
- Field g:Int
- Field b:Int
-
- Function Create:TGfxMenuOpt(x:Int, y:Int, i:TImage, id:Int, r:Int, g:Int, b:Int)
- Local o:TGfxMenuOpt=New TGfxMenuOpt
-
- If x=-1
- x=(GraphicsWidth()-ImageWidth(i))/2
- EndIf
-
- o.x=x
- o.y=y
- o.i=i
- o.id=id
- o.r=r
- o.g=g
- o.b=b
-
- Return o
- End Function
-
- Method InBox:Int(mx:Int, my:Int)
- Return mx>=x And my>=y And mx<=x+ImageWidth(i) And my<=y+ImageHeight(i)
- End Method
-End Type
+' Copyright (c) 2006 Ian Cowburn
+'
+' Permission is hereby granted, free of charge, to any person obtaining a copy of
+' this software and associated documentation files (the "Software"), to deal in
+' the Software without restriction, including without limitation the rights to
+' use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+' of the Software, and to permit persons to whom the Software is furnished to do
+' so, subject to the following conditions:
+'
+' The above copyright notice and this permission notice shall be included in all
+' copies or substantial portions of the Software.
+'
+' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+' SOFTWARE.
+'
+' $Id$
+'
+Rem
+bbdoc: noddybox.gfxmenu
+EndRem
+Module noddybox.gfxmenu
+
+ModuleInfo "Framework: Simple Graphical Menu"
+ModuleInfo "Copyright: Ian Cowburn -- released under the MIT License"
+ModuleInfo "Author: Ian Cowburn"
+ModuleInfo "Version: $Revision$"
+
+Import brl.linkedlist
+Import brl.max2d
+
+Rem
+bbdoc: Allows a menu backdrop to be automatically processed. Derive a class from this to use.
+EndRem
+Type TGfxMenuBackdrop Abstract
+ Rem
+ bbdoc: Create a menu backdrop element.
+ returns: The created elemnt.
+ about: Notice that this is a method, rather than the usual function creator.
+ EndRem
+ Method Create:TGfxMenuBackdrop() Abstract
+ Rem
+ bbdoc: Called by the menu to update the backdrop.
+ EndRem
+ Method Update() Abstract
+End Type
+
+Rem
+bbdoc: Defines a graphical menu.
+EndRem
+Type TGfxMenu
+ Field list:TList
+ Field bdrop:TList
+ Field mbdown:Int
+ Field r:Int
+ Field g:Int
+ Field b:Int
+ Field over_r:Int
+ Field over_g:Int
+ Field over_b:Int
+ Field fade:Int
+
+ Rem
+ bbdoc: Create a menu.
+ returns: The created menu.
+ about: @backdrop is the backdrop to create (null for no backdrop). @num is the number of backdrop items to create.
+ SetColor() is called with @r, @g and @b when the mouse is not over an item, overwise SetColor() is
+ called with @over_r, @over_g and @over_b when the item is active. @fade is the amount colours will alter as the
+ mouse hovers over buttons. Set this to 255 to make colour changes instant.
+ EndRem
+ Function Create:TGfxMenu(r:Int=164, g:Int=164, b:Int=164, over_r:Int=255, over_g:Int=255, over_b:Int=255, fade:Int=5, backdrop:TGfxMenuBackdrop=Null, num:Int=0)
+ Local menu:TGfxMenu=New TGfxMenu
+
+ menu.list=New TList
+ menu.bdrop=New TList
+ menu.mbdown=False
+
+ menu.r=r
+ menu.g=g
+ menu.b=b
+ menu.over_r=over_r
+ menu.over_g=over_g
+ menu.over_b=over_b
+ menu.fade=fade
+
+ If backdrop
+ For Local f:Int=0 Until num
+ menu.bdrop.AddLast(backdrop.Create())
+ Next
+ EndIf
+
+ Return menu
+ End Function
+
+ Rem
+ bbdoc: Adds a menu item.
+ returns: The created menu.
+ about: @x and @y are the position to draw the image at. If @x is -1 then the image is centred. @i is the image.
+ @id is the value returned from @Render() for this menu item. Don't use -1 for this!
+ EndRem
+ Method Add(x:Int, y:Int, i:TImage, id:Int)
+ list.AddLast(TGfxMenuOpt.Create(x,y,i,id,r,g,b))
+ End Method
+
+ Rem
+ bbdoc: Renders and updates the menu.
+ returns: The selected item, or -1 if nothing clicked.
+ about: Set @hide to True to hide the menu (the backdrop is still updated). SetColor() may have changed when this routine exits.
+ EndRem
+ Method Render:Int(hide:Int)
+ For Local p:TGfxMenuBackdrop=EachIn bdrop
+ p.Update()
+ Next
+
+ If hide
+ Return -1
+ EndIf
+
+ Local in:Int=-1
+ Local mx:Int=MouseX()
+ Local my:Int=MouseY()
+ Local any:Int=False
+
+ For Local opt:TGfxMenuOpt=EachIn list
+ If opt.InBox(mx,my)
+ opt.r=Towards(over_r,opt.r)
+ opt.g=Towards(over_g,opt.g)
+ opt.b=Towards(over_b,opt.b)
+ SetColor(opt.r,opt.g,opt.b)
+
+ If MouseDown(1)
+ mbdown=True
+ DrawImage(opt.i,opt.x,opt.y+2)
+ any=True
+ Else
+ DrawImage(opt.i,opt.x,opt.y)
+ If mbdown
+ in=opt.id
+ EndIf
+ mbdown=False
+ EndIf
+ Else
+ opt.r=Towards(r,opt.r)
+ opt.g=Towards(g,opt.g)
+ opt.b=Towards(b,opt.b)
+ SetColor(opt.r,opt.g,opt.b)
+ DrawImage(opt.i,opt.x,opt.y)
+ EndIf
+ Next
+
+ If Not any
+ mbdown=False
+ EndIf
+
+ Return in
+ End Method
+
+ Method Towards:Int(dest:Int, val:Int)
+ If val<dest
+ Return Min(dest,val+fade)
+ ElseIf val>dest
+ Return Max(dest,val-fade)
+ EndIf
+
+ Return val
+ End Method
+End Type
+
+Private
+
+Type TGfxMenuOpt
+ Field x:Int
+ Field y:Int
+ Field i:TImage
+ Field id:Int
+ Field r:Int
+ Field g:Int
+ Field b:Int
+
+ Function Create:TGfxMenuOpt(x:Int, y:Int, i:TImage, id:Int, r:Int, g:Int, b:Int)
+ Local o:TGfxMenuOpt=New TGfxMenuOpt
+
+ If x=-1
+ x=(GraphicsWidth()-ImageWidth(i))/2
+ EndIf
+
+ o.x=x
+ o.y=y
+ o.i=i
+ o.id=id
+ o.r=r
+ o.g=g
+ o.b=b
+
+ Return o
+ End Function
+
+ Method InBox:Int(mx:Int, my:Int)
+ Return mx>=x And my>=y And mx<=x+ImageWidth(i) And my<=y+ImageHeight(i)
+ End Method
+End Type