Page 2 of 2

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Mon Jan 02, 2012 10:16 pm
by Trond
It's possible to use a ScrolledWindow (a kind of container that adds scrollbar to the child): http://developer.gnome.org/gtk/2.24/Gtk ... indow.html

But I'd recommend adding scrollbars separately. The scrolled window is really more like a scrollarea gadget in the sense that it pans around on a big gadget.

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Mon Jan 02, 2012 10:44 pm
by freak
The scrolled window requires support from the contained widget to work properly. Adding ScrollBarGadgets manually is probably the simpler solution.

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Mon Jan 02, 2012 11:58 pm
by srod
It's looking like Linux might well be the easiest of the 3 implementations. :) I might dual boot my old desktop with a copy of Ubuntu and have a crack at it after all.

Thanks again.

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Thu May 31, 2012 2:34 pm
by jesperbrannmark
My schedulegadget does the same but with two (or three) gadgets and all in a list.
http://www.purebasic.fr/english/viewtop ... 12&t=50113

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Thu May 31, 2012 4:51 pm
by srod
jesperbrannmark wrote:My schedulegadget does the same but with two (or three) gadgets and all in a list.
http://www.purebasic.fr/english/viewtop ... 12&t=50113
Not quite, that uses a scrollarea gadget which is not suitable for very large documents because the inner container is limited in size (at least under Windows it is).

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Wed Aug 12, 2020 2:56 pm
by collectordave
Needed a scrollable canvas gadget so wrote this. No API.

The canvas is in a container gadget and is simply moved around.

I can get the scroll bars to move the canvas and I can set the start point of the canvas from the main programme.

I can also get the canvas to move with the left mouse button down, the vertical scroll can also be done with the mouse wheel the only thing I cannot get hold of is horizontal movement from say a rollerball or the mac magic mouse.

If anyone looks at this are there any limitations I should be aware of?

First the module ScrollCanvas.pbi

Code: Select all

DeclareModule ScrollCanvas
  
  Declare.i Create(Vx,Vy,Vw,Vh,Cw,Ch)
  Declare ProgScrollx(x.i)
  Declare ProgScrollY(Y.i)
  
EndDeclareModule

Module ScrollCanvas
  
  Global ViewHeight.i,ViewWidth.i
  Global Canvas,CanvasWidth.i,CanvasHeight.i
  
  Global VScroll.i,HScroll.i
  
  Global VScrollValue
  
  Procedure HandleVScroll()

    VScrollValue = GetGadgetState(VScroll); - (GetGadgetState(VScroll) * 2)
  
    If VScrollValue < 0
    
      VScrollValue = 0
    
    EndIf

    If VScrollValue > CanvasHeight - ViewHeight 

      VScrollValue = CanvasHeight - ViewHeight
    
    EndIf  

    VScrollValue = GetGadgetState(VScroll) - (GetGadgetState(VScroll) * 2)
    
    ResizeGadget(Canvas,#PB_Ignore,VScrollValue,#PB_Ignore,#PB_Ignore)
 
  EndProcedure
  
  Procedure HandleHScroll()

  HScrollValue = GetGadgetState(HScroll); - (GetGadgetState(VScroll) * 2)

  If HScrollValue < 0
    
    HScrollValue = 0
    
  EndIf

  If HScrollValue > CanvasWidth - ViewWidth
 
    HScrollValue = CanvasWidth - ViewWidth
    
  EndIf

  HScrollValue = GetGadgetState(HScroll) - (GetGadgetState(HScroll) * 2)

  ResizeGadget(Canvas,HScrollValue,#PB_Ignore,#PB_Ignore,#PB_Ignore)
 
  EndProcedure 
  
  Procedure ProgScrollx(x.i)
    
    ResizeGadget(Canvas,x,#PB_Ignore,#PB_Ignore,#PB_Ignore)
    
    SetGadgetState(HScroll,-x)
    
  EndProcedure
  
  Procedure ProgScrollY(y.i)
    
    ResizeGadget(Canvas,#PB_Ignore,Y,#PB_Ignore,#PB_Ignore)
    
    SetGadgetState(VScroll,-y)
    
  EndProcedure
  
  Procedure.i Create(Vx,Vy,Vw,Vh,Cw,Ch)
    
    CanvasWidth = Cw
    CanvasHeight = Ch
    ViewHeight= Vh - 20
    ViewWidth = Vw - 20

    View = ContainerGadget(#PB_Any, Vx, Vy, ViewWidth, ViewHeight, #PB_Container_Single)
    Canvas = CanvasGadget(#PB_Any, 0, 0, Cw, Ch)
    
    CloseGadgetList()
     HScroll = ScrollBarGadget(#PB_Any, Vx,Vy + ViewHeight,ViewWidth, 20,0, CanvasWidth - ViewWidth,1)
     VScroll = ScrollBarGadget(#PB_Any, Vx + ViewWidth,Vy,20, ViewHeight,0, CanvasHeight - ViewHeight,1)
     
     BindGadgetEvent(VScroll,@HandleVScroll())
     BindGadgetEvent(HScroll,@HandleHScroll())
     
     Debug CanvasHeight - ViewHeight
     Debug CanvasWidth - ViewWidth
     
     
    ProcedureReturn Canvas
    
    
  EndProcedure
  
EndModule
Now a little test programme. ScrollCanvastest.pb

Code: Select all

IncludeFile "ScrollCanvas.pbi"

Global Window_0

Global DrawCanvas.i

Procedure TestDraw()

  StartVectorDrawing(CanvasVectorOutput(DrawCanvas))
  
  MovePathCursor(0,0)
  AddPathLine(800,900)

  MovePathCursor(800,0)
  AddPathLine(0,900) 
  
  StrokePath(1)
  
EndProcedure

  Window_0 = OpenWindow(#PB_Any, 0, 0, 850, 450, "Scroll Canvas", #PB_Window_SystemMenu)

  DrawCanvas = ScrollCanvas::Create(20,25,700,400,800,900)

  TestDraw()
  
  ;Show Centre of canvas
  ScrollCanvas::ProgScrollY(-260)
  ScrollCanvas::ProgScrollX(-60)  
 
  Define Event.i
  
Repeat
    
  Event = WaitWindowEvent()
  
  Select event
    Case #PB_Event_CloseWindow
      End

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  
ForEver
Any use?

CD

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Tue Aug 25, 2020 12:57 pm
by srod
A similar approach to that taken by a ScrollAreaGadget and is limited by the size restrictions placed on a gadget by the OS in question. Windows 7 certainly has such limitations.

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Tue Aug 25, 2020 4:45 pm
by mestnyi

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Tue Jun 27, 2023 7:03 pm
by RichAlgeni
Is SROD still around???

Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

Posted: Wed Jun 28, 2023 10:56 am
by HeX0R
no

Edit
Sorry, I didn't want to keep it like that, but I had to search an old post => viewtopic.php?p=581928#p581928