Buttons in a TBar

Buttons in a TBar

Postby Natter » Sat Oct 26, 2024 6:12 am

Hi,

By default, buttons in a TBar control are rendered from left to right.
Is it possible to output buttons from right to left?
Natter
 
Posts: 1221
Joined: Mon May 14, 2007 9:49 am

Re: Buttons in a TBar

Postby Antonio Linares » Sat Oct 26, 2024 6:46 am

Code: Select all  Expand view
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

Code: Select all  Expand view
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

Code: Select all  Expand view
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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Buttons in a TBar

Postby Natter » Sat Oct 26, 2024 2:41 pm

Thanks Antonio, everything works !
Natter
 
Posts: 1221
Joined: Mon May 14, 2007 9:49 am


Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 38 guests