#include "frontends/WorkAreaManager.h"
#include <QContextMenuEvent>
+#if (QT_VERSION < 0x050000)
#include <QInputContext>
+#endif
+#include <QDrag>
#include <QHelpEvent>
#ifdef Q_WS_MACX
#include <QMacStyle>
#endif
#include <QMainWindow>
+#include <QMimeData>
#include <QMenu>
#include <QPainter>
#include <QPalette>
#include <QPixmapCache>
#include <QScrollBar>
+#include <QStyleOption>
+#include <QStylePainter>
#include <QTimer>
#include <QToolButton>
#include <QToolTip>
GuiWorkArea::Private::Private(GuiWorkArea * parent)
-: p(parent), buffer_view_(0), 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))
{
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.
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.
startBlinkingCursor();
+#ifdef Q_WS_X11
QApplication::syncX();
+#endif
}
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);
return;
}
+#if (QT_VERSION < 0x050000)
inputContext()->reset();
+#endif
FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(),
q_button_state(e->button()));
d->buffer_view_->scroll(up ? -step : step);
d->buffer_view_->updateMetrics();
} else {
- d->buffer_view_->scrollDocView(value + up ? -step : step, false);
+ d->buffer_view_->scrollDocView(value + (up ? -step : step), false);
}
// In which paragraph do we have to set the cursor ?
// << " 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();
EmbeddedWorkArea::EmbeddedWorkArea(QWidget * w): GuiWorkArea(w)
{
- buffer_ = theBufferList().newBuffer(
- support::FileName::tempName().absFileName() + "_embedded.internal");
+ buffer_ = theBufferList().newInternalBuffer(
+ support::FileName::tempName("embedded.internal").absFileName());
buffer_->setUnnamed(true);
buffer_->setFullyLoaded(true);
setBuffer(*buffer_);
#ifdef Q_WS_MACX
setStyle(&noTabFrameMacStyle);
#endif
-#if QT_VERSION < 0x040500
- lyxrc.single_close_tab_button = true;
-#endif
QPalette pal = palette();
pal.setColor(QPalette::Active, QPalette::Button,
tb->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tb, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showContextMenu(const QPoint &)));
-#if QT_VERSION >= 0x040500
connect(tb, SIGNAL(tabCloseRequested(int)),
this, SLOT(closeTab(int)));
-#endif
setUsesScrollButtons(true);
}
+void TabWorkArea::paintEvent(QPaintEvent * event)
+{
+ if (tabBar()->isVisible()) {
+ QTabWidget::paintEvent(event);
+ } else {
+ // Prevent the selected tab to influence the
+ // painting of the frame of the tab widget.
+ // This is needed for gtk style in Qt.
+ QStylePainter p(this);
+#if QT_VERSION < 0x050000
+ QStyleOptionTabWidgetFrameV2 opt;
+#else
+ QStyleOptionTabWidgetFrame opt;
+#endif
+ initStyleOption(&opt);
+ opt.rect = style()->subElementRect(QStyle::SE_TabWidgetTabPane,
+ &opt, this);
+ opt.selectedTabRect = QRect();
+ p.drawPrimitive(QStyle::PE_FrameTabWidget, opt);
+ }
+}
+
+
void TabWorkArea::mouseDoubleClickEvent(QMouseEvent * event)
{
if (event->button() != Qt::LeftButton)
if (lyxrc.full_screen_tabbar)
showBar(!full_screen && count() > 1);
+ else
+ showBar(count() > 1);
}
tabBar()->setEnabled(show);
tabBar()->setVisible(show);
closeBufferButton->setVisible(show && lyxrc.single_close_tab_button);
-#if QT_VERSION >= 0x040500
setTabsClosable(!lyxrc.single_close_tab_button);
-#endif
}
return 0;
GuiWorkArea * wa = dynamic_cast<GuiWorkArea *>(currentWidget());
- LASSERT(wa, /**/);
+ LATTEST(wa);
return wa;
}
{
while (count()) {
GuiWorkArea * wa = workArea(0);
- LASSERT(wa, /**/);
+ LASSERT(wa, return);
removeTab(0);
delete wa;
}
bool TabWorkArea::setCurrentWorkArea(GuiWorkArea * work_area)
{
- LASSERT(work_area, /**/);
+ LASSERT(work_area, return false);
int index = indexOf(work_area);
if (index == -1)
return false;
wa = currentWorkArea();
else {
wa = workArea(clicked_tab_);
- LASSERT(wa, /**/);
+ LASSERT(wa, return);
}
wa->view().closeWorkArea(wa);
}
wa = currentWorkArea();
else {
wa = workArea(clicked_tab_);
- LASSERT(wa, /**/);
+ LASSERT(wa, return);
}
wa->view().hideWorkArea(wa);
}
wa = currentWorkArea();
else {
wa = workArea(index);
- LASSERT(wa, /**/);
+ LASSERT(wa, return);
}
wa->view().closeWorkArea(wa);
}
: QTabBar(parent)
{
setAcceptDrops(true);
-#if QT_VERSION >= 0x040500
setTabsClosable(!lyxrc.single_close_tab_button);
-#endif
-}
-
-
-#if QT_VERSION < 0x040300
-int DragTabBar::tabAt(QPoint const & position) const
-{
- const int max = count();
- for (int i = 0; i < max; ++i) {
- if (tabRect(i).contains(position))
- return i;
- }
- return -1;
}
-#endif
void DragTabBar::mousePressEvent(QMouseEvent * event)
mimeData->setData("action", "tab-reordering") ;
drag->setMimeData(mimeData);
-#if QT_VERSION >= 0x040300
// get tab pixmap as cursor
QRect r = tabRect(tab);
QPixmap pixmap(r.size());
render(&pixmap, - r.topLeft());
drag->setPixmap(pixmap);
drag->exec();
-#else
- drag->start(Qt::MoveAction);
-#endif
-
}