diff --git a/src/gui/Layout.cpp b/src/gui/Layout.cpp index 11b81260..57582e5b 100644 --- a/src/gui/Layout.cpp +++ b/src/gui/Layout.cpp @@ -53,6 +53,8 @@ Layout::Layout(XournalView* view, ScrollHandling* scrollHandling) layout->updateCurrentPage(); layout->scrollHandling->scrollChanged(); }), this); + + this->lastGetViewAtPage = 0; lastScrollHorizontal = gtk_adjustment_get_value(scrollHandling->getHorizontal()); lastScrollVertical = gtk_adjustment_get_value(scrollHandling->getVertical()); @@ -195,7 +197,9 @@ void Layout::layoutPages() XOJ_CHECK_TYPE(Layout); int len = this->view->viewPagesLen; - + + this->lastGetViewAtPage = len; // invalidate cache index. + Settings* settings = this->view->getControl()->getSettings(); // obtain rows, cols, paired and layout from view settings @@ -418,6 +422,12 @@ XojPageView* Layout::getViewAt(int x, int y) XOJ_CHECK_TYPE(Layout); + //try cached result first + if ( this->lastGetViewAtPage < this->view->viewPagesLen && this->view->viewPages[this->lastGetViewAtPage]->containsPoint(x,y,false) ) + { + return this->view->viewPages[this->lastGetViewAtPage]; + } + int r; int rTotalPixels = 0; int c; @@ -449,8 +459,10 @@ XojPageView* Layout::getViewAt(int x, int y) int page = mapper.map(c,r); //this->view->viewPages[1]; if ( page>=0 && this->view->viewPages[page]->containsPoint(x,y,false) ) + { - return this->view->viewPages[page]; + this->lastGetViewAtPage = page; + return this->view->viewPages[page]; } else { diff --git a/src/gui/Layout.h b/src/gui/Layout.h index 77a43bf7..97670f37 100644 --- a/src/gui/Layout.h +++ b/src/gui/Layout.h @@ -133,4 +133,9 @@ private: std::vector sizeCol; std::vector sizeRow; + /** + * cache the last GetViewAt() page# + */ + int lastGetViewAtPage; + };