MaxGUI: Boxes [Beta]

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

BtbN

Betreff: MaxGUI: Boxes [Beta]

BeitragMi, Jan 24, 2007 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermiste schon oft die mir aus QT3 bekannten HBox und VBox Widgets, deshalb hab ich mich dran gesetzt, und etwas vergleichbares für MaxGUI nachzubauen, das ergebnis:

Code: [AUSKLAPPEN]
SuperStrict

Rem

#############################################################################
#############################################################################
###                                                                       ###
### Copyright (c) 2007 Timo 'BtbN' Rothenpieler                           ###
###                                                                       ###
### 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.                                       ###
###                                                                       ###
#############################################################################
#############################################################################

EndRem

Module btbn.guiboxes
ModuleInfo "Author: BtbN"
ModuleInfo "License: MIT"
ModuleInfo "Version: 1.0"

Import BRL.MaxGUI
Import BRL.FLTKMaxGUI
Import BRL.Win32MaxGUI
Import BRL.CocoaMaxGUI
Import BRL.Event


AddHook(EmitEventHook,TBox._hook)

Type TBox Extends TProxyGadget
   Global list:TList = New TList
   Field link:TLink

   Field elemList:TList

   Field x:Int,y:Int,w:Int,h:Int
   Field horizontal:Int = True
   Field margin:Int = 0
   Field spacing:Int = 0

   Method New()
      elemList = New TList
   EndMethod

   Function _hook:Object(id:Int,data:Object,context:Object)
      Local event:TEvent = TEvent(data)
      If id <> EmitEventHook Or Not event Then Return data

      If event.ID = EVENT_WINDOWSIZE Then
         For Local box:TBox = EachIn TBox.list
            box.UpdateShapes()
         Next
      EndIf

      Return data
   EndFunction

   Function Create:TBox(x:Int,y:Int,w:Int,h:Int,horizontal:Int=True,grp:TGadget=Null,style:Int=15,title:String="Box")
      Local box:TBox = New TBox

      If grp = Null Then
         box.SetProxy(CreateWindow(title,x,y,w,h,Null,style))
      Else
         If TBox(grp) <> Null Then grp = TBox(grp).proxy
         box.SetProxy(CreatePanel(x,y,w,h,grp))
?debug
         SetPanelColor(box.proxy,255,0,0)
         If horizontal Then SetPanelColor(box.proxy,0,0,255)
?
      EndIf

      SetGadgetLayout(box.proxy,EDGE_ALIGNED,EDGE_ALIGNED,EDGE_ALIGNED,EDGE_ALIGNED)

      box.link = TBox.list.AddLast(box)
      box.horizontal = horizontal
      box.UpdateShapes()

      Return box
   EndFunction

   Method GetHandle:TGadget()
      Return proxy
   EndMethod

   Method SetShape(x:Int,y:Int,w:Int,h:Int)
      proxy.SetShape(x,y,w,h)
      UpdateShapes()
   EndMethod

   Method AddGadget:TBoxElement(gad:TGadget,sf:Float=1,sp:Int=-1.0)
      Local elem:TBoxElement = New TBoxElement

      Select GetGadgetType(gad)
         Case GADGET_COMBOBOX,GADGET_TEXTFIELD,GADGET_BUTTON,GADGET_LABEL,GADGET_TOOLBAR
            elem.sizePolicy = TBoxElement.SP_HORIZONTAL
         Default
            elem.sizePolicy = TBoxElement.SP_BOTH
      EndSelect

      elem.link = elemList.AddLast(elem)
      elem.gadget = gad
      elem.stretchFactor = sf
      If sp <> -1 Then elem.sizePolicy = sp

      UpdateShapes()

      Return elem
   EndMethod

   Method InsertGadget:TBoxElement(gad:TGadget,pos:Int,sf:Float=1.0,sp:Int=-1)
      Local elem:TBoxElement = New TBoxElement

      Select GetGadgetType(gad)
         Case GADGET_COMBOBOX,GADGET_TEXTFIELD,GADGET_BUTTON,GADGET_LABEL,GADGET_TOOLBAR
            elem.sizePolicy = TBoxElement.SP_HORIZONTAL
         Default
            elem.sizePolicy = TBoxElement.SP_BOTH
      EndSelect

      Local beflnk:TLink = TBoxElement(elemlist.ValueAtIndex(pos)).link

      elem.link = elemList.InsertBeforeLink(elem,beflnk)
      elem.gadget = gad
      elem.stretchFactor = sf
      If sp <> -1 Then elem.sizePolicy = sp

      UpdateShapes()

      Return elem   
   EndMethod

   Method UpdateShapes()
      width = proxy.width
      height = proxy.height
      xpos = proxy.xpos
      ypos = proxy.ypos
   
      Local tmpElem:TBoxElement,gesStretch:Float=0.0,num:Int=elemList.Count()
      Local availInnerX:Int = width-2*spacing-((num-1)*margin)
      Local availInnerY:Int = height-2*spacing-((num-1)*margin)

      If horizontal Then
         For tmpElem = EachIn elemList
            If tmpElem.sizePolicy & TBoxElement.SP_HORIZONTAL Then
               gesStretch :+ tmpElem.stretchFactor
            Else
               availInnerX :- tmpElem.gadget.width
            EndIf
         Next

         Local nowX:Int = spacing
         For tmpElem = EachIn elemList
            Local gad:TGadget = tmpElem.gadget

            If tmpElem.sizePolicy & TBoxElement.SP_VERTICAL Then
               gad.SetShape(gad.xpos,spacing,gad.width,height-2*spacing)
            Else
               gad.SetShape(gad.xpos,height/2-gad.height/2,gad.width,gad.height)
            EndIf
            If tmpElem.sizePolicy & TBoxElement.SP_HORIZONTAL Then
               Local tmp:Int = Float(availInnerX)*((tmpElem.stretchFactor)/gesStretch)
               gad.SetShape(nowX,gad.ypos,tmp,gad.height)
               nowX :+ tmp + margin
            Else
               gad.SetShape(nowX,gad.ypos,gad.width,gad.height)
               nowX :+ gad.width + margin
            EndIf
         Next
      Else
         For tmpElem = EachIn elemList
            If tmpElem.sizePolicy & TBoxElement.SP_VERTICAL Then
               gesStretch :+ tmpElem.stretchFactor
            Else
               availInnerY :- tmpElem.gadget.height
               availInnerY :- margin
            EndIf
         Next

         Local nowY:Int = spacing
         For tmpElem = EachIn elemList
            Local gad:TGadget = tmpElem.gadget

            If tmpElem.sizePolicy & TBoxElement.SP_HORIZONTAL Then
               gad.SetShape(spacing,gad.ypos,width-2*spacing,gad.height)
            Else
               gad.SetShape(width/2-gad.width/2,gad.ypos,gad.width,gad.height)
            EndIf
            If tmpElem.sizePolicy & TBoxElement.SP_VERTICAL Then
               Local tmp:Int = Float(availInnerY)*((tmpElem.stretchFactor)/gesStretch)
               gad.SetShape(gad.xpos,nowY,gad.width,tmp)
               nowY :+ tmp + margin
            Else
               gad.SetShape(gad.xpos,nowY,gad.width,gad.height)
               nowY :+ gad.height + margin
            EndIf
         Next
      EndIf
   EndMethod
