252 lines
6.2 KiB
C++
Executable File
252 lines
6.2 KiB
C++
Executable File
#include "ui_BrowserWndUi.h"
|
||
#include "BrowserWnd.h"
|
||
#include "LoginWnd.h"
|
||
#include "Query.h"
|
||
#include "DataModel.h"
|
||
#include "QueryThread.h"
|
||
|
||
#include <QDebug>
|
||
#include <QGraphicsDropShadowEffect>
|
||
#include <QListWidgetItem>
|
||
#include <QMessageBox>
|
||
#include <QRegExp>
|
||
#include <QShortcut>
|
||
#include <QThread>
|
||
|
||
|
||
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>("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<Query *>(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("<html><body>Geschmiedet mit %1 , ohne Kostenträger, für das Team.<br>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</body></html>").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();
|
||
}
|