Thanks. This is exactly what I was looking for! I didn't realize that a combobox can be attached to a model, and that a model can be filtered.
Imo multiple partial string match should be default behavior, which it is unfortunately not. E.g. inkscape only matches in the beginning of the string. Is there a GNOME guide line about this? Regards, Dov On Thu, Jul 26, 2018 at 8:38 PM Reuben Rissler <sil...@emypeople.net> wrote: > On 07/26/2018 07:36 AM, Dov Grobgeld via gtk-devel-list wrote: > > Is there a widget that combines a searchbox with a combobox? > > A use case would be to search for a fontname in a very long font list. > > I would like to be able to type a search string, and have the opened > combobox display only entries that match the typed string. A plus would be > if it is possible to change how matches take place, e.g. between multiple > word (like helm-mode in emacs), a regular expression, or an absolute match. > > Has someone written anything like that? > > > You didn't specify a language, so here's an example in Python. It uses > space separated keywords, like in Google search or so. It may not be > exactly as you requested, but will give you something to start with. > > #! /usr/bin/env python3 > > import gi > gi.require_version('Gtk', '3.0') > from gi.repository import Gtk > import os, sys > > > class GUI (Gtk.Window): > def __init__(self): > > Gtk.Window.__init__(self, title="Combo with search") > self.model = Gtk.ListStore(str) > self.populate_model() > #combobox > combo = Gtk.ComboBox.new_with_model_and_entry(model = self.model) > combo.set_entry_text_column(0) > combo.connect('changed', self.changed) > #completion > completion = Gtk.EntryCompletion () > completion.set_model(self.model) > completion.set_text_column(0) > completion.set_match_func(self.match_func) > completion.connect ('match-selected', self.match_selected) > #combobox entry > entry = combo.get_child() > entry.set_completion (completion) > #main window > self.add (combo) > self.show_all() > > def changed (self, combo): > _iter = combo.get_active_iter() > if _iter != None: > font = self.model[_iter][0] > print ('You selected combo:', font) > > def match_selected (self, completion, model, _iter): > print ('You selected completion:', model[_iter][0]) > > def match_func (self, completion, string, _iter): > for word in string.split(): > if word not in self.model[_iter][0].lower(): #search is always > lower case > return False > return True > > def on_window_destroy(self, window): > Gtk.main_quit() > > def populate_model (self): > for i in range (100): > self.model.append(["Font %d" % i]) > > def main(): > app = GUI() > Gtk.main() > > if __name__ == "__main__": > sys.exit(main()) > > > Reuben > > > _______________________________________________ > gtk-devel-list mailing list > gtk-devel-list@gnome.org > https://mail.gnome.org/mailman/listinfo/gtk-devel-list >
_______________________________________________ gtk-devel-list mailing list gtk-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-devel-list