aboutsummaryrefslogtreecommitdiff
path: root/js/panels/css-panel/rule-list.reel/rule-list.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/panels/css-panel/rule-list.reel/rule-list.js')
-rw-r--r--js/panels/css-panel/rule-list.reel/rule-list.js168
1 files changed, 103 insertions, 65 deletions
diff --git a/js/panels/css-panel/rule-list.reel/rule-list.js b/js/panels/css-panel/rule-list.reel/rule-list.js
index c9eeb64b..5f6afee5 100644
--- a/js/panels/css-panel/rule-list.reel/rule-list.js
+++ b/js/panels/css-panel/rule-list.reel/rule-list.js
@@ -12,35 +12,6 @@ exports.RuleList = Montage.create(Component, {
12 ruleNodeName : { value: 'li' }, 12 ruleNodeName : { value: 'li' },
13 _needsScrollToBottom: { value: null }, 13 _needsScrollToBottom: { value: null },
14 14
15 _rules: { value: null },
16 rules: {
17 get: function() {
18 return this._rules;
19 },
20 set: function(list) {
21 if(!list) {
22 return null;
23 }
24 //debugger;
25 console.log('list: ', list);
26 this._rules = list;
27
28 ///// remove previously added rules
29 if(this.childComponents){
30 this.childComponents.forEach(function(ruleComponent) {
31 this.removeRule(ruleComponent);
32 }, this);
33 }
34
35 this._rules.forEach(function(rule) {
36 this.addRule(rule);
37 }, this);
38
39 this.needsDraw = true;
40
41 }
42 },
43
44 childComponents : { 15 childComponents : {
45 value: [], 16 value: [],
46 distinct: true 17 distinct: true
@@ -54,51 +25,98 @@ exports.RuleList = Montage.create(Component, {
54 value: [], 25 value: [],
55 distinct: true 26 distinct: true
56 }, 27 },
57 addRule: {
58 value: function(rule) {
59 var componentBase = this.supportedRules[rule.type],
60 instance, el;
61 28
62 ///// Draw the rule if we have a template for the rule type 29 update : {
63 if(componentBase) { 30 value: function(rules) {
64 instance = Montage.create(componentBase); 31 this.childComponents.forEach(function(component) {
65 instance.rule = rule; 32 component.update();
33 }, this);
34 }
35 },
66 36
67 if(this.focusDelegate) { 37 _rules: { value: null },
68 instance.focusDelegate = this.focusDelegate; 38 rules: {
39 get: function() {
40 return this._rules;
41 },
42 set: function(list) {
43 if(!list) {
44 return null;
45 }
46
47 var foundIndices = [];
48
49 //// Iterate existing rules, update those which rule exists in new
50 //// rule list
51 this.childComponents.forEach(function(ruleComponent, i, drawnRules) {
52 //// If rule exists in new list, update it
53 var index = list.indexOf(ruleComponent.rule);
54
55 if(ruleComponent.rule.type === 'inline') {
56 //// Let's emulate finding the line rule at the first index
57 index = 0;
69 } 58 }
70 59
71 this.rulesToDraw.push(instance); 60 if(index !== -1) {
72 this.needsDraw = true; 61 // found rule in our component list, or it's the inline rule
73 } 62 ruleComponent.update();
63 foundIndices.push(index);
64 } else {
65 this.rulesToRemove.push(ruleComponent);
66 }
67 }, this);
74 68
75 return instance; 69 //// Find rules to add
76 } 70 list.forEach(function(rule, index) {
77 }, 71 //// If we haven't updated the rule already,
72 //// we're dealing with a new rule to add
73 if(foundIndices.indexOf(index) === -1) {
74 this.addRule(rule, index);
75 }
76 }, this);
77
78 this._rules = list;
78 79
79 removeRule : {
80 value: function(rule) {
81 this.childComponents.splice(this.childComponents.indexOf(rule), 1);
82 this.rulesToRemove.push(rule);
83 this.needsDraw = true; 80 this.needsDraw = true;
81
84 } 82 }
85 }, 83 },
86 84
87 update : { 85 addRule: {
88 value: function(rules) { 86 value: function(rule, atIndex) {
89 this.childComponents.forEach(function(component) { 87 var insertIndex = atIndex || this.childComponents.length;
90 component.update();
91 }, this);
92 88
93 //// TODO: find new styles based on selection 89 this.rulesToDraw.push({
90 rule: rule,
91 index: insertIndex,
92 instance : null
93 });
94 94
95 this.needsDraw = true;
95 } 96 }
96 }, 97 },
97 98
98 willDraw : { 99 willDraw : {
99 value: function() { 100 value: function() {
100 this.rulesToDraw.forEach(function(component) { 101 this.rulesToDraw.forEach(function(ruleObj) {
101 component.element = document.createElement(this.ruleNodeName); 102 var el = document.createElement(this.ruleNodeName);
103
104 var componentBase = this.supportedRules[ruleObj.rule.type],
105 instance;
106
107 ///// Draw the rule if we have a template for the rule type
108 if(!componentBase) { return false; }
109
110 instance = Montage.create(componentBase);
111 instance.element = document.createElement(this.ruleNodeName);
112 instance.rule = ruleObj.rule;
113
114 if(this.focusDelegate) {
115 instance.focusDelegate = this.focusDelegate;
116 }
117
118 ruleObj.instance = instance;
119
102 }, this); 120 }, this);
103 121
104 } 122 }
@@ -114,21 +132,41 @@ exports.RuleList = Montage.create(Component, {
114 this._needsScrollToBottom = false; 132 this._needsScrollToBottom = false;
115 } 133 }
116 134
117 //// Iterate through all rules that need draw and append them 135 //// Iterate through all rules needing removal
118 this.rulesToDraw.forEach(function(component) { 136 console.log("Rule List :: Rules to draw:,", this.rulesToDraw.length);
119 this.element.appendChild(component.element); 137 this.rulesToRemove.forEach(function(ruleComponent) {
120 this._needsScrollToBottom = this.needsDraw = true; 138 var componentIndex = this.childComponents.indexOf(ruleComponent);
121 this.childComponents.push(component); 139 this.childComponents.splice(componentIndex, 1);
122 component.needsDraw = true; 140 this.element.removeChild(ruleComponent.element);
123 }, this); 141 }, this);
124 142
125 //// Iterate through all rules that need draw and append them 143 //// Iterate through all rules that need draw and append them
126 this.rulesToRemove.forEach(function(component) { 144 this.rulesToDraw.forEach(function(ruleObj) {
127 this.element.removeChild(component.element); 145 var ruleAtIndex = this.childComponents[ruleObj.index];
146
147 if(ruleAtIndex) {
148 //// Insert rule at appropriate index
149 this.element.insertBefore(ruleObj.instance.element, ruleAtIndex.element);
150 } else {
151 this.element.appendChild(ruleObj.instance.element);
152 }
153
154 this._needsScrollToBottom = this.needsDraw = true;
155 this.childComponents.push(ruleObj.instance);
156 ruleObj.instance.needsDraw = true;
128 }, this); 157 }, this);
129 158
130 ///// Null out any rules that were just drawn 159 ///// Null out any rules that were just drawn
131 this.rulesToDraw.length = 0; 160 this.rulesToDraw.length = 0;
161
162 }
163 },
164
165 didDraw : {
166 value: function() {
167 this.rulesToRemove.forEach(function(ruleObj) {
168 ruleObj.instance = null;