Skip to content
Snippets Groups Projects
Commit 97033c65 authored by Benoît Minisini's avatar Benoît Minisini :church:
Browse files

TabPanel: The little arrow buttons now scroll the tab bar contents.

[GB.FORM]
* NEW: TabPanel: The little arrow buttons now scroll the tab bar contents.
parent f84ae941
No related branches found
No related tags found
No related merge requests found
Pipeline #1128118092 passed
# Gambas Project File 3.0
Title=More controls for graphical components
Startup=FTestFileView
Startup=FTestTabPanel
Icon=.hidden/icon.png
Version=3.18.90
VersionFile=1
......
......@@ -34,7 +34,6 @@ Property ShowTabBar As Boolean
Private $hTabBar As DrawingArea
Private $hTabBarContainer As DrawingArea
Private $X As Integer
Private $aCont As New _TabPanelContainer[]
Private $aButton As New _TabPanelButton[]
......@@ -108,26 +107,49 @@ Public Sub _EnsureCurrentVisible()
End
Private Sub CancelEnsureCurrentVisible()
If Not $hTimerEnsureVisible Then Return
$hTimerEnsureVisible.Stop
$hTimerEnsureVisible = Null
End
Public Sub EnsureCurrentVisible_Timer()
Dim X, W As Integer
Dim iLeftIndex, iRightIndex As Integer
'Dim iLeftIndex, iRightIndex As Integer
Dim iMax As Integer
Dim hCurrent As _TabPanelButton
Dim XMin As Integer
Dim XMax As Integer
Dim XC As Integer
$hTimerEnsureVisible = Null
If $iCurrent < 0 Or If $iCurrent > $aButton.Max Then Return
If Not $aButton[$iCurrent].Visible Then Return
XC = $hTabBarContainer.X
hCurrent = $aButton[$iCurrent]
If Not hCurrent.Visible Then Return
XMin = 0
If $hLeftArrow.Visible Then XMin += $hLeftArrow.W
XMax = $hTabBar.W
If $hRightArrow.Visible Then XMax -= $hRightArrow.W
If hCurrent.X + $hTabBarContainer.X <= XMin Or If (hCurrent.X + $hTabBarContainer.X + hCurrent.W) >= XMax Then
If Me.RightToLeft Then
$X = 0
XC = 0
If $iCurrent = 0 Then
W = Me.W
Else
With $aButton[$iCurrent]
With hCurrent
X = .X
W = $hTabBarContainer.W
......@@ -152,29 +174,29 @@ Public Sub EnsureCurrentVisible_Timer()
Else
If Me.W <= ($aButton[$iCurrent].W + ARROW_WIDTH) Then
If Me.W <= (hCurrent.W + ARROW_WIDTH) Then
$X = -$aButton[$iCurrent].X
XC = -hCurrent.X
Else
If $iCurrent = 0 Then
$X = 0
XC = 0
Else
With $aButton[$iCurrent]
With hCurrent
X = $hTabBarContainer.X + .X
W = .W
If X < ARROW_WIDTH Then
$X = $X + ARROW_WIDTH - X
X = $X + .X
XC = XC + ARROW_WIDTH - X
X = XC + .X
Endif
If X >= ($hTabBar.W - W - ARROW_WIDTH) Then
$X = $X - (X - ($hTabBar.W - W))
XC = XC - (X - ($hTabBar.W - W))
'If $iCurrent < $aButton.Max Then
$X -= ARROW_WIDTH
XC -= ARROW_WIDTH
Endif
End With
......@@ -182,39 +204,15 @@ Public Sub EnsureCurrentVisible_Timer()
Endif
iMax = GetLastIndex()
$X = Max($hTabBar.W - ($aButton[iMax].X + $aButton[iMax].W), $X)
$X = Min(0, $X)
XC = Max($hTabBar.W - ($aButton[iMax].X + $aButton[iMax].W), XC)
XC = Min(0, XC)
Endif
W = Me.W - $X
Endif
'$bArrow = False
' If $bArrow Then
' W -= ARROW_WIDTH
' If Me.RightToLeft Then $X += ARROW_WIDTH
' Endif
$hTabBarContainer.Move($X, 0, W, $hTabBar.H)
If $hTabBar.W >= (ARROW_WIDTH * 3) And If $aButton.Count Then
If Me.RightToLeft Then
iLeftIndex = GetLastIndex()
iRightIndex = _GetFirstIndex()
Else
iLeftIndex = _GetFirstIndex()
iRightIndex = GetLastIndex()
Endif
$hLeftArrow.Visible = $X < (-$aButton[iLeftIndex].X) '+ $aButton[iIndex].X + $aButton[iIndex].W) > $hTabBar.W
$hRightArrow.Visible = ($X + $aButton[iRightIndex].X + $aButton[iRightIndex].W) > $hTabBar.W
Else
$hLeftArrow.Hide
$hRightArrow.Hide
Endif
$hTabBarContainer.Move(XC, 0, GetTabBarMaxWidth(), $hTabBar.H)
CheckMouse
End
......@@ -231,7 +229,6 @@ Private Sub CheckMouse()
End
Private Sub UpdateLayout()
Dim hCtrl As _TabPanelButton
......@@ -332,6 +329,15 @@ Private Sub UpdateLayout()
End
Private Sub GetTabBarMaxWidth() As Integer
With $aButton[GetLastIndex()]
Return .X + .W
End With
End
Public Sub TabBar_Arrange()
_EnsureCurrentVisible
......@@ -339,6 +345,9 @@ Public Sub TabBar_Arrange()
$hRightArrow.Move($hTabBar.W - ARROW_WIDTH, 0, ARROW_WIDTH, $hTabBar.H)
$hLeftArrow.Move(0, 0, ARROW_WIDTH, $hTabBar.H)
$hLeftArrow.Visible = $hTabBarContainer.X < 0
$hRightArrow.Visible = $hTabBarContainer.X > ($hTabBar.W - GetTabBarMaxWidth())
If $hTabBarContainer.H <> $iTabBarContainerH Then
$iTabBarContainerH = $hTabBarContainer.H
UpdateLayout
......@@ -370,20 +379,55 @@ Public Sub Arrow_Draw()
End
Private Sub ScrollNext()
Dim W As Integer
W = $hTabBar.W - GetTabBarMaxWidth()
If $hTabBarContainer.X > W Then
$hTabBarContainer.X = Max(W, $hTabBarContainer.X - Desktop.Scale * 2)
CancelEnsureCurrentVisible
Endif
End
Private Sub ScrollPrevious()
If $hTabBarContainer.X < 0 Then
$hTabBarContainer.X = Min(0, $hTabBarContainer.X + Desktop.Scale * 2)
CancelEnsureCurrentVisible
Endif
End
Private Sub ScrollFirst()
$hTabBarContainer.X = 0
CancelEnsureCurrentVisible
End
Private Sub ScrollLast()
$hTabBarContainer.X = $hTabBar.W - GetTabBarMaxWidth()
CancelEnsureCurrentVisible
End
Public Sub Arrow_MouseDown()
If Mouse.Left Then
If Last = $hRightArrow Xor Me.RightToLeft Then
Try _MoveNext()
Try ScrollNext()
$iRepeatInc = 1
Else
Try _MovePrevious()
Try ScrollPrevious()
$iRepeatInc = -1
Endif
$hTimerRepeat = New Timer As "TimerRepeat"
$hTimerRepeat.Delay = 100
$hTimerRepeat.Delay = 50
$hTimerRepeat.Start
$iRepeatStart = 0
......@@ -393,26 +437,38 @@ End
Public Sub Arrow_MouseUp()
If $hTimerRepeat Then
$hTimerRepeat.Stop
$hTimerRepeat = Null
Endif
End
Public Sub Arrow_DblClick()
If Last = $hRightArrow Xor Me.RightToLeft Then
ScrollLast()
Else
ScrollFirst()
Endif
End
Public Sub TimerRepeat_Timer()
If $iRepeatStart < 3 Then
If $iRepeatStart < 0 Then
Inc $iRepeatStart
Else
If $iRepeatInc > 0 Then
Try _MoveNext()
Try ScrollNext()
Else
Try _MovePrevious()
Try ScrollPrevious()
Endif
If Error Then $hTimerRepeat = Null
Endif
End
' Public Sub Arrow_DblClick()
'
' If Mouse.Left Then
......@@ -674,6 +730,8 @@ End
Public Sub TabBarContainer_Draw()
' Paint.DrawRect(0, 0, Paint.W, Paint.H, Color.Red)
' Dim hLast As _TabPanelButton
' Dim iCol As Integer
' Dim Y As Integer
......@@ -732,8 +790,6 @@ Public Sub Panel_Arrange()
End
Private Function Orientation_Read() As Integer
Return $iOrientation
......
......@@ -6,7 +6,7 @@
Spacing = True
Margin = True
{ TabPanel2 TabPanel
MoveScaled(1,2,78,26)
MoveScaled(5,2,69,26)
#Translate = False
Foreground = Color.Orange
Expand = True
......@@ -25,13 +25,19 @@
{ TabStrip1 TabStrip
MoveScaled(2,30,51,15)
Foreground = Color.Red
Count = 3
Count = 6
Index = 0
Text = ("Text")
Index = 1
Text = ("")
Index = 2
Text = ("")
Index = 3
Text = ("Tab 4")
Index = 4
Text = ("Tab 5")
Index = 5
Text = ("Tab 6")
Index = 0
}
{ Panel1 HBox
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment