#!/usr/bin/perl use strict; use warnings; use Gtk2 '-init'; # ordentliche GUI-Klasse {package GUI; # es wird eine Abgeleitete Klasse von GTK2::Buider erzeugt. # und es werden ein paar signal hinzugefügt: # info_opend, info_closed, main_closed # diese können über signal_emit ausgelöst werden # damit verhält sich die GUI wie ein GTK2 Widget use Glib::Object::Subclass Gtk2::Builder::, signals => { info_opend => { flags => [qw/run-last/], param_types => [], }, info_closed => { flags => [qw/run-last/], param_types => [], }, main_closed => { flags => [qw/run-last/], param_types => [], }, }, properties => []; # new muss überladen werden sub new { my $class=shift; # die zu nutzendde Datei my $glade=shift; # objekt erzeugten # dazu das "new" der Elternklasse Aufrufen my $self= $class->SUPER::new(); # Datei laden return undef unless($self->add_from_file($glade)); # signale min diesem Paket verbinden # "$self" als Parameter an alle aufgerufenen Fuktionen mitgeben # das macht das Handhaben der Funktionen einfacher. # Sie verhalten sich damit fast wie Metoden des Objekts $self->connect_signals($self); # alles anzeigen $self->do_show(); # objekt zurück return $self; } # Wichtige Widgets sub GUI { return $_[0]; } sub main {return $_[0]->get_object('mainwin'); } sub info {return $_[0]->get_object('info_dialog'); } #---------------- # Kommandos #---------------- # alles Anzeigen sub do_show{ $_[0]->main()->show_all(); } # Main-Loop starten sub do_run { Gtk2->main; } # Main-Loop stoppen sub do_exit { Gtk2->main_quit; } # Hauptfenster verstecken sub do_hide_main { $_[0]->main->hide(); } # Hauptfenster zeigen sub do_show_main { $_[0]->main->show(); } #----------------- # Signale #----------------- # das Infofenster öffnen sub on_info_open { # siehe oben bei "connect_signals" my $self=pop; # info Fenster holen my $info=$self->info(); # signal aussenden $self->signal_emit('info_opend'); # hier das wichtige. # "GtkAboutDialog" kann nur mit einem eigenen loop laufen! # infofenster starten # run erzeugt einen eigegen Loop $info->run(); # fenster schließen # keine "destroy" verwenden! $info->hide(); # signal senden $self->signal_emit('info_closed'); } # hauptfender wird geschlossen sub on_main_close { my $self=pop; $self->main()->destroy(); $self->signal_emit('main_closed'); } 1;} # Das Hauptprgramm package main; # GUI Laden my $gui=GUI->new('info.glade'); die('no gui') unless($gui); # Signale Verbinden $gui->signal_connect('info_opend' => sub{ print "Info Dialog opend\n"; $gui->do_hide_main(); }); $gui->signal_connect('info_closed' => sub{ print "Info Dialog closed\n"; $gui->do_show_main(); }); $gui->signal_connect('main_closed' => sub{ print "Main Win closed\n"; $gui->do_exit(); }); # GUI Starten $gui->do_run(); exit();