[tracker] Add relationships pane



commit 260424a0a98dfa92c7a5df66277f581cdf647124
Author: Rob Taylor <rob taylor codethink co uk>
Date:   Sun May 3 11:02:04 2009 +0100

    Add relationships pane
    
    Switch to useing GtkBuilder for ui layout.
    Use currently selected object in the search to query for the reltionships of
    that object, display in a treeview below the search treeview

 src/tracker-explorer/explorer.ui   |  118 ++++++++++++++++++++++++++++
 src/tracker-explorer/explorer.vala |  149 ++++++++++++++++++++++++++----------
 2 files changed, 225 insertions(+), 42 deletions(-)
---
diff --git a/src/tracker-explorer/explorer.ui b/src/tracker-explorer/explorer.ui
new file mode 100644
index 0000000..18edc78
--- /dev/null
+++ b/src/tracker-explorer/explorer.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="explorer">
+    <property name="default_width">400</property>
+    <property name="default_height">600</property>
+    <child>
+      <object class="GtkVPaned" id="vpaned1">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="orientation">vertical</property>
+        <property name="position">200</property>
+        <property name="position_set">True</property>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Find:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="text-search">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x2022;</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTreeView" id="uris">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="resize">False</property>
+            <property name="shrink">True</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkScrolledWindow" id="scrolledwindow2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkTreeView" id="relationshipsview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="search_column">0</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="current-object">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">&lt;b&gt;No object selected&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+                <property name="justify">fill</property>
+                <property name="ellipsize">start</property>
+                <property name="single_line_mode">True</property>
+                <property name="max_width_chars">50</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="resize">True</property>
+            <property name="shrink">True</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/src/tracker-explorer/explorer.vala b/src/tracker-explorer/explorer.vala
index 138a887..db74dbf 100644
--- a/src/tracker-explorer/explorer.vala
+++ b/src/tracker-explorer/explorer.vala
@@ -11,77 +11,142 @@ interface Resources : GLib.Object {
 
 public class Explorer {
 
+	private const string UI_FILE = "explorer.ui";
 	private Resources tracker;
-	private ListStore listmodel;
+	private ListStore uris;
+	private ListStore relationships;
+	private Label current_object;
 
-	public Explorer() {
-		var conn = DBus.Bus.get (DBus.BusType.SESSION);
-		tracker = (Resources) conn.get_object ("org.freedesktop.Tracker",
-						       "/org/freedesktop/Tracker/Resources",
-						       "org.freedesktop.Tracker.Resources");
-	}
+	public void show() {
+		try {
+			var conn = DBus.Bus.get (DBus.BusType.SESSION);
+			tracker = (Resources) conn.get_object ("org.freedesktop.Tracker",
+							       "/org/freedesktop/Tracker/Resources",
+							       "org.freedesktop.Tracker.Resources");
+
+
+			var builder = new Builder ();
+			builder.add_from_file (UI_FILE);
 
-	public void setup() {
-		var window = new Window (WindowType.TOPLEVEL);
-		window.title = "Tracker Explorer";
-		window.set_size_request (300, 400);
-		window.position = WindowPosition.CENTER;
-		window.destroy += Gtk.main_quit;
+			var window = builder.get_object ("explorer") as Window;
+			window.destroy += Gtk.main_quit;
 
-		var vbox = new VBox(false, 0);
-		window.add(vbox);
+			var entry = builder.get_object ("text-search") as Entry;
+			entry.changed += entry_changed;
 
-		var entry = new Entry();
-		entry.set_text ("Test");
-		entry.changed += entry_changed;
-		vbox.pack_start(entry, false, false, 0);
+			var urisview = builder.get_object ("uris") as TreeView;
+			setup_uris(urisview);
 
-		var treeview = new TreeView();
-		setup_treeview(treeview);
+			var relationshipsview = builder.get_object ("relationshipsview") as TreeView;
+			setup_relationships(relationshipsview);
 
-		var scrolled_window = new ScrolledWindow(null,null);
-		scrolled_window.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
-		scrolled_window.add_with_viewport(treeview);
+			current_object = builder.get_object ("current-object") as Label;
+			window.show_all();
+		} catch (GLib.Error e) {
+			var msg = new MessageDialog (null, DialogFlags.MODAL,
+					 MessageType.ERROR, ButtonsType.CANCEL,
+					 "Failed to load UI\n%s", e.message);
+			msg.run ();
+			Gtk.main_quit();
+		} catch (DBus.Error e) {
+			var msg = new MessageDialog (null, DialogFlags.MODAL,
+					 MessageType.ERROR, ButtonsType.CANCEL,
+					 "Error connecting to D-Bus session bus\n%s", e.message);
+			msg.run ();
+			Gtk.main_quit();
+		}
+	}
 
-		vbox.pack_start(scrolled_window, true, true, 0);
+	private void setup_uris (TreeView urisview) {
+		uris = new ListStore (1, typeof (string));
+		urisview.set_model (uris);
 
-		window.show_all ();
-		window.destroy += Gtk.main_quit;
+		urisview.insert_column_with_attributes (-1, "URI", new CellRendererText (), "text", 0, null);
+		urisview.row_activated += uri_selected;
 	}
 
-	private void setup_treeview (TreeView view) {
-		listmodel = new ListStore (1, typeof (string));
-		view.set_model (listmodel);
+	private void setup_relationships(TreeView relationshipsview) {
+		relationships = new ListStore (2, typeof(string), typeof(string));
+		relationshipsview.set_model(relationships);
 
-		view.insert_column_with_attributes (-1, "URI", new CellRendererText (), "text", 0, null);
+		relationshipsview.insert_column_with_attributes (-1, "Relationship", new CellRendererText (), "text", 0, null);
+		relationshipsview.insert_column_with_attributes (-1, "Object", new CellRendererText (), "text", 1, null);
+		relationshipsview.row_activated += object_selected;
 	}
 
 
+
 	private void entry_changed (Editable editable) {
 		string query = "SELECT ?s WHERE { ?s fts:match \"%s*\" }".printf(((Entry)editable).text);
-		debug ("Query: %s", query);
+		//debug ("Query: %s", query);
 
 		try {
 			var result = tracker.SparqlQuery(query);
-			listmodel.clear();
+			uris.clear();
 			foreach ( var s in result) {
-//				debug ("%s", s);
+//				//debug ("%s", s);
 				TreeIter iter;
-				listmodel.append (out iter);
-				listmodel.set (iter, 0, s, -1);
+				uris.append (out iter);
+				uris.set (iter, 0, s, -1);
 			}
 
 		} catch (DBus.Error e) {
 		}
 	}
 
+	private void update_pane(string uri) {
+		//debug ("updating pane: %s", uri);
+		current_object.set_text (uri);
+
+		string query = "SELECT ?r ?o  WHERE { <%s> ?r ?o }".printf(uri);
+		//debug ("query = %s", query);
+		try {
+			var result = tracker.SparqlQuery(query);
+			relationships.clear();
+			//debug ("%d, %d", result.length[0], result.length[1]);
+
+			for (int i=0; i<result.length[0]; i++) {
+				//debug ("%s, %s", result[i,0], result[i,1]);
+				TreeIter iter;
+				relationships.append (out iter);
+				relationships.set (iter, 0, result[i,0], -1);
+				relationships.set (iter, 1, result[i,1], -1);
+			}
+
+		} catch (DBus.Error e) {
+		}
+	}
 
-	static int main (string[] args) {
-		Gtk.init (ref args);
+	private void uri_selected(TreeView view, TreePath path, TreeViewColumn column) {
+		TreeIter iter;
+		var model = view.get_model();
+		model.get_iter(out iter, path);
+		weak string uri;
+		model.get (iter, 0, out uri);
+		//debug ("uri selected: %s", uri);
+		update_pane(uri);
+	}
 
-		Explorer e = new Explorer();
-		e.setup();
-		Gtk.main ();
-		return 0;
+	private void object_selected(TreeView view, TreePath path, TreeViewColumn column) {
+		TreeIter iter;
+		var model = view.get_model();
+		model.get_iter(out iter, path);
+		weak string uri;
+		model.get (iter, 1, out uri);
+		//debug ("object selected: %s", uri);
+		update_pane(uri);
 	}
+
 }
+
+
+
+static int main (string[] args) {
+	Gtk.init (ref args);
+
+	Explorer s = new Explorer();
+	s.show();
+	Gtk.main ();
+	return 0;
+}
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]