]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiParagraph.cpp
Revert "Mark some intentional fall-throughs (in a way understandable to gcc)"
[lyx.git] / src / frontends / qt4 / GuiParagraph.cpp
index a42972a6b1177f5169a64760b048f29c7366b5e0..0c8e01aaa434d66d258b13a5a32dd459fa9e1cf4 100644 (file)
@@ -28,6 +28,7 @@
 #include "ParagraphParameters.h"
 #include "Spacing.h"
 
+#include "support/debug.h"
 #include "support/gettext.h"
 
 #include <QCheckBox>
@@ -60,7 +61,7 @@ GuiParagraph::GuiParagraph(GuiView & lv)
        connect(labelWidth, SIGNAL(textChanged(QString)),
                this, SLOT(changed()));
 
-#ifdef Q_WS_MACX
+#ifdef Q_OS_MAC
        // On Mac it's common to have tool windows which are always in the
        // foreground and are hidden when the main window is not focused.
        setWindowFlags(Qt::Tool);
@@ -71,7 +72,9 @@ GuiParagraph::GuiParagraph(GuiView & lv)
 #endif
 
        on_synchronizedViewCB_toggled();
-       linespacingValue->setValidator(new QDoubleValidator(linespacingValue));
+       QDoubleValidator * val = new QDoubleValidator(linespacingValue);
+       val->setNotation(QDoubleValidator::StandardNotation);
+       linespacingValue->setValidator(val);
 
        labelWidth->setWhatsThis(qt_(
                "As described in the User Guide, the width of"
@@ -163,7 +166,14 @@ void GuiParagraph::on_synchronizedViewCB_toggled()
 
 void GuiParagraph::changed()
 {
-       if (synchronizedViewCB->isChecked())
+       QLocale loc;
+       // We apply immediately, except if we have custom line spacing
+       // with an intermediate result (trailing decimal separator) or
+       // an invalid value (which might as well be intermediate)
+       if (synchronizedViewCB->isChecked()
+           && (linespacing->currentIndex() != 4
+               || (!linespacingValue->text().endsWith(loc.decimalPoint())
+                   && linespacingValue->hasAcceptableInput())))
                on_applyPB_clicked();
 }
 
@@ -226,7 +236,7 @@ void GuiParagraph::applyView()
 
        // label width
        params_.labelWidthString(qstring_to_ucs4(labelWidth->text()));
-       // indendation
+       // indentation
        params_.noindent(!indentCB->isChecked());
 
        dispatchParams();
@@ -260,26 +270,37 @@ void GuiParagraph::updateView()
 
        // linespacing
        int ls;
+       bool pending_input = false;
        Spacing const & space = pp.spacing();
-       switch (space.getSpace()) {
-       case Spacing::Single:
-               ls = 1;
-               break;
-       case Spacing::Onehalf:
-               ls = 2;
-               break;
-       case Spacing::Double:
-               ls = 3;
-               break;
-       case Spacing::Other:
+       if (synchronizedViewCB->isChecked() && linespacingValue->hasFocus()) {
+               // The user is about to enter custom spacing.
+               // We thus stay in Custom mode.
+               // This prevents the combo from e.g. immediately
+               // switching to single if a user enters "1" in the
+               // linespacingValue widget while aiming at e.g. "1.3"
                ls = 4;
-               break;
-       default:
-               ls = 0;
-               break;
+               pending_input = true;
+       } else {
+               switch (space.getSpace()) {
+               case Spacing::Single:
+                       ls = 1;
+                       break;
+               case Spacing::Onehalf:
+                       ls = 2;
+                       break;
+               case Spacing::Double:
+                       ls = 3;
+                       break;
+               case Spacing::Other:
+                       ls = 4;
+                       break;
+               default:
+                       ls = 0;
+                       break;
+               }
        }
        linespacing->setCurrentIndex(ls);
-       if (space.getSpace() == Spacing::Other) {
+       if (space.getSpace() == Spacing::Other || pending_input) {
                doubleToWidget(linespacingValue, space.getValue());
                linespacingValue->setEnabled(true);
        } else {
@@ -310,7 +331,7 @@ ParagraphParameters const & GuiParagraph::params() const
        if (haveMultiParSelection()) {
                // FIXME: in case of multi-paragraph selection, it would be nice to
                // initialise the parameters that are common to all paragraphs.
-               static ParagraphParameters empty;
+               static ParagraphParameters const empty;
                return empty;
        }
        return bufferview()->cursor().innerParagraph().params();
@@ -332,11 +353,14 @@ bool GuiParagraph::haveMultiParSelection() const
        return cur.selection() && cur.selBegin().pit() != cur.selEnd().pit();
 }
 
-       
+
 bool GuiParagraph::canIndent() const
 {
-       return buffer().params().paragraph_separation
-               == BufferParams::ParagraphIndentSeparation;
+       Layout const lay = bufferview()->cursor().innerParagraph().layout();
+       if (buffer().params().paragraph_separation
+               == BufferParams::ParagraphIndentSeparation)
+               return (lay.toggle_indent != ITOGGLE_NEVER);
+       return (lay.toggle_indent == ITOGGLE_ALWAYS);
 }