package App::FQStat::Colors; # 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 (); use App::FQStat::Debug; use App::FQStat::Config qw/get_config/; use base 'Exporter'; our %EXPORT_TAGS = ( 'all' => [qw( get_color load_color_scheme save_color_scheme delete_color_scheme )], ); our @EXPORT_OK = @{$EXPORT_TAGS{'all'}}; our $DefaultColors = { initializing => 'black on green', reverse_indicator => 'blue on white', header_highlight => 'bold white on red', header_warning => 'bold red on black', header_normal => 'bold white on black', status_running => 'black on green', status_error => 'black on red', status_hold => 'black on yellow', status_queued => 'blue on white', status_fallback => 'black on yellow', scrollbar_fg => 'black on white', scrollbar_bg => 'white on black', user_highlight => 'bold white on blue', menu_normal => 'bold white on blue', menu_selected => 'bold white on red', user_input => "bold red on black", user_instructions => "bold red on white", selected_job => "blue on white", selected_cursor => "black on red", summary => "bold white on blue", warning => "red", }; our $DefaultColorSchemes = { default => {%$DefaultColors}, contrast => { header_highlight => 'bold white on red', header_normal => 'bold white on black', header_warning => 'bold red on black', initializing => 'black on green', menu_normal => 'black on cyan', menu_selected => 'bold white on red', reverse_indicator => 'blue on white', scrollbar_bg => 'red on black', scrollbar_fg => 'black on red', selected_cursor => 'black on red', selected_job => 'black on cyan', status_error => 'black on red', status_fallback => 'black on yellow', status_hold => 'black on yellow', status_queued => 'bold white on blue', status_running => 'black on green', summary => 'bold red on blue', user_highlight => 'bold red on blue', user_input => 'bold red on black', user_instructions => 'bold white on red', warning => 'red', }, }; sub get_color { warnenter if ::DEBUG > 1; my $color = shift; my $colors = get_config('colors') || {}; if (not defined $colors->{$color}) { die "Could not determine color scheme for use '$color'."; } return Term::ANSIScreen::color( $colors->{$color} ); } sub load_color_scheme { warnenter if ::DEBUG; my $schemeName = shift; my $schemes = get_config('color_schemes') || {}; if (!exists $schemes->{$schemeName}) { die "Trying to load invalid color scheme!"; } my $colors = get_config('colors') || {}; %$colors = %{$schemes->{$schemeName}}; App::FQStat::Config::save_configuration(); return 1; } sub save_color_scheme { warnenter if ::DEBUG; my $schemeName = shift; my $schemes = get_config('color_schemes') || {}; my $colors = get_config('colors') || {}; $schemes->{$schemeName} = {%$colors}; App::FQStat::Config::save_configuration(); return 1; } sub delete_color_scheme { warnenter if ::DEBUG; my $schemeName = shift; my $schemes = get_config('color_schemes') || {}; delete $schemes->{$schemeName}; App::FQStat::Config::save_configuration(); return 1; } # transform the color scheme list into a list of menu entries sub get_color_scheme_menu_entries { my $schemes = get_config('color_schemes'); my @entries; foreach my $name (sort keys %$schemes) { my $display_name = $name; $display_name =~ s/^(.{0,8}).*$/$1/; push @entries, { name => $display_name, action => sub { load_color_scheme($name) }, }, } push @entries, { name => 'Delete', action => \&App::FQStat::Actions::delete_color_scheme, }; push @entries, { name => 'Save', action => \&App::FQStat::Actions::save_color_scheme, }; return \@entries; } sub get_n_color_scheme_entries { 2 + keys( %{ get_config('color_schemes')||{} } ); } 1;