[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();


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/