настройка завершения GtkComboBoxText

Как я могу настроить завершениеGtkComboBoxText с «статическим» и «динамическим» аспектом? Статический аспект заключается в том, что некоторые записи известны и добавляются в комбинированный текст во время создания сgtk_combo_box_text_append_text, Динамический аспект заключается в том, что мне также необходимо выполнить некоторые функции обратного вызова, то есть завершитьдинамично -после созданияGtkComboBoxText Виджет - один раз было набрано несколько символов.

Мое приложение использует Boehm GC (за исключением объектов GTK, конечно), как Guile, SCM или Bigloo. Это можно рассматривать как экспериментальныйстойкий Реализация языка программирования с динамическим типом со встроенным редактором, написанным для Debian / Linux / x86-64 и системной библиотекой GTK3.21 и для него, она написана на C99 (некоторые из которых сгенерированы) и скомпилирована с GCC6.

(Меня не волнуют системы, отличные от Linux, библиотеки GTK3 старше GTK3.20, компилятор GCC старше GCC6)

детали вопроса

Я вхожу (ввод вGtkComboBoxText) либоназваниеилиID объекта.

название является C-идентификатором, но начинается с буквы и не может заканчиваться подчеркиванием. Например,comment, if, the_GUI, the_system, payload_json, или жеx1 действительные имена (но_a0bcd или жеfoobar_ недопустимые имена, потому что они начинаются или заканчиваются подчеркиванием). В настоящее время у меня есть большая дюжина имен, но у меня может быть несколько тысяч. Поэтому было бы разумно предложить завершение, как только набрали одну или, возможно, две буквы, и завершение имен может происходить статически, потому что их не много (поэтому я считаю разумным позвонитьgtk_combo_box_append_text для каждого имени).

ID объекта начинается с подчеркивания, за которым следует цифра, и содержит ровно 18 буквенно-цифровых (случайных) символов. Например,_5Hf0fFKvRVa71ZPM0, _8261sbF1f9ohzu2Iu, _0BV96V94PJIn9si1K Возможны идентификаторы объектов. На самом деле это 96 почти случайных бит (вероятно, только 294 возможны). Идентификатор объекта играет рольUUIDs (в том смысле, что предполагается, что он уникален во всем мире для отдельных объектов), но имеет дружественный синтаксис языка C. В настоящее время у меня есть несколько десятков объектов-идентификаторов, но у меня может быть несколько сотен тысяч (или, может быть, миллион) из них. Но с учетом префикса из четырех символов, таких как_6S3 или же_22zЯ предполагаю, что только разумное число (вероятно, не более десятка, и, конечно, не более тысячи)объектных идентификаторов существуют в моем приложении с этим префиксом. Конечно, было бы неразумно регистрироваться (статически)априори все идентификаторы объекта (завершение должно произойти после того, как были напечатаны четыре символа, и должно происходить динамически).

Поэтому я хочу, чтобы завершение работало как с именами (например, достаточно набрать одну букву, за которой может следовать другой буквенный символ, чтобы предлагать завершение не более ста вариантов), так и с идентификаторами объектов (набрав четыре символа, например:_826 должно быть достаточно, чтобы вызвать завершение, вероятно, не более нескольких десятков вариантов, возможно, тысячи, если не повезет).

Следовательно, набрав три клавишиp a табуляция будет предлагать завершение с несколькими именами, такими какpayload_json или жеpayload_vectval и т.д ... и набрав пять клавиш_ 5 H f табуляция будет предлагать завершение с очень немногими объектными идентификаторами, особенно_5Hf0fFKvRVa71ZPM0

образецнеполный код

Пока я закодировал следующее:

static GtkWidget *
mom_objectentry (void)
{
  GtkWidget *obent = gtk_combo_box_text_new_with_entry ();
  gtk_widget_set_size_request (obent, 30, 10);
  mo_value_t namsetv = mo_named_objects_set ();

У меня есть значения Бема-мусора, иmo_value_t это указатель на любой из них. Значения могут быть помечены целыми числами, указателями на строки, объектами или кортежами или наборами объектов. Такnamesetv теперь содержит набор именованных объектов (вероятно, менее нескольких тысяч именованных объектов).

  int nbnam = mo_set_size (namsetv);
  MOM_ASSERTPRINTF (nbnam > 0, "bad nbnam");
  mo_value_t *namarr = mom_gc_alloc (nbnam * sizeof (mo_value_t));
  int cntnam = 0;
  for (int ix = 0; ix < nbnam; ix++)
    {
      mo_objref_t curobr = mo_set_nth (namsetv, ix);
      mo_value_t curnamv = mo_objref_namev (curobr);
      if (mo_dyncast_string (curnamv))
        namarr[cntnam++] = curnamv;
    }
  qsort (namarr, cntnam, sizeof (mo_value_t), mom_obname_cmp);
  for (int ix = 0; ix < cntnam; ix++)
    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (obent),
                    mo_string_cstr (namarr[ix]));

