Bug #7054 » 0002-Fix-WTableView-race-between-scrollTo-and-wtResize.patch
src/Wt/WTableView.C | ||
---|---|---|
viewportHeight_(UNKNOWN_VIEWPORT_HEIGHT),
|
||
scrollToRow_(-1),
|
||
scrollToHint_(ScrollHint::EnsureVisible),
|
||
columnResizeConnected_(false)
|
||
columnResizeConnected_(false),
|
||
scrollToCount_(0)
|
||
{
|
||
preloadMargin_[0] = preloadMargin_[1] = preloadMargin_[2] = preloadMargin_[3] = WLength();
|
||
... | ... | |
}
|
||
}
|
||
|
||
void WTableView::onViewportChange(int left, int top, int width, int height)
|
||
void WTableView::onViewportChange(int left, int top, int width, int height, int scrollToCount)
|
||
{
|
||
assert(ajaxMode());
|
||
// ignore viewport change if it does not reflect latest scrollTo sent to client
|
||
if ((scrollToCount != -1) && (scrollToCount < scrollToCount_)) {
|
||
LOG_INFO("onViewportChange: Ignoring stale client resize");
|
||
return;
|
||
}
|
||
viewportLeft_ = left;
|
||
viewportWidth_ = width;
|
||
viewportTop_ = top;
|
||
... | ... | |
}
|
||
if (isRendered()) {
|
||
scrollToCount_++;
|
||
WStringStream s;
|
||
s << jsRef() << ".wtObj.setScrollToPending();"
|
||
<< "setTimeout(function() {"
|
||
<< jsRef() << ".wtObj.scrollTo(-1, "
|
||
<< rowY << "," << (int)hint << "); }, 0);";
|
||
<< rowY << "," << (int)hint << ","
|
||
<< scrollToCount_ << "); }, 0);";
|
||
doJavaScript(s.str());
|
||
}
|
src/Wt/WTableView.h | ||
---|---|---|
WTable *plainTable_;
|
||
JSignal<int, int, std::string, std::string, WMouseEvent> dropEvent_;
|
||
JSignal<int, int, int, int> scrolled_;
|
||
JSignal<int, int, int, int, int> scrolled_;
|
||
JSignal<WTouchEvent> itemTouchSelectEvent_;
|
||
Signals::connection touchStartConnection_;
|
||
... | ... | |
ScrollHint scrollToHint_;
|
||
bool columnResizeConnected_;
|
||
int scrollToCount_;
|
||
void updateTableBackground();
|
||
ColumnWidget *columnContainer(int renderedColumn) const;
|
||
... | ... | |
virtual WWidget *headerWidget(int column, bool contentsOnly = true) override;
|
||
void onViewportChange(int left, int top, int width, int height);
|
||
void onViewportChange(int left, int top, int width, int height, int scrollToCount);
|
||
void onColumnResize();
|
||
void resetGeometry();
|
||
|
src/js/WTableView.js | ||
---|---|---|
var scrollX1 = 0, scrollX2 = 0, scrollY1 = 0, scrollY2 = 0;
|
||
var scrollToPending = 0;
|
||
var scrollToCount = 0;
|
||
/*
|
||
* We need to remember this for when going through a hide()
|
||
... | ... | |
Math.round(rtlScrollLeft(contentsContainer)),
|
||
Math.round(contentsContainer.scrollTop),
|
||
Math.round(contentsContainer.clientWidth),
|
||
Math.round(contentsContainer.clientHeight));
|
||
Math.round(contentsContainer.clientHeight),
|
||
-1);
|
||
}
|
||
};
|
||
... | ... | |
Math.round(rtlScrollLeft(o)),
|
||
Math.round(o.scrollTop),
|
||
Math.round(o.clientWidth),
|
||
Math.round(height));
|
||
Math.round(height),
|
||
scrollToCount);
|
||
}
|
||
};
|
||
... | ... | |
this.resetScroll();
|
||
};
|
||
this.scrollTo = function(x, y, hint) {
|
||
if (scrollToPending > 0)
|
||
this.scrollTo = function(x, y, hint, scrollToCountServer) {
|
||
if (scrollToPending > 0) {
|
||
scrollToPending -= 1;
|
||
}
|
||
else {
|
||
scrollToCount = scrollToCountServer;
|
||
}
|
||
if (y != -1) {
|
||
var top = contentsContainer.scrollTop,
|
||
height = contentsContainer.clientHeight;
|
- « Previous
- 1
- 2
- 3
- 4
- Next »