GuiWorkArea::Private::Private(GuiWorkArea * parent)
-: p(parent), buffer_view_(0), read_only_(false), lyx_view_(0), cursor_visible_(false),
+: p(parent), screen_(0), buffer_view_(0), lyx_view_(0), cursor_visible_(false),
need_resize_(false), schedule_redraw_(false), preedit_lines_(1),
completer_(new GuiCompleter(p, p))
{
GuiWorkArea::GuiWorkArea(Buffer & buffer, GuiView & gv)
: d(new Private(this))
{
- d->read_only_ = buffer.isReadonly();
setGuiView(gv);
setBuffer(buffer);
init();
d->cursor_timeout_.setInterval(500);
}
- d->screen_ = QPixmap(viewport()->width(), viewport()->height());
+ 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());
GuiWorkArea::~GuiWorkArea()
{
d->buffer_view_->buffer().workAreaManager().remove(this);
+ delete d->screen_;
delete d->buffer_view_;
delete d->cursor_;
// Completer has a QObject parent and is thus automatically destroyed.
if (lyxerr.debugging(Debug::WORKAREA))
d->buffer_view_->coordCache().dump();
- d->setReadOnly(d->buffer_view_->buffer().isReadonly());
+ updateWindowTitle();
d->updateCursorShape();
}
buffer_view_->mouseEventDispatch(cmd);
// Skip these when selecting
+ // FIXME: let GuiView take care of those.
if (cmd.action() != LFUN_MOUSE_MOTION) {
completer_->updateVisibility(false, false);
lyx_view_->updateDialogs();
// Slight hack: this is only called currently when we
// clicked somewhere, so we force through the display
// of the new status here.
+ // FIXME: let GuiView take care of those.
lyx_view_->clearMessage();
// Show the cursor immediately after any operation
{
// WARNING: Please don't put any code that will trigger a repaint here!
// We are already inside a paint event.
- lyx_view_->setBusy(true);
+ p->stopBlinkingCursor();
+ // Warn our container (GuiView).
+ p->busy(true);
+
Point point;
int h = 0;
buffer_view_->cursorPosAndHeight(point, h);
// as the scrollbar paramters are then set for the first time.
updateScrollbar();
- lyx_view_->updateLayoutList();
- lyx_view_->setBusy(false);
need_resize_ = false;
+ p->busy(false);
+ // Eventually, restart the cursor after the resize event.
+ // We might be resizing even if the focus is on another widget so we only
+ // restart the cursor if we have the focus.
+ if (p->hasFocus())
+ QTimer::singleShot(50, p, SLOT(startBlinkingCursor()));
}
if (lyxrc.cursor_follows_scrollbar) {
d->buffer_view_->setCursorFromScrollbar();
+ // FIXME: let GuiView take care of those.
d->lyx_view_->updateLayoutList();
}
// Show the cursor immediately after any operation.
void GuiWorkArea::contextMenuEvent(QContextMenuEvent * e)
{
- docstring name;
+ string name;
if (e->reason() == QContextMenuEvent::Mouse)
// the menu name is set on mouse press
name = d->context_menu_name_;
void GuiWorkArea::focusInEvent(QFocusEvent * e)
{
LYXERR(Debug::DEBUG, "GuiWorkArea::focusInEvent(): " << this << endl);
- if (d->lyx_view_->currentWorkArea() != this)
+ if (d->lyx_view_->currentWorkArea() != this) {
d->lyx_view_->setCurrentWorkArea(this);
+ d->lyx_view_->currentWorkArea()->bufferView().buffer().updateBuffer();
+ }
startBlinkingCursor();
QAbstractScrollArea::focusInEvent(e);
// << " y: " << rc.y() << " w: " << rc.width() << " h: " << rc.height());
if (d->need_resize_) {
- d->screen_ = QPixmap(viewport()->width(), viewport()->height());
+ d->resetScreen();
d->resizeBufferView();
if (d->cursor_visible_) {
d->hideCursor();
}
QPainter pain(viewport());
- pain.drawPixmap(rc, d->screen_, rc);
+ if (lyxrc.use_qimage) {
+ pain.drawImage(rc, static_cast<QImage const &>(*d->screen_), rc);
+ } else {
+ pain.drawPixmap(rc, static_cast<QPixmap const &>(*d->screen_), rc);
+ }
d->cursor_->draw(pain);
ev->accept();
}
void GuiWorkArea::Private::updateScreen()
{
- GuiPainter pain(&screen_);
+ GuiPainter pain(screen_);
buffer_view_->draw(pain);
}
return;
}
- GuiPainter pain(&d->screen_);
+ GuiPainter pain(d->screen_);
d->buffer_view_->updateMetrics();
d->buffer_view_->draw(pain);
FontInfo font = d->buffer_view_->cursor().getFont().fontInfo();
}
-void GuiWorkArea::Private::setReadOnly(bool read_only)
-{
- if (read_only_ == read_only)
- return;
- read_only_ = read_only;
- p->updateWindowTitle();
- if (p == lyx_view_->currentWorkArea())
- lyx_view_->updateDialogs();
-}
-
-
bool GuiWorkArea::isFullScreen() const
{
return d->lyx_view_ && d->lyx_view_->isFullScreen();
if (lyxrc.full_screen_tabbar)
showBar(!full_screen && count() > 1);
+ else
+ showBar(count() > 1);
}