diff --git a/TODO b/TODO index 1562cb704..dfc9100b2 100644 --- a/TODO +++ b/TODO @@ -6,16 +6,15 @@ Legend: MRG - MeRGed (code from a branch or a patch) In progress [working on]: --> annotations: renderers in PagePainter (for the 6 markup annots) - +-> annotations: renderers in PagePainter (for the 6 annots) -> annotations: handlers in PageView for WindowAnnots and others.. --> annotations: creators in PageViewAnnotator (60% done) +-> annotations: creators in PageViewAnnotator (40% done) -> annotations: framework (BR67300,BR62793) and tools (BR67300,BR91251) -> annotations: add the annot pane (cool plz!) -> (done: 100%) refactor, pdf parser, xml storage -> check mouse wrapping not screH / 2 --> check unscaledwidth/height.. necessary ? -> check if fix was applied in head only (pageview.cpp 1676) +-> pageview: update layout when toggling the 'ebook atyle alignment' More items (first items will enter 'In progress list' first): -> merge with head: core/ has no qwidgets around. the head fonts can't make exception! @@ -48,7 +47,6 @@ More items (first items will enter 'In progress list' first): -> thumbnailslist: refactor to do internal rendering as pageview does (way faster -> thumbnailslist: clinking on higlighted rect should bring the viewport to that search result (BR98334) than using QScrollView + inserted Widgets and saves 8% on document loading) --> pageview: layout 2PPV [1 2,3 4,5 6] -> [1,2 3,4 5]. add ebook-friendly alignment option (BR100341) -> core: abstract TextPage generation (the last xpdf dependant class!). then go dancing in the streets. make it new and easy to use for wp-style selections. -> Dom framework to cache document metadata. It should archive those types of data: @@ -83,8 +81,6 @@ More items (first items will enter 'In progress list' first): -> sidebar: evaluate wether to make the left toolbox auto-hiding (kicker like) (BR94495) -> add OCR for building TextPages out of pure graphical (aka scanned) pages -> rotate the whole document / individual pages (on screen/print?) (BR99352) --> pageview: investigate some sort of bug I had once: facing-non-continous view - locaked on the same 2 pages (swapping them) -> presentation: add page counter and a widget to manually set pages on the top bar -> presentation: provide a pageX/totalPages indicator in addition to the circle one -> presentation: implement missing transitions (6/11 done) @@ -113,6 +109,7 @@ Icons needed: - COMMON (here in ToolBox): Toc, Annotations Done (newest features come first): +-> ADD: add ebook-friendly alignment option, better layouting (BR100341) -> FIX: random crash when closing kpdf with kapp->quit() (don't use Settings:: in destructors) -> FIX: implement links for starting end exiting from presentation mode (pdf FullScreen, Close actions) -> CHG: cursor wraps on screen for dragging the page/dynZooming diff --git a/conf/dlggeneral.ui b/conf/dlggeneral.ui index ae27a5e2b..e2fd966cf 100644 --- a/conf/dlggeneral.ui +++ b/conf/dlggeneral.ui @@ -76,6 +76,14 @@ Show &hints and info messages + + + kcfg_CenterFirstPageInRow + + + Center &first page in facing mode + + diff --git a/conf/kpdf.kcfg b/conf/kpdf.kcfg index d68ccf60c..36edb3671 100644 --- a/conf/kpdf.kcfg +++ b/conf/kpdf.kcfg @@ -144,6 +144,9 @@ + + false + 0 diff --git a/ui/pageview.cpp b/ui/pageview.cpp index e87102ab0..fdf21e50b 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -131,7 +131,7 @@ PageView::PageView( QWidget *parent, KPDFDocument *document ) // create and initialize private storage structure d = new PageViewPrivate(); d->document = document; - d->zoomMode = ZoomFixed; + d->zoomMode = ZoomFitPage; d->zoomFactor = 1.0; d->mouseMode = MouseNormal; d->mouseMidZooming = false; @@ -679,7 +679,9 @@ void PageView::keyPressEvent( QKeyEvent * e ) { // more optimized than document->setPrevPage and then move view to bottom DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber -= 1; + newViewport.pageNumber -= Settings::viewColumns(); + if ( newViewport.pageNumber < 0 ) + newViewport.pageNumber = 0; newViewport.reCenter.enabled = true; newViewport.reCenter.normalizedCenterY = 1.0; d->document->setViewport( newViewport ); @@ -699,7 +701,9 @@ void PageView::keyPressEvent( QKeyEvent * e ) { // more optmized than document->setNextPage and then move view to top DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber += 1; + newViewport.pageNumber += d->document->currentPage() ? Settings::viewColumns() : 1; + if ( newViewport.pageNumber >= (int)d->items.count() ) + newViewport.pageNumber = d->items.count() - 1; newViewport.reCenter.enabled = true; newViewport.reCenter.normalizedCenterY = 0.0; d->document->setViewport( newViewport ); @@ -984,9 +988,9 @@ void PageView::contentsMouseReleaseEvent( QMouseEvent * e ) break; } } - else + else if ( pageItem->pageNumber() != (int)d->document->currentPage() ) { - // if not on a rect, the click selects the page + // click to select different pages d->document->setViewportPage( pageItem->pageNumber(), PAGEVIEW_ID ); } } @@ -1214,7 +1218,9 @@ void PageView::wheelEvent( QWheelEvent *e ) { // more optmized than document->setNextPage and then move view to top DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber += 1; + newViewport.pageNumber += d->document->currentPage() ? Settings::viewColumns() : 1; + if ( newViewport.pageNumber >= (int)d->items.count() ) + newViewport.pageNumber = d->items.count() - 1; newViewport.reCenter.enabled = true; newViewport.reCenter.normalizedCenterY = 0.0; d->document->setViewport( newViewport ); @@ -1227,7 +1233,9 @@ void PageView::wheelEvent( QWheelEvent *e ) { // more optmized than document->setPrevPage and then move view to bottom DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber -= 1; + newViewport.pageNumber -= Settings::viewColumns(); + if ( newViewport.pageNumber < 0 ) + newViewport.pageNumber = 0; newViewport.reCenter.enabled = true; newViewport.reCenter.normalizedCenterY = 1.0; d->document->setViewport( newViewport ); @@ -1594,13 +1602,19 @@ void PageView::slotRelayoutPages() fullHeight = 0; QRect viewportRect( contentsX(), contentsY(), viewportWidth, viewportHeight ); + // handle the 'center first page in row' stuff + int nCols = Settings::viewColumns(); + bool centerFirstPage = Settings::centerFirstPageInRow() && nCols > 1; + // set all items geometry and resize contents. handle 'continuous' and 'single' modes separately if ( Settings::viewContinuous() ) { + // handle the 'centering on first row' stuff + if ( centerFirstPage ) + pageCount += nCols - 1; // Here we find out column's width and row's height to compute a table // so we can place widgets 'centered in virtual cells'. - int nCols = Settings::viewColumns(), - nRows = (int)ceil( (float)pageCount / (float)nCols ), + int nRows = (int)ceil( (float)pageCount / (float)nCols ), * colWidth = new int[ nCols ], * rowHeight = new int[ nRows ], cIdx = 0, @@ -1609,6 +1623,9 @@ void PageView::slotRelayoutPages() colWidth[ i ] = viewportWidth / nCols; for ( int i = 0; i < nRows; i++ ) rowHeight[ i ] = 0; + // handle the 'centering on first row' stuff + if ( centerFirstPage ) + pageCount -= nCols - 1; // 1) find the maximum columns width and rows height for a grid in // which each page must well-fit inside a cell @@ -1616,12 +1633,15 @@ void PageView::slotRelayoutPages() { PageViewItem * item = *iIt; // update internal page size (leaving a little margin in case of Fit* modes) - updateItemSize( item, colWidth[ cIdx ] - 6, viewportHeight - 8 ); + updateItemSize( item, colWidth[ cIdx ] - 6, viewportHeight - 12 ); // find row's maximum height and column's max width if ( item->width() + 6 > colWidth[ cIdx ] ) colWidth[ cIdx ] = item->width() + 6; - if ( item->height() > rowHeight[ rIdx ] ) - rowHeight[ rIdx ] = item->height(); + if ( item->height() + 12 > rowHeight[ rIdx ] ) + rowHeight[ rIdx ] = item->height() + 12; + // handle the 'centering on first row' stuff + if ( centerFirstPage && !item->pageNumber() ) + cIdx += nCols - 1; // update col/row indices if ( ++cIdx == nCols ) { @@ -1630,9 +1650,15 @@ void PageView::slotRelayoutPages() } } - // 2) arrange widgets inside cells + // 2) compute full size + for ( int i = 0; i < nCols; i++ ) + fullWidth += colWidth[ i ]; + for ( int i = 0; i < nRows; i++ ) + fullHeight += rowHeight[ i ]; + + // 3) arrange widgets inside cells (and refine fullHeight if needed) int insertX = 0, - insertY = 4; // 2 + 4*d->zoomFactor ? + insertY = fullHeight < viewportHeight ? ( viewportHeight - fullHeight ) / 2 : 0; cIdx = 0; rIdx = 0; for ( iIt = d->items.begin(); iIt != iEnd; ++iIt ) @@ -1640,9 +1666,19 @@ void PageView::slotRelayoutPages() PageViewItem * item = *iIt; int cWidth = colWidth[ cIdx ], rHeight = rowHeight[ rIdx ]; - // center widget inside 'cells' - item->moveTo( insertX + (cWidth - item->width()) / 2, - insertY + (rHeight - item->height()) / 2 ); + if ( centerFirstPage && !rIdx && !cIdx ) + { + // handle the 'centering on first row' stuff + item->moveTo( insertX + (fullWidth - item->width()) / 2, + insertY + (rHeight - item->height()) / 2 ); + cIdx += nCols - 1; + } + else + { + // center widget inside 'cells' + item->moveTo( insertX + (cWidth - item->width()) / 2, + insertY + (rHeight - item->height()) / 2 ); + } // advance col/row index insertX += cWidth; if ( ++cIdx == nCols ) @@ -1650,14 +1686,10 @@ void PageView::slotRelayoutPages() cIdx = 0; rIdx++; insertX = 0; - insertY += rHeight + 15; // 5 + 15*d->zoomFactor ? + insertY += rHeight; } } - fullHeight = cIdx ? (insertY + rowHeight[ rIdx ] + 10) : insertY; - for ( int i = 0; i < nCols; i++ ) - fullWidth += colWidth[ i ]; - delete [] colWidth; delete [] rowHeight; } @@ -1665,9 +1697,11 @@ void PageView::slotRelayoutPages() { PageViewItem * currentItem = d->items[ QMAX( 0, (int)d->document->currentPage() ) ]; + // handle the 'centering on first row' stuff + if ( centerFirstPage && d->document->currentPage() < 1 ) + nCols = 1; // setup varialbles for a 1(row) x N(columns) grid - int nCols = Settings::viewColumns(), - * colWidth = new int[ nCols ], + int * colWidth = new int[ nCols ], cIdx = 0; fullHeight = viewportHeight; for ( int i = 0; i < nCols; i++ ) @@ -1680,17 +1714,21 @@ void PageView::slotRelayoutPages() if ( item == currentItem || (cIdx > 0 && cIdx < nCols) ) { // update internal page size (leaving a little margin in case of Fit* modes) - updateItemSize( item, colWidth[ cIdx ] - 6, viewportHeight - 8 ); + updateItemSize( item, colWidth[ cIdx ] - 6, viewportHeight - 12 ); // find row's maximum height and column's max width if ( item->width() + 6 > colWidth[ cIdx ] ) colWidth[ cIdx ] = item->width() + 6; - if ( item->height() + 8 > fullHeight ) - fullHeight = item->height() + 8; + if ( item->height() + 12 > fullHeight ) + fullHeight = item->height() + 12; cIdx++; } } - // 2) hide all widgets except the displayable ones and dispose those + // 2) calc full size (fullHeight is alredy ok) + for ( int i = 0; i < nCols; i++ ) + fullWidth += colWidth[ i ]; + + // 3) hide all widgets except the displayable ones and dispose those int insertX = 0; cIdx = 0; for ( iIt = d->items.begin(); iIt != iEnd; ++iIt ) @@ -1708,9 +1746,6 @@ void PageView::slotRelayoutPages() item->setGeometry( 0, 0, -1, -1 ); } - for ( int i = 0; i < nCols; i++ ) - fullWidth += colWidth[ i ]; - delete [] colWidth; // this can cause a little overhead @@ -1804,8 +1839,8 @@ void PageView::slotRequestVisiblePixmaps( int newLeft, int newTop ) if ( isEvent ) { const QRect & geometry = i->geometry(); - // compute distance between item center and viewport center - double distance = hypot( (geometry.left() + geometry.right()) / 2 - viewportCenterX, + // compute distance between item center and viewport center (slightly moved left) + double distance = hypot( (geometry.left() + geometry.right()) / 2 - (viewportCenterX - 4), (geometry.top() + geometry.bottom()) / 2 - viewportCenterY ); if ( distance >= minDistance && nearPageNumber != -1 ) continue;