Code: Select all
; 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 *TabBarGadget
; 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
; Gradient de couleur
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
Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus)
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
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))
Case #TabBarGadgetItem_HoverFace
; Color = TabBarGadget_ColorPlus(*Item\Color\Background, \HoverColorPlus)
Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \HoverColorPlus) ; *Item\Color\Text= *TabBarGadget\TextColorSelected;
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)
GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010))
GradientColor(0.5, Color)
GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF101010))
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)
Else
RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor)
EndIf
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
; AZJIO Add a thin line on the active tab. Highlights the active tab more clearly (vividly)
;https://www.purebasic.fr/english/viewtopic.php?t=47588&start=165
If *Item\Attributes & #TabBarGadget_HighlightSelectedTab
If *Item\Face = #TabBarGadgetItem_ActiveFace
Box(*Item\Layout\X+LayoutX + 2, *Item\Layout\Y+LayoutY + 1, *Item\Layout\Width+LayoutWidth - 4, \HighlightHeight, \HighlightColor)
EndIf
EndIf
;Image
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
; CheckBox
If *Item\Attributes & #TabBarGadget_CheckBox
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
If *TabBarGadget\HoverItem = *Item And *TabBarGadget\HoverCheck
RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text); hover
ElseIf *Item\Disabled
RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text&$FFFFFF|$40<<24);;\BorderColor&$FFFFFF|$40<<24
Else
RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text&$FFFFFF|$40<<24);;\BorderColor
EndIf
If *Item\Checked
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
LinearGradient(*Item\Layout\CheckX+2, *Item\Layout\CheckY+2, *Item\Layout\CheckX+\CheckBoxSize-2, *Item\Layout\CheckY+\CheckBoxSize-2)
ResetGradientColors()
If *Item\Disabled
GradientColor(0, *Item\Color\Text&$FFFFFF|$20000000)
GradientColor(0.5, *Item\Color\Text&$FFFFFF|$30000000)
GradientColor(1, *Item\Color\Text&$FFFFFF|$20000000)
Else
GradientColor(0, *Item\Color\Text&$FFFFFF|$80000000)
GradientColor(0.5, *Item\Color\Text&$FFFFFF|$C0000000)
GradientColor(1, *Item\Color\Text&$FFFFFF|$80000000)
EndIf
Box(*Item\Layout\CheckX+2, *Item\Layout\CheckY+2, \CheckBoxSize-4, \CheckBoxSize-4)
EndIf
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
EndIf
; Bouton de fermeture
If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
If *TabBarGadget\HoverItem = *Item And *TabBarGadget\HoverClose
If *TabBarGadget\LockedClose And *TabBarGadget\LockedItem = *Item
TabBarGadget_DrawButton(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, (-1)*\CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
Else
TabBarGadget_DrawButton(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, \CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
EndIf
Else
If \CloseButtonType>20;opaque
TabBarGadget_DrawButton(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, \CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
EndIf
EndIf
;Disabled cross and colors are managed inside TabBarGadget_DrawCross
TabBarGadget_DrawCross(*TabBarGadget, *Item, *Item\Layout\CrossX+DesktopScaledX(3), *Item\Layout\CrossY+DesktopScaledY(3)) ; EndIf
EndIf
EndWith
EndProcedure
; Gère les évènements lors de l'édition d'un onglet
Procedure TabBarGadget_Examine_Editor(*TabBarGadget.TabBarGadget)
;1xExamine(*)
Protected MinDistance.i, Distance.i, Index.i
With *TabBarGadget
If \Editor\Item
If TabBarGadget_MouseIn(*TabBarGadget, \Editor\Item\Layout\X, \Editor\Item\Layout\Y, \Editor\Item\Layout\Width, \Editor\Item\Layout\Height)
SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
Else
SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_Default)
EndIf
Select EventType()
Case #PB_EventType_LeftDoubleClick
If \Editor\Item = \HoverItem
\Editor\Cursor = 0
\Editor\Selection = Len(\Editor\Item\Text)
\Editor\Selectable = #False
EndIf
Case #PB_EventType_LeftButtonDown
If \Editor\Item = \HoverItem
\Editor\Cursor = 0
\Editor\Selection = 0
\Editor\Selectable = #True
MinDistance = $FFFF
For Index = Len(\Editor\Item\Text) To 0 Step -1
Distance = Abs(\Editor\Item\Layout\TextX+TextWidth(Left(\Editor\Item\Text, Index))-\MouseX)
If Distance < MinDistance
\Editor\Cursor = Index
MinDistance = Distance
EndIf
Next
Else
If \Editor\OldText <> \Editor\Item\Text
ChangeCurrentElement(\Item(), \Editor\Item)
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
EndIf
\Editor\Item = #Null
ProcedureReturn #Null
EndIf
Case #PB_EventType_MouseMove
If \Editor\Item = \HoverItem And \Editor\Selectable
\Editor\Selection = 0
MinDistance = $FFFF
For Index = Len(\Editor\Item\Text) To 0 Step -1
Distance = Abs(\Editor\Item\Layout\TextX+TextWidth(Left(\Editor\Item\Text, Index))-\MouseX)
If Distance < MinDistance
\Editor\Selection = Index-\Editor\Cursor
MinDistance = Distance
EndIf
Next
EndIf
Case #PB_EventType_LeftButtonUp
\Editor\Selectable = #False
Case #PB_EventType_Input
If \Editor\Selection > 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
\Editor\Selection = 0
ElseIf \Editor\Selection < 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Cursor + \Editor\Selection
\Editor\Selection = 0
EndIf
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Chr(GetGadgetAttribute(\Number, #PB_Canvas_Input)) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Item\ShortText = \Editor\Item\Text
\Editor\Cursor + 1
Case #PB_EventType_KeyDown
Select GetGadgetAttribute(\Number, #PB_Canvas_Key)
Case #PB_Shortcut_Return
If \Editor\OldText <> \Editor\Item\Text
ChangeCurrentElement(\Item(), \Editor\Item)
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
EndIf
\Editor\Item = #Null
ProcedureReturn #Null
Case #PB_Shortcut_Escape
\Editor\Item\Text = \Editor\OldText
\Editor\Item\ShortText = \Editor\Item\Text
\Editor\Item = #Null
ProcedureReturn #Null
Case #PB_Shortcut_Left
If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Shift
If \Editor\Cursor+\Editor\Selection > 0
\Editor\Selection - 1
EndIf
Else
\Editor\Selection = 0
If \Editor\Cursor > 0
\Editor\Cursor - 1
EndIf
EndIf
Case #PB_Shortcut_Right
If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Shift
If \Editor\Cursor+\Editor\Selection < Len(\Editor\Item\Text)
\Editor\Selection + 1
EndIf
Else
\Editor\Selection = 0
If \Editor\Cursor < Len(\Editor\Item\Text)
\Editor\Cursor + 1
EndIf
EndIf
Case #PB_Shortcut_Home
\Editor\Cursor = 0
Case #PB_Shortcut_End
\Editor\Cursor = Len(\Editor\Item\Text)
Case #PB_Shortcut_Back
If \Editor\Selection > 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
\Editor\Selection = 0
ElseIf \Editor\Selection < 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Cursor + \Editor\Selection
\Editor\Selection = 0
ElseIf \Editor\Cursor > 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor-1) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Cursor - 1
EndIf
Case #PB_Shortcut_Delete
If \Editor\Selection > 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
\Editor\Selection = 0
ElseIf \Editor\Selection < 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Cursor + \Editor\Selection
\Editor\Selection = 0
ElseIf \Editor\Cursor < Len(\Editor\Item\Text)
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+2)
EndIf
Case #PB_Shortcut_C
If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
If \Editor\Selection > 0
SetClipboardText(Mid(\Editor\Item\Text, \Editor\Cursor+1, \Editor\Selection))
ElseIf \Editor\Selection < 0
SetClipboardText(Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1, -\Editor\Selection))
EndIf
EndIf
Case #PB_Shortcut_V
If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
If \Editor\Selection > 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
\Editor\Selection = 0
ElseIf \Editor\Selection < 0
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Cursor + \Editor\Selection
\Editor\Selection = 0
EndIf
\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + GetClipboardText() + Mid(\Editor\Item\Text, \Editor\Cursor+1)
\Editor\Item\ShortText = \Editor\Item\Text
\Editor\Cursor + Len(GetClipboardText())
EndIf
EndSelect
\Editor\Item\ShortText = \Editor\Item\Text
Case #PB_EventType_LostFocus
If \Editor\OldText <> \Editor\Item\Text
ChangeCurrentElement(\Item(), \Editor\Item)
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
EndIf
\Editor\Item = #Null
EndSelect
Else
SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_Default)
EndIf
EndWith
EndProcedure
; Détermine l'apparence et l'emplacement des onglets
Procedure TabBarGadget_Examine(*TabBarGadget.TabBarGadget)
;1xCallback()
Protected MinLength.i, X.i, Y.i, Shift.i, MousePosition.i, Row.i
Protected Index.i, Distance.i, MinDistance.i
With *TabBarGadget
; Initialisierung
\ToolTip\Current = #Null
\MouseX = GetGadgetAttribute(\Number, #PB_Canvas_MouseX)
\MouseY = GetGadgetAttribute(\Number, #PB_Canvas_MouseY)
\Event = #Null
\EventTab = #TabBarGadgetItem_None
\HoverItem = #Null
\HoverClose = #False
\HoverCheck = #False
\HoverArrow = #Null
DrawingFont(\FontID)
; Survoler les onglets
If \MoveItem = #Null
ForEach \Item()
If \Item()\Visible And TabBarGadget_MouseIn(*TabBarGadget, \Item()\Layout\X, \Item()\Layout\Y, \Item()\Layout\Width-1, \Item()\Layout\Height-1)
\HoverItem = \Item()
EndIf
Next
If \Attributes & #TabBarGadget_NewTab And TabBarGadget_MouseIn(*TabBarGadget, \NewTabItem\Layout\X, \NewTabItem\Layout\Y, \NewTabItem\Layout\Width-1, \NewTabItem\Layout\Height-1)
\HoverItem = \NewTabItem
EndIf
EndIf
; Navigation
If \Attributes & (#TabBarGadget_PreviousArrow|#TabBarGadget_NextArrow)
; MouseWheel Scroll Action
If EventType() = #PB_EventType_MouseWheel
If \WheelAction = #TabBarGadgetWheelAction_Scroll
\Shift + \WheelDirection * GetGadgetAttribute(\Number, #PB_Canvas_WheelDelta)
If \Shift < 0
\Shift = 0
ElseIf \Shift > \LastShift
\Shift = \LastShift
EndIf
EndIf
EndIf
LockMutex(\Timer\Mutex)
\Timer\Type = #Null
If \Attributes & #TabBarGadget_PreviousArrow
If TabBarGadget_MouseIn(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight)
\HoverArrow = #TabBarGadget_PreviousArrow
\HoverItem = #Null
\Timer\Type = #TabBarGadget_PreviousArrow
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedArrow = #TabBarGadget_PreviousArrow
\Timer\TabBarGadget = *TabBarGadget
Case #PB_EventType_LeftButtonUp
If \LockedArrow = \HoverArrow And \Shift > 0
\Shift - 1
EndIf
EndSelect
EndIf
EndIf
If \Attributes & #TabBarGadget_NextArrow
If TabBarGadget_MouseIn(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight)
\HoverArrow = #TabBarGadget_NextArrow
\HoverItem = #Null
\Timer\Type = #TabBarGadget_NextArrow
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedArrow = #TabBarGadget_NextArrow
\Timer\TabBarGadget = *TabBarGadget
Case #PB_EventType_LeftButtonUp
If \LockedArrow = \HoverArrow And \Shift < \LastShift
\Shift + 1
EndIf
EndSelect
EndIf
EndIf
UnlockMutex(\Timer\Mutex)
EndIf
; MouseWheel Change Action
If EventType() = #PB_EventType_MouseWheel
If \WheelAction = #TabBarGadgetWheelAction_Change
If TabBarGadget_ItemID(*TabBarGadget, #TabBarGadgetItem_Selected)
Index = ListIndex(\Item()) + \WheelDirection * Sign(GetGadgetAttribute(\Number, #PB_Canvas_WheelDelta))
If (Index >= 0) And (Index < ListSize(\Item()))
TabBarGadget_SelectItem(*TabBarGadget, TabBarGadget_ItemID(*TabBarGadget, Index))
\EventTab = Index
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
EndIf
EndIf
EndIf
EndIf
; Popup-Button
If \Attributes & #TabBarGadget_PopupButton
If TabBarGadget_MouseIn(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize)
\HoverArrow = #TabBarGadget_PopupButton
\HoverItem = #Null
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedArrow = #TabBarGadget_PopupButton
Case #PB_EventType_LeftButtonUp
If \LockedArrow = \HoverArrow
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_PopupButton, -1)
EndIf
EndSelect
EndIf
EndIf
; onglets
If \HoverItem
; Info-bulle, bouton de fermeture et case à cocher
If \HoverItem\ToolTip
\ToolTip\Current = @\HoverItem\ToolTip
Else
\ToolTip\Current = @\HoverItem\Text
EndIf
If ( \HoverItem\Attributes & #TabBarGadget_CloseButton Or (\HoverItem\Attributes & #TabBarGadget_SelectedCloseButton And \HoverItem\Selected) ) And \Editor\Item <> \HoverItem
If TabBarGadget_MouseIn(*TabBarGadget, \HoverItem\Layout\CrossX, \HoverItem\Layout\CrossY, \CloseButtonSize, \CloseButtonSize)
\HoverClose = \HoverItem
\ToolTip\Current = @\ToolTip\CloseText
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedClose = \HoverItem
Case #PB_EventType_LeftButtonUp
If \LockedClose = \HoverClose
ChangeCurrentElement(\Item(), \LockedClose)
\EventTab = ListIndex(\Item())
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CloseItem, \EventTab)
EndIf
EndSelect
EndIf
EndIf
If \HoverItem\Attributes & #TabBarGadget_CheckBox And \HoverItem\Disabled = #False And \Editor\Item <> \HoverItem
If TabBarGadget_MouseIn(*TabBarGadget, \HoverItem\Layout\CheckX, \HoverItem\Layout\CheckY, \CheckBoxSize, \CheckBoxSize)
\HoverCheck = \HoverItem
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedCheck = \HoverItem
Case #PB_EventType_LeftButtonUp
If \LockedCheck = \HoverCheck
ChangeCurrentElement(\Item(), \LockedCheck)
\EventTab = ListIndex(\Item())
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CheckBox, \EventTab)
\HoverItem\Checked = 1 - \HoverItem\Checked
EndIf
EndSelect
EndIf
EndIf
; NewTab gestion d'événements
If \HoverItem = \NewTabItem
\EventTab = #TabBarGadgetItem_NewTab
\ToolTip\Current = @\ToolTip\NewText
Else
ChangeCurrentElement(\Item(), \HoverItem)
\EventTab = ListIndex(\Item())
EndIf
; Select
Select EventType()
Case #PB_EventType_LeftButtonDown
\LockedItem = \HoverItem
If \LockedItem = \NewTabItem
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_NewItem, \EventTab)
ElseIf \LockedClose = #False And \LockedCheck = #False
If \HoverItem\Disabled = #False
If \Attributes & #TabBarGadget_MultiSelect And GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
If \HoverItem\Selected
TabBarGadget_UnselectItem(*TabBarGadget, \HoverItem)
Else
TabBarGadget_SelectItem(*TabBarGadget, \HoverItem)
EndIf
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
Else
ForEach \Item()
\Item()\Selected = #False
Next
If \SelectedItem <> \HoverItem
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
TabBarGadget_SelectItem(*TabBarGadget, \HoverItem)
Else
\SelectedItem = 0
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_DeSelected, \EventTab)
EndIf
EndIf
EndIf
If Not \Attributes & #TabBarGadget_NoTabMoving And \Editor\Item = #Null
\ReadyToMoveItem = \HoverItem
\SaveMouseX = \MouseX
\SaveMouseY = \MouseY
EndIf
EndIf
Case #PB_EventType_MiddleButtonDown
\LockedItem = \HoverItem
Case #PB_EventType_MiddleButtonUp
If \EnableMiddleClickForCloseTab And \LockedItem = \HoverItem And \LockedItem <> \NewTabItem And \LockedItem <> \Editor\Item
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CloseItem, \EventTab)
\MoveItem = #Null
\ReadyToMoveItem = #Null
EndIf
\LockedItem = #Null
Case #PB_EventType_MouseMove
If \ReadyToMoveItem
If Abs(\SaveMouseX-\MouseX) > 4 Or Abs(\SaveMouseY-\MouseY) > 4
\MoveItem = \ReadyToMoveItem
If \Attributes & (#TabBarGadget_NextArrow|#TabBarGadget_PreviousArrow)
LockMutex(\Timer\Mutex)
\Timer\TabBarGadget = *TabBarGadget
UnlockMutex(\Timer\Mutex)
EndIf
EndIf
EndIf
Case #PB_EventType_LeftDoubleClick
If \Attributes & #TabBarGadget_Editable And \HoverItem\Disabled = #False
\Editor\Item = \HoverItem
\Editor\OldText = \Editor\Item\Text
EndIf
EndSelect
EndIf
; Editor
If \HoverItem <> \NewTabItem
TabBarGadget_Examine_Editor(*TabBarGadget)
EndIf
; Divers
Select EventType()
Case #PB_EventType_LeftButtonUp
\LockedClose = #False
\LockedCheck = #False
\MoveItem = #Null
\ReadyToMoveItem = #Null
\LockedArrow = #Null
LockMutex(\Timer\Mutex)
\Timer\TabBarGadget = #Null
UnlockMutex(\Timer\Mutex)
Case #PB_EventType_MouseLeave
\HoverItem = #Null
Case #PB_EventType_LeftDoubleClick
If \EnableDoubleClickForNewTab And \HoverArrow = #Null And \HoverItem = #Null
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_NewItem, \EventTab)
EndIf
EndSelect
If (\Shift <= 0 And \HoverArrow = #TabBarGadget_PreviousArrow) Or (\Shift >= \LastShift And \HoverArrow = #TabBarGadget_NextArrow)
\HoverArrow = #False
EndIf
; Tab Shift : Trouvez et échangez les onglet
If \MoveItem
\EventTab = \MoveItem
If \Attributes & #TabBarGadget_Vertical
If \Attributes & #TabBarGadget_MultiLine
If \Attributes & #TabBarGadget_MirroredTabs
Row = Int((\MouseX-\Margin)/\TabSize)
Else
Row = Int(\Rows-(\MouseX-\Margin)/\TabSize)
EndIf
If Row < 0 : Row = 0 : ElseIf Row >= \Rows : Row = \Rows-1 : EndIf
MousePosition = Row*\MaxLength + \MouseY
Else
MousePosition = \MouseY
EndIf
If Not (\Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering)
MousePosition = OutputHeight() - MousePosition
EndIf
Else
If \Attributes & #TabBarGadget_MultiLine
If \Attributes & #TabBarGadget_MirroredTabs
Row = Int((\MouseY-\Margin)/\TabSize)
Else
Row = Int(\Rows-(\MouseY-\Margin)/\TabSize)
EndIf
If Row < 0 : Row = 0 : ElseIf Row >= \Rows : Row = \Rows-1 : EndIf
MousePosition = Row*\MaxLength + \MouseX
Else
MousePosition = \MouseX
EndIf
If \Attributes & #TabBarGadget_ReverseOrdering
MousePosition = OutputWidth() - MousePosition
EndIf
EndIf
If Not \Event
ChangeCurrentElement(\Item(), \MoveItem)
While NextElement(\Item())
If MousePosition > \Item()\Position + \MaxLength*\Item()\Row
SwapElements(\Item(), @\Item(), \MoveItem)
\Item()\Position = \MoveItem\Position
\MoveItem\Position = \Item()\Position + \Item()\Length
\Event = #TabBarGadget_EventType_SwapItem
PushListPosition(\Item())
ChangeCurrentElement(\Item(), \MoveItem)
\EventTab = ListIndex(\Item())
PopListPosition(\Item())
EndIf
Wend
EndIf
If Not \Event
ChangeCurrentElement(\Item(), \MoveItem)
While PreviousElement(\Item()) And ListIndex(\Item()) >= \Shift-1
If \MoveItem\Length < \Item()\Length
MinLength = \MoveItem\Length
Else
MinLength = \Item()\Length
EndIf
If MousePosition < \Item()\Position + \MaxLength*\Item()\Row + MinLength
SwapElements(\Item(), @\Item(), \MoveItem)
\MoveItem\Position = \Item()\Position
\Item()\Position = \MoveItem\Position + \MoveItem\Length
\Event = #TabBarGadget_EventType_SwapItem
PushListPosition(\Item())
ChangeCurrentElement(\Item(), \MoveItem)
\EventTab = ListIndex(\Item())
PopListPosition(\Item())
EndIf
Wend
EndIf
If \Event = #TabBarGadget_EventType_SwapItem
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_SwapItem, \EventTab)
EndIf
EndIf
; Mettre à jour l'info-bulle
If \ToolTip\Current <> \ToolTip\Old
If \ToolTip\Current = #Null
GadgetToolTip(\Number, "")
ElseIf \ToolTip\Current = @\ToolTip\NewText Or \ToolTip\Current = @\ToolTip\CloseText
GadgetToolTip(\Number, PeekS(\ToolTip\Current))
ElseIf \HoverItem And \ToolTip\Current = @\HoverItem\ToolTip
GadgetToolTip(\Number, PeekS(\ToolTip\Current))
Else
GadgetToolTip(\Number, ReplaceString(\ToolTip\ItemText, "%ITEM", PeekS(\ToolTip\Current)))
EndIf
\ToolTip\Old = \ToolTip\Current
EndIf
EndWith
EndProcedure
; Détermine l'apparence et l'emplacement des onglets
Procedure TabBarGadget_Update(*TabBarGadget.TabBarGadget)
;Callback()
;,, UpdateTabBarGadget(G)
Protected FocusingSelectedTab.i
Protected ShowLength.i, X.i
Protected OldAttributes.i
Protected Difference.f, Factor.f, Position.i, Length.i, MaxWidth.i, MousePosition.i
Protected *Item.TabBarGadgetItem, Row.i, Rows.i=1
Protected *Current, *Last, AddLength.i, RowCount.i
Protected Dim Row.TabBarGadgetRow(0)
With *TabBarGadget
; préparation
DrawingFont(\FontID)
\Attributes & ~(#TabBarGadget_PreviousArrow|#TabBarGadget_NextArrow) ; d'abord pas de navigation
If \TabSize = 0
; SetTabBarGadgetFont(Gadget.i, FontID.i) => ; Reset to 0 to force
; a new size calculation = *TabBarGadget\TabSize = 0
If \Attributes & #TabBarGadget_Vertical
If GadgetWidth(\Number) > 1
\TabSize = OutputWidth() - \Margin
Else
\TabSize = TextHeight("|") + \PaddingY*2
EndIf
Else
If GadgetHeight(\Number) > 1
\TabSize = OutputHeight() - \Margin
Else
\TabSize = TextHeight("|") + \PaddingY*2
EndIf
EndIf
EndIf
If \Attributes & #TabBarGadget_NewTab
\NewTabItem\Length = TabBarGadget_ItemLength(*TabBarGadget, \NewTabItem)
\NewTabItem\Row = 0
EndIf
; Barre d'onglets multi-lignes
If \Attributes & #TabBarGadget_MultiLine
\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
\Length = \MaxLength
\Shift = 0
; déterminer les latitudes
Length = 1
ForEach \Item()
\Item()\Row = 0
\Item()\Length = TabBarGadget_ItemLength(*TabBarGadget, \Item())
\Item()\Visible = #True
Length - 1 + \Item()\Length
Next
; Configurer plusieurs lignes
If Length > \MaxLength
Row = 0
Row(Row)\Length = 1
ForEach \Item()
If NextElement(\Item())
PreviousElement(\Item())
MaxWidth = TabBarGadget_MaxLength(*TabBarGadget, #False)
Else
LastElement(\Item())
MaxWidth = TabBarGadget_MaxLength(*TabBarGadget)
EndIf
If Row(Row)\Length-1+\Item()\Length > MaxWidth And Row(Row)\Items > 0
Row + 1
ReDim Row(Row)
Row(Row)\Length = 1
EndIf
Row(Row)\Length - 1 + \Item()\Length
Row(Row)\Items + 1
\Item()\Row = Row
Next
Else
Row(Row)\Length = Length
EndIf
Rows = Row+1
; Elargir
If Rows > 1
MaxWidth = TabBarGadget_MaxLength(*TabBarGadget, #False)
ForEach \Item()
AddLength = (MaxWidth-Row(\Item()\Row)\Length)/Row(\Item()\Row)\Items
If \Item()\Row <> Rows-1 Or AddLength < 0
\Item()\Length + AddLength
Row(\Item()\Row)\Length + AddLength
Row(\Item()\Row)\Items - 1
EndIf
Next
EndIf
; Calculer les positions
Length = \Margin
Row = 0
ForEach \Item()
If Row <> \Item()\Row
Row + 1
Length = \Margin
EndIf
\Item()\Position = Length
Length + \Item()\Length - 1
Next
If Row(Rows-1)\Length > TabBarGadget_MaxLength(*TabBarGadget) And LastElement(\Item())
\Item()\Length = TabBarGadget_MaxLength(*TabBarGadget, #False)
Rows + 1
\NewTabItem\Row = Rows-1
\NewTabItem\Position = \Margin
Else
\NewTabItem\Row = Rows-1
\NewTabItem\Position = \Margin+Row(\NewTabItem\Row)\Length - 1
EndIf
; Barre d'onglets sur une seule ligne
Else
\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
; raccourcissement du texte si nécessaire
If \Attributes & #TabBarGadget_TextCutting
\Length = TabBarGadget_TextCutting(*TabBarGadget)
If \Length <= \MaxLength
\Shift = 0
EndIf
EndIf
; déterminer les latitudes
\Length = 1
ForEach \Item()
\Item()\Length = TabBarGadget_ItemLength(*TabBarGadget, \Item())
\Item()\Row = 0
\Length + \Item()\Length-1
Next
; Besoin de navigation ?
If \Length > \MaxLength
\Attributes | (#TabBarGadget_PreviousArrow | #TabBarGadget_NextArrow)
\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
Else
;\Shift = 0
EndIf
; Déterminer LastShift
If LastElement(\Item())
\LastShift = ListIndex(\Item())
ShowLength = \Item()\Length
While PreviousElement(\Item())
If ShowLength + \Item()\Length - 1 > \MaxLength - Bool(ListIndex(\Item())>0)*\FadeOut
Break
Else
ShowLength + \Item()\Length - 1
\LastShift - 1
EndIf
Wend
Else
\LastShift = 0
EndIf
; Si nécessaire, amener l'onglet actuellement sélectionné dans la zone visible
If \FocusingSelectedTab And \SelectedItem
ChangeCurrentElement(\Item(), \SelectedItem)
If ListIndex(\Item()) <= \Shift
\Shift = ListIndex(\Item())
Else
While \Shift < \LastShift And SelectElement(\Item(), \Shift)
ShowLength = \Item()\Length
If \Item() = \SelectedItem
Break
EndIf
While NextElement(\Item())
If ShowLength + \Item()\Length - 1 > \MaxLength - (Bool(\Shift>0)+Bool(\Shift<\LastShift))*\FadeOut
\Shift + 1
Break
ElseIf \Item() = \SelectedItem
Break 2
EndIf
ShowLength + \Item()\Length - 1
Wend
Wend
EndIf
\FocusingSelectedTab = #False
EndIf
If \Shift > \LastShift
\Shift = \LastShift
EndIf
\MaxLength - (Bool(\Shift>0)+Bool(\Shift<\LastShift))*\FadeOut
; Position des onglets
; Onglet précédent
If \Attributes & #TabBarGadget_PreviousArrow
If \Shift > 0
ForEach \Item()
\Item()\Position = -$FFFF
\Item()\Visible = #False
If ListIndex(\Item()) >= \Shift-1 : Break : EndIf
Next
Position = \ArrowWidth + \Margin + \FadeOut
SelectElement(\Item(), \Shift-1)
\Item()\Position = Position - \Item()\Length + 1
\Item()\Visible = #True
Else
Position = \ArrowWidth + \Margin
EndIf
Else
Position = \Margin
EndIf
; Onglets visibles
\Length = 0
If SelectElement(\Item(), \Shift)
Repeat
\Item()\Position = Position + \Length
\Item()\Visible = #True
If \Length + \Item()\Length - 1 > \MaxLength
Break
EndIf
\Length + \Item()\Length - 1
Until Not NextElement(\Item())
EndIf
; Onglet suivant
If \Attributes & #TabBarGadget_NextArrow And ListIndex(\Item()) <> -1
If ListIndex(\Item()) <> ListSize(\Item())-1
\Item()\Position = Position + \Length
\Length + \Item()\Length - 1
\Item()\Visible = #True
If NextElement(\Item())
\Item()\Position = Position + \Length
\Item()\Visible = #True
EndIf
EndIf
If \Attributes & #TabBarGadget_NewTab
If \Attributes & #TabBarGadget_Vertical
\NewTabItem\Position = OutputHeight()-\NewTabItem\Length-\Margin/2
Else
\NewTabItem\Position = OutputWidth()-\NewTabItem\Length-\Margin/2
EndIf
If \Attributes & #TabBarGadget_PopupButton
\NewTabItem\Position - \ArrowHeight
EndIf
EndIf
While NextElement(\Item())
\Item()\Position = $FFFF
\Item()\Visible = #False
Wend
Else
If \Attributes & #TabBarGadget_NewTab
\NewTabItem\Position = Position + \Length
EndIf
EndIf
Row(0)\Length = Position - \Margin+\Length+1
EndIf
; Redimensionnement du gadget
If Rows <> \Rows And (EventType() >= #PB_EventType_FirstCustomValue Or GetGadgetAttribute(\Number, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton = #False)
TabBarGadget_StopDrawing(*TabBarGadget)
If \Attributes & #TabBarGadget_Vertical
ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, DesktopUnscaledX(Rows*\TabSize+\Margin), #PB_Ignore)
Else
ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, #PB_Ignore, DesktopUnscaledY(Rows*\TabSize+\Margin))
EndIf
PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Resize, -1)
TabBarGadget_StartDrawing(*TabBarGadget)
DrawingFont(\FontID)
\Resized = #True
\Rows = Rows
EndIf
; Animation de l'onglet mobile
If \MoveItem
If \Attributes & #TabBarGadget_Vertical
If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
MousePosition = \MouseY
Else
MousePosition = OutputHeight()-\MouseY-1
EndIf
Else
If \Attributes & #TabBarGadget_ReverseOrdering
MousePosition = OutputWidth()-\MouseX-1
Else
MousePosition = \MouseX
EndIf
EndIf
Difference = Abs(\MoveItem\Position-(MousePosition-\MoveItem\Length/2))
If Difference > 24
Position = MousePosition - \MoveItem\Length/2
Else
Factor = Pow(Difference/24, 2)
Position = \MoveItem\Position*(1-Factor) + (MousePosition-\MoveItem\Length/2)*Factor
EndIf
If \Attributes & #TabBarGadget_PreviousArrow = #Null
If Position < \Margin
Position = \Margin
EndIf
ElseIf \Shift <= 0 And Position < \Margin + \ArrowWidth
Position = \Margin + \ArrowWidth
EndIf
If (\Attributes & #TabBarGadget_NextArrow = #Null Or \Shift >= \LastShift) And Position + \MoveItem\Length + 1 - \Margin > Row(\MoveItem\Row)\Length - 1
Position = Row(\MoveItem\Row)\Length + \Margin - \MoveItem\Length
EndIf
\MoveItem\Position = Position
EndIf
; Apparence
ForEach \Item()
If \Item()\Disabled
\Item()\Face = #TabBarGadgetItem_DisableFace
ElseIf \Item() = \MoveItem
\Item()\Face = #TabBarGadgetItem_MoveFace
ElseIf \Item() = \SelectedItem Or \Item()\Selected
\Item()\Face = #TabBarGadgetItem_ActiveFace
ElseIf \Item() = \HoverItem
\Item()\Face = #TabBarGadgetItem_HoverFace
Else
\Item()\Face = #TabBarGadgetItem_NormalFace
EndIf
TabBarGadget_ItemLayout(*TabBarGadget, \Item())
Next
If \NewTabItem = \HoverItem
\NewTabItem\Face = #TabBarGadgetItem_HoverFace
Else
\NewTabItem\Face = #TabBarGadgetItem_NormalFace
EndIf
TabBarGadget_ItemLayout(*TabBarGadget, \NewTabItem)
TabBarGadget_Layout(*TabBarGadget)
*TabBarGadget\UpdatePosted = #False
EndWith
EndProcedure
; Dessine tout le TabBarGadget
Procedure TabBarGadget_Draw(*TabBarGadget.TabBarGadget)
;Callback()
;,, UpdateTabBarGadget(G)
With *TabBarGadget
If \DrawDisabled
ProcedureReturn
EndIf
Protected X.i, Y.i, Size.i, SelectedItemDrawed.i, MoveItemDrawed.i, Row.i, *LastItem
; initialisation
DrawingFont(\FontID)
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, OutputWidth(), OutputHeight(), *TabBarGadget\TabBarColor)
DrawingMode(#PB_2DDrawing_AlphaBlend)
; Onglets visibles
*LastItem = LastElement(\Item())
For Row = \Rows-1 To 0 Step -1
If *LastItem
PushListPosition(\Item())
While \Item()\Row >= Row
If \Item()\Visible And \Item()\Selected = #False And \Item() <> \MoveItem
TabBarGadget_DrawItem(*TabBarGadget, \Item())
EndIf
If Not PreviousElement(\Item())
Break
EndIf
Wend
EndIf
; le cas échéant. "Onglet "Nouveau" (si pas de navigation)
If \NewTabItem\Row = Row And \Attributes & #TabBarGadget_NewTab And \Attributes & #TabBarGadget_NextArrow = #Null
TabBarGadget_DrawItem(*TabBarGadget, \NewTabItem)
EndIf
; le cas échéant sous-lignes
If Row = 0 And \Attributes & #TabBarGadget_BottomLine
If \Attributes & #TabBarGadget_Vertical
If \Attributes & #TabBarGadget_MirroredTabs
Line(0, 0, 1, OutputHeight(), \BorderColor)
Else
Line(OutputWidth()-1, 0, 1, OutputHeight(), \BorderColor)
EndIf
Else
If \Attributes & #TabBarGadget_MirroredTabs
Line(0, 0, OutputWidth(), 1, \BorderColor)
Else
Line(0, OutputHeight()-1, OutputWidth(), 1, \BorderColor)
EndIf
EndIf
EndIf
; le cas échéant onglet actif
If *LastItem
PopListPosition(\Item())
While \Item()\Row >= Row
If \Item()\Visible And \Item()\Selected = #True And \Item() <> \MoveItem
TabBarGadget_DrawItem(*TabBarGadget, \Item())
EndIf
If Not PreviousElement(\Item())
Break
EndIf
Wend
EndIf
; le cas échéant onglet mobile
If \MoveItem And \MoveItem\Row = Row
TabBarGadget_DrawItem(*TabBarGadget, \MoveItem)
EndIf
Next
; Masque espace flèches de navigation
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
ResetGradientColors()
GradientColor(0.0, \TabBarColor&$FFFFFF)
GradientColor(0.5, \TabBarColor&$FFFFFF|$A0<<24)
GradientColor(1.0, \TabBarColor&$FFFFFF|$FF<<24)
Size = \Margin + \ArrowWidth + \FadeOut
If \Attributes & #TabBarGadget_PreviousArrow And \Shift
If \Attributes & #TabBarGadget_Vertical
If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
LinearGradient(0, Size, 0, Size-\FadeOut)
Box(0, 0, OutputWidth(), Size)
Else
LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+\FadeOut)
Box(0, OutputHeight()-Size, OutputWidth(), Size)
EndIf
Else
If \Attributes & #TabBarGadget_ReverseOrdering
LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+\FadeOut, 0)
Box(OutputWidth()-Size, 0, Size, OutputHeight())
Else
LinearGradient(Size, 0, Size-\FadeOut, 0)
Box(0, 0, Size, OutputHeight())
EndIf
EndIf
EndIf
If \Attributes & #TabBarGadget_NextArrow And \Shift < \LastShift
If \Attributes & #TabBarGadget_NewTab
Size + \NewTabItem\Length+\Margin
EndIf
If \Attributes & #TabBarGadget_PopupButton
Size + \ArrowHeight
EndIf
If \Attributes & #TabBarGadget_Vertical
If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+\FadeOut)
Box(0, OutputHeight()-Size, OutputWidth(), Size)
Else
LinearGradient(0, Size, 0, Size-\FadeOut)
Box(0, 0, OutputWidth(), Size)
EndIf
Else
If \Attributes & #TabBarGadget_ReverseOrdering
LinearGradient(Size, 0, Size-\FadeOut, 0)
Box(0, 0, Size, OutputHeight())
Else
LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+\FadeOut, 0)
Box(OutputWidth()-Size, 0, Size, OutputHeight())
EndIf
EndIf
EndIf
; Navigation
DrawingMode(#PB_2DDrawing_AlphaBlend)
If \Attributes & #TabBarGadget_PreviousArrow
If \HoverArrow = #TabBarGadget_PreviousArrow
If \HoverArrow = \LockedArrow
TabBarGadget_DrawButton(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
Else
TabBarGadget_DrawButton(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
EndIf
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
ElseIf \Shift > 0
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
Else
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor&$FFFFFF|$20<<24, *TabBarGadget\Attributes)
EndIf
EndIf
If \Attributes & #TabBarGadget_NextArrow
If \HoverArrow = #TabBarGadget_NextArrow
If \HoverArrow = \LockedArrow
TabBarGadget_DrawButton(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
Else
TabBarGadget_DrawButton(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
EndIf
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
ElseIf \Shift < \LastShift
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
Else
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor&$FFFFFF|$20<<24, *TabBarGadget\Attributes)
EndIf
EndIf
; Onglets "nouveaux" (si navigation)
If \Attributes & #TabBarGadget_NewTab And \Attributes & #TabBarGadget_NextArrow
TabBarGadget_DrawItem(*TabBarGadget, \NewTabItem)
EndIf
; Popup-Bouton
If \Attributes & #TabBarGadget_PopupButton
If \HoverArrow = #TabBarGadget_PopupButton
If \HoverArrow = \LockedArrow
TabBarGadget_DrawButton(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
Else
TabBarGadget_DrawButton(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
EndIf
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
Else
TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
EndIf
EndIf
EndWith
EndProcedure