X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FTocModel.h;h=0c3c6b09dde61d52851f15e99c9a4319b892a575;hb=1f10969bb5c5f36017bf5ba8671381b09945cf57;hp=8ebbc8d9f4bfcfba4f02304c666074dd4ffb42a5;hpb=ffa722e0b7cefbbdc6f7e387a50fefb889bcb7d9;p=lyx.git diff --git a/src/frontends/qt4/TocModel.h b/src/frontends/qt4/TocModel.h index 8ebbc8d9f4..0c3c6b09dd 100644 --- a/src/frontends/qt4/TocModel.h +++ b/src/frontends/qt4/TocModel.h @@ -12,102 +12,142 @@ #ifndef TOCMODEL_H #define TOCMODEL_H -#include "TocBackend.h" +#include "Toc.h" -#include "qt_helpers.h" - -#include - -#include +#include +#include namespace lyx { +class Buffer; class BufferView; +class DocIterator; namespace frontend { -class TocModel : public QStandardItemModel +class TocTypeModel; + +/// A class that adapt the TocBackend of a Buffer into standard Qt models for +/// GUI visualisation. +/// There is one TocModel per list in the TocBackend. +class TocModel { + /// noncopyable + TocModel(TocModel const &); + void operator=(TocModel const &); public: /// - TocModel() {} + TocModel(QObject * parent); /// - TocModel(Toc const & toc) { populate(toc); } + void reset(std::shared_ptr); + /// + void reset(); + /// + void updateItem(DocIterator const & dit); /// void clear(); /// - void populate(Toc const & toc); + QAbstractItemModel * model(); + /// + QAbstractItemModel const * model() const; /// - TocIterator tocIterator(QModelIndex const & index) const; + void sort(bool sort_it); /// - QModelIndex modelIndex(TocIterator const & it) const; + bool isSorted() const { return is_sorted_; } + /// + TocItem const & tocItem(QModelIndex const & index) const; + /// + QModelIndex modelIndex(DocIterator const & dit) const; /// int modelDepth() const; private: /// - void populate(TocIterator & it, TocIterator const & end, - QModelIndex const & parent); + void populate(unsigned int & index, QModelIndex const & parent); + /// + void setString(TocItem const & item, QModelIndex index); /// - typedef std::map TocMap; + TocTypeModel * model_; /// - typedef std::map ModelMap; + QSortFilterProxyModel * sorted_model_; /// - TocMap toc_map_; + bool is_sorted_; /// - ModelMap model_map_; + std::shared_ptr toc_; /// int maxdepth_; + /// int mindepth_; }; -class TocModels: public QObject +/// A filter to sort the models alphabetically but with +/// the table of contents on top. +class TocModelSortProxyModel : public QSortFilterProxyModel +{ +public: + TocModelSortProxyModel(QObject * w) + : QSortFilterProxyModel(w) + {} + + bool lessThan (const QModelIndex & left, const QModelIndex & right) const + { + if (left.model()->data(left, Qt::UserRole).toString() + == QString("tableofcontents")) + return true; + else if (right.model()->data(right, Qt::UserRole).toString() + == QString("tableofcontents")) + return false; + else + return QSortFilterProxyModel::lessThan(left, right); + } +}; + + + +/// A container for the different TocModels. +class TocModels : public QObject { Q_OBJECT public: /// - TocModels(): bv_(0) {} - /// - TocModels::~TocModels() { clear(); } + TocModels(); /// void reset(BufferView const * bv); /// - int depth(int type); + int depth(QString const & type); /// - QStandardItemModel * model(int type); + QAbstractItemModel * model(QString const & type); /// - QModelIndex TocModels::currentIndex(int type) const; + QAbstractItemModel * nameModel(); /// - void goTo(int type, QModelIndex const & index) const; + QModelIndex currentIndex(QString const & type, + DocIterator const & dit) const; /// - void TocModels::init(Buffer const & buffer); - /// Test if outlining operation is possible - bool canOutline(int type) const; - /// Return the list of types available - QStringList const & typeNames() const { return type_names_; } + void goTo(QString const & type, QModelIndex const & index) const; /// - void updateBackend() const; + void init(Buffer const & buffer); /// - int decodeType(QString const & str) const; - -Q_SIGNALS: - /// Signal that the internal toc_models_ has been reset. - void modelReset(); + void updateItem(QString const & type, DocIterator const & dit); + /// + void sort(QString const & type, bool sort_it); + /// + bool isSorted(QString const & type) const; + /// the item that is currently selected + TocItem const currentItem(QString const & type, + QModelIndex const & index) const; private: + typedef QHash::const_iterator const_iterator; + typedef QHash::iterator iterator; /// void clear(); - /// Return the guiname from a given cmdName of the TOC param - QString guiName(std::string const & type) const; - /// - BufferView const * bv_; /// - std::vector models_; + QHash models_; /// - QStringList types_; + TocTypeModel * names_; /// - QStringList type_names_; + TocModelSortProxyModel * names_sorted_; }; } // namespace frontend