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

The program resides in the system tray. when you right click you get the menu. A left click brings up the interface. When you click on VCI int the menu and the left click, the program should bring up the VCI interface. this interface resides in the menu widget. what I want to do is add a progressbar in the menu widget so that the user can see the downloads progress. I tried but could not get the progressbar to show up. Any ideas? The area of interest is in the interface section.
#!/usr/bin/perl -w use strict; use warnings; use threads; use threads::shared; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; use Gtk2::TrayIcon; #user variables my $icon_main = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Des +ktop/Gtk2/test.png"); my $icon_nav = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Desk +top/Gtk2/uvnav.png"); my $icon_vci = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Desk +top/Gtk2/vci.png"); my $time = 1200000; #global variables my $user : shared = 'uas'; my $server : shared = 'updraft.unl.edu'; my $local_waypoint : shared = '/local'; my $remote_waypoint : shared = '/remote'; my $waytemp : shared = 'waytemp'; my $wayfinal : shared = 'wayfinal'; my $file = 'default.cfg'; my $local_uaspos : shared = '/local'; my $remote_uaspos : shared = '/remote'; my $local_uas : shared = '/local'; my $remote_uas : shared = '/remote'; my $die : shared = 0; my $sftp_connect : shared = 0; my $current_controls = 0; #icon goes in box, box goes in tray my $icon = Gtk2::Image->new_from_pixbuf($icon_main); my $eventbox = Gtk2::EventBox->new; $eventbox->add($icon); my $tray = Gtk2::TrayIcon->new('Test'); $tray->add($eventbox); #threads my $thread_1 = threads->new( \&sftp); #tooltip my $tooltip = Gtk2::Tooltips->new; $tooltip->set_tip($tray, "GRRUVI v1.0"); #events and timeouts $eventbox->signal_connect('button_release_event', \&click); #show tray $tray->show_all; #end event loop Gtk2->main; #handles tray clicks sub click { #left mouse button if ($_[1]->button == 1) { &interface; } #right mouse button elsif ($_[1]->button == 3) { &menu; } return 1; } #right click menu sub menu { my $menu = Gtk2::Menu->new(); #UVNav # my $menu_UVNav = Gtk2::ImageMenuItem->new_with_label("UVNav"); # $menu_UVNav->signal_connect(activate => \&UVNav); # $menu_UVNav->set_image(Gtk2::Image->new_from_stock('gtk-refresh', + 'menu')); # $menu->add($menu_UVNav); #VCI my $menu_VCI = Gtk2::ImageMenuItem->new_with_label("VCI"); $menu_VCI->signal_connect(activate => sub { #change the icon when VCI +is clicked in the menu $eventbox->remove($icon); $icon = Gtk2::Image->new_f +rom_pixbuf($icon_vci); $eventbox->add($icon); $eventbox->reparent($tray) +; $tray->show_all; $tooltip->set_tip($tray, " +Virtual Cockpit Interface"); #Set the correct interface $current_controls = 1; } ); $menu_VCI->set_image(Gtk2::Image->new_from_stock('gtk-refresh', 'm +enu')); $menu->add($menu_VCI); #configure my $menu_pref = Gtk2::ImageMenuItem->new_with_label("Configure"); $menu_pref->signal_connect(activate => \&configure); $menu_pref->set_image(Gtk2::Image->new_from_stock('gtk-preferences +', 'menu')); $menu->add($menu_pref); #separator my $menu_sep = Gtk2::SeparatorMenuItem->new(); $menu->add($menu_sep); #Quit my $menu_quit = Gtk2::ImageMenuItem->new_with_label("Quit"); $menu_quit->signal_connect(activate => \&exit_threads); $menu_quit->set_image(Gtk2::Image->new_from_stock('gtk-quit', 'men +u')); $menu->add($menu_quit); $menu->show_all; #popup menu, the three is for right mouse button $menu->popup(undef,undef,undef,3,undef,undef); return 1; } #Program interfaces sub interface { my $interface = Gtk2::Menu->new(); #menu items for VCI if ( $current_controls == 1) { #Progress bar for number of downloads; just a countng bar #my $progressbar_vci_uasposition = Gtk2::ProgressBar->new #my $menu = Gtk2::Menu->new(my $progressbar_vci_uasposition = +Gtk2::ProgressBar->new); #interface->add($menu); #$progressbar_vci_uasposition->{timer} = Glib::Timeout->add(10 +0, \&progress_timeout, $progressbar_vci_uasposition); #separator my $menu_sep = Gtk2::SeparatorMenuItem->new(); $interface->add($menu_sep); #Add the correct controls to menu my $menu_vci_connect = Gtk2::ImageMenuItem->new_with_label("Co +nnect"); $interface->add($menu_vci_connect); my $menu_vci_stop = Gtk2::ImageMenuItem->new_with_label("Stop" +); $interface->add($menu_vci_stop); #limit the button options if ( $sftp_connect == 1) { $menu_vci_connect->set_sensitive(0); $menu_vci_stop->set_sensitive(1); } else { $menu_vci_connect->set_sensitive(1); $menu_vci_stop->set_sensitive(0); } } $interface->show_all; $interface->popup(undef,undef,undef,1,undef,undef); } #UVNav interface sub UVNav { } #VCI interface sub VCI { } #configuration dialog window sub configure { #Create the new window my $config_window = Gtk2::Window->new('toplevel'); $config_window->set_title("Configuration"); $config_window->set_position('center'); #VBox container my $table_config = Gtk2::Table->new(3, 5, FALSE); #Create Notebook my $config_notebook = Gtk2::Notebook->new; $config_notebook->set_tab_pos('top'); #the First Page; Config file select my $hbox_file = Gtk2::HBox->new(FALSE, 1); my $label_file = Gtk2::Label->new('Configuration Filename'); my $entry_file = Gtk2::Entry->new; my $button_file = Gtk2::Button->new_with_mnemonic("_Browse"); $button_file->set_size_request( 80, 32); my $align_button_file = Gtk2::Alignment->new( 0.5, 0.5, 0, 0); $align_button_file->add( $button_file); $entry_file->set_text($file); $hbox_file->pack_start($label_file, FALSE, FALSE, 1); $hbox_file->pack_start($entry_file, FALSE, FALSE, 1); $hbox_file->pack_start($align_button_file, FALSE, FALSE, 1); #the Second Page; Connection my $connect_vbox = Gtk2::VBox->new( FALSE, 1); my $label_user = Gtk2::Label->new('Username'); my $entry_user = Gtk2::Entry->new; my $label_server = Gtk2::Label->new('Server'); my $entry_server = Gtk2::Entry->new; $entry_user->set_text($user); $entry_server->set_text($server); $connect_vbox->pack_start($label_user, FALSE, FALSE, 1); $connect_vbox->pack_start($entry_user, FALSE, FALSE, 1); $connect_vbox->pack_start($label_server, FALSE, FALSE, 1); $connect_vbox->pack_start($entry_server, FALSE, FALSE, 1); #the Third Page; Waypoint my $table_waypoint = Gtk2::Table->new(4, 2, FALSE); my $label_temp_waypoint = Gtk2::Label->new('Temp Waypoint Filename +'); my $entry_temp_waypoint = Gtk2::Entry->new; my $label_final_waypoint = Gtk2::Label->new('Final Waypoint Filena +me'); my $entry_final_waypoint = Gtk2::Entry->new; my $label_local_waypoint = Gtk2::Label->new('Local Waypoint Folder +'); my $entry_local_waypoint = Gtk2::Entry->new; my $label_remote_waypoint = Gtk2::Label->new('Remote Waypoint Fold +er'); my $entry_remote_waypoint = Gtk2::Entry->new; $entry_temp_waypoint->set_text($waytemp); $entry_final_waypoint->set_text($wayfinal); $entry_local_waypoint->set_text($local_waypoint); $entry_remote_waypoint->set_text($remote_waypoint); $entry_temp_waypoint->set_editable(0); $entry_final_waypoint->set_editable(0); $table_waypoint->attach_defaults($label_temp_waypoint, 0, 1, 0, 1) +; $table_waypoint->attach_defaults($entry_temp_waypoint, 1, 2, 0, 1) +; $table_waypoint->attach_defaults($label_final_waypoint, 0, 1, 1, 2 +); $table_waypoint->attach_defaults($entry_final_waypoint, 1, 2, 1, 2 +); $table_waypoint->attach_defaults($label_local_waypoint, 0, 1, 2, 3 +); $table_waypoint->attach_defaults($entry_local_waypoint, 1, 2, 2, 3 +); $table_waypoint->attach_defaults($label_remote_waypoint, 0, 1, 3, +4); $table_waypoint->attach_defaults($entry_remote_waypoint, 1, 2, 3, +4); #the Fourth Page; UAS my $vbox_uas = Gtk2::VBox->new( FALSE, 1); my $table_uaspos = Gtk2::Table->new(4, 2, FALSE); my $frame_uaspos = Gtk2::Frame->new( 'uasposition File Transfer'); my $label_local_uaspos = Gtk2::Label->new('Local uasposition Folde +r'); my $entry_local_uaspos = Gtk2::Entry->new; my $label_remote_uaspos = Gtk2::Label->new('Remote uasposition Fol +der'); my $entry_remote_uaspos = Gtk2::Entry->new; $entry_local_uaspos->set_text($local_uaspos); $entry_remote_uaspos->set_text($remote_uaspos); $table_uaspos->attach_defaults($label_local_uaspos, 0, 1, 0, 1); $table_uaspos->attach_defaults($entry_local_uaspos, 1, 2, 0, 1); $table_uaspos->attach_defaults($label_remote_uaspos, 0, 1, 1, 2); $table_uaspos->attach_defaults($entry_remote_uaspos, 1, 2, 1, 2); $frame_uaspos->add( $table_uaspos); my $table_uas = Gtk2::Table->new(4, 2, FALSE); my $frame_uas = Gtk2::Frame->new( 'UAS Placefile Transfer'); my $label_local_uas = Gtk2::Label->new('Local uaspf.txt Folder'); my $entry_local_uas = Gtk2::Entry->new; my $label_remote_uas = Gtk2::Label->new('Remote uaspf.txt Folder') +; my $entry_remote_uas = Gtk2::Entry->new; $entry_local_uas->set_text($local_uas); $entry_remote_uas->set_text($remote_uas); $table_uas->attach_defaults($label_local_uas, 0, 1, 0, 1); $table_uas->attach_defaults($entry_local_uas, 1, 2, 0, 1); $table_uas->attach_defaults($label_remote_uas, 0, 1, 1, 2); $table_uas->attach_defaults($entry_remote_uas, 1, 2, 1, 2); $frame_uas->add( $table_uas); $vbox_uas->pack_start($frame_uaspos, FALSE, FALSE, 1); $vbox_uas->pack_start($frame_uas, FALSE, FALSE, 1); #append pages $config_notebook->append_page($hbox_file, "Configuration File"); $config_notebook->append_page($connect_vbox, "Connection"); $config_notebook->append_page($table_waypoint, "Waypoint"); $config_notebook->append_page($vbox_uas, "UAS Settings"); #add button to the main window my $button_accept = Gtk2::Button->new_with_mnemonic("_Accept"); my $button_cancel = Gtk2::Button->new_with_mnemonic("_Cancel"); #pack them into the dialog window $table_config->attach_defaults($config_notebook, 0, 5, 0, 1); $table_config->attach_defaults($button_accept, 1, 2, 2, 3); $table_config->attach_defaults($button_cancel, 3, 4, 2, 3); $config_window->add($table_config); $config_window->show_all; #Button Functions $button_cancel->signal_connect('clicked' => sub {$config_window->d +estroy}); $button_accept->signal_connect('clicked' => sub { my @settings = ( + ($user = $entry_user->get_text), ($server = $entry_server->get_text) + ,($local_waypoint = $entry_local_waypoint->get_text), ($remote_waypo +int = $entry_remote_waypoint->get_text), ($local_uaspos = $entry_loca +l_uaspos->get_text), ($remote_uaspos = $entry_remote_uaspos->get_text +), ($local_uas = $entry_local_uas->get_text), ($remote_uas = $entry_r +emote_uas->get_text)); save_default(@settings); $config_window->destr +oy}); $button_file->signal_connect('clicked' => sub {my $chooser_file = +Gtk2::FileChooserDialog->new ( 'Open Config File...', undef, 'open')} +); return 1; } #Exit threads sub exit_threads { $die = 1; $thread_1->join; Gtk2->main_quit; return FALSE; } #save to the file default.cfg when apply is clicked sub save_default { open DEFAULT, '>', 'default.cfg' or die "Could not Open file!! $!" +; for (@_) { print DEFAULT "$_\n"; } close DEFAULT; } #thread 1; SFTP connection thread sub sftp{ $|++; while(1){ if ( $die == 1 ){ goto END }; if ( $sftp_connect == 1 ){ my $seconds = 120; my %args = (host=> $server, user=>$user, timeout=>$seconds +); my $sftp = Net::SFTP::Foreign->new(%args); for(;;){ if($sftp_connect == 0){ last} if($die == 1){ goto END }; } undef $sftp; $sftp_connect = 0; }else { sleep 1 } } END: }

