Swapping Tabs

Share your advanced PureBasic knowledge/code with the community.
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Swapping Tabs

Post by Josh »

Maybe anybody can use the following code for swapping tabs or any similar job:

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
Last edited by Josh on Mon Mar 16, 2015 12:02 pm, edited 3 times in total.
sorry for my bad english
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Swapping Tabs

Post by Kwai chang caine »

Nice effect, works perfectly here v5.23 W7 :wink:
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
User avatar
Shardik
Addict
Addict
Posts: 2058
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: Swapping Tabs

Post by Shardik »

Thank you for sharing your nice example. It would be even cross-platform when adding the definition of the following color constants (tested on Linux):

Code: Select all

  #Gray = 8421504
  #Red = 255
  #White = 16777215
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Re: Swapping Tabs

Post by Josh »

Shardik wrote:Thank you for sharing your nice example. It would be even cross-platform when adding the definition of the following color constants (tested on Linux):

Code: Select all

  #Gray = 8421504
  #Red = 255
  #White = 16777215
Done
sorry for my bad english
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: Swapping Tabs

Post by Fred »

Nice code
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: Swapping Tabs

Post by luis »

Awesome. :)

Super cool effect, and useful too, not just a gimmick.
"Have you tried turning it off and on again ?"
A little PureBasic review
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Swapping Tabs

Post by davido »

@Josh,
Very nice code.Thank you very much for sharing.
Works ok on Mac. :D
DE AA EB
Karellen
User
User
Posts: 83
Joined: Fri Aug 16, 2013 2:52 pm
Location: Germany

Re: Swapping Tabs

Post by Karellen »

Well done, Josh! This comes in very handy for me.
Thanks for sharing!
Stanley decided to go to the meeting room...
Post Reply