From 69ab0dc995a58feddc96e197c0bb0c2f07dd31ee Mon Sep 17 00:00:00 2001 From: John Luke Date: Sun, 14 Aug 2005 19:50:35 +0000 Subject: [PATCH] add an iconview example svn path=/trunk/gtk-sharp/; revision=48370 --- doc/ChangeLog | 5 ++ doc/en/Gtk/IconView.xml | 168 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index a63f38f06..a9ed32003 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +2005-08-14 John Luke + + * en/Gtk/IconView.xml: add iconview example + based on GtkDemo code + 2005-08-09 Dan Winship * en/index.xml: remove gda/gnomedb docs diff --git a/doc/en/Gtk/IconView.xml b/doc/en/Gtk/IconView.xml index 61becaac8..afd7d8e6b 100644 --- a/doc/en/Gtk/IconView.xml +++ b/doc/en/Gtk/IconView.xml @@ -10,6 +10,174 @@ A widget which displays a list of icons in a grid provides an alternative view on a list model. It displays the model as a grid of icons with labels. Like , it allows to select one or multiple items (depending on the selection mode, see ). In addition to selection with the arrow keys, supports rubberband selection, which is controlled by dragging the pointer. + + +using System; +using System.IO; +using Gtk; + +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; + + static void Main () + { + Application.Init (); + new DemoIconView (); + Application.Run (); + } + + 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); + + fileIcon = GetIcon ("gnome-fs-regular"); + dirIcon = GetIcon ("gnome-fs-directory"); + + 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 (); + } + + Gdk.Pixbuf GetIcon (string name) + { + return Gtk.IconTheme.Default.LoadIcon (name, 48, (IconLookupFlags) 0); + } + + 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.DefaultSortFunc = 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, true); + } + + 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) + { + Application.Quit (); + a.RetVal = true; + } +} + +