]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiWorkArea.cpp
Some improvements to the graphics dialog
[lyx.git] / src / frontends / qt4 / GuiWorkArea.cpp
index 70dcf3b32c580222b005550b4f4d0a479169158c..6df7e4e2909b51caf81d907f5027ff7b5fc3a699 100644 (file)
@@ -237,8 +237,8 @@ SyntheticMouseEvent::SyntheticMouseEvent()
 GuiWorkArea::Private::Private(GuiWorkArea * parent)
 : p(parent), buffer_view_(0), lyx_view_(0),
   caret_(0), caret_visible_(false),
-  need_resize_(false), schedule_redraw_(false), preedit_lines_(1),
-  pixel_ratio_(1.0),
+  need_resize_(false), preedit_lines_(1),
+  last_pixel_ratio_(1.0),
   completer_(new GuiCompleter(p, p)), dialog_mode_(false), shell_escape_(false),
   read_only_(false), clean_(true), externally_modified_(false)
 {
@@ -306,6 +306,7 @@ void GuiWorkArea::init()
                        generateSyntheticMouseEvent();
                });
 
+       d->resetScreen();
        // With Qt4.5 a mouse event will happen before the first paint event
        // so make sure that the buffer view has an up to date metrics.
        d->buffer_view_->resize(viewport()->width(), viewport()->height());
@@ -451,7 +452,7 @@ void GuiWorkArea::toggleCaret()
 }
 
 
-void GuiWorkArea::redraw(bool update_metrics)
+void GuiWorkArea::scheduleRedraw(bool update_metrics)
 {
        if (!isVisible())
                // No need to redraw in this case.
@@ -469,14 +470,12 @@ void GuiWorkArea::redraw(bool update_metrics)
 
        // update caret position, because otherwise it has to wait until
        // the blinking interval is over
-       if (d->caret_visible_) {
-               d->hideCaret();
-               d->showCaret();
-       }
+       d->updateCaretGeometry();
 
        LYXERR(Debug::WORKAREA, "WorkArea::redraw screen");
        viewport()->update();
 
+       /// FIXME: is this still true now that paintEvent does the actual painting?
        /// \warning: scrollbar updating *must* be done after the BufferView is drawn
        /// because \c BufferView::updateScrollbar() is called in \c BufferView::draw().
        d->updateScrollbar();
@@ -574,7 +573,7 @@ void GuiWorkArea::Private::resizeBufferView()
        buffer_view_->resize(p->viewport()->width(), p->viewport()->height());
        if (caret_in_view)
                buffer_view_->scrollToCursor();
-       p->viewport()->update();
+       updateCaretGeometry();
 
        // Update scrollbars which might have changed due different
        // BufferView dimension. This is especially important when the
@@ -592,11 +591,8 @@ void GuiWorkArea::Private::resizeBufferView()
 }
 
 
-void GuiWorkArea::Private::showCaret()
+void GuiWorkArea::Private::updateCaretGeometry()
 {
-       if (caret_visible_)
-               return;
-
        Point point;
        int h = 0;
        buffer_view_->caretPosAndHeight(point, h);
@@ -631,19 +627,15 @@ void GuiWorkArea::Private::showCaret()
        point.x_ -= buffer_view_->horizScrollOffset();
 
        caret_->update(point.x_, point.y_, h, l_shape, isrtl, completable);
+}
+
 
-       if (schedule_redraw_) {
-               // This happens when a graphic conversion is finished. As we don't know
-               // the size of the new graphics, it's better the update everything.
-               // We can't use redraw() here because this would trigger a infinite
-               // recursive loop with showCaret().
-               buffer_view_->resize(p->viewport()->width(), p->viewport()->height());
-               p->viewport()->update();
-               updateScrollbar();
-               schedule_redraw_ = false;
+void GuiWorkArea::Private::showCaret()
+{
+       if (caret_visible_)
                return;
-       }
 
+       updateCaretGeometry();
        p->viewport()->update(caret_->rect());
 }
 
@@ -1255,15 +1247,15 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
        // LYXERR(Debug::PAINTING, "paintEvent begin: x: " << rc.x()
        //      << " y: " << rc.y() << " w: " << rc.width() << " h: " << rc.height());
 
-       if (d->needResize()) {
+       if (d->need_resize_ || pixelRatio() != d->last_pixel_ratio_) {
+               d->resetScreen();
                d->resizeBufferView();
-               if (d->caret_visible_) {
-                       d->hideCaret();
-                       d->showCaret();
-               }
        }
 
-       GuiPainter pain(viewport(), pixelRatio());
+       d->last_pixel_ratio_ = pixelRatio();
+
+       GuiPainter pain(d->screenDevice(), pixelRatio());
+
        d->buffer_view_->draw(pain, d->caret_visible_);
 
        // The preedit text, if needed
@@ -1272,6 +1264,9 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
        // and the caret
        if (d->caret_visible_)
                d->caret_->draw(pain);
+
+       d->updateScreen(ev->rect());
+
        ev->accept();
 }
 
@@ -1370,12 +1365,6 @@ bool GuiWorkArea::isFullScreen() const
 }
 
 
-void GuiWorkArea::scheduleRedraw()
-{
-       d->schedule_redraw_ = true;
-}
-
-
 bool GuiWorkArea::inDialogMode() const
 {
        return d->dialog_mode_;
@@ -1788,7 +1777,7 @@ void TabWorkArea::on_currentTabChanged(int i)
        GuiWorkArea * wa = workArea(i);
        LASSERT(wa, return);
        wa->setUpdatesEnabled(true);
-       wa->redraw(true);
+       wa->scheduleRedraw(true);
        wa->setFocus();
        ///
        currentWorkAreaChanged(wa);