/usr/local/CPAN/App-FQStat/App/FQStat/Menu.pm
package App::FQStat::Menu;
# App::FQStat is (c) 2007-2009 Steffen Mueller
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
use strict;
use warnings;
use Term::ANSIScreen qw/RESET :cursor/;
use App::FQStat::Debug;
use App::FQStat::Config qw(get_config);
use App::FQStat::Colors qw(get_color);
use base 'Exporter';
our %EXPORT_TAGS = (
'all' => [qw(
)],
);
our @EXPORT_OK = @{$EXPORT_TAGS{'all'}};
our @Menus = (
{ width => 11, name => 'Display', entries => [
{ name => 'Summary', action => \&App::FQStat::Actions::toggle_summary_mode },
{ name => 'Summ.Clust.', action => \&App::FQStat::Actions::toggle_summary_name_clustering },
{ name => 'Refresh', action => sub { App::FQStat::Drawing::update_display(1) } },
{ name => 'Sort', action => \&App::FQStat::Actions::select_sort_field },
{ name => 'Reverse', action => \&App::FQStat::Actions::toggle_reverse_sort },
{ name => 'Interval', action => \&App::FQStat::Actions::set_user_interval },
{ name => 'Highl. User', action => \&App::FQStat::Actions::update_highlighted_user_name },
{ name => 'Job Details', action => \&App::FQStat::Actions::show_job_details, },
{ name => 'Job Log', action => \&App::FQStat::Actions::show_job_log, },
], },
{ width => 11, name => 'Actions', entries => [
{ name => 'Hold', action => \&App::FQStat::Actions::hold_jobs, },
{ name => 'Resume', action => \&App::FQStat::Actions::resume_jobs, },
{ name => 'Kill', action => \&App::FQStat::Actions::kill_jobs, },
{ name => 'Set Prio.', action => \&App::FQStat::Actions::change_priority, },
{ name => 'Clear Error', action => \&App::FQStat::Actions::clear_job_error_state, },
{ name => 'Change Deps', action => \&App::FQStat::Actions::change_dependencies, },
], },
{ width => 5, name => 'Help', entries => [
{ name => 'Help', action => \&App::FQStat::Actions::show_manual, },
{ name => 'About', action => \&App::FQStat::Actions::show_manual, },
], },
{ width => 6, name => 'Config', entries => [
{ name => 'Edit', action => \&App::FQStat::Config::edit_configuration, },
{ name => 'Reset', action => \&App::FQStat::Config::reset_configuration, },
], },
{ width => 4, name => 'Quit', entries => [
{ name => 'Menu', action => \&App::FQStat::Menu::close_menu, },
{ name => 'Quit', action => \&main::cleanup_and_exit, },
], },
{
width => 8, name => 'Colors', entries => \&App::FQStat::Colors::get_color_scheme_menu_entries,
nEntries => \&App::FQStat::Colors::get_n_color_scheme_entries,
},
);
# Set cumulative width
{
my $width = 0;
foreach my $menu (@Menus) {
$menu->{startx} = $width+1;
$width += $menu->{width} + 2;
}
}
sub enter_menu {
warnenter if ::DEBUG > 0;
$::MenuMode = 1;
$::MenuNumber = 0;
$::MenuEntryNumber = 0;
App::FQStat::Drawing::update_display(@_);
}
sub close_menu {
warnenter if ::DEBUG > 0;
$::MenuMode = 0;
App::FQStat::Drawing::update_display(@_);
}
sub toggle_menu {
warnenter if ::DEBUG > 0;
$::MenuMode = ($::MenuMode ? 0 : 1);
$::MenuNumber = 0;
$::MenuEntryNumber = 0;
App::FQStat::Drawing::update_display(@_);
}
sub get_menu_title_line {
warnenter if ::DEBUG > 1;
my $line;
foreach my $menu_no (0..$#Menus) {
my $menu = $Menus[$menu_no];
my $name = $menu->{name};
$line .= " " . $name;
$line .= " " x ($menu->{width} - length($name) + ($menu_no != $#Menus ? 1 : 0));
}
return $line;
}
sub draw_menu {
warnenter if ::DEBUG > 0;
my $width = 1;
my $menu = $Menus[$::MenuNumber];
my $thisEntries = $menu->{entries};
$thisEntries = $thisEntries->() if ref($thisEntries) eq 'CODE';
my $startx = $menu->{startx};
draw_menubox($startx, $startx + $menu->{width}+2, $menu->{name}, $thisEntries, $::MenuEntryNumber);
locate(1, 1);
}
sub draw_menubox {
warnenter if ::DEBUG > 1;
my ($x1, $x2, $title, $entries, $selentry) = @_;
locate(1, $x1);
my $width = $x2-$x1;
my $menuColor = get_color("menu_normal");
my $menuSelColor = get_color("menu_selected");
print $menuColor . " $title " . (" "x($width - length($title) - 2)) . RESET;
my $y = 2;
foreach my $entry (@$entries) {
my $thiscolor = ($y-2 == $selentry ? $menuSelColor : $menuColor);
locate($y, $x1);
my $name = " ".$entry->{name};
$name .= " "x($width-length($name));
print $thiscolor . $name . RESET;
$y++;
}
#locate($y, $x1);
#print $color . (" "x($width)) . RESET;
}
sub menu_up {
warnenter if ::DEBUG > 1;
return if not $::MenuMode;
if ($::MenuEntryNumber == 0) {
my $max_entry = menu_entries() - 1;
$::MenuEntryNumber = $max_entry;
}
else {
$::MenuEntryNumber--;
}
return 1;
}
sub menu_down {
warnenter if ::DEBUG > 1;
return if not $::MenuMode;
my $max_entry = menu_entries() - 1;
if ($::MenuEntryNumber == $max_entry) {
$::MenuEntryNumber = 0;
}
else {
$::MenuEntryNumber++;
}
return 1;
}
sub menu_right {
warnenter if ::DEBUG > 1;
return if not $::MenuMode;
my $max_menu = @Menus - 1;
if ($::MenuNumber == $max_menu) {
$::MenuNumber = 0;
}
else {
$::MenuNumber++;
}
$::MenuEntryNumber = 0;
return 1;
}
sub menu_left {
warnenter if ::DEBUG > 1;
return if not $::MenuMode;
if ($::MenuNumber == 0) {
my $max_menu = @Menus - 1;
$::MenuNumber = $max_menu;
}
else {
$::MenuNumber--;
}
$::MenuEntryNumber = 0;
return 1;
}
sub menu_select {
warnenter if ::DEBUG > 1;
return if not $::MenuMode;
my $menu = $Menus[$::MenuNumber];
my $entries = $menu->{entries};
$entries = $entries->() if ref($entries) eq 'CODE';
my $entry = $entries->[$::MenuEntryNumber];
my $action = $entry->{action};
$::MenuMode = 0;
App::FQStat::Drawing::update_display();
return $action->($entry);
}
sub menu_entries {
return @{ $Menus[$::MenuNumber]->{entries} } if ref($Menus[$::MenuNumber]->{entries}) eq 'ARRAY';
my $nentries = $Menus[$::MenuNumber]->{nEntries};
$nentries = $nentries->() if defined($nentries) and ref($nentries) eq 'CODE';
return $nentries;
}
1;