]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/FloatPlacement.cpp
Fix the tab ordering of GuiDocument components.
[lyx.git] / src / frontends / qt4 / FloatPlacement.cpp
index 563896e0c9a379019d3dcf909dcf01fc332065b8..be5cf0543ae5be78dcb9a7207c1c2b4da2e7383e 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * \file floatplacement.C
+ * \file FloatPlacement.cpp
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
 #include "FloatPlacement.h"
 #include "qt_helpers.h"
 
+#include "Buffer.h"
+#include "BufferParams.h"
+#include "FloatList.h"
+#include "TextClass.h"
+
 #include "insets/InsetFloat.h"
 #include "support/lstrings.h"
 
+#include <map>
+
 using namespace std;
 using namespace lyx::support;
 
 
-//namespace lyx {
+namespace lyx {
+
+namespace frontend {
 
-FloatPlacement::FloatPlacement(QWidget *)
+FloatPlacement::FloatPlacement(bool show_options, QWidget * parent)
+       : InsetParamsWidget(parent), float_list_(0)
 {
        setupUi(this);
 
-       connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
-       connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
-       connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
-       connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
-       connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
-       connect(defaultsCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
-       connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(floatTypeCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
+       connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
-       connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
-       connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
-       connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
 
-       spanCB->hide();
-       sidewaysCB->hide();
+       floatTypeTitle->setVisible(show_options);
+       floatTypeCO->setVisible(show_options);
+       spanCB->setVisible(show_options);
+       sidewaysCB->setVisible(show_options);
 }
 
 
-void FloatPlacement::useWide()
+docstring FloatPlacement::dialogToParams() const
 {
-       spanCB->show();
+       InsetFloatParams params;
+       params.type = fromqstr(floatTypeCO->itemData(floatTypeCO->currentIndex()).toString());
+       params.placement = get(params.wide, params.sideways);
+       return from_ascii(InsetFloat::params2string(params));
 }
 
 
-void FloatPlacement::useSideways()
+void FloatPlacement::useWide()
 {
-       sidewaysCB->show();
+       spanCB->show();
 }
 
 
-void FloatPlacement::changedSlot()
+void FloatPlacement::useSideways()
 {
-       // emit signal
-       changed();
+       sidewaysCB->show();
 }
 
 
@@ -102,16 +113,43 @@ void FloatPlacement::set(string const & placement)
        pageCB->setChecked(page);
        herepossiblyCB->setChecked(here);
        ignoreCB->setChecked(force);
-       ignoreCB->setEnabled(top || bottom || page || here);
        heredefinitelyCB->setChecked(here_definitely);
        checkAllowed();
 }
 
 
-void FloatPlacement::set(lyx::InsetFloatParams const & params)
+void FloatPlacement::initFloatTypeCO(FloatList const & floats)
 {
+       if (float_list_ == &floats)
+               return;
+
+       float_list_ = &floats;
+       floatTypeCO->clear();
+       FloatList::const_iterator it = floats.begin();
+       FloatList::const_iterator const end = floats.end();
+       for (; it != end; ++it) {
+               floatTypeCO->addItem(qt_(it->second.name()),
+                                    toqstr(it->second.floattype()));
+       }
+}
+
+
+void FloatPlacement::paramsToDialog(Inset const * inset)
+{
+       InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
+       InsetFloatParams const & params = fl->params();
+
+       BufferParams const & bp = fl->buffer().params();
+       initFloatTypeCO(bp.documentClass().floats());
+
+       int const item = floatTypeCO->findData(toqstr(params.type));
+       floatTypeCO->setCurrentIndex(item);
+
        set(params.placement);
 
+       standardfloat_ = (params.type == "figure"
+               || params.type == "table");
+
        if (params.wide) {
                herepossiblyCB->setChecked(false);
                heredefinitelyCB->setChecked(false);
@@ -120,8 +158,8 @@ void FloatPlacement::set(lyx::InsetFloatParams const & params)
 
        spanCB->setChecked(params.wide);
        sidewaysCB->setChecked(params.sideways);
-       sidewaysCB->setEnabled(params.type == "figure"
-               || params.type == "table");
+       // the package rotfloat only has *-versions for figure and table
+       spanCB->setEnabled(!params.sideways || standardfloat_);
        checkAllowed();
 }
 
@@ -165,41 +203,19 @@ string const FloatPlacement::get() const
 }
 
 
-void FloatPlacement::tbhpClicked()
+void FloatPlacement::on_defaultsCB_stateChanged(int state)
 {
-       heredefinitelyCB->setChecked(false);
        checkAllowed();
-}
-
-
-void FloatPlacement::on_heredefinitelyCB_clicked()
-{
-       if (heredefinitelyCB->isChecked())
-               ignoreCB->setEnabled(false);
-
-       topCB->setChecked(false);
-       bottomCB->setChecked(false);
-       pageCB->setChecked(false);
-       herepossiblyCB->setChecked(false);
-       ignoreCB->setChecked(false);
-}
-
-
-void FloatPlacement::on_spanCB_clicked()
-{
-       checkAllowed();
-       changed();
-
-       if (!spanCB->isChecked())
+       if (state == Qt::Checked)
                return;
-
-       herepossiblyCB->setChecked(false);
-       heredefinitelyCB->setChecked(false);
-       bottomCB->setChecked(false);
+       if (topCB->isChecked() || bottomCB->isChecked()
+          || pageCB->isChecked() || herepossiblyCB->isChecked()
+          || heredefinitelyCB->isChecked() || ignoreCB->isChecked())
+               changed();
 }
 
 
-void FloatPlacement::on_sidewaysCB_clicked()
+void FloatPlacement::changedSlot()
 {
        checkAllowed();
        changed();
@@ -209,33 +225,33 @@ void FloatPlacement::on_sidewaysCB_clicked()
 void FloatPlacement::checkAllowed()
 {
        bool const defaults = defaultsCB->isChecked();
-       bool ignore = topCB->isChecked();
-       ignore |= bottomCB->isChecked();
-       ignore |= pageCB->isChecked();
-       ignore |= herepossiblyCB->isChecked();
+       bool const ignore = topCB->isChecked() || bottomCB->isChecked()
+                     || pageCB->isChecked() || herepossiblyCB->isChecked();
+       bool const heredefinitely = heredefinitelyCB->isChecked();
 
        // float or document dialog?
        if (spanCB->isVisible()) {
                bool const span = spanCB->isChecked();
                bool const sideways = sidewaysCB->isChecked();
                defaultsCB->setEnabled(!sideways);
-               topCB->setEnabled(!sideways && !defaults);
-               bottomCB->setEnabled(!sideways && !defaults && !span);
-               pageCB->setEnabled(!sideways && !defaults);
-               ignoreCB->setEnabled(!sideways && !defaults && ignore);
-               herepossiblyCB->setEnabled(!sideways && !defaults && !span);
+               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);
-               spanCB->setEnabled(!sideways);
+               ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely);
+               spanCB->setEnabled(!sideways || standardfloat_);
        } else {
-               topCB->setEnabled(!defaults);
-               bottomCB->setEnabled(!defaults);
-               pageCB->setEnabled(!defaults);
-               ignoreCB->setEnabled(!defaults && ignore);
-               herepossiblyCB->setEnabled(!defaults);
+               topCB->setEnabled(!defaults && !heredefinitely);
+               bottomCB->setEnabled(!defaults && !heredefinitely);
+               pageCB->setEnabled(!defaults && !heredefinitely);
+               herepossiblyCB->setEnabled(!defaults && !heredefinitely);
                heredefinitelyCB->setEnabled(!defaults);
+               ignoreCB->setEnabled(!defaults && ignore && !heredefinitely);
        }
 }
 
-//} // namespace lyx
+} // namespace frontend
+} // namespace lyx
 
-#include "FloatPlacement_moc.cpp"
+#include "moc_FloatPlacement.cpp"