Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Wx::Perl::Smart

675 views

Published on

Vorstellung von Helfermodulen zu einfacheren ezwugung einer WxPerl GUI : https://bitbucket.org/lichtkind/wx-perl-smart

Published in: Software, Technology
  • Be the first to comment

  • Be the first to like this

Wx::Perl::Smart

  1. 1. Wx::Perl::SmartWx::Perl::Smart Schneller Bessere GUI's
  2. 2. Wx::Perl::Wx::Perl::SmartSmart
  3. 3. Wx::Perl::Wx::Perl::SmartSmart ~~
  4. 4. Wx::Perl::Wx::Perl::SmartSmart ~~
  5. 5. Wx::Perl::Wx::Perl::SmartSmart $var ~~ @list
  6. 6. Wx::Perl::Smart sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  7. 7. Harmonogra ph sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  8. 8. Harmonogra ph sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  9. 9. Harmonogra ph sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  10. 10. Harmonogra ph sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  11. 11. Wx::Perl::Smart sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  12. 12. Wx::Perl::Smart sub OnInit { my $app = shift; # load localisation texts in chosen language my ($v, $dir, $f) = File::Spec->splitpath(__FILE__); $l18n_file = File::Spec->catfile($dir, $l18n_file) if $dir; die "localisation file $l18n_file is missing!" unless -e $l18n_file; my %l18n = %{YAML::Tiny->read( $l18n_file )->[0]{$language}}; $app->{'l18n'} = %l18n; # loading the numbers of the remembered favorites $app->{'favorites'} = -e $fav_file ? YAML::Tiny->read( $fav_file ) : YAML::Tiny->new; my @remembered_pic_names = ref $app->{'favorites'}->[0] eq 'HASH' ? keys $app->{'favorites'}->[0] : (); # making UI my $frame = $app->{'frame'} = Wx::Perl::Smart::Frame->new(__PACKAGE__." $VERSION", 'fixed_size'); $frame->SubscribeStrings( $app->{'l18n'} ); my $remember= sub { $frame->SetValues( $app->{'favorites'}[0]{ $_[0]->GetValue() } ); $app->Repaint()}; my $repaint = sub { $app->Repaint() }; my $boardsize = Wx::GetDisplaySize()->GetHeight() - 250; my $origin_offset = $app->{'origin_offset'} = $boardsize / 2; my $max_amp = $app->{'max_amp'} = $origin_offset - 10; # max amplitude my %range_defaults = (# label, min, max, init frequency_x => ['X', 1, 1, 30], frequency_y => ['Y', 1, 1, 30], amplitude_x => ['X', 0, 0, 360], amplitude_y => ['Y', 0, 0, 360], rotation => [$l18n{'amount'}, 1, 0, 30], friction => [$l18n{'friction'}, 0, 0, 200], length => [$l18n{'length'}, 12, 1, 100], density => [$l18n{'density'},100, 1, 100], thickness => [$l18n{'thickness'},1, 1, 12], zoom => [$l18n{'zoom'}, 0,-10, 10], start_colour=> [$l18n{'start'}, 0, 0,1500], flow_colour => [$l18n{'flow'}, 0, 0, 60], scale_colour=> [$l18n{'scale'}, 1, 1, 4], ); $frame->SubscribeWidgets ({$_ => Wx::Perl::DisplaySlider->new($frame, @{$range_defaults{$_}}, $repaint)}) for keys %range_defaults; $frame->SubscribeWidgets({ drawboard => Wx::Perl::DrawMap->new($frame, $boardsize), fav_select => [-ComboBox => @remembered_pic_names, 0, -1, $remember], format_select=> [-ComboBox => [qw(PNG JPG TIFF BMP XPM)], 0, 70 ], save => [-Button => '~save', sub {$app->Save() }], save_all => [-Button => '~all', sub {$app->SaveAll() }], remember => [-Button => '~remember', sub {$app->Remember()}], forget => [-Button => '~forget', sub {$app->Forget() }], no_phase => [-Button => '~no', sub {$frame->SetValues(amplitude_x => 0, amplitude_y => 0);$app->Repaint()}], closed_phase => [-Button => '~closed', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 90);$app->Repaint()}], open_phase => [-Button => '~open', sub {$frame->SetValues(amplitude_x => 90, amplitude_y => 180);$app->Repaint()}], y_invers => [-CheckBox => '~y_inverse', 0, $repaint], rotation_dir => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(no left right)}], 0, &Wx::wxHORIZONTAL, $repaint), app_mode => Wx::Perl::RadioGroup->new($frame, [@l18n{qw(lateral rotary free)}], 0, &Wx::wxHORIZONTAL, sub{}), }); $frame->SetSmartLayout( {flags => &Wx::wxGROW|&Wx::wxALL}, [ # left part '<drawboard>', 10, {border => 10, flags => &Wx::wxALL|&Wx::wxGROW}, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10, '<remember>'], ],[ # right half -TabbedBox => [ '~oscillators' =>[ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, ['~mode :', '<app_mode>'], -LabeledBox =>['~frequency' =>[qw( <frequency_x> <frequency_y>)]], #<y_invers> -LabeledBox =>['~start_amp' =>[qw( <amplitude_x> <amplitude_y>), {border => 5, flags => &Wx::wxALL|&Wx::wxGROW}, ['~phase :', 1, '<no_phase>', 1,'<closed_phase>', 1, '<open_phase>'], ]], -LabeledBox =>[ '~rotation ' =>[qw( <rotation_dir> <rotation> )]], {border => 10}, '<friction>', ], '~visuals' => [ {border => 5, flags => &Wx::wxGROW|&Wx::wxALL}, -LabeledBox =>['~line' =>[qw( <length> <density> )]], #<thickness> -LabeledBox =>['~color' =>[qw( <start_colour> <flow_colour> <scale_colour>)]], {border => 10},'<zoom>', ], ], ]); $frame->ResetValues(); $app->Repaint(); $app->SetTopWindow($frame); 1;
  13. 13. Wx::Perl::Smart Wx::Perl::Smart::Frame Wx::Perl::Smart::Dialog Wx::Perl::Smart::Panel Wx::Perl::Smart::Sizer Wx::Perl::Smart::WidgetFactory
  14. 14. Nucleus Wx::Perl::Smart::Panel Wx::Perl::Smart::Sizer
  15. 15. aus Kephra Kephra::App::Panel Kephra::App::Sizer
  16. 16. KephraXP
  17. 17. K. GUI Libs Kephra::App::Editor Kephra::App::Dialog Kephra::App::DocBar Kephra::App::Focus Kephra::App::Panel Kephra::App::Sizer Kephra::App::Splitter Kephra::App::Window Kephra::App::Util
  18. 18. 'kleine Projekte' App::Harmonograph App::Spirograph Trigon Fraktalzeichner Games:Sudoku::Algosolver
  19. 19. Wx::Perl::Smart In 5 Schritten zur Intelligenz
  20. 20. Wx::Perl::Smart Widgets Komposition Abstraktion
  21. 21. Das sind nur 3 Widgets Komposition Abstraktion
  22. 22. Jetzt sind es 5 Wid gets Komposition Abstr aktion
  23. 23. Wx::Perl::Smart Wid gets Komposition Abstr aktion
  24. 24. Nummer 1 einfach & sichere Widgeterzeugung
  25. 25. Nummer 2 mächtige Widgets
  26. 26. Wx::Perl::* mächtige Widgets
  27. 27. Nummer 3 leicht änderbar, kompakte Komposition
  28. 28. Nummer 4 Trennung von Daten & Layout
  29. 29. Nummer 5 MVC – GUI Layer
  30. 30. GUI Comp. Lang. MVC – GUI Layer
  31. 31. Wx::Perl::Smart Wid gets Komposition Abstr aktion
  32. 32. Schritt 1 Einzelne Widgets
  33. 33. Einzelne Widgets Wx::Button
  34. 34. Wx::Button-> new(..., ..., ...) Erzeugen
  35. 35. $parent $frame ID -1 $label wxEmptyString, wxPoint wxDefaultPosition, [-1,-1] wxSize& size = wxDefaultSize, [-1,-1] style 0, wxValidator, wxString $name New Parameter
  36. 36. $button = Wx::Button->new( $parent, -1, 'label', [-1,-1], [30,-1]); Wx::Event::EVT_BUTTON ($frame, $button, &callback); Button Erzeugen
  37. 37. Wx::Perl::Button ($parent, 'label', &callback, 30); Smart Button
  38. 38. Wx::Perl::Button ($parent, 'label', &callback, 30); # required , opt Smart Button
  39. 39. wxWindow* parent, wxWindowID id, wxString& value, wxPoint& pos, wxSize& size, long style, wxValidator& (validator), wxString& name, Textc. Parameter
  40. 40. $txt = Wx::TextCtrl->new( $parent, -1, 'content', [-1,-1], [30,-1], &Wx::wxTE_MULTILINE Wx::Perl::TextValidator->new (qr//)); Wx::Event::EVT_KEY_DOWN ($txt, -1, &callback); Wx::Event::EVT_TEXT ($frame, $txt, &callback); TextCtrlErzeugen
  41. 41. $txt = Wx::Perl::TextEdit->new( $pa,'content',&callback,qr/.../,[30,-1]); Smart TextEdit
  42. 42. $txt = Wx::Perl::TextEdit->new( $pa,'content',&callback,qr/.../,[30,-1]); # required ,opt Smart TextEdit
  43. 43. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als Code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  44. 44. weglassen was nicht wichtig ist Einzelne Widgets
  45. 45. weglassen was nicht wichtig ist Perl hat besseres ObjRef statt WxID | WidgetName Einzelne Widgets
  46. 46. weglassen was nicht wichtig ist Weil du es nicht kontrollieren willst Position und Größe regeln Sizer Einzelne Widgets
  47. 47. weglassen was nicht wichtig ist Weil es Probleme macht auf undef gesetzte parents Einzelne Widgets
  48. 48. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre callbacks (coderef) Einzelne Widgets
  49. 49. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre callbacks (coderef) & zus. styles Einzelne Widgets
  50. 50. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als Code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  51. 51. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als Code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  52. 52. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  53. 53. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  54. 54. weglassen was nicht wichtig ist nimmt hinzu was wichtig wäre optional auch mit benannten Param. Def als code oder String (compilien) alles normalen Widgets (Moose) Wx::Perl::Button ... kommt vielleicht Einzelne Widgets
  55. 55. Wx::Perl::Button ($parent, 'label', &callback, 30); neues Modul für den einen Aufruf Softwarearchitektur: factory method Smart Button ?
  56. 56. Wx::Perl::Button ($parent, 'label', &callback, 30); neues Modul für den einen Aufruf Softwarearchitektur: factory method Smart Button ?
  57. 57. @widgets = factory method([ [-Button => 'label', &callback, 30], … ]); Smart Factory
  58. 58. @widgets = $factory->MakeWidget([ [-Button => 'label', &callback, 30], {widget => 'Button', label =>'...', }, ]); Benannte Param.
  59. 59. $factory = Wx::Perl::Smart:: WidgetFactory->new($parent); Kürzt Aufruf
  60. 60. $factory = Wx::Perl::Smart:: WidgetFactory->new($parent); Wx::Perl::Smart::WidgetFactory-> MakeWidget([ …. Und vermeidet
  61. 61. im Sinne einer Factory Method erzeugt normale Widgets & weitere Smart Factory
  62. 62. Schritt 2 Zusammen- gesetzte Widgets
  63. 63. Zusam. Widgets RadioButtons TextSliders
  64. 64. Zusam. Widgets sammle mehrere Einzelwidgets und deren Daten & Event- handling in ein Widget einfacherer Umgang, Layout wird übersichtlicher
  65. 65. Schritt 3 Komposition
  66. 66. Komposition Wx::Perl::Smart::Util Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame Wx::Perl::Smart::Dialog
  67. 67. Komposition Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame
  68. 68. :WidgetFactory einfache, robuste Erzeugung in Tabellenanordnung Trennung vom GUI-Layout keine Daten ins Layout strukturierte Programme
  69. 69. :WidgetFactory einfache, robuste Erzeugung in Tabellenanordnung Trennung vom GUI-Layout keine Daten ins Layout strukturierte Programme
  70. 70. Komposition Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame
  71. 71. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  72. 72. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  73. 73. ::Smart::Sizer einfache und robuste Erzeugung $sizer = Wx::Perl::Smart::Sizer- >new([$widget, $widget, ...]);
  74. 74. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  75. 75. ::Smart::Sizer Erzeugung von Deko-Widgets $sizer = Wx::Perl::Smart::Sizer- >new([$widget, '---', $widget, ...]);
  76. 76. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  77. 77. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  78. 78. ::Smart::Sizer $sizer = Wx::Perl::Smart::Sizer- >new(-TabbedBox => [ [$widget, ...], [...]]); mehr Abstraktion (tabs = Sizer)
  79. 79. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  80. 80. ::Smart::Sizer einfache und robuste Erzeugung Erzeugung von Deko-Widgets Kommentare mehr Abstraktion (tabs = Sizer) einfache und effektive Benutzung
  81. 81. Komposition Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame
  82. 82. ::Smart::Panel Panel mit Smart::Sizer
  83. 83. ::Smart::Panel Panel mit Smart::Sizer $panel = Wx::Perl::Smart::Panel- >new([$widget, $widget, ...]);
  84. 84. ::Smart::Panel Panel mit Smart::Sizer Sichbarkeit und Verwandschaft wird automatisch geregelt
  85. 85. Komposition Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame
  86. 86. ::Smart::Frame Hauptenster einer App noch eine Abstraktion vereinfachter Zugriff auf Panel, Sizer und WidgetFactory verwaltet auch Widgets und Localisationstrings
  87. 87. Widgets mit ID $frame->MakeWidgets({ drawboard => Wx::Perl::Draw... fav_select => [-ComboBox => ..]
  88. 88. def Layout $frame->EvalSmartLayout ( {flags => &Wx::wxGROW|&Wx::wxALL}, [ '<drawboard>', 10, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10,...],
  89. 89. ohne Ränder $frame->EvalSmartLayout ( [ '<drawboard>', '<fav_select>', ['<format_select>', '<save>', '<save_all>', 1, '<forget>', ...],
  90. 90. Panel mit ID $frame->EvalSmartPanel ( 'my_panel' => [ '<drawboard>', 10, '<fav_select>', ['<format_select>', 10,'<save>', 10, '<save_all>', 1, '<forget>', 10,...],
  91. 91. NutzewieWidget $frame->EvalSmartLayout ( [ '<my_panel>', '<fav_select>', ['<format_select>', '<save>', '<save_all>', 1, '<forget>', ...],
  92. 92. Smart>GUIDesigner
  93. 93. ''can't touch this'
  94. 94. Smart>GUIDesigner Designercode darf nicht berührt werden
  95. 95. Smart>GUIDesigner Brauch mehrere Programme / Formate
  96. 96. Smart>GUIDesigner Smart ist schneller effektiver als GUI
  97. 97. Smart>GUIDesigner Smart ist schneller effektiver als GUI änder Abstandsklassen
  98. 98. Smart>GUIDesigner Smart ist schneller effektiver als GUI denk in Proportionen
  99. 99. Komponenten Wx::Perl::Smart::Util Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame Wx::Perl::Smart::Dialog
  100. 100. Gen Comp Abstr Wx::Perl::Smart::Util Wx::Perl::* Wx::Perl::Smart::WidgetFactory Wx::Perl::Smart::Sizer Wx::Perl::Smart::Panel Wx::Perl::Smart::Frame Wx::Perl::Smart::Dialog
  101. 101. Zukunft Templates Schablonen Werte Events
  102. 102. Schritt 5 Abstraktion
  103. 103. GCL GUI Composition Lang
  104. 104. Abstraktion Wikiformat für's layout (oft besser als GUI designer) kompiliert zu Datenstruktur (jedes Format funktioniert) kompiliert zu GUI andere Backends denkbar (GCL::Prima, GCL::GTK)
  105. 105. Abstraktion Wikiformat für's layout (oft besser als GUI designer) kompiliert zu Datenstruktur (jedes Format funktioniert) kompiliert zu GUI andere Backends denkbar (GCL::Prima, GCL::GTK)
  106. 106. Abstraktion Wikiformat für's layout (oft besser als GUI designer) kompiliert zu Datenstruktur (jedes Format funktioniert) kompiliert zu GUI andere Backends denkbar (GCL::Prima, GCL::GTK)
  107. 107. Abstraktion Wikiformat für's layout (oft besser als GUI designer) kompiliert zu Datenstruktur (jedes Format funktioniert) kompiliert zu GUI andere Backends denkbar (GCL::Prima, GCL::GTK)
  108. 108. Danke

×