From 0e96cdf19f4ee68954d52d9e77223074bede56e2 Mon Sep 17 00:00:00 2001 From: Vsevolod Kukol Date: Wed, 18 Dec 2019 06:34:18 +0100 Subject: Add completion support to ComboBoxEntry Completion can be enabled using the new ComboBoxEntry.Completes property. --- TestApps/Samples/Samples/ComboBoxes.cs | 1 + Xwt/Xwt.Backends/IComboBoxEntryBackend.cs | 2 ++ Xwt/Xwt/ComboBoxEntry.cs | 14 ++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/TestApps/Samples/Samples/ComboBoxes.cs b/TestApps/Samples/Samples/ComboBoxes.cs index 10cd66a9..b6578d3c 100644 --- a/TestApps/Samples/Samples/ComboBoxes.cs +++ b/TestApps/Samples/Samples/ComboBoxes.cs @@ -91,6 +91,7 @@ namespace Samples c4.TextEntry.SelectionChanged += delegate { la4.Text = "Selected text: " + c4.TextEntry.SelectedText; }; + c4.Completes = true; HBox selBox = new HBox (); Label las = new Label ("Selection:"); diff --git a/Xwt/Xwt.Backends/IComboBoxEntryBackend.cs b/Xwt/Xwt.Backends/IComboBoxEntryBackend.cs index dc55bdd1..004b9cf6 100644 --- a/Xwt/Xwt.Backends/IComboBoxEntryBackend.cs +++ b/Xwt/Xwt.Backends/IComboBoxEntryBackend.cs @@ -44,6 +44,8 @@ namespace Xwt.Backends /// The text entry backend. /// ITextEntryBackend TextEntryBackend { get; } + + bool Completes { get; set; } } public interface IComboBoxEntryEventSink: IComboBoxEventSink diff --git a/Xwt/Xwt/ComboBoxEntry.cs b/Xwt/Xwt/ComboBoxEntry.cs index 0499c935..076152a7 100644 --- a/Xwt/Xwt/ComboBoxEntry.cs +++ b/Xwt/Xwt/ComboBoxEntry.cs @@ -79,6 +79,20 @@ namespace Xwt Backend.SetTextColumn (0); } } + + /// + /// Get ot sets a value indicating whether Autocompletion is enabled + /// + /// true if sompletion is enabled, otherwise false + /// + /// Enables autocompletion with values from the given source and while typing. + /// Will reset custom completions specified with when enabled. + /// + public bool Completes + { + get { return Backend.Completes; } + set { Backend.Completes = value; } + } } class CustomComboTextEntry: TextEntry -- cgit v1.2.3 From 7fc63d25799eb3a3a391d079820d3915130b2130 Mon Sep 17 00:00:00 2001 From: Vsevolod Kukol Date: Wed, 18 Dec 2019 06:34:56 +0100 Subject: [WPF] track new API --- Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs index 2cb52153..8c2713d0 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs @@ -48,6 +48,11 @@ namespace Xwt.WPFBackend ComboBox.DisplayMemberPath = ".[" + column + "]"; } + public bool Completes + { + get; set; //TODO + } + protected override double DefaultNaturalWidth { get -- cgit v1.2.3 From 6fab1f0303164520d1c908b75d03064cca0df5ad Mon Sep 17 00:00:00 2001 From: Vsevolod Kukol Date: Wed, 18 Dec 2019 06:35:18 +0100 Subject: [Mac] Add ComboBoxEntry.Completes support --- Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs b/Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs index 16fd0e45..1c6cb026 100644 --- a/Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs +++ b/Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs @@ -83,6 +83,15 @@ namespace Xwt.Mac Widget.SelectItem (value); } } + + public bool Completes { + get { + return Widget.Completes; + } + set { + Widget.Completes = value; + } + } public void SetTextColumn (int column) { -- cgit v1.2.3 From 9e18300eccb44cb81603e32d668056eb0c6c3cde Mon Sep 17 00:00:00 2001 From: Vsevolod Kukol Date: Wed, 18 Dec 2019 06:35:58 +0100 Subject: [Gtk] Add ComboBoxEntry.Completes support --- Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs | 3 ++ Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs | 66 ++++++++++++++++++++++-- Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs | 2 +- Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs | 4 +- 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs index c81b9aab..66a8c5da 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs @@ -115,6 +115,7 @@ namespace Xwt.GtkBackend Widget.Model = model.Store; } else Widget.Model = b.Store; + OnSourceSet (); } public int SelectedRow { @@ -127,6 +128,8 @@ namespace Xwt.GtkBackend } #endregion + protected virtual void OnSourceSet () { } + #region ICellRendererTarget implementation public void PackStart (object target, Gtk.CellRenderer cr, bool expand) { diff --git a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs index 1c81361b..98228a7e 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs @@ -31,6 +31,31 @@ namespace Xwt.GtkBackend public class ComboBoxEntryBackend: ComboBoxBackend, IComboBoxEntryBackend { TextEntryBackend entryBackend; + int textColumn = 0; + bool completes; + + public bool Completes + { + get + { + if (Widget?.Model == null) + return completes; + return entryBackend.TextEntry?.Completion?.Model == Widget.Model; + } + set + { + completes = value; + + if (!completes) + { + // unset model only if not using custom completions through TextEntryBackend + if (entryBackend.TextEntry.Completion?.Model == Widget.Model) + entryBackend.TextEntry.Completion.Model = null; + } else { + BindCompletion (); + } + } + } protected override Gtk.Widget CreateWidget () { @@ -39,9 +64,43 @@ namespace Xwt.GtkBackend return c; } + void BindCompletion() + { + var completion = entryBackend.TextEntry.Completion; + if (completion == null) { + completion = entryBackend.TextEntry.Completion = GtkBackend.TextEntryBackend.CreateCompletion(); + } + completion.Model = Widget.Model; + SyncCompletionColumn (completion, textColumn); + } + + static void SyncCompletionColumn (Gtk.EntryCompletion completion, int textColumn) + { + if (completion.TextColumn != textColumn) { + // Gtk.EntryCompletion.TextColumn is using gtk_entry_completion_set_text_column + // which will create a new Cell on each change. Since we don't want this "convenience", + // we need to use the "text_column" property instead, as suggested in + // https://developer.gnome.org/gtk2/stable/GtkEntryCompletion.html#gtk-entry-completion-set-text-column + using (GLib.Value val = new GLib.Value(textColumn)) { + completion.SetProperty("text_column", val); + } + } + } + + protected override void OnSourceSet() + { + base.OnSourceSet(); + if (completes && entryBackend.TextEntry?.Completion?.Model != Widget.Model) { + BindCompletion (); + } + } + public void SetTextColumn (int column) { + textColumn = column; Widget.SetTextColumn (column); + if (Completes) + SyncCompletionColumn (entryBackend.TextEntry.Completion, textColumn); } public ITextEntryBackend TextEntryBackend { @@ -59,17 +118,14 @@ namespace Xwt.GtkBackend class CustomComboEntryBackend: TextEntryBackend { - Gtk.Entry entry; - public CustomComboEntryBackend (Gtk.Entry entry) { - this.entry = entry; + Widget = entry; } public override void Initialize () { - Widget = entry; - entry.Show (); + TextEntry.Show (); } } } diff --git a/Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs index 72583144..5b55f7a6 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs @@ -36,7 +36,7 @@ namespace Xwt.GtkBackend { SearchEntry searchEntry; - protected override Gtk.Entry TextEntry { + internal protected override Gtk.Entry TextEntry { get { return searchEntry.Entry; } diff --git a/Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs index 0e434b79..4b08f8c2 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs @@ -38,7 +38,7 @@ namespace Xwt.GtkBackend Widget.Show (); } - protected virtual Gtk.Entry TextEntry { + internal protected virtual Gtk.Entry TextEntry { get { return (Gtk.Entry)base.Widget; } } @@ -221,7 +221,7 @@ namespace Xwt.GtkBackend }; } - Gtk.EntryCompletion CreateCompletion () + internal static Gtk.EntryCompletion CreateCompletion () { return new Gtk.EntryCompletion () { PopupCompletion = true, -- cgit v1.2.3 From 4a0ded137165530740721f6ddd3b893358077129 Mon Sep 17 00:00:00 2001 From: Vsevolod Kukol Date: Wed, 18 Dec 2019 09:03:12 -0500 Subject: [Gtk] Code improvements Co-Authored-By: Marius Ungureanu --- Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs index 98228a7e..7788c2e7 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs @@ -38,7 +38,7 @@ namespace Xwt.GtkBackend { get { - if (Widget?.Model == null) + if (Widget.Model == null) return completes; return entryBackend.TextEntry?.Completion?.Model == Widget.Model; } @@ -120,6 +120,8 @@ namespace Xwt.GtkBackend { public CustomComboEntryBackend (Gtk.Entry entry) { + if (entry == null) + throw new ArgumentNullException(nameof(entry)); Widget = entry; } @@ -129,4 +131,3 @@ namespace Xwt.GtkBackend } } } - -- cgit v1.2.3