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
_______________________________________________