]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
Fix assertion with LOF and LOT by transfering the test from TocWidget::select() to...
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index 17e4c535a2b26eaf511799ded4d36ef1e68049a1..7046dda2f261f185035450a88196f55c5565a36f 100644 (file)
@@ -15,6 +15,8 @@
 
 #include "QToc.h"
 #include "qt_helpers.h"
+#include "support/filetools.h"
+#include "support/lstrings.h"
 
 #include "debug.h"
 
@@ -34,8 +36,11 @@ using std::string;
 
 
 namespace lyx {
-namespace frontend {
 
+using support::FileName;
+using support::libFileSearch;
+       
+namespace frontend {
 
 TocWidget::TocWidget(QToc * form, QWidget * parent)
        : QWidget(parent), form_(form), depth_(0)
@@ -44,7 +49,18 @@ TocWidget::TocWidget(QToc * form, QWidget * parent)
 
        connect(form, SIGNAL(modelReset()),
                SLOT(updateGui()));
-
+       
+       FileName icon_path = libFileSearch("images", "promote.xpm");
+       moveOutTB->setIcon(QIcon(toqstr(icon_path.absFilename())));
+       icon_path = libFileSearch("images", "demote.xpm");
+       moveInTB->setIcon(QIcon(toqstr(icon_path.absFilename())));
+       icon_path = libFileSearch("images", "up.xpm");
+       moveUpTB->setIcon(QIcon(toqstr(icon_path.absFilename())));
+       icon_path = libFileSearch("images", "down.xpm");
+       moveDownTB->setIcon(QIcon(toqstr(icon_path.absFilename())));
+       icon_path = libFileSearch("images", "reload.xpm");
+       updateTB->setIcon(QIcon(toqstr(icon_path.absFilename())));
+               
        // avoid flickering
        tocTV->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 
@@ -55,6 +71,9 @@ TocWidget::TocWidget(QToc * form, QWidget * parent)
        // like labels, bookmarks, etc...
        // tocTV->header()->hide();
        tocTV->header()->setVisible(false);
+
+       // Only one item selected at a time.
+       tocTV->setSelectionMode(QAbstractItemView::SingleSelection);
 }
 
 
@@ -70,11 +89,12 @@ void TocWidget::selectionChanged(const QModelIndex & current,
 }
 
 
-void TocWidget::on_updatePB_clicked()
+void TocWidget::on_updateTB_clicked()
 {
+       // The backend update can take some time so we disable
+       // the controls while waiting.
+       enableControls(false);
        form_->updateBackend();
-       form_->update();
-       update();
 }
 
 /* FIXME (Ugras 17/11/06):
@@ -86,7 +106,8 @@ depth calculation.
 int TocWidget::getIndexDepth(QModelIndex const & index, int depth)
 {
        ++depth;
-       return (index.parent() == QModelIndex())? depth : getIndexDepth(index.parent(),depth);
+       return (index.parent() ==
+               QModelIndex())? depth : getIndexDepth(index.parent(),depth);
 }
 
 
@@ -120,14 +141,13 @@ void TocWidget::setTreeDepth(int depth)
        }
 }
 
-
-void TocWidget::on_typeCO_activated(int value)
+void TocWidget::on_typeCO_currentIndexChanged(int value)
 {
        setTocModel(value);
 }
 
 
-void TocWidget::on_moveUpPB_clicked()
+void TocWidget::on_moveUpTB_clicked()
 {
        enableControls(false);
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
@@ -140,7 +160,7 @@ void TocWidget::on_moveUpPB_clicked()
 }
 
 
-void TocWidget::on_moveDownPB_clicked()
+void TocWidget::on_moveDownTB_clicked()
 {
        enableControls(false);
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
@@ -153,7 +173,7 @@ void TocWidget::on_moveDownPB_clicked()
 }
 
 
-void TocWidget::on_moveInPB_clicked()
+void TocWidget::on_moveInTB_clicked()
 {
        enableControls(false);
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
@@ -166,7 +186,7 @@ void TocWidget::on_moveInPB_clicked()
 }
 
 
-void TocWidget::on_moveOutPB_clicked()
+void TocWidget::on_moveOutTB_clicked()
 {
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
@@ -186,25 +206,24 @@ void TocWidget::select(QModelIndex const & index)
                return;
        }
 
-       tocTV->selectionModel()->blockSignals(true);
-       tocTV->scrollTo(index);
-       tocTV->selectionModel()->setCurrentIndex(index,
-               QItemSelectionModel::ClearAndSelect);
-       tocTV->selectionModel()->blockSignals(false);
+       disconnectSelectionModel();
+       tocTV->setCurrentIndex(index);
+       tocTV->scrollTo(index);
+       reconnectSelectionModel();
 }
 
 
 void TocWidget::enableControls(bool enable)
 {
-       updatePB->setEnabled(enable);
+       updateTB->setEnabled(enable);
 
        if (!form_->canOutline(typeCO->currentIndex()))
                enable = false;
 
-       moveUpPB->setEnabled(enable);
-       moveDownPB->setEnabled(enable);
-       moveInPB->setEnabled(enable);
-       moveOutPB->setEnabled(enable);
+       moveUpTB->setEnabled(enable);
+       moveDownTB->setEnabled(enable);
+       moveInTB->setEnabled(enable);
+       moveOutTB->setEnabled(enable);
 
        depthSL->setEnabled(enable);
 }
@@ -220,22 +239,31 @@ void TocWidget::update()
 
 void TocWidget::updateGui()
 {
-       QStringListModel * type_model = form_->typeModel();
-       if (type_model->stringList().isEmpty()) {
+       vector<docstring> const & type_names = form_->typeNames();
+       if (type_names.empty()) {
                enableControls(false);
-               typeCO->setModel(type_model);
+               typeCO->clear();
                tocTV->setModel(new QStandardItemModel);
                tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
                return;
        }
 
        QString current_text = typeCO->currentText();
-       typeCO->setModel(type_model);
-       int const current_type = typeCO->findText(current_text);
+       lyxerr << "current_text " << fromqstr(current_text) << endl;
+       typeCO->blockSignals(true);
+       typeCO->clear();
+       int current_type = -1;
+       for (size_t i = 0; i != type_names.size(); ++i) {
+               QString item = toqstr(type_names[i]);
+               typeCO->addItem(item);
+               if (item == current_text)
+                       current_type = i;
+       }
        if (current_type != -1)
                typeCO->setCurrentIndex(current_type);
        else
                typeCO->setCurrentIndex(form_->selectedType());
+       typeCO->blockSignals(false);
 
        setTocModel(typeCO->currentIndex());
 }
@@ -279,8 +307,19 @@ void TocWidget::reconnectSelectionModel()
 {
        connect(tocTV->selectionModel(),
                SIGNAL(currentChanged(const QModelIndex &,
-                       const QModelIndex &)),
-               this, SLOT(selectionChanged(const QModelIndex &,
+                      const QModelIndex &)),
+               this,
+               SLOT(selectionChanged(const QModelIndex &,
+                    const QModelIndex &)));
+}
+
+void TocWidget::disconnectSelectionModel()
+{
+       disconnect(tocTV->selectionModel(),
+                  SIGNAL(currentChanged(const QModelIndex &, 
+                         const QModelIndex &)),
+                  this,
+                  SLOT(selectionChanged(const QModelIndex &,
                        const QModelIndex &)));
 }