commit f2af58c5b3296c85769821de0e15524e78c4233a
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat Jul 12 11:25:26 2025 +0200

    Warn if a local layout has an unknown layout format (rest of #11261)
---
 src/BufferParams.cpp             |  9 +++++----
 src/BufferParams.h               |  2 +-
 src/TextClass.cpp                | 30 +++++++++++++++++++++++++-----
 src/TextClass.h                  |  5 +++--
 src/frontends/qt/GuiDocument.cpp |  6 +++---
 5 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 8247b8904a..c5aaa27aee 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3182,7 +3182,7 @@ LayoutFileIndex const & BufferParams::baseClassID() const
 }
 
 
-void BufferParams::makeDocumentClass(bool clone, bool internal)
+void BufferParams::makeDocumentClass(bool clone, bool internal, bool fromgui)
 {
        if (!baseClass())
                return;
@@ -3197,11 +3197,12 @@ void BufferParams::makeDocumentClass(bool clone, bool 
internal)
        TextClass::ReturnValues success = TextClass::OK;
        if (!forced_local_layout_.empty())
                success = doc_class_->read(to_utf8(forced_local_layout_),
-                                          TextClass::MODULE);
+                                          TextClass::MODULE, !clone && 
!fromgui);
        if (!local_layout_.empty() &&
            (success == TextClass::OK || success == TextClass::OK_OLDFORMAT))
-               success = doc_class_->read(to_utf8(local_layout_), 
TextClass::MODULE);
-       if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT) {
+               success = doc_class_->read(to_utf8(local_layout_), 
TextClass::MODULE, !clone && !fromgui);
+       if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT
+           && success != TextClass::FORMAT_UNKNOWN) {
                docstring const msg = _("Error reading internal layout 
information");
                frontend::Alert::warning(_("Read Error"), msg);
        }
diff --git a/src/BufferParams.h b/src/BufferParams.h
index 7c66b465af..16d8be5048 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -159,7 +159,7 @@ public:
        /// on to class BufferView::updateDocumentClass(). The exception, of 
course,
        /// is in GuiDocument, where we use a BufferParams simply to hold a 
copy of
        /// the parameters from the active Buffer.
-       void makeDocumentClass(bool clone = false, bool internal = false);
+       void makeDocumentClass(bool clone = false, bool internal = false, bool 
fromgui = false);
        /// Returns the DocumentClass currently in use: the BaseClass as 
modified
        /// by modules.
        DocumentClass const & documentClass() const;
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index b68bfb0ea1..134eae75a6 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -354,9 +354,16 @@ TextClass::ReturnValues 
TextClass::readWithoutConv(FileName const & filename, Re
 bool TextClass::read(FileName const & filename, ReadType rt)
 {
        ReturnValues const retval = readWithoutConv(filename, rt);
-       if (retval != FORMAT_MISMATCH)
+       if (retval != FORMAT_MISMATCH && retval != FORMAT_UNKNOWN)
                return retval == OK;
 
+       if (retval == FORMAT_UNKNOWN) {
+               docstring const msg =
+                       bformat(_("The layout file %1$s has a version unkown to 
LyX and could thus not be converted.\n"),
+                               from_utf8(filename.absFileName()));
+               frontend::Alert::warning(_("Layout Conversion Error"), msg);
+               return false;
+       }
        bool const worx = convertLayoutFormat(filename, rt);
        if (!worx)
                LYXERR0 ("Unable to convert " << filename <<
@@ -372,16 +379,25 @@ TextClass::ReturnValues TextClass::validate(std::string 
const & str)
 }
 
 
-TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
+TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt, 
bool const warn)
 {
        Lexer lexrc(textClassTags);
        istringstream is(str);
        lexrc.setStream(is);
        ReturnValues retval = read(lexrc, rt);
 
-       if (retval != FORMAT_MISMATCH)
+       if (retval != FORMAT_MISMATCH && retval != FORMAT_UNKNOWN)
                return retval;
 
+       if (retval == FORMAT_UNKNOWN && rt == MODULE) {
+               if (warn)
+                       frontend::Alert::warning(_("Layout Conversion Error"),
+                                                _("A local layout of this 
document has a version unknown to LyX "
+                                                  "and could thus not be 
converted.\n"
+                                                  "Please check Document > 
Settings > Local Layouts!"));
+               return FORMAT_UNKNOWN;
+       }
+
        // write the layout string to a temporary file
        TempFile tmp("TextClass_read");
        FileName const tempfile = tmp.name();
@@ -412,8 +428,12 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, 
ReadType rt)
 
        // The first usable line should be
        // Format LAYOUT_FORMAT
-       if (lexrc.lex() != TC_FORMAT || !lexrc.next()
-           || lexrc.getInteger() != LAYOUT_FORMAT)
+       if (lexrc.lex() != TC_FORMAT || !lexrc.next())
+               return FORMAT_MISMATCH;
+       int const format = lexrc.getInteger();
+       if (format > LAYOUT_FORMAT)
+               return FORMAT_UNKNOWN;
+       else if (format != LAYOUT_FORMAT)
                return FORMAT_MISMATCH;
 
        // parsing
diff --git a/src/TextClass.h b/src/TextClass.h
index 8ff1f23c58..97ba6ea7ef 100644
--- a/src/TextClass.h
+++ b/src/TextClass.h
@@ -156,7 +156,8 @@ public:
                OK,
                OK_OLDFORMAT,
                ERROR,
-               FORMAT_MISMATCH
+               FORMAT_MISMATCH,
+               FORMAT_UNKNOWN
        };
 
        /// Performs the read of the layout file.
@@ -164,7 +165,7 @@ public:
        // FIXME Should return ReturnValues....
        bool read(support::FileName const & filename, ReadType rt = BASECLASS);
        ///
-       ReturnValues read(std::string const & str, ReadType rt = MODULE);
+       ReturnValues read(std::string const & str, ReadType rt = MODULE, bool 
warn = false);
        ///
        ReturnValues read(support::Lexer & lex, ReadType rt = BASECLASS);
        /// validates the layout information passed in str
diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index 56e2d4cebd..312514cbb0 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -3133,7 +3133,7 @@ void GuiDocument::classChanged()
        // or  whatever else there could be). Our parameters come from the 
document
        // class. So when we set the base class, we also need to recreate the 
document
        // class. Otherwise, we still have the old one.
-       bp_.makeDocumentClass();
+       bp_.makeDocumentClass(false, false, true);
        paramsToDialog();
 }
 
@@ -3418,7 +3418,7 @@ void GuiDocument::modulesChanged()
        }
 
        modulesChanged_ = true;
-       bp_.makeDocumentClass();
+       bp_.makeDocumentClass(false, false, true);
        paramsToDialog();
        changed();
 }
@@ -3593,7 +3593,7 @@ void GuiDocument::updateDefaultFormat()
        if (idx >= 0) {
                string const classname = 
fromqstr(latexModule->classCO->getData(idx));
                param_copy.setBaseClass(classname, buffer().layoutPos());
-               param_copy.makeDocumentClass(true);
+               param_copy.makeDocumentClass(true, false, true);
        }
        outputModule->defaultFormatCO->blockSignals(true);
        outputModule->defaultFormatCO->clear();
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to