CatalystX-Restarter-GTK

 view release on metacpan or  search on metacpan

lib/CatalystX/Restarter/GTK.pm  view on Meta::CPAN


        try {
            $self->start_sub->();
        }
        catch {
            STDERR->print($_);
            exit 1;
        };
    }
}

sub _kill_child {
    my $self = shift;

    if ($self->_child) {
        kill 'INT', $self->_child;
        waitpid($self->_child, 0);
        $self->_child(0);
        $self->notify_win('stopped');
    }
}

__PACKAGE__->meta->make_immutable;

no Moose;

#---    Class WinMonitor for GUI   ---

package WinMonitor;
use strict;
use warnings;
use Gtk2;
use Glib qw(TRUE FALSE);
use Carp;

my $path = __FILE__;
$path =~ s/[^\/]+$//;

my %status_msg = (
    starting    => { msg => 'Starting', color => Gtk2::Gdk::Color->new(0, 0, 0x55 * 257) },
    started     => { msg => 'Started',  color => Gtk2::Gdk::Color->new(0, 0x55 * 257, 0) },
    stopped     => { msg => 'Stopped',  color => Gtk2::Gdk::Color->new(0x55 * 257, 0, 0) },
);

$status_msg{$_}->{icon} = $path.$_.'.png' foreach (keys %status_msg);

sub new {
    my ($class, $app_name) = @_;

    my $obj = {};

    my $win = Gtk2::Window->new('toplevel');

    $win->set_title($app_name);
    $win->set_keep_above(1);

    $win->set_position('center');

    my $status  = Gtk2::Label->new;

    my $menu_bar = Gtk2::MenuBar->new;
    my $view = Gtk2::MenuItem->new('_View');
    my $mview = Gtk2::Menu->new;

    my $console = Gtk2::MenuItem->new('Console');
    $console->signal_connect('activate', sub { $obj->show_msg; });

    $mview->append($console);
    $view->set_submenu($mview);

    my $restart = Gtk2::MenuItem->new('Restart');
    my $mrestart = Gtk2::Menu->new;
    $mrestart->append($restart);

    my $tools = Gtk2::MenuItem->new('_Tools');
    $tools->set_submenu($mrestart);

    $menu_bar->append($view);
    $menu_bar->append($tools);
    $menu_bar->set_size_request(-1, 22);

    my $vbox = Gtk2::VBox->new(FALSE, 0);
    $vbox->pack_start($menu_bar, FALSE, FALSE, 0);

    my $hbox = Gtk2::HBox->new(TRUE, 0);
    $hbox->pack_start(Gtk2::Label->new($app_name.' Server'), TRUE, TRUE, 3);

    $vbox->pack_start($hbox, TRUE, FALSE, 3);
    $vbox->pack_start($status, TRUE, FALSE, 3);

    $win->add($vbox);

    $win->signal_connect(delete_event => sub { Gtk2->main_quit; });
    $win->signal_connect('window-state-event' => sub {        
        if (shift(@{$_[1]->new_window_state}) eq 'iconified' && $obj->{trayicon}->is_embedded) {
            $win->hide;
        }
    });
    
    $win->show_all;
    my $buffer = Gtk2::TextBuffer->new;
    #-- Create tray icon and menu
    my $trayicon = Gtk2::StatusIcon->new_from_file($status_msg{stopped}->{icon});
    $trayicon->set_visible(TRUE);
    
    my $traymenu = Gtk2::Menu->new;
    my $tray_mconsole = Gtk2::MenuItem->new('View Console');
    $tray_mconsole->signal_connect('activate' => sub { $console->activate; });
    
    my $tray_mrestart = Gtk2::MenuItem->new('Restart');
    $tray_mrestart->signal_connect('activate' => sub { $restart->activate; });
        
    my $mexit = Gtk2::MenuItem->new('Exit');
    $mexit->signal_connect('activate' => sub { Gtk2->main_quit; });
    
    $traymenu->append($tray_mconsole);
    $traymenu->append($tray_mrestart);
    $traymenu->append(Gtk2::SeparatorMenuItem->new);
    $traymenu->append($mexit);
    
    $trayicon->signal_connect('popup-menu', sub {
        my ($ticon, $button, $time) = @_;
        my ($x, $y, $push) = Gtk2::StatusIcon::position_menu($traymenu, $ticon);
        $traymenu->show_all;
        $traymenu->popup(undef, undef, sub {($x, $y,$push)}, undef, $button, $time);
    });
    
    $obj = { %$obj, win => $win, trayicon => $trayicon, msg_buffer => $buffer, app_name => $app_name, lbstatus => $status, bt_restart => $restart, bt_console => $console };

    bless $obj, $class;
}

# Updates status message on window
sub set_status {

    my ($self, $st) = @_;

    my $msg = $status_msg{$st};

    $self->{lbstatus}->set_text($msg->{msg});
    $self->{lbstatus}->modify_fg('normal', $msg->{color});

    $self->{win}->set_title($self->{app_name}.'-'.$msg->{msg});
    $self->{trayicon}->set_from_file($msg->{icon});
    $self->{trayicon}->set_tooltip($self->{app_name}.' ('.$msg->{msg}.')');

}

# Collects console output received into text buffer
sub append_msg {
    my ($self, $msg) = @_;
    my $buffer = $self->{msg_buffer};
    $buffer->insert($buffer->get_end_iter, $msg);
}

sub get_msg_window {
    my ($self) = @_;

    my $win = Gtk2::Window->new;
    $win->set_title($self->{app_name}.' - console output');

    $win->set_position('center');
    $win->signal_connect('delete_event' => sub { $win->hide; 1; });

    my $textview = Gtk2::TextView->new_with_buffer($self->{msg_buffer});
    $textview->set_editable(FALSE);
    $textview->set_wrap_mode('word');

    
    my $text_desc = Pango::FontDescription->new;
    $text_desc->set_family('Monospace');
    $textview->modify_font($text_desc);

    my $scrolled_win = Gtk2::ScrolledWindow->new;
    $scrolled_win->add($textview);

    $win->add($scrolled_win);
    $win->set_default_size(800, 400);



( run in 1.650 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )