GtkSharp/Source/Samples/Sections/Widgets/TreeViewSection.cs
dmg 110d783540 Added TreeView sample
Features:
* Sort on header click.
* Add, edit, remove value in store (name column).
* Children items.
* Handlers for store events.
2021-06-20 14:18:34 +03:00

177 lines
No EOL
5.9 KiB
C#

// 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);
}
}
}