commit d82e6d2bf0558397238e30b0a95086914af81168
Author: Juergen Spitzmueller <[email protected]>
Date:   Sun Jan 5 14:14:06 2025 +0100

    Let errors-show open with the next error from current curson selected
---
 src/frontends/Delegates.h         |  3 ++-
 src/frontends/qt/GuiErrorList.cpp |  9 ++++++++-
 src/frontends/qt/GuiErrorList.h   |  2 ++
 src/frontends/qt/GuiView.cpp      | 30 +++++++++++++++++++-----------
 src/frontends/qt/GuiView.h        | 13 ++++++++++---
 5 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/src/frontends/Delegates.h b/src/frontends/Delegates.h
index 715505edc6..a67ccec65c 100644
--- a/src/frontends/Delegates.h
+++ b/src/frontends/Delegates.h
@@ -64,7 +64,8 @@ public:
        /// This function is called when the buffer structure has been updated.
        virtual void updateTocItem(std::string const &, DocIterator const &) = 
0;
        /// This function is called when some parsing error shows up.
-       virtual void errors(std::string const &, bool from_master = false) = 0;
+       virtual void errors(std::string const &, bool from_master = false,
+                           int const item = -1) = 0;
        /// This function is called when some message shows up.
        virtual void message(docstring const &) = 0;
        /// This function is called when the buffer busy status change.
diff --git a/src/frontends/qt/GuiErrorList.cpp 
b/src/frontends/qt/GuiErrorList.cpp
index 68e6a3e7eb..61b72da8b3 100644
--- a/src/frontends/qt/GuiErrorList.cpp
+++ b/src/frontends/qt/GuiErrorList.cpp
@@ -24,6 +24,7 @@
 #include "Text.h"
 #include "TexRow.h"
 
+#include "support/convert.h"
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
@@ -125,7 +126,7 @@ void GuiErrorList::paramsToDialog()
        ErrorList::const_iterator const en = el.end();
        for (; it != en; ++it)
                errorsLW->addItem(toqstr(it->error));
-       errorsLW->setCurrentRow(0);
+       errorsLW->setCurrentRow(item_);
        showAnywayPB->setEnabled(
                lyx::getStatus(FuncRequest(LFUN_BUFFER_VIEW_CACHE)).enabled());
 }
@@ -149,6 +150,12 @@ bool GuiErrorList::initialiseParams(string const & sdata)
        string error_type = sdata;
        if (from_master_)
                error_type = split(sdata, '|');
+       if (contains(error_type, "@")) {
+               string tmp;
+               string const s = split(error_type, tmp, '@');
+               error_type = tmp;
+               item_ = convert<int>(s);
+       }
        error_type_ = error_type;
        buf_ = from_master_ ?
                bufferview()->buffer().masterBuffer()
diff --git a/src/frontends/qt/GuiErrorList.h b/src/frontends/qt/GuiErrorList.h
index cc20ac9d73..83eb05b93f 100644
--- a/src/frontends/qt/GuiErrorList.h
+++ b/src/frontends/qt/GuiErrorList.h
@@ -65,6 +65,8 @@ private:
        docstring name_;
        ///
        bool from_master_;
+       ///
+       int item_ = 0;
 };
 
 } // namespace frontend
diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp
index c4da265564..c121a10f82 100644
--- a/src/frontends/qt/GuiView.cpp
+++ b/src/frontends/qt/GuiView.cpp
@@ -2172,7 +2172,7 @@ void GuiView::disconnectBufferView()
 }
 
 
-void GuiView::errors(string const & error_type, bool from_master)
+void GuiView::errors(string const & error_type, bool from_master, int const 
item)
 {
        BufferView const * const bv = currentBufferView();
        if (!bv)
@@ -2188,15 +2188,18 @@ void GuiView::errors(string const & error_type, bool 
from_master)
        string err = error_type;
        if (from_master)
                err = "from_master|" + error_type;
+       if (item != -1)
+               err += "@" + convert<string>(item);
        showDialog("errorlist", err);
 }
 
 
-bool GuiView::nextError(string const & error_type, bool from_master, bool 
testonly)
+int GuiView::nextError(string const & error_type, bool from_master,
+                      bool navigateto, bool atcursor)
 {
        BufferView const * const bv = currentBufferView();
        if (!bv)
-               return false;
+               return -1;
 
        Buffer const & buf = from_master
                        ? *(bv->buffer().masterBuffer())
@@ -2205,19 +2208,24 @@ bool GuiView::nextError(string const & error_type, bool 
from_master, bool teston
        ErrorList const & el = buf.errorList(error_type);
 
        if (el.empty())
-               return false;
+               return -1;
 
+       int item = 0;
        for (auto const & err : el) {
-               if (TexRow::isNone(err.start) || 
TexRow::getDocIteratorsFromEntries(err.start, err.end, buf).first <= 
bv->cursor())
+               if (TexRow::isNone(err.start)
+                   || (atcursor && 
TexRow::getDocIteratorsFromEntries(err.start, err.end, buf).first < 
bv->cursor())
+                   || (!atcursor && 
TexRow::getDocIteratorsFromEntries(err.start, err.end, buf).first <= 
bv->cursor())) {
+                       ++item;
                        continue;
-               if (!testonly) {
+               }
+               if (navigateto) {
                        DispatchResult dr;
                        dispatch(TexRow::goToFunc(err.start, err.end), dr);
                }
-               return true;
+               return item;
        }
 
-       return false;
+       return -1;
 }
 
 
@@ -2716,7 +2724,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, 
FuncStatus & flag)
                }
                // We guess it's from master if the single buffer list is empty
                bool const from_master = 
currentBufferView()->buffer().errorList(d.last_export_format).empty();
-               enable = nextError(d.last_export_format, from_master, true);
+               enable = nextError(d.last_export_format, from_master) != -1;
                break;
        }
 
@@ -4966,14 +4974,14 @@ void GuiView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                case LFUN_ERRORS_SHOW: {
                        // We guess it's from master if the single buffer list 
is empty
                        bool const from_master = 
bv->buffer().errorList(d.last_export_format).empty();
-                       errors(d.last_export_format, from_master);
+                       errors(d.last_export_format, from_master, 
nextError(d.last_export_format, from_master, false, true));
                        break;
                }
 
                case LFUN_ERROR_NEXT: {
                        // We guess it's from master if the single buffer list 
is empty
                        bool const from_master = 
bv->buffer().errorList(d.last_export_format).empty();
-                       if (nextError(d.last_export_format, from_master)) {
+                       if (nextError(d.last_export_format, from_master, true) 
!= -1) {
                                dr.forceBufferUpdate();
                                dr.screenUpdate(Update::Force);
                        }
diff --git a/src/frontends/qt/GuiView.h b/src/frontends/qt/GuiView.h
index e026fb51ea..a202279b20 100644
--- a/src/frontends/qt/GuiView.h
+++ b/src/frontends/qt/GuiView.h
@@ -172,13 +172,20 @@ public:
        void resetAutosaveTimers() override;
        // shows an error list
        // if from_master is true, show master's error list
-       void errors(std::string const &, bool from_master = false) override;
+       void errors(std::string const &, bool from_master = false,
+                   int const item = -1) override;
        void structureChanged() override;
        void updateTocItem(std::string const &, DocIterator const &) override;
        //@}
 
-       /// move to next error
-       bool nextError(std::string const &, bool from_master = false, bool 
testonly = false);
+       /** Find the next error from current cursor position.
+        *  \return the error item position in the error list
+        *  with \param navigateto the cursor moves to the error
+        *  with \param atcursor the error at current cursor position
+        *  is considered as well, otherwise only those who follow.
+        */
+       int nextError(std::string const & error_type, bool from_master = false,
+                     bool navigateto = false, bool atcursor = false);
 
        ///
        TocModels & tocModels();
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to