]> git.lyx.org Git - lyx.git/commitdiff
Implement auto-nesting.
authorJuergen Spitzmueller <spitz@lyx.org>
Thu, 28 Dec 2017 16:44:54 +0000 (17:44 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Thu, 28 Dec 2017 16:44:54 +0000 (17:44 +0100)
Now layouts can specify other layouts that should be nested in and
after the current one (if the layout is switched from the current one
and if it follows a paragraph in the current one).

This is particularly useful for things such as the beamer frames, where
particular layouts are practically always nested.

lib/doc/Customization.lyx
lib/layouts/beamer.layout
lib/scripts/layout2layout.py
src/Layout.cpp
src/Layout.h
src/LyXAction.cpp
src/Text3.cpp
src/TextClass.cpp

index 02f3d92d20c68042eec551a5c9229c74b8b494bd..410b527f19f384dc7bcc198c0e9a7de15998a805 100644 (file)
@@ -124,11 +124,12 @@ logicalmkup
 \papercolumns 1
 \papersides 2
 \paperpagestyle headings
-\tracking_changes false
+\tracking_changes true
 \output_changes false
 \html_math_output 0
 \html_css_as_file 0
 \html_be_strict true
+\author -712698321 "Jürgen Spitzmüller"
 \end_header
 
 \begin_body
@@ -14616,6 +14617,49 @@ protect
 not
 \emph default
  whether this command should itself be protected.)
+\change_inserted -712698321 1514479340
+
+\end_layout
+
+\begin_layout Description
+
+\change_inserted -712698321 1514479340
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1514479340
+Nests
+\end_layout
+
+\end_inset
+
+ Includes a comma-separated list of layout names that should be nested in
+ and after the current one.
+ Only makes sense for nestable layouts (such as environments) 
+\begin_inset Quotes eld
+\end_inset
+
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1514479340
+EndNests
+\end_layout
+
+\end_inset
+
+
+\begin_inset Quotes erd
+\end_inset
+
+.
+\change_unchanged
+
 \end_layout
 
 \begin_layout Description
index ee5f55c34fd7fe38d8b83f57067b64b06f2f8036..4ffc8b62b24c10b74bab9ccee0b4b3613ab872cd 100644 (file)
@@ -6,7 +6,7 @@
 #   Richard Heck <rgheck@lyx.org>, Martin Vermeer <martin.vermeer@hut.fi> and probably others.
 
 
-Format 65
+Format 66
 
 #
 # GLOBAL SETTINGS
@@ -482,6 +482,12 @@ Style Frame
     EndFont
     AutoInsert     1
   EndArgument
+  Nests 
+       Standard,Itemize,Enumerate,Description,FrameTitle,FrameSubtitle,Column,
+       Columns,ColumnsCenterAligned,ColumnsTopAligned,Pause,Overprint,OverlayArea,Only,Block,
+       ExampleBlock,AlertBlock,Bibliography,Quotation,Quote,Verse,Corollary,Definition,Definitions,
+       Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code
+  EndNests
 End
 
 Style PlainFrame
@@ -665,6 +671,11 @@ Style Columns
     Family         Roman
     Color          latex
   EndFont
+  Nests 
+       Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,Block,
+       ExampleBlock,AlertBlock,Bibliography,Quotation,Quote,Verse,Corollary,Definition,Definitions,
+       Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code
+  EndNests
 End
 
 Style ColumnsCenterAligned
@@ -885,6 +896,10 @@ Style Block
     EndFont
     AutoInsert     1
   EndArgument
+  Nests 
+       Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,Quotation,
+       Quote,Verse,Corollary,Definition,Definitions,Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code
+  EndNests
 End
 
 Style ExampleBlock
@@ -1228,6 +1243,9 @@ Style Corollary
     LabelString    "Additional Theorem Text"
     Tooltip        "Additional text appended to the theorem header"
   EndArgument
+  Nests 
+       Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,LyX-Code
+  EndNests
 End
 
 Style Definition
index 2cf54c5e1490b2736570cdb723e80a708478f034..4ae3fbff7f45a4f95805312e9716d6d04580c43c 100644 (file)
@@ -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 = 65
+currentFormat = 66
 
 
 # Incremented to format 4, 6 April 2007, lasgouttes
@@ -220,6 +220,9 @@ currentFormat = 65
 # Incremented to format 65, 16 October 2017 by spitz
 # Color collapsable -> collapsible
 
+# Incremented to format 66, 28 December 2017 by spitz
+# New Layout tag "Nests ... EndNests"
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -469,6 +472,11 @@ def convert(lines, end_format):
                 i += 1
             continue
 
+        if format == 65:
+            # nothing to do.
+            i += 1
+            continue
+
         if format == 64:
             match = re.compile(b'(\\s*Color\\s+)(\\w+)', re.IGNORECASE).match(lines[i])
             if not match:
index ec23e57f1eadcbda44d8d2ac2533bc97601b017f..4f7f215b707b53839c932889e76499f2b5180b7a 100644 (file)
@@ -75,6 +75,7 @@ enum LayoutTags {
        LT_NEED_PROTECT,
        LT_NEWLINE,
        LT_NEXTNOINDENT,
+       LT_NESTS,
        LT_PAR_GROUP,
        LT_PARINDENT,
        LT_PARSEP,
@@ -239,6 +240,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                { "leftmargin",     LT_LEFTMARGIN },
                { "margin",         LT_MARGIN },
                { "needprotect",    LT_NEED_PROTECT },
+               { "nests",          LT_NESTS },
                { "newline",        LT_NEWLINE },
                { "nextnoindent",   LT_NEXTNOINDENT },
                { "obsoletedby",    LT_OBSOLETEDBY },
@@ -592,6 +594,17 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        break;
                }
 
