Skip to content

Commit

Permalink
#3171 Pasting object to same database is prevented (as it was intende…
Browse files Browse the repository at this point in the history
…d initially).
  • Loading branch information
pawelsalawa committed Mar 18, 2018
1 parent c41c80d commit ff7180a
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 17 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/output*
*.user
*.user
.DS_Store
Binary file removed Plugins/.DS_Store
Binary file not shown.
Binary file removed SQLiteStudio3/.DS_Store
Binary file not shown.
17 changes: 9 additions & 8 deletions SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ void DbTree::updateActionStates(const QStandardItem *item)
// Add database should always be available, as well as a copy of an item
enabled << ADD_DB << COPY;

if (isMimeDataValidForItem(QApplication::clipboard()->mimeData(), dbTreeItem))
if (isMimeDataValidForItem(QApplication::clipboard()->mimeData(), dbTreeItem, true))
enabled << PASTE;

enabled << CLEAR_FILTER;
Expand Down Expand Up @@ -624,10 +624,10 @@ DbTreeView*DbTree::getView() const
return ui->treeView;
}

bool DbTree::isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item)
bool DbTree::isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item, bool forPasting)
{
if (mimeData->formats().contains(DbTreeModel::MIMETYPE))
return areDbTreeItemsValidForItem(getModel()->getDragItems(mimeData), item);
return areDbTreeItemsValidForItem(getModel()->getDragItems(mimeData), item, forPasting);
else if (mimeData->hasUrls())
return areUrlsValidForItem(mimeData->urls(), item);

Expand All @@ -639,14 +639,17 @@ bool DbTree::isItemDraggable(const DbTreeItem* item)
return item && draggableTypes.contains(item->getType());
}

bool DbTree::areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTreeItem* dstItem)
bool DbTree::areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTreeItem* dstItem, bool forPasting)
{
QSet<Db*> srcDbs;
QList<DbTreeItem::Type> srcTypes;
DbTreeItem::Type dstType = DbTreeItem::Type::DIR; // the empty space is treated as group
if (dstItem)
dstType = dstItem->getType();

if (dstType == DbTreeItem::Type::DB && !dstItem->getDb()->isOpen())
return false;

for (DbTreeItem* srcItem : srcItems)
{
if (!srcItem)
Expand All @@ -664,9 +667,6 @@ bool DbTree::areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTre
{
if (!allowedTypesInside[dstType].contains(srcType))
return false;

if (dstType == DbTreeItem::Type::DB && !dstItem->getDb()->isOpen())
return false;
}

// Support for d&d reordering of db objects
Expand All @@ -677,7 +677,8 @@ bool DbTree::areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTre
{DbTreeItem::Type::INDEX, DbTreeItem::Type::INDEXES}
};

if (srcTypes.toSet().size() == 1 && srcDbs.size() == 1 && dstItem && *(srcDbs.begin()) == dstItem->getDb() && reorderingTypeToParent[srcTypes.first()] == dstType)
if (!forPasting && srcTypes.toSet().size() == 1 && srcDbs.size() == 1 && dstItem &&
*(srcDbs.begin()) == dstItem->getDb() && reorderingTypeToParent[srcTypes.first()] == dstType)
return true;

// No other d&d within same db
Expand Down
4 changes: 2 additions & 2 deletions SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer
void showWidgetCover();
void hideWidgetCover();
void setSelectedItem(DbTreeItem* item);
bool isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item);
bool isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item, bool forPasting = false);
QToolBar* getToolBar(int toolbar) const;
Db* getSelectedDb();
Db* getSelectedOpenDb();
Expand Down Expand Up @@ -150,7 +150,7 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer
QList<DbTreeItem*> getSelectedItems(DbTreeItem::Type itemType);
QList<DbTreeItem*> getSelectedItems(ItemFilterFunc filterFunc = nullptr);

static bool areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTreeItem* dstItem);
static bool areDbTreeItemsValidForItem(QList<DbTreeItem*> srcItems, const DbTreeItem* dstItem, bool forPasting = false);
static bool areUrlsValidForItem(const QList<QUrl>& srcUrls, const DbTreeItem* dstItem);
static void initDndTypes();

Expand Down
14 changes: 9 additions & 5 deletions SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -965,7 +965,7 @@ bool DbTreeModel::pasteData(const QMimeData* data, int row, int column, const QM
}

if (data->formats().contains(MIMETYPE))
return dropDbTreeItem(getDragItems(data), dstItem, defaultAction, *invokeStdAction);
return dropDbTreeItem(getDragItems(data), dstItem, defaultAction, invokeStdAction);
else if (data->hasUrls())
return dropUrls(data->urls());
else
Expand Down Expand Up @@ -1025,7 +1025,7 @@ void DbTreeModel::staticInit()
{
}

bool DbTreeModel::dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool& invokeStdDropAction)
bool DbTreeModel::dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool *invokeStdDropAction)
{
// The result means: do we want the old item to be removed from the tree?
if (srcItems.size() == 0)
Expand All @@ -1040,18 +1040,22 @@ bool DbTreeModel::dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem*
if (!dstItem)
return false;

if (srcItem->getDb() == dstItem->getDb())
if (srcItem->getDb() == dstItem->getDb() && invokeStdDropAction)
{
invokeStdDropAction = true;
*invokeStdDropAction = true;
return true;
}

return dropDbObjectItem(srcItems, dstItem, defaultAction);
}
case DbTreeItem::Type::DB:
case DbTreeItem::Type::DIR:
invokeStdDropAction = true;
{
if (invokeStdDropAction)
*invokeStdDropAction = true;

break;
}
case DbTreeItem::Type::COLUMN:
case DbTreeItem::Type::TABLES:
case DbTreeItem::Type::INDEXES:
Expand Down
2 changes: 1 addition & 1 deletion SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class GUI_API_EXPORT DbTreeModel : public QStandardItemModel
QString getDbToolTip(DbTreeItem *item) const;
QString getTableToolTip(DbTreeItem *item) const;
QList<DbTreeItem*> getChildsAsFlatList(QStandardItem* item) const;
bool dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool &invokeStdDropAction);
bool dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool* invokeStdDropAction);
bool dropDbObjectItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction);
QCheckBox* createCopyOrMoveMenuCheckBox(QMenu* menu, const QString& label);
bool dropUrls(const QList<QUrl>& urls);
Expand Down

0 comments on commit ff7180a

Please sign in to comment.