X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiView.cpp;h=ba6b33dd0c7f6c7893996710ecffbc9c1e77f21f;hb=4e223167ff2872ee123c8354d486352c8a368102;hp=1e5f227081048d231d53cf6f95e451a6afb64a8c;hpb=b45b4a0e87ef85f932956f133cb9e9e446d2471f;p=lyx.git diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 1e5f227081..ba6b33dd0c 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -37,6 +37,7 @@ #include "Cursor.h" #include "ErrorList.h" #include "Format.h" +#include "FuncStatus.h" #include "FuncRequest.h" #include "support/gettext.h" #include "Intl.h" @@ -276,8 +277,13 @@ GuiView::GuiView(int id) // GuiToolbars *must* be initialised before the menu bar. d.toolbars_ = new GuiToolbars(*this); + // set ourself as the current view. This is needed for the menu bar + // filling, at least for the static special menu item on Mac. Otherwise + // they are greyed out. + theLyXFunc().setLyXView(this); + // Fill up the menu bar. - guiApp->menus().fillMenuBar(this); + guiApp->menus().fillMenuBar(menuBar(), this); setCentralWidget(d.stack_widget_); @@ -365,6 +371,10 @@ void GuiView::showEvent(QShowEvent * e) void GuiView::closeEvent(QCloseEvent * close_event) { + // it can happen that this event arrives without selecting the view, + // e.g. when clicking the close button on a background window. + theLyXFunc().setLyXView(this); + while (Buffer * b = buffer()) { if (b->parent()) { // This is a child document, just close the tab after saving @@ -378,7 +388,7 @@ void GuiView::closeEvent(QCloseEvent * close_event) } std::vector const & ids = guiApp->viewIds(); - for (int i = 0; i != ids.size(); ++i) { + for (size_type i = 0; i != ids.size(); ++i) { if (id_ == ids[i]) continue; if (guiApp->view(ids[i]).workArea(*b)) { @@ -406,8 +416,8 @@ void GuiView::closeEvent(QCloseEvent * close_event) // Save toolbars configuration if (isFullScreen()) { - d.toolbars_->toggleFullScreen(!isFullScreen()); - updateToolbars(); + d.toolbars_->toggleFullScreen(!isFullScreen()); + updateToolbars(); } // Make sure the timer time out will not trigger a statusbar update. @@ -533,6 +543,22 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa) } +void GuiView::on_lastWorkAreaRemoved() +{ +#ifdef Q_WS_MAC + // On Mac close the view if there is no Tab open anymore, + // but only if no splitter is visible + if (!lyxrc.open_buffers_in_tabs && d.splitter_->count() == 1) { + TabWorkArea * twa = qobject_cast(d.splitter_->widget(0)); + if (twa && twa->count() == 0) { + // close the view, as no tab is open anymore + QTimer::singleShot(0, this, SLOT(close())); + } + } +#endif +} + + void GuiView::updateStatusBar() { // let the user see the explicit message @@ -715,6 +741,9 @@ TabWorkArea * GuiView::addTabWorkArea() TabWorkArea * twa = new TabWorkArea; QObject::connect(twa, SIGNAL(currentWorkAreaChanged(GuiWorkArea *)), this, SLOT(on_currentWorkAreaChanged(GuiWorkArea *))); + QObject::connect(twa, SIGNAL(lastWorkAreaRemoved()), + this, SLOT(on_lastWorkAreaRemoved())); + d.splitter_->addWidget(twa); d.stack_widget_->setCurrentWidget(d.splitter_); return twa; @@ -1080,20 +1109,19 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd) static FileName selectTemplateFile() { - FileDialog dlg(_("Select template file")); - dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); - dlg.setButton1(_("Templates|#T#t"), from_utf8(lyxrc.template_path)); + FileDialog dlg(qt_("Select template file")); + dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); + dlg.setButton1(qt_("Templates|#T#t"), toqstr(lyxrc.template_path)); FileDialog::Result result = - dlg.open(from_utf8(lyxrc.template_path), - FileFilterList(_("LyX Documents (*.lyx)")), - docstring()); + dlg.open(toqstr(lyxrc.template_path), + FileFilterList(_("LyX Documents (*.lyx)"))); if (result.first == FileDialog::Later) return FileName(); - if (result.second.empty()) + if (result.second.isEmpty()) return FileName(); - return FileName(to_utf8(result.second)); + return FileName(fromqstr(result.second)); } @@ -1108,7 +1136,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles) setBusy(false); return 0; } - + setBuffer(newBuffer); // scroll to the position when the file was last closed @@ -1140,20 +1168,18 @@ void GuiView::openDocument(string const & fname) string filename; if (fname.empty()) { - FileDialog dlg(_("Select document to open"), LFUN_FILE_OPEN); - dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); - dlg.setButton2(_("Examples|#E#e"), - from_utf8(addPath(package().system_support().absFilename(), "examples"))); + FileDialog dlg(qt_("Select document to open"), LFUN_FILE_OPEN); + dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); + dlg.setButton2(qt_("Examples|#E#e"), + toqstr(addPath(package().system_support().absFilename(), "examples"))); FileDialog::Result result = - dlg.open(from_utf8(initpath), - FileFilterList(_("LyX Documents (*.lyx)")), - docstring()); + dlg.open(toqstr(initpath), FileFilterList(_("LyX Documents (*.lyx)"))); if (result.first == FileDialog::Later) return; - filename = to_utf8(result.second); + filename = fromqstr(result.second); // check selected filename if (filename.empty()) { @@ -1186,6 +1212,7 @@ void GuiView::openDocument(string const & fname) Buffer * buf = loadDocument(fullname); if (buf) { updateLabels(*buf); + setBuffer(buf); buf->errors("Parse"); str2 = bformat(_("Document %1$s opened."), disp_fn); @@ -1199,7 +1226,7 @@ void GuiView::openDocument(string const & fname) static bool import(GuiView * lv, FileName const & filename, string const & format, ErrorList & errorList) { - FileName const lyxfile(changeExtension(filename.absFilename(), ".lyx")); + FileName const lyxfile(support::changeExtension(filename.absFilename(), ".lyx")); string loader_format; vector loaders = theConverters().loaders(); @@ -1210,7 +1237,7 @@ static bool import(GuiView * lv, FileName const & filename, continue; string const tofile = - changeExtension(filename.absFilename(), + support::changeExtension(filename.absFilename(), formats.extension(*it)); if (!theConverters().convert(0, filename, FileName(tofile), filename, format, *it, errorList)) @@ -1241,7 +1268,7 @@ static bool import(GuiView * lv, FileName const & filename, lv->setBuffer(b); bool as_paragraphs = loader_format == "textparagraph"; string filename2 = (loader_format == format) ? filename.absFilename() - : changeExtension(filename.absFilename(), + : support::changeExtension(filename.absFilename(), formats.extension(loader_format)); lv->view()->insertPlaintextFile(FileName(filename2), as_paragraphs); theLyXFunc().setLyXView(lv); @@ -1274,10 +1301,10 @@ void GuiView::importDocument(string const & argument) docstring const text = bformat(_("Select %1$s file to import"), formats.prettyName(format)); - FileDialog dlg(text, LFUN_BUFFER_IMPORT); - dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); - dlg.setButton2(_("Examples|#E#e"), - from_utf8(addPath(package().system_support().absFilename(), "examples"))); + FileDialog dlg(toqstr(text), LFUN_BUFFER_IMPORT); + dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); + dlg.setButton2(qt_("Examples|#E#e"), + toqstr(addPath(package().system_support().absFilename(), "examples"))); docstring filter = formats.prettyName(format); filter += " (*."; @@ -1286,14 +1313,12 @@ void GuiView::importDocument(string const & argument) filter += ')'; FileDialog::Result result = - dlg.open(from_utf8(initpath), - FileFilterList(filter), - docstring()); + dlg.open(toqstr(initpath), FileFilterList(filter)); if (result.first == FileDialog::Later) return; - filename = to_utf8(result.second); + filename = fromqstr(result.second); // check selected filename if (filename.empty()) @@ -1306,7 +1331,7 @@ void GuiView::importDocument(string const & argument) // get absolute path of file FileName const fullname(makeAbsPath(filename)); - FileName const lyxfile(changeExtension(fullname.absFilename(), ".lyx")); + FileName const lyxfile(support::changeExtension(fullname.absFilename(), ".lyx")); // Check if the document already is open Buffer * buf = theBufferList().getBuffer(lyxfile.absFilename()); @@ -1395,22 +1420,21 @@ void GuiView::insertLyXFile(docstring const & fname) initpath = trypath; // FIXME UNICODE - FileDialog dlg(_("Select LyX document to insert"), LFUN_FILE_INSERT); - dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); - dlg.setButton2(_("Examples|#E#e"), - from_utf8(addPath(package().system_support().absFilename(), + FileDialog dlg(qt_("Select LyX document to insert"), LFUN_FILE_INSERT); + dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); + dlg.setButton2(qt_("Examples|#E#e"), + toqstr(addPath(package().system_support().absFilename(), "examples"))); FileDialog::Result result = - dlg.open(from_utf8(initpath), - FileFilterList(_("LyX Documents (*.lyx)")), - docstring()); + dlg.open(toqstr(initpath), + FileFilterList(_("LyX Documents (*.lyx)"))); if (result.first == FileDialog::Later) return; // FIXME UNICODE - filename.set(to_utf8(result.second)); + filename.set(fromqstr(result.second)); // check selected filename if (filename.empty()) { @@ -1438,17 +1462,17 @@ void GuiView::insertPlaintextFile(docstring const & fname, return; } - FileDialog dlg(_("Select file to insert"), (asParagraph ? + FileDialog dlg(qt_("Select file to insert"), (asParagraph ? LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT)); - FileDialog::Result result = dlg.open(from_utf8(bv->buffer().filePath()), - FileFilterList(), docstring()); + FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()), + FileFilterList()); if (result.first == FileDialog::Later) return; // FIXME UNICODE - filename.set(to_utf8(result.second)); + filename.set(fromqstr(result.second)); // check selected filename if (filename.empty()) { @@ -1475,10 +1499,10 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname) /// No argument? Ask user through dialog. // FIXME UNICODE - FileDialog dlg(_("Choose a filename to save document as"), + FileDialog dlg(qt_("Choose a filename to save document as"), LFUN_BUFFER_WRITE_AS); - dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); - dlg.setButton2(_("Templates|#T#t"), from_utf8(lyxrc.template_path)); + dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); + dlg.setButton2(qt_("Templates|#T#t"), toqstr(lyxrc.template_path)); if (!isLyXFilename(fname.absFilename())) fname.changeExtension(".lyx"); @@ -1486,14 +1510,14 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname) FileFilterList const filter(_("LyX Documents (*.lyx)")); FileDialog::Result result = - dlg.save(from_utf8(fname.onlyPath().absFilename()), + dlg.save(toqstr(fname.onlyPath().absFilename()), filter, - from_utf8(fname.onlyFileName())); + toqstr(fname.onlyFileName())); if (result.first == FileDialog::Later) return false; - fname.set(to_utf8(result.second)); + fname.set(fromqstr(result.second)); if (fname.empty()) return false; @@ -1585,6 +1609,8 @@ bool GuiView::closeBuffer(Buffer & buf) theLyXFunc().gotoBookmark(i+1, false, false); if (buf.isClean() || buf.paragraphs().empty()) { + if (buf.masterBuffer() == &buf) + LyX::ref().session().lastOpened().add(buf.fileName()); theBufferList().release(&buf); return true; } @@ -1641,10 +1667,6 @@ bool GuiView::dispatch(FuncRequest const & cmd) bv->cursor().updateFlags(Update::None); switch(cmd.action) { - case LFUN_FILE_OPEN: - openDocument(to_utf8(cmd.argument())); - break; - case LFUN_BUFFER_IMPORT: importDocument(to_utf8(cmd.argument())); break; @@ -1672,7 +1694,7 @@ bool GuiView::dispatch(FuncRequest const & cmd) break; case LFUN_MENU_OPEN: - if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument()))) + if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument()), *this)) menu->exec(QCursor::pos()); break; @@ -1906,11 +1928,10 @@ void GuiView::lfunUiToggle(FuncRequest const & cmd) int l, t, r, b; getContentsMargins(&l, &t, &r, &b); //are the frames in default state? + d.current_work_area_->setFrameStyle(QFrame::NoFrame); if (l == 0) { - d.current_work_area_->setFrameStyle(QFrame::NoFrame); setContentsMargins(-2, -2, -2, -2); } else { - d.current_work_area_->setFrameStyle(QFrame::NoFrame); setContentsMargins(0, 0, 0, 0); } return; @@ -2028,7 +2049,7 @@ void GuiView::resetDialogs() // FIXME: the "math panels" toolbar takes an awful lot of time to // initialise so we don't do that for the time being. //d.toolbars_->init(); - guiApp->menus().fillMenuBar(this); + guiApp->menus().fillMenuBar(menuBar(), this); if (d.layout_) d.layout_->updateContents(true); // Now update controls with current buffer.