EndType

Type TBoxElement
   Const SP_VERTICAL:Int = 1
   Const SP_HORIZONTAL:Int = 2
   Const SP_BOTH:Int = 3

   Field stretchFactor:Float = 1.0
   Field sizePolicy:Int = SP_BOTH

   'Privates
   Field _localHint:Float
   Field gadget:TGadget
   Field link:TLink
EndType


Function GetGadgetType:Int(gadget:TGadget)
?Win32
   Local wdg:TWin32Gadget = TWin32Gadget(gadget)
   If Not wdg Then Return GADGET_PANEL
   Return wdg.class
?Linux
   Local flwdg:TFLWidget = TFLWidget(gadget)
   If Not flwdg Then Return GADGET_PANEL

   Select   flwdg.fltype
      Case FL_WINDOW
         Return GADGET_WINDOW
      Case FL_BUTTON
         Return GADGET_BUTTON
      Case FL_CHECKBUTTON
         Return GADGET_BUTTON
      Case FL_ROUNDBUTTON
         Return GADGET_BUTTON
      Case FL_PANEL
         Return GADGET_PANEL
      Case FL_INPUT
         Return GADGET_TEXTFIELD
      Case FL_PASSWORD
         Return GADGET_TEXTFIELD
      Case FL_TABS
         Return GADGET_TABBER
      Case FL_BROWSER
         Return GADGET_TREEVIEW
      Case FL_CHOICE
         Return GADGET_COMBOBOX
      Case FL_TEXTEDITOR
         Return GADGET_TEXTAREA
      Case FL_TEXTDISPLAY
         Return GADGET_TEXTAREA
      Case FL_HELPVIEW
         Return GADGET_HTMLVIEW
      Case FL_BOX
         Return GADGET_LABEL
      Case FL_TOOLBAR
         Return GADGET_TOOLBAR
      Case FL_PROGBAR
         Return GADGET_PROGBAR
      Case FL_SLIDER
         Return GADGET_SLIDER
      Case FL_SCROLLBAR
         Return GADGET_SLIDER
      Case FL_CANVAS
         Return GADGET_CANVAS
      Case FL_MENUITEM
         Return GADGET_MENUITEM
      Case FL_DESKTOP
         Return GADGET_DESKTOP
      Case FL_TIMER
         Return GADGET_TIMER
   EndSelect
?MacOS
   Local nswdg:TNSGadget = TNSGadget(gadget)
   If Not nswdg Then Return GADGET_PANEL
   Return nswdg.class
?

   Return GADGET_PANEL
EndFunction



Und hier ein Beispiel(Einmal im Debug-Modus und einmal normal angucken Wink ):

Code: [AUSKLAPPEN]
SuperStrict

Framework BtbN.GuiBoxes


Global mainWin:TGadget = CreateWindow("Test!",50,50,900,700)
Global hBox:TBox = TBox.Create(0,0,800,600,1,mainWin)
Global vBox:TBox = TBox.Create(0,0,800,600,0,hBox)

Global test:TGadget = CreateTextArea(0,0,150,150,vBox.GetHandle())
Global test2:TGadget = CreateTextArea(0,0,50,50,vBox.GetHandle())
Global test3:TGadget = CreateTextArea(0,0,50,50,hBox.GetHandle())
SetGadgetText(test,"Test 1")
SetGadgetText(test2,"Test 2")
SetGadgetText(test3,"Test 3")

hBox.margin  = 10
hBox.spacing = 10
vBox.margin  = 10
vBox.spacing = 10

vBox.AddGadget(test)
vBox.AddGadget(test2)
hBox.AddGadget(vBox)
hBox.InsertGadget(test3,0)

Repeat
   If WaitEvent() = EVENT_WINDOWCLOSE Then End
Forever

End



Das Beispiel ist so angelegt, dass man sieht, was wo passiert.


Known Bugs:
- Sieht auf jedem OS geringfügig anders aus

Lizenz: MIT



Freue mich über jeden testberichte/screens.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group