From 2819fd8496870ca2caf1aadd2769045cf0771218 Mon Sep 17 00:00:00 2001 From: Lars Jung Date: Fri, 26 Oct 2012 00:30:52 +0200 Subject: [PATCH] Improves event system. --- src/_h5ai/client/js/inc/core/event.js | 6 ++++-- src/_h5ai/client/js/inc/core/location.js | 15 ++++++++++++- src/_h5ai/client/js/inc/ext/autorefresh.js | 22 ++++++++++++++----- src/_h5ai/client/js/inc/ext/preview-img.js | 7 +++++- src/_h5ai/client/js/inc/ext/preview-txt.js | 7 +++++- src/_h5ai/client/js/inc/ext/select.js | 25 ++++++++++++++++------ src/_h5ai/client/js/inc/ext/thumbnails.js | 10 +++++---- src/_h5ai/client/js/inc/model/entry.js | 20 ----------------- src/_h5ai/client/js/inc/view/items.js | 13 ++++------- 9 files changed, 75 insertions(+), 50 deletions(-) diff --git a/src/_h5ai/client/js/inc/core/event.js b/src/_h5ai/client/js/inc/core/event.js index 14fd0d61..ad94b3cb 100644 --- a/src/_h5ai/client/js/inc/core/event.js +++ b/src/_h5ai/client/js/inc/core/event.js @@ -24,12 +24,14 @@ modulejs.define('core/event', ['_'], function (_) { pub = function (topic, data) { - // console.log('EVENT PUB', topic, data); + var args = Array.prototype.slice.call(arguments, 1); + + // console.log('EVENT PUB', topic, args); if (_.isString(topic) && subscriptions[topic]) { _.each(subscriptions[topic], function (callback) { - callback(data); + callback.apply(topic, args); }); } }; diff --git a/src/_h5ai/client/js/inc/core/location.js b/src/_h5ai/client/js/inc/core/location.js index 253f98ac..886354ff 100644 --- a/src/_h5ai/client/js/inc/core/location.js +++ b/src/_h5ai/client/js/inc/core/location.js @@ -104,6 +104,8 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event setLocation = function (newAbsHref, keepBrowserUrl) { + event.pub('location.beforeChange'); + newAbsHref = encodedHref(newAbsHref); if (absHref !== newAbsHref) { @@ -127,8 +129,19 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event refresh = function () { + + var item = getItem(), + oldItems = _.values(item.content); + + event.pub('location.beforeRefresh'); + load(function () { - event.pub('location.refreshed', getItem()); + + var newItems = _.values(item.content), + added = _.difference(newItems, oldItems), + removed = _.difference(oldItems, newItems); + + event.pub('location.refreshed', item, added, removed); }); }, diff --git a/src/_h5ai/client/js/inc/ext/autorefresh.js b/src/_h5ai/client/js/inc/ext/autorefresh.js index 43e4b020..dba4dcc4 100644 --- a/src/_h5ai/client/js/inc/ext/autorefresh.js +++ b/src/_h5ai/client/js/inc/ext/autorefresh.js @@ -6,10 +6,22 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'co interval: 5000 }, allsettings.autorefresh), + timeoutId = null, + heartbeat = function () { location.refresh(); - setTimeout(heartbeat, settings.interval); + }, + + before = function () { + + clearTimeout(timeoutId); + }, + + after = function () { + + clearTimeout(timeoutId); + timeoutId = setTimeout(heartbeat, settings.interval); }, init = function () { @@ -20,10 +32,10 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'co settings.interval = Math.max(1000, settings.interval); - event.sub('ready', function () { - - setTimeout(heartbeat, settings.interval); - }); + event.sub('location.beforeChange', before); + event.sub('location.beforeRefresh', before); + event.sub('location.changed', after); + event.sub('location.refreshed', after); }; init(); diff --git a/src/_h5ai/client/js/inc/ext/preview-img.js b/src/_h5ai/client/js/inc/ext/preview-img.js index c4a140e1..5ab79e02 100644 --- a/src/_h5ai/client/js/inc/ext/preview-img.js +++ b/src/_h5ai/client/js/inc/ext/preview-img.js @@ -224,6 +224,11 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/settings', 'core/resource', _.each(item.content, initEntry); }, + onLocationRefreshed = function (item, added, removed) { + + _.each(added, initEntry); + }, + init = function () { if (!settings.enabled) { @@ -280,7 +285,7 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/settings', 'core/resource', }); event.sub('location.changed', onLocationChanged); - event.sub('entry.created', initEntry); + event.sub('location.refreshed', onLocationRefreshed); $(window).on('resize load', adjustSize); }; diff --git a/src/_h5ai/client/js/inc/ext/preview-txt.js b/src/_h5ai/client/js/inc/ext/preview-txt.js index 304d5de5..7efc3c96 100644 --- a/src/_h5ai/client/js/inc/ext/preview-txt.js +++ b/src/_h5ai/client/js/inc/ext/preview-txt.js @@ -275,6 +275,11 @@ modulejs.define('ext/preview-txt', ['_', '$', 'core/settings', 'core/resource', _.each(item.content, initEntry); }, + onLocationRefreshed = function (item, added, removed) { + + _.each(added, initEntry); + }, + init = function () { if (!settings.enabled) { @@ -303,7 +308,7 @@ modulejs.define('ext/preview-txt', ['_', '$', 'core/settings', 'core/resource', }); event.sub('location.changed', onLocationChanged); - event.sub('entry.created', initEntry); + event.sub('location.refreshed', onLocationRefreshed); $(window).on('resize load', adjustSize); }; diff --git a/src/_h5ai/client/js/inc/ext/select.js b/src/_h5ai/client/js/inc/ext/select.js index 6ae2f4c1..0b2f5c3f 100644 --- a/src/_h5ai/client/js/inc/ext/select.js +++ b/src/_h5ai/client/js/inc/ext/select.js @@ -111,6 +111,23 @@ modulejs.define('ext/select', ['_', '$', 'core/settings', 'core/event'], functio } }, + onLocationRefreshed = function (item, added, removed) { + + var selectionChanged = false; + + _.each(removed, function (item) { + + if (item.$extended && item.$extended.hasClass('selected')) { + item.$extended.removeClass('selected'); + selectionChanged = true; + } + }); + + if (selectionChanged) { + publish(); + } + }, + init = function () { if (!settings.enabled) { @@ -119,13 +136,7 @@ modulejs.define('ext/select', ['_', '$', 'core/settings', 'core/event'], functio $selectionRect.hide().appendTo('body'); - event.sub('entry.removed', function (entry) { - - if (entry.$extended && entry.$extended.hasClass('selected')) { - entry.$extended.removeClass('selected'); - publish(); - } - }); + event.sub('location.refreshed', onLocationRefreshed); $document .on('mousedown', '.noSelection', noSelection) diff --git a/src/_h5ai/client/js/inc/ext/thumbnails.js b/src/_h5ai/client/js/inc/ext/thumbnails.js index d5e65f5d..fd2d8aff 100644 --- a/src/_h5ai/client/js/inc/ext/thumbnails.js +++ b/src/_h5ai/client/js/inc/ext/thumbnails.js @@ -61,6 +61,11 @@ modulejs.define('ext/thumbnails', ['_', 'core/settings', 'core/event', 'core/ser }, settings.delay); }, + onLocationRefreshed = function (item, added, removed) { + + _.each(added, checkEntry); + }, + init = function () { if (!settings.enabled || !server.api) { @@ -68,10 +73,7 @@ modulejs.define('ext/thumbnails', ['_', 'core/settings', 'core/event', 'core/ser } event.sub('location.changed', onLocationChanged); - event.sub('entry.created', function (entry) { - - checkEntry(entry); - }); + event.sub('location.refreshed', onLocationRefreshed); }; init(); diff --git a/src/_h5ai/client/js/inc/model/entry.js b/src/_h5ai/client/js/inc/model/entry.js index 8e2defb4..fbb6248e 100644 --- a/src/_h5ai/client/js/inc/model/entry.js +++ b/src/_h5ai/client/js/inc/model/entry.js @@ -51,39 +51,21 @@ modulejs.define('model/entry', ['_', 'core/types', 'core/event', 'core/settings' return null; } - var created = !cache[absHref], - changed = false; - var self = cache[absHref] || new Entry(absHref); if (_.isNumber(time)) { - if (self.time !== time) { - changed = true; - } self.time = time; } if (_.isNumber(size)) { - if (self.size !== size) { - changed = true; - } self.size = size; } if (status) { - if (self.status !== status) { - changed = true; - } self.status = status; } if (isContentFetched) { self.isContentFetched = true; } - if (created) { - event.pub('entry.created', self); - } else if (changed) { - event.pub('entry.changed', self); - } - return self; }, @@ -102,8 +84,6 @@ modulejs.define('model/entry', ['_', 'core/types', 'core/event', 'core/settings' removeEntry(entry.absHref); }); - - event.pub('entry.removed', self); } }, diff --git a/src/_h5ai/client/js/inc/view/items.js b/src/_h5ai/client/js/inc/view/items.js index f5d5420c..5070538e 100644 --- a/src/_h5ai/client/js/inc/view/items.js +++ b/src/_h5ai/client/js/inc/view/items.js @@ -119,23 +119,18 @@ modulejs.define('view/items', ['_', '$', 'core/settings', 'core/resource', 'core } }, - onLocationRefreshed = function (item) { + onLocationRefreshed = function (item, added, removed) { var $extended = $('#extended'), $ul = $extended.find('ul'), - $empty = $extended.find('.empty'), - $items = $ul.find('.entry:not(.folder-parent)'), - currentItems = _.map($items.get(), function (i) { return $(i).data('entry'); }), - refreshedItems = _.values(item.content), - create = _.difference(refreshedItems, currentItems), - remove = _.difference(currentItems, refreshedItems); + $empty = $extended.find('.empty'); - _.each(create, function (item) { + _.each(added, function (item) { update(item, true).hide().appendTo($ul).fadeIn(400); }); - _.each(remove, function (item) { + _.each(removed, function (item) { item.$extended.fadeOut(400, function () { item.$extended.remove();