Avoid unnecessary UI updates in various situations

beginUpdateBatch() doesn't suppress select events, so various batch
operations were triggering lots of extra selects.

This hopefully fixes the long hang some people were seeing when making
changes with an open quick search (which I was only able to reproduce in
Standalone).
This commit is contained in:
Dan Stillman 2013-02-03 19:19:25 -05:00
parent dfdfbf1258
commit 2cd45be191

View file

@ -231,6 +231,14 @@ Zotero.ItemTreeView.prototype._refreshGenerator = function()
this._searchMode = this._itemGroup.isSearchMode();
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
var savedSelection = this.saveSelection();
var savedOpenState = this.saveOpenState();
var savedFirstRow = this.saveFirstRow();
var oldRows = this.rowCount;
this._dataItems = [];
this._searchItemIDs = {}; // items matching the search
@ -311,6 +319,15 @@ Zotero.ItemTreeView.prototype._refreshGenerator = function()
Zotero.UnresponsiveScriptIndicator.enable();
}
this.rememberOpenState(savedOpenState);
this.rememberFirstRow(savedFirstRow);
this.rememberSelection(savedSelection);
this.expandMatchParents();
if (unsuppress) {
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
yield false;
}
@ -399,6 +416,7 @@ Zotero.ItemTreeView.prototype.notify = function(action, type, ids, extraData)
}
this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
if ((action == 'remove' && !itemGroup.isLibrary(true))
|| action == 'delete' || action == 'trash') {
@ -729,6 +747,7 @@ Zotero.ItemTreeView.prototype.notify = function(action, type, ids, extraData)
this.rememberSelection(savedSelection);
}
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
@ -1380,6 +1399,11 @@ Zotero.ItemTreeView.prototype.sort = function(itemID)
}
// Need to close all containers before sorting
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
var savedSelection = this.saveSelection();
var openItemIDs = this.saveOpenState(true);
// Single-row sort
@ -1423,6 +1447,12 @@ Zotero.ItemTreeView.prototype.sort = function(itemID)
this._refreshHashMap();
this.rememberOpenState(openItemIDs);
this.rememberSelection(savedSelection);
if (unsuppress) {
this.selection.selectEventsSuppressed = false;
this._treebox.endUpdateBatch();
}
}
////////////////////////////////////////////////////////////////////////////////
@ -1638,7 +1668,7 @@ Zotero.ItemTreeView.prototype.deleteSelection = function (force)
/*
* Set the tags filter on the view
* Set the search/tags filter on the view
*/
Zotero.ItemTreeView.prototype.setFilter = function(type, data) {
if (!this._treebox || !this._treebox.treeBody) {
@ -1647,9 +1677,7 @@ Zotero.ItemTreeView.prototype.setFilter = function(type, data) {
}
this.selection.selectEventsSuppressed = true;
var savedSelection = this.saveSelection();
var savedOpenState = this.saveOpenState();
var savedFirstRow = this.saveFirstRow();
this._treebox.beginUpdateBatch();
switch (type) {
case 'search':
@ -1666,11 +1694,7 @@ Zotero.ItemTreeView.prototype.setFilter = function(type, data) {
this.sort();
this.rememberOpenState(savedOpenState);
this.expandMatchParents();
this.rememberFirstRow(savedFirstRow);
this.rememberSelection(savedSelection);
this._treebox.invalidate();
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
//Zotero.debug('Running callbacks in itemTreeView.setFilter()', 4);
@ -1751,6 +1775,10 @@ Zotero.ItemTreeView.prototype.rememberSelection = function(selection)
{
this.selection.clearSelection();
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
for(var i=0; i < selection.length; i++)
{
if (this._itemRowMap[selection[i]] != null) {
@ -1777,6 +1805,10 @@ Zotero.ItemTreeView.prototype.rememberSelection = function(selection)
}
}
}
if (unsuppress) {
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
}
@ -1796,6 +1828,12 @@ Zotero.ItemTreeView.prototype.selectSearchMatches = function () {
Zotero.ItemTreeView.prototype.saveOpenState = function(close) {
var itemIDs = [];
if (close) {
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
}
for (var i=0; i<this._dataItems.length; i++) {
if (this.isContainer(i) && this.isContainerOpen(i)) {
itemIDs.push(this._getItemAtRow(i).ref.id);
@ -1806,6 +1844,10 @@ Zotero.ItemTreeView.prototype.saveOpenState = function(close) {
}
if (close) {
this._refreshHashMap();
if (unsuppress) {
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
}
return itemIDs;
}
@ -1825,13 +1867,19 @@ Zotero.ItemTreeView.prototype.rememberOpenState = function(itemIDs) {
return a - b;
});
this._treebox.beginUpdateBatch();
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
// Reopen from bottom up
for (var i=rowsToOpen.length-1; i>=0; i--) {
this.toggleOpenState(rowsToOpen[i], true);
}
this._treebox.endUpdateBatch();
this._refreshHashMap();
if (unsuppress) {
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
}
@ -1846,7 +1894,10 @@ Zotero.ItemTreeView.prototype.expandMatchParents = function () {
hash[id] = true;
}
this._treebox.beginUpdateBatch();
if (!this.selection.selectEventsSuppressed) {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
}
for (var i=0; i<this.rowCount; i++) {
var id = this._getItemAtRow(i).ref.id;
if (hash[id] && this.isContainer(i) && !this.isContainerOpen(i)) {
@ -1854,7 +1905,10 @@ Zotero.ItemTreeView.prototype.expandMatchParents = function () {
}
}
this._refreshHashMap();
this._treebox.endUpdateBatch();
if (unsuppress) {
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
}
@ -1875,7 +1929,7 @@ Zotero.ItemTreeView.prototype.rememberFirstRow = function(firstRow) {
Zotero.ItemTreeView.prototype.expandAllRows = function() {
this.selection.selectEventsSuppressed = true;
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
for (var i=0; i<this.rowCount; i++) {
if (this.isContainer(i) && !this.isContainerOpen(i)) {
@ -1889,6 +1943,7 @@ Zotero.ItemTreeView.prototype.expandAllRows = function() {
Zotero.ItemTreeView.prototype.collapseAllRows = function() {
var unsuppress = this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
for (var i=0; i<this.rowCount; i++) {
if (this.isContainer(i) && this.isContainerOpen(i)) {
@ -1897,11 +1952,13 @@ Zotero.ItemTreeView.prototype.collapseAllRows = function() {
}
this._refreshHashMap();
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
Zotero.ItemTreeView.prototype.expandSelectedRows = function() {
var start = {}, end = {};
this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
for (var i = 0, len = this.selection.getRangeCount(); i<len; i++) {
this.selection.getRangeAt(i, start, end);
@ -1913,11 +1970,13 @@ Zotero.ItemTreeView.prototype.expandSelectedRows = function() {
}
this._refreshHashMap();
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}
Zotero.ItemTreeView.prototype.collapseSelectedRows = function() {
var start = {}, end = {};
this.selection.selectEventsSuppressed = true;
this._treebox.beginUpdateBatch();
for (var i = 0, len = this.selection.getRangeCount(); i<len; i++) {
this.selection.getRangeAt(i, start, end);
@ -1929,6 +1988,7 @@ Zotero.ItemTreeView.prototype.collapseSelectedRows = function() {
}
this._refreshHashMap();
this._treebox.endUpdateBatch();
this.selection.selectEventsSuppressed = false;
}