#include "ui_BrowserWndUi.h" #include "BrowserWnd.h" #include "LoginWnd.h" #include "Query.h" #include "DataModel.h" #include "QueryThread.h" #include #include #include #include #include #include #include BrowserWnd::BrowserWnd() : QWidget(nullptr) , m_loginWnd(new LoginWnd(this)) , m_waitWnd(new WaitWnd(this)) , m_ui(new Ui::BrowserWnd) , m_queryWorker(new QueryWorker()) , m_queryThread(new QThread()) { //setVersionView(); qRegisterMetaType("LoginData"); if (!test()) exit(1); new QShortcut(QKeySequence(QStringLiteral("Ctrl+Q")), this, SLOT(close())); connect(this, &BrowserWnd::signalConnect, m_queryWorker, &QueryWorker::slotConnectIt); connect(m_queryWorker, &QueryWorker::signalConnectResult, this, &BrowserWnd::slotConnectResult); connect(this, &BrowserWnd::signalGetTableList, m_queryWorker, &QueryWorker::slotGetTableList); connect(m_queryWorker, &QueryWorker::signalNewTableList, this, &BrowserWnd::slotNewTableList); m_queryWorker->moveToThread(m_queryThread); m_queryThread->start(); } BrowserWnd::~BrowserWnd() { endThread(); delete m_ui; delete m_waitWnd; delete m_loginWnd; } void BrowserWnd::slotAddNewQuery() { addNewQuery(); } void BrowserWnd::slotConnectResult(const QString &result) { if (result.isEmpty()) // connection success! { // everything okay, logged in, go! m_ui->setupUi(this); // showing Host / DB name in window title this->setWindowTitle(QStringLiteral("RDE SQL Browser on Database: ") + m_loginWnd->getLoginData().database); m_ui->splitter->setStretchFactor(0, 0); // not stretch for table list m_ui->splitter->setStretchFactor(1, 1); // stretch the query widget this->show(); addNewQuery(); refreshTableList(); connect(m_ui->leFilter, &QLineEdit::textChanged, this, &BrowserWnd::slotFilterTableList); connect(m_ui->lwTables, &QListWidget::itemDoubleClicked, this, &BrowserWnd::slotFilterTableItemChanged); connect(m_ui->twQueries, &QTabWidget::tabCloseRequested, this, &BrowserWnd::slotTabCloseRequested); connect(m_ui->pbNewQuery, &QPushButton::clicked, this, &BrowserWnd::slotAddNewQuery); connect(m_ui->pushButton, &QPushButton::clicked, qApp, &QApplication::quit); connect(m_ui->pushButton_2, &QPushButton::clicked, this, &BrowserWnd::slotHeart); } else // failed with message { QMessageBox::critical(this, tr("Connection Error"), tr("Cannot connect to specified server." "\nError:" "\n'%1'").arg(result)); } m_waitWnd->hide(); } void BrowserWnd::slotFilterTableList(const QString &) { refreshTableList(); } void BrowserWnd::addNewQuery(const QString &tableName) // tableName only set when query from double clicking table list { Query *query = new Query(m_queryWorker); connect(query, &Query::signalShowWait, this, &BrowserWnd::slotShowWait); connect(query, &Query::signalHideWait, this, &BrowserWnd::slotHideWait); int tabIndex = -1; if (tableName.length()) // there is a tablename { query->setTable(tableName); tabIndex = m_ui->twQueries->addTab(query, tableName); } else // no tablename tabIndex = m_ui->twQueries->addTab(query, QStringLiteral("Query %1").arg(m_newQueryCounter++)); m_ui->twQueries->setCurrentIndex(tabIndex); } //#warning TODO: reimpl //void BrowserWnd::slotSelectQueryStatus(int percent) //{ // m_waitWnd->setStatus(percent); //} void BrowserWnd::endThread() { if (!m_queryThread) return; m_queryWorker->dy(); m_queryThread->quit(); m_queryThread->wait(); delete m_queryThread; m_queryThread = nullptr; delete m_queryWorker; m_queryWorker = nullptr; } void BrowserWnd::refreshTableList() { m_ui->lwTables->clear(); m_waitWnd->wait(QStringLiteral("Refreshing Table List ..")); emit signalGetTableList(); } void BrowserWnd::slotNewTableList(QStringList tables) { if (!m_ui->leFilter->text().isEmpty()) // filter when there is a filter { QRegExp regExp(m_ui->leFilter->text(), Qt::CaseInsensitive, QRegExp::Wildcard); tables = tables.filter(regExp); } m_ui->lwTables->addItems(tables); m_waitWnd->hide(); } void BrowserWnd::startConnect() { //m_loginWnd->setDefaultLoginData(presetManager. defaultLoginData); if (!m_loginWnd->exec()) // false = user reject { QCoreApplication::quit(); return; } m_waitWnd->wait(tr("Connecting ..")); emit signalConnect(m_loginWnd->getLoginData()); } bool BrowserWnd::test() { if (QSqlDatabase::drivers().isEmpty() || QSqlDatabase::drivers().indexOf(QLatin1String("QSQLITE")) == -1) { QMessageBox::critical(this, tr("Missing Qt PostgreSQL driver"), tr("There is no QPSQL driver." "\nDid you install the package 'libQt5Sql5-postgresql'?")); return false; } return true; } void BrowserWnd::slotFilterTableItemChanged(QListWidgetItem *item) { QString tableName = item->text(); addNewQuery(tableName); } void BrowserWnd::slotTabCloseRequested(int index) { Query *q = qobject_cast(m_ui->twQueries->widget(index)); m_ui->twQueries->removeTab(index); if (!q) QMessageBox::critical(this, QStringLiteral("Query Failed"), QStringLiteral("Woops..?!!")); delete q; // It´s safe to delete nullptr; } void BrowserWnd::slotShowWait(const QString &msg) { m_waitWnd->wait(msg); } void BrowserWnd::slotHideWait() { m_waitWnd->hide(); } void BrowserWnd::slotHeart() { QWidget *w = new QWidget; w->setAttribute(Qt::WA_DeleteOnClose); // delete when closed QVBoxLayout *b = new QVBoxLayout; QLabel *l = new QLabel(QStringLiteral("Geschmiedet mit %1 , ohne Kostenträger, für das Team.
Diese Software wurde in meiner Freizeit entwickelt, bitte habt Verständnis für Bugs und Geduld für Fixes. Danke! - Euer Mike Wille, SLSE 2016, 17").arg(QChar(0x2764))); QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect; shadow->setOffset(0, 0); shadow->setBlurRadius(22); shadow->setColor(QColor("blue")); l->setGraphicsEffect(shadow); b->addWidget(l); w->setLayout(b); w->show(); }