diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2019-12-18 17:32:37 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-18 17:32:37 +0300 |
commit | e7061bd9e2a57a722c7190d0ce13d5886aa039dc (patch) | |
tree | caeb5e295b65ae32a8e87329e2d8e54b1bc5110d | |
parent | 485b51769c480295511348657c60287c8b7b093c (diff) | |
parent | 4a0ded137165530740721f6ddd3b893358077129 (diff) |
Merge pull request #1013 from mono/add-comboboxentry-completion
Add ComboBoxEntry Completion support
-rw-r--r-- | TestApps/Samples/Samples/ComboBoxes.cs | 1 | ||||
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs | 3 | ||||
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs | 69 | ||||
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs | 2 | ||||
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs | 4 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs | 5 | ||||
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs | 9 | ||||
-rw-r--r-- | Xwt/Xwt.Backends/IComboBoxEntryBackend.cs | 2 | ||||
-rw-r--r-- | Xwt/Xwt/ComboBoxEntry.cs | 14 |
9 files changed, 100 insertions, 9 deletions
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.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..7788c2e7 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,18 +118,16 @@ namespace Xwt.GtkBackend class CustomComboEntryBackend: TextEntryBackend { - Gtk.Entry entry; - public CustomComboEntryBackend (Gtk.Entry entry) { - this.entry = entry; + if (entry == null) + throw new ArgumentNullException(nameof(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, 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 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) { 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. /// </value> 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); } } + + /// <summary> + /// Get ot sets a value indicating whether Autocompletion is enabled + /// </summary> + /// <value><c>true</c> if sompletion is enabled, otherwise <c>false</c></value> + /// <remarks> + /// Enables autocompletion with values from the given source and <see cref="TextField"/> while typing. + /// Will reset custom completions specified with <see cref="TextEntry.SetCompletions(string[])"/> when enabled. + /// </remarks> + public bool Completes + { + get { return Backend.Completes; } + set { Backend.Completes = value; } + } } class CustomComboTextEntry: TextEntry |