Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@microsoft.com>2019-12-18 17:32:37 +0300
committerGitHub <noreply@github.com>2019-12-18 17:32:37 +0300
commite7061bd9e2a57a722c7190d0ce13d5886aa039dc (patch)
treecaeb5e295b65ae32a8e87329e2d8e54b1bc5110d
parent485b51769c480295511348657c60287c8b7b093c (diff)
parent4a0ded137165530740721f6ddd3b893358077129 (diff)
Merge pull request #1013 from mono/add-comboboxentry-completion
Add ComboBoxEntry Completion support
-rw-r--r--TestApps/Samples/Samples/ComboBoxes.cs1
-rw-r--r--Xwt.Gtk/Xwt.GtkBackend/ComboBoxBackend.cs3
-rw-r--r--Xwt.Gtk/Xwt.GtkBackend/ComboBoxEntryBackend.cs69
-rw-r--r--Xwt.Gtk/Xwt.GtkBackend/SearchTextEntryBackend.cs2
-rw-r--r--Xwt.Gtk/Xwt.GtkBackend/TextEntryBackend.cs4
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ComboBoxEntryBackend.cs5
-rw-r--r--Xwt.XamMac/Xwt.Mac/ComboBoxEntryBackend.cs9
-rw-r--r--Xwt/Xwt.Backends/IComboBoxEntryBackend.cs2
-rw-r--r--Xwt/Xwt/ComboBoxEntry.cs14
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