]> git.lyx.org Git - features.git/commitdiff
Cleanup of the Toc model and controller: The objective is to let the View (TocWidget...
authorAbdelrazak Younes <younes@lyx.org>
Fri, 16 Mar 2007 14:14:55 +0000 (14:14 +0000)
committerAbdelrazak Younes <younes@lyx.org>
Fri, 16 Mar 2007 14:14:55 +0000 (14:14 +0000)
* TocBackend
  - addType(), types_, types(): deleted.

* ControlToc
  - tocs(): new
  - selectedType(): access to selected_type_
  - initialiseParams(): transfer code from QToc::update() and look for selected type.
  - getTypes(), getContents(): deleted

* QToc: do not maintain current type. Get the info from the View.
  - setTocModel(): deleted

* TocWidget: always pass the currently selected type to the model/controller.
  - setTocModel(): new slot.
  - updateGui(): transfer code to setTocModel().

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@17455 a592a061-630c-0410-9148-cb99ea01b6c8

src/TocBackend.C
src/TocBackend.h
src/frontends/controllers/ControlToc.C
src/frontends/controllers/ControlToc.h
src/frontends/qt4/QToc.C
src/frontends/qt4/QToc.h
src/frontends/qt4/TocWidget.C
src/frontends/qt4/TocWidget.h

index c1de07da758b5001920dd9a190d99929eb037552..6b12ad2bee7fa1d4b60b02bc08b1153bb458fdc6 100644 (file)
@@ -121,19 +121,6 @@ Toc const & TocBackend::toc(std::string const & type) const
 }
 
 
-bool TocBackend::addType(std::string const & type)
-{
-       // Is the type already supported?
-       TocList::iterator toclist_it = tocs_.find(type);
-       if (toclist_it != tocs_.end())
-               return false;
-
-       tocs_.insert(make_pair(type, Toc()));
-       types_.push_back(type);
-
-       return true;
-}
-
 void TocBackend::updateItem(ParConstIterator const & par_it)
 {
        BufferParams const & bufparams = buffer_->params();
@@ -175,7 +162,6 @@ void TocBackend::updateItem(ParConstIterator const & par_it)
 void TocBackend::update()
 {
        tocs_.clear();
-       types_.clear();
 
        BufferParams const & bufparams = buffer_->params();
        const int min_toclevel = bufparams.getLyXTextClass().min_toclevel();
@@ -223,10 +209,6 @@ void TocBackend::update()
                                TocItem(pit, toclevel - min_toclevel, tocstring));
                }
        }
-
-       TocList::iterator it = tocs_.begin();
-       for (; it != tocs_.end(); ++it)
-               types_.push_back(it->first);
 }
 
 
index aa73a68e5ba674b731ba2b427b9137e06e4aa0d0..ba8f9f8f385a4298763400acc57b45fd5a4baa5f 100644 (file)
@@ -96,8 +96,6 @@ public:
        void setBuffer(Buffer const * buffer)
        { buffer_ = buffer; }
        ///
-       bool addType(std::string const & type);
-       ///
        void update();
        ///
        void updateItem(ParConstIterator const & pit);
@@ -105,9 +103,7 @@ public:
        ///
        TocList const & tocs() const
        { return tocs_; }
-       ///
-       std::vector<std::string> const & types() const
-       { return types_; }
+
        ///
        Toc const & toc(std::string const & type) const;
        /// Return the first Toc Item before the cursor
@@ -119,8 +115,6 @@ private:
        /// 
        TocList tocs_;
        ///
-       std::vector<std::string> types_;
-       ///
        Buffer const * buffer_;
 
 }; // TocBackend
index 9bd998956464b40a82889a03213ecba28bdef63b..df071bc1b0153c326664cf0b0f7800d353b8bcc1 100644 (file)
@@ -4,6 +4,7 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Angus Leeming
+ * \author Abdelrazak Younes
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -13,6 +14,7 @@
 #include <config.h>
 
 #include "ControlToc.h"
+
 #include "buffer.h"
 #include "BufferView.h"
 #include "bufferparams.h"
@@ -41,10 +43,42 @@ ControlToc::ControlToc(Dialog & d)
 }
 
 
