X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FTocModel.cpp;h=51365311aa9eba703bfeda79a7243a7e114f8db2;hb=b6eacd8d4f86734e8abef3335b190ce12a6a11b5;hp=c2cda38c490c2ef0f9fc8abdac0bfa74e0a40276;hpb=9b7ccbfc8016398705583d6973395dfb46dceb8f;p=lyx.git diff --git a/src/frontends/qt4/TocModel.cpp b/src/frontends/qt4/TocModel.cpp index c2cda38c49..51365311aa 100644 --- a/src/frontends/qt4/TocModel.cpp +++ b/src/frontends/qt4/TocModel.cpp @@ -38,6 +38,8 @@ namespace frontend { /// A QStandardItemModel that gives access to the reset methods. /// This is needed in order to fix http://www.lyx.org/trac/ticket/3740 +// FIXME: Better appropriately subclass QStandardItemModel and implement +// the toc-specific reset methods there. class TocTypeModel : public QStandardItemModel { public: @@ -47,27 +49,18 @@ public: /// void reset() { -#if (QT_VERSION < 0x050000) - QStandardItemModel::reset(); -#else + QStandardItemModel::beginResetModel(); QStandardItemModel::endResetModel(); -#endif } /// void beginResetModel() - { - #if QT_VERSION >= 0x040600 - QStandardItemModel::beginResetModel(); - #endif + { + QStandardItemModel::beginResetModel(); } /// void endResetModel() - { - #if QT_VERSION >= 0x040600 - QStandardItemModel::endResetModel(); - #else - QStandardItemModel::reset(); - #endif + { + QStandardItemModel::endResetModel(); } }; @@ -81,7 +74,7 @@ public: TocModel::TocModel(QObject * parent) : model_(new TocTypeModel(parent)), sorted_model_(new QSortFilterProxyModel(parent)), - is_sorted_(false), toc_(make_shared()), + is_sorted_(false), toc_(new Toc()), maxdepth_(0), mindepth_(0) { sorted_model_->setSortLocaleAware(true); @@ -109,7 +102,7 @@ void TocModel::clear() { model_->blockSignals(true); model_->clear(); - toc_ = make_shared(); + toc_ = make_shared(); model_->blockSignals(false); } @@ -133,7 +126,8 @@ QModelIndex TocModel::modelIndex(DocIterator const & dit) const if (toc_->empty()) return QModelIndex(); - unsigned int const toc_index = toc_->item(dit) - toc_->begin(); + unsigned int const toc_index = TocBackend::findItem(*toc_, dit) - + toc_->begin(); QModelIndexList list = model()->match(model()->index(0, 0), Qt::UserRole, QVariant(toc_index), 1, @@ -150,12 +144,19 @@ void TocModel::reset() } +void TocModel::setString(TocItem const & item, QModelIndex index) +{ + // Use implicit sharing of QStrings + QString str = toqstr(item.asString()); + model_->setData(index, str, Qt::DisplayRole); + model_->setData(index, str, Qt::ToolTipRole); +} + + void TocModel::updateItem(DocIterator const & dit) { - QModelIndex index = modelIndex(dit); - TocItem const & toc_item = tocItem(index); - model_->setData(index, toqstr(toc_item.str()), Qt::DisplayRole); - model_->setData(index, toqstr(toc_item.tooltip()), Qt::ToolTipRole); + QModelIndex const index = modelIndex(dit); + setString(tocItem(index), index); } @@ -183,12 +184,11 @@ void TocModel::reset(shared_ptr toc) int current_row = model_->rowCount(); model_->insertRows(current_row, 1); QModelIndex top_level_item = model_->index(current_row, 0); - model_->setData(top_level_item, toqstr(item.str()), Qt::DisplayRole); + setString(item, top_level_item); model_->setData(top_level_item, index, Qt::UserRole); - model_->setData(top_level_item, toqstr(item.tooltip()), Qt::ToolTipRole); LYXERR(Debug::GUI, "Toc: at depth " << item.depth() - << ", added item " << item.str()); + << ", added item " << item.asString()); populate(index, top_level_item); if (index >= end) @@ -208,7 +208,6 @@ void TocModel::populate(unsigned int & index, QModelIndex const & parent) { int curdepth = (*toc_)[index].depth() + 1; - int current_row; QModelIndex child_item; model_->insertColumns(0, 1, parent); @@ -222,12 +221,11 @@ void TocModel::populate(unsigned int & index, QModelIndex const & parent) } maxdepth_ = max(maxdepth_, item.depth()); mindepth_ = min(mindepth_, item.depth()); - current_row = model_->rowCount(parent); + int current_row = model_->rowCount(parent); model_->insertRows(current_row, 1, parent); child_item = model_->index(current_row, 0, parent); - model_->setData(child_item, toqstr(item.str()), Qt::DisplayRole); + setString(item, child_item); model_->setData(child_item, index, Qt::UserRole); - model_->setData(child_item, toqstr(item.tooltip()), Qt::ToolTipRole); populate(index, child_item); if (index >= end) break; @@ -250,7 +248,6 @@ int TocModel::modelDepth() const /////////////////////////////////////////////////////////////////////////////// TocModels::TocModels() - : bv_(0) { names_ = new TocTypeModel(this); names_sorted_ = new TocModelSortProxyModel(this); @@ -274,7 +271,7 @@ void TocModels::clear() int TocModels::depth(QString const & type) { const_iterator it = models_.find(type); - if (!bv_ || it == models_.end()) + if (it == models_.end()) return 0; return it.value()->modelDepth(); } @@ -282,8 +279,6 @@ int TocModels::depth(QString const & type) QAbstractItemModel * TocModels::model(QString const & type) { - if (!bv_) - return 0; iterator it = models_.find(type); if (it != models_.end()) return it.value()->model(); @@ -298,26 +293,27 @@ QAbstractItemModel * TocModels::nameModel() } -QModelIndex TocModels::currentIndex(QString const & type) const +QModelIndex TocModels::currentIndex(QString const & type, + DocIterator const & dit) const { const_iterator it = models_.find(type); - if (!bv_ || it == models_.end()) + if (it == models_.end()) return QModelIndex(); - return it.value()->modelIndex(bv_->cursor()); + return it.value()->modelIndex(dit); } -void TocModels::goTo(QString const & type, QModelIndex const & index) const +FuncRequest TocModels::goTo(QString const & type, QModelIndex const & index) const { const_iterator it = models_.find(type); if (it == models_.end() || !index.isValid()) { LYXERR(Debug::GUI, "TocModels::goTo(): QModelIndex is invalid!"); - return; + return FuncRequest(LFUN_NOACTION); } - LASSERT(index.model() == it.value()->model(), return); + LASSERT(index.model() == it.value()->model(), return FuncRequest(LFUN_NOACTION)); TocItem const item = it.value()->tocItem(index); - LYXERR(Debug::GUI, "TocModels::goTo " << item.str()); - dispatch(item.action()); + LYXERR(Debug::GUI, "TocModels::goTo " << item.asString()); + return item.action(); } @@ -330,10 +326,10 @@ TocItem const TocModels::currentItem(QString const & type, return TocItem(); } LASSERT(index.model() == it.value()->model(), return TocItem()); - + return it.value()->tocItem(index); } - + void TocModels::updateItem(QString const & type, DocIterator const & dit) { @@ -343,9 +339,8 @@ void TocModels::updateItem(QString const & type, DocIterator const & dit) void TocModels::reset(BufferView const * bv) { - bv_ = bv; clear(); - if (!bv_) { + if (!bv) { iterator end = models_.end(); for (iterator it = models_.begin(); it != end; ++it) it.value()->reset(); @@ -356,20 +351,19 @@ void TocModels::reset(BufferView const * bv) names_->blockSignals(true); names_->beginResetModel(); names_->insertColumns(0, 1); - TocList const & tocs = bv_->buffer().masterBuffer()->tocBackend().tocs(); - TocList::const_iterator it = tocs.begin(); - TocList::const_iterator toc_end = tocs.end(); - for (; it != toc_end; ++it) { - QString const type = toqstr(it->first); + // In the outliner, add Tocs from the master document + TocBackend const & backend = bv->buffer().masterBuffer()->tocBackend(); + for (pair> const & toc : backend.tocs()) { + QString const type = toqstr(toc.first); // First, fill in the toc models. iterator mod_it = models_.find(type); if (mod_it == models_.end()) mod_it = models_.insert(type, new TocModel(this)); - mod_it.value()->reset(it->second); + mod_it.value()->reset(toc.second); // Fill in the names_ model. - QString const gui_name = guiName(it->first, bv->buffer().params()); + QString const gui_name = toqstr(backend.outlinerName(toc.first)); int const current_row = names_->rowCount(); names_->insertRows(current_row, 1); QModelIndex const index = names_->index(current_row, 0);