diff --git a/Source/Samples/Sections/Widgets/ComboBoxSection.cs b/Source/Samples/Sections/Widgets/ComboBoxSection.cs new file mode 100644 index 000000000..0f8d0d4cc --- /dev/null +++ b/Source/Samples/Sections/Widgets/ComboBoxSection.cs @@ -0,0 +1,97 @@ +// This is free and unencumbered software released into the public domain. +// Happy coding!!! - GtkSharp Team + +using Gtk; + +namespace Samples +{ + [Section(ContentType = typeof(ComboBox), Category = Category.Widgets)] + class ComboBoxSection : ListSection + { + public ComboBoxSection() + { + AddItem(CreateSimpleComboBox()); + AddItem(CreateMultiColumnComboBox()); + AddItem(CreateEditableComboBox()); + } + + public (string, Widget) CreateSimpleComboBox() + { + // initialize with a simple string list + var combo = new ComboBox( + new string[] + { + "Combo Entry 1", + "Combo Entry 2", + "Combo Entry 3", + "Combo Entry 4" + } + ); + + // event to notify for index changes in our combo + combo.Changed += (sender, e) => + ApplicationOutput.WriteLine(sender, $"Index changed to:{((ComboBox)sender).Active}"); + + // set the active selection to index 2 (Combo Entry 3) + combo.Active = 2; + + return ("Simple combo:", combo); + } + + public (string, Widget) CreateMultiColumnComboBox() + { + // create a store for our combo + var store = new ListStore(typeof(string), typeof(string), typeof(bool)); + + // lets append some stock icons, passing the icon names, and a simple text column + store.AppendValues("dialog-warning", "Warning", true); + store.AppendValues("process-stop", "Stop", false); + store.AppendValues("document-new", "New", true); + store.AppendValues("edit-clear", "Clear", true); + + // create cells + var imageCell = new CellRendererPixbuf(); + var textCell = new CellRendererText(); + + // create the combo and pass the values in + var combo = new ComboBox(store); + combo.PackStart(imageCell, true); + combo.PackStart(textCell, true); + + // add combo attributes to show in columns + combo.AddAttribute(imageCell, "icon-name", 0); + combo.AddAttribute(textCell, "text", 1); + + // lets use the store bool values to control sensitive rows + // Process-stop (store index one) should be disabled in this sample + // For a ComboBox item to be disabled, all cell renderers for the item need to have + // their sensitivity disabled + combo.AddAttribute(imageCell, "sensitive", 2); + combo.AddAttribute(textCell, "sensitive", 2); + + // listen to index changed on combo + combo.Changed += (sender, e) => + ApplicationOutput.WriteLine(sender, $"Index changed to:{((ComboBox)sender).Active}"); + + // lets preselect the first option + combo.Active = 0; + + return ("Combo with Icons and Text:", combo); + } + + public (string, Widget) CreateEditableComboBox() + { + var combo = ComboBoxText.NewWithEntry(); + combo.AppendText("Example 1"); + combo.AppendText("Example 2"); + combo.AppendText("Example 3"); + combo.AppendText("Example 4"); + + // combos with entry have a real entry inside it + // we can use it by + combo.Entry.PlaceholderText = "Write something"; + + return ("Combo with entry:", combo); + } + } +} diff --git a/Source/Samples/Sections/Widgets/EntrySection.cs b/Source/Samples/Sections/Widgets/EntrySection.cs index e9adcd39f..424f27b68 100644 --- a/Source/Samples/Sections/Widgets/EntrySection.cs +++ b/Source/Samples/Sections/Widgets/EntrySection.cs @@ -18,6 +18,7 @@ namespace Samples AddItem(CreateCustomActionsEntry()); AddItem(CreateProgressEntry()); AddItem(CreateCompletionEntry()); + AddItem(CreateInsensitiveEntry()); } public (string, Widget) CreateSimpleEntry() @@ -123,44 +124,40 @@ namespace Samples store.AppendValues("Better and bigger example"); store.AppendValues("Some other example"); - // create tree column - var column = new TreeViewColumn(); - column.Reorderable = false; - column.SortIndicator = false; - column.Clickable = true; - column.SortColumnId = 0; + // assign treemodel as the completion + completion.Model = store; - // create cells - var cell = new CellRendererText(); - column.PackStart(cell, true); - - // set cell functions - column.SetCellDataFunc(cell, (TreeViewColumn tree_column, CellRenderer cellRenderer, ITreeModel tree_model, TreeIter iter) => + // lets override the default match function so we can use the contains mode + // instead of the default startswith + completion.MatchFunc = (EntryCompletion comp, string key, TreeIter iter) => { - var m = tree_model.GetValue(iter, 0); - (cellRenderer as CellRendererText).Text = (string)m; - }); - - // model filter - var filter = new TreeModelFilter(store, null); - filter.VisibleFunc = (model, iter) => - { - if (string.IsNullOrEmpty(entry.Text)) - return true; + if (string.IsNullOrEmpty(key)) + return false; - var o = model.GetValue(iter, 0); - var searchString = o as string; - if (!string.IsNullOrEmpty(searchString)) - return searchString.StartsWith(entry.Text, System.StringComparison.InvariantCultureIgnoreCase); + var o = comp.Model.GetValue(iter, 0); + var stringToSearch = o as string; - return true; + if (!string.IsNullOrEmpty(stringToSearch)) + return stringToSearch.IndexOf(key, System.StringComparison.InvariantCultureIgnoreCase) >= 0; + + return false; }; - // assign treemodel as the completion - completion.Model = filter; completion.TextColumn = 0; + return ("Completion Entry:",entry); } + + public (string, Widget) CreateInsensitiveEntry() + { + var entry = new Entry(); + entry.Text = "Cannot change this"; + + entry.Sensitive = false; + + return ("Insensitive entry:", entry); + } + } } diff --git a/Source/Samples/Sections/Widgets/ProgressBarSection.cs b/Source/Samples/Sections/Widgets/ProgressBarSection.cs index 26933fc8a..0508f38f4 100644 --- a/Source/Samples/Sections/Widgets/ProgressBarSection.cs +++ b/Source/Samples/Sections/Widgets/ProgressBarSection.cs @@ -68,7 +68,7 @@ namespace Samples public (string, Widget) CreatePulseProgressBar() { - // this is used when application can report progress + // this is used when application can't report progress var pb = new ProgressBar();