package Kephra::ToolBar;
our $VERSION = '0.08';
use strict;
use warnings;
my %toolbar;
sub _all { \%toolbar }
sub _ref {
if (ref $_[1] eq 'Wx::ToolBar') {$toolbar{$_[0]}{ref} = $_[1]}
elsif(exists $toolbar{$_[0]}{ref}) {$toolbar{$_[0]}{ref}}
}
sub _data { $toolbar{$_[0]} if stored($_[0]) }
sub stored { 1 if ref $toolbar{$_[0]} eq 'HASH'}
sub _create_empty {
Wx::ToolBar->new( Kephra::App::Window::_ref(),
-1, [-1,-1], [-1,-1], &Wx::wxTB_HORIZONTAL|&Wx::wxTB_DOCKABLE );
}
sub create_new {
my $bar_id = shift;
my $bar_def = shift;
my $bar = _ref($bar_id);
# destroy old safely when overwrite
$bar->Destroy if defined $bar and $bar;
_ref ($bar_id, _create_empty());
create($bar_id, $bar_def);
}
sub create {
my $bar_id = shift;
my $bar_def = shift;
eval_data($bar_id, assemble_data_from_def($bar_def));
}
sub assemble_data_from_def {
my $bar_def = shift;
return unless ref $bar_def eq 'ARRAY';
my @tbds = (); # toolbar data structure
my $cmd_data;
#
for my $item_def (@$bar_def){
# undef means null string
$item_def = '' unless defined $item_def;
my %item;
# skipping commented lines
next if substr($item_def, -1) eq '#';
# recursive call for submenus
if (ref $item_def eq 'HASH'){}
# "parsing" item data
($item{type}, $item{id}, $item{size}) = split / /, $item_def;
# skip separators
if (not defined $item{type} or $item{type} eq 'separator'){
$item{type} = '';
# handle regular toolbar buttons
} elsif( substr( $item{type}, -4) eq 'item' ) {
$cmd_data = Kephra::CommandList::get_cmd_properties( $item{id} );
# skipping when command call is missing
next unless ref $cmd_data and exists $cmd_data->{call};
for ('call','enable','enable_event','state', 'state_event','label',
'help','icon'){
$item{$_} = $cmd_data->{$_} if $cmd_data->{$_}
}
#$item{type} = 'item'if not $cmd_data->{state} and $item{type} eq 'checkitem';
}
push @tbds, \%item;
}
return \@tbds;
}
sub eval_data {
my $bar_id = shift;
my $bar_data = shift;
my $bar = _ref($bar_id);
return $bar unless ref $bar_data eq 'ARRAY';
my $win = Kephra::App::Window::_ref();
my $item_kind;
my @rest_items = ();
my $bar_item_id = defined $toolbar{$bar_id}{item_id}
? $toolbar{$bar_id}{item_id}
: $Kephra::app{GUI}{masterID}++ * 100;
$toolbar{$bar_id}{item_id} = $bar_item_id;
my $respond = Kephra::API::settings()->{app}{toolbar}{responsive};
for my $item_data (@$bar_data){
if (not $item_data->{type} or $item_data->{type} eq 'separator'){
$bar->AddSeparator;
} elsif (ref $item_data->{icon} eq 'Wx::Bitmap'){
if ($item_data->{type} eq 'checkitem'){
$item_kind = &Wx::wxITEM_CHECK
} elsif ($item_data->{type} eq 'item'){
$item_kind = &Wx::wxITEM_NORMAL
} else { next }
my $item_id = $bar_item_id++;
my $tool = $bar->AddTool(
$item_id, '', $item_data->{icon}, &Wx::wxNullBitmap,
$item_kind, $item_data->{label}, $item_data->{help}
);
Wx::Event::EVT_TOOL ($win, $item_id, $item_data->{call});
if (ref $item_data->{enable} eq 'CODE' and $respond){
$tool->Enable( $item_data->{enable}() );
for my $event (split /,/, $item_data->{enable_event}){
Kephra::EventTable::add_call (
$event, $bar_id.'_tool_enable_'.$item_id, sub{
$bar->EnableTool( $item_id, $item_data->{enable}() )
}, $bar_id);
}
}
if (ref $item_data->{state} eq 'CODE'
and $item_data->{type} eq 'checkitem'){
$bar->ToggleTool( $item_id, $item_data->{state}() );
for my $event (split /,/, $item_data->{state_event}){
Kephra::EventTable::add_call (
$event, , $bar_id.'_tool_state_'.$item_id, sub{
$bar->ToggleTool( $item_id, $item_data->{state}() )
}, $bar_id );
}
}
} else {
$item_data->{pos} = $bar_item_id % 100 + @rest_items;
push @rest_items, $item_data;
}
}
$bar->Realize;
$bar->SetRows(1);
_ref($bar_id, $bar);
return \@rest_items;
}
sub destroy {
my $bar_ID = shift;
my $bar = _ref( $bar_ID );
return unless $bar;
$bar->Destroy;
Kephra::EventTable::del_own_subscriptions( $bar_ID );
}
1;
=head1 NAME
Kephra::ToolBar - general toolbar creation and handling
=head1 DESCRIPTION
=cut