на данный момент я отсортировал все (самое большее несколько тысяч) имен и добавил их «статически», используяgtk_combo_box_text_append_text.

  GtkWidget *combtextent = gtk_bin_get_child (GTK_BIN (obent));
  MOM_ASSERTPRINTF (GTK_IS_ENTRY (combtextent), "bad combtextent");
  MOM_ASSERTPRINTF (gtk_entry_get_completion (GTK_ENTRY (combtextent)) ==
                    NULL, "got completion in combtextent");

Я с удивлением заметил, чтоgtk_entry_get_completion (GTK_ENTRY (combtextent)) нулевой.

Но я застрял здесь. Я думаю о:

Имея некоторыеmom_set_complete_objectid(const char*prefix) который далprefix лайк"_47n" по крайней мере четыре символа вернули бы собранный мусорmo_value_t представляющий набор объектов с этим префиксом. Это очень легко для меня, и почти готово.

Сделать свой собственный местныйGtkEntryCompletion* mycompl = ..., что бы завершить, как я хочу. Тогда я бы положил в текстовой записиcombtextent из моегоGTK-комбо-бокс-текст с помощьюgtk_entry_set_completion(GTK_ENTRY(combtextent), mycompl);

Следует ли использовать записи, добавленные сgtk_combo_box_text_append_text для "статической" роли завершения имени? Как я должен динамически завершить использование значения динамического набора, возвращенного из моегоmom_set_complete_objectid; дан некоторый объект-указательobr и немногоchar bufid[20]; Я легко и быстро могу заполнить его с помощью идентификатора объекта этого объектаobr сmo_cstring_from_hi_lo_ids(bufid, obr->mo_ob_hid, obr->mo_ob_loid)..

Я не знаю, как закодировать выше. Для справки, я сейчас просто возвращаю combo-box-text:

  // if the entered text starts with a letter, I want it to be
  // completed with the appended text above if the entered text starts
  // with an undersore, then a digit, then two alphanum (like _0BV or
  // _6S3 for example), I want to call a completion function.
#warning objectentry: what should I code here?
  return obent;
}  /* end mom_objectentry */

Правильный ли мой подход?

mom_objectentry Функция выше используется для заполнения модальных диалогов с коротким временем жизни.

Я предпочитаю простой код, а не эффективность. На самом деле мой код временный (я надеюсь загрузить свой язык и сгенерировать весь его код на C!), И на практике у меня, вероятно, будет всего несколько сотен имен и самое большее несколько десятков тысяч идентификаторов объектов. Таким образом, производительность не очень важна, но более важна простота кодирования (некоторые концептуально «выбрасывают» код).

Я не хочу (если возможно) добавлять свои собственные классы GTK. Я предпочитаю использовать существующие классы GTK и виджеты, настраивая их с помощью сигналов GTK и обратных вызовов.

контекст

Моя заявка является экспериментальнойстойкий язык программирования и реализация с близким Scheme или Python (или JavaScript, игнорируя аспект прототипа, ...)семантика но с совершенно другим (еще не реализован 7 сентябряго, 2016) синтаксис (должен отображаться и вводиться в виджетах GTK) с использованием сборщика мусора Boehm для значений (включая объекты, наборы, кортежи, строки ...) ... Значения (включая объекты) обычно являются постоянными (за исключением GTK связанные данные: приложение запускается с почти пустым окном). Вся языковая куча сохраняется в JSON-подобном синтаксисе в некоторой Sqlite «базе данных» (генерируемой при выходе из приложения), сбрасываемой в_momstate.sql который перезагружается при запуске приложения. Идентификаторы объектов полезны для отображения ссылок на объекты для пользователя в виджетах GTK, для сохранения и для генерации кода C, связанного с объектами (например, объекта id)._76f7e2VcL8IJC1hq6 может быть связано сmo_76f7e2VcL8IJC1hq6 идентификатор в некотором сгенерированном C-коде; это частично, почему у меня есть мой формат идентификатора объекта вместо использования UUIDs).

PS. Мой код C является свободным программным обеспечением GPLv3 и доступен на github. Это монитор MELT, филиалexpjs, совершитьe2b3b99ef66394 ...

NB: объекты, упомянутые здесь, неявно являются объектами моего языка, а не объектами GTK. У всех есть уникальный идентификатор объекта, и некоторые, но не большинство из них названы.

Ответы на вопрос(2)

Ваш ответ на вопрос