Improves event system.

This commit is contained in:
Lars Jung 2012-10-26 00:30:52 +02:00
parent 34eed09537
commit 2819fd8496
9 changed files with 75 additions and 50 deletions

View file

@ -24,12 +24,14 @@ modulejs.define('core/event', ['_'], function (_) {
pub = function (topic, data) { 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]) { if (_.isString(topic) && subscriptions[topic]) {
_.each(subscriptions[topic], function (callback) { _.each(subscriptions[topic], function (callback) {
callback(data); callback.apply(topic, args);
}); });
} }
}; };

View file

@ -104,6 +104,8 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event
setLocation = function (newAbsHref, keepBrowserUrl) { setLocation = function (newAbsHref, keepBrowserUrl) {
event.pub('location.beforeChange');
newAbsHref = encodedHref(newAbsHref); newAbsHref = encodedHref(newAbsHref);
if (absHref !== newAbsHref) { if (absHref !== newAbsHref) {
@ -127,8 +129,19 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event
refresh = function () { refresh = function () {
var item = getItem(),
oldItems = _.values(item.content);
event.pub('location.beforeRefresh');
load(function () { 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);
}); });
}, },

View file

@ -6,10 +6,22 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'co
interval: 5000 interval: 5000
}, allsettings.autorefresh), }, allsettings.autorefresh),
timeoutId = null,
heartbeat = function () { heartbeat = function () {
location.refresh(); location.refresh();
setTimeout(heartbeat, settings.interval); },
before = function () {
clearTimeout(timeoutId);
},
after = function () {
clearTimeout(timeoutId);
timeoutId = setTimeout(heartbeat, settings.interval);
}, },
init = function () { init = function () {
@ -20,10 +32,10 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'co
settings.interval = Math.max(1000, settings.interval); settings.interval = Math.max(1000, settings.interval);
event.sub('ready', function () { event.sub('location.beforeChange', before);
event.sub('location.beforeRefresh', before);
setTimeout(heartbeat, settings.interval); event.sub('location.changed', after);
}); event.sub('location.refreshed', after);
}; };
init(); init();

View file

@ -224,6 +224,11 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/settings', 'core/resource',
_.each(item.content, initEntry); _.each(item.content, initEntry);
}, },
onLocationRefreshed = function (item, added, removed) {
_.each(added, initEntry);
},
init = function () { init = function () {
if (!settings.enabled) { if (!settings.enabled) {
@ -280,7 +285,7 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/settings', 'core/resource',
}); });
event.sub('location.changed', onLocationChanged); event.sub('location.changed', onLocationChanged);
event.sub('entry.created', initEntry); event.sub('location.refreshed', onLocationRefreshed);
$(window).on('resize load', adjustSize); $(window).on('resize load', adjustSize);
}; };

View file

@ -275,6 +275,11 @@ modulejs.define('ext/preview-txt', ['_', '$', 'core/settings', 'core/resource',
_.each(item.content, initEntry); _.each(item.content, initEntry);
}, },
onLocationRefreshed = function (item, added, removed) {
_.each(added, initEntry);
},
init = function () { init = function () {
if (!settings.enabled) { if (!settings.enabled) {
@ -303,7 +308,7 @@ modulejs.define('ext/preview-txt', ['_', '$', 'core/settings', 'core/resource',
}); });
event.sub('location.changed', onLocationChanged); event.sub('location.changed', onLocationChanged);
event.sub('entry.created', initEntry); event.sub('location.refreshed', onLocationRefreshed);
$(window).on('resize load', adjustSize); $(window).on('resize load', adjustSize);
}; };

View file

@ -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 () { init = function () {
if (!settings.enabled) { if (!settings.enabled) {
@ -119,13 +136,7 @@ modulejs.define('ext/select', ['_', '$', 'core/settings', 'core/event'], functio
$selectionRect.hide().appendTo('body'); $selectionRect.hide().appendTo('body');
event.sub('entry.removed', function (entry) { event.sub('location.refreshed', onLocationRefreshed);
if (entry.$extended && entry.$extended.hasClass('selected')) {
entry.$extended.removeClass('selected');
publish();
}
});
$document $document
.on('mousedown', '.noSelection', noSelection) .on('mousedown', '.noSelection', noSelection)

View file

@ -61,6 +61,11 @@ modulejs.define('ext/thumbnails', ['_', 'core/settings', 'core/event', 'core/ser
}, settings.delay); }, settings.delay);
}, },
onLocationRefreshed = function (item, added, removed) {
_.each(added, checkEntry);
},
init = function () { init = function () {
if (!settings.enabled || !server.api) { 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('location.changed', onLocationChanged);
event.sub('entry.created', function (entry) { event.sub('location.refreshed', onLocationRefreshed);
checkEntry(entry);
});
}; };
init(); init();

View file

@ -51,39 +51,21 @@ modulejs.define('model/entry', ['_', 'core/types', 'core/event', 'core/settings'
return null; return null;
} }
var created = !cache[absHref],
changed = false;
var self = cache[absHref] || new Entry(absHref); var self = cache[absHref] || new Entry(absHref);
if (_.isNumber(time)) { if (_.isNumber(time)) {
if (self.time !== time) {
changed = true;
}
self.time = time; self.time = time;
} }
if (_.isNumber(size)) { if (_.isNumber(size)) {
if (self.size !== size) {
changed = true;
}
self.size = size; self.size = size;
} }
if (status) { if (status) {
if (self.status !== status) {
changed = true;
}
self.status = status; self.status = status;
} }
if (isContentFetched) { if (isContentFetched) {
self.isContentFetched = true; self.isContentFetched = true;
} }
if (created) {
event.pub('entry.created', self);
} else if (changed) {
event.pub('entry.changed', self);
}
return self; return self;
}, },
@ -102,8 +84,6 @@ modulejs.define('model/entry', ['_', 'core/types', 'core/event', 'core/settings'
removeEntry(entry.absHref); removeEntry(entry.absHref);
}); });
event.pub('entry.removed', self);
} }
}, },

View file

@ -119,23 +119,18 @@ modulejs.define('view/items', ['_', '$', 'core/settings', 'core/resource', 'core
} }
}, },
onLocationRefreshed = function (item) { onLocationRefreshed = function (item, added, removed) {
var $extended = $('#extended'), var $extended = $('#extended'),
$ul = $extended.find('ul'), $ul = $extended.find('ul'),
$empty = $extended.find('.empty'), $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);
_.each(create, function (item) { _.each(added, function (item) {
update(item, true).hide().appendTo($ul).fadeIn(400); update(item, true).hide().appendTo($ul).fadeIn(400);
}); });
_.each(remove, function (item) { _.each(removed, function (item) {
item.$extended.fadeOut(400, function () { item.$extended.fadeOut(400, function () {
item.$extended.remove(); item.$extended.remove();