From ed28d06d9d74f612f20af54116a52cb620587462 Mon Sep 17 00:00:00 2001 From: blacksun Date: Sat, 12 Dec 2015 11:09:31 +0000 Subject: [PATCH] Improve the remove of an item in the new panel. No need to reload the collection, use QAbstractItemModel::removeRows instead. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4285 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- .../elementcollectionitem.cpp | 38 +++++++++++++++++++ .../elementcollectionitem.h | 4 ++ .../elementscollectionmodel.cpp | 25 ++++++++++++ .../elementscollectionmodel.h | 2 + .../elementscollectionwidget.cpp | 35 ++++++----------- .../elementscollectionwidget.h | 1 + .../fileelementcollectionitem.cpp | 34 +++++++++++++++++ .../fileelementcollectionitem.h | 3 ++ 8 files changed, 118 insertions(+), 24 deletions(-) diff --git a/sources/ElementsCollection/elementcollectionitem.cpp b/sources/ElementsCollection/elementcollectionitem.cpp index db63306c4..91137cd21 100644 --- a/sources/ElementsCollection/elementcollectionitem.cpp +++ b/sources/ElementsCollection/elementcollectionitem.cpp @@ -44,6 +44,25 @@ void ElementCollectionItem::appendChild(ElementCollectionItem *item) { m_child_items << item; } +/** + * @brief ElementCollectionItem::removeChild + * Remove and delete count childs starting at position row + * @param row + * @return true if childs was successfully removed + */ +bool ElementCollectionItem::removeChild(int row, int count) +{ + if (!(0 <= row+count && row+count <= m_child_items.size())) return false; + + for (int i=0 ; i ElementCollectionItem::items() const list.append(eci->items()); return list; } + +/** + * @brief ElementCollectionItem::canRemoveContent + * @return true if this item can remove the content that he represent + * By default return false. + */ +bool ElementCollectionItem::canRemoveContent() { + return false; +} + +/** + * @brief ElementCollectionItem::removeContent + * Remove the content that he represent this item (a directory or an element). + * This method do nothing and return false. Inherit it, to handle removing + * @return true if the content was successfully removed + */ +bool ElementCollectionItem::removeContent() { + return false; +} diff --git a/sources/ElementsCollection/elementcollectionitem.h b/sources/ElementsCollection/elementcollectionitem.h index de83410e1..d76d9f50f 100644 --- a/sources/ElementsCollection/elementcollectionitem.h +++ b/sources/ElementsCollection/elementcollectionitem.h @@ -40,6 +40,7 @@ class ElementCollectionItem virtual int type() const {return Type;} void appendChild (ElementCollectionItem *item); + bool removeChild (int row, int count); ElementCollectionItem *child(int row); int childCount() const; int columnCount() const; @@ -57,6 +58,9 @@ class ElementCollectionItem virtual bool isValid() const; virtual QList items() const; + virtual bool canRemoveContent(); + virtual bool removeContent(); + protected: ElementCollectionItem *m_parent_item; QList m_child_items; diff --git a/sources/ElementsCollection/elementscollectionmodel.cpp b/sources/ElementsCollection/elementscollectionmodel.cpp index f0282f8f7..d2e618c6e 100644 --- a/sources/ElementsCollection/elementscollectionmodel.cpp +++ b/sources/ElementsCollection/elementscollectionmodel.cpp @@ -131,6 +131,31 @@ QVariant ElementsCollectionModel::data(const QModelIndex &index, int role) const return item->data(index.column(), role); } +/** + * @brief ElementsCollectionModel::removeRows + * Reimplemented from QAbstractItemModel + * @param row + * @param count + * @param parent + * @return true if rows was successfully removed + */ +bool ElementsCollectionModel::removeRows(int row, int count, const QModelIndex &parent) +{ + ElementCollectionItem *eci = nullptr; + if (!parent.isValid()) + eci = m_root_item; + else + eci = static_cast(parent.internalPointer()); + + if (!(0 <= row+count && row+count <= eci->childCount())) return false; + + beginRemoveRows(parent, row, (row + count -1)); + bool r = eci->removeChild(row, count); + endRemoveRows(); + + return r; +} + /** * @brief ElementsCollectionModel::mimeData * @param indexes diff --git a/sources/ElementsCollection/elementscollectionmodel.h b/sources/ElementsCollection/elementscollectionmodel.h index 305bd6701..1844f9e3c 100644 --- a/sources/ElementsCollection/elementscollectionmodel.h +++ b/sources/ElementsCollection/elementscollectionmodel.h @@ -41,6 +41,8 @@ class ElementsCollectionModel : public QAbstractItemModel virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + virtual QMimeData *mimeData(const QModelIndexList &indexes) const; virtual Qt::ItemFlags flags(const QModelIndex &index) const; virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const; diff --git a/sources/ElementsCollection/elementscollectionwidget.cpp b/sources/ElementsCollection/elementscollectionwidget.cpp index 14011e388..edbf0b28a 100644 --- a/sources/ElementsCollection/elementscollectionwidget.cpp +++ b/sources/ElementsCollection/elementscollectionwidget.cpp @@ -141,11 +141,11 @@ void ElementsCollectionWidget::setUpConnection() */ void ElementsCollectionWidget::customContextMenu(const QPoint &point) { - QModelIndex index = m_tree_view->indexAt(point); - if (!index.isValid()) return; + m_index_at_context_menu = m_tree_view->indexAt(point); + if (!m_index_at_context_menu.isValid()) return; m_context_menu->clear(); - ElementCollectionItem *eci = static_cast(index.internalPointer()); + ElementCollectionItem *eci = static_cast(m_index_at_context_menu.internalPointer()); m_item_at_context_menu = eci; if (eci->isElement()) @@ -218,29 +218,22 @@ void ElementsCollectionWidget::deleteElement() ElementCollectionItem *eci = m_item_at_context_menu; m_item_at_context_menu = nullptr; - if (!eci || - !eci->isElement() || - (eci->type() != FileElementCollectionItem::Type)) return; - - - FileElementCollectionItem *feci = static_cast(eci); - //We can't remove an element in the common collection - if (feci->isCommonCollection()) return; + if (!eci) return; + if (!(eci->isElement() && eci->canRemoveContent())) return; if (QET::QetMessageBox::question(this, tr("Supprimer l'élément ?", "message box title"), tr("Êtes-vous sûr de vouloir supprimer cet élément ?\n", "message box content"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - QFile file(feci->fileSystemPath()); - if (!file.remove()) + if (!eci->removeContent()) { QET::QetMessageBox::warning(this, tr("Suppression de l'élément", "message box title"), tr("La suppression de l'élément a échoué.", "message box content")); } else - reload(); + m_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent()); } } @@ -253,13 +246,8 @@ void ElementsCollectionWidget::deleteDirectory() ElementCollectionItem *eci = m_item_at_context_menu; m_item_at_context_menu = nullptr; - if (!eci || - !eci->isDir() || - (eci->type() != FileElementCollectionItem::Type)) return; - - FileElementCollectionItem *feci = static_cast(eci); - //We can't remove directory int the common collection or remove the elements directory - if (feci->isCommonCollection() || feci->isCollectionRoot()) return; + if (!eci) return; + if (!(eci->isDir() && eci->canRemoveContent())) return; if (QET::QetMessageBox::question(this, tr("Supprimer le dossier?", "message box title"), @@ -268,15 +256,14 @@ void ElementsCollectionWidget::deleteDirectory() "message box content"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - QDir dir(feci->fileSystemPath()); - if (!dir.removeRecursively()) + if (!eci->removeContent()) { QET::QetMessageBox::warning(this, tr("Suppression du dossier", "message box title"), tr("La suppression du dossier a échoué.", "message box content")); } else - reload(); + m_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent()); } } diff --git a/sources/ElementsCollection/elementscollectionwidget.h b/sources/ElementsCollection/elementscollectionwidget.h index 62ec66fd1..bb54e1227 100644 --- a/sources/ElementsCollection/elementscollectionwidget.h +++ b/sources/ElementsCollection/elementscollectionwidget.h @@ -70,6 +70,7 @@ class ElementsCollectionWidget : public QWidget QVBoxLayout *m_main_vlayout; QMenu *m_context_menu; ElementCollectionItem *m_item_at_context_menu; + QModelIndex m_index_at_context_menu; QProgressBar *m_progress_bar; QAction *m_open_dir, diff --git a/sources/ElementsCollection/fileelementcollectionitem.cpp b/sources/ElementsCollection/fileelementcollectionitem.cpp index 9aa939e2c..bcdb71405 100644 --- a/sources/ElementsCollection/fileelementcollectionitem.cpp +++ b/sources/ElementsCollection/fileelementcollectionitem.cpp @@ -349,6 +349,40 @@ QString FileElementCollectionItem::name() return m_name; } +/** + * @brief FileElementCollectionItem::canRemoveContent + * Reimplemented from ElementCollectionItem + * @return + */ +bool FileElementCollectionItem::canRemoveContent() +{ + if (isCommonCollection()) return false; + else if (isDir() && isCollectionRoot()) return false; + else return true; +} + +/** + * @brief FileElementCollectionItem::removeContent + * Reimplemented from ElementCollectionItem + * @return + */ +bool FileElementCollectionItem::removeContent() +{ + if (!canRemoveContent()) return false; + + if (isElement()) + { + QFile file(fileSystemPath()); + return file.remove(); + } + else if (isDir() && !isCollectionRoot()) + { + QDir dir (fileSystemPath()); + return dir.removeRecursively(); + } + return false; +} + /** * @brief FileElementCollectionItem::setPathName * Set the name of this item in the file system path. diff --git a/sources/ElementsCollection/fileelementcollectionitem.h b/sources/ElementsCollection/fileelementcollectionitem.h index c9f16b592..fd17842d0 100644 --- a/sources/ElementsCollection/fileelementcollectionitem.h +++ b/sources/ElementsCollection/fileelementcollectionitem.h @@ -56,6 +56,9 @@ class FileElementCollectionItem : public ElementCollectionItem virtual bool isValid() const; virtual QString name(); + virtual bool canRemoveContent(); + virtual bool removeContent(); + private: void setPathName(QString path_name); void populate();