http://www.perlmonks.org?node_id=997988

KuntalBhusan has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks... I was developing a Perl Tk based application which displays some nodes connected by edges (using Tk::GraphItems) in a standard Tk::Canvas.Later I tried to put the same in a Tk::AbstractCanvas so as to get the benefits of the automatic zooming and centering of the layout. My problem is that when the number of nodes are a bit high the canvas adjusts the node sized in some weird was so that some nodes (rectangles) become small and some remain large (although in normal Canvas this problem does not occur). Is it somehow possible to restrict the minimum size of a node (Tk::GraphItem::TextBox) in the AbstractCanvas. Another question/request in the same context....How can I make a small view of my whole Graph Layout window which I can use as a control widget to navigate the main layout (This widget may be placed at some corner of the same frame or may be independent).

Replies are listed 'Best First'.
Re: Tk::AbstractCanvas problem
by zentara (Archbishop) on Oct 09, 2012 at 12:00 UTC
    My problem is that when the number of nodes are a bit high the canvas adjusts the node sized in some weird way

    Can you show a minimal code example? Your problem description is quite vague.

    How can I make a small view of my whole Graph Layout window which I can use as a control widget

    You could take a screenshot of the whole canvas, with bbox('all'), then resize it smaller, along with hash which correlates the reduced coordinates to the larger one. Then bind the mouse to the smaller image to constantly get its coordinates, when the mouse enters it.

    Here is how to capture the whole canvas.

    #!/usr/bin/perl use Tk; #to change the background color, edit the ps file # 0.000 0.000 0.000 setrgbcolor AdjustColor # fill $width = 800; $height = 500; my $main = MainWindow->new(); my $canvas = $main->Canvas( -width=>$width, -height=>$height, -background=>"black"); $canvas->pack( -expand=>1,-fill=>'both'); &create; $canvas->update; $main->update; $main->Button( -text => "Save", -command => [sub { $canvas->update; my @capture=(); my ($x0,$y0,$x1,$y1)=$canvas->bbox('all'); @capture=('-x'=>$x0,'-y'=>$y0,-height=>$y1-$y0,-width=>$x1-$x +0); $canvas -> postscript(-colormode=>'color', -file=>$0.'.ps', -rotate=>0, -width=>800, -height=>500, @capture); } ] )->pack; MainLoop; sub create{ $canvas->createOval(100, 100, 600, 600,-fill=>'green') }

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh
Re: Tk::AbstractCanvas problem
by Anonymous Monk on Oct 09, 2012 at 12:00 UTC

    Is it somehow possible to restrict the minimum size of a node (Tk::GraphItem::TextBox) in the AbstractCanvas.

    Sure, but I think you'd have to patch the module :)

    Or maybe you could create a Scrolled Canvas and set/enforce the minimum size to something acceptable

    How can I make a small view of my whole Graph Layout window which I can use as a control widget to navigate the main layout (This widget may be placed at some corner of the same frame or may be independent).

    create two canvases and place one on top of the other, see Tk-AbstractCanvas-1.4.A7QFZHF/ex/chvw.pl , its close enough

      Thanks a lot...