⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pageview.cpp.svn-base

📁 okular
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
    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 + -