Move Tab in Panel (no Swap)

Just starting out? Need help? Post your questions and find answers here.
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Move Tab in Panel (no Swap)

Post by dobro »

Good morning, folks.

I wish I knew how to encode that effect:
to integrate it into my IDE


Image

a sample code, would be welcome, thank you in advance

I've been looking for a long time, but I couldn't find an example.

Thanks :)
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Move Tab in Panel (no Swap)

Post by davido »

@dobro,
Might I suggest that you look at the TabBarGadget which was written by STARGÅTE and is used in the IDE. See:
http://www.purebasic.fr/english/viewtop ... 99#p361799
DE AA EB
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Re: Move Tab in Panel (no Swap)

Post by dobro »

Okay, thanks for that answer, I'll check it out. :)
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
mestnyi
Addict
Addict
Posts: 1000
Joined: Mon Nov 25, 2013 6:41 am

Re: Move Tab in Panel (no Swap)

Post by mestnyi »

Here is a small code demonstrating this. Somewhere on the forum found a long time. :)

Code: Select all

EnableExplicit

  #Win          = 0
  #Bar          = 0
  #TabsDistance = 2

  #ColTab = 8421504
  #ColSwp = 255
  #ColBar = 16777215

  Structure TAB
    Wi           .i
    OffsetItem   .i
    OffsetMove   .i
    OffsetMoveMin.i
    OffsetMoveMax.i
    Text         .s
  EndStructure

  Global NewList Tabs.TAB()
  Global *TabSwap    .TAB
  Define *Tab        .TAB
  Define Event       .i
  Define BarWi       .i
  Define MouseX      .i
  Define MouseY      .i
  Define MouseDownX  .i
  Define MouseDownY  .i
  Define TabsWi      .i

 ;Add tabs to list
  AddElement (Tabs()) : Tabs()\Wi =  40 : Tabs()\Text = "" + ListIndex (Tabs()) + " - " + Tabs()\Wi
  AddElement (Tabs()) : Tabs()\Wi = 140 : Tabs()\Text = "" + ListIndex (Tabs()) + " - " + Tabs()\Wi
  AddElement (Tabs()) : Tabs()\Wi =  70 : Tabs()\Text = "" + ListIndex (Tabs()) + " - " + Tabs()\Wi
  AddElement (Tabs()) : Tabs()\Wi = 130 : Tabs()\Text = "" + ListIndex (Tabs()) + " - " + Tabs()\Wi

 ;Calc bar width
  ForEach Tabs()
    BarWi + Tabs()\Wi + #TabsDistance
  Next
  BarWi - #TabsDistance

 ;Create window and bar
  OpenWindow   (#Win,  0,  0, BarWi + 20, 40, "Swap Tabs", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget (#Bar, 10, 10, BarWi     , 20)

  Procedure DrawBar ()
    Define OffsetItem.i
    Define *Tab      .TAB

   ;Calc OffsetItem
    If *TabSwap = 0
      ForEach Tabs() : *Tab = @Tabs()
        *Tab\OffsetItem = OffsetItem
        OffsetItem + *Tab\Wi + #TabsDistance
      Next
    EndIf

    StartDrawing (CanvasOutput (#Bar))

     ;Draw background
      DrawingMode (#PB_2DDrawing_Default)
      Box (0, 0, GadgetWidth (#Bar), GadgetHeight (#Bar), #ColBar)

     ;Draw tabs
      ForEach  Tabs() : *Tab = @Tabs()
        If *Tab <> *TabSwap
          DrawingMode (#PB_2DDrawing_Default)
          Box      (*Tab\OffsetItem + *Tab\OffsetMove, 0, *Tab\Wi, 20, #ColTab)
          DrawingMode (#PB_2DDrawing_Transparent)
          DrawText (*Tab\OffsetItem + *Tab\OffsetMove + 2, 2, *Tab\Text)
        EndIf
      Next

     ;Draw swapping tab
      If *TabSwap
        DrawingMode (#PB_2DDrawing_AlphaBlend)
        Box      (*TabSwap\OffsetItem + *TabSwap\OffsetMove, 0, *TabSwap\Wi, 20, $70000000 | #ColSwp)
        DrawingMode (#PB_2DDrawing_Transparent)
        DrawText (*TabSwap\OffsetItem + *TabSwap\OffsetMove + 2, 2, *TabSwap\Text)
      EndIf

    StopDrawing ()

  EndProcedure

 ;Draw bar
  DrawBar ()

 ;Eventloop
  Repeat

    Event = WaitWindowEvent()
        
    If Event = #PB_Event_Gadget And EventGadget() = #Bar 

      MouseX = GetGadgetAttribute(0, #PB_Canvas_MouseX)
      MouseY = GetGadgetAttribute(0, #PB_Canvas_MouseY)

     ;_________
     ;Left down
     ;¯¯¯¯¯¯¯¯¯

      If EventType() = #PB_EventType_LeftButtonDown

       ;Store MouseDown
        MouseDownX = MouseX
        MouseDownY = MouseY

       ;Find TabSwap
        ForEach Tabs() : *Tab = @Tabs()
          If MouseX >= *Tab\OffsetItem And MouseX < *Tab\OffsetItem + *Tab\Wi
            *TabSwap = *Tab
          EndIf
        Next

        If *TabSwap

         ;Align all tabs to right (without TabSwap)
          ForEach Tabs() : *Tab = @Tabs()
            If *Tab = *TabSwap : Break : EndIf
            *Tab\OffsetItem + *TabSwap\Wi + #TabsDistance
          Next

         ;Calc OffsetMoveMin/Max
          ForEach Tabs() : *Tab = @Tabs()
            If *Tab <> *TabSwap
              *Tab\OffsetMoveMin = TabsWi - *Tab\OffsetItem
              *Tab\OffsetMoveMax = TabsWi - *Tab\OffsetItem + *TabSwap\Wi + #TabsDistance
              TabsWi + *Tab\Wi + #TabsDistance
            EndIf
          Next

         ;Calc OffsetMoveMin/Max for TabSwap
          *TabSwap\OffsetMoveMin = - *TabSwap\OffsetItem
          *TabSwap\OffsetMoveMax = - *TabSwap\OffsetItem + TabsWi

        EndIf

      EndIf

     ;_______
     ;Left up
     ;¯¯¯¯¯¯¯

      If EventType() = #PB_EventType_LeftButtonUp

       ;Sum-up Offsets and sort list
        ForEach Tabs()
          Tabs()\OffsetItem + Tabs()\OffsetMove
          Tabs()\OffsetMove = 0
        Next
        SortStructuredList (Tabs(), #PB_Sort_Ascending, OffsetOf (Tab\OffsetItem), TypeOf (Tab\OffsetItem))

       ;Resets variables
        TabsWi         = 0
        *TabSwap       = 0
        MouseDownX     = 0
        MouseDownY     = 0

       ;Draw bar
        DrawBar ()

      EndIf

     ;__________
     ;Mouse move
     ;¯¯¯¯¯¯¯¯¯¯

      If EventType() = #PB_EventType_MouseMove
        If *TabSwap
          ForEach Tabs() : *Tab = @Tabs()

           ;Calc OffsetMove
            If *Tab = *TabSwap
              *Tab\OffsetMove = MouseX - MouseDownX
            Else
              *Tab\OffsetMove = *Tab\OffsetItem - *TabSwap\OffsetItem - *TabSwap\OffsetMove
              *Tab\OffsetMove - (*TabSwap\Wi + #TabsDistance)
              *Tab\OffsetMove * (*TabSwap\Wi + #TabsDistance) / (*Tab\Wi + #TabsDistance)
            EndIf

           ;Limit OffsetMove to minimum
            If *Tab\OffsetMove < *Tab\OffsetMoveMin
              *Tab\OffsetMove = *Tab\OffsetMoveMin
            EndIf

           ;Limit OffsetMove to maximum
            If *Tab\OffsetMove > *Tab\OffsetMoveMax
              *Tab\OffsetMove = *Tab\OffsetMoveMax
            EndIf

          Next
        EndIf

       ;Draw bar
        DrawBar ()

      EndIf

    EndIf    
    
  Until Event = #PB_Event_CloseWindow
; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 43
; FirstLine = 33
; Folding = -----
; EnableUnicode
; EnableXP
; EnableOnError
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5353
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Move Tab in Panel (no Swap)

Post by Kwai chang caine »

Thanks Mestnyi for give this nice code of splendid effect :shock:
In fact, i already see it, there is a long time, but forgetten :oops:
Obviously thanks to the author JOSH
http://www.purebasic.fr/english/viewtop ... 31#p462631
ImageThe happiness is a road...
Not a destination
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Re: Move Tab in Panel (no Swap)

Post by dobro »

It's very pretty!
but these are not tabs of Table (PanelGadget)

it's just the move of "button" recreated in a Canvas Gadget.

It's pretty, but it's not what I'm looking for....
I thought it was possible to move the tabs of a panel

I now know that only swap is possible with panels
the "movement of tabs," does not seem possible

Thanls :)
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
Post Reply