+               case LT_NESTS: {
+                       docstring const nest = subst(subst(subst(lex.getLongString(from_ascii("EndNests")),
+                                                    from_ascii("\n"), docstring()),
+                                                    from_ascii(" "), docstring()),
+                                                    from_ascii("\t"), docstring());
+                       vector<docstring> const nests =
+                               getVectorFromString(nest);
+                       nests_.insert(nests.begin(), nests.end());
+                       break;
+               }
+
                case LT_REFPREFIX: {
                        docstring arg;
                        lex >> arg;
@@ -1387,6 +1400,16 @@ void Layout::write(ostream & os) const
                }
                os << '\n';
        }
+       if (!nests_.empty()) {
+               os << "\tNests ";
+               for (set<docstring>::const_iterator it = nests_.begin();
+                    it != nests_.end(); ++it) {
+                       if (it != nests_.begin())
+                               os << ',';
+                       os << to_utf8(*it);
+               }
+               os << '\n';
+       }
        if (refprefix.empty())
                os << "\tRefPrefix OFF\n";
        else
index 90d1b2e8edf5ff87dc7501aae47f45331c82d546..37a10f0b93bb991888c36474d62225e0be890425 100644 (file)
@@ -149,6 +149,8 @@ public:
        ///
        std::set<std::string> const & requires() const { return requires_; }
        ///
+       std::set<docstring> const & nests() const { return nests_; }
+       ///
        std::string const & latexparam() const { return latexparam_; }
        ///
        docstring leftdelim() const { return leftdelim_; }
@@ -468,6 +470,8 @@ private:
        bool par_group_;
        /// Packages needed for this layout
        std::set<std::string> requires_;
+       /// Layouts that are by default nested after this one
+       std::set<docstring> nests_;
        ///
        LaTeXArgMap latexargs_;
        ///
index 31902637e28450d884df01cf20048aa49b624d14..6acbdb47c24ef4e418ce4d2f79eab70bc2e084e9 100644 (file)
@@ -2313,8 +2313,9 @@ void LyXAction::init()
 /*!
  * \var lyx::FuncCode lyx::LFUN_LAYOUT
  * \li Action: Sets the layout (that is, environment) for the current paragraph.
- * \li Syntax: layout <LAYOUT>
+ * \li Syntax: layout <LAYOUT> [ignorenests]
  * \li Params: <LAYOUT>: the layout to use
+              ignorenests: If specified, nesting advices will be ignored.
  * \endvar
  */
                { LFUN_LAYOUT, "layout", Noop, Layout },
index c7e8b087e9ac96dbd1c5cf5b54a9f9f2e18ef98c..76a0b3259f84d468f032fc97304e5f202f981262 100644 (file)
@@ -1419,11 +1419,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
 
        case LFUN_LAYOUT: {
-               docstring layout = cmd.argument();
+               bool const ignorenests = cmd.getArg(1) == "ignorenests";
+               docstring layout = ignorenests ? from_utf8(cmd.getArg(0)) : cmd.argument();
                LYXERR(Debug::INFO, "LFUN_LAYOUT: (arg) " << to_utf8(layout));
 
                Paragraph const & para = cur.paragraph();
                docstring const old_layout = para.layout().name();
+               set<docstring> nests = para.layout().nests();
                DocumentClass const & tclass = bv->buffer().params().documentClass();
 
                if (layout.empty())
@@ -1473,8 +1475,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        }
                }
 
-               if (change_layout)
+               if (change_layout) {
                        setLayout(cur, layout);
+                       bool do_nest = false;
+                       if (cur.pit() > 0 && pars_[cur.pit() - 1].layout().name() == old_layout)
+                               do_nest = !ignorenests;
+                       if (do_nest && nests.find(layout) != nests.end())
+                               lyx::dispatch(FuncRequest(LFUN_DEPTH_INCREMENT));
+               }
 
                Layout::LaTeXArgMap args = tclass[layout].args();
                Layout::LaTeXArgMap::const_iterator lait = args.begin();
@@ -1531,7 +1539,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                lyx::dispatch(FuncRequest(LFUN_DEPTH_DECREMENT));
                }
                DocumentClass const & tc = bv->buffer().params().documentClass();
-               lyx::dispatch(FuncRequest(LFUN_LAYOUT, tc.plainLayout().name()));
+               lyx::dispatch(FuncRequest(LFUN_LAYOUT, from_ascii("\"") + tc.plainLayout().name()
+                                         + from_ascii("\" ignorenests")));
                lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "plain"));
                if (before) {
                        cur.backwardPos();
@@ -3173,7 +3182,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_LAYOUT: {
                DocumentClass const & tclass = cur.buffer()->params().documentClass();
-               docstring layout = cmd.argument();
+               bool const ignorenests = cmd.getArg(1) == "ignorenests";
+               docstring layout = ignorenests ? from_utf8(cmd.getArg(0)) : cmd.argument();
                if (layout.empty())
                        layout = tclass.defaultLayoutName();
                enable = !owner_->forcePlainLayout() && tclass.hasLayout(layout);
index 6e0a3e56656489a9c474cb4c130b66a4258e9268..a65cea18c7a1fb678e3cce2b708bed7e9dcfcd0f 100644 (file)
@@ -62,7 +62,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 = 65; //spitz: Color collapsable -> collapsible.
+int const LAYOUT_FORMAT = 66; //spitz: New layout tag Nests
 
 
 // Layout format for the current lyx file format. Controls which format is