I've modify a little his code.
A little buggy, MS WIndows only but it's possible.
M.
Code: Select all
;---> First attempt to create a menu with a TabBarGadget
;|-------------------------------------------------------------------------------------------------
;|
;| Title : TabBarGadget
;| Version : 'kenmo-mods' fork based off v1.5 Beta 2a
;| Copyright : UnionBytes
;| (Martin Guttmann alias STARGÅTE)
;| PureBasic : 5.20+
;| String Format : Ascii, Unicode
;| Operating System : Windows, Linux, MacOS
;| Processor : x86, x64
;|
;|-------------------------------------------------------------------------------------------------
;|
;| Description : Gadget for displaying and using tabs like in the browser
;|
;| Forum Topic : http://www.purebasic.fr/german/viewtopic.php?f=8&t=24788
;| http://www.purebasic.fr/english/viewtopic.php?f=12&t=47588
;| Website : https://www.unionbytes.de/libs/tabbargadget/
;|
;| Documentation : http://help.unionbytes.de/tbg/
;|
;| Added theme color by Mesa
;|
;|-------------------------------------------------------------------------------------------------
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;- 1. Constants / Konstanten
;|__________________________________________________________________________________________________
; Attribute für das TabBarGadget
Enumeration
#TabBarGadget_None = 0<<0
#TabBarGadget_CloseButton = 1<<0
#TabBarGadget_NewTab = 1<<1
#TabBarGadget_TextCutting = 1<<2
#TabBarGadget_MirroredTabs = 1<<3
#TabBarGadget_Vertical = 1<<4
#TabBarGadget_NoTabMoving = 1<<5
#TabBarGadget_MultiLine = 1<<6
#TabBarGadget_BottomLine = 1<<7
#TabBarGadget_PopupButton = 1<<8
#TabBarGadget_Editable = 1<<9
#TabBarGadget_MultiSelect = 1<<10
#TabBarGadget_CheckBox = 1<<11
#TabBarGadget_SelectedCloseButton = 1<<12
#TabBarGadget_ReverseOrdering = 1<<13
#TabBarGadget_ImageSize = 1<<23
#TabBarGadget_TabTextAlignment = 1<<24
#TabBarGadget_ScrollPosition = 1<<25
#TabBarGadget_NormalTabLength = 1<<26 ; für Später
#TabBarGadget_MaxTabLength = 1<<27
#TabBarGadget_MinTabLength = 1<<28
#TabBarGadget_TabRounding = 1<<29
EndEnumeration
; Global attributes for all TabBarGadgets
Enumeration
#TabBarGadgetGlobal_WheelDirection = 1 << 0
#TabBarGadgetGlobal_WheelAction = 1 << 1
#TabBarGadgetGlobal_DrawDisabled = 1 << 2
#TabBarGadgetGlobal_MiddleClickClose = 1 << 3
#TabBarGadgetGlobal_DoubleClickNew = 1 << 4
#TabBarGadgetGlobal_TabBarColor = 1 << 5
#TabBarGadgetGlobal_BorderColor = 1 << 6
#TabBarGadgetGlobal_FaceColor = 1 << 7
#TabBarGadgetGlobal_TextColor = 1 << 8
EndEnumeration
; TabBarGadgetEvent
Enumeration #PB_EventType_FirstCustomValue
#TabBarGadget_EventType_Pushed
#TabBarGadget_EventType_Updated ; Das Gadget hat sich aktualisiert (intern)
#TabBarGadget_EventType_Change ; Der aktive Tab wurde geändert
#TabBarGadget_EventType_Resize ; La taille de la barre a changé
#TabBarGadget_EventType_NewItem ; un nouvel onglet est demandé
#TabBarGadget_EventType_CloseItem ; ein Tab soll geschlossen werden
#TabBarGadget_EventType_SwapItem ; der aktive Tab wurde verschoben
#TabBarGadget_EventType_EditItem ; der Text einer Karte wurde geändert
#TabBarGadget_EventType_CheckBox ; der Status der Checkbox hat sich geändert
#TabBarGadget_EventType_PopupButton ; le bouton contextuel a été enfoncé
#TabBarGadget_EventType_DeSelected ; MESA
EndEnumeration
; Constantes de position pour les commandes "Item"
Enumeration
#TabBarGadgetItem_None = -1
#TabBarGadgetItem_NewTab = -2
#TabBarGadgetItem_Selected = -3
#TabBarGadgetItem_Event = -4
EndEnumeration
; constantes d'état
Enumeration
#TabBarGadget_Disabled = 1<<0
#TabBarGadget_Selected = 1<<1
#TabBarGadget_Checked = 1<<2
EndEnumeration
; constantes d'état
Enumeration
#TabBarGadgetUpdate_Directly = 0
#TabBarGadgetUpdate_PostEvent = 1
EndEnumeration
; MouseWheel actions
Enumeration
#TabBarGadgetWheelAction_None = 0
#TabBarGadgetWheelAction_Scroll = 1
#TabBarGadgetWheelAction_Change = 2
EndEnumeration
#TabBarGadget_DefaultHeight = 1
; Default colors
#TabBarGadgetColor_TabBarDefault = $D0D0D0
#TabBarGadgetColor_BorderDefault = $808080
#TabBarGadgetColor_FaceDefault = $D0D0D0
#TabBarGadgetColor_TextDefault = $000000
; Constante Interne
#TabBarGadget_PreviousArrow = 1<<30
#TabBarGadget_NextArrow = 1<<31
#TabBarGadgetItem_DisableFace = -1
#TabBarGadgetItem_NormalFace = 0
#TabBarGadgetItem_HoverFace = 1
#TabBarGadgetItem_ActiveFace = 2
#TabBarGadgetItem_MoveFace = 3
; Compile switch for extra safety - could affect callback performance!
CompilerIf Not Defined(TabBarGadget_EnableCallbackGadgetCheck, #PB_Constant)
#TabBarGadget_EnableCallbackGadgetCheck = #False
CompilerEndIf
; Compile switch to use WinAPI for drawing clearer text
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
CompilerIf Not Defined(TabBarGadget_EnableWinAPIText, #PB_Constant)
#TabBarGadget_EnableWinAPIText = #True
CompilerEndIf
CompilerElse
#TabBarGadget_EnableWinAPIText = #False
CompilerEndIf
;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;- 2. Structures / Strukturen
;|__________________________________________________________________________________________________
; Entrée triée pour la troncation du texte
Structure TabBarGadgetSortedItem
*Item.TabBarGadgetItem ; Onglet
Characters.i ; nombre de lettres
EndStructure
; Paramètres actuels une ligne d'onglet
Structure TabBarGadgetRow
Length.i ; Longueur actuelle d'une ligne
Items.i ; Nombre actuel d'onglets
EndStructure
; Couleurs pour un item
Structure TabBarGadgetItemColor
Text.i ; couleur du texte
Background.i ; Couleur de l'arrière plan
FaceColorSelected.i ;MESA
TextColorSelected .i ;MESA
BorderColor.i ;MESA
EndStructure
; Emplacement et taille d'un onglet
Structure TabBarGadgetItemLayout
X.i ; X-Position
Y.i ; Y-Position
Width.i ; largeur (intérieure)
Height.i ; hauteur (intérieure)
PaddingX.i ; Grossissement (par exemple avec onglet actif)
PaddingY.i ;
CrossX.i ; Position des X fermeture
CrossY.i ;
TextX.i ; Textposition
TextY.i ;
CheckX.i ; Checkbox-Position
CheckY.i ;
ImageX.i ; Icon-Position
ImageY.i ;
EndStructure
; Onglet
Structure TabBarGadgetItem
Text.s ; Text
ShortText.s ; verkürzter Text
Color.TabBarGadgetItemColor ; Farbattribute
Image.i ; Bild (Kopie vom Original)
DrawedImage.i ; Bild (Kopie ggf. rotiert)
DataValue.i ; Benutzer-Daten-Wert
Attributes.i ; Attribute
Disabled.i ; Deaktiviert
Selected.i ; Aktuell ausgewählt
Checked.i ; Abgehakt
ToolTip.s ; ToolTip
Length.i ; Longueur en pixels (TEMP)
Row.i ; Zeile (TEMP)
Position.i ; Position (TEMP)
Visible.i ; Sichtbar und wird gezeichnet (TEMP)
Face.i ; Aussehen (TEMP)
Layout.TabBarGadgetItemLayout ; Layout der Karte (TEMP)
*PreviousSelectedItem.TabBarGadgetItem ; Zuvor ausgewählter Tab
EndStructure
; Tooltips
Structure TabBarGadgetToolTip
*Current ; Adresse actuelle de l'info-bulle
*Old ; Ancienne adresse d'info-bulle
ItemText.s ; Texte de l'onglet
NewText.s ; Texte pour l'onglet "Nouveau"
CloseText.s ; Texte pour le bouton de fermeture
EndStructure
; Texte pour le bouton de fermeture
; Onglet modifié
Structure TabBarGadgetEditor
*Item.TabBarGadgetItem ; Carte à modifier
OldText.s ; Ancien texte avant modification
Cursor.i ; Cursor-Position
Selection.i ; longueur du marqueur de texte
Selectable.i ; Si le mouvement de la souris entraîne une surbrillance du texte
EndStructure
; Layout der Leiste
Structure TabBarGadgetLayout
PreviousButtonX.i ; Position de la flèche de navigation "retour"
PreviousButtonY.i
NextButtonX.i ; Position "avant" de la flèche de navigation
NextButtonY.i
PopupButtonX.i ; Position de la flèche popup
PopupButtonY.i
ButtonWidth.i ; taille des boutons
ButtonHeight.i
ButtonSize.i
EndStructure
; Registerkartenleiste
Structure TabBarGadget
Number.i ; #Nummer
Window.i ; Fenster-Nummer
FontID.i ; Schrift
DataValue.i ; Benutzer-Daten-Wert
Attributes.i ; Attribute
List Item.TabBarGadgetItem() ; Registerkarten
NewTabItem.TabBarGadgetItem ; "Neu"-Registerkarte
*SelectedItem.TabBarGadgetItem ; ausgewählte Registerkarte
*MoveItem.TabBarGadgetItem ; bewegte Registerkarte
*HoverItem.TabBarGadgetItem ; hervorgehobene Registerkarte
HoverClose.i ; Schließenbutton hervorgehoben
HoverCheck.i ; Checkbox hervorgehoben
HoverArrow.i ; Navigationbutton hervorgehoben
*ReadyToMoveItem.TabBarGadgetItem ; Registerkarte die bereit ist bewegt zu werden
*LockedItem.TabBarGadgetItem ; Registerkarte angeschlagen wurde (für Klicks)
LockedClose.i ; Schließenbutton angeschlagen
LockedCheck.i ; Schließenbutton angeschlagen
LockedArrow.i ; Navigationsbutton angeschlagen
SaveMouseX.i ; position de la souris enregistrée
SaveMouseY.i ; position de la souris enregistrée
MouseX.i ; X-Mausposition
MouseY.i ; Y-Mausposition
Event.i ; dernier événement
EventTab.i ; Position de l'onglet où le dernier événement était
Shift.i ; déplacement de la barre
LastShift.i ; Maximale sinnvolle Verschiebung
FocusingSelectedTab.i ; l'onglet sélectionné doit avoir le focus
MaxLength.i ; maximal nutzbare Länge für Karten
Length.i ; Longueur de toutes les cartes visibles
Radius.i ; Radius der Kartenrundung
MinTabLength.i ; minimale Länge einer Karte
MaxTabLength.i ; maximale Länge einer Karte
NormalTabLength.i ; normale Länge einer Karte
TabTextAlignment.i ; Alignement du texte
ToolTip.TabBarGadgetToolTip ; ToolTip
TabSize.i ; Größer einer Registerkarte
Rows.i ; Anzahl der Zeilen
Resized.i ; Das Gadget muss vergrößert werden
Editor.TabBarGadgetEditor ; Editor für eine Karte
Layout.TabBarGadgetLayout ; Disposition des barres
UpdatePosted.i ; Mise à jour PostEvent #True
CompilerIf #TabBarGadget_EnableWinAPIText
DrawingID.i ; Drawing handle for API text drawing
PrevFont.i ; Store previous font handle to restore
DrawRect.RECT ; Allocate a RECT struct for WinAPI
CompilerEndIf
TabBarColor.i ;MESA
BorderColor.i ;MESA
FaceColor.i ;MESA
TextColor.i ;MESA
FaceColorSelected.i ;MESA
TextColorSelected .i ;MESA
MenuIsOpen.i ;MESA
EndStructure
; Timer für das kontinuierliche Scrollen
Structure TabBarGadget_Timer
*TabBarGadget.TabBarGadget ; TabBarGadget-ID
Type.i ; Modus (Scrollen)
Mutex.i ; Mutex zur Sicherung
EndStructure
; Include für das Registerkartenleisten-Gadget
Structure TabBarGadgetInclude
; TabBarColor.i ; Hintergrundfarbe des Gadgets
; FaceColor.i ; Hintergrundfarbe einer Karte
HoverColorPlus.i ; Farbänderung für den Hover-Effekt
ActivColorPlus.i ; Farbänderung für aktuell ausgewählte Karten
BorderColor.i ; Rahmenfarbe
TextColor.i ; Textfarbe
PaddingX.i ; Remplissage (texte à encadrer)
PaddingY.i ; Remplissage (texte à encadrer)
Margin.i ; Marge (en bordure du gadget)
ImageSpace.i ; Espace libre entre l'image et le texte
CloseButtonSize.i ; Taille de la croix fermer
CheckBoxSize.i
ImageSize.i
ArrowSize.i ; Taille de la flèche de navigation
ArrowWidth.i ;
ArrowHeight.i ;
Radius.i ; Radius der Abrundung der Karte
MinTabLength.i ; Mimimale Länge einer Karte
MaxTabLength.i ; Maximale Länge einer Karte
TabTextAlignment.i
VerticalTextBugFix.f
NormalTabLength.i ; [für später]
FadeOut.i ; Länge der Farbausblendung bei einer Navigation
WheelDirection.i ; Scrollrichtung bei Mausradbewegung
WheelAction.i ; Action for MouseWheel events
RowDirection.i ; Reihenfolge der Zeilen
EnableDoubleClickForNewTab.i ; Doppelklick ins "Leere" erzeigt ein Ereignis
EnableMiddleClickForCloseTab.i ; Mittelklick auf eine Karte erzeigt ein Ereignis
Timer.TabBarGadget_Timer ; Timer für das kontinuierliche Scrollen
DefaultFontID.i ; System default font ID
DrawDisabled.i ; Disable redraw for batch tab changes
EndStructure
;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;- 3. Initializations / Initialisierungen
;|__________________________________________________________________________________________________
Global TabBarGadgetInclude.TabBarGadgetInclude
Declare TabBarGadget_Timer(Null.i)
; Ces valeurs peuvent ensuite être modifiées dans l'include ainsi que dans le code principal via TabBarGadgetInclude\Field.
With TabBarGadgetInclude
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
; \TabBarColor = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)
; \BorderColor = $FF<<24 | GetSysColor_(#COLOR_3DSHADOW)
; \FaceColor = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)
; \TextColor = $FF<<24 | GetSysColor_(#COLOR_BTNTEXT)
CompilerDefault
; \TabBarColor = $FF<<24 | #TabBarGadgetColor_TabBarDefault
; \BorderColor = $FF<<24 | #TabBarGadgetColor_BorderDefault
; \FaceColor = $FF<<24 | #TabBarGadgetColor_FaceDefault
; \TextColor = $FF<<24 | #TabBarGadgetColor_TextDefault
CompilerEndSelect
\HoverColorPlus = $FF101010
\ActivColorPlus = $FF101010
\PaddingX = 6 ; Space from tab border to text
\PaddingY = 5 ; Space from tab border to text
\Margin = 0 ; Space from tab to border
\ImageSpace = 3 ; Space from image zu text
\ImageSize = 16
\CloseButtonSize = 13 ; Size of the close cross
\CheckBoxSize = 10
\ArrowSize = 5 ; Size of the Arrow in the button in navigation
\ArrowWidth = 12 ; Width of the Arrow-Button in navigation
\ArrowHeight = 18 ; Height of the Arrow-Button in navigation
\Radius = 0 ; Radius of the edge of the tab
\TabTextAlignment = -1
\VerticalTextBugFix = 1.05
\MinTabLength = 0
\MaxTabLength = 10000
\NormalTabLength = 150
\FadeOut = 32 ; Length of fade out to the navi
\WheelDirection = -1
\WheelAction = #TabBarGadgetWheelAction_Change;#TabBarGadgetWheelAction_Scroll;#TabBarGadgetWheelAction_None
\RowDirection = 1 ; not used
\EnableDoubleClickForNewTab = #False ;#True;
\EnableMiddleClickForCloseTab = #False ;#True;
\Timer\Mutex = CreateMutex()
CompilerIf #PB_Compiler_Thread
CreateThread(@TabBarGadget_Timer(), #Null)
CompilerEndIf
EndWith
;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;- 4. Procedures & Macros / Prozeduren & Makros
;|__________________________________________________________________________________________________
;- 4.1 Private procedures for internal calculations ! Not for use !
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; StartDrawing() wrapper which saves handle for WinAPI drawing
Procedure.i TabBarGadget_StartDrawing(*TabBarGadget.TabBarGadget)
;Update(*), Callback(), UpdateTabBarGadget(Gadget.i)
CompilerIf #TabBarGadget_EnableWinAPIText
With *TabBarGadget
\DrawingID = StartDrawing(CanvasOutput(*TabBarGadget\Number))
If \DrawingID
\PrevFont = SelectObject_(\DrawingID, \FontID)
\DrawRect\right = OutputWidth()
\DrawRect\bottom = OutputHeight()
SetBkMode_(\DrawingID, #TRANSPARENT)
EndIf
ProcedureReturn \DrawingID
EndWith
CompilerElse
ProcedureReturn StartDrawing(CanvasOutput(*TabBarGadget\Number))
CompilerEndIf
EndProcedure
; StopDrawing() wrapper which clears handle for WinAPI drawing
Procedure.i TabBarGadget_StopDrawing(*TabBarGadget.TabBarGadget)
;Update(*), Callback(),, UpdateTabBarGadget(Gadget.i)
CompilerIf #TabBarGadget_EnableWinAPIText
With *TabBarGadget
If (\DrawingID)
SelectObject_(\DrawingID, \PrevFont)
\DrawingID = #Null
EndIf
EndWith
CompilerEndIf
StopDrawing()
EndProcedure
; DrawText() wrapper which uses Windows API if enabled
Procedure TabBarGadget_DrawText(*TabBarGadget.TabBarGadget, x.i, y.i, Text.s, Color.i)
;1xDrawItem(*,*), Examine(*),
CompilerIf #TabBarGadget_EnableWinAPIText
With *TabBarGadget
\DrawRect\left = x
\DrawRect\top = y
SetTextColor_(\DrawingID, Color & $00FFFFFF)
DrawText_(\DrawingID, @Text, -1, @\DrawRect, #DT_NOPREFIX | #DT_SINGLELINE)
EndWith
CompilerElse
DrawText(x, y, Text, Color)
CompilerEndIf
EndProcedure
; Renvoie l'adresse (ID) de l'onglet.
; La position peut être une constante, une position ou un ID.
Procedure.i TabBarGadget_ItemID(*TabBarGadget.TabBarGadget, Position.i)
;ItemID(*), Examine(*)(wheel), AddTabBarGadgetItem()
;,, TabBarGadgetItemID(G,),RemoveTabBarGadgetItem(G,),SetTabBarGadgetState(G,),SetTabBarGadgetItemAttribute(G,)
;,, SetTabBarGadgetItemImage(G,), SetTabBarGadgetItemPosition(G,),SetTabBarGadgetItemState(G,)
With *TabBarGadget
Select Position
Case #TabBarGadgetItem_Event
ProcedureReturn TabBarGadget_ItemID(*TabBarGadget, \EventTab)
Case #TabBarGadgetItem_Selected
If \SelectedItem
ChangeCurrentElement(\Item(), \SelectedItem)
ProcedureReturn @\Item()
Else
ProcedureReturn #Null
EndIf
Case #TabBarGadgetItem_NewTab
ProcedureReturn @\NewTabItem
Case #TabBarGadgetItem_None
ProcedureReturn #Null
Default
If Position >= 0 And Position < ListSize(\Item())
ProcedureReturn SelectElement(\Item(), Position)
ElseIf Position >= ListSize(\Item())
ForEach \Item()
If @\Item() = Position
ProcedureReturn @\Item()
EndIf
Next
EndIf
EndSelect
EndWith
EndProcedure
; Libère à nouveau les ressources d'un onglet.
Procedure TabBarGadget_ClearItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
;RemoveItem(*,*)
;,,FreeTabBarGadget(Gadget.i),ClearTabBarGadgetItems(Gadget.i)
If *Item\Image
FreeImage(*Item\Image)
EndIf
If *Item\DrawedImage
FreeImage(*Item\DrawedImage)
EndIf
EndProcedure
; Sélectionne l'onglet spécifié et met à jour la hiérarchie de sélection
Procedure TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
;RemoveItem(*,*),Examine(*)
;,,SetTabBarGadgetState(G,),SetTabBarGadgetItemState(G,)
If *TabBarGadget\Attributes & #TabBarGadget_MultiSelect = #False
ForEach *TabBarGadget\Item()
*TabBarGadget\Item()\Selected = #False
Next
EndIf
If *Item
*Item\Selected = #True
If *Item <> *TabBarGadget\SelectedItem
*Item\PreviousSelectedItem = *TabBarGadget\SelectedItem
EndIf
*TabBarGadget\FocusingSelectedTab = #True
EndIf
*TabBarGadget\SelectedItem = *Item
EndProcedure
; Désélectionne l'onglet spécifié et met à jour la hiérarchie de sélection
Procedure TabBarGadget_UnselectItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
;RemoveItem(*,*), Examine(*)
;,,SetTabBarGadgetItemState(G,)
If *item ;*
*Item\Selected = #False
ForEach *TabBarGadget\Item()
If *TabBarGadget\Item()\PreviousSelectedItem = *Item
If *Item\PreviousSelectedItem <> *TabBarGadget\Item()
*TabBarGadget\Item()\PreviousSelectedItem = *Item\PreviousSelectedItem
Else
*TabBarGadget\Item()\PreviousSelectedItem = #Null
EndIf
EndIf
Next
If *TabBarGadget\SelectedItem = *Item ; La sélection doit être modifiée
*TabBarGadget\SelectedItem = *Item\PreviousSelectedItem
If *TabBarGadget\SelectedItem
*TabBarGadget\SelectedItem\Selected = #True
EndIf
EndIf
EndIf;*
EndProcedure
; Supprime l'onglet et met à jour la hiérarchie de sélection
Procedure TabBarGadget_RemoveItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
;,,RemoveTabBarGadgetItem(G,)
If *Item = #Null
ProcedureReturn
EndIf
With *TabBarGadget
If (\HoverItem = *Item)
\HoverItem = #Null
EndIf
If (\HoverCheck = *Item)
\HoverCheck = #Null
EndIf
If (\HoverClose = *Item)
\HoverClose = #Null
EndIf
If (\LockedItem = *Item)
\LockedItem = #Null
EndIf
If (\LockedCheck = *Item)
\LockedCheck = #Null
EndIf
If (\LockedClose = *Item)
\LockedClose = #Null
EndIf
If (\MoveItem = *Item)
\MoveItem = #Null
EndIf
If (\ReadyToMoveItem = *Item)
\ReadyToMoveItem = #Null
EndIf
EndWith
TabBarGadget_ClearItem(*TabBarGadget, *Item)
If *TabBarGadget\SelectedItem
TabBarGadget_UnselectItem(*TabBarGadget, *Item)
If *TabBarGadget\SelectedItem = #Null
ChangeCurrentElement(*TabBarGadget\Item(), *Item)
If NextElement(*TabBarGadget\Item())
TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *TabBarGadget\Item())
ElseIf PreviousElement(*TabBarGadget\Item())
TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *TabBarGadget\Item())
EndIf
EndIf
Else
TabBarGadget_UnselectItem(*TabBarGadget, *Item)
EndIf
ChangeCurrentElement(*TabBarGadget\Item(), *Item)
DeleteElement(*TabBarGadget\Item())
EndProcedure
; Renvoie #True si la souris est à l'intérieur du rectangle.
; La largeur et la hauteur peuvent également être négatives.
Procedure.i TabBarGadget_MouseIn(*TabBarGadget.TabBarGadget, X.i, Y.i, Width.i, Height.i)
;Examine_Editor(*),Examine(*)
With *TabBarGadget
If Width < 0 : X + Width : Width * -1 : EndIf
If Height < 0 : Y + Height : Height * -1 : EndIf
If \MouseX >= X And \MouseX < X+Width And \MouseY >= Y And \MouseY < Y+Height
ProcedureReturn #True
EndIf
EndWith
EndProcedure
; ajout de couleur
Procedure.i TabBarGadget_ColorPlus(Color.i, Plus.i)
;DrawButton(),DrawItem(*, *)
If Color&$FF + Plus&$FF < $FF
Color + Plus&$FF
Else
Color | $FF
EndIf
If Color&$FF00 + Plus&$FF00 < $FF00
Color + Plus&$FF00
Else
Color | $FF00
EndIf
If Color&$FF0000 + Plus&$FF0000 < $FF0000
Color + Plus&$FF0000
Else
Color | $FF0000
EndIf
ProcedureReturn Color
EndProcedure
; Soustraction de couleur
Procedure.i TabBarGadget_ColorMinus(Color.i, Minus.i) ; Code OK
;DrawButton(),DrawItem(*, *)
If Color&$FF - Minus&$FF > 0
Color - Minus&$FF
Else
Color & $FFFFFF00
EndIf
If Color&$FF00 - Minus&$FF00 > 0
Color - Minus&$FF00
Else
Color & $FFFF00FF
EndIf
If Color&$FF0000 - Minus&$FF0000 > 0
Color - Minus&$FF0000
Else
Color & $FF00FFFF
EndIf
ProcedureReturn Color
EndProcedure
; Dessiner une croix (fermée)
Procedure TabBarGadget_DrawCross(X.i, Y.i, Size.i, Color.i) ; Code OK
;DrawItem(*, *)
Protected Alpha.i = Alpha(Color)/4
Line(X , Y+1 , Size-1, Size-1, Color&$FFFFFF|Alpha<<24)
Line(X+1, Y , Size-1, Size-1, Color&$FFFFFF|Alpha<<24)
Line(X , Y+Size-2, Size-1, -Size+1, Color&$FFFFFF|Alpha<<24)
Line(X+1, Y+Size-1, Size-1, -Size+1, Color&$FFFFFF|Alpha<<24)
Line(X , Y , Size , Size , Color)
Line(X , Y+Size-1, Size , -Size , Color)
EndProcedure
; Dessine un bouton
Procedure TabBarGadget_DrawButton(X.i, Y.i, Width.i, Height.i, Type.i, Color, Vertical.i=#False) ; Code OK
;DrawItem(*, *),Draw(*)
If Type
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
ResetGradientColors()
If Type = 1
GradientColor(0.0, TabBarGadget_ColorPlus(Color, $404040))
GradientColor(0.5, Color)
GradientColor(1.0, TabBarGadget_ColorMinus(Color, $404040))
ElseIf Type = -1
GradientColor(1.0, TabBarGadget_ColorPlus(Color, $404040))
GradientColor(0.5, Color)
GradientColor(0.0, TabBarGadget_ColorMinus(Color, $404040))
EndIf
If Vertical
LinearGradient(X, Y, X+Width-1, Y)
RoundBox(X, Y, Width, Height, 3, 3)
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
RoundBox(X, Y, Width, Height, 3, 3, TabBarGadgetInclude\BorderColor&$FFFFFF|$80<<24)
Else
LinearGradient(X, Y, X, Y+Height-1)
RoundBox(X, Y, Width, Height, 3, 3)
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
RoundBox(X, Y, Width, Height, 3, 3, TabBarGadgetInclude\BorderColor&$FFFFFF|$80<<24)
EndIf
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
EndIf
EndProcedure
; Dessiner une flèche
Procedure TabBarGadget_DrawArrow(X.i, Y.i, Type.i, Color.i, Attributes.i=#Null) ; Code OK
;Draw(*)
Protected Index.i, Alpha.i = Alpha(Color)/4
With TabBarGadgetInclude
If Attributes & #TabBarGadget_Vertical
If Attributes & #TabBarGadget_MirroredTabs
Select Type
Case #TabBarGadget_PopupButton
X - \ArrowSize/2-1
For Index = 1 To \ArrowSize
Line(X+Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
Else
Select Type
Case #TabBarGadget_PopupButton
X + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
EndIf
If Attributes & #TabBarGadget_MirroredTabs XOr Attributes & #TabBarGadget_ReverseOrdering
Select Type
Case #TabBarGadget_PreviousArrow
Y - \ArrowSize/2-1
For Index = 1 To \ArrowSize
Line(X-Index, Y+Index, Index*2, 1, Color)
Next
LineXY(X-1, Y, X-1-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
Case #TabBarGadget_NextArrow
Y + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, Index*2, 1, Color)
Next
LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
Else
Select Type
Case #TabBarGadget_PreviousArrow
Y + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, Index*2, 1, Color)
Next
LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
Case #TabBarGadget_NextArrow
Y - \ArrowSize/2-1
For Index = 1 To \ArrowSize
Line(X-Index, Y+Index, Index*2, 1, Color)
Next
LineXY(X-1, Y, X-1-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
EndIf
Else
Select Type
Case #TabBarGadget_PopupButton
Y + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, Index*2, 1, Color)
Next
LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
If Attributes & #TabBarGadget_ReverseOrdering
Select Type
Case #TabBarGadget_PreviousArrow
X + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
Case #TabBarGadget_NextArrow
X - \ArrowSize/2-1
For Index = 1 To \ArrowSize
Line(X+Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
Else
Select Type
Case #TabBarGadget_PreviousArrow
X - \ArrowSize/2-1
For Index = 1 To \ArrowSize
Line(X+Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
Case #TabBarGadget_NextArrow
X + \ArrowSize/2
For Index = 1 To \ArrowSize
Line(X-Index, Y-Index, 1, Index*2, Color)
Next
LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
EndSelect
EndIf
EndIf
EndWith
EndProcedure
; Renvoie la longueur de l'item.
Procedure.i TabBarGadget_ItemLength(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
;TextCutting(*),Update(*)
Protected TextLength.i = TextWidth(*Item\ShortText)
Protected Length.i = 2 * TabBarGadgetInclude\PaddingX
Protected Characters.i, VerticalTextBugFix.f = 1.0
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
TextLength * TabBarGadgetInclude\VerticalTextBugFix ; 5 % plus long en raison de l'inexactitude de TextWidth lors de la rotation
VerticalTextBugFix = TabBarGadgetInclude\VerticalTextBugFix
EndIf
If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
Length + TabBarGadgetInclude\CloseButtonSize-4 + TabBarGadgetInclude\ImageSpace
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
Length + TabBarGadgetInclude\CheckBoxSize + TabBarGadgetInclude\ImageSpace
EndIf
If *Item\Image
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
Length + ImageHeight(*Item\Image)
Else
Length + ImageWidth(*Item\Image)
EndIf
If *Item\ShortText
Length + TabBarGadgetInclude\ImageSpace
EndIf
ElseIf *Item = *TabBarGadget\NewTabItem And *Item\Text = ""
Length + 16
EndIf
If *Item <> *TabBarGadget\NewTabItem
If TextLength+Length < *TabBarGadget\MinTabLength
Length = *TabBarGadget\MinTabLength-TextLength
EndIf
If TextLength+Length > *TabBarGadget\MaxTabLength
Characters = Len(*Item\Text)
Repeat
Characters - 1
TextLength = TextWidth(Left(*Item\Text, Characters)+"..")*VerticalTextBugFix
Until Characters = 1 Or TextLength+Length <= *TabBarGadget\MaxTabLength
*Item\ShortText = Left(*Item\Text, Characters) + ".."
EndIf
EndIf
ProcedureReturn TextLength + Length
EndProcedure
; Renvoie l'espace maximum disponible pour les onglets.
Procedure.i TabBarGadget_MaxLength(*TabBarGadget.TabBarGadget, WithNewTab.i=#True) ; Code OK
;Update(*)
Protected Length.i
With *TabBarGadget
If \Attributes & #TabBarGadget_Vertical
Length = OutputHeight() - TabBarGadgetInclude\Margin*2
Else
Length = OutputWidth() - TabBarGadgetInclude\Margin*2
EndIf
If \Attributes & #TabBarGadget_NewTab And WithNewTab
Length - *TabBarGadget\NewTabItem\Length + 1
EndIf
If \Attributes & #TabBarGadget_PreviousArrow
Length - TabBarGadgetInclude\ArrowWidth
EndIf
If \Attributes & #TabBarGadget_NextArrow
Length - TabBarGadgetInclude\ArrowWidth
If \Attributes & #TabBarGadget_NewTab
Length - TabBarGadgetInclude\Margin
EndIf
EndIf
If \Attributes & #TabBarGadget_PopupButton
Length - TabBarGadgetInclude\ArrowHeight
EndIf
EndWith
ProcedureReturn Length
EndProcedure
; Exécute le rognage du texte jusqu'à ce que tous les onglets tiennent dans la barre.
Procedure.i TabBarGadget_TextCutting(*TabBarGadget.TabBarGadget) ; Code OK
;Update(*)
Protected NewList SortedItem.TabBarGadgetSortedItem()
Protected *SortedItem.TabBarGadgetSortedItem
Protected MaxLength.i = 1, Length.i
With *TabBarGadget
; Créez des entrées triées par longueur de texte (grand -> petit).
ForEach \Item()
\Item()\ShortText = \Item()\Text
\Item()\Length = TabBarGadget_ItemLength(*TabBarGadget, @\Item())
If *TabBarGadget\Editor\Item <> \Item()
LastElement(SortedItem())
*SortedItem = AddElement(SortedItem())
*SortedItem\Item = @\Item()
*SortedItem\Characters = Len(\Item()\Text)
While PreviousElement(SortedItem()) And *SortedItem\Item\Length > SortedItem()\Item\Length
SwapElements(SortedItem(), @SortedItem(), *SortedItem)
ChangeCurrentElement(SortedItem(), *SortedItem)
Wend
EndIf
MaxLength + \Item()\Length - 1
Next
; Effectuez le rognage du texte jusqu'à ce que tous les onglets tiennent dans la largeur maximale.
While MaxLength > \MaxLength And FirstElement(SortedItem())
*SortedItem = @SortedItem()
If *SortedItem\Characters > 3 And *SortedItem\Item\Length > \MinTabLength
*SortedItem\Characters - 1
*SortedItem\Item\ShortText = Left(*SortedItem\Item\Text, *SortedItem\Characters)+".."
Length = TabBarGadget_ItemLength(*TabBarGadget, *SortedItem\Item)
MaxLength - (*SortedItem\Item\Length-Length)
*SortedItem\Item\Length = Length
While NextElement(SortedItem()) And *SortedItem\Item\Length < SortedItem()\Item\Length
SwapElements(SortedItem(), @SortedItem(), *SortedItem)
ChangeCurrentElement(SortedItem(), *SortedItem)
Wend
Else
DeleteElement(SortedItem())
EndIf
Wend
EndWith
ProcedureReturn MaxLength
EndProcedure
; Fait pivoter l'image en fonction de l'orientation de la barre
Procedure TabBarGadget_RotateImage(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
;ReplaceImage(*, *),DrawItem(*, *)
;,,SetTabBarGadgetAttribute(G,)
Protected LastX.i = ImageWidth(*Item\Image)-1
Protected LastY.i = ImageHeight(*Item\Image)-1
Protected Dim Pixel.l(LastX, LastY)
Protected Y.i, X.i, RotatedImage.i
If *Item\DrawedImage
FreeImage(*Item\DrawedImage)
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
If StartDrawing(ImageOutput(*Item\Image))
DrawingMode(#PB_2DDrawing_AllChannels)
For Y = 0 To LastY
For X = 0 To LastX
Pixel(X, Y) = Point(X, Y)
Next
Next
StopDrawing()
EndIf
CompilerIf #PB_Compiler_Version >= 520
*Item\DrawedImage = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32, #PB_Image_Transparent)
CompilerElse
*Item\DrawedImage = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32|#PB_Image_Transparent)
CompilerEndIf
If StartDrawing(ImageOutput(*Item\DrawedImage))
DrawingMode(#PB_2DDrawing_AllChannels)
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
For Y = 0 To LastY
For X = 0 To LastX
Plot(LastY-Y, X, Pixel(X, Y))
Next
Next
Else
For Y = 0 To LastY
For X = 0 To LastX
Plot(Y, LastX-X, Pixel(X, Y))
Next
Next
EndIf
StopDrawing()
EndIf
Else
*Item\DrawedImage = CopyImage(*Item\Image, #PB_Any)
EndIf
EndProcedure
; (Re)définir une nouvelle icône pour l'onglet
Procedure TabBarGadget_ReplaceImage(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem, NewImageID.i=#Null) ; Code OK
;,,AddTabBarGadgetItem(G,),SetTabBarGadgetItemImage(G)
If *Item\Image
FreeImage(*Item\Image)
*Item\Image = #Null
EndIf
If *Item\DrawedImage
FreeImage(*Item\DrawedImage)
*Item\DrawedImage = #Null
EndIf
If NewImageID
CompilerIf #PB_Compiler_Version >= 520
*Item\Image = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32, #PB_Image_Transparent)
CompilerElse
*Item\Image = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32|#PB_Image_Transparent)
CompilerEndIf
If StartDrawing(ImageOutput(*Item\Image))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawImage(NewImageID, 0, 0, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize)
StopDrawing()
EndIf
TabBarGadget_RotateImage(*TabBarGadget, *Item)
EndIf
EndProcedure
; Calcule la disposition d'un onglet
Procedure TabBarGadget_ItemLayout(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
;Update(*)
; \PaddingX = 6 ; Space from tab border to text
; \PaddingY = 5 ; Space from tab border to text
; \Margin = 4 ; Space from tab to border
Protected TextAreaLength.i = *Item\Length - 2 * TabBarGadgetInclude\PaddingX
Protected NextSelected.i, PreviousSelected.i
PushListPosition(*TabBarGadget\Item())
If *Item\Selected
ChangeCurrentElement(*TabBarGadget\Item(), *Item)
If NextElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
NextSelected = #True
EndIf
ChangeCurrentElement(*TabBarGadget\Item(), *Item)
If PreviousElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
PreviousSelected = #True
EndIf
EndIf
PopListPosition(*TabBarGadget\Item())
With TabBarGadgetInclude
If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
TextAreaLength - (TabBarGadgetInclude\CloseButtonSize-4 + TabBarGadgetInclude\ImageSpace)
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
TextAreaLength - (TabBarGadgetInclude\CheckBoxSize + TabBarGadgetInclude\ImageSpace)
EndIf
If *Item\Image
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
TextAreaLength - (ImageHeight(*Item\Image)+TabBarGadgetInclude\ImageSpace)
Else
TextAreaLength - (ImageWidth(*Item\Image)+TabBarGadgetInclude\ImageSpace)
EndIf
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
*Item\Layout\Height = *Item\Length
*Item\Layout\Width = *TabBarGadget\TabSize + 1
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
*Item\Layout\X = *TabBarGadget\TabSize * *Item\Row; - 1
Else
*Item\Layout\X = OutputWidth() - *TabBarGadget\TabSize * (*Item\Row+1)
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering XOr *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
*Item\Layout\Y = *Item\Position
Else
*Item\Layout\Y = OutputHeight() - *Item\Position - *Item\Length
EndIf
If *Item\Selected
*Item\Layout\Width + \Margin
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs = 0
*Item\Layout\X - \Margin
EndIf
EndIf
*Item\Layout\PaddingX = \PaddingY
*Item\Layout\PaddingY = \PaddingX
*Item\Layout\CrossX = *Item\Layout\X + (*Item\Layout\Width-\CloseButtonSize)/2
*Item\Layout\CheckX = *Item\Layout\X + (*Item\Layout\Width-\CheckBoxSize)/2
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
*Item\Layout\TextX = *Item\Layout\X + (*Item\Layout\Width+TextHeight("|"))/2
Else
*Item\Layout\TextX = *Item\Layout\X + (*Item\Layout\Width-TextHeight("|"))/2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
*Item\Layout\CrossY = *Item\Layout\Y + *Item\Layout\Height - (\CloseButtonSize-3) - *Item\Layout\PaddingY
*Item\Layout\TextY = *Item\Layout\Y + *Item\Layout\PaddingY + (TextAreaLength-TextWidth(*Item\ShortText)*\VerticalTextBugFix) * (*TabBarGadget\TabTextAlignment+1)/2
If *Item\Image
*Item\Layout\ImageX = *Item\Layout\X + (*Item\Layout\Width-ImageWidth(*Item\Image))/2
*Item\Layout\ImageY = *Item\Layout\Y + *Item\Layout\PaddingY
*Item\Layout\TextY + ImageHeight(*Item\Image) + \ImageSpace
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
*Item\Layout\TextY + \CheckBoxSize + \ImageSpace
EndIf
*Item\Layout\CheckY = *Item\Layout\TextY-\CheckBoxSize-\ImageSpace
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering : *Item\Layout\TextY + TextWidth(*Item\ShortText)*\VerticalTextBugFix : EndIf
Else
*Item\Layout\CrossY = *Item\Layout\Y + (-3) + *Item\Layout\PaddingY
*Item\Layout\TextY = *Item\Layout\Y + *Item\Layout\Height - *Item\Layout\PaddingY - (TextAreaLength-TextWidth(*Item\ShortText)*\VerticalTextBugFix) * (*TabBarGadget\TabTextAlignment+1)/2
If *Item\Image
*Item\Layout\ImageX = *Item\Layout\X + (*Item\Layout\Width-ImageWidth(*Item\Image))/2
*Item\Layout\ImageY = *Item\Layout\Y + *Item\Layout\Height-ImageHeight(*Item\Image) - *Item\Layout\PaddingY
*Item\Layout\TextY - ImageHeight(*Item\Image) - \ImageSpace
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
*Item\Layout\TextY - \CheckBoxSize - \ImageSpace
EndIf
*Item\Layout\CheckY = *Item\Layout\TextY+\ImageSpace
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering : *Item\Layout\TextY - TextWidth(*Item\ShortText)*\VerticalTextBugFix : EndIf
EndIf
If *Item\Selected
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
If PreviousSelected = #False
*Item\Layout\Y - \Margin/2
*Item\Layout\Height + \Margin/2
EndIf
If NextSelected = #False
*Item\Layout\Height + \Margin/2
EndIf
Else
If NextSelected = #False
*Item\Layout\Y - \Margin/2
*Item\Layout\Height + \Margin/2
EndIf
If PreviousSelected = #False
*Item\Layout\Height + \Margin/2
EndIf
EndIf
EndIf
Else
*Item\Layout\Width = *Item\Length
*Item\Layout\Height = *TabBarGadget\TabSize + 1
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
*Item\Layout\X = OutputWidth() - *Item\Position - *Item\Length
Else
*Item\Layout\X = *Item\Position
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
*Item\Layout\Y = *TabBarGadget\TabSize * *Item\Row; - 1
Else
*Item\Layout\Y = OutputHeight() - *TabBarGadget\TabSize * (*Item\Row+1)
EndIf
If *Item\Selected
*Item\Layout\Height + \Margin
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs = 0
*Item\Layout\Y - \Margin
EndIf
EndIf
*Item\Layout\PaddingX = \PaddingX
*Item\Layout\PaddingY = \PaddingY
*Item\Layout\CrossY = *Item\Layout\Y + (*Item\Layout\Height-\CloseButtonSize)/2
*Item\Layout\CheckY = *Item\Layout\Y + (*Item\Layout\Height-\CheckBoxSize)/2
*Item\Layout\TextY = *Item\Layout\Y + (*Item\Layout\Height-TextHeight("|"))/2
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
*Item\Layout\CrossX = *Item\Layout\X + (-3) + *Item\Layout\PaddingX
*Item\Layout\TextX = *Item\Layout\X + *Item\Layout\Width-TextWidth(*Item\ShortText) - *Item\Layout\PaddingX - (TextAreaLength-TextWidth(*Item\ShortText)) * (*TabBarGadget\TabTextAlignment+1)/2
If *Item\Image
*Item\Layout\ImageX = *Item\Layout\X + *Item\Layout\Width-ImageWidth(*Item\Image) - *Item\Layout\PaddingX
*Item\Layout\ImageY = *Item\Layout\Y + (*Item\Layout\Height-ImageHeight(*Item\Image))/2
*Item\Layout\TextX - ImageWidth(*Item\Image) - \ImageSpace
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
*Item\Layout\TextX - \CheckBoxSize - \ImageSpace
EndIf
*Item\Layout\CheckX = *Item\Layout\TextX + TextWidth(*Item\ShortText) + \ImageSpace
Else
*Item\Layout\CrossX = *Item\Layout\X + *Item\Layout\Width - (\CloseButtonSize-3) - *Item\Layout\PaddingX
*Item\Layout\TextX = *Item\Layout\X + *Item\Layout\PaddingX + (TextAreaLength-TextWidth(*Item\ShortText)) * (*TabBarGadget\TabTextAlignment+1)/2
If *Item\Image
*Item\Layout\ImageX = *Item\Layout\X + *Item\Layout\PaddingX
*Item\Layout\ImageY = *Item\Layout\Y + (*Item\Layout\Height-ImageHeight(*Item\Image))/2
*Item\Layout\TextX + ImageWidth(*Item\Image) + \ImageSpace
EndIf
If *Item\Attributes & #TabBarGadget_CheckBox
*Item\Layout\TextX + \CheckBoxSize + \ImageSpace
EndIf
*Item\Layout\CheckX = *Item\Layout\TextX - \CheckBoxSize - \ImageSpace
EndIf
If *Item\Selected
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
If NextSelected = #False
*Item\Layout\X - \Margin/2
*Item\Layout\Width + \Margin/2
EndIf
If PreviousSelected = #False
*Item\Layout\Width + \Margin/2
EndIf
Else
If PreviousSelected = #False
*Item\Layout\X - \Margin/2
*Item\Layout\Width + \Margin/2
EndIf
If NextSelected = #False
*Item\Layout\Width + \Margin/2
EndIf
EndIf
EndIf
EndIf
EndWith
EndProcedure
; Calcule la mise en page = Layout
Procedure TabBarGadget_Layout(*TabBarGadget.TabBarGadget)
;1x Update(*)
Protected Shift.i
With TabBarGadgetInclude
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
Shift = -TabBarGadgetInclude\Margin
Else
Shift = TabBarGadgetInclude\Margin
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
*TabBarGadget\Layout\ButtonHeight = \ArrowWidth
*TabBarGadget\Layout\ButtonWidth = \ArrowHeight
*TabBarGadget\Layout\ButtonSize = \ArrowHeight
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\PopupButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\PopupButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonSize / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
*TabBarGadget\Layout\PreviousButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\PreviousButtonY = *TabBarGadget\Layout\ButtonHeight / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
*TabBarGadget\Layout\NextButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\NextButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonHeight / 2
If *TabBarGadget\Attributes & #TabBarGadget_NewTab
*TabBarGadget\Layout\NextButtonY - *TabBarGadget\NewTabItem\Length-TabBarGadgetInclude\Margin
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\NextButtonY - *TabBarGadget\Layout\ButtonSize
EndIf
EndIf
Else
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\PopupButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\PopupButtonY = *TabBarGadget\Layout\ButtonSize / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
*TabBarGadget\Layout\PreviousButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\PreviousButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonHeight / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
*TabBarGadget\Layout\NextButtonX = (OutputWidth()+Shift) / 2
*TabBarGadget\Layout\NextButtonY = *TabBarGadget\Layout\ButtonHeight / 2
If *TabBarGadget\Attributes & #TabBarGadget_NewTab
*TabBarGadget\Layout\NextButtonY + *TabBarGadget\NewTabItem\Length+TabBarGadgetInclude\Margin
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\NextButtonY + *TabBarGadget\Layout\ButtonSize
EndIf
EndIf
EndIf
Else
*TabBarGadget\Layout\ButtonHeight = \ArrowHeight
*TabBarGadget\Layout\ButtonWidth = \ArrowWidth
*TabBarGadget\Layout\ButtonSize = \ArrowHeight
If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\PopupButtonX = *TabBarGadget\Layout\ButtonSize / 2
*TabBarGadget\Layout\PopupButtonY = (OutputHeight()+Shift) / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
*TabBarGadget\Layout\PreviousButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonWidth / 2
*TabBarGadget\Layout\PreviousButtonY = (OutputHeight()+Shift) / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
*TabBarGadget\Layout\NextButtonX = *TabBarGadget\Layout\ButtonWidth / 2
*TabBarGadget\Layout\NextButtonY = (OutputHeight()+Shift) / 2
If *TabBarGadget\Attributes & #TabBarGadget_NewTab
*TabBarGadget\Layout\NextButtonX + *TabBarGadget\NewTabItem\Length+TabBarGadgetInclude\Margin
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\NextButtonX + *TabBarGadget\Layout\ButtonSize
EndIf
EndIf
Else
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\PopupButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonSize / 2
*TabBarGadget\Layout\PopupButtonY = (OutputHeight()+Shift) / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
*TabBarGadget\Layout\PreviousButtonX = *TabBarGadget\Layout\ButtonWidth / 2
*TabBarGadget\Layout\PreviousButtonY = (OutputHeight()+Shift) / 2
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
*TabBarGadget\Layout\NextButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonWidth / 2
*TabBarGadget\Layout\NextButtonY = (OutputHeight()+Shift) / 2
If *TabBarGadget\Attributes & #TabBarGadget_NewTab
*TabBarGadget\Layout\NextButtonX - *TabBarGadget\NewTabItem\Length-TabBarGadgetInclude\Margin
EndIf
If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
*TabBarGadget\Layout\NextButtonX - *TabBarGadget\Layout\ButtonSize
EndIf
EndIf
EndIf
EndIf
EndWith
EndProcedure
; Dessiner un onglet
Procedure TabBarGadget_DrawItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
;Draw(*)
Protected X.i, Y.i, LayoutX.i, LayoutY.i, LayoutWidth.i, LayoutHeight.i, Padding.i
Protected Color.i, Width.i, Height.i, Text.s, Len.i, Angle.i
With TabBarGadgetInclude
; *item\Color\Text
; Orientation de l'onglet
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
LayoutX = -*TabBarGadget\Radius-1
EndIf
LayoutWidth = *TabBarGadget\Radius
Else
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
LayoutY = -*TabBarGadget\Radius-1
EndIf
LayoutHeight = *TabBarGadget\Radius
EndIf
; Regarder
ResetGradientColors()
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
LinearGradient(*Item\Layout\X+*Item\Layout\Width-1, 0, *Item\Layout\X, 0)
Else
LinearGradient(*Item\Layout\X, 0, *Item\Layout\X+*Item\Layout\Width-1, 0)
EndIf
Else
If #False ;*TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
LinearGradient(0, *Item\Layout\Y+*Item\Layout\Height-1, 0, *Item\Layout\Y)
Else
LinearGradient(0, *Item\Layout\Y, 0, *Item\Layout\Y+*Item\Layout\Height-1)
EndIf
EndIf
Select *Item\Face
Case #TabBarGadgetItem_MoveFace
;*Item\Color\Text= *TabBarGadget\TextColor;MESA
;Color = TabBarGadget_ColorPlus(*Item\Color\Background, \ActivColorPlus)
; Color =*Item\Color\FaceColorSelected
Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus);MESA
GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010)&$FFFFFF|$C0<<24)
GradientColor(0.5, Color&$FFFFFF|$C0<<24)
GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF101010)&$FFFFFF|$C0<<24)
Case #TabBarGadgetItem_DisableFace
GradientColor(0.0, TabBarGadget_ColorPlus(*Item\Color\Background, $FF202020)&$FFFFFF|$80<<24)
GradientColor(0.5, *Item\Color\Background&$FFFFFF|$80<<24)
GradientColor(0.6, TabBarGadget_ColorMinus(*Item\Color\Background, $FF101010)&$FFFFFF|$80<<24)
GradientColor(1.0, TabBarGadget_ColorMinus(*Item\Color\Background, $FF303030)&$FFFFFF|$80<<24)
Case #TabBarGadgetItem_NormalFace
; *Item\Color\BorderColor= *TabBarGadget\BorderColor ;MESA
*Item\Color\Text= *TabBarGadget\TextColor;MESA
GradientColor(0.0, TabBarGadget_ColorPlus(*Item\Color\Background, $FF202020))
GradientColor(0.5, *Item\Color\Background)
GradientColor(0.6, TabBarGadget_ColorMinus(*Item\Color\Background, $FF101010))
GradientColor(1.0, TabBarGadget_ColorMinus(*Item\Color\Background, $FF303030))
;-Examine................
Case #TabBarGadgetItem_HoverFace
; *Item\Color\BorderColor= *TabBarGadget\BorderColor ;MESA
;Color = TabBarGadget_ColorPlus(*Item\Color\Background, \HoverColorPlus)
Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \HoverColorPlus);MESA
*Item\Color\Text= *TabBarGadget\TextColorSelected ;MESA;
GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF202020))
GradientColor(0.5, Color)
GradientColor(0.6, TabBarGadget_ColorMinus(Color, $FF101010))
GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF303030))
Case #TabBarGadgetItem_ActiveFace
Color = TabBarGadget_ColorPlus(*Item\Color\Background, \ActivColorPlus)
Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus);MESA
GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010))
GradientColor(0.5, Color)
GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF303030))
EndSelect
; ; andere ausgewählte Nachbarn = autres voisins sélectionnés
; If *Item <> *TabBarGadget\NewTabItem And *Item\Selected
; PushListPosition(*TabBarGadget\Item())
; ChangeCurrentElement(*TabBarGadget\Item(), *Item)
; If NextElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
; LayoutWidth - \Margin/2
; EndIf
; ChangeCurrentElement(*TabBarGadget\Item(), *Item)
; If PreviousElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
; LayoutX + \Margin/2
; LayoutWidth - \Margin/2
; EndIf
; PopListPosition(*TabBarGadget\Item())
; EndIf
; Dessin Onglet
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius)
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
If *Item\Disabled
RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor&$FFFFFF|$80<<24);mesa
Else
RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor);mesa
EndIf
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
If *TabBarGadget\Attributes & #TabBarGadget_Vertical
Angle = 90 + 180*Bool(*TabBarGadget\Attributes&#TabBarGadget_MirroredTabs)
If *Item\Image
If *Item\DrawedImage = #Null
*Item\DrawedImage = TabBarGadget_RotateImage(*Item\Image, Angle)
EndIf
If *Item\Disabled
DrawAlphaImage(ImageID(*Item\DrawedImage), *Item\Layout\ImageX, *Item\Layout\ImageY, $40)
Else
DrawAlphaImage(ImageID(*Item\DrawedImage), *Item\Layout\ImageX, *Item\Layout\ImageY, $FF)
EndIf
EndIf
If *Item\Disabled
DrawRotatedText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, Angle, *Item\Color\Text&$FFFFFF|$40<<24)
Else
DrawRotatedText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, Angle, *Item\Color\Text)
EndIf
Else
If *Item\Image
If *Item\Disabled
DrawAlphaImage(ImageID(*Item\Image), *Item\Layout\ImageX, *Item\Layout\ImageY, $40)
Else
DrawAlphaImage(ImageID(*Item\Image), *Item\Layout\ImageX, *Item\Layout\ImageY, $FF)
EndIf
EndIf
If *Item\Disabled
DrawText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, *Item\Color\Text&$FFFFFF|$40<<24)
Else
TabBarGadget_DrawText(*TabBarGadget, *Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, *Item\Color\Text)
If *TabBarGadget\Editor\Item = *Item
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_XOr)
If *TabBarGadget\Editor\Selection < 0
LayoutX = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor+*TabBarGadget\Editor\Selection))-1
LayoutWidth = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor)) - LayoutX
Box(*Item\Layout\TextX+LayoutX, *Item\Layout\TextY, LayoutWidth, TextHeight("|"))
Else
LayoutX = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor))-1
LayoutWidth = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor+*TabBarGadget\Editor\Selection)) - LayoutX
Box(*Item\Layout\TextX+LayoutX, *Item\Layout\TextY, LayoutWidth, TextHeight("|"))
EndIf
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
EndIf
EndIf
EndIf