Extend environment-split to an 'outer' split function

This fixes a major beamer UI flaw reported by several users.
This commit is contained in:
Juergen Spitzmueller 2014-01-27 08:01:24 +01:00
parent 9d7f25a4ae
commit 5a3f1a731f
7 changed files with 118 additions and 8 deletions

View File

@ -112,6 +112,10 @@ Format 1
\bind "M-a Up" "outline-up"
\bind "M-a Down" "outline-down"
\bind "M-a Return" "environment-split"
\bind "M-a S-Return" "environment-split outer"
# Obsolete Tastenbelegung: in die persönliche *.bind Datei kopieren und
# auskommentieren wenn diese Tastenbelegung gewünscht ist.
# \bind "M-a S-quotedbl" "layout Section*" # M-a S-2

View File

@ -125,6 +125,9 @@ Format 1
\bind "M-p Up" "outline-up"
\bind "M-p Down" "outline-down"
\bind "M-p Return" "environment-split"
\bind "M-p S-Return" "environment-split outer"
# These are kept for backwards compatibility (only make sense on US keyboard)
\bind "M-p S-at" "layout Section*" # M-p S-2

View File

@ -318,6 +318,8 @@ Menuset
Item "Move Paragraph Up|o" "paragraph-move-up"
Item "Move Paragraph Down|v" "paragraph-move-down"
Separator
EnvironmentSeparators
Separator
OptItem "Promote Section|r" "outline-out"
OptItem "Demote Section|m" "outline-in"
OptItem "Move Section Down|D" "outline-down"

View File

@ -133,6 +133,7 @@ Menuset
# obvious what the context is for the others)
OptItem "Increase List Depth|I" "depth-increment"
OptItem "Decrease List Depth|D" "depth-decrement"
EnvironmentSeparators
OptItem "Dissolve Inset" "inset-dissolve"
OptItem "TeX Code Settings...|C" "inset-settings ert"
# 'a' shortcut to match Insert entry, shouldn't clash with Table Settings
@ -150,7 +151,6 @@ Menuset
# This is in the Table submenu instead for now.
# OptItem "Table Settings...|a" "inset-settings tabular"
OptItem "Table Settings...|a" "layout-tabular"
OptItem "Split Environment|l" "environment-split"
End
Menu "edit_paste"

View File

@ -3682,7 +3682,9 @@ void LyXAction::init()
/*!
* \var lyx::FuncCode lyx::LFUN_ENVIRONMENT_SPLIT
* \li Action: Splits the current environment with a Separator.
* \li Syntax: environment-split
* \li Syntax: environment-split [outer]
* \li Params: outer: If this is given, LyX will split the outermost environment in
* the current nesting hierarchy.
* \li Origin: spitz, 23 Dec 2012
* \endvar
*/

View File

