📄 pageview.cpp.svn-base
字号:
d->aZoomFitWidth->setChecked( true ); d->aZoomFitPage->setChecked( false ); d->aZoomFitText->setChecked( false ); d->aRenderMode->setCurrentItem( 0 ); viewport()->setUpdatesEnabled( false ); slotRelayoutPages(); viewport()->setUpdatesEnabled( true ); d->document->setViewportPage( page ); updateZoomText(); setFocus();}void PageView::setAnnotsWindow(Annotation * annot){ if(!annot) return; //find the annot window AnnotWindow* existWindow=0; foreach(AnnotWindow* tempwnd, d->m_annowindows) { if(tempwnd) { if(tempwnd->m_annot==annot) { existWindow=tempwnd; break; } } } /* if(annot->window.flags & Annotation::Hidden) { if(existWindow) { existWindow->hide(); } } else {*/ if(existWindow==0) { existWindow=new AnnotWindow(this,annot); d->m_annowindows<<existWindow; } existWindow->show(); //} return;}void PageView::displayMessage( const QString & message,PageViewMessage::Icon icon,int duration ){ if ( !KpdfSettings::showOSD() ) { if (icon == PageViewMessage::Error) KMessageBox::error( this, message ); else return; } // hide messageWindow if string is empty if ( message.isEmpty() ) return d->messageWindow->hide(); // display message (duration is length dependant) if (duration==-1) duration = 500 + 100 * message.length(); d->messageWindow->display( message, icon, duration );}//BEGIN DocumentObserver inherited methodsvoid PageView::notifySetup( const QVector< KPDFPage * > & pageSet, bool documentChanged ){ // reuse current pages if nothing new if ( ( pageSet.count() == d->items.count() ) && !documentChanged ) { int count = pageSet.count(); for ( int i = 0; (i < count) && !documentChanged; i++ ) if ( (int)pageSet[i]->number() != d->items[i]->pageNumber() ) documentChanged = true; if ( !documentChanged ) return; } // delete all widgets (one for each page in pageSet) QVector< PageViewItem * >::iterator dIt = d->items.begin(), dEnd = d->items.end(); for ( ; dIt != dEnd; ++dIt ) delete *dIt; d->items.clear(); d->visibleItems.clear(); // create children widgets QVector< KPDFPage * >::const_iterator setIt = pageSet.begin(), setEnd = pageSet.end(); for ( ; setIt != setEnd; ++setIt ) { d->items.push_back( new PageViewItem( *setIt ) );#ifdef PAGEVIEW_DEBUG kDebug() << "geom for " << d->items.last()->pageNumber() << " is " << d->items.last()->geometry() << endl;#endif } // invalidate layout so relayout/repaint will happen on next viewport change if ( pageSet.count() > 0 ) // TODO for Enrico: Check if doing always the slotRelayoutPages() is not // suboptimal in some cases, i'd say it is not but a recheck will not hurt // Need slotRelayoutPages() here instead of d->dirtyLayout = true // because opening a pdf from another pdf will not trigger a viewportchange // so pages are never relayouted QTimer::singleShot(0, this, SLOT(slotRelayoutPages())); // was used else { // update the mouse cursor when closing because we may have close through a link and // want the cursor to come back to the normal cursor updateCursor( viewportToContents( mapFromGlobal( QCursor::pos() ) ) ); resizeContents( 0, 0 ); } // OSD to display pages if ( documentChanged && pageSet.count() > 0 && KpdfSettings::showOSD() ) d->messageWindow->display( i18np(" Loaded a one-page document.", " Loaded a %n-page document.", pageSet.count() ), PageViewMessage::Info, 4000 ); d->aOrientation->setEnabled(d->document->supportsRotation()); bool paperSizes=d->document->supportsPaperSizes(); d->aPaperSizes->setEnabled(paperSizes); // set the new paper sizes: // - if the generator supports them // - if the document changed if (paperSizes && documentChanged) d->aPaperSizes->setItems(d->document->paperSizes());}void PageView::notifyViewportChanged( bool smoothMove ){ // if we are the one changing viewport, skip this nofity if ( d->blockViewport ) return; // block setViewport outgoing calls d->blockViewport = true; // find PageViewItem matching the viewport description const DocumentViewport & vp = d->document->viewport(); PageViewItem * item = 0; QVector< PageViewItem * >::iterator iIt = d->items.begin(), iEnd = d->items.end(); for ( ; iIt != iEnd; ++iIt ) if ( (*iIt)->pageNumber() == vp.pageNumber ) { item = *iIt; break; } if ( !item ) { kDebug() << "viewport has no matching item!" << endl; d->blockViewport = false; return; }#ifdef PAGEVIEW_DEBUG kDebug() << "document viewport changed\n";#endif // relayout in "Single Pages" mode or if a relayout is pending d->blockPixmapsRequest = true; if ( !KpdfSettings::viewContinuous() || d->dirtyLayout ) slotRelayoutPages(); // restore viewport center or use default {x-center,v-top} alignment const QRect & r = item->geometry(); int newCenterX = r.left(), newCenterY = r.top(); if ( vp.rePos.enabled ) { if ( vp.rePos.pos == DocumentViewport::Center ) { newCenterX += (int)( vp.rePos.normalizedX * (double)r.width() ); newCenterY += (int)( vp.rePos.normalizedY * (double)r.height() ); } else { // TopLeft newCenterX += (int)( vp.rePos.normalizedX * (double)r.width() + viewport()->width() / 2 ); newCenterY += (int)( vp.rePos.normalizedY * (double)r.height() + viewport()->height() / 2 ); } } else { newCenterX += r.width() / 2; newCenterY += visibleHeight() / 2 - 10; } // if smooth movement requested, setup parameters and start it if ( smoothMove ) { d->viewportMoveActive = true; d->viewportMoveTime.start(); d->viewportMoveDest.setX( newCenterX ); d->viewportMoveDest.setY( newCenterY ); if ( !d->viewportMoveTimer ) { d->viewportMoveTimer = new QTimer( this ); connect( d->viewportMoveTimer, SIGNAL( timeout() ), this, SLOT( slotMoveViewport() ) ); } d->viewportMoveTimer->start( 25 ); verticalScrollBar()->setEnabled( false ); horizontalScrollBar()->setEnabled( false ); } else center( newCenterX, newCenterY ); d->blockPixmapsRequest = false; // request visible pixmaps in the current viewport and recompute it slotRequestVisiblePixmaps(); // enable setViewport calls d->blockViewport = false; // update zoom text if in a ZoomFit/* zoom mode if ( d->zoomMode != ZoomFixed ) updateZoomText(); // since the page has moved below cursor, update it updateCursor( viewportToContents( mapFromGlobal( QCursor::pos() ) ) );}void PageView::notifyPageChanged( int pageNumber, int changedFlags ){ // only handle pixmap / highlight changes notifies if ( changedFlags & DocumentObserver::Bookmark ) return; // iterate over visible items: if page(pageNumber) is one of them, repaint it QLinkedList< PageViewItem * >::iterator iIt = d->visibleItems.begin(), iEnd = d->visibleItems.end(); for ( ; iIt != iEnd; ++iIt ) if ( (*iIt)->pageNumber() == pageNumber ) { // update item's rectangle plus the little outline QRect expandedRect = (*iIt)->geometry(); expandedRect.adjust( -1, -1, 3, 3 ); updateContents( expandedRect ); // if we were "zoom-dragging" do not overwrite the "zoom-drag" cursor if ( cursor().shape() != Qt::SizeVerCursor ) { // since the page has been regenerated below cursor, update it updateCursor( viewportToContents( mapFromGlobal( QCursor::pos() ) ) ); } break; }}void PageView::notifyContentsCleared( int changedFlags ){ // if pixmaps were cleared, re-ask them if ( changedFlags & DocumentObserver::Pixmap ) slotRequestVisiblePixmaps();}bool PageView::canUnloadPixmap( int pageNumber ){ // if the item is visible, forbid unloading QLinkedList< PageViewItem * >::iterator vIt = d->visibleItems.begin(), vEnd = d->visibleItems.end(); for ( ; vIt != vEnd; ++vIt ) if ( (*vIt)->pageNumber() == pageNumber ) return false; // if hidden premit unloading return true;}//END DocumentObserver inherited methods//BEGIN widget eventsvoid PageView::viewportPaintEvent( QPaintEvent * pe ){if ( d->document->handleEvent( pe ) ){ // create the rect into contents from the clipped screen rect QRect viewportRect = viewport()->rect(); QRect contentsRect = pe->rect().intersect( viewportRect ); contentsRect.translate( contentsX(), contentsY() ); if ( !contentsRect.isValid() ) return; // create the screen painter. a pixel painted at contentsX,contentsY // appears to the top-left corner of the scrollview. QPainter screenPainter( viewport() ); screenPainter.translate( -contentsX(), -contentsY() ); // selectionRect is the normalized mouse selection rect QRect selectionRect = d->mouseSelectionRect; if ( !selectionRect.isNull() ) selectionRect = selectionRect.normalized(); // selectionRectInternal without the border QRect selectionRectInternal = selectionRect; selectionRectInternal.adjust( 1, 1, -1, -1 ); // color for blending QColor selBlendColor = (selectionRect.width() > 8 || selectionRect.height() > 8) ? d->mouseSelectionColor : Qt::red; // subdivide region into rects QVector<QRect> allRects = pe->region().rects(); int numRects = allRects.count(); // preprocess rects area to see if it worths or not using subdivision uint summedArea = 0; for ( int i = 0; i < numRects; i++ ) { const QRect & r = allRects[i]; summedArea += r.width() * r.height(); } // very elementary check: SUMj(Region[j].area) is less than boundingRect.area bool useSubdivision = summedArea < (0.6 * contentsRect.width() * contentsRect.height()); if ( !useSubdivision ) numRects = 1; // iterate over the rects (only one loop if not using subdivision) for ( uint i = 0; i < numRects; i++ ) { if ( useSubdivision ) { // set 'contentsRect' to a part of the sub-divided region contentsRect = allRects[i].normalized().intersect( viewportRect ); contentsRect.translate( contentsX(), contentsY() ); if ( !contentsRect.isValid() ) continue; } // note: this check will take care of all things requiring alpha blending (not only selection)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -