]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/FloatPlacement.cpp
Use QFontMetrics information for underlines (and friends) width and position
[lyx.git] / src / frontends / qt4 / FloatPlacement.cpp
index d8fc52bc9584cc16d74ccceb7bdbe002f2a6c3e5..07d4e86b07994d6e608f21ecf3aac8cf81fa68d3 100644 (file)
@@ -75,6 +75,12 @@ void FloatPlacement::useSideways()
 }
 
 
+bool FloatPlacement::possiblePlacement(char const & p) const
+{
+       return !spanCB->isVisible() || contains(allowed_placement_, p);
+}
+
+
 void FloatPlacement::set(string const & placement)
 {
        bool def_placement = false;
@@ -87,22 +93,22 @@ void FloatPlacement::set(string const & placement)
 
        if (placement.empty()) {
                def_placement = true;
-       } else if (contains(placement, 'H')) {
+       } else if (contains(placement, 'H') && possiblePlacement('H')) {
                here_definitely = true;
        } else {
-               if (contains(placement, '!')) {
+               if (contains(placement, '!') && possiblePlacement('!')) {
                        force = true;
                }
-               if (contains(placement, 't')) {
+               if (contains(placement, 't') && possiblePlacement('t')) {
                        top = true;
                }
-               if (contains(placement, 'b')) {
+               if (contains(placement, 'b') && possiblePlacement('b')) {
                        bottom = true;
                }
-               if (contains(placement, 'p')) {
+               if (contains(placement, 'p') && possiblePlacement('p')) {
                        page = true;
                }
-               if (contains(placement, 'h')) {
+               if (contains(placement, 'h') && possiblePlacement('h')) {
                        here = true;
                }
        }
@@ -140,11 +146,16 @@ void FloatPlacement::paramsToDialog(Inset const * inset)
        InsetFloatParams const & params = fl->params();
 
        BufferParams const & bp = fl->buffer().params();
-       initFloatTypeCO(bp.documentClass().floats());
+       FloatList const & floats = bp.documentClass().floats();
+       initFloatTypeCO(floats);
 
        int const item = floatTypeCO->findData(toqstr(params.type));
        floatTypeCO->setCurrentIndex(item);
 
+       allowed_placement_ = floats.allowedPlacement(params.type);
+       allows_sideways_ = floats.allowsSideways(params.type);
+       allows_wide_ = floats.allowsWide(params.type);
+
        set(params.placement);
 
        standardfloat_ = (params.type == "figure"
@@ -156,10 +167,9 @@ void FloatPlacement::paramsToDialog(Inset const * inset)
                bottomCB->setChecked(false);
        }
 
-       spanCB->setChecked(params.wide);
-       sidewaysCB->setChecked(params.sideways);
-       // the package rotfloat only has *-versions for figure and table
-       spanCB->setEnabled(!params.sideways || standardfloat_);
+       spanCB->setChecked(params.wide && allows_wide_);
+       sidewaysCB->setChecked(params.sideways && allows_sideways_);
+
        checkAllowed();
 }
 
@@ -222,7 +232,7 @@ void FloatPlacement::changedSlot()
 }
 
 
-void FloatPlacement::checkAllowed()
+void FloatPlacement::checkAllowed() const
 {
        bool const defaults = defaultsCB->isChecked();
        bool const ignore = topCB->isChecked() || bottomCB->isChecked()
@@ -234,13 +244,20 @@ void FloatPlacement::checkAllowed()
                bool const span = spanCB->isChecked();
                bool const sideways = sidewaysCB->isChecked();
                defaultsCB->setEnabled(!sideways);
-               topCB->setEnabled(!sideways && !defaults && !heredefinitely);
-               bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
-               pageCB->setEnabled(!sideways && !defaults && !heredefinitely);
-               herepossiblyCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
-               heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
-               ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely);
-               spanCB->setEnabled(!sideways || standardfloat_);
+               topCB->setEnabled(!sideways && !defaults && !heredefinitely
+                                 && contains(allowed_placement_, 't'));
+               bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely
+                                    && contains(allowed_placement_, 'b'));
+               pageCB->setEnabled(!sideways && !defaults && !heredefinitely
+                                  && contains(allowed_placement_, 'p'));
+               herepossiblyCB->setEnabled(!sideways && !defaults && !span && !heredefinitely
+                                          && contains(allowed_placement_, 'h'));
+               heredefinitelyCB->setEnabled(!sideways && !defaults && !span
+                                            && contains(allowed_placement_, 'H'));
+               ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely
+                                    && contains(allowed_placement_, '!'));
+               spanCB->setEnabled(allows_wide_ && (!sideways || standardfloat_));
+               sidewaysCB->setEnabled(allows_sideways_);
        } else {
                topCB->setEnabled(!defaults && !heredefinitely);
                bottomCB->setEnabled(!defaults && !heredefinitely);
@@ -254,11 +271,14 @@ void FloatPlacement::checkAllowed()
 
 bool FloatPlacement::checkWidgets(bool readonly) const
 {
-       floatTypeCO->setEnabled(!readonly);
-       defaultsCB->setEnabled(!readonly);
-       options->setEnabled(!readonly);
-       spanCB->setEnabled(!readonly);
-       sidewaysCB->setEnabled(!readonly);
+       if (readonly) {
+               floatTypeCO->setEnabled(false);
+               defaultsCB->setEnabled(false);
+               options->setEnabled(false);
+               spanCB->setEnabled(false);
+               sidewaysCB->setEnabled(false);
+       } else
+               checkAllowed();
 
        return InsetParamsWidget::checkWidgets();
 }