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) {
// 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);
});
}
};

View file

@ -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);
});
},

View file

@ -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();

View file

@ -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);
};

View file

@ -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);
};

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 () {
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)

View file

@ -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();

View file

@ -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);
}
},

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'),
$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();