]> git.proxmox.com Git - pve-installer.git/blob - Proxmox/UI.pm
buildsys: handle installing multiple executables to /usr/bin
[pve-installer.git] / Proxmox / UI.pm
1 package Proxmox::UI;
2
3 # a few simple abstractions to be a bit more general over what UI is in use, this is basically an
4 # UIĀ², a User-Interface Interface
5
6 use strict;
7 use warnings;
8
9 use Carp;
10
11 use Proxmox::Sys::File qw(file_read_all);
12
13 use Proxmox::UI::Gtk3;
14 use Proxmox::UI::StdIO;
15
16 my ($_ui, $_env) = (undef, undef);
17
18 # state belongs fully to the UI
19 # env is a reference to the return value of Proxmox::Install::ISOEnv
20 sub init_gtk {
21 my ($state, $env) = @_;
22
23 croak "overriding existing UI!" if defined($_ui);
24
25 $_ui = Proxmox::UI::Gtk3->new($state, $env);
26 $_env = $env;
27
28 return $_ui;
29 }
30 sub init_stdio {
31 my ($state, $env) = @_;
32
33 croak "overriding existing UI!" if defined($_ui);
34
35 $_ui = Proxmox::UI::StdIO->new($state, $env);
36 $_env = $env;
37
38 return $_ui;
39 }
40
41 sub get_ui {
42 return $_ui // croak "no UI initialized!";
43 }
44
45 my sub get_env {
46 return $_env // croak "env not initialized!";
47 }
48
49 sub message {
50 my ($msg) = @_;
51 get_ui()->message($msg);
52 }
53
54 sub error {
55 my ($msg) = @_;
56 get_ui()->error($msg);
57 }
58
59 sub finished {
60 my ($success, $msg) = @_;
61 get_ui()->finished(!!$success, $msg);
62 }
63
64 sub prompt {
65 my ($query) = @_;
66 return get_ui()->prompt($query);
67 }
68
69 sub display_html {
70 my ($filename, $transform) = @_;
71
72 my $env = get_env();
73 my $html_dir = "$env->{locations}->{lib}/html";
74
75 my $path;
76 if (-f "$html_dir/$env->{product}/$filename") {
77 $path = "$html_dir/$env->{product}/$filename";
78 } else {
79 $path = "$html_dir/$filename";
80 }
81
82 my $raw_html = file_read_all($path);
83
84 $raw_html = $transform->($raw_html, $env) if $transform;
85
86 $raw_html =~ s/__FULL_PRODUCT_NAME__/$env->{cfg}->{fullname}/g;
87
88 return get_ui()->display_html($raw_html, $html_dir);
89 }
90
91 sub progress {
92 my ($frac, $start, $end, $text) = @_;
93
94 my $part = $end - $start;
95 my $ratio = $start + $frac * $part;
96
97 get_ui()->progress($ratio, $text);
98
99 return $ratio;
100 }
101
102 sub process_events {
103 get_ui()->process_events();
104 }
105
106 1;