aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp255
1 files changed, 255 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp
new file mode 100644
index 0000000..7785b8f
--- /dev/null
+++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp
@@ -0,0 +1,255 @@
+#include "dbtreeview.h"
+#include "dbtreemodel.h"
+#include "dbtreeitemdelegate.h"
+#include "mainwindow.h"
+#include "services/dbmanager.h"
+#include "common/unused.h"
+#include <QDragMoveEvent>
+#include <QMenu>
+#include <QList>
+#include <QMimeData>
+#include <QDebug>
+
+DbTreeView::DbTreeView(QWidget *parent) :
+ QTreeView(parent)
+{
+ contextMenu = new QMenu(this);
+ connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint)));
+
+ setHeaderHidden(true);
+ setContextMenuPolicy(Qt::CustomContextMenu);
+ setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+ itemDelegate = new DbTreeItemDelegate();
+ setItemDelegate(itemDelegate);
+}
+
+DbTreeView::~DbTreeView()
+{
+ delete contextMenu;
+ delete itemDelegate;
+}
+
+void DbTreeView::setDbTree(DbTree *dbTree)
+{
+ this->dbTree = dbTree;
+}
+
+DbTree* DbTreeView::getDbTree() const
+{
+ return dbTree;
+}
+
+DbTreeItem *DbTreeView::currentItem()
+{
+ return dynamic_cast<DbTreeItem*>(model()->itemFromIndex(currentIndex()));
+}
+
+DbTreeItem *DbTreeView::itemAt(const QPoint &pos)
+{
+ return dynamic_cast<DbTreeItem*>(model()->itemFromIndex(indexAt(pos)));
+}
+
+QList<DbTreeItem *> DbTreeView::selectionItems()
+{
+ QList<DbTreeItem*> items;
+ QModelIndexList selectedIndexes = selectionModel()->selectedIndexes();
+ foreach (QModelIndex modIdx, selectedIndexes)
+ items += dynamic_cast<DbTreeItem*>(model()->itemFromIndex(modIdx));
+
+ return items;
+}
+
+DbTreeModel *DbTreeView::model() const
+{
+ return dynamic_cast<DbTreeModel*>(QTreeView::model());
+}
+
+void DbTreeView::showMenu(const QPoint &pos)
+{
+ contextMenu->clear();
+
+ DbTreeItem* itemUnderCursor = itemAt(pos);
+ if (!itemUnderCursor)
+ selectionModel()->clear();
+
+ DbTreeItem* item = getItemForAction();
+ dbTree->setupActionsForMenu(item, contextMenu);
+ if (contextMenu->actions().size() == 0)
+ return;
+
+ dbTree->updateActionStates(item);
+ contextMenu->popup(mapToGlobal(pos));
+}
+
+void DbTreeView::updateItemHidden(DbTreeItem* item)
+{
+ setRowHidden(item->index().row(), item->index().parent(), item->isHidden());
+}
+
+DbTreeItem *DbTreeView::getItemForAction(bool onlySelected) const
+{
+ QModelIndex idx = selectionModel()->currentIndex();
+ if (onlySelected && !selectionModel()->isSelected(idx))
+ return nullptr;
+
+ return dynamic_cast<DbTreeItem*>(model()->itemFromIndex(idx));
+}
+
+void DbTreeView::dragEnterEvent(QDragEnterEvent* e)
+{
+ QTreeView::dragEnterEvent(e);
+ if (e->mimeData()->hasUrls())
+ e->acceptProposedAction();
+}
+
+void DbTreeView::dragMoveEvent(QDragMoveEvent *event)
+{
+ QTreeView::dragMoveEvent(event);
+
+ DbTreeItem* dstItem = itemAt(event->pos());
+
+ // Depending on where we drop we need a type of item we drop ON,
+ // or type of parent item if we drop ABOVE/BELOW. If we drop on empty space,
+ // we leave type as default.
+ if (dstItem)
+ {
+ QAbstractItemView::DropIndicatorPosition dropPosition = dropIndicatorPosition();
+ switch (dropPosition)
+ {
+ case QAbstractItemView::OnItem:
+ break;
+ case QAbstractItemView::AboveItem:
+ case QAbstractItemView::BelowItem:
+ {
+ dstItem = dstItem->parentDbTreeItem();
+ break;
+ }
+ case QAbstractItemView::OnViewport:
+ dstItem = nullptr;
+ break;
+ }
+ }
+
+ //qDebug() << event->mimeData()->formats();
+ const QMimeData* data = event->mimeData();
+ if (dbTree->isMimeDataValidForItem(data, dstItem))
+ event->acceptProposedAction();
+ else
+ event->ignore();
+}
+
+void DbTreeView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ DbTreeItem* itemUnderCursor = itemAt(event->pos());
+ if (itemUnderCursor && !handleDoubleClick(itemUnderCursor))
+ return;
+
+ QTreeView::mouseDoubleClickEvent(event);
+}
+
+bool DbTreeView::handleDoubleClick(DbTreeItem *item)
+{
+ switch (item->getType())
+ {
+ case DbTreeItem::Type::DIR:
+ break;
+ case DbTreeItem::Type::DB:
+ {
+ if (item->getDb()->isValid())
+ return handleDbDoubleClick(item);
+ }
+ case DbTreeItem::Type::TABLES:
+ break;
+ case DbTreeItem::Type::VIRTUAL_TABLE:
+ // TODO if module for virtual table is loaded - show virtual table window
+ break;
+ case DbTreeItem::Type::TABLE:
+ return handleTableDoubleClick(item);
+ case DbTreeItem::Type::INDEXES:
+ break;
+ case DbTreeItem::Type::INDEX:
+ return handleIndexDoubleClick(item);
+ case DbTreeItem::Type::TRIGGERS:
+ break;
+ case DbTreeItem::Type::TRIGGER:
+ return handleTriggerDoubleClick(item);
+ case DbTreeItem::Type::VIEWS:
+ break;
+ case DbTreeItem::Type::VIEW:
+ return handleViewDoubleClick(item);
+ case DbTreeItem::Type::COLUMNS:
+ break;
+ case DbTreeItem::Type::COLUMN:
+ return handleColumnDoubleClick(item);
+ case DbTreeItem::Type::ITEM_PROTOTYPE:
+ break;
+ }
+
+ return true;
+}
+
+bool DbTreeView::handleDbDoubleClick(DbTreeItem *item)
+{
+ if (!item->getDb()->isOpen())
+ {
+ dbTree->getAction(DbTree::CONNECT_TO_DB)->trigger();
+ return false;
+ }
+ return true;
+}
+
+bool DbTreeView::handleTableDoubleClick(DbTreeItem *item)
+{
+ dbTree->openTable(item);
+ return false;
+}
+
+bool DbTreeView::handleIndexDoubleClick(DbTreeItem *item)
+{
+ dbTree->editIndex(item);
+ return false;
+}
+
+bool DbTreeView::handleTriggerDoubleClick(DbTreeItem *item)
+{
+ dbTree->editTrigger(item);
+ return false;
+}
+
+bool DbTreeView::handleViewDoubleClick(DbTreeItem *item)
+{
+ dbTree->openView(item);
+ return false;
+}
+
+bool DbTreeView::handleColumnDoubleClick(DbTreeItem *item)
+{
+ dbTree->editColumn(item);
+ return false;
+}
+
+QPoint DbTreeView::getLastDropPosition() const
+{
+ return lastDropPosition;
+}
+
+QModelIndexList DbTreeView::getSelectedIndexes() const
+{
+ QModelIndexList idxList = selectedIndexes();
+ if (currentIndex().isValid() && !idxList.contains(currentIndex()))
+ idxList << currentIndex();
+
+ return idxList;
+}
+
+void DbTreeView::dropEvent(QDropEvent* e)
+{
+ lastDropPosition = e->pos();
+ QTreeView::dropEvent(e);
+ if (!e->isAccepted() && e->mimeData()->hasUrls() && !dbTree->getModel()->hasDbTreeItem(e->mimeData()))
+ {
+ dbTree->getModel()->dropMimeData(e->mimeData(), Qt::CopyAction, -1, -1, dbTree->getModel()->root()->index());
+ e->accept();
+ }
+}