Merge branch 'bug589185-docinfo-time'
This commit is contained in:
commit
6ea2822fa3
@ -14,24 +14,37 @@ const Main = imports.ui.main;
|
|||||||
/* This class represents a single display item containing information about a document.
|
/* This class represents a single display item containing information about a document.
|
||||||
*
|
*
|
||||||
* docInfo - DocInfo object containing information about the document
|
* docInfo - DocInfo object containing information about the document
|
||||||
|
* currentSeconds - current number of seconds since the epoch
|
||||||
* availableWidth - total width available for the item
|
* availableWidth - total width available for the item
|
||||||
*/
|
*/
|
||||||
function DocDisplayItem(docInfo, availableWidth) {
|
function DocDisplayItem(docInfo, currentSecs, availableWidth) {
|
||||||
this._init(docInfo, availableWidth);
|
this._init(docInfo, currentSecs, availableWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
DocDisplayItem.prototype = {
|
DocDisplayItem.prototype = {
|
||||||
__proto__: GenericDisplay.GenericDisplayItem.prototype,
|
__proto__: GenericDisplay.GenericDisplayItem.prototype,
|
||||||
|
|
||||||
_init : function(docInfo, availableWidth) {
|
_init : function(docInfo, currentSecs, availableWidth) {
|
||||||
GenericDisplay.GenericDisplayItem.prototype._init.call(this, availableWidth);
|
GenericDisplay.GenericDisplayItem.prototype._init.call(this, availableWidth);
|
||||||
this._docInfo = docInfo;
|
this._docInfo = docInfo;
|
||||||
|
|
||||||
this._setItemInfo(docInfo.name, "");
|
this._setItemInfo(docInfo.name, "");
|
||||||
|
// We take the current number of seconds here to avoid looking up the current
|
||||||
|
// time for every item
|
||||||
|
this._resetTimeDisplay(currentSecs);
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Public methods ////
|
//// Public methods ////
|
||||||
|
|
||||||
|
getUpdateTimeout: function() {
|
||||||
|
return this._timeout;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Update any relative-time based displays for this item.
|
||||||
|
redisplay: function(currentSecs) {
|
||||||
|
this._resetTimeDisplay(currentSecs);
|
||||||
|
},
|
||||||
|
|
||||||
//// Public method overrides ////
|
//// Public method overrides ////
|
||||||
|
|
||||||
// Opens a document represented by this display item.
|
// Opens a document represented by this display item.
|
||||||
@ -60,6 +73,16 @@ DocDisplayItem.prototype = {
|
|||||||
|
|
||||||
return Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.NONE,
|
return Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.NONE,
|
||||||
this._docInfo.uri, availableWidth, availableHeight);
|
this._docInfo.uri, availableWidth, availableHeight);
|
||||||
|
},
|
||||||
|
|
||||||
|
//// Private Methods ////
|
||||||
|
|
||||||
|
_resetTimeDisplay: function(currentSecs) {
|
||||||
|
let lastSecs = this._docInfo.lastVisited().getTime() / 1000;
|
||||||
|
let timeDelta = currentSecs - lastSecs;
|
||||||
|
let [text, nextUpdate] = Shell.Global.get().format_time_relative_pretty(timeDelta);
|
||||||
|
this._timeout = nextUpdate;
|
||||||
|
this._setDescriptionText(text);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -79,6 +102,9 @@ DocDisplay.prototype = {
|
|||||||
GenericDisplay.GenericDisplay.prototype._init.call(this, width);
|
GenericDisplay.GenericDisplay.prototype._init.call(this, width);
|
||||||
let me = this;
|
let me = this;
|
||||||
|
|
||||||
|
this._updateTimeoutTarget = 0;
|
||||||
|
this._updateTimeoutId = 0;
|
||||||
|
|
||||||
this._docManager = DocInfo.getDocManager(GenericDisplay.ITEM_DISPLAY_ICON_SIZE);
|
this._docManager = DocInfo.getDocManager(GenericDisplay.ITEM_DISPLAY_ICON_SIZE);
|
||||||
this._docsStale = true;
|
this._docsStale = true;
|
||||||
this._docManager.connect('changed', function(mgr, userData) {
|
this._docManager.connect('changed', function(mgr, userData) {
|
||||||
@ -89,6 +115,11 @@ DocDisplay.prototype = {
|
|||||||
// which might be edited by someone else.
|
// which might be edited by someone else.
|
||||||
me._redisplay(false);
|
me._redisplay(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.connect('destroy', Lang.bind(this, function (o) {
|
||||||
|
if (this._updateTimeoutId > 0)
|
||||||
|
Mainloop.source_remove(this._updateTimeoutId);
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Protected method overrides ////
|
//// Protected method overrides ////
|
||||||
@ -165,7 +196,25 @@ DocDisplay.prototype = {
|
|||||||
|
|
||||||
// Creates a DocDisplayItem based on itemInfo, which is expected to be a DocInfo object.
|
// Creates a DocDisplayItem based on itemInfo, which is expected to be a DocInfo object.
|
||||||
_createDisplayItem: function(itemInfo, width) {
|
_createDisplayItem: function(itemInfo, width) {
|
||||||
return new DocDisplayItem(itemInfo, width);
|
let currentSecs = new Date().getTime() / 1000;
|
||||||
|
let doc = new DocDisplayItem(itemInfo, currentSecs, width);
|
||||||
|
if (doc.getUpdateTimeout() < this._updateTimeoutTarget) {
|
||||||
|
if (this._updateTimeoutId > 0)
|
||||||
|
Mainloop.source_remove(this._updateTimeoutId);
|
||||||
|
this._updateTimeoutId = Mainloop.timeout_add_seconds(doc.getUpdateTimeout(), Lang.bind(this, this._docTimeout));
|
||||||
|
this._updateTimeoutTarget = doc.getUpdateTimeout();
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
},
|
||||||
|
|
||||||
|
//// Private Methods ////
|
||||||
|
_docTimeout: function () {
|
||||||
|
let currentSecs = new Date().getTime() / 1000;
|
||||||
|
for (let docId in this._allItems) {
|
||||||
|
let doc = this._allItems[docId];
|
||||||
|
doc.redisplay(currentSecs);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -287,6 +287,10 @@ GenericDisplayItem.prototype = {
|
|||||||
this.actor.add_actor(this._description);
|
this.actor.add_actor(this._description);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setDescriptionText: function(text) {
|
||||||
|
this._description.text = text;
|
||||||
|
},
|
||||||
|
|
||||||
//// Virtual protected methods ////
|
//// Virtual protected methods ////
|
||||||
|
|
||||||
// Creates and returns a large preview icon, but only if we have a detailed image.
|
// Creates and returns a large preview icon, but only if we have a detailed image.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dbus/dbus-glib.h>
|
#include <dbus/dbus-glib.h>
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
#include <glib/gi18n.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
@ -963,6 +964,44 @@ root_pixmap_destroy (GObject *sender, gpointer data)
|
|||||||
global->root_pixmap = NULL;
|
global->root_pixmap = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_global_format_time_relative_pretty:
|
||||||
|
* @global:
|
||||||
|
* @delta: Time in seconds since the current time
|
||||||
|
* @text: (out): Relative human-consumption-only time string
|
||||||
|
* @next_update: (out): Time in seconds until we should redisplay the time
|
||||||
|
*
|
||||||
|
* Format a time value for human consumption only. The passed time
|
||||||
|
* value is a delta in terms of seconds from the current time.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_global_format_time_relative_pretty (ShellGlobal *global,
|
||||||
|
guint delta,
|
||||||
|
char **text,
|
||||||
|
guint *next_update)
|
||||||
|
{
|
||||||
|
#define MINUTE (60)
|
||||||
|
#define HOUR (MINUTE*60)
|
||||||
|
#define DAY (HOUR*24)
|
||||||
|
#define WEEK (DAY*7)
|
||||||
|
if (delta < MINUTE) {
|
||||||
|
*text = g_strdup (_("Less than a minute ago"));
|
||||||
|
*next_update = MINUTE - delta;
|
||||||
|
} else if (delta < HOUR) {
|
||||||
|
*text = g_strdup_printf (ngettext ("%d minute ago", "%d minutes ago", delta / MINUTE), delta / MINUTE);
|
||||||
|
*next_update = MINUTE*(delta-MINUTE + 1) - delta;
|
||||||
|
} else if (delta < DAY) {
|
||||||
|
*text = g_strdup_printf (ngettext ("%d hour ago", "%d hours ago", delta / HOUR), delta / HOUR);
|
||||||
|
*next_update = HOUR*(delta-HOUR + 1) - delta;
|
||||||
|
} else if (delta < WEEK) {
|
||||||
|
*text = g_strdup_printf (ngettext ("%d day ago", "%d days ago", delta / DAY), delta / DAY);
|
||||||
|
*next_update = DAY*(delta-DAY + 1) - delta;
|
||||||
|
} else {
|
||||||
|
*text = g_strdup_printf (ngettext ("%d week ago", "%d weeks ago", delta / WEEK), delta / WEEK);
|
||||||
|
*next_update = WEEK*(delta-WEEK + 1) - delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_create_root_pixmap_actor:
|
* shell_global_create_root_pixmap_actor:
|
||||||
* @global: a #ShellGlobal
|
* @global: a #ShellGlobal
|
||||||
|
@ -77,6 +77,8 @@ ClutterCairoTexture *shell_global_create_vertical_gradient (ClutterColor *top,
|
|||||||
ClutterCairoTexture *shell_global_create_horizontal_gradient (ClutterColor *left,
|
ClutterCairoTexture *shell_global_create_horizontal_gradient (ClutterColor *left,
|
||||||
ClutterColor *right);
|
ClutterColor *right);
|
||||||
|
|
||||||
|
void shell_global_format_time_relative_pretty (ShellGlobal *global, guint delta, char **text, guint *update_time);
|
||||||
|
|
||||||
ClutterActor *shell_global_create_root_pixmap_actor (ShellGlobal *global);
|
ClutterActor *shell_global_create_root_pixmap_actor (ShellGlobal *global);
|
||||||
|
|
||||||
void shell_global_clutter_cairo_texture_draw_clock (ClutterCairoTexture *texture,
|
void shell_global_clutter_cairo_texture_draw_clock (ClutterCairoTexture *texture,
|
||||||
|
Loading…
Reference in New Issue
Block a user