Package: debconf Severity: wishlist Tags: patch [Message already sent to debconf-devel on Alioth, but that list seems unused]
Hello, I've been using the Gnome frontend for a while. Every dialog is pleasent and usable, except the Multiselect: compared to the checked list provided by the Dialog frontend, it is rather unusable(*). So I've tweaked the Multiselect module and now the selection can be performed with a checkbox, like you do with the Dialog frontend or with gdialog/zenity applications. The attached patch (agains current SVN) contains a working implementation, succesfully tested with the invaluable 'make demo'. Best Regards, Danilo (*) For an example, try reconfiguring the locales package. -- Danilo Piazzalunga +--------------------+ PGP Key available at subkeys.pgp.net | Linux User #245762 | Fingerprint: D018 815E 8C7F 2AE2 5565 | ICQ #105550412 | 0C36 B5F6 DB20 B800 CB9F +--------------------+
Index: Debconf/Element/Gnome/Multiselect.pm =================================================================== --- Debconf/Element/Gnome/Multiselect.pm (revision 1726) +++ Debconf/Element/Gnome/Multiselect.pm (working copy) @@ -13,6 +13,13 @@ use Debconf::Encoding qw(to_Unicode); use base qw(Debconf::Element::Gnome Debconf::Element::Multiselect); +use constant FALSE => 0; +use constant TRUE => 1; + +use constant SELECTED_COLUMN => 0; +use constant CHOICES_COLUMN => 1; +use constant NUM_COLUMNS => 2; + sub init { my $this=shift; my @choices = map { to_Unicode($_) } $this->question->choices_split; @@ -27,25 +34,37 @@ $this->widget->show; $this->widget->set_policy('automatic', 'automatic'); - my $list_store = Gtk2::ListStore->new ('Glib::String'); - - my $column = Gtk2::TreeViewColumn->new_with_attributes ('Choices', - Gtk2::CellRendererText->new, - 'text', 0); + my $list_store = Gtk2::ListStore->new ('Glib::Boolean', 'Glib::String'); $this->list_view(Gtk2::TreeView->new ($list_store)); - my $list_selection = $this->list_view->get_selection (); - $list_selection->set_mode ('multiple'); $this->list_view->set_headers_visible (0); - $this->list_view->append_column ($column); + + my $renderer_toggle = Gtk2::CellRendererToggle->new; + $renderer_toggle->signal_connect (toggled => sub { + my $path_string = $_[1]; + my $model = $_[2]; + my $iter = $model->get_iter_from_string ($path_string); + $model->set ($iter, + SELECTED_COLUMN, + not $model->get ($iter, SELECTED_COLUMN)); + }, $list_store); + + $this->list_view->append_column ( + Gtk2::TreeViewColumn->new_with_attributes ('Selected', + $renderer_toggle, + 'active', SELECTED_COLUMN)); + $this->list_view->append_column ( + Gtk2::TreeViewColumn->new_with_attributes ('Choices', + Gtk2::CellRendererText->new, + 'text', CHOICES_COLUMN)); $this->list_view->show; $this->widget->add ($this->list_view); for (my $i=0; $i <= $#choices; $i++) { my $iter = $list_store->append (); - $list_store->set ($iter, 0, $choices[$i]); + $list_store->set ($iter, CHOICES_COLUMN, $choices[$i]); if ($default{$choices[$i]}) { - $list_selection->select_iter ($iter); + $list_store->set ($iter, SELECTED_COLUMN, TRUE); } } $this->addwidget($this->widget); @@ -69,7 +88,6 @@ my $this=shift; my $list_view = $this->list_view; my $list_store = $list_view->get_model (); - my $list_selection = $list_view->get_selection (); my ($ret, $val); my @vals; @@ -80,7 +98,7 @@ my $iter = $list_store->get_iter_first (); for (my $i=0; $i <= $#choices; $i++) { - if ($list_selection->iter_is_selected ($iter)) { + if ($list_store->get ($iter, SELECTED_COLUMN)) { push @vals, $choices[$i]; } $iter = $list_store->iter_next ($iter);