Hi,
By default, buttons in a TBar control are rendered from left to right.
Is it possible to output buttons from right to left?
METHOD BtnAdjust( lRefresh ) CLASS TBar
local n, nGroups := 0, nPopups := 0
local l3D := ::l3D .and. ! ( ::l2007 .or. ::l2010 .or. ::l2013 .or. ::l2015)
local nRow := If( l3D, 2, -1 )
// Inicializamos nCol con el ancho total disponible
local nCol := If( l3D, ::oWnd:nWidth - ::nBtnWidth - 2, ::oWnd:nWidth - ::nBtnWidth + 1 )
DEFAULT lRefresh := .T.
do case
case ::nMode == BAR_TOP .or. ::nMode == BAR_DOWN
for n = 1 to Len( ::aControls )
TRY
nGroups += If( ::aControls[ n ]:lGroup, 1, 0 )
CATCH
// not a btnbmp
END
::aControls[ n ]:Move( If( l3D, 4, 0 ) - 1,;
nCol + ( nGroups * ::nGroupSep ) + ;
If( ::l2007 .or. ::l2010 .or. ::l2013 .or. ::l2015, 1, 9 ) + ;
( nPopups * 13 ) )
nPopups += If( ::aControls[ n ]:oPopup != nil, 1, 0 )
::aControls[ n ]:Refresh()
// Restamos el ancho del botón en vez de sumarlo
nCol -= ::nBtnWidth
next
case ::nMode == BAR_LEFT .or. ::nMode == BAR_RIGHT
// Para las barras verticales, iniciamos desde arriba pero desde el extremo derecho
local nInitialCol := If( l3D, ::oWnd:nWidth - ::nBtnWidth - 3, ::oWnd:nWidth - ::nBtnWidth )
for n = 1 to Len( ::aControls )
TRY
nGroups += If( ::aControls[ n ]:lGroup, 1, 0 )
CATCH
END
::aControls[ n ]:Move( nRow + ( nGroups * ::nGroupSep ) + 8,;
nInitialCol )
::aControls[ n ]:Refresh()
nRow += ::nBtnHeight - If( l3D, 3, -1 )
next
case ::nMode == BAR_FLOAT
nRow = 0
// Iniciamos nCol desde el extremo derecho
nCol = ::oWnd:nWidth - ::nBtnWidth
for n = 1 to Len( ::aControls )
::aControls[ n ]:Move( nRow, nCol )
nRow = If( nCol <= 0, nRow + ::nBtnHeight - If( l3D, 5, -1 ), nRow )
// Movemos hacia la izquierda
nCol = If( nCol == ::oWnd:nWidth - ::nBtnWidth, 0, ::oWnd:nWidth - ::nBtnWidth )
if nCol != ::oWnd:nWidth - ::nBtnWidth
nCol -= If( ::aControls[ n ]:oPopup != nil, 13, 0 )
endif
next
endcase
::oWnd:Refresh( lRefresh )
return nil
METHOD GetBtnLeft( lNewGroup, nInd ) CLASS TBar
local l3D := ::l3D .and. ! ( ::l2007 .or. ::l2010 .or. ::l2013 .or. ::l2015)
// Iniciamos desde el extremo derecho de la barra
local nPos := ::nWidth - If( l3D, 9, 0 ) - ::nBtnWidth
local n
do case
case ::nMode == BAR_TOP .or. ::nMode == BAR_DOWN
if Len( ::aControls ) > 0
if nInd == nil
// Para el último botón, calculamos desde el borde derecho
nPos := ::nWidth - ATail( ::aControls ):nWidth - If( l3D, 9, 0 )
else
if nInd > 1
// Calculamos la posición basada en el botón anterior
nPos := ::aControls[ nInd - 1 ]:nLeft - ::nBtnWidth
endif
// Ajustamos las posiciones de los botones siguientes
for n = nInd to Len( ::aControls )
::aControls[ n ]:nRight -= ::nBtnWidth
::aControls[ n ]:nLeft -= ::nBtnWidth
if ::aControls[ n ]:lGroup
::aControls[ n ]:nRight -= ::nGroupSep
::aControls[ n ]:nLeft -= ::nGroupSep
endif
next
endif
endif
if lNewGroup != nil .and. lNewGroup
// Ajustamos para nuevo grupo
++::nGroups
nPos -= ::nGroupSep
endif
if l3D
// Ajustamos para efecto 3D
nPos -= 2
endif
case ::nMode == BAR_LEFT .or. ::nMode == BAR_RIGHT
// Para barras verticales, mantenemos el mismo comportamiento pero desde el extremo derecho
nPos := ::nWidth - ::nBtnWidth - If( l3D, 2, 0 )
case ::nMode == BAR_FLOAT
// Para barras flotantes, calculamos desde el extremo derecho
nPos := If( Len( ::aControls ) > 0,;
If( ATail( ::aControls ):nLeft - ::nBtnWidth < 0,;
::nWidth - ::nBtnWidth, ::nWidth - ( ( Len( ::aControls ) + 1 ) * ::nBtnWidth ) ), ::nWidth - ::nBtnWidth )
endcase
return nPos
METHOD GetBtnTop( lNewGroup ) CLASS TBar
local l3D := ::l3D .and. ! ( ::l2007 .or. ::l2010 .or. ::l2013 .or. ::l2015)
local nPos := 0
local nButtons := Len( ::aControls )
do case
case ::nMode == BAR_TOP .or. ::nMode == BAR_DOWN
// Para barras horizontales, mantenemos la misma posición vertical
nPos = If( l3D, 3, -1 ) // 3 --> 2
case ::nMode == BAR_LEFT .or. ::nMode == BAR_RIGHT
// Para barras verticales, calculamos desde arriba
nPos = If( l3D, 2, 0 ) + ;
( nButtons * ( ::nBtnHeight - If( l3D, 3, 0 ) ) ) + ;
( If( lNewGroup, ++::nGroups, ::nGroups ) * ::nGroupSep )
// No es necesario modificar la lógica vertical ya que los botones
// seguirán apilándose de arriba hacia abajo, solo cambiará su
// posición horizontal (que se maneja en GetBtnLeft)
endcase
return nPos
Return to FiveWin for Harbour/xHarbour
Users browsing this forum: No registered users and 38 guests