@ -1378,10 +1378,32 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
}
case LFUN_ENVIRONMENT_SPLIT: {
bool const outer = cmd.argument() == "outer";
Paragraph const & para = cur.paragraph();
docstring const layout = para.layout().name();
docstring layout = para.layout().name();
depth_type split_depth = cur.paragraph().params().depth();
if (outer) {
// check if we have an environment in our nesting hierarchy
pit_type pit = cur.pit();
Paragraph cpar = pars_[pit];
while (true) {
if (pit == 0 || cpar.params().depth() == 0)
break;
--pit;
cpar = pars_[pit];
if (cpar.params().depth() < split_depth
&& cpar.layout().isEnvironment()) {
layout = cpar.layout().name();
split_depth = cpar.params().depth();
}
}
}
if (cur.pos() > 0)
lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK));
if (outer) {
while (cur.paragraph().params().depth() > split_depth)
lyx::dispatch(FuncRequest(LFUN_DEPTH_DECREMENT));
}
bool const morecont = cur.lastpos() > cur.pos();
lyx::dispatch(FuncRequest(LFUN_LAYOUT, "Separator"));
lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse"));
@ -2892,8 +2914,28 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
break;
case LFUN_ENVIRONMENT_SPLIT: {
if (cur.paragraph().layout().isEnvironment()
&& cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) {
if (!cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) {
enable = false;
break;
}
if (cmd.argument() == "outer") {
// check if we have an environment in our nesting hierarchy
bool res = false;
depth_type const current_depth = cur.paragraph().params().depth();
pit_type pit = cur.pit();
Paragraph cpar = pars_[pit];
while (true) {
if (pit == 0 || cpar.params().depth() == 0)
break;
--pit;
cpar = pars_[pit];
if (cpar.params().depth() < current_depth)
res = cpar.layout().isEnvironment();
}
enable = res;
break;
}
else if (cur.paragraph().layout().isEnvironment()) {
enable = true;
break;
}

View File

@ -47,10 +47,12 @@
#include "LyXRC.h"
#include "lyxfind.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
#include "Session.h"
#include "SpellChecker.h"
#include "TextClass.h"
#include "Text.h"
#include "TocBackend.h"
#include "Toolbars.h"
#include "WordLangTuple.h"
@ -185,7 +187,9 @@ public:
Captions,
/** This is the list of captions available
in the InsetCaption context menu. */
SwitchCaptions
SwitchCaptions,
/** Commands to separate environments. */
EnvironmentSeparation
};
explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@ -363,6 +367,7 @@ public:
void expandLanguageSelector(Buffer const * buf);
void expandArguments(BufferView const *, bool switcharg = false);
void expandCaptions(Buffer const * buf, bool switchcap = false);
void expandEnvironmentSeparators(BufferView const *);
///
ItemList items_;
///
@ -474,7 +479,8 @@ void MenuDefinition::read(Lexer & lex)
md_arguments,
md_switcharguments,
md_captions,
md_switchcaptions
md_switchcaptions,
md_env_separators
};
LexerKeyword menutags[] = {
@ -488,6 +494,7 @@ void MenuDefinition::read(Lexer & lex)
{ "documents", md_documents },
{ "elements", md_elements },
{ "end", md_endmenu },
{ "environmentseparators", md_env_separators },
{ "exportformats", md_exportformats },
{ "floatinsert", md_floatinsert },
{ "floatlistinsert", md_floatlistinsert },
@ -651,6 +658,10 @@ void MenuDefinition::read(Lexer & lex)
add(MenuItem(MenuItem::SwitchCaptions));
break;
case md_env_separators:
add(MenuItem(MenuItem::EnvironmentSeparation));
break;
case md_optsubmenu:
case md_submenu: {
lex.next(true);
@ -1649,6 +1660,47 @@ void MenuDefinition::expandCaptions(Buffer const * buf, bool switchcap)
}
}
void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv)
{
if (!bv)
return;
Paragraph const par = bv->cursor().paragraph();
docstring const curlayout = par.layout().name();
docstring outerlayout;
depth_type current_depth = par.params().depth();
// check if we have an environment in our nesting hierarchy
pit_type pit = bv->cursor().pit();
Paragraph cpar = bv->buffer().text().getPar(pit);
while (true) {
if (pit == 0 || cpar.params().depth() == 0)
break;
--pit;
cpar = bv->buffer().text().getPar(pit);
if (cpar.params().depth() < current_depth
&& cpar.layout().isEnvironment()) {
outerlayout = cpar.layout().name();
current_depth = cpar.params().depth();
}
}
if (par.layout().isEnvironment()) {
docstring const label =
bformat(_("Start New Environment (%1$s)"),
translateIfPossible(curlayout));
add(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_ENVIRONMENT_SPLIT)));
}
if (!outerlayout.empty()) {
docstring const label =
bformat(_("Start New Parent Environment (%1$s)"),
translateIfPossible(outerlayout));
add(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_ENVIRONMENT_SPLIT,
from_ascii("outer"))));
}
}
} // namespace anon
@ -1793,7 +1845,8 @@ struct Menus::Impl {
/** The entries with the following kind are expanded to a
sequence of Command MenuItems: Lastfiles, Documents,
ViewFormats, ExportFormats, UpdateFormats, Branches,
Indices, Arguments, SwitchArguments, Captions, SwitchCaptions
Indices, Arguments, SwitchArguments, Captions, SwitchCaptions,
EnvironmentSeparation
*/
void expand(MenuDefinition const & frommenu, MenuDefinition & tomenu,
BufferView const *) const;
@ -2030,6 +2083,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
tomenu.expandCaptions(buf, true);
break;
case MenuItem::EnvironmentSeparation:
tomenu.expandEnvironmentSeparators(bv);
break;
case MenuItem::Submenu: {
MenuItem item(*cit);
item.setSubmenu(MenuDefinition(cit->submenuname()));