X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt%2FGuiView.cpp;h=948deb9a756c8378faa666f9974db143287037bd;hb=b96b876403ea541ada6d35fd683b599368c8c854;hp=6e87f007f93151b27ab99bf45d5fce837529f9a4;hpb=c293be56bd12c5dc46e5cedd2828e33918fccef7;p=features.git diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp index 6e87f007f9..948deb9a75 100644 --- a/src/frontends/qt/GuiView.cpp +++ b/src/frontends/qt/GuiView.cpp @@ -95,6 +95,7 @@ #include #include #include +#include #include #include #include @@ -117,7 +118,7 @@ #include #include #include - +#include // sync with GuiAlert.cpp @@ -316,8 +317,8 @@ class GuiView::GuiViewPrivate void operator=(GuiViewPrivate const &); public: GuiViewPrivate(GuiView * gv) - : gv_(gv), current_work_area_(0), current_main_work_area_(0), - layout_(0), autosave_timeout_(5000), + : gv_(gv), current_work_area_(nullptr), current_main_work_area_(nullptr), + layout_(nullptr), autosave_timeout_(5000), in_show_(false) { // hardcode here the platform specific icon size @@ -480,6 +481,29 @@ public: return icon_size; } + static Buffer::ExportStatus previewAndDestroy(Buffer const * orig, + Buffer * buffer, string const & format); + static Buffer::ExportStatus exportAndDestroy(Buffer const * orig, + Buffer * buffer, string const & format); + static Buffer::ExportStatus compileAndDestroy(Buffer const * orig, + Buffer * buffer, string const & format); + static docstring autosaveAndDestroy(Buffer const * orig, Buffer * buffer); + + template + static Buffer::ExportStatus runAndDestroy(const T& func, + Buffer const * orig, Buffer * buffer, string const & format); + + // TODO syncFunc/previewFunc: use bind + bool asyncBufferProcessing(string const & argument, + Buffer const * used_buffer, + docstring const & msg, + Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &), + Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const, + Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const, + bool allow_async); + + QVector guiWorkAreas(); + public: GuiView * gv_; GuiWorkArea * current_work_area_; @@ -504,17 +528,10 @@ public: /// map dialogs_; - unsigned int smallIconSize; - unsigned int normalIconSize; - unsigned int bigIconSize; - unsigned int hugeIconSize; - unsigned int giantIconSize; /// QTimer statusbar_timer_; /// auto-saving of buffers Timeout autosave_timeout_; - /// flag against a race condition due to multiclicks, see bug #1119 - bool in_show_; /// TocModels toc_models_; @@ -527,28 +544,15 @@ public: string processing_format; static QSet busyBuffers; - static Buffer::ExportStatus previewAndDestroy(Buffer const * orig, - Buffer * buffer, string const & format); - static Buffer::ExportStatus exportAndDestroy(Buffer const * orig, - Buffer * buffer, string const & format); - static Buffer::ExportStatus compileAndDestroy(Buffer const * orig, - Buffer * buffer, string const & format); - static docstring autosaveAndDestroy(Buffer const * orig, Buffer * buffer); - template - static Buffer::ExportStatus runAndDestroy(const T& func, - Buffer const * orig, Buffer * buffer, string const & format); - - // TODO syncFunc/previewFunc: use bind - bool asyncBufferProcessing(string const & argument, - Buffer const * used_buffer, - docstring const & msg, - Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &), - Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const, - Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const, - bool allow_async); + unsigned int smallIconSize; + unsigned int normalIconSize; + unsigned int bigIconSize; + unsigned int hugeIconSize; + unsigned int giantIconSize; - QVector guiWorkAreas(); + /// flag against a race condition due to multiclicks, see bug #1119 + bool in_show_; }; QSet GuiView::GuiViewPrivate::busyBuffers; @@ -742,7 +746,7 @@ QVector GuiView::GuiViewPrivate::guiWorkAreas() static void handleExportStatus(GuiView * view, Buffer::ExportStatus status, string const & format) { - docstring const fmt = theFormats().prettyName(format); + docstring const fmt = translateIfPossible(theFormats().prettyName(format)); docstring msg; switch (status) { case Buffer::ExportSuccess: @@ -853,7 +857,7 @@ bool GuiView::restoreLayout() QSettings settings; zoom_ratio_ = settings.value("zoom_ratio", 1.0).toDouble(); // Actual zoom value: default zoom + fractional offset - int zoom = lyxrc.defaultZoom * zoom_ratio_; + int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_); if (zoom < static_cast(zoom_min_)) zoom = zoom_min_; lyxrc.currentZoom = zoom; @@ -921,7 +925,7 @@ GuiToolbar * GuiView::toolbar(string const & name) return it->second; LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name); - return 0; + return nullptr; } @@ -1292,7 +1296,7 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa) { if (d.current_work_area_) // disconnect the current work area from all slots - QObject::disconnect(d.current_work_area_, 0, this, 0); + QObject::disconnect(d.current_work_area_, nullptr, this, nullptr); disconnectBuffer(); disconnectBufferView(); connectBufferView(wa->bufferView()); @@ -1398,6 +1402,49 @@ bool GuiView::event(QEvent * e) //case QEvent::Drop: // break; + case QEvent::WindowStateChange: { + QWindowStateChangeEvent * ev = (QWindowStateChangeEvent*)e; + bool ofstate = (ev->oldState() & Qt::WindowFullScreen); + bool result = QMainWindow::event(e); + bool nfstate = (windowState() & Qt::WindowFullScreen); + if (!ofstate && nfstate) { + LYXERR(Debug::DEBUG, "GuiView: WindowStateChange(): full-screen " << nfstate); + // switch to full-screen state + if (lyxrc.full_screen_statusbar) + statusBar()->hide(); + if (lyxrc.full_screen_menubar) + menuBar()->hide(); + if (lyxrc.full_screen_toolbars) { + ToolbarMap::iterator end = d.toolbars_.end(); + for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it) + if (it->second->isVisibiltyOn() && it->second->isVisible()) + it->second->hide(); + } + for (int i = 0; i != d.splitter_->count(); ++i) + d.tabWorkArea(i)->setFullScreen(true); + setContentsMargins(-2, -2, -2, -2); + // bug 5274 + hideDialogs("prefs", nullptr); + } else if (ofstate && !nfstate) { + LYXERR(Debug::DEBUG, "GuiView: WindowStateChange(): full-screen " << nfstate); + // switch back from full-screen state + if (lyxrc.full_screen_statusbar && !statusBar()->isVisible()) + statusBar()->show(); + if (lyxrc.full_screen_menubar && !menuBar()->isVisible()) + menuBar()->show(); + if (lyxrc.full_screen_toolbars) { + ToolbarMap::iterator end = d.toolbars_.end(); + for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it) + if (it->second->isVisibiltyOn() && !it->second->isVisible()) + it->second->show(); + //updateToolbars(); + } + for (int i = 0; i != d.splitter_->count(); ++i) + d.tabWorkArea(i)->setFullScreen(false); + setContentsMargins(0, 0, 0, 0); + } + return result; + } case QEvent::WindowActivate: { GuiView * old_view = guiApp->currentView(); if (this == old_view) { @@ -1496,7 +1543,7 @@ GuiWorkArea * GuiView::workArea(int index) if (TabWorkArea * twa = d.currentTabWorkArea()) if (index < twa->count()) return twa->workArea(index); - return 0; + return nullptr; } @@ -1507,7 +1554,7 @@ GuiWorkArea * GuiView::workArea(Buffer & buffer) return currentWorkArea(); if (TabWorkArea * twa = d.currentTabWorkArea()) return twa->workArea(buffer); - return 0; + return nullptr; } @@ -1549,7 +1596,7 @@ GuiWorkArea * GuiView::currentWorkArea() GuiWorkArea const * GuiView::currentMainWorkArea() const { if (!d.currentTabWorkArea()) - return 0; + return nullptr; return d.currentTabWorkArea()->currentWorkArea(); } @@ -1557,7 +1604,7 @@ GuiWorkArea const * GuiView::currentMainWorkArea() const GuiWorkArea * GuiView::currentMainWorkArea() { if (!d.currentTabWorkArea()) - return 0; + return nullptr; return d.currentTabWorkArea()->currentWorkArea(); } @@ -1566,7 +1613,7 @@ void GuiView::setCurrentWorkArea(GuiWorkArea * wa) { LYXERR(Debug::DEBUG, "Setting current wa: " << wa << endl); if (!wa) { - d.current_work_area_ = 0; + d.current_work_area_ = nullptr; d.setBackground(); Q_EMIT bufferViewChanged(); return; @@ -1617,8 +1664,8 @@ void GuiView::removeWorkArea(GuiWorkArea * wa) if (wa == d.current_work_area_) { disconnectBuffer(); disconnectBufferView(); - d.current_work_area_ = 0; - d.current_main_work_area_ = 0; + d.current_work_area_ = nullptr; + d.current_main_work_area_ = nullptr; } bool found_twa = false; @@ -1628,7 +1675,7 @@ void GuiView::removeWorkArea(GuiWorkArea * wa) // Found in this tab group, and deleted the GuiWorkArea. found_twa = true; if (twa->count() != 0) { - if (d.current_work_area_ == 0) + if (d.current_work_area_ == nullptr) // This means that we are closing the current GuiWorkArea, so // switch to the next GuiWorkArea in the found TabWorkArea. setCurrentWorkArea(twa->currentWorkArea()); @@ -1644,13 +1691,13 @@ void GuiView::removeWorkArea(GuiWorkArea * wa) // should be deleted by other means. LASSERT(found_twa, return); - if (d.current_work_area_ == 0) { + if (d.current_work_area_ == nullptr) { if (d.splitter_->count() != 0) { TabWorkArea * twa = d.currentTabWorkArea(); setCurrentWorkArea(twa->currentWorkArea()); } else { // No more work areas, switch to the background widget. - setCurrentWorkArea(0); + setCurrentWorkArea(nullptr); } } } @@ -1710,7 +1757,7 @@ void GuiView::setBuffer(Buffer * newBuffer, bool switch_to) LASSERT(newBuffer, return); GuiWorkArea * wa = workArea(*newBuffer); - if (wa == 0) { + if (wa == nullptr) { setBusy(true); newBuffer->masterBuffer()->updateBuffer(); setBusy(false); @@ -1741,7 +1788,7 @@ void GuiView::connectBuffer(Buffer & buf) void GuiView::disconnectBuffer() { if (d.current_work_area_) - d.current_work_area_->bufferView().buffer().setGuiDelegate(0); + d.current_work_area_->bufferView().buffer().setGuiDelegate(nullptr); } @@ -1754,7 +1801,7 @@ void GuiView::connectBufferView(BufferView & bv) void GuiView::disconnectBufferView() { if (d.current_work_area_) - d.current_work_area_->bufferView().setGuiDelegate(0); + d.current_work_area_->bufferView().setGuiDelegate(nullptr); } @@ -1818,7 +1865,7 @@ BufferView * GuiView::documentBufferView() { return currentMainWorkArea() ? ¤tMainWorkArea()->bufferView() - : 0; + : nullptr; } @@ -1826,19 +1873,19 @@ BufferView const * GuiView::documentBufferView() const { return currentMainWorkArea() ? ¤tMainWorkArea()->bufferView() - : 0; + : nullptr; } BufferView * GuiView::currentBufferView() { - return d.current_work_area_ ? &d.current_work_area_->bufferView() : 0; + return d.current_work_area_ ? &d.current_work_area_->bufferView() : nullptr; } BufferView const * GuiView::currentBufferView() const { - return d.current_work_area_ ? &d.current_work_area_->bufferView() : 0; + return d.current_work_area_ ? &d.current_work_area_->bufferView() : nullptr; } @@ -1859,7 +1906,7 @@ void GuiView::autoSave() LYXERR(Debug::INFO, "Running autoSave()"); Buffer * buffer = documentBufferView() - ? &documentBufferView()->buffer() : 0; + ? &documentBufferView()->buffer() : nullptr; if (!buffer) { resetAutosaveTimers(); return; @@ -1884,9 +1931,9 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) { bool enable = true; Buffer * buf = currentBufferView() - ? ¤tBufferView()->buffer() : 0; + ? ¤tBufferView()->buffer() : nullptr; Buffer * doc_buffer = documentBufferView() - ? &(documentBufferView()->buffer()) : 0; + ? &(documentBufferView()->buffer()) : nullptr; #ifdef Q_OS_MAC /* In LyX/Mac, when a dialog is open, the menus of the @@ -1925,7 +1972,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_MASTER_BUFFER_EXPORT: enable = doc_buffer - && (doc_buffer->parent() != 0 + && (doc_buffer->parent() != nullptr || doc_buffer->hasChildren()) && !d.processing_thread_watcher_.isRunning() // this launches a dialog, which would be in the wrong Buffer @@ -1935,7 +1982,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_MASTER_BUFFER_UPDATE: case LFUN_MASTER_BUFFER_VIEW: enable = doc_buffer - && (doc_buffer->parent() != 0 + && (doc_buffer->parent() != nullptr || doc_buffer->hasChildren()) && !d.processing_thread_watcher_.isRunning(); break; @@ -1959,12 +2006,43 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) && (!doc_buffer->isClean() || doc_buffer->notifiesExternalModification()); break; + case LFUN_BUFFER_RESET_EXPORT: + enable = doc_buffer != nullptr; + break; + case LFUN_BUFFER_CHILD_OPEN: - enable = doc_buffer != 0; + enable = doc_buffer != nullptr; break; + case LFUN_MASTER_BUFFER_FORALL: { + if (doc_buffer == nullptr) { + flag.message(from_utf8(N_("Command not allowed without a buffer open"))); + enable = false; + break; + } + FuncRequest const cmdToPass = lyxaction.lookupFunc(cmd.getLongArg(0)); + if (cmdToPass.action() == LFUN_UNKNOWN_ACTION) { + flag.message(from_utf8(N_("Invalid argument of master-buffer-forall"))); + enable = false; + break; + } + enable = false; + for (Buffer * buf : doc_buffer->allRelatives()) { + GuiWorkArea * wa = workArea(*buf); + if (!wa) + continue; + if (wa->bufferView().getStatus(cmdToPass, flag)) { + enable = flag.enabled(); + break; + } + } + break; + } + case LFUN_BUFFER_WRITE: - enable = doc_buffer && (doc_buffer->isUnnamed() || !doc_buffer->isClean()); + enable = doc_buffer && (doc_buffer->isUnnamed() + || (!doc_buffer->isClean() + || cmd.argument() == "force")); break; //FIXME: This LFUN should be moved to GuiApplication. @@ -1996,7 +2074,6 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) break; } return doc_buffer->getStatus(cmd, flag); - break; } case LFUN_BUFFER_EXPORT_AS: @@ -2007,7 +2084,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) // fall through case LFUN_BUFFER_WRITE_AS: case LFUN_BUFFER_WRITE_AS_TEMPLATE: - enable = doc_buffer != 0; + enable = doc_buffer != nullptr; break; case LFUN_EXPORT_CANCEL: @@ -2016,7 +2093,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_BUFFER_CLOSE: case LFUN_VIEW_CLOSE: - enable = doc_buffer != 0; + enable = doc_buffer != nullptr; break; case LFUN_BUFFER_CLOSE_ALL: @@ -2092,7 +2169,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) break; case LFUN_DROP_LAYOUTS_CHOICE: - enable = buf != 0; + enable = buf != nullptr; break; case LFUN_UI_TOGGLE: @@ -2279,6 +2356,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_SERVER_GOTO_FILE_ROW: case LFUN_LYX_ACTIVATE: + case LFUN_WINDOW_RAISE: break; case LFUN_FORWARD_SEARCH: enable = !(lyxrc.forward_search_dvi.empty() && lyxrc.forward_search_pdf.empty()); @@ -2293,6 +2371,10 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) flag.setOnOff(lyxrc.spellcheck_continuously); break; + case LFUN_CITATION_OPEN: + enable = true; + break; + default: return false; } @@ -2325,7 +2407,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles) { setBusy(true); - Buffer * newBuffer = 0; + Buffer * newBuffer = nullptr; try { newBuffer = checkAndLoadLyXFile(filename); } catch (ExceptionMessage const & e) { @@ -2336,7 +2418,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles) if (!newBuffer) { message(_("Document not loaded.")); - return 0; + return nullptr; } setBuffer(newBuffer); @@ -2445,7 +2527,7 @@ static bool import(GuiView * lv, FileName const & filename, string const tofile = support::changeExtension(filename.absFileName(), theFormats().extension(*it)); - if (theConverters().convert(0, filename, FileName(tofile), + if (theConverters().convert(nullptr, filename, FileName(tofile), filename, format, *it, errorList) != Converters::SUCCESS) return false; loader_format = *it; @@ -2454,7 +2536,7 @@ static bool import(GuiView * lv, FileName const & filename, if (loader_format.empty()) { frontend::Alert::error(_("Couldn't import file"), bformat(_("No information for importing the format %1$s."), - theFormats().prettyName(format))); + translateIfPossible(theFormats().prettyName(format)))); return false; } } else @@ -2501,13 +2583,13 @@ void GuiView::importDocument(string const & argument) } docstring const text = bformat(_("Select %1$s file to import"), - theFormats().prettyName(format)); + translateIfPossible(theFormats().prettyName(format))); FileDialog dlg(toqstr(text)); dlg.setButton1(qt_("D&ocuments"), toqstr(lyxrc.document_path)); dlg.setButton2(qt_("&Examples"), toqstr(lyxrc.example_path)); - docstring filter = theFormats().prettyName(format); + docstring filter = translateIfPossible(theFormats().prettyName(format)); filter += " (*.{"; // FIXME UNICODE filter += from_utf8(theFormats().extensions(format)); @@ -3036,7 +3118,9 @@ bool GuiView::closeWorkArea(GuiWorkArea * wa) " Tools->Preferences->Look&Feel->UserInterface\n" ), file); int ret = Alert::prompt(_("Close or hide document?"), - text, 0, 1, _("&Close"), _("&Hide")); + text, 0, 2, _("&Close"), _("&Hide"), _("&Cancel")); + if (ret == 2) + return false; close_buffer = (ret == 0); } } @@ -3073,6 +3157,14 @@ void GuiView::writeSession() const { bool GuiView::closeBufferAll() { + + for (auto & buf : theBufferList()) { + if (!saveBufferIfNeeded(*buf, false)) { + // Closing has been cancelled, so abort. + return false; + } + } + // Close the workareas in all other views QList const ids = guiApp->viewIds(); for (int i = 0; i != ids.size(); ++i) { @@ -3084,9 +3176,6 @@ bool GuiView::closeBufferAll() if (!closeWorkAreaAll()) return false; - // Now close the hidden buffers. We prevent hidden buffers from being - // dirty, so we can just close them. - theBufferList().closeAll(); return true; } @@ -3152,7 +3241,7 @@ bool GuiView::closeBuffer(Buffer & buf) for (; it != bend; ++it) { Buffer * child_buf = *it; if (theBufferList().isOthersChild(&buf, child_buf)) { - child_buf->setParent(0); + child_buf->setParent(nullptr); continue; } @@ -3175,12 +3264,13 @@ bool GuiView::closeBuffer(Buffer & buf) // Even in this case, children can be dirty (e.g., // after a label change in the master, see #11405). // Therefore, check this - if (closing_ && (child_buf->isClean() || child_buf->paragraphs().empty())) + if (closing_ && (child_buf->isClean() || child_buf->paragraphs().empty())) { // If we are in a close_event all children will be closed in some time, // so no need to do it here. This will ensure that the children end up // in the session file in the correct order. If we close the master // buffer, we can close or release the child buffers here too. continue; + } // Save dirty buffers also if closing_! if (saveBufferIfNeeded(*child_buf, false)) { child_buf->removeAutosaveFile(); @@ -3197,8 +3287,8 @@ bool GuiView::closeBuffer(Buffer & buf) // goto bookmark to update bookmark pit. // FIXME: we should update only the bookmarks related to this buffer! LYXERR(Debug::DEBUG, "GuiView::closeBuffer()"); - for (size_t i = 0; i < theSession().bookmarks().size(); ++i) - guiApp->gotoBookmark(i+1, false, false); + for (unsigned int i = 0; i < theSession().bookmarks().size(); ++i) + guiApp->gotoBookmark(i + 1, false, false); if (saveBufferIfNeeded(buf, false)) { buf.removeAutosaveFile(); @@ -3420,7 +3510,7 @@ void GuiView::checkExternallyModifiedBuffers() void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) { Buffer * buffer = documentBufferView() - ? &(documentBufferView()->buffer()) : 0; + ? &(documentBufferView()->buffer()) : nullptr; switch (cmd.action()) { case LFUN_VC_REGISTER: @@ -3490,8 +3580,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_VC_LOCKING_TOGGLE: - LASSERT(buffer, return); - if (!ensureBufferClean(buffer) || buffer->hasReadonlyFlag()) + if (!buffer || !ensureBufferClean(buffer) || buffer->hasReadonlyFlag()) break; if (buffer->lyxvc().inUse()) { string res = buffer->lyxvc().lockingToggle(); @@ -3506,7 +3595,8 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_VC_REVERT: - LASSERT(buffer, return); + if (!buffer) + break; if (buffer->lyxvc().revert()) { reloadBuffer(*buffer); dr.clearMessageUpdate(); @@ -3514,14 +3604,16 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_VC_UNDO_LAST: - LASSERT(buffer, return); + if (!buffer) + break; buffer->lyxvc().undoLast(); reloadBuffer(*buffer); dr.clearMessageUpdate(); break; case LFUN_VC_REPO_UPDATE: - LASSERT(buffer, return); + if (!buffer) + break; if (ensureBufferClean(buffer)) { dr.setMessage(buffer->lyxvc().repoUpdate()); checkExternallyModifiedBuffers(); @@ -3575,10 +3667,11 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "comparehistory")); break; } + if (!buffer) + break; string rev1 = cmd.getArg(0); string f1, f2; - LATTEST(buffer) // f1 if (!buffer->lyxvc().prepareFileRevision(rev1, f1)) @@ -3614,7 +3707,7 @@ void GuiView::openChildDocument(string const & fname) Buffer & buffer = documentBufferView()->buffer(); FileName const filename = support::makeAbsPath(fname, buffer.filePath()); documentBufferView()->saveBookmark(false); - Buffer * child = 0; + Buffer * child = nullptr; if (theBufferList().exists(filename)) { child = theBufferList().getBuffer(filename); setBuffer(child); @@ -3637,7 +3730,7 @@ bool GuiView::goToFileRow(string const & argument) int row = -1; size_t i = argument.find_last_of(' '); if (i != string::npos) { - file_name = os::internal_path(trim(argument.substr(0, i))); + file_name = os::internal_path(FileName(trim(argument.substr(0, i))).realPath()); istringstream is(argument.substr(i + 1)); is >> row; if (is.fail()) @@ -3647,21 +3740,15 @@ bool GuiView::goToFileRow(string const & argument) LYXERR0("Wrong argument: " << argument); return false; } - Buffer * buf = 0; - string const abstmp = package().temp_dir().absFileName(); + Buffer * buf = nullptr; string const realtmp = package().temp_dir().realPath(); // We have to use os::path_prefix_is() here, instead of // simply prefixIs(), because the file name comes from // an external application and may need case adjustment. - if (os::path_prefix_is(file_name, abstmp, os::CASE_ADJUSTED) - || os::path_prefix_is(file_name, realtmp, os::CASE_ADJUSTED)) { - // Needed by inverse dvi search. If it is a file - // in tmpdir, call the apropriated function. - // If tmpdir is a symlink, we may have the real - // path passed back, so we correct for that. - if (!prefixIs(file_name, abstmp)) - file_name = subst(file_name, realtmp, abstmp); - buf = theBufferList().getBufferFromTmp(file_name); + if (os::path_prefix_is(file_name, realtmp, os::CASE_ADJUSTED)) { + buf = theBufferList().getBufferFromTmp(file_name, true); + LYXERR(Debug::FILES, "goToFileRow: buffer lookup for " << file_name + << (buf ? " success" : " failed")); } else { // Must replace extension of the file to be .lyx // and get full path @@ -3872,12 +3959,11 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) dr.dispatched(true); Buffer * doc_buffer = documentBufferView() - ? &(documentBufferView()->buffer()) : 0; + ? &(documentBufferView()->buffer()) : nullptr; if (cmd.origin() == FuncRequest::TOC) { GuiToc * toc = static_cast(findOrBuild("toc", false)); - // FIXME: do we need to pass a DispatchResult object here? - toc->doDispatch(bv->cursor(), cmd); + toc->doDispatch(bv->cursor(), cmd, dr); return; } @@ -3931,7 +4017,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) _("Exporting ..."), &GuiViewPrivate::exportAndDestroy, &Buffer::doExport, - 0, cmd.allowAsync()); + nullptr, cmd.allowAsync()); // TODO Inform user about success break; } @@ -3951,7 +4037,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) _("Exporting ..."), &GuiViewPrivate::compileAndDestroy, &Buffer::doExport, - 0, cmd.allowAsync()); + nullptr, cmd.allowAsync()); break; } case LFUN_BUFFER_VIEW: { @@ -3959,25 +4045,25 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) doc_buffer, _("Previewing ..."), &GuiViewPrivate::previewAndDestroy, - 0, + nullptr, &Buffer::preview, cmd.allowAsync()); break; } case LFUN_MASTER_BUFFER_UPDATE: { d.asyncBufferProcessing(argument, - (doc_buffer ? doc_buffer->masterBuffer() : 0), + (doc_buffer ? doc_buffer->masterBuffer() : nullptr), docstring(), &GuiViewPrivate::compileAndDestroy, &Buffer::doExport, - 0, cmd.allowAsync()); + nullptr, cmd.allowAsync()); break; } case LFUN_MASTER_BUFFER_VIEW: { d.asyncBufferProcessing(argument, - (doc_buffer ? doc_buffer->masterBuffer() : 0), + (doc_buffer ? doc_buffer->masterBuffer() : nullptr), docstring(), &GuiViewPrivate::previewAndDestroy, - 0, &Buffer::preview, cmd.allowAsync()); + nullptr, &Buffer::preview, cmd.allowAsync()); break; } case LFUN_EXPORT_CANCEL: { @@ -4136,6 +4222,12 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; } + case LFUN_BUFFER_RESET_EXPORT: + LASSERT(doc_buffer, break); + doc_buffer->requireFreshStart(true); + dr.setMessage(_("Buffer export reset.")); + break; + case LFUN_BUFFER_WRITE: LASSERT(doc_buffer, break); saveBuffer(*doc_buffer); @@ -4170,6 +4262,25 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; } + case LFUN_MASTER_BUFFER_FORALL: { + if (!doc_buffer) + break; + + FuncRequest funcToRun = lyxaction.lookupFunc(cmd.getLongArg(0)); + funcToRun.allowAsync(false); + + for (Buffer const * buf : doc_buffer->allRelatives()) { + // Switch to other buffer view and resend cmd + lyx::dispatch(FuncRequest( + LFUN_BUFFER_SWITCH, buf->absFileName())); + lyx::dispatch(funcToRun); + } + // switch back + lyx::dispatch(FuncRequest( + LFUN_BUFFER_SWITCH, doc_buffer->absFileName())); + break; + } + case LFUN_BUFFER_EXTERNAL_MODIFICATION_CLEAR: LASSERT(doc_buffer, break); doc_buffer->clearExternalModification(); @@ -4264,7 +4375,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_DIALOG_HIDE: { - guiApp->hideDialogs(to_utf8(cmd.argument()), 0); + guiApp->hideDialogs(to_utf8(cmd.argument()), nullptr); break; } @@ -4273,8 +4384,8 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) string sdata = trim(to_utf8(cmd.argument()).substr(name.size())); if (name == "latexlog") { - // gettatus checks that - LATTEST(doc_buffer); + // getStatus checks that + LASSERT(doc_buffer, break); Buffer::LogType type; string const logfile = doc_buffer->logName(&type); switch (type) { @@ -4289,7 +4400,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) showDialog("log", sdata); } else if (name == "vclog") { // getStatus checks that - LATTEST(doc_buffer); + LASSERT(doc_buffer, break); string const sdata2 = "vc " + Lexer::quoteString(doc_buffer->lyxvc().getLogFile()); showDialog("log", sdata2); @@ -4334,14 +4445,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) case LFUN_TAB_GROUP_CLOSE: if (TabWorkArea * twa = d.currentTabWorkArea()) { closeTabWorkArea(twa); - d.current_work_area_ = 0; + d.current_work_area_ = nullptr; twa = d.currentTabWorkArea(); // Switch to the next GuiWorkArea in the found TabWorkArea. if (twa) { // Make sure the work area is up to date. setCurrentWorkArea(twa->currentWorkArea()); } else { - setCurrentWorkArea(0); + setCurrentWorkArea(nullptr); } } break; @@ -4349,14 +4460,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) case LFUN_VIEW_CLOSE: if (TabWorkArea * twa = d.currentTabWorkArea()) { closeWorkArea(twa->currentWorkArea()); - d.current_work_area_ = 0; + d.current_work_area_ = nullptr; twa = d.currentTabWorkArea(); // Switch to the next GuiWorkArea in the found TabWorkArea. if (twa) { // Make sure the work area is up to date. setCurrentWorkArea(twa->currentWorkArea()); } else { - setCurrentWorkArea(0); + setCurrentWorkArea(nullptr); } } break; @@ -4411,7 +4522,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } // Actual zoom value: default zoom + fractional extra value - int zoom = lyxrc.defaultZoom * zoom_ratio_; + int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_); if (zoom < static_cast(zoom_min_)) zoom = zoom_min_; @@ -4448,10 +4559,16 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) activateWindow(); break; + case LFUN_WINDOW_RAISE: + raise(); + activateWindow(); + showNormal(); + break; + case LFUN_FORWARD_SEARCH: { // it seems safe to assume we have a document buffer, since // getStatus wants one. - LATTEST(doc_buffer); + LASSERT(doc_buffer, break); Buffer const * doc_master = doc_buffer->masterBuffer(); FileName const path(doc_master->temppath()); string const texname = doc_master->isChild(doc_buffer) @@ -4496,7 +4613,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) command = subst(command, "$$t", texname); command = subst(command, "$$o", outname); - PathChanger p(path); + volatile PathChanger p(path); Systemcall one; one.startscript(Systemcall::DontWait, command); break; @@ -4507,6 +4624,16 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) dr.screenUpdate(Update::Force); break; + case LFUN_CITATION_OPEN: { + string pdfv, psv; + if (theFormats().getFormat("pdf")) + pdfv = theFormats().getFormat("pdf")->viewer(); + if (theFormats().getFormat("ps")) + psv = theFormats().getFormat("ps")->viewer(); + frontend::showTarget(argument, pdfv, psv); + break; + } + default: // The LFUN must be for one of BufferView, Buffer or Cursor; // let's try that: @@ -4552,8 +4679,8 @@ bool GuiView::lfunUiToggle(string const & ui_component) menuBar()->setVisible(!menuBar()->isVisible()); } else if (ui_component == "frame") { - int l, t, r, b; - getContentsMargins(&l, &t, &r, &b); + int const l = contentsMargins().left(); + //are the frames in default state? d.current_work_area_->setFrameStyle(QFrame::NoFrame); if (l == 0) { @@ -4572,42 +4699,14 @@ bool GuiView::lfunUiToggle(string const & ui_component) void GuiView::toggleFullScreen() { - if (isFullScreen()) { - for (int i = 0; i != d.splitter_->count(); ++i) - d.tabWorkArea(i)->setFullScreen(false); - setContentsMargins(0, 0, 0, 0); - setWindowState(windowState() ^ Qt::WindowFullScreen); - restoreLayout(); - menuBar()->show(); - statusBar()->show(); - } else { - // bug 5274 - hideDialogs("prefs", 0); - for (int i = 0; i != d.splitter_->count(); ++i) - d.tabWorkArea(i)->setFullScreen(true); - setContentsMargins(-2, -2, -2, -2); - saveLayout(); - setWindowState(windowState() ^ Qt::WindowFullScreen); - if (lyxrc.full_screen_statusbar) - statusBar()->hide(); - if (lyxrc.full_screen_menubar) - menuBar()->hide(); - if (lyxrc.full_screen_toolbars) { - ToolbarMap::iterator end = d.toolbars_.end(); - for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it) - it->second->hide(); - } - } - - // give dialogs like the TOC a chance to adapt - updateDialogs(); + setWindowState(windowState() ^ Qt::WindowFullScreen); } Buffer const * GuiView::updateInset(Inset const * inset) { if (!inset) - return 0; + return nullptr; Buffer const * inset_buffer = &(inset->buffer()); @@ -4654,7 +4753,7 @@ namespace { char const * const dialognames[] = { "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character", -"citation", "compare", "comparehistory", "document", "errorlist", "ert", +"citation", "compare", "comparehistory", "counter", "document", "errorlist", "ert", "external", "file", "findreplace", "findreplaceadv", "float", "graphics", "href", "include", "index", "index_print", "info", "listings", "label", "line", "log", "lyxfiles", "mathdelimiter", "mathmatrix", "mathspace", "nomenclature", @@ -4679,7 +4778,7 @@ private: bool isValidName(string const & name) { return find_if(dialognames, end_dialognames, - cmpCStr(name.c_str())) != end_dialognames; + cmpCStr(name.c_str())) != end_dialognames; } } // namespace @@ -4688,7 +4787,7 @@ bool isValidName(string const & name) void GuiView::resetDialogs() { // Make sure that no LFUN uses any GuiView. - guiApp->setCurrentView(0); + guiApp->setCurrentView(nullptr); saveLayout(); saveUISettings(); menuBar()->clear(); @@ -4702,10 +4801,23 @@ void GuiView::resetDialogs() } +void GuiView::flatGroupBoxes(const QObject * widget, bool flag) +{ + for (QObject * child: widget->children()) { + if (child->inherits("QGroupBox")) { + QGroupBox * box = (QGroupBox*) child; + box->setFlat(flag); + } else { + flatGroupBoxes(child, flag); + } + } +} + + Dialog * GuiView::findOrBuild(string const & name, bool hide_it) { if (!isValidName(name)) - return 0; + return nullptr; map::iterator it = d.dialogs_.find(name); @@ -4717,6 +4829,11 @@ Dialog * GuiView::findOrBuild(string const & name, bool hide_it) Dialog * dialog = build(name); d.dialogs_[name].reset(dialog); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) + // Force a uniform style for group boxes + // On Mac non-flat works better, on Linux flat is standard + flatGroupBoxes(dialog->asQWidget(), guiApp->platformName() != "cocoa"); +#endif if (lyxrc.allow_geometry_session) dialog->restoreSession(); if (hide_it) @@ -4793,7 +4910,7 @@ void GuiView::hideDialog(string const & name, Inset * inset) if (dialog->isVisibleView()) dialog->hideView(); if (currentBufferView()) - currentBufferView()->editInset(name, 0); + currentBufferView()->editInset(name, nullptr); } @@ -4802,7 +4919,7 @@ void GuiView::disconnectDialog(string const & name) if (!isValidName(name)) return; if (currentBufferView()) - currentBufferView()->editInset(name, 0); + currentBufferView()->editInset(name, nullptr); } @@ -4825,7 +4942,7 @@ void GuiView::updateDialogs() Dialog * dialog = it->second.get(); if (dialog) { if (dialog->needBufferOpen() && !documentBufferView()) - hideDialog(fromqstr(dialog->name()), 0); + hideDialog(fromqstr(dialog->name()), nullptr); else if (dialog->isVisibleView()) dialog->checkStatus(); } @@ -4880,7 +4997,7 @@ Dialog * createGuiProgressView(GuiView & lv); Dialog * GuiView::build(string const & name) { - LASSERT(isValidName(name), return 0); + LASSERT(isValidName(name), return nullptr); Dialog * dialog = createDialog(*this, name); if (dialog) @@ -4961,7 +5078,7 @@ Dialog * GuiView::build(string const & name) if (name == "progress") return createGuiProgressView(*this); - return 0; + return nullptr; }