The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2008, 2010, 2011 Kevin Ryde

# This file is part of Gtk2-Ex-Dragger.
#
# Gtk2-Ex-Dragger is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any later
# version.
#
# Gtk2-Ex-Dragger is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Gtk2-Ex-Dragger.  If not, see <http://www.gnu.org/licenses/>.


# This example shows the interaction between the WidgetCursor "busy"
# mechanism and a Dragger.
#
# Basically the busy cursor is shown, but the Dragger state isn't lost and
# the cursor is restored when unbusy - which is pretty much what you want if
# a scroll provokes some time consuming activity.
#
# As noted in the text below, if you keep wiggling the mouse around the busy
# cursor will continue to show.  That's because it's only removed when idle,
# and the main loop activity you create by wiggling means it's not idle yet.
# This is logical, and you do normally want the busy cursor to stay while
# doing drawing for such wiggling, even if in this case the program is
# interacting and therefore from the user's point of view not really busy.
#

use 5.008;
use strict;
use warnings;
use Time::HiRes;
use Glib 1.220;
use Gtk2 1.220 '-init';
use Gtk2::Ex::WidgetCursor;
use Gtk2::Ex::Dragger;

my $toplevel = Gtk2::Window->new('toplevel');
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit });

my $viewport = Gtk2::Viewport->new;
$toplevel->add ($viewport);

my $label = Gtk2::Label->new
  ("
Drag
with
mouse
button-1
to move
this
up and
down.
The
busy
indication
comes and
goes on
a timer
and if
you
keep
moving
the
mouse
you can
extend
the
busy
since
it doesn't
get
back to
idle
state
to be
turned
off.
");
$viewport->add ($label);

# unspecified width to get from label, but fixed lesser height
$viewport->set_size_request (-1, 100);

my $dragger = Gtk2::Ex::Dragger->new
  (widget      => $viewport,
   vadjustment => $viewport->get_vadjustment,
   confine     => 1);

$viewport->signal_connect
  (button_press_event => sub {
     my ($viewport, $event) = @_;
     if ($event->button == 1) {
       $dragger->start ($event);
       return Gtk2::EVENT_STOP;
     } else {
       return Gtk2::EVENT_PROPAGATE;
     }
   });


sub busy {
  Gtk2::Ex::WidgetCursor->busy;
  Time::HiRes::usleep (400_000);   # 400 milliseconds
  return Glib::SOURCE_CONTINUE;
}
Glib::Timeout->add (1200, \&busy);  # 800 milliseconds

$toplevel->show_all;
Gtk2->main;
exit 0;