diff --git a/IPython/html/static/widgets/js/widget.js b/IPython/html/static/widgets/js/widget.js index 6d71364..1c787f6 100644 --- a/IPython/html/static/widgets/js/widget.js +++ b/IPython/html/static/widgets/js/widget.js @@ -337,7 +337,7 @@ function(WidgetManager, _, Backbone){ return null; }, - do_diff: function(old_list, new_list, removed_callback, added_callback) { + do_diff: function(old_list, new_list, removed_callback, added_callback, respect_order) { // Difference a changed list and call remove and add callbacks for // each removed and added item in the new list. // @@ -349,17 +349,39 @@ function(WidgetManager, _, Backbone){ // Callback that is called for each item removed. // added_callback : Callback(item) // Callback that is called for each item added. + // [respect_order] : bool [True] + // Whether or not the order of the list matters. + + if (respect_order || respect_order===undefined) { + // Walk the lists until an unequal entry is found. + var i; + for (i = 0; i < new_list.length; i++) { + if (i < old_list.length || new_list[i] !== old_list[i]) { + break; + } + } + // Remove the non-matching items from the old list. + for (var j = i; j < old_list.length; j++) { + console.log(j, old_list.length, old_list[j]); + removed_callback(old_list[j]); + } - // removed items - _.each(this.difference(old_list, new_list), function(item, index, list) { - removed_callback(item); - }, this); - - // added items - _.each(this.difference(new_list, old_list), function(item, index, list) { - added_callback(item); - }, this); + // Add the rest of the new list items. + for (i; i < new_list.length; i++) { + added_callback(new_list[i]); + } + } else { + // removed items + _.each(this.difference(old_list, new_list), function(item, index, list) { + removed_callback(item); + }, this); + + // added items + _.each(this.difference(new_list, old_list), function(item, index, list) { + added_callback(item); + }, this); + } }, difference: function(a, b) {