diff --git a/Proxmox/Makefile b/Proxmox/Makefile index ccae0d3..8bae031 100644 --- a/Proxmox/Makefile +++ b/Proxmox/Makefile @@ -13,6 +13,10 @@ PERL_MODULES=\ Sys/Command.pm \ Sys/File.pm \ Sys/Net.pm \ + UI.pm \ + UI/Base.pm \ + UI/Gtk3.pm \ + UI/StdIO.pm \ .PHONY: install install: $(PERL_MODULES) diff --git a/Proxmox/UI.pm b/Proxmox/UI.pm new file mode 100644 index 0000000..3f502f9 --- /dev/null +++ b/Proxmox/UI.pm @@ -0,0 +1,56 @@ +package Proxmox::UI; + +# a few simple abstractions to be a bit more general over what UI is in use, this is basically an +# UI², a User-Interface Interface + +use strict; +use warnings; + +use Carp; + +use Proxmox::UI::Gtk3; +use Proxmox::UI::StdIO; + +my $ui = undef; + +sub init_gtk { + my ($state) = @_; + + croak "overriding existing UI!" if defined($ui); + + $ui = Proxmox::UI::Gtk3->new($state); + + return $ui; +} +sub init_stdio { + my ($state) = @_; + + croak "overriding existing UI!" if defined($ui); + + $ui = Proxmox::UI::StdIO->new($state); + + return $ui; +} + +sub get_ui { + return $ui // croak "no UI initialized!"; +} + +sub message { + my ($msg) = @_; + get_ui()->message($msg); +} + +sub error { + my ($msg) = @_; + get_ui()->error($msg); +} + +sub prompt { + my ($query) = @_; + return get_ui()->prompt($query); +} + +} + +1; diff --git a/Proxmox/UI/Base.pm b/Proxmox/UI/Base.pm new file mode 100644 index 0000000..19fd46c --- /dev/null +++ b/Proxmox/UI/Base.pm @@ -0,0 +1,36 @@ +package Proxmox::UI::Base; + +use strict; +use warnings; + +use Carp; + +sub new { + my ($this, $state) = @_; + + my $class = ref($this) || $this; + + my $self = bless { state => $state }, $class; + + return $self; +} + +sub message { + my ($self, $msg) = @_; + + croak "implement me in sub-class"; +} + +sub error { + my ($self, $msg) = @_; + + croak "implement me in sub-class"; +} + +sub prompt { + my ($self, $query) = @_; + + croak "implement me in sub-class"; +} + +1; diff --git a/Proxmox/UI/Gtk3.pm b/Proxmox/UI/Gtk3.pm new file mode 100644 index 0000000..cf8334b --- /dev/null +++ b/Proxmox/UI/Gtk3.pm @@ -0,0 +1,39 @@ +package Proxmox::UI::Gtk3; + +use strict; +use warnings; + +use Gtk3; + +use base qw(Proxmox::UI::Base); + +sub message { + my ($self, $msg) = @_; + + my $window = $self->{state}->{window}; + my $dialog = Gtk3::MessageDialog->new($window, 'modal', 'info', 'ok', $msg); + $dialog->run(); + $dialog->destroy(); +} + +sub error { + my ($self, $msg) = @_; + + my $window = $self->{state}->{window}; + my $dialog = Gtk3::MessageDialog->new($window, 'modal', 'error', 'ok', $msg); + $dialog->run(); + $dialog->destroy(); +} + +sub prompt { + my ($self, $query) = @_; + + my $window = $self->{state}->{window}; + my $dialog = Gtk3::MessageDialog->new($window, 'modal', 'question', 'ok-cancel', $query); + my $response = $dialog->run(); + $dialog->destroy(); + + return ($response // '') eq 'ok'; +} + +1; diff --git a/Proxmox/UI/StdIO.pm b/Proxmox/UI/StdIO.pm new file mode 100644 index 0000000..ba8ca6a --- /dev/null +++ b/Proxmox/UI/StdIO.pm @@ -0,0 +1,32 @@ +package Proxmox::UI::StdIO; + +use strict; +use warnings; + +use base qw(Proxmox::UI::Base); + +sub message { + my ($self, $msg) = @_; + + print STDOUT "message: $msg\n"; +} + +sub error { + my ($self, $msg) = @_; + + print STDOUT "error: $msg\n"; +} + +sub prompt { + my ($self, $query) = @_; + + print STDOUT "prompt: $query\n"; + + my $response = // ''; # FIXME: error handling? + + chomp($response); + + return lc($response) eq 'ok'; +} + +1;