+TocList const & ControlToc::tocs() const
+{
+       return kernel().buffer().tocBackend().tocs();
+}
+
+
 bool ControlToc::initialiseParams(string const & data)
 {
+       if (!ControlCommand::initialiseParams(data))
+               return false;
+
+       types_.clear();
+       type_names_.clear();
+       TocList const & tocs = kernel().buffer().tocBackend().tocs();
+       TocList::const_iterator it = tocs.begin();
+       TocList::const_iterator end = tocs.end();
+       for (; it != end; ++it) {
+               types_.push_back(it->first);
+               type_names_.push_back(getGuiName(it->first));
+       }
+
+       string selected_type ;
+       if(params()["type"].empty()) //Then plain toc...
+               selected_type = params().getCmdName();
+       else
+               selected_type = to_ascii(params()["type"]);
+       selected_type_ = -1;
+       for (size_t i = 0;  i != types_.size(); ++i) {
+               if (selected_type == types_[i]) {
+                       selected_type_ = i;
+                       break;
+               }
+       }
+
        update();
-       return ControlCommand::initialiseParams(data);
+       return true;
 }
 
 void ControlToc::goTo(TocItem const & item)
@@ -54,9 +88,10 @@ void ControlToc::goTo(TocItem const & item)
 }
 
 
-bool ControlToc::canOutline(string const & type)
+bool ControlToc::canOutline(size_t type) const
 {
-       return type == "tableofcontents";
+       BOOST_ASSERT(type >= 0 && type < int(types_.size()));
+       return types_[type] == "tableofcontents";
 }
 
 
@@ -84,25 +119,17 @@ void ControlToc::outlineOut()
 }
 
 
-vector<string> const & ControlToc::getTypes() const
-{
-       return kernel().buffer().tocBackend().types();
-}
-
-
 void ControlToc::updateBackend()
 {
        kernel().buffer().tocBackend().update();
 }
 
 
-TocIterator const ControlToc::getCurrentTocItem(
-       string const & type) const
+TocIterator const ControlToc::getCurrentTocItem(size_t type) const
 {
        BOOST_ASSERT(kernel().bufferview());
-
        ParConstIterator it(kernel().bufferview()->cursor());
-       return kernel().buffer().tocBackend().item(type, it);
+       return kernel().buffer().tocBackend().item(types_[type], it);
 }
 
 
@@ -119,18 +146,5 @@ docstring const ControlToc::getGuiName(string const & type) const
                return _(type);
 }
 
-
-Toc const empty_list;
-
-Toc const & ControlToc::getContents(string const & type) const
-{
-       // This shouldn't be possible...
-       if (!kernel().isBufferAvailable()) {
-               return empty_list;
-       }
-
-       return kernel().buffer().tocBackend().toc(type);
-}
-
 } // namespace frontend
 } // namespace lyx
index 273349b30f2bd0084c906266a552b301caa86e61..987df9707d80002b82972701b4d62dfde7a60625 100644 (file)
@@ -5,6 +5,7 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Angus Leeming
+ * \author Abdelrazak Younes
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -33,20 +34,21 @@ public:
        /// \c ControlCommand inherited method.
        bool initialiseParams(std::string const & data);
 
+       ///
+       TocList const & tocs() const;
+
        /// Goto this paragraph id
        void goTo(TocItem const &);
 
        /// Return the list of types available
-       std::vector<std::string> const & getTypes() const;
+       std::vector<docstring> const & typeNames() const
+       { return type_names_; }
 
-       /// Return the guiname from a given cmdName of the TOC param
-       docstring const getGuiName(std::string const & type) const;
+       ///
+       int selectedType() { return selected_type_; }
 
        /// Return the first TocItem before the cursor
-       TocIterator const getCurrentTocItem(std::string const & type) const;
-
-       /// Given a type, returns the contents
-       Toc const & getContents(std::string const & type) const;
+       TocIterator const getCurrentTocItem(size_t type) const;
 
        /// Apply the selected outlining operation
        void outlineUp();
@@ -57,13 +59,21 @@ public:
        ///
        void outlineOut();
        /// Test if outlining operation is possible
-       bool canOutline(std::string const & type);
+       bool canOutline(size_t type) const;
        ///
        void updateBackend();
 
 public:
        /// Update the model data if needed.
        virtual void update() = 0;
+
+private:
+       /// Return the guiname from a given cmdName of the TOC param
+       docstring const getGuiName(std::string const & type) const;
+
+       std::vector<std::string> types_;
+       std::vector<docstring> type_names_;
+       int selected_type_;
 };
 
 } // namespace frontend
index 505e6153d49cfd481292cf88d22cb1729e7b41a5..fc683e9ff0413ba68410065fc2882ff55686dae6 100644 (file)
@@ -39,85 +39,65 @@ QToc::QToc(Dialog & parent)
 }
 
 
-bool QToc::canOutline()
+bool QToc::canOutline(int type) const
 {
-       vector<string> const & types = getTypes();
-
-       if (types.empty())
+       if (type < 0) 
                return false;
 
-       BOOST_ASSERT(type_ >= 0 && type_ < int(types.size()));
-       return ControlToc::canOutline(types[type_]);
+       return ControlToc::canOutline(type);
 }
 
 
-int QToc::getTocDepth()
+int QToc::getTocDepth(int type)
 {
-       if (type_ < 0)
+       if (type < 0)
                return 0;
-       return toc_models_[type_]->modelDepth();
+       return toc_models_[type]->modelDepth();
 }
 
 
-QStandardItemModel * QToc::tocModel()
+QStandardItemModel * QToc::tocModel(int type)
 {
+       if (type < 0)
+               return 0;
+
        if (toc_models_.empty()) {
                lyxerr[Debug::GUI] << "QToc::tocModel(): no types available " << endl;
                return 0;
        }
 
        lyxerr[Debug::GUI]
-               << "QToc: type_ " << type_
+               << "QToc: type_ " << type
                << "  toc_models_.size() " << toc_models_.size()
                << endl;
 
-       BOOST_ASSERT(type_ >= 0 && type_ < int(toc_models_.size()));
-       return toc_models_[type_];
+       BOOST_ASSERT(type >= 0 && type < int(toc_models_.size()));
+       return toc_models_[type];
 }
 
 
-QStandardItemModel * QToc::setTocModel(int type)
+QModelIndex const QToc::getCurrentIndex(int type) const
 {
-       type_ = type;
-
-       lyxerr[Debug::GUI]
-               << "QToc: type_ " << type_
-               << "  toc_models_.size() " << toc_models_.size()
-               << endl;
-
-       BOOST_ASSERT(type_ >= 0 && type_ < int(toc_models_.size()));
-       return toc_models_[type_];
-}
-
-
-QModelIndex const QToc::getCurrentIndex()
-{
-       vector<string> const & types = getTypes();
-       if (types.empty() || type_ < 0)
+       if (type < 0)
                return QModelIndex();
 
-       TocIterator const it = getCurrentTocItem(types[type_]);
-       if (it == getContents(types[type_]).end() || !it->isValid()) {
-               lyxerr[Debug::GUI] << "QToc::getCurrentIndex(): TocItem is invalid!" << endl;
-               return QModelIndex();
-       }
-
-       return toc_models_[type_]->modelIndex(it);
+       return toc_models_[type]->modelIndex(getCurrentTocItem(type));
 }
 
 
-void QToc::goTo(QModelIndex const & index)
+void QToc::goTo(int type, QModelIndex const & index)
 {
-       if (!index.isValid() || index.model() != tocModel()) {
+       if (type < 0 || !index.isValid() 
+               || index.model() != toc_models_[type]) {
                lyxerr[Debug::GUI]
                        << "QToc::goTo(): QModelIndex is invalid!"
                        << endl;
                return;
        }
 
-       BOOST_ASSERT(type_ >= 0 && type_ < int(toc_models_.size()));
+       BOOST_ASSERT(type >= 0 && type < int(toc_models_.size()));
 
-       TocIterator const it = toc_models_[type_]->tocIterator(index);
+       TocIterator const it = toc_models_[type]->tocIterator(index);
        
        lyxerr[Debug::GUI]
                << "QToc::goTo " << lyx::to_utf8(it->str())
@@ -127,12 +107,6 @@ void QToc::goTo(QModelIndex const & index)
 }
 
 
-int QToc::getType()
-{
-       return type_;
-}
-
-
 void QToc::update()
 {
        updateType();
@@ -143,37 +117,13 @@ void QToc::update()
 
 void QToc::updateType()
 {
-
        QStringList type_list;
 
-       vector<string> const & types = getTypes();
-       if (types.empty()) {
-               type_model_.setStringList(type_list);
-               toc_models_.clear();
-               lyxerr[Debug::GUI] << "QToc::updateType(): no types available " << endl;
-               return;
-       }
+       vector<docstring> const & type_names = typeNames();
+       BOOST_ASSERT(!type_names.empty());
+       for (size_t i = 0; i != type_names.size(); ++i)
+               type_list.append(toqstr(type_names[i]));
 
-       string selected_type ;
-       if(params()["type"].empty()) //Then plain toc...
-               selected_type = params().getCmdName();
-       else
-               selected_type = to_ascii(params()["type"]);
-
-       QString gui_names_;
-       type_ = -1;
-       for (size_t i = 0; i != types.size(); ++i) {
-               string const & type_str = types[i];
-               type_list.append(toqstr(getGuiName(type_str)));
-               if (type_str == selected_type)
-                       type_ = i;
-               
-               lyxerr[Debug::GUI]
-                       << "QToc: new type " << type_str
-                       << "\ttoc_models_.size() " << toc_models_.size()
-                       << endl;
-
-       }
        type_model_.setStringList(type_list);
 }
 
@@ -181,13 +131,10 @@ void QToc::updateType()
 void QToc::updateToc()
 {
        toc_models_.clear();
-       vector<string> const & types = getTypes();
-
-       for (size_t i = 0; i != types.size(); ++i) {
-
-               toc_models_.push_back(new TocModel(getContents(types[i])));
-       }
-       
+       TocList::const_iterator it = tocs().begin();
+       TocList::const_iterator end = tocs().end();
+       for (; it != end; ++it)
+               toc_models_.push_back(new TocModel(it->second));
 }
 
 
index ea71c2b3671143eb867c61d7ef974bec0075c52e..f7875b90032af96648054df82c5b7fe511eb7f6b 100644 (file)
@@ -39,22 +39,21 @@ public:
        ///
        void updateType();
 
-       bool canOutline();
+       bool canOutline(int type) const;
        
-       QStandardItemModel * tocModel();
-       QStandardItemModel * setTocModel(int type);
+       QStandardItemModel * tocModel(int type);
 
        QStringListModel * typeModel()
        { return &type_model_; }
 
        ///
-       QModelIndex const getCurrentIndex();
+       QModelIndex const getCurrentIndex(int type) const;
        ///
-       void goTo(QModelIndex const & index);
+       void goTo(int type, QModelIndex const & index);
        ///
        int getType();
        ///
-       int getTocDepth();
+       int getTocDepth(int type);
 
 Q_SIGNALS:
        /// Signal that the internal toc_models_ has been reset.
index 304071e54590fc9129cdf72428d2f3581428faf0..76a685216f2138fae1bf9e2bb768061acb5955c7 100644 (file)
@@ -66,7 +66,7 @@ void TocWidget::selectionChanged(const QModelIndex & current,
                << ", " << current.column()
                << endl;
 
-       form_->goTo(current);
+       form_->goTo(typeCO->currentIndex(), current);
 }
 
 
@@ -105,10 +105,10 @@ void TocWidget::setTreeDepth(int depth)
        // expanding and then collapsing is probably better, 
        // but my qt 4.1.2 doesn't have expandAll()..
        //tocTV->expandAll(); 
-       QModelIndexList indices = 
-               form_->tocModel()->match(form_->tocModel()->index(0,0),
-                                       Qt::DisplayRole, "*", -1, 
-                                       Qt::MatchWildcard|Qt::MatchRecursive);
+       QModelIndexList indices = tocTV->model()->match(
+               tocTV->model()->index(0,0),
+               Qt::DisplayRole, "*", -1, 
+               Qt::MatchWildcard|Qt::MatchRecursive);
        
        int size = indices.size();
        for (int i = 0; i < size; i++) {
@@ -123,8 +123,7 @@ void TocWidget::setTreeDepth(int depth)
 
 void TocWidget::on_typeCO_activated(int value)
 {
-       form_->setTocModel(value);
-       updateGui();
+       setTocModel(value);
 }
 
 
@@ -134,7 +133,7 @@ void TocWidget::on_moveUpPB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableButtons(false);
-               form_->goTo(list[0]);
+               form_->goTo(typeCO->currentIndex(), list[0]);
                form_->outlineUp();
                enableButtons(true);
        }
@@ -147,7 +146,7 @@ void TocWidget::on_moveDownPB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableButtons(false);
-               form_->goTo(list[0]);
+               form_->goTo(typeCO->currentIndex(), list[0]);
                form_->outlineDown();
                enableButtons(true);
        }
@@ -160,7 +159,7 @@ void TocWidget::on_moveInPB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableButtons(false);
-               form_->goTo(list[0]);
+               form_->goTo(typeCO->currentIndex(), list[0]);
                form_->outlineIn();
                enableButtons(true);
        }
@@ -172,7 +171,7 @@ void TocWidget::on_moveOutPB_clicked()
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (!list.isEmpty()) {
                enableButtons(false);
-               form_->goTo(list[0]);
+               form_->goTo(typeCO->currentIndex(), list[0]);
                form_->outlineOut();
                enableButtons(true);
        }
@@ -199,7 +198,7 @@ void TocWidget::enableButtons(bool enable)
 {
        updatePB->setEnabled(enable);
 
-       if (!form_->canOutline())
+       if (!form_->canOutline(typeCO->currentIndex()))
                enable = false;
 
        moveUpPB->setEnabled(enable);
@@ -211,7 +210,8 @@ void TocWidget::enableButtons(bool enable)
 
 void TocWidget::update()
 {
-       select(form_->getCurrentIndex());
+       lyxerr[Debug::GUI] << "In TocWidget::update()" << endl;
+       select(form_->getCurrentIndex(typeCO->currentIndex()));
        QWidget::update();
 }
 
@@ -228,13 +228,25 @@ void TocWidget::updateGui()
                return;
        }
 
+       QString current_text = typeCO->currentText();
        typeCO->setModel(type_model);
-       typeCO->setCurrentIndex(form_->getType());
+       int const current_type = typeCO->findText(current_text);
+       if (current_type != -1)
+               typeCO->setCurrentIndex(current_type);
+       else
+               typeCO->setCurrentIndex(form_->selectedType());
 
+       setTocModel(typeCO->currentIndex());
+}
+
+
+void TocWidget::setTocModel(size_t type)
+{
        bool buttons_enabled = false;
-       if (form_->tocModel()) {
-               buttons_enabled = form_->tocModel()->rowCount() > 0;
-               tocTV->setModel(form_->tocModel());
+       QStandardItemModel * toc_model = form_->tocModel(type);
+       if (toc_model) {
+               buttons_enabled = toc_model->rowCount() > 0;
+               tocTV->setModel(toc_model);
                tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
        }
 
@@ -242,14 +254,21 @@ void TocWidget::updateGui()
 
        reconnectSelectionModel();
        depthSL->setEnabled(true);
-       depthSL->setMaximum(form_->getTocDepth());
+       depthSL->setMaximum(form_->getTocDepth(type));
        depthSL->setValue(depth_);
-       select(form_->getCurrentIndex());
 
-       lyxerr[Debug::GUI]
-               << "form_->tocModel()->rowCount " << form_->tocModel()->rowCount()
-               << "\nform_->tocModel()->columnCount " << form_->tocModel()->columnCount()
-               << endl;
+       lyxerr[Debug::GUI] << "In TocWidget::updateGui()" << endl;
+
+       select(form_->getCurrentIndex(typeCO->currentIndex()));
+
+       if (toc_model) {
+               lyxerr[Debug::GUI]
+               << "form_->tocModel()->rowCount " 
+                       << toc_model->rowCount()
+                       << "\nform_->tocModel()->columnCount "
+                       << toc_model->columnCount()
+                       << endl;
+       }
 }
 
 
index b19acc5acd72aaad2135022971a99c1de1173243..c04989fd04b2f25ff93eac5613d273c7a090f605 100644 (file)
@@ -34,6 +34,8 @@ protected Q_SLOTS:
        /// Update Gui of the display.
        void updateGui();
        ///
+       void setTocModel(size_t type);
+       ///
        void select(QModelIndex const & index);
        ///
        void selectionChanged(const QModelIndex & current,