177 lines
5.9 KiB
C#
177 lines
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);
|
||
|
}
|
||
|
}
|
||
|
}
|