]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
Complete the removal of the embedding stuff. Maybe. It's hard to be sure we got every...
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index 31c7e8f48feb8955cd7bc9ceed6fbb689d08926e..46985c2fcfa584d4701d37755ea0a27e065b5815 100644 (file)
 
 #include "TocWidget.h"
 
-#include "QToc.h"
+#include "GuiToc.h"
 #include "qt_helpers.h"
-#include "support/filetools.h"
-#include "support/lstrings.h"
 
-#include "debug.h"
+#include "support/debug.h"
 
 #include <QHeaderView>
-#include <QPushButton>
-#include <QTreeWidgetItem>
+#include <QTimer>
 
 #include <vector>
-#include <string>
-#include <stack>
-
-using std::endl;
-using std::pair;
-using std::stack;
-using std::vector;
-using std::string;
 
+using namespace std;
 
 namespace lyx {
-
-using support::FileName;
-using support::libFileSearch;
-       
 namespace frontend {
 
-TocWidget::TocWidget(QToc * form, QWidget * parent)
-       : QWidget(parent), form_(form), depth_(0)
+TocWidget::TocWidget(GuiToc & form, QWidget * parent)
+       : QWidget(parent), depth_(0), form_(form)
 {
        setupUi(this);
 
-       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())));
-               
+       moveOutTB->setIcon(QIcon(":/images/promote.png"));
+       moveInTB->setIcon(QIcon(":/images/demote.png"));
+       moveUpTB->setIcon(QIcon(":/images/up.png"));
+       moveDownTB->setIcon(QIcon(":/images/down.png"));
+       updateTB->setIcon(QIcon(":/images/reload.png"));
+
        // avoid flickering
        tocTV->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 
@@ -80,12 +58,10 @@ TocWidget::TocWidget(QToc * form, QWidget * parent)
 void TocWidget::selectionChanged(const QModelIndex & current,
                                  const QModelIndex & /*previous*/)
 {
-       LYXERR(Debug::GUI)
-               << "selectionChanged index " << current.row()
-               << ", " << current.column()
-               << endl;
+       LYXERR(Debug::GUI, "selectionChanged index " << current.row()
+               << ", " << current.column());
 
-       form_->goTo(typeCO->currentIndex(), current);
+       form_.goTo(typeCO->currentIndex(), current);
 }
 
 
@@ -94,7 +70,7 @@ void TocWidget::on_updateTB_clicked()
        // The backend update can take some time so we disable
        // the controls while waiting.
        enableControls(false);
