Gtk2-GladeXML

 view release on metacpan or  search on metacpan

examples/fileman.pl  view on Meta::CPAN

    foreach my $file (@files) {
        my ($s, $t) = (stat("$cwd/$file"))[7,9];
        my $time = localtime($t);
        my $type;
        if ($file =~ m/.*\.(.*?)$/) {$type = $1}
        else {$type = 'Unknown';}
        $total_bytes += $s;
        push @{$fileview->{data}}, [$fileicon, "$file", "$s", "$type", "$time"];
    }

    # set a decent default selection (makes keyboard nav easy)
    $fileview->select(0);    

    
    # set up a 'refresh' timer to check for new files
    Glib::Timeout->add(100, 
        sub {
            my $context = $status->get_context_id('Main');
            $status->push($context, "$file_count files with $total_bytes bytes");
            0; # cancel timer
        });
}

#----------------------------------------------------------------------
# Change to parent directory
#
sub up_dir {
    my @dirs = File::Spec->splitdir ($cwd);
    pop @dirs;
    ch_dir(File::Spec->catdir(@dirs));
}

#----------------------------------------------------------------------
# Change the current working directory
#   * Updates file-view, location, and selection
#
sub ch_dir {
    my $newdir = File::Spec->canonpath (shift);

    return 0 unless -d $newdir; # only if it exists
    return 0 unless $newdir ne $cwd; # only on changes
    
    $cwd = $newdir;    
    refresh_fileview();
    $location->set_text($cwd);

    1;
}

#----------------------------------------------------------------------
# Signal handlers to match signals defined using Glade-2
#----------------------------------------------------------------------

# Some very simple handlers

sub on_home_button_clicked {ch_dir($home);}
sub on_back_button_clicked {up_dir();}
sub on_location_go_button_clicked {ch_dir($location->get_text());}
sub on_refresh_button_clicked {refresh_fileview();}
sub on_quit_activate {Gtk2->main_quit;}
sub on_prefs_button_clicked {$preferences->show_all;}
sub on_preferences_activate {$preferences->show_all;}
sub on_about_activate {$about->show_all;}
sub on_main_delete_event {Gtk2->main_quit;}
sub on_prefs_cancelbutton_clicked {$preferences->hide;}
sub on_about_okbutton_clicked {$about->hide;}

#----------------------------------------------------------------------
# Handle dialog 'close' (window-decoration induced close)
#   * Just hide the dialog, and tell Gtk not to do anything else
#
sub on_dialog_delete_event {
    my $w = shift; 
    $w->hide; 
    1; # consume this event!
}

#----------------------------------------------------------------------
# Handle preferencess apply click
#
sub on_prefs_applybutton_clicked {
    my $context = $status->get_context_id('Main');
    $status->push($context, 'Preferences updated');
}
    
#----------------------------------------------------------------------
# Handle prefs ok click (apply/dismiss dialog)
#
sub on_prefs_okbutton_clicked {
    on_prefs_applybutton_clicked();
    $preferences->hide;
}

#----------------------------------------------------------------------
# Handle key presses in location text edit control
#   * Translate a Return/Enter key into a 'Go' command
#   * All other key presses left for GTK
#
sub on_location_entry_key_release_event {
    my $widget = shift;
    my $event = shift;
    
    my $keypress = $event->keyval;    
    if ($keypress == $Gtk2::Gdk::Keysyms{KP_Enter} ||
        $keypress == $Gtk2::Gdk::Keysyms{Return}) {
        
        ch_dir($widget->get_text());
        
        return 1; # consume keypress
    }
        
    return 0; # let gtk have the keypress
}

#----------------------------------------------------------------------
# Handle keypress in file-veiw
#   * Translates backspace into a 'cd ..' command 
#   * All other key presses left for GTK
#
sub on_fileview_key_release_event {
    my $widget = shift;
    my $event = shift;
    
    if ($event->keyval == $Gtk2::Gdk::Keysyms{BackSpace}) {
        up_dir();
        return 1; # eat keypress
    }

    return 0; # let gtk have keypress

}

#----------------------------------------------------------------------
# Handle double-click (or enter) on file-view
#   * Translates into a 'cd <dir>' command
#
sub on_fileview_row_activated {
    my $widget = shift;

    my $index = ($widget->get_selected_indices())[0];
    ch_dir($cwd . '/' . $widget->{data}[$index][1]);

    return 1; # consume event
}

#----------------------------------------------------------------------
sub on_size_options_changed {
    my $widget = shift;
    render_icons($widget->get_history);
    return 0 unless defined $fileview; 



( run in 2.686 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )