From 110d7835403d7d8f4f8a27d56d7d9a8b478cd318 Mon Sep 17 00:00:00 2001 From: dmg Date: Sun, 20 Jun 2021 14:18:34 +0300 Subject: [PATCH] Added TreeView sample Features: * Sort on header click. * Add, edit, remove value in store (name column). * Children items. * Handlers for store events. --- Source/Samples/MainWindow.cs | 2 +- .../Sections/Widgets/TreeViewSection.cs | 177 ++++++++++++++++++ 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 Source/Samples/Sections/Widgets/TreeViewSection.cs diff --git a/Source/Samples/MainWindow.cs b/Source/Samples/MainWindow.cs index ddce848bc..d97f63bdc 100644 --- a/Source/Samples/MainWindow.cs +++ b/Source/Samples/MainWindow.cs @@ -59,7 +59,7 @@ namespace Samples _textViewCode = new SourceView(); _textViewCode.ShowLineNumbers = true; - _textViewCode.Buffer.Language = new LanguageManager().GetLanguage("c-sharp"); + _textViewCode.Buffer.Language = new LanguageManager().GetLanguage("c-sharp"); _textViewCode.Margin = 3; scroll2.Child = _textViewCode; diff --git a/Source/Samples/Sections/Widgets/TreeViewSection.cs b/Source/Samples/Sections/Widgets/TreeViewSection.cs new file mode 100644 index 000000000..074aeab34 --- /dev/null +++ b/Source/Samples/Sections/Widgets/TreeViewSection.cs @@ -0,0 +1,177 @@ +// This is free and unencumbered software released into the public domain. +// Happy coding!!! - GtkSharp Team + +using System; +using Gtk; + +namespace Samples +{ + [Section(ContentType = typeof(TreeView), Category = Category.Widgets)] + class TreeViewSection : Box + { + const int ColumnIndex = 0; + const int ColumnName = 1; + const int ColumnIcon = 2; + + TreeView tree; + TreeStore store; + Entry entry; + Gdk.Pixbuf icon = new Gdk.Pixbuf(typeof(ImageSection).Assembly, "Testpic", 32, 32); + + public TreeViewSection() : base(Orientation.Vertical, 3) + { + CreateTreeView(); + + var treeScroll = new ScrolledWindow(); + treeScroll.Expand = true; + treeScroll.Add(tree); + + var boxEdit = new Box(Orientation.Horizontal, 3); + + var btn1 = new Button() { Label = "Add" }; + btn1.Clicked += OnAddClicked; + + var btn2 = new Button() { Label = "Edit" }; + btn2.Clicked += OnEditClicked; + + var btn3 = new Button() { Label = "Remove" }; + btn3.Clicked += OnRemoveClicked; + + entry = new Entry(); + + boxEdit.PackStart(entry, true, true, 0); + boxEdit.PackStart(btn1, false, true, 0); + boxEdit.PackStart(btn2, false, true, 0); + boxEdit.PackStart(btn3, false, true, 0); + + PackStart(boxEdit, false, true, 0); + PackStart(treeScroll, true, true, 0); + } + + void CreateTreeView() + { + store = new TreeStore(typeof(int), typeof(string), typeof(Gdk.Pixbuf)); + store.RowInserted += OnStoreRowInserted; + store.RowDeleted += OnStoreRowDeleted; + store.RowChanged += OnStoreRowChanged; + store.RowsReordered += OnStoreRowsReordered; + store.RowHasChildToggled += OnStoreRowHasChildToggled; + + tree = new TreeView(); + + var col = tree.AppendColumn("Index", new CellRendererText(), "text", ColumnIndex); + col.Resizable = true; + col.SortColumnId = 0; + col = tree.AppendColumn("Name", new CellRendererText(), "text", ColumnName); + col.Resizable = true; + col.Expand = true; + col.SortColumnId = 1; + + col = tree.AppendColumn("Icon", new CellRendererPixbuf(), "pixbuf", ColumnIcon); + col.Resizable = true; + col.Expand = true; + col.Alignment = .5f; + + FillTreeView(); + + tree.Model = store; + tree.Selection.Changed += OnTreeSelectionChanged; + } + + void FillTreeView() + { + int idx = 0; + + TreeIter it = store.InsertWithValues(-1, idx++, "Adam", null); + store.InsertWithValues(it, -1, idx++, "Adam child 1", null); + store.InsertWithValues(it, -1, idx++, "Adam child 2", icon); + store.InsertWithValues(it, -1, idx++, "Adam child 3", null); + + store.InsertWithValues(-1, idx++, "Eve", null); + store.InsertWithValues(-1, idx++, "Zack", null); + store.InsertWithValues(-1, idx++, "John", icon); + + it = store.InsertWithValues(-1, idx++, "Amy", null); + store.InsertWithValues(it, -1, idx++, "Amy child 1", null); + store.InsertWithValues(it, -1, idx++, "Amy child 2", null); + + store.InsertWithValues(-1, idx++, "William", null); + store.InsertWithValues(-1, idx++, "Evelyn", icon); + store.InsertWithValues(-1, idx++, "Wyatt", null); + } + + private void OnTreeSelectionChanged(object sender, EventArgs e) + { + if (!tree.Selection.GetSelected(out TreeIter it)) + return; + + TreePath path = store.GetPath(it); + + var name = (string)store.GetValue(it, ColumnName); + entry.Text = name; + + ApplicationOutput.WriteLine(sender, $"SelectionChanged, path {path}, name {name}"); + } + + private void OnStoreRowInserted(object sender, RowInsertedArgs args) + { + var name = (string)store.GetValue(args.Iter, ColumnName); + ApplicationOutput.WriteLine(sender, $"RowInserted, path {args.Path}, name {name}"); + } + + private void OnStoreRowDeleted(object sender, RowDeletedArgs args) + { + ApplicationOutput.WriteLine(sender, $"RowDeleted, path {args.Path}"); + } + + private void OnStoreRowChanged(object sender, RowChangedArgs args) + { + var name = (string)store.GetValue(args.Iter, ColumnName); + ApplicationOutput.WriteLine(sender, $"RowChanged, path {args.Path}, name {name}"); + } + + private void OnStoreRowsReordered(object sender, RowsReorderedArgs args) + { + ApplicationOutput.WriteLine(sender, $"RowsReordered, path {args.Path}"); + } + + private void OnStoreRowHasChildToggled(object sender, RowHasChildToggledArgs args) + { + var name = (string)store.GetValue(args.Iter, ColumnName); + ApplicationOutput.WriteLine(sender, $"RowHasChildToggled, path {args.Path}, name {name}"); + } + + private void OnAddClicked(object sender, EventArgs e) + { + if (!tree.Selection.GetSelected(out TreeIter it)) + return; + + string txt = entry.Text.Trim(); + if (string.IsNullOrEmpty(txt)) + return; + + int idx = Environment.TickCount % 100; + store.InsertWithValues(it, -1, idx, txt, null); + } + + private void OnEditClicked(object sender, EventArgs e) + { + if (!tree.Selection.GetSelected(out TreeIter it)) + return; + + string txt = entry.Text.Trim(); + if (string.IsNullOrEmpty(txt)) + return; + + store.SetValue(it, ColumnName, txt); + } + + private void OnRemoveClicked(object sender, EventArgs e) + { + if (!tree.Selection.GetSelected(out TreeIter it)) + return; + + store.Remove(ref it); + } + } +} \ No newline at end of file