dviwin rewritten to use QScrollView and impruve scrolling

scrollbox rewritten to accomodate dviwin change and improve repainting.

svn path=/trunk/kdegraphics/kdvi/; revision=38111
remotes/origin/kdvi-2.0
Dima Rogozin 27 years ago
parent 76801ee3a4
commit 3d45131c30
  1. 264
      dviwin.cpp
  2. 37
      dviwin.h
  3. 45
      scrbox.cpp
  4. 1
      scrbox.h

@ -4,8 +4,8 @@
// Previewer for TeX DVI files.
//
#include "dviwin.h"
#include "prefs.h"
#include <stdlib.h>
#include <unistd.h>
#include <qbitmap.h>
#include <qkeycode.h>
@ -17,8 +17,8 @@
#include <kdebug.h>
#include <klocale.h>
#include <stdlib.h>
#include <unistd.h>
#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<char*>("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);
}

@ -8,14 +8,13 @@
#define _dviwin_h_
#include "../config.h"
#include <qwidget.h>
#include <qpainter.h>
#include <qevent.h>
#include <qscrollbar.h>
#include <qtimer.h>
#include <qdatetime.h>
#include <qscrollview.h>
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;

@ -7,19 +7,13 @@
**
*****************************************************************************/
#include "scrbox.h"
#include <qtabdialog.h>
#include <qmultilinedit.h>
#include <qbuttongroup.h>
#include <qradiobutton.h>
#include <qlabel.h>
#include <qcombobox.h>
#include <qlayout.h>
#include <stdio.h>
#include <qstring.h>
#include <qpainter.h>
#include <qdrawutil.h>
#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();
}

@ -11,7 +11,6 @@
#define SCROLL_BOX_H
#include <qframe.h>
#include <qrangecontrol.h>
class ScrollBox: public QFrame
{

Loading…
Cancel
Save