#!/usr/bin/env perl use strict; use warnings; use constant { DB_DELAY => 2000, RESULTS_SEPARATOR => '=' x 40 . "\n", }; use Tk; use Tk::ProgressBar; { my $mw = MainWindow::->new(); sub _mw () { $mw } my ($progress_bar, $progress, $results); sub _progress_bar () { \$progress_bar } sub _progress () { \$progress } sub _results () { \$results } } { my $search_F = _mw->Frame->pack; $search_F->Label( -text => 'Search:', )->pack(-side => 'left'); $search_F->Entry( -validate => 'key', -validatecommand => \&run_query, )->pack(-side => 'left'); $search_F->Label( -text => 'Progress:', )->pack(-side => 'left'); ${+_progress} = 0; ${+_progress_bar} = $search_F->ProgressBar( -variable => _progress, -from => 0, -to => 100, -blocks => 10, -gap => 0, -colors => [ 0 => '#99ccff' ], -width => 20, -length => 200, )->pack(-side => 'left'); $search_F->Button( -text => 'Exit', -command => sub { exit }, )->pack(-side => 'left'); my $results_F = _mw->Frame->pack; ${+_results} = $results_F->Scrolled('Text', -scrollbars => 'osoe', )->pack; } MainLoop; sub run_query { my ($query) = @_; if (length $query) { ${+_results}->insert(end => "Query: $query\n"); ${+_results}->insert(end => "Results:\n"); for (@{get_results($query)}) { ${+_results}->insert(end => "$_\n"); } ${+_results}->insert(end => RESULTS_SEPARATOR); ${+_results}->yviewMoveto(1); } return 1; } { my @data; INIT { @data = qw{q qwe qwerty a asd asdfgh} } my %cache; sub get_results { my ($query) = @_; unless (exists $cache{$query}) { $cache{$query} = [ grep /\Q$query/, @data ]; my $step = int 0.5 + DB_DELAY / 10; for (my $i = 0; $i <= DB_DELAY; $i += $step) { _mw->after($step); ${+_progress} = $i / DB_DELAY * 100; ${+_progress_bar}->idletasks; } ${+_progress} = 0; } return $cache{$query}; } }