# # # patch "mtn-browse" # from [90cc4d72525354dd8372bda148329f70a074556e] # to [e27760231dc0ee78198a1555f610a4b08b41868b] # ============================================================ --- mtn-browse 90cc4d72525354dd8372bda148329f70a074556e +++ mtn-browse e27760231dc0ee78198a1555f610a4b08b41868b @@ -48,7 +48,6 @@ use strict; use lib "/home/aecoope/perl"; use strict; -use integer; use Glib qw(FALSE TRUE); use Gnome2; use Gnome2::VFS -init; @@ -165,6 +164,8 @@ sub get_dir_contents(address@hidden@); sub destroy_event_cb($$;$); sub get_completion(address@hidden;\%); sub get_dir_contents(address@hidden@); +sub gtk2_update(); +sub make_busy($$); sub manifest_treeview_cursor_changed_cb($$); sub manifest_treeview_row_activated_cb($$$$); sub mtn_error_handler($$); @@ -673,14 +674,8 @@ sub directory_up_button_clicked_cb # event). # # Data - $widget : The widget object that received the signal. -# $event : A Gtk2::Gdk::Event object describing the -# event that has occurred. # $browser : The browser instance that is associated with # this widget. -# Return Value : TRUE if the event has been handled and needs -# no further handling, otherwise false if the -# event should carry on through the remaining -# event handling. # ############################################################################## @@ -689,42 +684,8 @@ sub manifest_treeview_cursor_changed_cb( sub manifest_treeview_cursor_changed_cb($$) { - return; - my($widget, $browser) = @_; - my $iter; - - return if ($browser->{in_cb}); - local $browser->{in_cb} = 1; - - $iter = $browser->{manifest_liststore}->append(); - $browser->{manifest_liststore}->set($iter, - RLS_ICON_COLUMN, "gtk-open", - RLS_NAME_COLUMN, "the-main-dir", - RLS_DATE_COLUMN, "2005-01-01"); - $iter = $browser->{manifest_liststore}->append(); - $browser->{manifest_liststore}->set($iter, - RLS_ICON_COLUMN, "gtk-open", - RLS_NAME_COLUMN, "another-main-dir", - RLS_DATE_COLUMN, "2005-02-01"); - foreach (1..5) - { - $iter = $browser->{manifest_liststore}->append(); - $browser->{manifest_liststore}->set($iter, - RLS_ICON_COLUMN, "gtk-file", - RLS_NAME_COLUMN, "filexxxxxxxxxxxxxxxxxxddddddddskjhdkshskjhdjshdjshdkshdkshdskjd", - RLS_DATE_COLUMN, "2005-02-01"); - } - - - - print "CC " . scalar(@_) . "\n"; - return FALSE; - print "CC : " . Dumper address@hidden; - return FALSE; - - } # ############################################################################## @@ -872,6 +833,9 @@ sub update_browser_state($$) my($browser, $changed) = @_; + make_busy($browser, 1); + gtk2_update(); + # The list of available branches has changed. if ($changed & BRANCH) @@ -887,17 +851,28 @@ sub update_browser_state($$) # Get the new list of branches. + $browser->{main_appbar}->set_status("Fetching branch list"); + gtk2_update(); $browser->{mtn}->branches(address@hidden) if (defined($browser->{mtn})); $browser->{branch_combo_details}->{list} = address@hidden; # Update the branch list combobox. + $browser->{main_appbar}->set_status("Populating branch list"); + gtk2_update(); + my $counter = 1; $browser->{branch_combo}->get_model()->clear(); foreach my $branch (@branch_list) { $browser->{branch_combo}->append_text($branch); + $browser->{main_appbar}->set_progress_percentage + ($counter ++ / scalar(@branch_list)); + gtk2_update(); } $browser->{branch_combo}->child()->set_text(""); + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status(""); + gtk2_update(); } @@ -918,24 +893,42 @@ sub update_browser_state($$) if ($browser->{branch_combo_details}->{completed}) { + $browser->{main_appbar}->set_status("Fetching revision list"); + gtk2_update(); $browser->{mtn}->select(address@hidden, "b:" . $browser->{branch_combo_details}->{value}); + $browser->{main_appbar}->set_progress_percentage(0.33); + gtk2_update(); $browser->{mtn}->toposort(address@hidden, @revision_list); + $browser->{main_appbar}->set_progress_percentage(0.66); + gtk2_update(); splice(@revision_list, 0, scalar(@revision_list) - 100); @revision_list = reverse(@revision_list); + $browser->{main_appbar}->set_progress_percentage(1); + gtk2_update(); } $browser->{revision_combo_details}->{list} = address@hidden; # Update the revision list combobox. + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status("Populating revision list"); + gtk2_update(); + my $counter = 1; $browser->{revision_combo}->get_model()->clear(); foreach my $revision (@revision_list) { $revision = "i:" . $revision; $browser->{revision_combo}->append_text($revision); + $browser->{main_appbar}->set_progress_percentage + ($counter ++ / scalar(@revision_list)); + gtk2_update(); } $browser->{revision_combo}->child()->set_text(""); + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status(""); + gtk2_update(); } @@ -961,6 +954,8 @@ sub update_browser_state($$) # Get the new manifest. + $browser->{main_appbar}->set_status("Fetching manifest"); + gtk2_update(); if ($browser->{revision_combo_details}->{completed}) { $revision = $browser->{revision_combo_details}->{value}; @@ -971,21 +966,35 @@ sub update_browser_state($$) # Generate a simple list of directories for auto completion. + $browser->{main_appbar}->set_progress_percentage(0.5); + gtk2_update(); foreach my $item (@manifest_list) { push(@directory_list, $item->{name}) if ($item->{type} eq "directory"); } $browser->{directory_combo_details}->{list} = address@hidden; + $browser->{main_appbar}->set_progress_percentage(1); + gtk2_update(); # Update the directory list combobox. + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status("Populating directory list"); + gtk2_update(); + my $counter = 1; $browser->{directory_combo}->get_model()->clear(); foreach my $item (@directory_list) { $browser->{directory_combo}->append_text($item); + $browser->{main_appbar}->set_progress_percentage + ($counter ++ / scalar(@directory_list)); + gtk2_update(); } $browser->{directory_combo}->child()->set_text(""); + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status(""); + gtk2_update(); } @@ -996,10 +1005,12 @@ sub update_browser_state($$) my($author, @certs_list, + $counter, @directory_entry_list, $last_update, @revision_list, - $revision); + $revision, + $taking_our_time); # Reset the manifest tree view. @@ -1024,6 +1035,9 @@ sub update_browser_state($$) # Update the directory tree view. + $browser->{main_appbar}->set_status("Populating file details"); + $counter = 1; + $taking_our_time = 0; $revision = $browser->{revision_combo_details}->{value}; $revision =~ s/^i://o; foreach my $item (@directory_entry_list) @@ -1037,6 +1051,7 @@ sub update_browser_state($$) { if (! exists($item->{manifest_entry}->{author})) { + $taking_our_time = 1; $browser->{mtn}->get_content_changed (address@hidden, $revision, @@ -1084,11 +1099,22 @@ sub update_browser_state($$) RLS_AUTHOR_COLUMN, $author, RLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); + if ($taking_our_time) + { + $browser->{main_appbar}->set_progress_percentage + ($counter ++ / scalar(@directory_entry_list)); + gtk2_update(); + } + } $browser->{manifest_treeview}->scroll_to_point(0, 0) if ($browser->{manifest_treeview}->realized()); + $browser->{main_appbar}->set_progress_percentage(0); + $browser->{main_appbar}->set_status(""); + gtk2_update(); + } # The displayed file contents has changed. @@ -1219,6 +1245,8 @@ sub update_browser_state($$) { } + make_busy($browser, 0); + } # ############################################################################## @@ -1438,7 +1466,7 @@ sub mtn_error_handler($$) Glib::Markup::escape_text($message))); $dialog->run(); $dialog->destroy(); - Gtk2->main_quit(); + Gtk2->main_quit() unless (Gtk2->main_level() == 0); die($message); } @@ -1544,3 +1572,75 @@ sub setup_sigchld_handler($) }); } +# +############################################################################## +# +# Routine - make_busy +# +# Description - This routine simply makes the main window busy or active. +# +# Data - $browser : The browser instance. +# $busy : True if the browser is to be made busy, +# otherwise false if the browser is to be made +# active. +# +############################################################################## + + + +sub make_busy($$) +{ + + my($browser, $busy) = @_; + + # Create and store the cursors if we haven't done so already. + + if (! exists($browser->{busy_cursor})) + { + $browser->{normal_cursor} = Gtk2::Gdk::Cursor->new("left-ptr"); + $browser->{busy_cursor} = Gtk2::Gdk::Cursor->new("watch"); + } + + # Do it. Make the application bar grab the input when the window is busy, + # that way we gobble up keyboard and mouse events that could muck up the + # application state. + + if ($busy) + { + $browser->{main_window}->window()->set_cursor($browser->{busy_cursor}); + Gtk2->grab_add($browser->{main_appbar}); + } + else + { + $browser->{main_window}->window()-> + set_cursor($browser->{normal_cursor}); + Gtk2->grab_remove($browser->{main_appbar}); + } + +} +# +############################################################################## +# +# Routine - gtk2_update +# +# Description - This routine simply processes all outstanding Gtk2 toolkit +# events. This is used to update the GUI whilst the +# application is busy doing something. +# +# Data - None. +# +############################################################################## + + + +sub gtk2_update() +{ + + return if (Gtk2->main_level() == 0); + + while (Gtk2->events_pending()) + { + Gtk2->main_iteration(); + } + +}