Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/183053
Change subject: Set hard limit of results to attempt to render, even with
clipping
......................................................................
Set hard limit of results to attempt to render, even with clipping
If more than 200 results are returned, e.g. when you search for a
space in a long document, don't attempt to render all the results
just show the current one.
Change-Id: I8c4c853c1d759433beec93d87ec83924a8b26fd6
---
M src/ui/dialogs/ve.ui.FindAndReplaceDialog.js
1 file changed, 45 insertions(+), 20 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/53/183053/1
diff --git a/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js
b/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js
index 110cf3e..46ec401 100644
--- a/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js
+++ b/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js
@@ -32,6 +32,13 @@
ve.ui.FindAndReplaceDialog.static.title = OO.ui.deferMsg(
'visualeditor-find-and-replace-title' );
+/**
+ * Maximum number of results to render
+ *
+ * @property {number}
+ */
+ve.ui.FindAndReplaceDialog.static.maxRenderedResults = 100;
+
/* Methods */
/**
@@ -126,7 +133,7 @@
// Events
this.onWindowScrollDebounced = ve.debounce( this.onWindowScroll.bind(
this ), 250 );
this.updateFragmentsDebounced = ve.debounce( this.updateFragments.bind(
this ) );
- this.positionResultsDebounced = ve.debounce( this.positionResults.bind(
this ) );
+ this.renderFragmentsDebounced = ve.debounce( this.renderFragments.bind(
this ) );
this.findText.connect( this, {
change: 'onFindChange',
enter: 'onFindTextEnter'
@@ -172,14 +179,14 @@
// Events
this.surface.getModel().connect( this, {
documentUpdate: this.updateFragmentsDebounced } );
- this.surface.getView().connect( this, { position:
this.positionResultsDebounced } );
+ this.surface.getView().connect( this, { position:
this.renderFragmentsDebounced } );
this.surface.getView().$window.on( 'scroll',
this.onWindowScrollDebounced );
var text = data.fragment.getText();
- if ( text ) {
+ if ( text && text !== this.findText.getValue() ) {
this.findText.setValue( text );
} else {
- this.updateFragments();
+ this.onFindChange();
}
}, this );
};
@@ -220,7 +227,7 @@
ve.ui.FindAndReplaceDialog.prototype.onWindowScroll = function () {
if ( this.renderedFragments.getLength() < this.results ) {
// If viewport clipping is being used, reposition results based
on the current viewport
- this.positionResults();
+ this.renderFragments();
}
};
@@ -229,7 +236,7 @@
*/
ve.ui.FindAndReplaceDialog.prototype.onFindChange = function () {
this.updateFragments();
- this.positionResults();
+ this.renderFragments();
this.highlightFocused( true );
};
@@ -291,30 +298,47 @@
/**
* Position results markers
*/
-ve.ui.FindAndReplaceDialog.prototype.positionResults = function () {
+ve.ui.FindAndReplaceDialog.prototype.renderFragments = function () {
if ( this.replacing ) {
return;
}
- var i, j, jlen, rects, $result, top, selection, viewportRange,
+ var i, selection, viewportRange,
start = 0, end = this.results;
// When there are a large number of results, calculate the viewport
range for clipping
- if ( this.results > 100 ) {
+ if ( this.results > 50 ) {
viewportRange = this.surface.getView().getViewportRange();
+ for ( i = 0; i < this.results; i++ ) {
+ selection = this.fragments[i].getSelection();
+ if ( viewportRange && selection.getRange().start <
viewportRange.start ) {
+ start = i + 1;
+ continue;
+ }
+ if ( viewportRange && selection.getRange().end >
viewportRange.end ) {
+ end = i;
+ break;
+ }
+ }
}
+ // When there are too many results to render, just render the current
one
+ if ( end - start <= this.constructor.static.maxRenderedResults ) {
+ this.renderRangeOfFragments( new ve.Range( start, end ) );
+ } else {
+ this.renderRangeOfFragments( new ve.Range( this.focusedIndex,
this.focusedIndex + 1 ) );
+ }
+};
+
+/**
+ * Render subset of search result fragments
+ *
+ * @param {ve.Range} range Range of fragments to render
+ */
+ve.ui.FindAndReplaceDialog.prototype.renderRangeOfFragments = function ( range
) {
+ var i, j, jlen, rects, $result, top;
this.$findResults.empty();
- for ( i = 0; i < this.results; i++ ) {
- selection = this.fragments[i].getSelection();
- if ( viewportRange && selection.getRange().start <
viewportRange.start ) {
- start = i + 1;
- continue;
- }
- if ( viewportRange && selection.getRange().end >
viewportRange.end ) {
- end = i;
- break;
- }
+ for ( i = range.start; i < range.end; i++ ) {
rects = this.surface.getView().getSelectionRects(
this.fragments[i].getSelection() );
$result = this.$( '<div>' ).addClass(
've-ui-findAndReplaceDialog-findResult' );
top = Infinity;
@@ -330,7 +354,7 @@
$result.data( 'top', top );
this.$findResults.append( $result );
}
- this.renderedFragments = new ve.Range( start, end );
+ this.renderedFragments = range;
this.highlightFocused();
};
@@ -366,6 +390,7 @@
// Focused result hasn't been rendered yet so find its offset
manually
rect = surfaceView.getSelectionBoundingRect(
this.fragments[this.focusedIndex].getSelection() );
top = rect.top;
+ this.renderRangeOfFragments( new ve.Range( this.focusedIndex,
this.focusedIndex + 1 ) );
}
if ( scrollIntoView ) {
--
To view, visit https://gerrit.wikimedia.org/r/183053
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8c4c853c1d759433beec93d87ec83924a8b26fd6
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits