commit 0eb651a2cf6c8c4d39e461748292ffe4e69f2386
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Fri Oct 14 20:08:12 2016 +0200

    New layout tags for better counter handling
    
    * ResumeCounter: allow to resume an (enumerate) counter
    * StepMasterCounter: allow to increase a master counter
---
 lib/doc/Customization.lyx    |  113 ++++++++++++++++++++++++++++++++++++++++++
 lib/scripts/layout2layout.py |   10 +++-
 src/Buffer.cpp               |    8 ++-
 src/Counters.cpp             |   12 +++++
 src/Counters.h               |    4 ++
 src/Layout.cpp               |   18 ++++++-
 src/Layout.h                 |    4 ++
 src/TextClass.cpp            |    2 +-
 8 files changed, 166 insertions(+), 5 deletions(-)

diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx
index 919f7a4..8a45f6e 100644
--- a/lib/doc/Customization.lyx
+++ b/lib/doc/Customization.lyx
@@ -14685,6 +14685,62 @@ CopyStyle
 status collapsed
 
 \begin_layout Plain Layout
+ResumeCounter
+\end_layout
+
+\end_inset
+
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\emph on
+0
+\end_layout
+
+\end_inset
+
+,
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+1
+\end_layout
+
+\end_inset
+
+] Resumes a counter that is usually reset at each new sequence of layouts.
+ This is currently only useful when 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+LabelType
+\end_layout
+
+\end_inset
+
+ is 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Enumerate
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
 RightDelim
 \end_layout
 
@@ -14919,6 +14975,63 @@ status collapsed
 status collapsed
 
 \begin_layout Plain Layout
+StepMasterCounter
+\end_layout
+
+\end_inset
+
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\emph on
+0
+\end_layout
+
+\end_inset
+
+,
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+1
+\end_layout
+
+\end_inset
+
+] Steps the master counter of a given counter at the beginning of a new
+ sequence of layouts.
+ This is currently only useful when 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+LabelType
+\end_layout
+
+\end_inset
+
+ is 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Enumerate
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
 TextFont
 \end_layout
 
diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py
index 113227b..753ef5e 100644
--- a/lib/scripts/layout2layout.py
+++ b/lib/scripts/layout2layout.py
@@ -11,7 +11,7 @@
 # This script will update a .layout file to current format
 
 # The latest layout format is also defined in src/TextClass.cpp
-currentFormat = 60
+currentFormat = 61
 
 
 # Incremented to format 4, 6 April 2007, lasgouttes
@@ -202,6 +202,9 @@ currentFormat = 60
 # Incremented to format 60, 25 March 2016 by lasgouttes
 # Rename caption subtype LongTableNoNumber to Unnumbered
 
+# Incremented to format 61, 14 October 2016 by spitz
+# New Layout tags "ResumeCounter", "StepMasterCounter"
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -445,6 +448,11 @@ def convert(lines, end_format):
                 i += 1
             continue
 
+        if format == 60:
+            # nothing to do.
+            i += 1
+            continue
+
         if format == 59:
             match = re_InsetLayout_CaptionLTNN.match(lines[i])
             if not match:
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index 99641e2..8f04ae4 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -4673,7 +4673,7 @@ static bool needEnumCounterReset(ParIterator const & it)
                --prev_it.top().pit();
                Paragraph const & prev_par = *prev_it;
                if (prev_par.getDepth() <= cur_depth)
-                       return  prev_par.layout().labeltype != LABEL_ENUMERATE;
+                       return prev_par.layout().name() != par.layout().name();
        }
        // start of nested inset: reset
        return true;
@@ -4757,8 +4757,12 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType 
utype) const
                        break;
                }
 
+               // Increase the master counter?
+               if (layout.stepmastercounter && needEnumCounterReset(it))
+                       counters.stepMaster(enumcounter, utype);
+
                // Maybe we have to reset the enumeration counter.
-               if (needEnumCounterReset(it))
+               if (!layout.resumecounter && needEnumCounterReset(it))
                        counters.reset(enumcounter);
                counters.step(enumcounter, utype);
 
diff --git a/src/Counters.cpp b/src/Counters.cpp
index 0b17aa1..75c8911 100644
--- a/src/Counters.cpp
+++ b/src/Counters.cpp
@@ -278,6 +278,18 @@ void Counters::resetSlaves(docstring const & ctr)
 }
 
 
+void Counters::stepMaster(docstring const & ctr, UpdateType utype)
+{
+       CounterList::iterator it = counterList_.find(ctr);
+       if (it == counterList_.end()) {
+               lyxerr << "step: Counter does not exist: "
+                      << to_utf8(ctr) << endl;
+               return;
+       }
+       step(it->second.master(), utype);
+}
+
+
 void Counters::step(docstring const & ctr, UpdateType utype)
 {
        CounterList::iterator it = counterList_.find(ctr);
diff --git a/src/Counters.h b/src/Counters.h
index 4ba0d00..360e297 100644
--- a/src/Counters.h
+++ b/src/Counters.h
@@ -130,6 +130,10 @@ public:
        int value(docstring const & ctr) const;
        /// Reset recursively all the counters that are slaves of the one named 
by \c ctr.
        void resetSlaves(docstring const & ctr);
+       /// Increment by one master of counter named by \c ctr.
+       /// This also resets the counter named by \c ctr.
+       /// \param utype determines whether we track the counters.
+       void stepMaster(docstring const & ctr, UpdateType utype);
        /// Increment by one counter named by \c ctr, and zeroes slave
        /// counter(s) for which it is the master.
        /// \param utype determines whether we track the counters.
diff --git a/src/Layout.cpp b/src/Layout.cpp
index d6a01c9..f3af698 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -105,6 +105,8 @@ enum LayoutTags {
        LT_SPELLCHECK,
        LT_REFPREFIX,
        LT_RESETARGS,
+       LT_RESUMECOUNTER,
+       LT_STEPMASTERCOUNTER,
        LT_RIGHTDELIM,
        LT_FORCELOCAL,
        LT_TOGGLE_INDENT,
@@ -121,6 +123,8 @@ Layout::Layout()
        unknown_ = false;
        margintype = MARGIN_STATIC;
        latextype = LATEX_PARAGRAPH;
+       resumecounter = false;
+       stepmastercounter = false;
        intitle = false;
        inpreamble = false;
        needprotect = false;
@@ -249,10 +253,12 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass 
const & tclass)
                { "refprefix",      LT_REFPREFIX },
                { "requires",       LT_REQUIRES },
                { "resetargs",      LT_RESETARGS },
+               { "resumecounter",  LT_RESUMECOUNTER },
                { "rightdelim",     LT_RIGHTDELIM },
                { "rightmargin",    LT_RIGHTMARGIN },
                { "spacing",        LT_SPACING },
                { "spellcheck",     LT_SPELLCHECK },
+               { "stepmastercounter",  LT_STEPMASTERCOUNTER },
                { "textfont",       LT_TEXTFONT },
                { "toclevel",       LT_TOCLEVEL },
                { "toggleindent",   LT_TOGGLE_INDENT },
@@ -367,6 +373,14 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass 
const & tclass)
                        }
                        break;
 
+               case LT_RESUMECOUNTER:
+                       lex >> resumecounter;
+                       break;
+
+               case LT_STEPMASTERCOUNTER:
+                       lex >> stepmastercounter;
+                       break;
+
                case LT_ARGUMENT:
                        readArgument(lex);
                        break;
@@ -1139,7 +1153,9 @@ void Layout::write(ostream & os) const
        }
        os << "\tInTitle " << intitle << "\n"
              "\tInPreamble " << inpreamble << "\n"
-             "\tTocLevel " << toclevel << '\n';
+             "\tTocLevel " << toclevel << "\n"
+             "\tResumeCounter " << resumecounter << "\n"
+            "\tStepMasterCounter " << stepmastercounter << '\n';
        // ResetArgs does not make sense here
        for (LaTeXArgMap::const_iterator it = latexargs_.begin();
             it != latexargs_.end(); ++it)
diff --git a/src/Layout.h b/src/Layout.h
index 273a361..5f964f8 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -313,6 +313,10 @@ public:
        bool inpreamble;
        /// Which counter to step
        docstring counter;
+       /// Resume counter?
+       bool resumecounter;
+       /// Step master counter?
+       bool stepmastercounter;
        /// Prefix to use when creating labels
        docstring refprefix;
        /// Depth of XML command
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index a783437..5b71cb0 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -61,7 +61,7 @@ namespace lyx {
 // You should also run the development/tools/updatelayouts.py script,
 // to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 60; //lasgouttes LongTableNoNumber => Unnumbered
+int const LAYOUT_FORMAT = 61; //spitz ResumeCounter, StepMasterCounter
 
 
 // Layout format for the current lyx file format. Controls which format is

Reply via email to