Replies are listed 'Best First'.
Re: Gtk2: adding a progressbar to the menu
by zentara (Cardinal) on Jul 25, 2007 at 17:29 UTC
    Well without writing it for you, my guess is that you can't add a Gtk2::Progressbar to a Menu. You will need to pop a new toplevel window for it, but I may be wrong. You might want to make a small example without all the icon changing, and other sftp stuff, and post it to the gtk2-perl maillist.

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum
      How can I give a 'top-level' window the same 'popup' functionality as the Gtk2::Menu widget?
        Well here is how to make a popop that you can put your progressbar in. As far as how to make it pop when your menu item is clicked, just put the show_all in the callback for the menuitem click. Like I said, you might want to ask this on the Perl/Gtk2 maillist, where the gtk2 gurus hang out.... they may know a better way.
        #!/usr/bin/perl use warnings; use strict; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; my $window = Gtk2::Window->new('toplevel'); my $window1 = Gtk2::Window->new('popup'); $window ->signal_connect( 'destroy' => \&delete_event ); $window->set_size_request(300,200); $window1->set_size_request(100,100); my $button = Gtk2::Button->new_from_stock('gtk-quit'); $window->add( $button ); $button->signal_connect( clicked => \&delete_event ); $window->set_position('center'); #$window1->set_position('center'); $window1->move(200,200); $window->show_all(); $window1->show_all(); Gtk2->main; ##################################### sub delete_event { Gtk2->main_quit; return FALSE; }

        I'm not really a human, but I play one on earth. Cogito ergo sum a bum