From 5d9314f134ddd3dc4c853e398ac90ba247fb2e4f Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Mon, 13 Jun 2016 18:42:42 -0400 Subject: Imported Upstream version 3.1.0 --- SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp | 232 +++++++++++++++++++----- 1 file changed, 183 insertions(+), 49 deletions(-) (limited to 'SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp') diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp index 62d7368..fbe0a38 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp @@ -24,6 +24,9 @@ #include "services/importmanager.h" #include "windows/editorwindow.h" #include "uiconfig.h" +#include "themetuner.h" +#include "dialogs/dbconverterdialog.h" +#include "querygenerator.h" #include #include #include @@ -34,8 +37,7 @@ #include #include #include -#include -#include +#include CFG_KEYS_DEFINE(DbTree) QHash> DbTree::allowedTypesInside; @@ -140,6 +142,10 @@ void DbTree::createActions() createAction(REFRESH_SCHEMAS, ICONS.DATABASE_RELOAD, tr("Refresh all database schemas"), this, SLOT(refreshSchemas()), this); createAction(REFRESH_SCHEMA, ICONS.DATABASE_RELOAD, tr("Refresh selected database schema"), this, SLOT(refreshSchema()), this); createAction(ERASE_TABLE_DATA, ICONS.ERASE_TABLE_DATA, tr("Erase table data"), this, SLOT(eraseTableData()), this); + createAction(GENERATE_SELECT, "SELECT", this, SLOT(generateSelectForTable()), this); + createAction(GENERATE_INSERT, "INSERT", this, SLOT(generateInsertForTable()), this); + createAction(GENERATE_UPDATE, "UPDATE", this, SLOT(generateUpdateForTable()), this); + createAction(GENERATE_DELETE, "DELETE", this, SLOT(generateDeleteForTable()), this); } void DbTree::updateActionStates(const QStandardItem *item) @@ -194,6 +200,7 @@ void DbTree::updateActionStates(const QStandardItem *item) case DbTreeItem::Type::TABLE: enabled << EDIT_TABLE << DEL_TABLE << EXPORT_TABLE << IMPORT_TABLE << POPULATE_TABLE << ADD_COLUMN << CREATE_SIMILAR_TABLE; enabled << RESET_AUTOINCREMENT << ADD_INDEX << ADD_TRIGGER << ERASE_TABLE_DATA; + enabled << GENERATE_SELECT << GENERATE_INSERT << GENERATE_UPDATE << GENERATE_DELETE; break; case DbTreeItem::Type::VIRTUAL_TABLE: // TODO change below when virtual tables can be edited @@ -329,6 +336,12 @@ void DbTree::setupActionsForMenu(DbTreeItem* currItem, QMenu* contextMenu) groupEntry += RENAME_GROUP; groupEntry += DELETE_GROUP; + ActionEntry genQueryEntry(ICONS.GENERATE_QUERY, tr("Generate query for table")); + genQueryEntry += GENERATE_SELECT; + genQueryEntry += GENERATE_INSERT; + genQueryEntry += GENERATE_UPDATE; + genQueryEntry += GENERATE_DELETE; + if (currItem) { DbTreeItem* parentItem = currItem->parentDbTreeItem(); @@ -392,6 +405,7 @@ void DbTree::setupActionsForMenu(DbTreeItem* currItem, QMenu* contextMenu) actions += ActionEntry(ADD_INDEX); actions += ActionEntry(ADD_TRIGGER); actions += ActionEntry(_separator); + actions += genQueryEntry; actions += ActionEntry(IMPORT_TABLE); actions += ActionEntry(EXPORT_TABLE); actions += ActionEntry(POPULATE_TABLE); @@ -635,11 +649,13 @@ bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTre for (DbTreeItem* srcItem : srcItems) { - if (srcItem) - srcTypes << srcItem->getType(); - else + if (!srcItem) + { srcTypes << DbTreeItem::Type::ITEM_PROTOTYPE; + continue; + } + srcTypes << srcItem->getType(); if (srcItem->getDb()) srcDbs << srcItem->getDb(); } @@ -653,6 +669,18 @@ bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTre return false; } + // Support for d&d reordering of db objects + static const QHash reorderingTypeToParent = { + {DbTreeItem::Type::TABLE, DbTreeItem::Type::TABLES}, + {DbTreeItem::Type::TRIGGER, DbTreeItem::Type::TRIGGERS}, + {DbTreeItem::Type::VIEW, DbTreeItem::Type::VIEWS}, + {DbTreeItem::Type::INDEX, DbTreeItem::Type::INDEXES} + }; + + if (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 if (dstItem && dstItem->getDb() && srcDbs.contains(dstItem->getDb())) return false; @@ -706,6 +734,16 @@ Db* DbTree::getSelectedDb() return item->getDb(); } +QSet DbTree::getSelectedDatabases() +{ + QList items = ui->treeView->selectionItems(); + QSet dbList; + for (DbTreeItem* item : items) + dbList << item->getDb(); + + return dbList; +} + Db* DbTree::getSelectedOpenDb() { Db* db = getSelectedDb(); @@ -872,6 +910,72 @@ void DbTree::deleteItem(DbTreeItem* item) } } +void DbTree::deleteSelected(DbTreeItem::Type itemType) +{ + deleteSelected([itemType](DbTreeItem* item) + { + return item->getType() == itemType; + }); +} + +QHash> DbTree::groupByDb(const QList items) +{ + QHash> grouped; + for (DbTreeItem* item : items) + grouped[item->getDb()] << item; + + return grouped; +} + +QStringList DbTree::itemsToNames(const QList& items) +{ + QStringList names; + for (DbTreeItem* item : items) + names << item->text(); + + return names; +} + +QString DbTree::getSelectedTableName() const +{ + DbTreeItem* item = ui->treeView->currentItem(); + QString table = item->getTable(); + if (table.isNull()) + return QString(); + + return table; +} + +QString DbTree::getSelectedIndexName() const +{ + DbTreeItem* item = ui->treeView->currentItem(); + QString idx = item->getIndex(); + if (idx.isNull()) + return QString(); + + return idx; +} + +QString DbTree::getSelectedTriggerName() const +{ + DbTreeItem* item = ui->treeView->currentItem(); + QString trig = item->getTrigger(); + if (trig.isNull()) + return QString(); + + return trig; +} + +QString DbTree::getSelectedViewName() const +{ + DbTreeItem* item = ui->treeView->currentItem(); + QString view= item->getView(); + if (view.isNull()) + return QString(); + + return view; +} + void DbTree::refreshSchema(Db* db) { @@ -1012,15 +1116,29 @@ void DbTree::editDb() void DbTree::removeDb() { - Db* db = getSelectedDb(); - if (!db) + QList dbList = getSelectedDatabases().toList(); + if (dbList.isEmpty()) return; - QMessageBox::StandardButton result = QMessageBox::question(this, tr("Delete database"), tr("Are you sure you want to delete database '%1'?").arg(db->getName().left(ITEM_TEXT_LIMIT))); + QString msg; + if (dbList.size() == 1) + { + msg = tr("Are you sure you want to remove database '%1' from the list?").arg(dbList.first()->getName().left(ITEM_TEXT_LIMIT)); + } + else + { + QStringList dbNames; + for (Db* db : dbList) + dbNames << db->getName().left(ITEM_TEXT_LIMIT); + + msg = tr("Are you sure you want to remove following databases from the list:\n%1").arg(dbNames.join(",\n")); + } + QMessageBox::StandardButton result = QMessageBox::question(this, tr("Remove database"), msg); if (result != QMessageBox::Yes) return; - DBLIST->removeDb(db); + for (Db* db : dbList) + DBLIST->removeDb(db); } void DbTree::connectToDb() @@ -1097,8 +1215,7 @@ void DbTree::editTable() if (!db || !db->isValid()) return; - DbTreeItem* item = ui->treeView->currentItem(); - QString table = item->getTable(); + QString table = getSelectedTableName(); if (table.isNull()) { qWarning() << "Tried to edit table, while table wasn't selected in DbTree."; @@ -1110,20 +1227,7 @@ void DbTree::editTable() void DbTree::delTable() { - Db* db = getSelectedOpenDb(); - if (!db || !db->isValid()) - return; - - DbTreeItem* item = ui->treeView->currentItem(); - QString table = item->getTable(); - if (table.isNull()) - { - qWarning() << "Tried to drop table, while table wasn't selected in DbTree."; - return; - } - - DbObjectDialogs dialogs(db); - dialogs.dropObject(table); // TODO add database prefix when supported + deleteSelected(DbTreeItem::Type::TABLE); } void DbTree::addIndex() @@ -1145,8 +1249,7 @@ void DbTree::editIndex() if (!db || !db->isValid()) return; - DbTreeItem* item = ui->treeView->currentItem(); - QString index = item->getIndex(); + QString index = getSelectedIndexName(); DbObjectDialogs dialogs(db); dialogs.editIndex(index); @@ -1154,7 +1257,7 @@ void DbTree::editIndex() void DbTree::delIndex() { - delSelectedObject(); + deleteSelected(DbTreeItem::Type::INDEX); } void DbTree::addTrigger() @@ -1177,8 +1280,7 @@ void DbTree::editTrigger() if (!db || !db->isValid()) return; - DbTreeItem* item = ui->treeView->currentItem(); - QString trigger = item->getTrigger(); + QString trigger = getSelectedTriggerName(); DbObjectDialogs dialogs(db); dialogs.editTrigger(trigger); @@ -1186,7 +1288,7 @@ void DbTree::editTrigger() void DbTree::delTrigger() { - delSelectedObject(); + deleteSelected(DbTreeItem::Type::TRIGGER); } void DbTree::addView() @@ -1205,8 +1307,7 @@ void DbTree::editView() if (!db || !db->isValid()) return; - DbTreeItem* item = ui->treeView->currentItem(); - QString view = item->getView(); + QString view = getSelectedViewName(); if (view.isNull()) { qWarning() << "Tried to edit view, while view wasn't selected in DbTree."; @@ -1218,7 +1319,7 @@ void DbTree::editView() void DbTree::delView() { - delSelectedObject(); + deleteSelected(DbTreeItem::Type::VIEW); } void DbTree::exportTable() @@ -1334,11 +1435,12 @@ void DbTree::vacuumDb() if (!db || !db->isValid()) return; - SqlQueryPtr res = db->exec("VACUUM;"); - if (res->isError()) - notifyError(tr("Error while executing VACUUM on the database %1: %2").arg(db->getName(), res->getErrorText())); - else - notifyInfo(tr("VACUUM execution finished successfully.")); + EditorWindow* win = MAINWINDOW->openSqlEditor(db, "VACUUM;"); + if (!win) + return; + + win->getMdiWindow()->rename(tr("Vacuum (%1)").arg(db->getName())); + win->execute(); } void DbTree::integrityCheck() @@ -1347,16 +1449,11 @@ void DbTree::integrityCheck() if (!db || !db->isValid()) return; - EditorWindow* win = MAINWINDOW->openSqlEditor(); - if (!win->setCurrentDb(db)) - { - qCritical() << "Created EditorWindow had not got requested database:" << db->getName(); - win->close(); + EditorWindow* win = MAINWINDOW->openSqlEditor(db, "PRAGMA integrity_check;"); + if (!win) return; - } win->getMdiWindow()->rename(tr("Integrity check (%1)").arg(db->getName())); - win->setContents("PRAGMA integrity_check;"); win->execute(); } @@ -1493,12 +1590,19 @@ void DbTree::currentChanged(const QModelIndex ¤t, const QModelIndex &previ updateActionStates(treeModel->itemFromIndex(current)); } -void DbTree::deleteSelected() +void DbTree::deleteSelected(ItemFilterFunc filterFunc) { QModelIndexList idxList = ui->treeView->getSelectedIndexes(); QList items; - foreach (const QModelIndex& idx, idxList) - items << dynamic_cast(treeModel->itemFromIndex(idx)); + DbTreeItem* item; + for (const QModelIndex& idx : idxList) + { + item = dynamic_cast(treeModel->itemFromIndex(idx)); + if (filterFunc && !filterFunc(item)) + continue; + + items << item; + } deleteItems(items); } @@ -1615,6 +1719,36 @@ void DbTree::refreshFont() ui->treeView->doItemsLayout(); } +void DbTree::generateSelectForTable() +{ + Db* db = getSelectedDb(); + QString table = getSelectedTableName(); + + QueryGenerator generator; + QString sql = generator.generateSelectFromTable(db, table); + MAINWINDOW->openSqlEditor(db, sql); +} + +void DbTree::generateInsertForTable() +{ + Db* db = getSelectedDb(); + QString table = getSelectedTableName(); + + QueryGenerator generator; + QString sql = generator.generateInsertToTable(db, table); + MAINWINDOW->openSqlEditor(db, sql); +} + +void DbTree::generateUpdateForTable() +{ + +} + +void DbTree::generateDeleteForTable() +{ + +} + void DbTree::setupDefShortcuts() { setShortcutContext({ -- cgit v1.2.3