Web lists-archives.com

Re: Combined search and combobox?

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)
        combo = Gtk.ComboBox.new_with_model_and_entry(model = self.model)
        combo.connect('changed', self.changed)
        completion = Gtk.EntryCompletion ()
        completion.connect ('match-selected', self.match_selected)
        #combobox entry
        entry = combo.get_child()
        entry.set_completion (completion)
        #main window
        self.add (combo)

    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):

    def populate_model (self):
        for i in range (100):
            self.model.append(["Font %d" % i])

def main():
    app = GUI()
if __name__ == "__main__":


gtk-devel-list mailing list