diff --git a/sample/GtkDemo/DemoIconView.cs b/sample/GtkDemo/DemoIconView.cs new file mode 100644 index 000000000..95d74f45d --- /dev/null +++ b/sample/GtkDemo/DemoIconView.cs @@ -0,0 +1,158 @@ +using System; +using System.IO; +using Gtk; + +namespace GtkDemo +{ + [Demo ("Icon View", "DemoIconView.cs")] + public class DemoIconView : Window + { + const int COL_PATH = 0; + const int COL_DISPLAY_NAME = 1; + const int COL_PIXBUF = 2; + const int COL_IS_DIRECTORY = 3; + + DirectoryInfo parent = new DirectoryInfo ("/"); + Gdk.Pixbuf dirIcon, fileIcon; + ListStore store; + ToolButton upButton; + + public DemoIconView () : base ("Gtk.IconView demo") + { + SetDefaultSize (650, 400); + DeleteEvent += new DeleteEventHandler (OnWinDelete); + + VBox vbox = new VBox (false, 0); + Add (vbox); + + Toolbar toolbar = new Toolbar (); + vbox.PackStart (toolbar, false, false, 0); + + upButton = new ToolButton (Stock.GoUp); + upButton.IsImportant = true; + upButton.Sensitive = false; + toolbar.Insert (upButton, -1); + + ToolButton homeButton = new ToolButton (Stock.Home); + homeButton.IsImportant = true; + toolbar.Insert (homeButton, -1); + + // FIXME: use the real icons later + fileIcon = Gdk.Pixbuf.LoadFromResource ("MonoIcon.png"); + dirIcon = Gdk.Pixbuf.LoadFromResource ("MonoIcon.png"); + + ScrolledWindow sw = new ScrolledWindow (); + sw.ShadowType = ShadowType.EtchedIn; + sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic); + vbox.PackStart (sw, true, true, 0); + + // Create the store and fill it with the contents of '/' + store = CreateStore (); + FillStore (); + + IconView iconView = new IconView (store); + iconView.SelectionMode = SelectionMode.Multiple; + + upButton.Clicked += OnUpClicked; + homeButton.Clicked += OnHomeClicked; + + iconView.TextColumn = COL_DISPLAY_NAME; + iconView.PixbufColumn = COL_PIXBUF; + + iconView.ItemActivated += new ItemActivatedHandler (OnItemActivated); + sw.Add (iconView); + iconView.GrabFocus (); + + ShowAll (); + } + + ListStore CreateStore () + { + // path, name, pixbuf, is_dir + ListStore store = new ListStore (typeof (string), typeof (string), typeof (Gdk.Pixbuf), typeof (bool)); + + // Set sort column and function + store.SetDefaultSortFunc (SortFunc); + store.SetSortColumnId (COL_DISPLAY_NAME, SortType.Ascending); + + return store; + } + + void FillStore () + { + // first clear the store + store.Clear (); + + // Now go through the directory and extract all the file information + if (!parent.Exists) + return; + + foreach (DirectoryInfo di in parent.GetDirectories ()) + { + if (!di.Name.StartsWith (".")) + store.AppendValues (di.FullName, di.Name, dirIcon, false); + } + + foreach (FileInfo file in parent.GetFiles ()) + { + if (!file.Name.StartsWith (".")) + store.AppendValues (file.FullName, file.Name, fileIcon, false); + } + } + + int SortFunc (TreeModel model, TreeIter a, TreeIter b) + { + // sorts folders before files + bool a_is_dir = (bool) model.GetValue (a, COL_IS_DIRECTORY); + bool b_is_dir = (bool) model.GetValue (b, COL_IS_DIRECTORY); + string a_name = (string) model.GetValue (a, COL_DISPLAY_NAME); + string b_name = (string) model.GetValue (b, COL_DISPLAY_NAME); + + if (!a_is_dir && b_is_dir) + return 1; + else if (a_is_dir && !b_is_dir) + return -1; + else + return String.Compare (a_name, b_name); + } + + void OnHomeClicked (object sender, EventArgs a) + { + parent = new DirectoryInfo (Environment.GetFolderPath (Environment.SpecialFolder.Personal)); + FillStore (); + upButton.Sensitive = true; + } + + void OnItemActivated (object sender, ItemActivatedArgs a) + { + TreeIter iter; + store.GetIter (out iter, a.Path); + string path = (string) store.GetValue (iter, COL_PATH); + bool isDir = (bool) store.GetValue (iter, COL_IS_DIRECTORY); + + if (!isDir) + return; + + // Replace parent with path and re-fill the model + parent = new DirectoryInfo (path); + FillStore (); + + // Sensitize the up button + upButton.Sensitive = true; + } + + void OnUpClicked (object sender, EventArgs a) + { + parent = parent.Parent; + FillStore (); + upButton.Sensitive = (parent.FullName == "/" ? false : true); + } + + void OnWinDelete (object sender, DeleteEventArgs a) + { + Hide (); + Dispose (); + } + } +} + diff --git a/sample/GtkDemo/Makefile.am b/sample/GtkDemo/Makefile.am index e0dd23e7d..32ea630af 100644 --- a/sample/GtkDemo/Makefile.am +++ b/sample/GtkDemo/Makefile.am @@ -19,6 +19,7 @@ sources = \ DemoEntryCompletion.cs \ DemoExpander.cs \ DemoHyperText.cs \ + DemoIconView.cs \ DemoImages.cs \ DemoListStore.cs \ DemoMain.cs \ diff --git a/sample/GtkDemo/TODO b/sample/GtkDemo/TODO index 3fbdc3c8f..84edb14c9 100644 --- a/sample/GtkDemo/TODO +++ b/sample/GtkDemo/TODO @@ -10,8 +10,8 @@ RotatedText - doesn't quite work yet IconView - - missing - -Chang Display + - fix icons + +Change Display - missing