/usr/local/CPAN/RT-Client-Console/RT/Client/Console/Session/TabBar.pm
package RT::Client::Console::Session::TabBar;
use strict;
use warnings;
use parent qw(RT::Client::Console::Session);
use Curses::Forms;
use Curses::Widgets::Label;
use POE;
use relative -to => "RT::Client::Console",
-aliased => qw(Connection Session Session::Ticket);
# class method
# tabs bar session creation
sub create {
my ($class) = @_;
$class->SUPER::create(
'tabbar',
inline_states => {
init => sub {
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
},
draw => sub {
my ($kernel,$heap) = @_[ KERNEL, HEAP ];
my $curses_handler = $class->get_curses_handler();
my @tickets = Ticket->get_tickets_list();
@tickets > 0 or return;
# clear the tab bar
my $label = Curses::Widgets::Label->new({
BORDER => 0,
X => 0,
Y => 0,
COLUMNS => $heap->{screen_w},
LINES => 1,
VALUE => '',
FOREGROUND => 'black',
BACKGROUND => 'black',
});
$label->draw($curses_handler);
my $current_id = Ticket->get_current_id();
my @visible_tickets = @tickets;
while (! _is_visible($current_id, \@visible_tickets, $heap->{screen_w})) {
shift @visible_tickets;
}
my $widgets = {};
my $current_pos_x = 0;
foreach my $index (0..@visible_tickets-1) {
my $ticket = $visible_tickets[$index];
my $string = '[ ' . $ticket->id() . ( $ticket->has_changed() ? ' *' : '' ). ' ]';
$current_pos_x + length($string) > $heap->{screen_w} and last;
$widgets->{"tab_$index"} =
{
TYPE => 'Label',
X => $current_pos_x,
Y => 0,
COLUMNS => length($string),
LINES => 1,
FOREGROUND => $ticket->id() eq $current_id ? 'yellow' : 'white',
BACKGROUND => 'blue',
VALUE => $string,
ALIGNMENT => 'C',
};
$current_pos_x += length($string);
}
my $form = Curses::Forms->new({
X => 0,
Y => 0,
COLUMNS => $heap->{screen_w},
LINES => 1,
BORDER => 0,
FOREGROUND => 'white',
BACKGROUND => 'blue',
DERIVED => 1,
# AUTOCENTER => 1,
TABORDER => [],
WIDGETS => $widgets,
},
);
$form->draw($curses_handler);
},
},
);
}
sub _is_visible {
my ($id, $visible_tickets, $max_width) = @_;
my $current_pos_x = 0;
foreach my $ticket (@$visible_tickets) {
$current_pos_x += length "[ $id" . ( $ticket->has_changed() ? ' *' : '' ) . ' ]';
print STDERR ("-- ticket id : " . $ticket->id() . "\n");
print STDERR ("-- id : " . $id . "\n");
print STDERR ("-- " . ($current_pos_x > $max_width) . "\n");
if ( $ticket->id() == $id ) {
print STDERR ("-- YES\n");
return (! ($current_pos_x > $max_width));
}
}
die "shouldn't reach here";
}
1;