// Start autosave timer
if (lyxrc.autosave) {
- d.autosave_timeout_.timeout.connect(bind(&GuiView::autoSave, this));
+ // The connection is closed when this is destroyed.
+ d.autosave_timeout_.timeout.connect([this](){ autoSave();});
d.autosave_timeout_.setTimeout(lyxrc.autosave * 1000);
d.autosave_timeout_.start();
}
busyanim->start();
busylabel->hide();
- connect(&d.processing_thread_watcher_, SIGNAL(started()),
+ connect(&d.processing_thread_watcher_, SIGNAL(started()),
busylabel, SLOT(show()));
- connect(&d.processing_thread_watcher_, SIGNAL(finished()),
+ connect(&d.processing_thread_watcher_, SIGNAL(finished()),
busylabel, SLOT(hide()));
QFontMetrics const fm(statusBar()->fontMetrics());
static void handleExportStatus(GuiView * view, Buffer::ExportStatus status,
string const & format)
{
- docstring const fmt = formats.prettyName(format);
+ docstring const fmt = theFormats().prettyName(format);
docstring msg;
switch (status) {
case Buffer::ExportSuccess:
Buffer::ExportStatus const status = watcher->result();
handleExportStatus(this, status, d.processing_format);
-
+
updateToolbars();
BufferView const * const bv = currentBufferView();
if (bv && !bv->buffer().errorList("Export").empty()) {
void GuiView::saveLayout() const
{
QSettings settings;
+ settings.setValue("zoom", lyxrc.currentZoom);
settings.beginGroup("views");
settings.beginGroup(QString::number(id_));
#if defined(Q_WS_X11) || defined(QPA_XCB)
bool GuiView::restoreLayout()
{
QSettings settings;
+ lyxrc.currentZoom = settings.value("zoom", lyxrc.zoom).toInt();
+ lyx::dispatch(FuncRequest(LFUN_BUFFER_ZOOM, convert<docstring>(lyxrc.currentZoom)));
settings.beginGroup("views");
settings.beginGroup(QString::number(id_));
QString const icon_key = "icon_size";
if (!restoreState(settings.value("layout").toByteArray(), 0))
initToolbars();
-
+
// init the toolbars that have not been restored
Toolbars::Infos::iterator cit = guiApp->toolbars().begin();
Toolbars::Infos::iterator end = guiApp->toolbars().end();
initToolbar(cit->name);
}
+ // update lock (all) toolbars positions
+ updateLockToolbars();
+
updateDialogs();
return true;
}
}
+void GuiView::updateLockToolbars()
+{
+ toolbarsMovable_ = false;
+ for (ToolbarInfo const & info : guiApp->toolbars()) {
+ GuiToolbar * tb = toolbar(info.name);
+ if (tb && tb->isMovable())
+ toolbarsMovable_ = true;
+ }
+}
+
+
void GuiView::constructToolbars()
{
ToolbarMap::iterator it = d.toolbars_.begin();
if (visibility & Toolbars::ON)
tb->setVisible(true);
+
+ tb->setMovable(true);
}
LYXERR(Debug::DEBUG, "GuiView::closeEvent()");
if (!GuiViewPrivate::busyBuffers.isEmpty()) {
- Alert::warning(_("Exit LyX"),
+ Alert::warning(_("Exit LyX"),
_("LyX could not be closed because documents are being processed by LyX."));
close_event->setAccepted(false);
return;
// Tell Qt whether the current document is changed
setWindowModified(!buf.isClean());
- if (buf.isReadonly())
+ if (buf.hasReadonlyFlag())
read_only_->show();
else
read_only_->hide();
return;
}
QApplication::restoreOverrideCursor();
- updateLayoutList();
+ updateLayoutList();
}
theGuiApp()->setCurrentView(this);
d.current_work_area_ = wa;
-
+
// We need to reset this now, because it will need to be
// right if the tabWorkArea gets reset in the for loop. We
// will change it back if we aren't in that case.
for (int i = 0; i != d.splitter_->count(); ++i) {
if (d.tabWorkArea(i)->setCurrentWorkArea(wa)) {
- LYXERR(Debug::DEBUG, "Current wa: " << currentWorkArea()
+ LYXERR(Debug::DEBUG, "Current wa: " << currentWorkArea()
<< ", Current main wa: " << currentMainWorkArea());
return;
}
}
-
+
d.current_main_work_area_ = old_cmwa;
-
+
LYXERR(Debug::DEBUG, "This is not a tabbed wa");
on_currentWorkAreaChanged(wa);
BufferView & bv = wa->bufferView();
}
-void GuiView::setBuffer(Buffer * newBuffer)
+void GuiView::setBuffer(Buffer * newBuffer, bool switch_to)
{
LYXERR(Debug::DEBUG, "Setting buffer: " << newBuffer << endl);
LASSERT(newBuffer, return);
-
+
GuiWorkArea * wa = workArea(*newBuffer);
if (wa == 0) {
setBusy(true);
}
connectBuffer(*newBuffer);
connectBufferView(wa->bufferView());
- setCurrentWorkArea(wa);
+ if (switch_to)
+ setCurrentWorkArea(wa);
}
break;
}
+ case LFUN_TOOLBAR_MOVABLE: {
+ string const name = cmd.getArg(0);
+ // use negation since locked == !movable
+ if (name == "*")
+ // toolbar name * locks all toolbars
+ flag.setOnOff(!toolbarsMovable_);
+ else if (GuiToolbar * t = toolbar(name))
+ flag.setOnOff(!(t->isMovable()));
+ else {
+ enable = false;
+ docstring const msg =
+ bformat(_("Unknown toolbar \"%1$s\""), from_utf8(name));
+ flag.message(msg);
+ }
+ break;
+ }
+
case LFUN_ICON_SIZE:
flag.setOnOff(d.iconSize(cmd.argument()) == iconSize());
break;
else if (name == "latexlog")
enable = FileName(doc_buffer->logName()).isReadableFile();
else if (name == "spellchecker")
- enable = theSpellChecker()
+ enable = theSpellChecker()
&& !doc_buffer->isReadonly()
&& !doc_buffer->text().empty();
else if (name == "vclog")
bool const neg_zoom =
convert<int>(cmd.argument()) < 0 ||
(cmd.action() == LFUN_BUFFER_ZOOM_OUT && cmd.argument().empty());
- if (lyxrc.zoom <= zoom_min_ && neg_zoom) {
+ if (lyxrc.currentZoom <= zoom_min_ && neg_zoom) {
docstring const msg =
bformat(_("Zoom level cannot be less than %1$d%."), zoom_min_);
flag.message(msg);
enable = doc_buffer;
break;
}
+
+ case LFUN_BUFFER_ZOOM: {
+ bool const less_than_min_zoom =
+ !cmd.argument().empty() && convert<int>(cmd.argument()) < zoom_min_;
+ if (lyxrc.currentZoom <= zoom_min_ && less_than_min_zoom) {
+ docstring const msg =
+ bformat(_("Zoom level cannot be less than %1$d%."), zoom_min_);
+ flag.message(msg);
+ enable = false;
+ }
+ else
+ enable = doc_buffer;
+ break;
+ }
+
case LFUN_BUFFER_MOVE_NEXT:
case LFUN_BUFFER_MOVE_PREVIOUS:
// we do not cycle when moving
enable = doc_buffer && doc_buffer->lyxvc().checkOutEnabled();
break;
case LFUN_VC_LOCKING_TOGGLE:
- enable = doc_buffer && !doc_buffer->isReadonly()
+ enable = doc_buffer && !doc_buffer->hasReadonlyFlag()
&& doc_buffer->lyxvc().lockingToggleEnabled();
flag.setOnOff(enable && doc_buffer->lyxvc().locking());
break;
case LFUN_VC_REVERT:
- enable = doc_buffer && doc_buffer->lyxvc().inUse() && !doc_buffer->isReadonly();
+ enable = doc_buffer && doc_buffer->lyxvc().inUse()
+ && !doc_buffer->hasReadonlyFlag();
break;
case LFUN_VC_UNDO_LAST:
enable = doc_buffer && doc_buffer->lyxvc().undoLastEnabled();
if (fname.empty()) {
FileDialog dlg(qt_("Select document to open"));
dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
- dlg.setButton2(qt_("Examples|#E#e"),
- toqstr(addPath(package().system_support().absFileName(), "examples")));
+ dlg.setButton2(qt_("Examples|#E#e"), toqstr(lyxrc.example_path));
QStringList const filter(qt_("LyX Documents (*.lyx)"));
FileDialog::Result result =
string const tofile =
support::changeExtension(filename.absFileName(),
- formats.extension(*it));
+ theFormats().extension(*it));
if (!theConverters().convert(0, filename, FileName(tofile),
filename, format, *it, errorList))
return false;
if (loader_format.empty()) {
frontend::Alert::error(_("Couldn't import file"),
bformat(_("No information for importing the format %1$s."),
- formats.prettyName(format)));
+ theFormats().prettyName(format)));
return false;
}
} else
bool as_paragraphs = loader_format == "textparagraph";
string filename2 = (loader_format == format) ? filename.absFileName()
: support::changeExtension(filename.absFileName(),
- formats.extension(loader_format));
+ theFormats().extension(loader_format));
lv->currentBufferView()->insertPlaintextFile(FileName(filename2),
as_paragraphs);
guiApp->setCurrentView(lv);
}
docstring const text = bformat(_("Select %1$s file to import"),
- formats.prettyName(format));
+ theFormats().prettyName(format));
FileDialog dlg(toqstr(text));
dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
- dlg.setButton2(qt_("Examples|#E#e"),
- toqstr(addPath(package().system_support().absFileName(), "examples")));
+ dlg.setButton2(qt_("Examples|#E#e"), toqstr(lyxrc.example_path));
- docstring filter = formats.prettyName(format);
+ docstring filter = theFormats().prettyName(format);
filter += " (*.{";
// FIXME UNICODE
- filter += from_utf8(formats.extensions(format));
+ filter += from_utf8(theFormats().extensions(format));
filter += "})";
FileDialog::Result result =
// FIXME UNICODE
FileDialog dlg(qt_("Select LyX document to insert"));
dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
- dlg.setButton2(qt_("Examples|#E#e"),
- toqstr(addPath(package().system_support().absFileName(),
- "examples")));
+ dlg.setButton2(qt_("Examples|#E#e"), toqstr(lyxrc.example_path));
FileDialog::Result result = dlg.open(toqstr(initpath),
QStringList(qt_("LyX Documents (*.lyx)")));
types << anyformat;
vector<Format const *> export_formats;
- for (Format const & f : formats)
+ for (Format const & f : theFormats())
if (f.documentFormat())
export_formats.push_back(&f);
sort(export_formats.begin(), export_formats.end(), Format::formatSorter);
string fmt_name;
fname.set(fromqstr(result.second));
if (filter == anyformat)
- fmt_name = formats.getFormatFromExtension(fname.extension());
+ fmt_name = theFormats().getFormatFromExtension(fname.extension());
else
fmt_name = fmap[filter];
LYXERR(Debug::FILES, "filter=" << fromqstr(filter)
Buffer & buf = wa->bufferView().buffer();
if (GuiViewPrivate::busyBuffers.contains(&buf)) {
- Alert::warning(_("Close document"),
+ Alert::warning(_("Close document"),
_("Document could not be closed because it is being processed by LyX."));
return false;
}
setBuffer(&buf);
docstring file;
+ bool exists;
// FIXME: Unicode?
- if (buf.isUnnamed())
+ if (buf.isUnnamed()) {
file = from_utf8(buf.fileName().onlyFileName());
- else
- file = buf.fileName().displayName(30);
+ exists = false;
+ } else {
+ FileName filename = buf.fileName();
+ filename.refresh();
+ file = filename.displayName(30);
+ exists = filename.exists();
+ }
// Bring this window to top before asking questions.
raise();
if (ret == 1)
++ret;
} else {
- docstring const text = bformat(_("The document %1$s has unsaved changes."
- "\n\nDo you want to save the document or discard the changes?"), file);
- ret = Alert::prompt(_("Save changed document?"),
- text, 0, 2, _("&Save"), _("&Discard"), _("&Cancel"));
+ docstring const text = exists ?
+ bformat(_("The document %1$s has unsaved changes."
+ "\n\nDo you want to save the document or "
+ "discard the changes?"), file) :
+ bformat(_("The document %1$s has not been saved yet."
+ "\n\nDo you want to save the document or "
+ "discard it entirely?"), file);
+ docstring const title = exists ?
+ _("Save changed document?") : _("Save document?");
+ ret = Alert::prompt(title, text, 0, 2,
+ _("&Save"), _("&Discard"), _("&Cancel"));
}
switch (ret) {
{
if (!documentBufferView())
return;
-
+
if (TabWorkArea * twa = d.currentTabWorkArea()) {
Buffer * const curbuf = &documentBufferView()->buffer();
int nwa = twa->count();
case LFUN_VC_COPY: {
if (!buffer || !ensureBufferClean(buffer))
break;
- if (buffer->lyxvc().inUse() && !buffer->isReadonly()) {
+ if (buffer->lyxvc().inUse() && !buffer->hasReadonlyFlag()) {
if (buffer->lyxvc().isCheckInWithConfirmation()) {
// Some changes are not yet committed.
// We test here and not in getStatus(), since
case LFUN_VC_CHECK_IN:
if (!buffer || !ensureBufferClean(buffer))
break;
- if (buffer->lyxvc().inUse() && !buffer->isReadonly()) {
+ if (buffer->lyxvc().inUse() && !buffer->hasReadonlyFlag()) {
string log;
LyXVC::CommandResult ret = buffer->lyxvc().checkIn(log);
dr.setMessage(log);
case LFUN_VC_LOCKING_TOGGLE:
LASSERT(buffer, return);
- if (!ensureBufferClean(buffer) || buffer->isReadonly())
+ if (!ensureBufferClean(buffer) || buffer->hasReadonlyFlag())
break;
if (buffer->lyxvc().inUse()) {
string res = buffer->lyxvc().lockingToggle();
string rev1 = cmd.getArg(0);
string f1, f2;
+ LATTEST(buffer)
// f1
- // it seems safe to assume we have a buffer
- // coverity[FORWARD_NULL]
if (!buffer->lyxvc().prepareFileRevision(rev1, f1))
break;
if (syncFunc) {
status = (used_buffer->*syncFunc)(format, true);
} else if (previewFunc) {
- status = (used_buffer->*previewFunc)(format);
+ status = (used_buffer->*previewFunc)(format);
} else
return false;
handleExportStatus(gv_, status, format);
(void) asyncFunc;
- return (status == Buffer::ExportSuccess
+ return (status == Buffer::ExportSuccess
|| status == Buffer::PreviewSuccess);
#endif
}
dr.setMessage(_("Absolute filename expected."));
break;
}
-
+
FileName filename(fname);
if (fname.empty()) {
FileDialog dlg(qt_("Select file to insert"));
FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
QStringList(qt_("All Files (*)")));
-
+
if (result.first == FileDialog::Later || result.second.isEmpty()) {
dr.setMessage(_("Canceled."));
break;
if (!doc_buffer->isClean()) {
docstring const file =
makeDisplayPath(doc_buffer->absFileName(), 20);
- docstring text = bformat(_("Any changes will be lost. "
- "Are you sure you want to revert to the saved version "
- "of the document %1$s?"), file);
- ret = Alert::prompt(_("Revert to saved document?"),
- text, 1, 1, _("&Revert"), _("&Cancel"));
+ if (doc_buffer->notifiesExternalModification()) {
+ docstring text = _("The current version will be lost. "
+ "Are you sure you want to load the version on disk "
+ "of the document %1$s?");
+ ret = Alert::prompt(_("Reload saved document?"),
+ bformat(text, file), 1, 1,
+ _("&Reload"), _("&Cancel"));
+ } else {
+ docstring text = _("Any changes will be lost. "
+ "Are you sure you want to revert to the saved version "
+ "of the document %1$s?");
+ ret = Alert::prompt(_("Revert to saved document?"),
+ bformat(text, file), 1, 1,
+ _("&Revert"), _("&Cancel"));
+ }
}
if (ret == 0) {
break;
}
+ case LFUN_TOOLBAR_MOVABLE: {
+ string const name = cmd.getArg(0);
+ if (name == "*") {
+ // toggle (all) toolbars movablility
+ toolbarsMovable_ = !toolbarsMovable_;
+ for (ToolbarInfo const & ti : guiApp->toolbars()) {
+ GuiToolbar * tb = toolbar(ti.name);
+ if (tb && tb->isMovable() != toolbarsMovable_)
+ // toggle toolbar movablity if it does not fit lock
+ // (all) toolbars positions state silent = true, since
+ // status bar notifications are slow
+ tb->movable(true);
+ }
+ if (toolbarsMovable_)
+ dr.setMessage(_("Toolbars unlocked."));
+ else
+ dr.setMessage(_("Toolbars locked."));
+ } else if (GuiToolbar * t = toolbar(name)) {
+ // toggle current toolbar movablity
+ t->movable();
+ // update lock (all) toolbars positions
+ updateLockToolbars();
+ }
+ break;
+ }
+
case LFUN_ICON_SIZE: {
QSize size = d.iconSize(cmd.argument());
setIconSize(size);
if (!data.empty())
showDialog("character", data);
} else if (name == "latexlog") {
+ // getStatus checks that
+ LATTEST(doc_buffer);
Buffer::LogType type;
string const logfile = doc_buffer->logName(&type);
switch (type) {
data += Lexer::quoteString(logfile);
showDialog("log", data);
} else if (name == "vclog") {
+ // getStatus checks that
+ LATTEST(doc_buffer);
string const data = "vc " +
Lexer::quoteString(doc_buffer->lyxvc().getLogFile());
showDialog("log", data);
break;
case LFUN_BUFFER_ZOOM_IN:
- case LFUN_BUFFER_ZOOM_OUT: {
+ case LFUN_BUFFER_ZOOM_OUT:
+ case LFUN_BUFFER_ZOOM: {
// use a signed temp to avoid overflow
- int zoom = lyxrc.zoom;
+ int zoom = lyxrc.currentZoom;
if (cmd.argument().empty()) {
- if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
+ if (cmd.action() == LFUN_BUFFER_ZOOM)
+ zoom = lyxrc.zoom;
+ else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
zoom += 20;
else
zoom -= 20;
- } else
- zoom += convert<int>(cmd.argument());
+ } else {
+ if (cmd.action() == LFUN_BUFFER_ZOOM)
+ zoom = convert<int>(cmd.argument());
+ else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
+ zoom += convert<int>(cmd.argument());
+ else
+ zoom -= convert<int>(cmd.argument());
+ }
if (zoom < static_cast<int>(zoom_min_))
zoom = zoom_min_;
- lyxrc.zoom = zoom;
- dr.setMessage(bformat(_("Zoom level is now %1$d%"), lyxrc.zoom));
+ lyxrc.currentZoom = zoom;
+
+ dr.setMessage(bformat(_("Zoom level is now %1$d%"), lyxrc.currentZoom));
// The global QPixmapCache is used in GuiPainter to cache text
// painting so we must reset it.
break;
case LFUN_FORWARD_SEARCH: {
- // it seems safe to assume we have a document buffer, since
- // getStatus wants one.
- // coverity[FORWARD_NULL]
+ // it seems safe to assume we have a document buffer, since
+ // getStatus wants one.
+ LATTEST(doc_buffer);
Buffer const * doc_master = doc_buffer->masterBuffer();
FileName const path(doc_master->temppath());
string const texname = doc_master->isChild(doc_buffer)
doc_buffer->absFileName(),
"tex")).mangledFileName()
: doc_buffer->latexName();
- string const fulltexname =
+ string const fulltexname =
support::makeAbsPath(texname, doc_master->temppath()).absFileName();
string const mastername =
removeExtension(doc_master->latexName());