outfit loading, yaay

This commit is contained in:
Emi Matchu 2010-11-12 16:14:08 -05:00
parent 6b92c2aa33
commit 54eb96a6de
2 changed files with 89 additions and 14 deletions

View file

@ -277,11 +277,17 @@ View.Hash = function (wardrobe) {
if(!arraysMatch(new_data.closet, data.closet)) {
wardrobe.outfit.setClosetItemsByIds(new_data.closet.slice(0));
}
} else if(!arraysMatch(new_data.objects, data.closet)) {
} else if(new_data.objects && !arraysMatch(new_data.objects, data.closet)) {
wardrobe.outfit.setClosetItemsByIds(new_data.objects.slice(0));
} else {
wardrobe.outfit.setClosetItemsByIds([]);
}
if(!arraysMatch(new_data.objects, data.objects)) {
wardrobe.outfit.setWornItemsByIds(new_data.objects.slice(0));
if(new_data.objects) {
if(!arraysMatch(new_data.objects, data.objects)) {
wardrobe.outfit.setWornItemsByIds(new_data.objects.slice(0));
}
} else {
wardrobe.outfit.setWornItemsByIds([]);
}
if(new_data.name != data.name && new_data.name) {
wardrobe.base_pet.setName(new_data.name);
@ -338,14 +344,20 @@ View.Hash = function (wardrobe) {
setInterval(checkQuery, 100);
}
wardrobe.outfit.bind('updateClosetItems', function (items) {
function singleOutfitResponse(event_name, response) {
wardrobe.outfit.bind(event_name, function () {
if(!wardrobe.outfit.in_transaction) response.apply(this, arguments);
});
}
singleOutfitResponse('updateClosetItems', function (items) {
var item_ids = items.map('id');
if(!arraysMatch(item_ids, data.closet)) {
changeQuery({closet: item_ids});
}
});
wardrobe.outfit.bind('updateWornItems', function (items) {
singleOutfitResponse('updateWornItems', function (items) {
var item_ids = items.map('id'), changes = {};
if(!arraysMatch(item_ids, data.objects)) {
changes.objects = item_ids;
@ -358,7 +370,7 @@ View.Hash = function (wardrobe) {
if(changes.objects || changes.closet) changeQuery(changes);
});
wardrobe.outfit.bind('updatePetType', function (pet_type) {
singleOutfitResponse('updatePetType', function (pet_type) {
if(pet_type.color_id != data.color || pet_type.species_id != data.species) {
changeQuery({
color: pet_type.color_id,
@ -368,17 +380,27 @@ View.Hash = function (wardrobe) {
}
});
wardrobe.outfit.bind('petTypeNotFound', function () {
singleOutfitResponse('petTypeNotFound', function () {
window.history.back();
});
wardrobe.outfit.bind('updatePetState', function (pet_state) {
singleOutfitResponse('updatePetState', function (pet_state) {
var pet_type = wardrobe.outfit.getPetType();
if(pet_state.id != data.state && pet_type && (data.state || pet_state.id != pet_type.pet_state_ids[0])) {
changeQuery({state: pet_state.id});
}
});
wardrobe.outfit.bind('setOutfit', function (outfit) {
changeQuery({
closet: outfit.getClosetItemIds(),
color: outfit.pet_type.color_id,
objects: outfit.getWornItemIds(),
species: outfit.pet_type.species_id,
state: outfit.pet_state.id
});
});
wardrobe.search.bind('updateRequest', function (request) {
if(request.offset != data.search_offset || request.query != data.search) {
changeQuery({
@ -482,6 +504,10 @@ View.Outfits = function (wardrobe) {
outfit_el.addClass('hiding').hide('normal', function () { outfit_el.remove() });
});
$('#preview-outfits h4').live('click', function () {
wardrobe.outfit.load($(this).tmplItem().data.clone());
});
$('input.outfit-url').live('mouseover', function () {
this.focus();
}).live('mouseout', function () {

View file

@ -223,15 +223,30 @@ function Wardrobe() {
new_record = true;
if(typeof data != 'undefined') {
this.color_id = data.color_id;
this.id = data.id;
this.name = data.name;
this.pet_state_id = data.pet_state_id;
this.starred = data.starred;
this.species_id = data.species_id;
this.worn_and_unworn_item_ids = data.worn_and_unworn_item_ids;
worn_item_ids = this.worn_and_unworn_item_ids.worn;
closet_item_ids = this.worn_and_unworn_item_ids.unworn.
concat(this.worn_and_unworn_item_ids.worn);
new_record = false;
}
this.closet_items = [];
this.worn_items = [];
this.getWornItemIds = function () { // TODO just expose the worn_item_ids
return worn_item_ids;
}
this.getClosetItemIds = function () { // TODO just expose the closet_item_ids
return closet_item_ids;
}
function getRestrictedZones() {
// note: may contain duplicates - loop through assets, not these, for
// best performance
@ -323,7 +338,10 @@ function Wardrobe() {
this.setClosetItemsByIds = function (ids, updateItemsCallback) {
if(ids) closet_item_ids = ids;
if(ids && ids.length) {
this.closet_items = Item.loadByIds(ids, updateItemsCallback);
Item.loadByIds(ids, function (items) {
outfit.closet_items = items;
updateItemsCallback(items);
});
} else {
this.closet_items = [];
updateItemsCallback(this.closet_items);
@ -408,6 +426,21 @@ function Wardrobe() {
return {worn_item_ids: worn_item_ids, unworn_item_ids: unworn_item_ids};
}
this.clone = function () {
return new Outfit({
color_id: outfit.color_id,
id: outfit.id,
name: outfit.name,
species_id: outfit.species_id,
starred: outfit.starred,
pet_state_id: outfit.pet_state_id,
worn_and_unworn_item_ids: {
worn: outfit.worn_and_unworn_item_ids.worn.slice(0),
unworn: outfit.worn_and_unworn_item_ids.unworn.slice(0)
}
});
}
this.destroy = function (success) {
$.ajax({
url: '/outfits/' + outfit.id + '.json',
@ -615,6 +648,12 @@ function Wardrobe() {
var controller = this;
this.events = {};
function fireEvent(event_name, subarguments) {
$.each(controller.events[event_name], function () {
this.apply(controller, subarguments);
});
}
this.bind = function (event, callback) {
if(typeof this.events[event] == 'undefined') {
this.events[event] = [];
@ -624,10 +663,7 @@ function Wardrobe() {
this.event = function (event_name) {
return function () {
var subarguments = arguments;
$.each(controller.events[event_name], function () {
this.apply(controller, subarguments);
});
fireEvent(event_name, arguments);
}
}
@ -635,7 +671,7 @@ function Wardrobe() {
var subarguments, event;
if(controller.events[event_name]) {
subarguments = Array.prototype.slice.apply(arguments, [1]);
controller.event(event_name).apply(controller, subarguments);
fireEvent(event_name, subarguments);
}
}
}
@ -645,6 +681,8 @@ function Wardrobe() {
Controller.all.Outfit = function OutfitController() {
var controller = this, outfit = new Outfit;
this.in_transaction = false;
this.closetItem = function (item) {
outfit.closetItem(
item,
@ -668,6 +706,17 @@ function Wardrobe() {
return outfit.worn_items;
}
this.load = function (new_outfit) {
outfit = new_outfit;
this.in_transaction = true;
controller.setPetTypeByColorAndSpecies(outfit.color_id, outfit.species_id);
controller.setPetStateById(outfit.pet_state_id);
controller.setClosetItemsByIds(outfit.getClosetItemIds());
controller.setWornItemsByIds(outfit.getWornItemIds());
this.in_transaction = false;
controller.events.trigger('setOutfit', outfit);
}
this.save = function (starred, name) {
outfit.starred = starred;
outfit.name = name;