From a63c7340a632c634733271332a43aac82bc73799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 26 Aug 2013 06:30:11 +0200 Subject: Nuke the old instance model, LONG LIVE THE NEW ONE --- logic/BaseInstance.cpp | 8 +++ logic/BaseInstance.h | 8 +++ logic/lists/InstanceList.cpp | 129 ++++++++++++++++++++++++++++++++++++++++--- logic/lists/InstanceList.h | 33 +++++++++-- 4 files changed, 166 insertions(+), 12 deletions(-) (limited to 'logic') diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index 6593e715..bd3229c8 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -17,6 +17,7 @@ #include "BaseInstance_p.h" #include +#include #include "inisettingsobject.h" #include "setting.h" @@ -83,6 +84,13 @@ BaseInstance::BaseInstance( BaseInstancePrivate* d_in, settings().registerSetting(new OverrideSetting("AutoCloseConsole", globalSettings->getSetting("AutoCloseConsole"))); } +void BaseInstance::nuke() +{ + QDir(instanceRoot()).removeRecursively(); + emit nuked(this); +} + + QString BaseInstance::id() const { return QFileInfo(instanceRoot()).fileName(); diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index a1e6075a..cc9422be 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -48,6 +48,9 @@ public: /// virtual destructor to make sure the destruction is COMPLETE virtual ~BaseInstance() {}; + /// nuke thoroughly - deletes the instance contents, notifies the list/model which is responsible of cleaning up the husk + void nuke(); + /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to be unique. QString id() const; @@ -169,6 +172,11 @@ signals: * \brief Signal emitted when groups are affected in any way */ void groupChanged(); + /*! + * \brief The instance just got nuked. Hurray! + */ + void nuked(BaseInstance * inst); + protected: QSharedPointer inst_d; }; diff --git a/logic/lists/InstanceList.cpp b/logic/lists/InstanceList.cpp index 1d33d8d6..1d13e3f2 100644 --- a/logic/lists/InstanceList.cpp +++ b/logic/lists/InstanceList.cpp @@ -26,13 +26,14 @@ #include "logic/lists/InstanceList.h" #include "logic/BaseInstance.h" #include "logic/InstanceFactory.h" +#include #include "pathutils.h" const static int GROUP_FILE_FORMAT_VERSION = 1; InstanceList::InstanceList(const QString &instDir, QObject *parent) : - QObject(parent), m_instDir("instances") + QAbstractListModel ( parent ), m_instDir("instances") { } @@ -42,6 +43,69 @@ InstanceList::~InstanceList() saveGroupList(); } +int InstanceList::rowCount ( const QModelIndex& parent ) const +{ + Q_UNUSED ( parent ); + return m_instances.count(); +} + +QModelIndex InstanceList::index ( int row, int column, const QModelIndex& parent ) const +{ + Q_UNUSED ( parent ); + if ( row < 0 || row >= m_instances.size() ) + return QModelIndex(); + return createIndex ( row, column, ( void* ) m_instances.at ( row ).data() ); +} + +QVariant InstanceList::data ( const QModelIndex& index, int role ) const +{ + if ( !index.isValid() ) + { + return QVariant(); + } + BaseInstance *pdata = static_cast ( index.internalPointer() ); + switch ( role ) + { + case InstancePointerRole: + { + QVariant v = qVariantFromValue((void *) pdata); + return v; + } + case Qt::DisplayRole: + { + return pdata->name(); + } + case Qt::ToolTipRole: + { + return pdata->instanceRoot(); + } + case Qt::DecorationRole: + { + IconList * ic = IconList::instance(); + QString key = pdata->iconKey(); + return ic->getIcon(key); + } + // for now. + case KCategorizedSortFilterProxyModel::CategorySortRole: + case KCategorizedSortFilterProxyModel::CategoryDisplayRole: + { + return pdata->group(); + } + default: + break; + } + return QVariant(); +} + +Qt::ItemFlags InstanceList::flags ( const QModelIndex& index ) const +{ + Qt::ItemFlags f; + if ( index.isValid() ) + { + f |= ( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); + } + return f; +} void InstanceList::groupChanged() { @@ -197,6 +261,8 @@ InstanceList::InstListError InstanceList::loadList() QMap groupMap; loadGroupList(groupMap); + beginResetModel(); + m_instances.clear(); QDir dir(m_instDir); QDirIterator iter(dir); @@ -251,25 +317,34 @@ InstanceList::InstListError InstanceList::loadList() m_instances.append(inst); connect(instPtr, SIGNAL(propertiesChanged(BaseInstance*)),this, SLOT(propertiesChanged(BaseInstance*))); connect(instPtr, SIGNAL(groupChanged()),this, SLOT(groupChanged())); + connect(instPtr, SIGNAL(nuked(BaseInstance*)), this, SLOT(instanceNuked(BaseInstance*))); } } - emit invalidated(); + endResetModel(); + emit dataIsInvalid(); return NoError; } /// Clear all instances. Triggers notifications. void InstanceList::clear() { + beginResetModel(); saveGroupList(); m_instances.clear(); - emit invalidated(); + endResetModel(); + emit dataIsInvalid(); }; /// Add an instance. Triggers notifications, returns the new index int InstanceList::add(InstancePtr t) { + beginInsertRows(QModelIndex(), m_instances.size(), m_instances.size()); m_instances.append(t); - emit instanceAdded(count() - 1); + t->setParent(this); + connect(t.data(), SIGNAL(propertiesChanged(BaseInstance*)),this, SLOT(propertiesChanged(BaseInstance*))); + connect(t.data(), SIGNAL(groupChanged()),this, SLOT(groupChanged())); + connect(t.data(), SIGNAL(nuked(BaseInstance*)), this, SLOT(instanceNuked(BaseInstance*))); + endInsertRows(); return count() - 1; } @@ -289,14 +364,54 @@ InstancePtr InstanceList::getInstanceById(QString instId) return iter.peekPrevious(); } -void InstanceList::propertiesChanged(BaseInstance * inst) +int InstanceList::getInstIndex ( BaseInstance* inst ) { for(int i = 0; i < m_instances.count(); i++) { if(inst == m_instances[i].data()) { - emit instanceChanged(i); - break; + return i; } } + return -1; } + + +void InstanceList::instanceNuked ( BaseInstance* inst ) +{ + int i = getInstIndex(inst); + if(i != -1) + { + beginRemoveRows(QModelIndex(),i,i); + m_instances.removeAt(i); + endRemoveRows(); + } +} + + +void InstanceList::propertiesChanged(BaseInstance * inst) +{ + int i = getInstIndex(inst); + if(i != -1) + { + emit dataChanged(index(i), index(i)); + } +} + +InstanceProxyModel::InstanceProxyModel ( QObject *parent ) + : KCategorizedSortFilterProxyModel ( parent ) +{ + // disable since by default we are globally sorting by date: + setCategorizedModel(true); +} + +bool InstanceProxyModel::subSortLessThan (const QModelIndex& left, const QModelIndex& right ) const +{ + BaseInstance *pdataLeft = static_cast ( left.internalPointer() ); + BaseInstance *pdataRight = static_cast ( right.internalPointer() ); + //kDebug() << *pdataLeft << *pdataRight; + return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0; + //return pdataLeft->name() < pdataRight->name(); +} + +#include "InstanceList.moc" \ No newline at end of file diff --git a/logic/lists/InstanceList.h b/logic/lists/InstanceList.h index 50ba56f3..501edeb1 100644 --- a/logic/lists/InstanceList.h +++ b/logic/lists/InstanceList.h @@ -17,12 +17,15 @@ #include #include +#include +#include "categorizedsortfilterproxymodel.h" +#include #include "logic/BaseInstance.h" class BaseInstance; -class InstanceList : public QObject +class InstanceList : public QAbstractListModel { Q_OBJECT private: @@ -33,6 +36,16 @@ public: explicit InstanceList(const QString &instDir, QObject *parent = 0); virtual ~InstanceList(); +public: + QModelIndex index ( int row, int column = 0, const QModelIndex& parent = QModelIndex() ) const; + int rowCount ( const QModelIndex& parent = QModelIndex() ) const; + QVariant data ( const QModelIndex& index, int role ) const; + Qt::ItemFlags flags ( const QModelIndex& index ) const; + + enum AdditionalRoles + { + InstancePointerRole = 0x34B1CB48 ///< Return pointer to real instance + }; /*! * \brief Error codes returned by functions in the InstanceList class. * NoError Indicates that no error occurred. @@ -75,16 +88,26 @@ public: /// Get an instance by ID InstancePtr getInstanceById (QString id); - signals: - void instanceAdded(int index); - void instanceChanged(int index); - void invalidated(); + void dataIsInvalid(); private slots: void propertiesChanged(BaseInstance * inst); + void instanceNuked(BaseInstance * inst); void groupChanged(); +private: + int getInstIndex(BaseInstance * inst); protected: QString m_instDir; QList< InstancePtr > m_instances; }; + +class InstanceProxyModel : public KCategorizedSortFilterProxyModel +{ +public: + explicit InstanceProxyModel ( QObject *parent = 0 ); + +protected: + virtual bool subSortLessThan ( const QModelIndex& left, const QModelIndex& right ) const; +}; + -- cgit v1.2.3