Crossplatform scrollable Canvas Gadget (Win + OSX done)

Everything else that doesn't fall into one of the other PB categories.
Trond
Always Here
Always Here
Posts: 7446
Joined: Mon Sep 22, 2003 6:45 pm
Location: Norway

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

Post 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.
freak
PureBasic Team
PureBasic Team
Posts: 5833
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

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

Post by freak »

The scrolled window requires support from the contained widget to work properly. Adding ScrollBarGadgets manually is probably the simpler solution.
quidquid Latine dictum sit altum videtur
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

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

Post 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.
I may look like a mule, but I'm not a complete ass.
jesperbrannmark
Enthusiast
Enthusiast
Posts: 536
Joined: Mon Feb 16, 2009 10:42 am
Location: sweden
Contact:

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

Post 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
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

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

Post 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).
I may look like a mule, but I'm not a complete ass.
collectordave
Addict
Addict
Posts: 1256
Joined: Fri Aug 28, 2015 6:10 pm
Location: Portugal

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

Post 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
Any intelligent fool can make things bigger and more complex. It takes a touch of genius — and a lot of courage to move in the opposite direction.
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

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

Post 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.
I may look like a mule, but I'm not a complete ass.
Post Reply