- restore a backing pixmap painting strategy: the pixmap is drawn at expose() time.

- the cursor is still a widget, the width is 2-pixel on Windows and 1-pixel on other platforms. The full screen refresh on blinking cursor bug is now gone.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15695 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2006-11-02 22:53:10 +00:00
parent 8e54e38c3b
commit ff3c643f09
2 changed files with 39 additions and 57 deletions

View File

@ -39,7 +39,6 @@
#include <QMimeData>
#include <QUrl>
#include <QDragEnterEvent>
#include <QPixmap>
#include <QPainter>
#include <QScrollBar>
@ -50,8 +49,10 @@
// On windows-XP the UserGuide PageDown scroll test is faster without event pruning (16 s)
// than with it (23 s).
#ifdef Q_WS_WIN
int const CursorWidth = 2;
#define USE_EVENT_PRUNING 0
#else
int const CursorWidth = 1;
#define USE_EVENT_PRUNING 0
#endif
@ -120,7 +121,7 @@ public:
CursorWidget(QWidget * parent)
: QWidget(parent)
{
resize(2, 20);
resize(CursorWidth, 20);
}
void paintEvent(QPaintEvent *)
@ -165,10 +166,16 @@ public:
}
*/
}
/// shown?
bool on_;
///
CursorShape shape_;
///
bool show_hcursor_;
///
bool show_vcursor_;
///
bool lshape_cursor_;
///
QColor cursor_color_;
};
@ -496,6 +503,7 @@ void GuiWorkArea::mouseDoubleClickEvent(QMouseEvent * e)
void GuiWorkArea::resizeEvent(QResizeEvent * ev)
{
cursor_->hide();
screen_ = QPixmap(ev->size().width(), ev->size().height());
verticalScrollBar()->setPageStep(viewport()->height());
QAbstractScrollArea::resizeEvent(ev);
resizeBufferView();
@ -554,64 +562,45 @@ void GuiWorkArea::doGreyOut(QLPainter & pain)
void GuiWorkArea::paintEvent(QPaintEvent * ev)
{
/*
lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
<< "\n QWidget width\t" << this->width()
<< "\n QWidget height\t" << this->height()
<< "\n viewport width\t" << viewport()->width()
<< "\n viewport height\t" << viewport()->height()
<< "\n QPaintEvent x\t" << e->rect().x()
<< "\n QPaintEvent y\t" << e->rect().y()
<< "\n QPaintEvent w\t" << e->rect().width()
<< "\n QPaintEvent h\t" << e->rect().height()
<< endl;
*/
QRect const rc = ev->rect();
//lyxerr << "paintEvent begin: x: " << rc.x()
// << " y: " << rc.y()
// << " w: " << rc.width()
// << " h: " << rc.height() << endl;
lyxerr[Debug::PAINTING] << "paintEvent begin: x: " << rc.x()
<< " y: " << rc.y()
<< " w: " << rc.width()
<< " h: " << rc.height() << endl;
if (!buffer_view_) {
lyxerr << "no bufferview" << endl;
return;
}
QLPainter pain(viewport());
if (rc.width() == 3) { // FIXME HACK
// Assume splash screen drawing is requested when
// width == 3
lyxerr << "splash screen requested" << endl;
doGreyOut(pain);
return;
}
if (!buffer_view_->buffer()) {
lyxerr << "no buffer: " << endl;
doGreyOut(pain);
updateScrollbar();
return;
}
//lyxerr << "real drawing" << endl;
paintText(*buffer_view_, pain);
QPainter pain(viewport());
pain.drawPixmap(rc, screen_, rc);
}
void GuiWorkArea::expose(int x, int y, int w, int h)
{
QLPainter pain(&screen_);
if (w == 3) { // FIXME HACK
// Assume splash screen drawing is requested when
// width == 3
lyxerr << "splash screen requested" << endl;
doGreyOut(pain);
}
else if (!buffer_view_->buffer()) {
lyxerr << "no buffer: " << endl;
doGreyOut(pain);
updateScrollbar();
}
else {
paintText(*buffer_view_, pain);
}
update(x, y, w, h);
}
void GuiWorkArea::showCursor(int x, int y, int h, CursorShape shape)
{
cursor_->setGeometry(x, y, 2, h);
cursor_->setGeometry(x, y, CursorWidth, h);
cursor_->shape_ = shape;
cursor_->on_ = true;
cursor_->show();
}

View File

@ -23,6 +23,7 @@
#include <QResizeEvent>
#include <QKeyEvent>
#include <QTimer>
#include <QPixmap>
#include <queue>
@ -167,18 +168,10 @@ private:
///
double_click dc_event_;
///
bool show_hcursor_;
///
bool show_vcursor_;
///
bool lshape_cursor_;
///
QColor cursor_color_;
///
CursorShape cursor_shape_;
///
CursorWidget * cursor_;
///
QPixmap screen_;
};
} // namespace frontend