[indent=4]
/*
* Copyright (C) 2009, Jamie McCracken (jamiemcc at gnome org)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
uses
Gtk
Cairo
Pango
TrackerUtils
class TrackerMetadataTile : EventBox
uri : string
category : Categories
image : Image
name_link : LinkButton
path_link : LinkButton
table : Table
/* metadata fields */
name_label : Label
path_label : Label
info_label1 : Label
info_value1 : Label
info_label2 : Label
info_value2 : Label
info_label3 : Label
info_value3 : Label
info_label4 : Label
info_value4 : Label
info_label5 : Label
info_value5 : Label
info_label6 : Label
info_value6 : Label
_result_grid : TrackerResultGrid
prop Query : TrackerQuery
prop ResultGrid : TrackerResultGrid
get
return _result_grid
set
if value is not null
_result_grid = value
_result_grid.SelectionChanged += def (path)
LoadUri (path)
init
set_app_paintable (true)
expose_event += expose
border_width = 0
table = new Table (5, 7, false)
table.set_col_spacings (3)
table.set_row_spacings (3)
add (table)
image = new Image.from_icon_name ("text-x-generic", IconSize.DIALOG)
image.set_pixel_size (75)
table.attach (image, 0, 1, 0, 5, AttachOptions.FILL, AttachOptions.FILL, 12, 0)
name_link = new LinkButton ("")
name_link.xalign = 0
name_label = CreateLabel (N_("Name:"), false)
AttachToTable (name_label, 1, 2, 0, 1, false)
table.attach (name_link, 2, 3, 0, 1, AttachOptions.FILL, AttachOptions.FILL, 0, 0)
path_link = new LinkButton ("")
path_link.xalign = 0
path_label = CreateLabel (N_("Folder:"), false)
AttachToTable (path_label, 3, 4, 0, 1, false)
table.attach (path_link, 4, 7, 0, 1, AttachOptions.FILL, AttachOptions.FILL, 0, 0)
info_label1 = CreateLabel (N_("Type:"), false)
AttachToTable (info_label1, 1, 2, 1, 2, false)
info_value1 = CreateLabel ("-", true)
AttachToTable (info_value1, 2, 3, 1, 2, true)
info_label2 = CreateLabel (N_("Size:"), false)
AttachToTable (info_label2, 3, 4, 1, 2, false)
info_value2 = CreateLabel ("-", true)
AttachToTable (info_value2, 4, 5, 1, 2, true)
info_label3 = CreateLabel (N_("Modified:"), false)
AttachToTable (info_label3, 5, 6, 1, 2, false)
info_value3 = CreateLabel ("-", true)
AttachToTable (info_value3, 6, 7, 1, 2, true)
info_label4 = CreateLabel ("", false)
AttachToTable (info_label4, 1, 2, 2, 3, false)
info_value4 = CreateLabel ("-", true)
AttachToTable (info_value4, 2, 3, 2, 3, true)
info_label5 = CreateLabel ("", false)
AttachToTable (info_label5, 3, 4, 2, 3, false)
info_value5 = CreateLabel ("-", true)
AttachToTable (info_value5, 4, 5, 2, 3, true)
info_label6 = CreateLabel ("", false)
AttachToTable (info_label6, 5, 6, 2, 3, false)
info_value6 = CreateLabel ("-", true)
AttachToTable (info_value6, 6, 7, 2, 3, true)
ClearLabels ()
def private expose (e : Gdk.EventExpose) : bool
var cr = Gdk.cairo_create (self.window)
var style = self.get_style ()
var step1 = style.bg [StateType.NORMAL]
var step2 = style.bg [StateType.SELECTED]
w,h : double
w = self.allocation.width
h = self.allocation.height
/* clear window to base[NORMAL] */
cr.set_operator (Operator.SOURCE)
Gdk.cairo_set_source_color (cr, step1)
cr.paint ()
cr.move_to (0, 0)
cr.set_line_width (1.0)
cr.set_operator (Operator.OVER)
/* main gradient */
var pat = new Pattern.linear (0.0, 0.0, 0.0, h)
pat.add_color_stop_rgba (0.0, step2.red/65535.0, step2.green/65535.0, step2.blue/65535.0, 0.05)
pat.add_color_stop_rgba (1.0, step2.red/65535.0, step2.green/65535.0, step2.blue/65535.0, 0.5)
cr.rectangle (0, 0, w, h)
cr.set_source (pat)
cr.fill ()
/* border line */
cr.set_source_rgba (step2.red/65535.0, step2.green/65535.0, step2.blue/65535.0, 0.7)
cr.move_to (0, 0)
cr.line_to (w, 0)
cr.stroke ()
/* highlight line */
cr.set_source_rgba (1.0, 1.0, 1.0, 0.5)
cr.move_to (0, 1)
cr.line_to (w, 1)
cr.stroke ()
return super.expose_event (e)
def private AttachToTable (lab : Label, l : int, r : int, t : int, b : int, e : bool)
if e is true
table.attach (lab, l, r, t, b, AttachOptions.FILL | AttachOptions.EXPAND , AttachOptions.FILL, 0, 0)
else
table.attach (lab, l, r, t, b, AttachOptions.FILL, AttachOptions.FILL, 0, 0)
def private CreateLabel (s : string, e : bool) : Label
var l = new Label (s)
l.xalign = 0
l.set_use_markup (true)
if e is true
l.ellipsize = Pango.EllipsizeMode.END
return l
def ClearLabels ()
info_value1.set_text ("")
info_value2.set_text ("")
info_value3.set_text ("")
info_value4.set_text ("")
info_value5.set_text ("")
info_value6.set_text ("")
info_label1.set_text (N_("Type:"))
info_label4.set_text ("")
info_label5.set_text ("")
info_label6.set_text ("")
name_link.uri = ""
name_link.label = ""
path_link.uri = ""
path_link.label = ""
name_link.set_sensitive (false)
name_link.show ()
path_link.set_sensitive (false)
path_link.show ()
name_label.show ()
path_label.show ()
info_label1.show ()
info_label2.show ()
info_label3.show ()
def SetLabelValue (label : Label, val : string)
var val1 = "%s".printf (val)
label.set_markup (val1)
label.xalign = 0
def SetLabelSizeValue (label : Label, size: int64)
var val1 = "%s".printf (FormatFileSize (size))
label.set_markup (val1)
label.xalign = 0
def SetLabelUrnValue (label : Label, val : string)
var value = val
var values = val.split (":")
for s in values
value = s
var escapes = value.split ("%20")
value = ""
for s in escapes
value += s + " "
var val1 = "%s".printf (value)
label.set_markup (val1)
label.xalign = 0
def private GetCategory (uri : string) : Categories
var query = "SELECT rdf:type(?s) WHERE { ?s nie:url \"%s\" }".printf(uri)
var results = Query.Query (query)
var res = ""
if results is null
print "Query result is null!"
else
res = results[0]
if res.contains ("nfo#Video") do return Categories.Video
if res.contains ("nfo#Image") do return Categories.Image
if res.contains ("nfo#Audio") do return Categories.Audio
if res.contains ("nmo#Email") do return Categories.Email
if res.contains ("nfo#Document") do return Categories.Document
if res.contains ("nfo#Software") do return Categories.Application
if res.contains ("nfo#Folder") do return Categories.Folder
return Categories.File
def private DisplayFileDetails (uri : string, mime : string)
var file = File.new_for_uri (uri)
var displaypath = file.get_parent ()
name_link.uri = uri
path_link.uri = displaypath.get_uri ()
path_link.label = displaypath.get_parse_name ()
link_label : Label
link_label = (Label) path_link.get_child ()
link_label.set_ellipsize (EllipsizeMode.MIDDLE)
link_label = (Label) name_link.get_child ()
link_label.set_ellipsize (EllipsizeMode.MIDDLE)
if mime is not null
SetLabelValue (info_value1, mime)
try
var info = file.query_info ("standard::size,time::modified,standard::display-name", \
FileQueryInfoFlags.NONE, null)
SetLabelSizeValue (info_value2, info.get_size())
name_link.label = info.get_display_name ()
tm : TimeVal
info.get_modification_time (out tm)
var val3 = "%s".printf (tm.to_iso8601 ())
info_value3.set_markup (val3)
except e:Error
var filepath = file.get_basename ()
name_link.label = filepath
print "Could not get file info for %s", uri
def private DisplayImageDetails (uri : string)
var query = "SELECT nfo:height(?s) nfo:width(?s) WHERE { ?s nie:url \"%s\" }".printf(uri)
var result = Query.Query (query)
info_label4.set_text (N_("Height:"))
info_label5.set_text (N_("Width:"))
if result is null or result[0] is null do return
SetLabelValue (info_value4, result[0])
SetLabelValue (info_value5, result[1])
def private DisplayAudioDetails (uri : string)
var query = "SELECT nie:title(?s) nmm:performer(?s) nmm:musicAlbum(?s) WHERE { ?s nie:url \"%s\" }".printf(uri)
var result = Query.Query (query)
info_label4.set_text (N_("Title:"))
info_label5.set_text (N_("Artist:"))
info_label6.set_text (N_("Album:"))
if result is null or result[0] is null do return
SetLabelValue (info_value4, result[0])
SetLabelUrnValue (info_value5, result[1])
SetLabelUrnValue (info_value6, result[2])
def private DisplayVideoDetails (uri : string)
var query = "SELECT nfo:height(?s) nfo:width(?s) nfo:duration (?s) WHERE { ?s nie:url \"%s\" }".printf(uri)
var result = Query.Query (query)
info_label4.set_text (N_("Height:"))
info_label5.set_text (N_("Width:"))
info_label6.set_text (N_("Duration:"))
if result is null or result[0] is null do return
SetLabelValue (info_value4, result[0])
SetLabelValue (info_value5, result[1])
SetLabelValue (info_value6, result[2])
def private DisplayEmailDetails (uri : string)
var query = "SELECT nmo:messageSubject(?e) nco:fullname(?s) nmo:receivedDate(?e) WHERE { ?e nie:url \"%s\" ; nmo:from ?s }".printf(uri)
var result = Query.Query (query)
name_label.hide ()
name_link.hide ()
path_link.hide ()
path_label.hide ()
info_label2.hide ()
info_label1.set_text (N_("Subject:"))
info_label4.set_text (N_("From:"))
info_label3.set_text (N_("Received:"))
if result is null or result[0] is null do return
SetLabelValue (info_value1, result[0])
SetLabelValue (info_value4, result[1])
SetLabelValue (info_value3, result[2])
def private DisplayDocumentDetails (uri : string)
var query = "SELECT nie:title(?s) nco:fullname(?c) nfo:pageCount(?s) WHERE { ?s nie:url \"%s\" ; nco:creator ?c }".printf(uri)
var result = Query.Query (query)
info_label4.set_text (N_("Title:"))
info_label5.set_text (N_("Author:"))
info_label6.set_text (N_("Page count:"))
if result is null or result[0] is null do return
SetLabelValue (info_value4, result[0])
SetLabelValue (info_value5, result[1])
SetLabelValue (info_value6, result[2])
def private DisplayApplicationDetails (uri : string)
app_info : AppInfo
var file = File.new_for_uri (uri)
app_info = new DesktopAppInfo.from_filename (file.get_path ())
if app_info is null
DisplayFileDetails (uri, "")
return
//name_link.set_sensitive (false)
path_link.set_sensitive (false)
path_label.hide ()
info_label2.hide ()
info_label3.hide ()
name_link.uri = uri
name_link.label = app_info.get_display_name ()
info_label1.set_text (N_("Description:"))
var description = app_info.get_description ()
if description is not null
SetLabelValue (info_value1, description)
def LoadUri (path : TreePath?)
ClearLabels ()
if path is null
image.set_from_icon_name ("text-x-generic", IconSize.DIALOG)
return
name_link.set_sensitive (true)
path_link.set_sensitive (true);
iter : TreeIter
id, uri, mime: weak string
icon : Gdk.Pixbuf
_result_grid.store.get_iter (out iter, path)
_result_grid.store.get (iter, ResultColumns.Id, out id, ResultColumns.Uri, out uri, ResultColumns.Mime, out mime, ResultColumns.Icon, out icon)
image.set_from_pixbuf (icon)
/* determine category type */
var cat = GetCategory (uri)
if cat is not Categories.Application and cat is not Categories.Email
DisplayFileDetails (uri, mime)
case cat
when Categories.Audio do DisplayAudioDetails (uri)
when Categories.Video do DisplayVideoDetails (uri)
when Categories.Image do DisplayImageDetails (uri)
when Categories.Email do DisplayEmailDetails (uri)
when Categories.Document do DisplayDocumentDetails (uri)
when Categories.Application do DisplayApplicationDetails (uri)
default do return