#include "databasewindow.h" #include "ui_databasewindow.h" #include DatabaseWindow::DatabaseWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::DatabaseWindow) { ui->setupUi(this); m_dbConnection.setStateCallback([this](ASyncDBConnection::State st) { QueueTask([this, st]() { connectionStateChanged(st); }); }); m_dbConnection.setNoticeCallback([this](Pgsql::ErrorDetails details) { QueueTask([this, details]() { receiveNotice(details); }); }); } DatabaseWindow::~DatabaseWindow() { m_dbConnection.closeConnection(); m_dbConnection.setStateCallback(nullptr); delete ui; } void DatabaseWindow::setConfig(const ConnectionConfig &config) { m_config = config; QString title = "pglab - "; title += m_config.name().c_str(); setWindowTitle(title); QueueTask([this]() { startConnect(); }); } void DatabaseWindow::QueueTask(TSQueue::t_Callable c) { m_taskQueue.add(c); // Theoretically this needs to be only called if the queue was empty because otherwise it already would // be busy emptying the queue. For now however I think it is safer to call it just to make sure. QMetaObject::invokeMethod(this, "processCallableQueue", Qt::QueuedConnection); // queues on main thread } void DatabaseWindow::processCallableQueue() { if (!m_taskQueue.empty()) { auto c = m_taskQueue.pop(); c(); if (!m_taskQueue.empty()) { QTimer::singleShot(0, this, SLOT(processCallableQueue())); } } } void DatabaseWindow::startConnect() { m_dbConnection.setupConnection(m_config); } void DatabaseWindow::connectionStateChanged(ASyncDBConnection::State state) { QString status_str; switch (state) { case ASyncDBConnection::State::NotConnected: status_str = tr("Geen verbinding"); break; case ASyncDBConnection::State::Connecting: status_str = tr("Verbinden"); break; case ASyncDBConnection::State::Connected: status_str = tr("Verbonden"); break; case ASyncDBConnection::State::QuerySend: status_str = tr("Query verstuurd"); break; case ASyncDBConnection::State::CancelSend: status_str = tr("Query geannuleerd"); break; } // addLog(status_str); statusBar()->showMessage(status_str); } void DatabaseWindow::receiveNotice(Pgsql::ErrorDetails notice) { // QTextCursor cursor = ui->messagesEdit->textCursor(); // cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); // QTextTable *table = cursor.insertTable(4, 2); // if (table) { // table->cellAt(1, 0).firstCursorPosition().insertText("State"); // table->cellAt(1, 1).firstCursorPosition().insertText(QString::fromStdString(notice.state)); // table->cellAt(2, 0).firstCursorPosition().insertText("Primary"); // table->cellAt(2, 1).firstCursorPosition().insertText(QString::fromStdString(notice.messagePrimary)); // table->cellAt(3, 0).firstCursorPosition().insertText("Detail"); // table->cellAt(3, 1).firstCursorPosition().insertText(QString::fromStdString(notice.messageDetail)); // } }