PureBasic Forum
http://forums.purebasic.com/english/

Crossplatform scrollable Canvas Gadget (Win + OSX done)
http://forums.purebasic.com/english/viewtopic.php?f=7&t=48246
Page 2 of 2

Author:  Trond [ Mon Jan 02, 2012 10:16 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

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.

Author:  freak [ Mon Jan 02, 2012 10:44 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

The scrolled window requires support from the contained widget to work properly. Adding ScrollBarGadgets manually is probably the simpler solution.

Author:  srod [ Mon Jan 02, 2012 11:58 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

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.

Author:  jesperbrannmark [ Thu May 31, 2012 2:34 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

My schedulegadget does the same but with two (or three) gadgets and all in a list.
http://www.purebasic.fr/english/viewtopic.php?f=12&t=50113

Author:  srod [ Thu May 31, 2012 4:51 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

jesperbrannmark wrote:
My schedulegadget does the same but with two (or three) gadgets and all in a list.
http://www.purebasic.fr/english/viewtopic.php?f=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).

Author:  collectordave [ Wed Aug 12, 2020 2:56 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

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:
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:
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

Author:  srod [ Tue Aug 25, 2020 12:57 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

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.

Author:  mestnyi [ Tue Aug 25, 2020 4:45 pm ]
Post subject:  Re: Crossplatform scrollable Canvas Gadget (Win + OSX done)

How about this?
https://github.com/mestnyi33/Widget/blob/master/examples/scroll/scrollarea(demo).pb

Page 2 of 2 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/