/** * Check which page should be selected */ void Layout::checkSelectedPage() { GtkAllocation allocation = { 0 }; gtk_widget_get_allocation(this->view->getWidget(), &allocation); int scrollY = this->scrollVertical->getValue(); int scrollX = this->scrollHorizontal->getValue(); Control* control = this->view->getControl(); int viewHeight = allocation.height; int viewWidth = allocation.width; bool twoPages = control->getSettings()->isShowTwoPages(); if (scrollY < 1) { if (twoPages && this->view->viewPagesLen > 1 && this->view->viewPages[1]->isSelected()) { // page 2 already selected } else { control->firePageSelected(0); } return; } int mostPageNr = 0; double mostPagePercent = 0; // next four pages are not marked as invisible, // because usually you scroll forward for (int page = 0; page < this->view->viewPagesLen; page++) { PageView* p = this->view->viewPages[page]; int y = p->getY(); int x = p->getX(); int pageHeight = p->getDisplayHeight(); int pageWidth = p->getDisplayWidth(); if (y > scrollY + viewHeight) { p->setIsVisible(false); for (; page < this->view->viewPagesLen; page++) { p = this->view->viewPages[page]; p->setIsVisible(false); } break; } if (y + pageHeight >= scrollY) { int startY = 0; int endY = pageHeight; if (y <= scrollY) { startY = scrollY - y; } if (y + pageHeight > scrollY + viewHeight) { endY = pageHeight - ((y + pageHeight) - (scrollY + viewHeight)); } int startX = 0; int endX = pageWidth; if (x <= scrollX) { startX = scrollX - x; } if (x + pageWidth > scrollX + viewWidth) { endX = pageWidth - ((x + pageWidth) - (scrollX + viewWidth)); } double percent = ((double) (endY - startY)) / ((double) pageHeight); percent *= ((double) (endX - startX)) / ((double) pageWidth); if (percent > mostPagePercent) { mostPagePercent = percent; mostPageNr = page; } p->setIsVisible(true); } else { p->setIsVisible(false); } } if (twoPages && mostPageNr < this->view->viewPagesLen - 1) { int y1 = this->view->viewPages[mostPageNr]->getY(); int y2 = this->view->viewPages[mostPageNr + 1]->getY(); if (y1 != y2 || !this->view->viewPages[mostPageNr + 1]->isSelected()) { // if the second page is selected DON'T select the first page. // Only select the first page if none is selected control->firePageSelected(mostPageNr); } } else { control->firePageSelected(mostPageNr); } }