From 3d45131c30d5b0c31868ba2b29db4cc208836c89 Mon Sep 17 00:00:00 2001 From: Dima Rogozin Date: Tue, 11 Jan 2000 23:28:34 +0000 Subject: [PATCH] dviwin rewritten to use QScrollView and impruve scrolling scrollbox rewritten to accomodate dviwin change and improve repainting. svn path=/trunk/kdegraphics/kdvi/; revision=38111 --- dviwin.cpp | 264 ++++++++++++++--------------------------------------- dviwin.h | 37 +++----- scrbox.cpp | 45 ++++----- scrbox.h | 1 - 4 files changed, 100 insertions(+), 247 deletions(-) diff --git a/dviwin.cpp b/dviwin.cpp index db7ca4f1e..993df5e20 100644 --- a/dviwin.cpp +++ b/dviwin.cpp @@ -4,8 +4,8 @@ // Previewer for TeX DVI files. // -#include "dviwin.h" -#include "prefs.h" +#include +#include #include #include @@ -17,8 +17,8 @@ #include #include -#include -#include +#include "dviwin.h" +#include "prefs.h" //------ some definitions from xdvi ---------- @@ -113,14 +113,12 @@ extern "C" void qt_processEvents() //------ now comes the dviWindow class implementation ---------- dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, - int mkpk, QWidget *parent, const char *name ) - : QWidget( parent, name ), block( this ) + int mkpk, QWidget *parent, const char *name ) + : QScrollView( parent, name ) { ChangesPossible = 1; - showsbs = 1; FontPath = QString::null; - setBackgroundColor( white ); - setUpdatesEnabled(FALSE); + viewport()->setBackgroundColor( white ); setFocusPolicy(QWidget::StrongFocus); setFocus(); @@ -129,16 +127,9 @@ dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, this, SLOT(timerEvent()) ); checkinterval = 1000; - // Create a Vertical scroll bar - - vsb = new QScrollBar( QScrollBar::Vertical,this,"scrollBar" ); - connect( vsb, SIGNAL(valueChanged(int)), SLOT(scrollVert(int)) ); - - // Create a Horizontal scroll bar - - hsb = new QScrollBar( QScrollBar::Horizontal,this,"scrollBar" ); - connect( hsb, SIGNAL(valueChanged(int)), SLOT(scrollHorz(int)) ); - + connect(this, SIGNAL(contentsMoving(int, int)), + this, SLOT(contentsMoving(int, int))); + // initialize the dvi machinery setResolution( bdpi ); @@ -179,15 +170,19 @@ int dviWindow::checking() void dviWindow::setShowScrollbars( int flag ) { - if ( showsbs == flag ) - return; - showsbs = flag; - setChildrenGeometries(); + if( flag ) { + setVScrollBarMode(Auto); + setHScrollBarMode(Auto); + } + else { + setVScrollBarMode(AlwaysOff); + setHScrollBarMode(AlwaysOff); + } } int dviWindow::showScrollbars() { - return showsbs; + return (vScrollBarMode() == Auto); } void dviWindow::setShowPS( int flag ) @@ -320,23 +315,21 @@ float dviWindow::gamma() //------ reimplement virtual event handlers ------------- -void dviWindow::mousePressEvent ( QMouseEvent *e) +void dviWindow::viewportMousePressEvent ( QMouseEvent *e) { - if (!(e->button()&LeftButton)) + if (!(e->button()&LeftButton)) return; mouse = e->pos(); - emit setPoint( mouse + base ); + emit setPoint( viewportToContents(mouse) ); } -void dviWindow::mouseMoveEvent ( QMouseEvent *e) +void dviWindow::viewportMouseMoveEvent ( QMouseEvent *e) { - const int mouseSpeed = 1; - if (!(e->state()&LeftButton)) return; - QPoint diff = mouse - e->pos(); + QPoint diff = mouse - e->pos(); mouse = e->pos(); - scrollRelative(diff*mouseSpeed); + scrollBy(diff.x(), diff.y()); } void dviWindow::keyPressEvent ( QKeyEvent *e) @@ -352,49 +345,26 @@ void dviWindow::keyPressEvent ( QKeyEvent *e) case Key_Space: goForward(); break; case Key_Plus: prevShrink(); break; case Key_Minus: nextShrink(); break; - case Key_Down: scrollRelative(QPoint(0,speed)); break; - case Key_Up: scrollRelative(QPoint(0,-speed)); break; - case Key_Right: scrollRelative(QPoint(speed,0)); break; - case Key_Left: scrollRelative(QPoint(-speed,0)); break; + case Key_Down: scrollBy(0,speed); break; + case Key_Up: scrollBy(0,-speed); break; + case Key_Right: scrollBy(speed,0); break; + case Key_Left: scrollBy(-speed,0); break; case Key_Home: if (e->state() == ControlButton) firstPage(); else - scrollAbsolute(QPoint(base.x(),0)); + setContentsPos(0,0); break; case Key_End: if (e->state() == ControlButton) lastPage(); else - scrollAbsolute(QPoint(base.x(),page_h)); + setContentsPos(0, contentsHeight()-visibleHeight()); break; - default: e->ignore(); break; } } -void dviWindow::paintEvent( QPaintEvent *p ) -{ - if ( !pixmap ) - return; - QRect r( 0, 0, hclip, vclip ); - r = r.intersect( p->rect() ); - - bitBlt( this, r.x(), r.y(), - pixmap, base.x() + r.x(), base.y() + r.y(), - r.width(), r.height() ); -} - -void dviWindow::resizeEvent ( QResizeEvent *) -{ - if ( !pixmap || ( width() > pixmap->width() ) - || ( height() > pixmap->height() ) ) - changePageSize(); - setChildrenGeometries( FALSE ); - // The following will ensure that view position is within limits - scrollRelative( QPoint(0,0) ); -} - void dviWindow::initDVI() { prog = const_cast("kdvi"); @@ -443,9 +413,8 @@ void dviWindow::drawDVI() QApplication::restoreOverrideCursor(); gotoPage(1); - setChildrenGeometries(FALSE); changePageSize(); - emit viewSizeChanged( QSize( hclip, vclip ) ); + emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); timer->start( 1000 ); return; } @@ -485,8 +454,9 @@ void dviWindow::drawDVI() void dviWindow::drawPage() { - drawDVI(); - setUpdatesEnabled(TRUE);repaint(0);setUpdatesEnabled(FALSE); + drawDVI(); + repaintContents(contentsX(), contentsY(), + visibleWidth(), visibleHeight(), FALSE); } bool dviWindow::changedDVI() @@ -513,7 +483,7 @@ bool dviWindow::correctDVI() void dviWindow::timerEvent() { static int changing = 0; - + if ( !changedDVI() ) return; if ( !changing ) @@ -535,14 +505,13 @@ void dviWindow::changePageSize() psp_destroy(); if (pixmap) delete pixmap; - pixmap = new QPixmap( QMAX( width(), (int)page_w ), - QMAX( height(), (int)page_h ) ); + pixmap = new QPixmap( (int)page_w, (int)page_h ); emit pageSizeChanged( QSize( page_w, page_h ) ); - + resizeContents( page_w, page_h ); + currwin.win = mane.win = pixmap->handle(); - - pixmap->fill( white ); - drawPage(); + + drawPage(); } //------ setup the dvi interpreter (should do more here ?) ---------- @@ -558,130 +527,21 @@ void dviWindow::setFile( const char *fname ) drawPage(); } -//------ class private stuff, scrolling---------- - - -void dviWindow::setChildrenGeometries(int doupdate) -{ - int oldhc = hclip; - int oldvc = vclip; - int sbw = QApplication::style().scrollBarExtent().width(); - int sbh = QApplication::style().scrollBarExtent().height(); - - // deside if scrollbars needed - - hscroll = vscroll = 0; - if (showsbs) - { - if ( width() < int(page_w) ) hscroll = sbw; - if ( height() - hscroll < int(page_h) ) vscroll = sbh; - if ( width() - vscroll < int(page_w) ) hscroll = sbw; - } - - // store clip sizes - - hclip = width() - vscroll; - vclip = height() - hscroll; - - // reconfig scrollbars accordingly - - if (hscroll) - { - hsb->show(); - hsb->setGeometry( 0, vclip, hclip, sbh ); - hsb->setRange( 0, page_w - hclip ); - hsb->setValue( base.x() ); - hsb->setSteps( 15, hclip ); - } - else - hsb->hide(); - - if (vscroll) - { - vsb->show(); - vsb->setGeometry( hclip, 0, sbw, vclip ); - vsb->setRange( 0, page_h - vclip ); - vsb->setValue( base.y() ); - vsb->setSteps( 15, vclip ); - } - else - vsb->hide(); - - if (hscroll&&vscroll) - { - block.setGeometry( hclip, vclip, sbw, sbh ); - block.show(); - } - else - block.hide(); - if (doupdate) - setUpdatesEnabled(TRUE);repaint(0);setUpdatesEnabled(FALSE); - - if ( oldhc != hclip || oldvc != vclip ) - emit viewSizeChanged( QSize( hclip, vclip ) ); -} - -void dviWindow::scrollVert( int value ) -{ - scrollRelative( QPoint(0,value - base.y()) ); -} - -void dviWindow::scrollHorz( int value ) -{ - scrollRelative( QPoint(value - base.x(),0) ); -} - -void dviWindow::scrollRelative(const QPoint r, int doupdate) -{ - int maxx = page_w - hclip; - int maxy = page_h - vclip; - - QPoint old = base; - base += r; - - if ( maxx < 0 ) maxx = 0; - if ( maxy < 0 ) maxy = 0; - if ( base.x() <= 0 ) - base.rx() = 0; - else if ( base.x() > maxx ) - base.rx() = maxx; - if ( base.y() <= 0) - base.ry() = 0; - else if ( base.y() > maxy ) - base.ry() = maxy; - - if ( (base-old).isNull() ) - return; - - setChildrenGeometries(FALSE); - - if ( doupdate ) - { - setUpdatesEnabled(TRUE);repaint(0);setUpdatesEnabled(FALSE); - } - emit currentPosChanged( base ); -} - -void dviWindow::scrollAbsolute(const QPoint p) -{ - scrollRelative( p - base ); -} - //------ following member functions are in the public interface ---------- QPoint dviWindow::currentPos() { - return base; + return QPoint(contentsX(), contentsY()); } void dviWindow::scroll( QPoint to ) { - scrollAbsolute( to ); + setContentsPos(to.x(), to.y()); } QSize dviWindow::viewSize() { - return QSize( hclip, vclip ); + return QSize( visibleWidth(), visibleHeight() ); } QSize dviWindow::pageSize() @@ -693,13 +553,12 @@ QSize dviWindow::pageSize() void dviWindow::goForward() { - if ( base.y() >= int(page_h) - vclip ) - { - scrollRelative(QPoint (0,-base.y()), FALSE ); - nextPage(); - } - else - scrollRelative(QPoint(0,2*vclip/3)); + if(contentsY() >= contentsHeight()-visibleHeight()) { + nextPage(); + setContentsPos(0, 0); + } + else + scrollBy(0, 2*visibleWidth()/3); } void dviWindow::prevPage() @@ -772,9 +631,26 @@ void dviWindow::setShrink(int s) init_page(); init_pix(FALSE); reset_fonts(); - QPoint newbase = ((base + mouse) * olds - s * mouse) / s; - setChildrenGeometries(); changePageSize(); - scrollAbsolute(newbase); emit shrinkChanged( shrink() ); } + +void dviWindow::resizeEvent(QResizeEvent *e) +{ + QScrollView::resizeEvent(e); + emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); +} + +void dviWindow::contentsMoving( int x, int y ) +{ + emit currentPosChanged( QPoint(x, y) ); +} + + +void dviWindow::drawContents(QPainter *p, + int clipx, int clipy, + int clipw, int cliph ) +{ + if ( pixmap ) + p->drawPixmap(clipx, clipy, *pixmap, clipx, clipy, clipw, cliph); +} diff --git a/dviwin.h b/dviwin.h index 5fb20051e..e264098e5 100644 --- a/dviwin.h +++ b/dviwin.h @@ -8,14 +8,13 @@ #define _dviwin_h_ #include "../config.h" -#include #include #include -#include #include #include +#include -class dviWindow : public QWidget +class dviWindow : public QScrollView { Q_OBJECT @@ -49,16 +48,17 @@ public: QSize viewSize(); QSize pageSize(); QPoint currentPos(); - + signals: + void setPoint( QPoint p ); void currentPage(int page); void pageSizeChanged( QSize ); - void viewSizeChanged( QSize ); + void viewSizeChanged( QSize ); void currentPosChanged( QPoint ); void shrinkChanged( int shrink ); void fileChanged(); void statusChange( const QString & ); - void setPoint( QPoint p ); + public slots: void setFile(const char *fname); @@ -75,16 +75,16 @@ public slots: void drawPage(); protected: - void paintEvent( QPaintEvent *pe ); - void resizeEvent ( QResizeEvent *); - void mousePressEvent ( QMouseEvent *e); - void mouseMoveEvent ( QMouseEvent *e); + void resizeEvent(QResizeEvent *e); + void viewportMousePressEvent ( QMouseEvent *e); + void viewportMouseMoveEvent ( QMouseEvent *e); void keyPressEvent ( QKeyEvent *e); - + void drawContents ( QPainter *p, + int clipx, int clipy, + int clipw, int cliph ); private slots: - void scrollVert( int ); - void scrollHorz( int ); void timerEvent(); + void contentsMoving(int x, int y); private: bool changedDVI(); @@ -92,18 +92,9 @@ private: void initDVI(); void drawDVI(); void changePageSize(); - void setChildrenGeometries(int doupdate=TRUE); - void scrollRelative(const QPoint r, int doupdate=TRUE); - void scrollAbsolute(const QPoint r); - QScrollBar * hsb; - QScrollBar * vsb; - QWidget block; - int hscroll, vscroll; - int hclip, vclip; - QPoint mouse, base; + QPoint mouse; QString filename; int basedpi, makepk; - int showsbs; QPixmap * pixmap; QTimer * timer; QString MetafontMode; diff --git a/scrbox.cpp b/scrbox.cpp index 4b0078c17..fd562b2de 100644 --- a/scrbox.cpp +++ b/scrbox.cpp @@ -7,19 +7,13 @@ ** *****************************************************************************/ -#include "scrbox.h" -#include -#include -#include -#include -#include -#include -#include #include -#include + #include #include +#include "scrbox.h" + ScrollBox::ScrollBox( QWidget * parent , const char * name ) : QFrame( parent, name ) { @@ -46,14 +40,20 @@ void ScrollBox::mouseMoveEvent ( QMouseEvent *e ) pagesize.height() / height(); - setViewPos( viewpos + QPoint( dx, dy ) ); + // Notify the word what the view position has changed + // The word in turn will notify as that view position has changed + // Even if coordinates are out of range JScrollView hendle + // this properly + emit valueChanged( viewpos + QPoint( dx, dy ) ); + mouse = e->pos(); } void ScrollBox::drawContents ( QPainter *p ) { - if (pagesize.isNull()) + if (pagesize.isNull()) return; + QRect c( contentsRect() ); int len = pagesize.width(); @@ -66,36 +66,23 @@ void ScrollBox::drawContents ( QPainter *p ) int h = c.height() * viewsize.height() / len; if ( h > c.height() ) h = c.height(); - qDrawShadePanel( p, x, y, w, h, colorGroup(), FALSE, 1, 0); + qDrawShadePanel( p, x, y, w, h, colorGroup(), FALSE, 1, 0); } void ScrollBox::setPageSize( QSize s ) { pagesize = s; - update(); + repaint(); } void ScrollBox::setViewSize( QSize s ) { viewsize = s; - update(); + repaint(); } void ScrollBox::setViewPos( QPoint pos ) { - QPoint old = viewpos; - int x = pos.x(); - int y = pos.y(); - QSize limit = pagesize - viewsize + QSize(1,1); - if ( x > limit.width() ) x = limit.width(); - if ( x < 0 ) x = 0; - if ( y > limit.height() ) y = limit.height(); - if ( y < 0 ) y = 0; - - viewpos = QPoint( x, y ); - - if ( viewpos == old ) - return; - emit valueChanged( viewpos ); - update(); + viewpos = pos; + repaint(); } diff --git a/scrbox.h b/scrbox.h index 53009ff43..33cbd021b 100644 --- a/scrbox.h +++ b/scrbox.h @@ -11,7 +11,6 @@ #define SCROLL_BOX_H #include -#include class ScrollBox: public QFrame {