X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiWorkArea.cpp;h=410f5e97dd6642e18e331ca08999ac6f2119f5c8;hb=dd38c54f667db751680bbce04022ceb0ec4230f0;hp=4780ebbd711cf01ec0af115db321ee6ae688ceff;hpb=a3adb3a21b86e948b54fe182827876d74b964f29;p=lyx.git diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index 4780ebbd71..410f5e97dd 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -239,7 +239,7 @@ GuiWorkArea::GuiWorkArea(QWidget *) : buffer_view_(0), lyx_view_(0), cursor_visible_(false), need_resize_(false), schedule_redraw_(false), - preedit_lines_(1), completer_(new GuiCompleter(this)), + preedit_lines_(1), completer_(new GuiCompleter(this, this)), context_target_pos_() { } @@ -249,7 +249,7 @@ GuiWorkArea::GuiWorkArea(Buffer & buffer, GuiView & gv) : buffer_view_(0), lyx_view_(0), cursor_visible_(false), need_resize_(false), schedule_redraw_(false), - preedit_lines_(1), completer_(new GuiCompleter(this)), + preedit_lines_(1), completer_(new GuiCompleter(this, this)), context_target_pos_() { setGuiView(gv); @@ -321,6 +321,7 @@ GuiWorkArea::~GuiWorkArea() delete buffer_view_; delete cursor_; // Completer has a QObject parent and is thus automatically destroyed. + // See #4758. // delete completer_; } @@ -334,7 +335,7 @@ void GuiWorkArea::setGuiView(GuiView & gv) void GuiWorkArea::setBuffer(Buffer & buffer) { delete buffer_view_; - buffer_view_ = new BufferView(buffer), + buffer_view_ = new BufferView(buffer); buffer.workAreaManager().add(this); // HACK: Prevents an additional redraw when the scrollbar pops up @@ -406,7 +407,7 @@ void GuiWorkArea::startBlinkingCursor() } -void GuiWorkArea::redraw() +void GuiWorkArea::redraw(bool update_metrics) { if (!isVisible()) // No need to redraw in this case. @@ -414,7 +415,7 @@ void GuiWorkArea::redraw() // No need to do anything if this is the current view. The BufferView // metrics are already up to date. - if (lyx_view_ != guiApp->currentView() + if (update_metrics || lyx_view_ != guiApp->currentView() || lyx_view_->currentWorkArea() != this) { // FIXME: it would be nice to optimize for the off-screen case. buffer_view_->updateMetrics(); @@ -455,7 +456,7 @@ void GuiWorkArea::processKeySym(KeySymbol const & key, KeyModifier mod) // we better stop the blinking cursor... // the cursor gets restarted in GuiView::restartCursor() stopBlinkingCursor(); - theLyXFunc().processKeySym(key, mod); + guiApp->processKeySym(key, mod); } @@ -697,14 +698,7 @@ void GuiWorkArea::contextMenuEvent(QContextMenuEvent * e) void GuiWorkArea::focusInEvent(QFocusEvent * e) { - /* - LYXERR(Debug::DEBUG, "GuiWorkArea::focusInEvent(): " << this << std::endl); - GuiWorkArea * old_gwa = theGuiApp()->currentView()->currentWorkArea(); - if (old_gwa) - old_gwa->stopBlinkingCursor(); - lyx_view_->setCurrentWorkArea(this); - */ - + LYXERR(Debug::DEBUG, "GuiWorkArea::focusInEvent(): " << this << endl); if (lyx_view_->currentWorkArea() != this) lyx_view_->setCurrentWorkArea(this); @@ -715,7 +709,7 @@ void GuiWorkArea::focusInEvent(QFocusEvent * e) void GuiWorkArea::focusOutEvent(QFocusEvent * e) { - LYXERR(Debug::DEBUG, "GuiWorkArea::focusOutEvent(): " << this << std::endl); + LYXERR(Debug::DEBUG, "GuiWorkArea::focusOutEvent(): " << this << endl); stopBlinkingCursor(); QAbstractScrollArea::focusOutEvent(e); } @@ -846,7 +840,7 @@ void GuiWorkArea::wheelEvent(QWheelEvent * ev) scroll_value *= delta; // Take into account user preference. - scroll_value *= lyxrc.mouse_wheel_speed; + scroll_value = int(scroll_value * lyxrc.mouse_wheel_speed); LYXERR(Debug::SCROLLING, "wheelScrollLines = " << lines << " delta = " << delta << " scroll_value = " << scroll_value << " page_step = " << page_step); @@ -972,8 +966,10 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev) if (need_resize_) { screen_ = QPixmap(viewport()->width(), viewport()->height()); resizeBufferView(); - hideCursor(); - showCursor(); + if (cursor_visible_) { + hideCursor(); + showCursor(); + } } QPainter pain(viewport()); @@ -1275,7 +1271,9 @@ void EmbeddedWorkArea::disable() stopBlinkingCursor(); if (view().currentWorkArea() != this) return; - LASSERT(view().currentMainWorkArea(), /* */); + // No problem if currentMainWorkArea() is 0 (setCurrentWorkArea() + // tolerates it and shows the background logo), what happens if + // an EmbeddedWorkArea is closed after closing all document WAs view().setCurrentWorkArea(view().currentMainWorkArea()); } @@ -1319,6 +1317,9 @@ TabWorkArea::TabWorkArea(QWidget * parent) #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, @@ -1331,7 +1332,6 @@ TabWorkArea::TabWorkArea(QWidget * parent) QObject::connect(this, SIGNAL(currentChanged(int)), this, SLOT(on_currentTabChanged(int))); -#if QT_VERSION < 0x040500 closeBufferButton = new QToolButton(this); closeBufferButton->setPalette(pal); // FIXME: rename the icon to closebuffer.png @@ -1344,7 +1344,6 @@ TabWorkArea::TabWorkArea(QWidget * parent) QObject::connect(closeBufferButton, SIGNAL(clicked()), this, SLOT(closeCurrentBuffer())); setCornerWidget(closeBufferButton, Qt::TopRightCorner); -#endif // setup drag'n'drop QTabBar* tb = new DragTabBar; @@ -1359,7 +1358,7 @@ TabWorkArea::TabWorkArea(QWidget * parent) this, SLOT(showContextMenu(const QPoint &))); #if QT_VERSION >= 0x040500 connect(tb, SIGNAL(tabCloseRequested(int)), - tb, SLOT(on_tabCloseRequested(int))); + this, SLOT(closeTab(int))); #endif setUsesScrollButtons(true); @@ -1382,8 +1381,9 @@ void TabWorkArea::showBar(bool show) { tabBar()->setEnabled(show); tabBar()->setVisible(show); -#if QT_VERSION < 0x040500 - closeBufferButton->setVisible(show); + closeBufferButton->setVisible(show && lyxrc.single_close_tab_button); +#if QT_VERSION >= 0x040500 + setTabsClosable(!lyxrc.single_close_tab_button); #endif } @@ -1499,17 +1499,14 @@ void TabWorkArea::on_currentTabChanged(int i) return; GuiWorkArea * wa = dynamic_cast(widget(i)); LASSERT(wa, return); - BufferView & bv = wa->bufferView(); - bv.cursor().fixIfBroken(); - bv.updateMetrics(); wa->setUpdatesEnabled(true); - wa->redraw(); + wa->redraw(true); wa->setFocus(); /// currentWorkAreaChanged(wa); LYXERR(Debug::GUI, "currentTabChanged " << i - << "File" << bv.buffer().absFileName()); + << " File: " << wa->bufferView().buffer().absFileName()); } @@ -1526,7 +1523,7 @@ void TabWorkArea::closeCurrentBuffer() } -void TabWorkArea::closeCurrentTab() +void TabWorkArea::hideCurrentTab() { GuiWorkArea * wa; if (clicked_tab_ == -1) @@ -1538,6 +1535,21 @@ void TabWorkArea::closeCurrentTab() wa->view().hideWorkArea(wa); } + +void TabWorkArea::closeTab(int index) +{ + on_currentTabChanged(index); + GuiWorkArea * wa; + if (index == -1) + wa = currentWorkArea(); + else { + wa = dynamic_cast(widget(index)); + LASSERT(wa, /**/); + } + wa->view().closeWorkArea(wa); +} + + /// class DisplayPath { public: @@ -1746,7 +1758,7 @@ void TabWorkArea::showContextMenu(const QPoint & pos) // show tab popup QMenu popup; popup.addAction(QIcon(getPixmap("images/", "hidetab", "png")), - qt_("Hide tab"), this, SLOT(closeCurrentTab())); + qt_("Hide tab"), this, SLOT(hideCurrentTab())); popup.addAction(QIcon(getPixmap("images/", "closetab", "png")), qt_("Close tab"), this, SLOT(closeCurrentBuffer())); popup.exec(tabBar()->mapToGlobal(pos)); @@ -1773,18 +1785,11 @@ DragTabBar::DragTabBar(QWidget* parent) { setAcceptDrops(true); #if QT_VERSION >= 0x040500 - setTabsClosable(true); + setTabsClosable(!lyxrc.single_close_tab_button); #endif } -void DragTabBar::on_tabCloseRequested(int index) -{ - setCurrentIndex(index); - lyx::dispatch(FuncRequest(LFUN_BUFFER_CLOSE)); -} - - #if QT_VERSION < 0x040300 int DragTabBar::tabAt(QPoint const & position) const {