+my $create_basic_grid = sub {
+ my $grid = Gtk3::Grid->new();
+ $grid->set_visible(1);
+ $grid->set_column_spacing(10);
+ $grid->set_row_spacing(10);
+ $grid->set_hexpand(1);
+
+ $grid->set_margin_start(5);
+ $grid->set_margin_end(5);
+ $grid->set_margin_top(5);
+ $grid->set_margin_bottom(5);
+
+ return $grid;
+};
+
+my $create_label_widget_grid = sub {
+ my ($labeled_widgets) = @_;
+
+ my $grid = &$create_basic_grid();
+ my $row = 0;
+
+ for (my $i = 0; $i < @$labeled_widgets; $i += 2) {
+ my $widget = @$labeled_widgets[$i+1];
+ my $label = Gtk3::Label->new(@$labeled_widgets[$i]);
+ $label->set_visible(1);
+ $label->set_alignment (1, 0.5);
+ $grid->attach($label, 0, $row, 1, 1);
+ $widget->set_visible(1);
+ $grid->attach($widget, 1, $row, 1, 1);
+ $row++;
+ }
+
+ return $grid;
+};
+
+my $create_raid_disk_grid = sub {
+ my $disk_labeled_widgets = [];
+ for (my $i = 0; $i < @$hds; $i++) {
+ my $disk_selector = Gtk3::ComboBoxText->new();
+ $disk_selector->append_text("-- do not use --");
+ $disk_selector->set_active(0);
+ $disk_selector->set_visible(1);
+ foreach my $hd (@$hds) {
+ my ($disk, $devname, $size, $model) = @$hd;
+ $disk_selector->append_text(get_device_desc ($devname, $size, $model));
+ $disk_selector->{pve_disk_id} = $i;
+ $disk_selector->signal_connect (changed => sub {
+ my $w = shift;
+ my $diskid = $w->{pve_disk_id};
+ my $a = $w->get_active - 1;
+ $config_options->{"disksel${diskid}"} = ($a >= 0) ? $hds->[$a] : undef;
+ });
+ }
+
+ if ($hdopion_first_setup) {
+ $disk_selector->set_active ($i+1) if $hds->[$i];
+ } else {
+ my $hdind = 0;
+ if (my $cur_hd = $config_options->{"disksel$i"}) {
+ foreach my $hd (@$hds) {
+ if (@$hd[1] eq @$cur_hd[1]) {
+ $disk_selector->set_active($hdind+1);
+ last;
+ }
+ $hdind++;
+ }
+ }
+ }
+
+ push @$disk_labeled_widgets, "Harddisk $i", $disk_selector;
+ }
+
+ my $scrolled_window = Gtk3::ScrolledWindow->new();
+ $scrolled_window->set_hexpand(1);
+ $scrolled_window->set_propagate_natural_height(1) if @$hds > 4;
+ $scrolled_window->add(&$create_label_widget_grid($disk_labeled_widgets));
+ $scrolled_window->set_policy('never', 'automatic');
+
+ return $scrolled_window;
+# &$create_label_widget_grid($disk_labeled_widgets)
+};
+
+my $create_raid_advanced_grid = sub {
+ my $labeled_widgets = [];
+ my $spinbutton_ashift = Gtk3::SpinButton->new_with_range(9,13,1);
+ $spinbutton_ashift->set_tooltip_text("zpool ashift property (pool sector size, default 2^12)");
+ $spinbutton_ashift->signal_connect ("value-changed" => sub {
+ my $w = shift;
+ $config_options->{ashift} = $w->get_value_as_int();
+ });
+ $config_options->{ashift} = 12 if ! defined($config_options->{ashift});
+ $spinbutton_ashift->set_value($config_options->{ashift});
+ push @$labeled_widgets, "ashift";
+ push @$labeled_widgets, $spinbutton_ashift;
+
+ my $combo_compress = Gtk3::ComboBoxText->new();
+ $combo_compress->set_tooltip_text("zfs compression algorithm for rpool dataset");
+ # note: gzip / lze not allowed for bootfs vdevs
+ my $comp_opts = ["on","off","lzjb","lz4"];
+ foreach my $opt (@$comp_opts) {
+ $combo_compress->append($opt, $opt);
+ }
+ $config_options->{compress} = "on" if !defined($config_options->{compress});
+ $combo_compress->set_active_id($config_options->{compress});
+ $combo_compress->signal_connect (changed => sub {
+ my $w = shift;
+ $config_options->{compress} = $w->get_active_text();
+ });
+ push @$labeled_widgets, "compress";
+ push @$labeled_widgets, $combo_compress;
+
+ my $combo_checksum = Gtk3::ComboBoxText->new();
+ $combo_checksum->set_tooltip_text("zfs checksum algorithm for rpool dataset");
+ my $csum_opts = ["on", "off","fletcher2", "fletcher4", "sha256"];
+ foreach my $opt (@$csum_opts) {
+ $combo_checksum->append($opt, $opt);
+ }
+ $config_options->{checksum} = "on" if !($config_options->{checksum});
+ $combo_checksum->set_active_id($config_options->{checksum});
+ $combo_checksum->signal_connect (changed => sub {
+ my $w = shift;
+ $config_options->{checksum} = $w->get_active_text();
+ });
+ push @$labeled_widgets, "checksum";
+ push @$labeled_widgets, $combo_checksum;
+
+ my $spinbutton_copies = Gtk3::SpinButton->new_with_range(1,3,1);
+ $spinbutton_copies->set_tooltip_text("zfs copies property for rpool dataset (in addition to RAID redundancy!)");
+ $spinbutton_copies->signal_connect ("value-changed" => sub {
+ my $w = shift;
+ $config_options->{copies} = $w->get_value_as_int();
+ });
+ $config_options->{copies} = 1 if !defined($config_options->{copies});
+ $spinbutton_copies->set_value($config_options->{copies});
+ push @$labeled_widgets, "copies", $spinbutton_copies;
+
+ return &$create_label_widget_grid($labeled_widgets);;
+};
+