It is currently Thu May 23, 2013 9:24 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 9 posts ] 
Author Message
 Post subject: Sychronised Swimming
PostPosted: Sat Apr 21, 2012 3:18 am 
Offline
Addict
Addict

Joined: Fri Oct 23, 2009 2:33 am
Posts: 2862
Location: Wales, UK
Ok, it's not about swimming. It's about List Icon Gadgets or List View Gadgets - If you have a pair side-by-side, how can you synchronise them such that when you move the scroll bar on one, the scroll bar on the other moves with it?

_________________
IdeasVacuum
If it sounds simple, you have not grasped the complexity.


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sat Apr 21, 2012 7:01 am 
Offline
Addict
Addict

Joined: Sun Apr 12, 2009 6:27 am
Posts: 1472
Hi IdeasVacuum
Next snippet By FB (Fluid Byte)
And if you search the forum you will find a complicated one By Me to fix the first column too

Code:
OpenWindow(0,0,0,415,320,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(0,5,5,200 - 2 - 17,310)
ListIconGadget(1,0,0,200,310,"Name",170)
CloseGadgetList()
ListIconGadget(2,190,5,200,310,"Name",170)

For i=1 To 500
   AddGadgetItem(1,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
   AddGadgetItem(2,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
Next

Structure NMLVSCROLL
    hdr.NMHDR
    dx.l
    dy.l
EndStructure

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)

   Select uMsg
      Case #WM_NOTIFY
      Protected *pnmh.NMHDR = lParam   
     
      If *pnmh\hwndFrom = GadgetID(2)
         If *pnmh\code = #LVN_ENDSCROLL
            Protected *pnms.NMLVSCROLL = lParam
            Protected LVTI = SendMessage_(GadgetID(2),#LVM_GETTOPINDEX,0,0)
            Protected LVCP = SendMessage_(GadgetID(2),#LVM_GETCOUNTPERPAGE,0,0)
           
            If *pnms\dy < 0
               SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,LVTI,0)
            ElseIf *pnms\dy > 0
               SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,LVTI + LVCP - 1,0)
            EndIf
         EndIf
      EndIf             
   EndSelect
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

_________________
Egypt my love


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sat Apr 21, 2012 9:05 am 
Offline
Addict
Addict
User avatar

Joined: Sat Apr 26, 2003 8:26 am
Posts: 1290
With 2 ListViewGadget:
Code:
Procedure MouseOverGadget(window,gadget)
  If (WindowMouseX(window) >= GadgetX(gadget)) And (WindowMouseX(window) <= (GadgetX(gadget)+GadgetWidth(gadget)))
    If (WindowMouseY(window) >= GadgetY(gadget)) And (WindowMouseY(window) <= (GadgetY(gadget)+GadgetHeight(gadget)))
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure


Procedure Syncro(hWnd,msg,wParam,lParam)
    Static activeGadgetID=0
    gadget = GetWindowLongPtr_(hWnd,#GWL_ID)
    If msg = #WM_VSCROLL
        If gadget = 0 Or gadget = 1 ; both ListView
            If MouseOverGadget(0,gadget)
                activeGadgetID=hWnd
            EndIf
            If activeGadgetID=hWnd
                If gadget = 0 : target = 1
                Else          : target = 0
                EndIf
                ;pos = GetScrollPos_(hWnd,#SB_VERT)
                ;SetScrollPos_(GadgetID(target),#SB_VERT,pos,1)
                top  = SendMessage_(    hWnd   ,#LB_GETTOPINDEX ,0,0)
                SendMessage_(GadgetID(target),#LB_SETTOPINDEX,top,0)
            EndIf
        EndIf
    EndIf
    proc = GetGadgetData(gadget)
    If proc
        ProcedureReturn CallWindowProc_(proc,hWnd,msg,wParam,lParam)
    EndIf
EndProcedure


Procedure SubClassGadget(gadget,*proc)
    SetGadgetData(gadget,SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC,*proc))
EndProcedure


If OpenWindow(0, 0, 0, 480, 300, "Sychronised Swimming", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ListViewGadget(0, 10, 10, 225, 280)
    ListViewGadget(1, 245,10, 225, 280)
   
    SubClassGadget(0,@Syncro())
    SubClassGadget(1,@Syncro())
   
    For a = 1 To 100
      AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview 1")
      AddGadgetItem (1, -1, "Item " + Str(a) + " of the Listview 2")
    Next

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


1 ListViewGadget and 1 ListIconGadget, synchronized Top Index:
Code:
Procedure MouseOverGadget(window,gadget)
  If (WindowMouseX(window) >= GadgetX(gadget)) And (WindowMouseX(window) <= (GadgetX(gadget)+GadgetWidth(gadget)))
    If (WindowMouseY(window) >= GadgetY(gadget)) And (WindowMouseY(window) <= (GadgetY(gadget)+GadgetHeight(gadget)))
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure


Procedure Syncro(hWnd,msg,wParam,lParam)
    Static activeGadgetID=0
    gadget = GetWindowLongPtr_(hWnd,#GWL_ID)
    If msg = #WM_VSCROLL
        If gadget = 0 ; ListView
            If MouseOverGadget(0,0)
                activeGadgetID=hWnd
            EndIf
            If activeGadgetID=hWnd
                top  = SendMessage_(    hWnd   ,#LB_GETTOPINDEX ,0,0)
                top2 = SendMessage_(GadgetID(1),#LVM_GETTOPINDEX,0,0)

                SendMessage_(GadgetID(1),#LVM_GETITEMPOSITION,top2,origin.POINT) ; get pos of top item
                SendMessage_(GadgetID(1),#LVM_GETITEMPOSITION,top,item.POINT)    ; get pos of item we want at top
                SendMessage_(GadgetID(1),#LVM_SCROLL,0,item\y - origin\y)        ; scroll difference
            EndIf
           
        ElseIf gadget = 1 ; ListIcon
            If MouseOverGadget(0,1)
                activeGadgetID=hWnd
            EndIf
            If activeGadgetID=hWnd
                top = SendMessage_(hWnd,#LVM_GETTOPINDEX,0,0)
                SendMessage_(GadgetID(0),#LB_SETTOPINDEX,top,0)
            EndIf
           
        EndIf
    EndIf
    proc = GetGadgetData(gadget)
    If proc
        ProcedureReturn CallWindowProc_(proc,hWnd,msg,wParam,lParam)
    EndIf
EndProcedure


Procedure SubClassGadget(gadget,*proc)
    SetGadgetData(gadget,SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC,*proc))
EndProcedure


If OpenWindow(0, 0, 0, 480, 300, "Sychronised Swimming", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ListViewGadget(0, 10, 10, 225, 280)
    ListIconGadget(1, 245,10, 225, 280,"Column 1",100)
        AddGadgetColumn(1,2,"Column 2",100)
   
    SubClassGadget(0,@Syncro())
    SubClassGadget(1,@Syncro())
   
    For a = 1 To 100
      AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview")
      AddGadgetItem (1, -1, "Item " + Str(a) + Chr(10)+" of the ListIcon")
    Next

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sat Apr 21, 2012 2:49 pm 
Offline
Addict
Addict

Joined: Fri Oct 23, 2009 2:33 am
Posts: 2862
Location: Wales, UK
Wow, thanks guys, truly excellent stuff! 8)

_________________
IdeasVacuum
If it sounds simple, you have not grasped the complexity.


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sun Apr 22, 2012 12:07 am 
Offline
Enthusiast
Enthusiast

Joined: Mon May 14, 2007 2:13 am
Posts: 732
Location: Darling River
It would be good to be able to keep sync when using keyboard too. :)

_________________
PureBasic Rocks! Even More! And More!
PureBasic 5, Now We're Really Rockin!


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sun Apr 22, 2012 3:58 am 
Offline
Addict
Addict

Joined: Sun Apr 12, 2009 6:27 am
Posts: 1472
For ListIcon()

Code:

OpenWindow(0,0,0,415,320,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(0,5,5,200 - 2 - 17,310)
ListIconGadget(1,0,0,200,310,"Name",170)
CloseGadgetList()
ListIconGadget(2,190,5,200,310,"Name",170)

For i=1 To 500
   AddGadgetItem(1,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
   AddGadgetItem(2,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
Next

Structure NMLVSCROLL
    hdr.NMHDR
    dx.l
    dy.l
EndStructure

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)

   Select uMsg
      Case #WM_NOTIFY
      Protected *pnmh.NMHDR = lParam   
     
      If *pnmh\hwndFrom = GadgetID(2)
         If *pnmh\code = #LVN_ENDSCROLL
            Protected *pnms.NMLVSCROLL = lParam
            Protected LVTI = SendMessage_(GadgetID(2),#LVM_GETTOPINDEX,0,0)
            Protected LVCP = SendMessage_(GadgetID(2),#LVM_GETCOUNTPERPAGE,0,0)
           
            If *pnms\dy < 0
               SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,LVTI,0)
            ElseIf *pnms\dy > 0
               SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,LVTI + LVCP - 1,0)
            EndIf
         EndIf
      EndIf
     
      Case #WM_KEYDOWN ,#WM_MENUSELECT
        If wParam=#VK_UP
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEUP,0)
        ElseIf wParam=#VK_DOWN
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEDOWN,0)
        EndIf             
   EndSelect
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend



For ListView()
Code:

OpenWindow(0,0,0,415,320,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(0,5,5,200 - 2 - 17,310)
ListViewGadget(1,0,0,200,310)
CloseGadgetList()
ListViewGadget(2,190,5,200,310)

For i=1 To 500
   AddGadgetItem(1,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
   AddGadgetItem(2,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
Next

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
   Select uMsg
      Case #WM_CTLCOLORLISTBOX
      If lParam = GadgetID(2)
         SendMessage_(GadgetID(1),#LB_SETTOPINDEX,GetScrollPos_(GadgetID(2),#SB_VERT),0)
      EndIf
     
      Case #WM_KEYDOWN ,#WM_MENUSELECT
        If wParam=#VK_UP
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEUP,0)
        ElseIf wParam=#VK_DOWN
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEDOWN,0)
        EndIf
   EndSelect
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sun Apr 22, 2012 9:27 am 
Offline
Enthusiast
Enthusiast

Joined: Mon May 14, 2007 2:13 am
Posts: 732
Location: Darling River
Hi RASHAD,
I made a quick addition to your listview() code, to match left and right lists to do the same job in the callback, do you know how to get the row select highlight to match as well. :?:
I have been playing but not very successful for the time being. :(

Code:
OpenWindow(0,0,0,415,320,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(0,5,5,200 - 2 - 17,310)
ListViewGadget(1,0,0,200,310)
CloseGadgetList()
ListViewGadget(2,190,5,200,310)

For i=1 To 500
   AddGadgetItem(1,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
   AddGadgetItem(2,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
Next

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
   Select uMsg
      Case #WM_CTLCOLORLISTBOX
      If lParam = GadgetID(1)
         SendMessage_(GadgetID(2),#LB_SETTOPINDEX,GetScrollPos_(GadgetID(1),#SB_VERT),0)
      EndIf
      If lParam = GadgetID(2)
         SendMessage_(GadgetID(1),#LB_SETTOPINDEX,GetScrollPos_(GadgetID(2),#SB_VERT),0)
      EndIf
     
      Case #WM_KEYDOWN ,#WM_MENUSELECT
        If wParam=#VK_UP
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEUP,0)
        ElseIf wParam=#VK_DOWN
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEDOWN,0)
        EndIf
   EndSelect
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

_________________
PureBasic Rocks! Even More! And More!
PureBasic 5, Now We're Really Rockin!


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sun Apr 22, 2012 1:13 pm 
Offline
Addict
Addict

Joined: Sun Apr 12, 2009 6:27 am
Posts: 1472
Your correction not needed as long as no vertical Scroll Bar for ListView() #1
Not the best but step forward
Code:
OpenWindow(0,0,0,415,320,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(0,5,5,200 - 2 - 17,310)
ListViewGadget(1,0,0,200,310)
CloseGadgetList()
ListViewGadget(2,190,5,200,310)

For i=1 To 500
   AddGadgetItem(1,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
   AddGadgetItem(2,-1,"Gadget Item #" + RSet(Str(i),3,"0"))
Next


Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
   Select uMsg
      Case #WM_CTLCOLORLISTBOX
      If lParam = GadgetID(2)
         SendMessage_(GadgetID(1),#LB_SETTOPINDEX,GetScrollPos_(GadgetID(2),#SB_VERT),0)
      EndIf
     
      Case #WM_KEYDOWN ,#WM_MENUSELECT
        If wParam=#VK_UP
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEUP,0)
        ElseIf wParam=#VK_DOWN
          SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
          SendMessage_(GadgetID(2),#WM_VSCROLL,#SB_LINEDOWN,0)
        EndIf
   EndSelect
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

Repeat
  Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
            Quit = 1       
     
      Case #PB_Event_Gadget
          Select EventGadget()
           Case 1
               SetGadgetState(2, GetGadgetState(1))
           
           Case 2
               SetGadgetState(1, GetGadgetState(2))
                       
          EndSelect
  EndSelect
Until Quit = 1


_________________
Egypt my love


Top
 Profile  
 
 Post subject: Re: Sychronised Swimming
PostPosted: Sun Apr 22, 2012 10:46 pm 
Offline
Enthusiast
Enthusiast

Joined: Mon May 14, 2007 2:13 am
Posts: 732
Location: Darling River
Good one RASHAD, That does the trick, gives me something to play with :) , I should have tried it your way first, silly me was trying to get it to work in the callback and I get stack overflow error. :lol:
Thanks

_________________
PureBasic Rocks! Even More! And More!
PureBasic 5, Now We're Really Rockin!


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 9 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye