MaxGUI: Boxes [Beta]
Übersicht

![]() |
BtbNBetreff: MaxGUI: Boxes [Beta] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group