-       form_->updateBackend();
+       form_.updateBackend();
 }
 
 /* FIXME (Ugras 17/11/06):
@@ -106,7 +82,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);
 }
 
 
@@ -122,21 +99,21 @@ void TocWidget::setTreeDepth(int depth)
 {
        depth_ = depth;
 
-       // expanding and then collapsing is probably better, 
+       // expanding and then collapsing is probably better,
        // but my qt 4.1.2 doesn't have expandAll()..
-       //tocTV->expandAll(); 
+       //tocTV->expandAll();
        QModelIndexList indices = tocTV->model()->match(
                tocTV->model()->index(0,0),
-               Qt::DisplayRole, "*", -1, 
-               Qt::MatchWildcard|Qt::MatchRecursive);
-       
+               Qt::DisplayRole, "*", -1,
+               Qt::MatchFlags(Qt::MatchWildcard|Qt::MatchRecursive));
+
        int size = indices.size();
        for (int i = 0; i < size; i++) {
                QModelIndex index = indices[i];
-               if (getIndexDepth(index) < depth_) 
-                       tocTV->expand(index); 
+               if (getIndexDepth(index) < depth_)
+                       tocTV->expand(index);
                else
-                       tocTV->collapse(index); 
+                       tocTV->collapse(index);
        }
 }
 
@@ -152,8 +129,8 @@ void TocWidget::on_moveUpTB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableControls(false);
-               form_->goTo(typeCO->currentIndex(), list[0]);
-               form_->outlineUp();
+               form_.goTo(typeCO->currentIndex(), list[0]);
+               form_.outlineUp();
                enableControls(true);
        }
 }
@@ -165,8 +142,8 @@ void TocWidget::on_moveDownTB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableControls(false);
-               form_->goTo(typeCO->currentIndex(), list[0]);
-               form_->outlineDown();
+               form_.goTo(typeCO->currentIndex(), list[0]);
+               form_.outlineDown();
                enableControls(true);
        }
 }
@@ -178,8 +155,8 @@ void TocWidget::on_moveInTB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableControls(false);
-               form_->goTo(typeCO->currentIndex(), list[0]);
-               form_->outlineIn();
+               form_.goTo(typeCO->currentIndex(), list[0]);
+               form_.outlineIn();
                enableControls(true);
        }
 }
@@ -190,8 +167,8 @@ void TocWidget::on_moveOutTB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableControls(false);
-               form_->goTo(typeCO->currentIndex(), list[0]);
-               form_->outlineOut();
+               form_.goTo(typeCO->currentIndex(), list[0]);
+               form_.outlineOut();
                enableControls(true);
        }
 }
@@ -200,17 +177,14 @@ void TocWidget::on_moveOutTB_clicked()
 void TocWidget::select(QModelIndex const & index)
 {
        if (!index.isValid()) {
-               LYXERR(Debug::GUI)
-                       << "TocWidget::select(): QModelIndex is invalid!" << endl;
+               LYXERR(Debug::GUI, "TocWidget::select(): QModelIndex is invalid!");
                return;
        }
 
-       tocTV->selectionModel()->blockSignals(true);
-       tocTV->selectionModel()->clear();
+       disconnectSelectionModel();
+       tocTV->setCurrentIndex(index);
        tocTV->scrollTo(index);
-       tocTV->selectionModel()->setCurrentIndex(index,
-               QItemSelectionModel::ClearAndSelect);
-       tocTV->selectionModel()->blockSignals(false);
+       reconnectSelectionModel();
 }
 
 
@@ -218,7 +192,7 @@ void TocWidget::enableControls(bool enable)
 {
        updateTB->setEnabled(enable);
 
-       if (!form_->canOutline(typeCO->currentIndex()))
+       if (!form_.canOutline(typeCO->currentIndex()))
                enable = false;
 
        moveUpTB->setEnabled(enable);
@@ -230,18 +204,17 @@ void TocWidget::enableControls(bool enable)
 }
 
 
-void TocWidget::update()
+void TocWidget::updateView()
 {
-       LYXERR(Debug::GUI) << "In TocWidget::update()" << endl;
-       select(form_->getCurrentIndex(typeCO->currentIndex()));
-       QWidget::update();
+       LYXERR(Debug::GUI, "In TocWidget::updateView()");
+       select(form_.currentIndex(typeCO->currentIndex()));
 }
 
 
-void TocWidget::updateGui()
+void TocWidget::updateGui(int selected_type)
 {
-       vector<docstring> const & type_names = form_->typeNames();
-       if (type_names.empty()) {
+       QStringList const & type_names = form_.typeNames();
+       if (type_names.isEmpty()) {
                enableControls(false);
                typeCO->clear();
                tocTV->setModel(new QStandardItemModel);
@@ -249,31 +222,33 @@ void TocWidget::updateGui()
                return;
        }
 
-       QString current_text = typeCO->currentText();
-       lyxerr << "current_text " << fromqstr(current_text) << endl;
+       QString const current_text = typeCO->currentText();
        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;
+       for (int i = 0; i != type_names.size(); ++i)
+               typeCO->addItem(type_names[i]);
+       if (selected_type != -1)
+               typeCO->setCurrentIndex(selected_type);
+       else {
+               int const new_index = typeCO->findText(current_text);
+               if (new_index != -1)
+                       typeCO->setCurrentIndex(new_index);
        }
-       if (current_type != -1)
-               typeCO->setCurrentIndex(current_type);
-       else
-               typeCO->setCurrentIndex(form_->selectedType());
+
        typeCO->blockSignals(false);
 
        setTocModel(typeCO->currentIndex());
+
+       // setTocModel produce QTreeView reset and setting depth again
+       // is needed. That must be done after all Qt updates are processed.
+       QTimer::singleShot(0, this, SLOT(setTreeDepth()));
 }
 
 
 void TocWidget::setTocModel(size_t type)
 {
        bool controls_enabled = false;
-       QStandardItemModel * toc_model = form_->tocModel(type);
+       QStandardItemModel * toc_model = form_.tocModel(type);
        if (toc_model) {
                controls_enabled = toc_model->rowCount() > 0;
                tocTV->setModel(toc_model);
@@ -285,21 +260,19 @@ void TocWidget::setTocModel(size_t type)
        reconnectSelectionModel();
 
        if (controls_enabled) {
-               depthSL->setMaximum(form_->getTocDepth(type));
+               depthSL->setMaximum(form_.getTocDepth(type));
                depthSL->setValue(depth_);
        }
 
-       LYXERR(Debug::GUI) << "In TocWidget::updateGui()" << endl;
+       LYXERR(Debug::GUI, "In TocWidget::updateGui()");
 
-       select(form_->getCurrentIndex(typeCO->currentIndex()));
+       select(form_.currentIndex(typeCO->currentIndex()));
 
        if (toc_model) {
-               LYXERR(Debug::GUI)
-               << "form_->tocModel()->rowCount " 
+               LYXERR(Debug::GUI, "tocModel()->rowCount "
                        << toc_model->rowCount()
                        << "\nform_->tocModel()->columnCount "
-                       << toc_model->columnCount()
-                       << endl;
+                       << toc_model->columnCount());
        }
 }
 
@@ -307,8 +280,18 @@ void TocWidget::setTocModel(size_t type)
 void TocWidget::reconnectSelectionModel()
 {
        connect(tocTV->selectionModel(),
-               SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
-               this, SLOT(selectionChanged(const QModelIndex &, const QModelIndex &)));
+               SIGNAL(currentChanged(const QModelIndex &,
+                      const QModelIndex &)),
+               this,
+               SLOT(selectionChanged(const QModelIndex &,
+                    const QModelIndex &)));
+}
+
+void TocWidget::disconnectSelectionModel()
+{
+       disconnect(tocTV->selectionModel(),
+               SIGNAL(currentChanged(QModelIndex, QModelIndex)),
+               this, SLOT(selectionChanged(QModelIndex, QModelIndex)));
 }
 
 } // namespace frontend