[qet] [4285] Improve the remove of an item in the new panel. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4285
Author: blacksun
Date: 2015-12-12 12:09:31 +0100 (Sat, 12 Dec 2015)
Log Message:
-----------
Improve the remove of an item in the new panel. No need to reload the collection, use QAbstractItemModel::removeRows instead.
Modified Paths:
--------------
trunk/sources/ElementsCollection/elementcollectionitem.cpp
trunk/sources/ElementsCollection/elementcollectionitem.h
trunk/sources/ElementsCollection/elementscollectionmodel.cpp
trunk/sources/ElementsCollection/elementscollectionmodel.h
trunk/sources/ElementsCollection/elementscollectionwidget.cpp
trunk/sources/ElementsCollection/elementscollectionwidget.h
trunk/sources/ElementsCollection/fileelementcollectionitem.cpp
trunk/sources/ElementsCollection/fileelementcollectionitem.h
Modified: trunk/sources/ElementsCollection/elementcollectionitem.cpp
===================================================================
--- trunk/sources/ElementsCollection/elementcollectionitem.cpp 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementcollectionitem.cpp 2015-12-12 11:09:31 UTC (rev 4285)
@@ -45,6 +45,25 @@
}
/**
+ * @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<count ; i++)
+ {
+ ElementCollectionItem *eci = m_child_items.takeAt(row);
+ delete eci;
+ }
+
+ return true;
+}
+
+/**
* @brief ElementCollectionItem::child
* @param row
* @return The child at @row of this item.
@@ -177,3 +196,22 @@
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;
+}
Modified: trunk/sources/ElementsCollection/elementcollectionitem.h
===================================================================
--- trunk/sources/ElementsCollection/elementcollectionitem.h 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementcollectionitem.h 2015-12-12 11:09:31 UTC (rev 4285)
@@ -40,6 +40,7 @@
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 @@
virtual bool isValid() const;
virtual QList <ElementCollectionItem *> items() const;
+ virtual bool canRemoveContent();
+ virtual bool removeContent();
+
protected:
ElementCollectionItem *m_parent_item;
QList <ElementCollectionItem *> m_child_items;
Modified: trunk/sources/ElementsCollection/elementscollectionmodel.cpp
===================================================================
--- trunk/sources/ElementsCollection/elementscollectionmodel.cpp 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementscollectionmodel.cpp 2015-12-12 11:09:31 UTC (rev 4285)
@@ -132,6 +132,31 @@
}
/**
+ * @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<ElementCollectionItem *>(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
* @return the mime data of the items at @indexes
Modified: trunk/sources/ElementsCollection/elementscollectionmodel.h
===================================================================
--- trunk/sources/ElementsCollection/elementscollectionmodel.h 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementscollectionmodel.h 2015-12-12 11:09:31 UTC (rev 4285)
@@ -41,6 +41,8 @@
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;
Modified: trunk/sources/ElementsCollection/elementscollectionwidget.cpp
===================================================================
--- trunk/sources/ElementsCollection/elementscollectionwidget.cpp 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementscollectionwidget.cpp 2015-12-12 11:09:31 UTC (rev 4285)
@@ -141,11 +141,11 @@
*/
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<ElementCollectionItem*>(index.internalPointer());
+ ElementCollectionItem *eci = static_cast<ElementCollectionItem*>(m_index_at_context_menu.internalPointer());
m_item_at_context_menu = eci;
if (eci->isElement())
@@ -218,29 +218,22 @@
ElementCollectionItem *eci = m_item_at_context_menu;
m_item_at_context_menu = nullptr;
- if (!eci ||
- !eci->isElement() ||
- (eci->type() != FileElementCollectionItem::Type)) return;
+ if (!eci) return;
+ if (!(eci->isElement() && eci->canRemoveContent())) return;
-
- FileElementCollectionItem *feci = static_cast<FileElementCollectionItem*>(eci);
- //We can't remove an element in the common collection
- if (feci->isCommonCollection()) 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,14 +246,9 @@
ElementCollectionItem *eci = m_item_at_context_menu;
m_item_at_context_menu = nullptr;
- if (!eci ||
- !eci->isDir() ||
- (eci->type() != FileElementCollectionItem::Type)) return;
+ if (!eci) return;
+ if (!(eci->isDir() && eci->canRemoveContent())) return;
- FileElementCollectionItem *feci = static_cast<FileElementCollectionItem*>(eci);
- //We can't remove directory int the common collection or remove the elements directory
- if (feci->isCommonCollection() || feci->isCollectionRoot()) return;
-
if (QET::QetMessageBox::question(this,
tr("Supprimer le dossier?", "message box title"),
tr("Êtes-vous sûr de vouloir supprimer le dossier ?\n"
@@ -268,15 +256,14 @@
"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());
}
}
Modified: trunk/sources/ElementsCollection/elementscollectionwidget.h
===================================================================
--- trunk/sources/ElementsCollection/elementscollectionwidget.h 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/elementscollectionwidget.h 2015-12-12 11:09:31 UTC (rev 4285)
@@ -70,6 +70,7 @@
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,
Modified: trunk/sources/ElementsCollection/fileelementcollectionitem.cpp
===================================================================
--- trunk/sources/ElementsCollection/fileelementcollectionitem.cpp 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/fileelementcollectionitem.cpp 2015-12-12 11:09:31 UTC (rev 4285)
@@ -350,6 +350,40 @@
}
/**
+ * @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.
* This item must have a parent, because they should be a child item of another.
Modified: trunk/sources/ElementsCollection/fileelementcollectionitem.h
===================================================================
--- trunk/sources/ElementsCollection/fileelementcollectionitem.h 2015-12-09 20:27:31 UTC (rev 4284)
+++ trunk/sources/ElementsCollection/fileelementcollectionitem.h 2015-12-12 11:09:31 UTC (rev 4285)
@@ -56,6 +56,9 @@
virtual bool isValid() const;
virtual QString name();
+ virtual bool canRemoveContent();
+ virtual bool removeContent();
+
private:
void setPathName(QString path_name);
void populate();