App-GUI-Juliagraph

 view release on metacpan or  search on metacpan

lib/App/GUI/Juliagraph/Frame.pm  view on Meta::CPAN

use v5.12;
use warnings;
use utf8;
use Wx::AUI;

package App::GUI::Juliagraph::Frame;
use base qw/Wx::Frame/;
use App::GUI::Juliagraph::Config;
use App::GUI::Juliagraph::Settings;
use App::GUI::Juliagraph::Dialog::About;
use App::GUI::Juliagraph::Frame::Tab::Constraints;
use App::GUI::Juliagraph::Frame::Tab::Polynomial;
use App::GUI::Juliagraph::Frame::Tab::Mapping;
use App::GUI::Juliagraph::Frame::Tab::Color;
use App::GUI::Juliagraph::Frame::Panel::Board;
use App::GUI::Juliagraph::Widget::ProgressBar;

sub new {
    my ( $class, $parent, $title ) = @_;
    my $self = $class->SUPER::new( $parent, -1, $title );
    $self->SetIcon( Wx::GetWxPerlIcon() );
    $self->CreateStatusBar( 2 );
    $self->SetStatusWidths( 2, 600, 500 );
    $self->SetStatusText( "no file loaded", 1 );
    $self->{'config'} = App::GUI::Juliagraph::Config->new();
    $self->{'title'} = $title;
    Wx::ToolTip::Enable( $self->{'config'}->get_value('tips') );
    Wx::InitAllImageHandlers();

    # create GUI parts
    $self->{'tabs'}            = Wx::AuiNotebook->new($self, -1, [-1,-1], [-1,-1], &Wx::wxAUI_NB_TOP );
    $self->{'tab'}{'constraint'}  = App::GUI::Juliagraph::Frame::Tab::Constraints->new( $self->{'tabs'} );
    $self->{'tab'}{'monomial'}    = App::GUI::Juliagraph::Frame::Tab::Polynomial->new( $self->{'tabs'} );
    $self->{'tab'}{'mapping'}     = App::GUI::Juliagraph::Frame::Tab::Mapping->new( $self->{'tabs'} );
    $self->{'tab'}{'color'}       = App::GUI::Juliagraph::Frame::Tab::Color->new( $self->{'tabs'}, $self->{'config'}, 11 );
    $self->{'tabs'}->AddPage( $self->{'tab'}{'constraint'}, 'Constraints');
    $self->{'tabs'}->AddPage( $self->{'tab'}{'monomial'},   'Monomials');
    $self->{'tabs'}->AddPage( $self->{'tab'}{'mapping'},    'Color Mapping');
    $self->{'tabs'}->AddPage( $self->{'tab'}{'color'},      'Colors');
    $self->{'tab'}{'constraint'}->connect_polynome_tab( $self->{'tab'}{'monomial'} );
    $self->{'tab'}{'constraint'}->connect_mapping_tab( $self->{'tab'}{'mapping'} );
    $self->{'tab'}{'mapping'}->connect_color_tab( $self->{'tab'}{'color'} );

    $self->{'tab_names'} = [keys %{ $self->{'tab'} }];
    $self->{'tab'}{$_}->SetCallBack( sub { $self->sketch( ) } ) for @{$self->{'tab_names'}};

    $self->{'dialog'}{'about'}     = App::GUI::Juliagraph::Dialog::About->new();
    $self->{'progress_bar'}        = App::GUI::Juliagraph::Widget::ProgressBar->new( $self, 430, 5, [20, 20, 110]);
    $self->{'board'}               = App::GUI::Juliagraph::Frame::Panel::Board->new( $self , 600, 600 );
    $self->{'board'}->connect_constrains_tab( $self->{'tab'}{'constraint'} );
    App::GUI::Juliagraph::Compute::Image::add_progress_bar('pen', $self->{'progress_bar'});
    App::GUI::Juliagraph::Compute::Image::add_progress_bar('preview', $self->{'tab'}{'mapping'}{'color_rainbow'});
    App::GUI::Juliagraph::Compute::Image::add_progress_bar('background', $self->{'tab'}{'mapping'}{'background_rainbow'});

    my $btnw = 50; my $btnh     = 40;# button width and height
    $self->{'btn'}{'draw'}      = Wx::Button->new( $self, -1, '&Draw', [-1,-1],[$btnw, $btnh] );
    $self->{'btn'}{'draw'}->SetToolTip('redraw the harmonographic image');

    Wx::Event::EVT_BUTTON(     $self, $self->{'btn'}{'draw'},  sub { draw( $self ) });
    Wx::Event::EVT_CLOSE(      $self, sub {
        $self->{'tab'}{'color'}->update_config();
        $self->{'config'}->save();
        $self->{'dialog'}{about}->Destroy();
        $_[1]->Skip(1)
    });

    # GUI layout assembly
    my $settings_menu = $self->{'setting_menu'} = Wx::Menu->new();
    $settings_menu->Append( 11100, "&Init\tCtrl+I", "put all settings to default" );
    $settings_menu->Append( 11200, "&Open\tCtrl+O", "load settings from an INI file" );
    $settings_menu->Append( 11400, "&Write\tCtrl+W", "store curent settings into an INI file" );
    $settings_menu->AppendSeparator();
    $settings_menu->Append( 11500, "&Quit\tAlt+Q", "save configs and close program" );


    my $image_size_menu = Wx::Menu->new();
    for (1 .. 20) {
        my $size = $_ * 100;
        $image_size_menu->AppendRadioItem(12100 + $_, $size, "set image size to $size x $size");
        Wx::Event::EVT_MENU( $self, 12100 + $_, sub {
            my $size = 100 * ($_[1]->GetId - 12100);
            $self->{'config'}->set_value('image_size', $size);
            $self->{'board'}->set_size( $size );
        });

    }
    $image_size_menu->Check( 12100 +($self->{'config'}->get_value('image_size') / 100), 1);

    my $image_format_menu = Wx::Menu->new();
    $image_format_menu->AppendRadioItem(12201, 'PNG', "set default image format to PNG");
    $image_format_menu->AppendRadioItem(12202, 'JPEG', "set default image format to JPEG");
    $image_format_menu->AppendRadioItem(12203, 'SVG', "set default image format to SVG");

    Wx::Event::EVT_MENU( $self, 12201, sub { $self->{'config'}->set_value('file_base_ending', 'png') });
    Wx::Event::EVT_MENU( $self, 12202, sub { $self->{'config'}->set_value('file_base_ending', 'jpg') });
    Wx::Event::EVT_MENU( $self, 12203, sub { $self->{'config'}->set_value('file_base_ending', 'svg') });

    $image_format_menu->Check( 12201, 1 ) if $self->{'config'}->get_value('file_base_ending') eq 'png';
    $image_format_menu->Check( 12202, 1 ) if $self->{'config'}->get_value('file_base_ending') eq 'jpg';
    $image_format_menu->Check( 12203, 1 ) if $self->{'config'}->get_value('file_base_ending') eq 'svg';

    my $image_menu = Wx::Menu->new();
    $image_menu->Append( 12300, "&Draw\tCtrl+D", "complete a sketch drawing" );
    $image_menu->Append( 12100, "S&ize",  $image_size_menu,   "set image size" );
    $image_menu->Append( 12200, "&Format",  $image_format_menu, "set default image formate" );
    $image_menu->Append( 12400, "&Save\tCtrl+S", "save currently displayed image" );

    my $help_menu = Wx::Menu->new();
    $help_menu->Append( 13300, "&About\tAlt+A", "Dialog with general information about the program" );

    my $menu_bar = Wx::MenuBar->new();
    $menu_bar->Append( $settings_menu, '&Settings' );
    $menu_bar->Append( $image_menu,    '&Image' );



( run in 0.687 second using v1.01-cache-2.11-cpan-f56aa216473 )