Skip to content

Commit

Permalink
Revert Refactors View rendering into Ember.States
Browse files Browse the repository at this point in the history
  • Loading branch information
krisselden committed Jun 11, 2012
1 parent 960bbe0 commit fd2e1bd
Show file tree
Hide file tree
Showing 11 changed files with 268 additions and 290 deletions.
2 changes: 1 addition & 1 deletion Assetfile
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ end

distros = {
:runtime => %w(ember-metal ember-runtime),
:full => %w(handlebars ember-metal ember-runtime ember-application ember-states ember-views ember-viewstates metamorph ember-handlebars)
:full => %w(handlebars ember-metal ember-runtime ember-application ember-views ember-states ember-viewstates metamorph ember-handlebars)
}

output "dist"
Expand Down
2 changes: 1 addition & 1 deletion packages/ember-handlebars/lib/views/metamorph_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ var DOMManager = {
view.invalidateRecursively('element');
view._notifyWillInsertElement();
morph.replaceWith(buffer.string());
view.transitionTo('hasElement.inDOM');
view.transitionTo('inDOM');
view._notifyDidInsertElement();
});
},
Expand Down
1 change: 0 additions & 1 deletion packages/ember-views/lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@
require("ember-runtime");
require("ember-views/core");
require("ember-views/system");
require("ember-states");
require("ember-views/views");
146 changes: 63 additions & 83 deletions packages/ember-views/lib/views/container_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ Ember.ContainerView = Ember.View.extend({
var changedViews = views.slice(start, start+removed);
this.initializeViews(changedViews, null, null);

this.invokeForState('childViewsWillChange', {views: views, start: start, removed: removed});
this.invokeForState('childViewsWillChange', views, start, removed);
},

/**
Expand Down Expand Up @@ -315,7 +315,7 @@ Ember.ContainerView = Ember.View.extend({
this.initializeViews(changedViews, this, get(this, 'templateData'));

// Let the current state handle the changes
this.invokeForState('childViewsDidChange', {views: views, start: start, added: added});
this.invokeForState('childViewsDidChange', views, start, added);
},

initializeViews: function(views, parentView, templateData) {
Expand Down Expand Up @@ -363,90 +363,70 @@ Ember.ContainerView = Ember.View.extend({
if (currentView) {
childViews.pushObject(currentView);
}
}, 'currentView'),

renderStates: Ember.computed(function(){
return Ember.ContainerView.RenderStateManager.create({
view: this
});
}).property().cacheable()
}, 'currentView')
});


// Ember.ContainerView extends the default view states to provide different
// behavior for childViewsWillChange and childViewsDidChange.
/** @private */
Ember.ContainerView.RenderStateManager = Ember.View.RenderStateManager.extend({
initialState: '_default.preRender',

states: {
'_default': Ember.View.states.DefaultState.create({
preRender: Ember.View.states.PreRenderState.create(),
destroyed: Ember.View.states.DestroyedState.create(),

hasElement: Ember.View.states.HasElementState.create({
inDOM: Ember.View.states.InDomState.create(),
childViewsWillChange: function(manager, options) {
var view = get(manager, 'view'),
views = options.views,
start = options.start,
removed = options.removed;

for (var i=start; i<start+removed; i++) {
views[i].remove();
}
},

childViewsDidChange: function(manager, options) {
var view = get(manager, 'view'),
views = options.views,
start = options.start,
added = options.added;

// If the DOM element for this container view already exists,
// schedule each child view to insert its DOM representation after
// bindings have finished syncing.
var insertedview;
var prev = start === 0 ? null : views[start-1];

for (var i=start; i<start+added; i++) {
insertedview = views[i];
view._scheduleInsertion(insertedview, prev);
prev = insertedview;
}
}
}),
inBuffer: Ember.View.states.InBufferState.create({
childViewsDidChange: function(manager, views, start, added) {
var parentView = get(manager, 'view'),
buffer = parentView.buffer,
startWith, prev, prevBuffer, view;

// Determine where to begin inserting the child view(s) in the
// render buffer.
if (start === 0) {
// If views were inserted at the beginning, prepend the first
// view to the render buffer, then begin inserting any
// additional views at the beginning.
view = views[start];
startWith = start + 1;
view.renderToBuffer(buffer, 'prepend');
} else {
// Otherwise, just insert them at the same place as the child
// views mutation.
view = views[start - 1];
startWith = start;
}

for (var i=startWith; i<start+added; i++) {
prev = view;
view = views[i];
prevBuffer = prev.buffer;
view.renderToBuffer(prevBuffer, 'insertAfter');
}
}
})
})
Ember.ContainerView.states = {
parent: Ember.View.states,

inBuffer: {
childViewsDidChange: function(parentView, views, start, added) {
var buffer = parentView.buffer,
startWith, prev, prevBuffer, view;

// Determine where to begin inserting the child view(s) in the
// render buffer.
if (start === 0) {
// If views were inserted at the beginning, prepend the first
// view to the render buffer, then begin inserting any
// additional views at the beginning.
view = views[start];
startWith = start + 1;
view.renderToBuffer(buffer, 'prepend');
} else {
// Otherwise, just insert them at the same place as the child
// views mutation.
view = views[start - 1];
startWith = start;
}

for (var i=startWith; i<start+added; i++) {
prev = view;
view = views[i];
prevBuffer = prev.buffer;
view.renderToBuffer(prevBuffer, 'insertAfter');
}
}
},

hasElement: {
childViewsWillChange: function(view, views, start, removed) {
for (var i=start; i<start+removed; i++) {
views[i].remove();
}
},

childViewsDidChange: function(view, views, start, added) {
// If the DOM element for this container view already exists,
// schedule each child view to insert its DOM representation after
// bindings have finished syncing.
var prev = start === 0 ? null : views[start-1];

for (var i=start; i<start+added; i++) {
view = views[i];
this._scheduleInsertion(view, prev);
prev = view;
}
}
}
});
};

Ember.ContainerView.states.inDOM = {
parentState: Ember.ContainerView.states.hasElement
};

Ember.ContainerView.reopen({
states: Ember.ContainerView.states
});
18 changes: 0 additions & 18 deletions packages/ember-views/lib/views/states.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,3 @@ require("ember-views/views/states/pre_render");
require("ember-views/views/states/in_buffer");
require("ember-views/views/states/in_dom");
require("ember-views/views/states/destroyed");

var get = Ember.get, set = Ember.set, getPath = Ember.getPath, fmt = Ember.String.fmt;

/** @private */
Ember.View.RenderStateManager = Ember.StateManager.extend({
initialState: '_default.preRender',

states: {
'_default': Ember.View.states.DefaultState.create({
preRender: Ember.View.states.PreRenderState.create(),
hasElement: Ember.View.states.HasElementState.create({
inDOM: Ember.View.states.InDomState.create()
}),
inBuffer: Ember.View.states.InBufferState.create(),
destroyed: Ember.View.states.DestroyedState.create()
})
}
});
57 changes: 30 additions & 27 deletions packages/ember-views/lib/views/states/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,35 @@
require('ember-views/views/view');

var get = Ember.get, set = Ember.set;
Ember.View.states = {};

/** @private */
Ember.View.states.DefaultState = Ember.State.extend({
handleEvent: function() {
return true; // continue event propagation
},
appendChild: function() {
throw "You can't use appendChild outside of the rendering process";
},
destroyElement: function(manager) {
var view = get(manager, 'view');
set(view, 'element', null);
view._lastInsert = null;
return view;
},
getElement: function(){
return null;
},
childViewsDidChange: Ember.K,
insertElement: Ember.K,

// default behavior is to complain of missing actions:
rerender: Ember.K,
childViewsWillChange: Ember.K,
$: function(){
return Ember.$();

Ember.View.states = {
_default: {
// appendChild is only legal while rendering the buffer.
appendChild: function() {
throw "You can't use appendChild outside of the rendering process";
},

$: function() {
return Ember.$();
},

getElement: function() {
return null;
},

// Handle events from `Ember.EventDispatcher`
handleEvent: function() {
return true; // continue event propagation
},

destroyElement: function(view) {
set(view, 'element', null);
view._lastInsert = null;
return view;
}
}
};

Ember.View.reopen({
states: Ember.View.states
});
49 changes: 26 additions & 23 deletions packages/ember-views/lib/views/states/destroyed.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,31 @@
// ==========================================================================

require('ember-views/views/states/default');

var destroyedError = "You can't call %@ on a destroyed view", fmt = Ember.String.fmt;

/** @private */
Ember.View.states.DestroyedState = Ember.State.extend({
appendChild: function() {
throw fmt(destroyedError, ['appendChild']);
},
rerender: function() {
throw fmt(destroyedError, ['rerender']);
},
destroyElement: function() {
throw fmt(destroyedError, ['destroyElement']);
},
empty: function() {
throw fmt(destroyedError, ['empty']);
},

setElement: function() {
throw fmt(destroyedError, ["set('element', ...)"]);
},

// Since element insertion is scheduled, don't do anything if
// the view has been destroyed between scheduling and execution
insertElement: Ember.K
});
Ember.View.states.destroyed = {
parentState: Ember.View.states._default,

appendChild: function() {
throw fmt(destroyedError, ['appendChild']);
},
rerender: function() {
throw fmt(destroyedError, ['rerender']);
},
destroyElement: function() {
throw fmt(destroyedError, ['destroyElement']);
},
empty: function() {
throw fmt(destroyedError, ['empty']);
},

setElement: function() {
throw fmt(destroyedError, ["set('element', ...)"]);
},

// Since element insertion is scheduled, don't do anything if
// the view has been destroyed between scheduling and execution
insertElement: Ember.K
};

Loading

0 comments on commit fd2e1bd

Please sign in to comment.