Query tab will now show multiple data tabs if it get's multiple results

with tuples.
This commit is contained in:
Eelke Klein 2017-01-25 06:54:21 +01:00
parent 424cbc9e2e
commit b6d986051b
21 changed files with 349 additions and 113 deletions

View file

@ -250,6 +250,7 @@ void ASyncDBConnection::Thread::doNewCommand()
} }
} }
if (!command.empty() && m_connection.sendQuery(command)) { if (!command.empty() && m_connection.sendQuery(command)) {
m_timer.start();
doStateCallback(State::QuerySend); doStateCallback(State::QuerySend);
} }
else { else {
@ -290,9 +291,11 @@ void ASyncDBConnection::Thread::waitForResult()
while ( ! finished && ! m_connection.isBusy()) { while ( ! finished && ! m_connection.isBusy()) {
auto res(m_connection.getResult()); auto res(m_connection.getResult());
{ {
qint64 ms = m_timer.restart();
std::lock_guard<std::mutex> lg(m_commandQueue.m_mutex); std::lock_guard<std::mutex> lg(m_commandQueue.m_mutex);
m_commandQueue.m_queue.front().on_result(res); m_commandQueue.m_queue.front().on_result(res, ms);
if (res == nullptr) { if (res == nullptr) {
m_timer.invalidate();
m_commandQueue.m_queue.pop(); m_commandQueue.m_queue.pop();
doStateCallback(State::Connected); doStateCallback(State::Connected);
finished = true; finished = true;

View file

@ -4,6 +4,7 @@
#include "PgsqlConn.h" #include "PgsqlConn.h"
#include "win32event.h" #include "win32event.h"
#include "connectionconfig.h" #include "connectionconfig.h"
#include <QElapsedTimer>
#include <functional> #include <functional>
#include <mutex> #include <mutex>
#include <queue> #include <queue>
@ -21,7 +22,7 @@ public:
Terminating Terminating
}; };
using on_result_callback = std::function<void(std::shared_ptr<Pgsql::Result>)>; using on_result_callback = std::function<void(std::shared_ptr<Pgsql::Result>, qint64)>;
using on_state_callback = std::function<void(State)>; using on_state_callback = std::function<void(State)>;
using on_notice_callback = std::function<void(Pgsql::ErrorDetails)>; using on_notice_callback = std::function<void(Pgsql::ErrorDetails)>;
@ -102,6 +103,7 @@ private:
bool terminateRequested = false; ///< is set when the thread should stop bool terminateRequested = false; ///< is set when the thread should stop
bool m_terminated = true; bool m_terminated = true;
Pgsql::Canceller m_canceller; Pgsql::Canceller m_canceller;
QElapsedTimer m_timer;
bool makeConnection(); bool makeConnection();

View file

@ -0,0 +1,14 @@
#include "databaseinspectorwidget.h"
#include "ui_databaseinspectorwidget.h"
DatabaseInspectorWidget::DatabaseInspectorWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::DatabaseInspectorWidget)
{
ui->setupUi(this);
}
DatabaseInspectorWidget::~DatabaseInspectorWidget()
{
delete ui;
}

22
databaseinspectorwidget.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef DATABASEINSPECTORWIDGET_H
#define DATABASEINSPECTORWIDGET_H
#include <QWidget>
namespace Ui {
class DatabaseInspectorWidget;
}
class DatabaseInspectorWidget : public QWidget
{
Q_OBJECT
public:
explicit DatabaseInspectorWidget(QWidget *parent = 0);
~DatabaseInspectorWidget();
private:
Ui::DatabaseInspectorWidget *ui;
};
#endif // DATABASEINSPECTORWIDGET_H

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>DatabaseOverviewForm</class> <class>DatabaseInspectorWidget</class>
<widget class="QWidget" name="DatabaseOverviewForm"> <widget class="QWidget" name="DatabaseInspectorWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>733</width> <width>599</width>
<height>618</height> <height>536</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">

View file

@ -1,14 +0,0 @@
#include "databaseoverviewform.h"
#include "ui_databaseoverviewform.h"
DatabaseOverviewForm::DatabaseOverviewForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::DatabaseOverviewForm)
{
ui->setupUi(this);
}
DatabaseOverviewForm::~DatabaseOverviewForm()
{
delete ui;
}

View file

@ -11,3 +11,4 @@ folder.png=@folder.png,0
script_save.png=@script_save.png,0 script_save.png=@script_save.png,0
lightbulb.png=@lightbulb.png,0 lightbulb.png=@lightbulb.png,0
table_save.png=@table_save.png,0 table_save.png=@table_save.png,0
lightbulb_off.png=@lightbulb_off.png,0

BIN
icons/information.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
icons/lightbulb_off.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
icons/page_white_delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -26,7 +26,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->setupUi(this); ui->setupUi(this);
ui->tabWidget->setDocumentMode(true); ui->tabWidget->setDocumentMode(true);
ui->tabWidget->setTabsClosable(true); //ui->tabWidget->setTabsClosable(true);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -40,6 +40,7 @@ QueryTab* MainWindow::newSqlPage()
qt->setConfig(m_config); qt->setConfig(m_config);
ui->tabWidget->addTab(qt, "Tab"); ui->tabWidget->addTab(qt, "Tab");
ui->tabWidget->setCurrentWidget(qt); ui->tabWidget->setCurrentWidget(qt);
qt->newdoc();
return qt; return qt;
} }
@ -125,7 +126,8 @@ void MainWindow::on_actionExport_data_triggered()
void MainWindow::on_actionClose_triggered() void MainWindow::on_actionClose_triggered()
{ {
close(); //close();
on_tabWidget_tabCloseRequested(ui->tabWidget->currentIndex());
} }
void MainWindow::on_actionAbout_triggered() void MainWindow::on_actionAbout_triggered()
@ -172,11 +174,20 @@ void MainWindow::on_actionExecute_SQL_triggered()
} }
} }
void MainWindow::on_actionExplain_triggered()
{
QueryTab *tab = GetActiveQueryTab();
if (tab) {
tab->explain(false);
}
}
void MainWindow::on_actionExplain_Analyze_triggered() void MainWindow::on_actionExplain_Analyze_triggered()
{ {
QueryTab *tab = GetActiveQueryTab(); QueryTab *tab = GetActiveQueryTab();
if (tab) { if (tab) {
tab->explainAnalyze(); tab->explain(true);
} }
} }
@ -221,3 +232,4 @@ void MainWindow::on_tabWidget_tabCloseRequested(int index)
ui->tabWidget->removeTab(index); ui->tabWidget->removeTab(index);
} }
} }

View file

@ -45,6 +45,7 @@ public:
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
TSQueue m_taskQueue; TSQueue m_taskQueue;
@ -56,6 +57,7 @@ private:
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
QueryTab *newSqlPage(); QueryTab *newSqlPage();
private slots: private slots:
void processCallableQueue(); void processCallableQueue();
@ -72,6 +74,7 @@ private slots:
void on_actionSave_copy_of_SQL_as_triggered(); void on_actionSave_copy_of_SQL_as_triggered();
void on_actionNew_SQL_triggered(); void on_actionNew_SQL_triggered();
void on_tabWidget_tabCloseRequested(int index); void on_tabWidget_tabCloseRequested(int index);
void on_actionExplain_triggered();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View file

@ -45,7 +45,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>993</width> <width>993</width>
<height>25</height> <height>22</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuTest"> <widget class="QMenu" name="menuTest">
@ -67,7 +67,18 @@
</property> </property>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
</widget> </widget>
<widget class="QMenu" name="menuQuery">
<property name="title">
<string>Query</string>
</property>
<addaction name="actionExecute_SQL"/>
<addaction name="actionExplain"/>
<addaction name="actionExplain_Analyze"/>
<addaction name="separator"/>
<addaction name="actionCancel"/>
</widget>
<addaction name="menuTest"/> <addaction name="menuTest"/>
<addaction name="menuQuery"/>
<addaction name="menuHelp"/> <addaction name="menuHelp"/>
</widget> </widget>
<widget class="QToolBar" name="mainToolBar"> <widget class="QToolBar" name="mainToolBar">
@ -81,10 +92,14 @@
<addaction name="actionLoad_SQL"/> <addaction name="actionLoad_SQL"/>
<addaction name="actionSave_SQL"/> <addaction name="actionSave_SQL"/>
<addaction name="actionExport_data"/> <addaction name="actionExport_data"/>
<addaction name="actionClose"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionExecute_SQL"/> <addaction name="actionExecute_SQL"/>
<addaction name="actionExplain"/>
<addaction name="actionExplain_Analyze"/> <addaction name="actionExplain_Analyze"/>
<addaction name="actionCancel"/> <addaction name="actionCancel"/>
<addaction name="separator"/>
<addaction name="actionAbout"/>
</widget> </widget>
<widget class="QStatusBar" name="statusBar"/> <widget class="QStatusBar" name="statusBar"/>
<action name="actionLoad_SQL"> <action name="actionLoad_SQL">
@ -121,11 +136,24 @@
</property> </property>
</action> </action>
<action name="actionClose"> <action name="actionClose">
<property name="icon">
<iconset>
<normalon>:/icons/page_white_delete.png</normalon>
</iconset>
</property>
<property name="text"> <property name="text">
<string>Close</string> <string>Close</string>
</property> </property>
<property name="shortcut">
<string>Ctrl+F4</string>
</property>
</action> </action>
<action name="actionAbout"> <action name="actionAbout">
<property name="icon">
<iconset>
<normalon>:/icons/information.png</normalon>
</iconset>
</property>
<property name="text"> <property name="text">
<string>About</string> <string>About</string>
</property> </property>
@ -137,7 +165,10 @@
</iconset> </iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Execute SQL</string> <string>Execute queries</string>
</property>
<property name="toolTip">
<string>Execute the (selected) queries</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>F5</string> <string>F5</string>
@ -191,6 +222,22 @@
<string>Ctrl+N</string> <string>Ctrl+N</string>
</property> </property>
</action> </action>
<action name="actionExplain">
<property name="icon">
<iconset>
<normalon>:/icons/lightbulb_off.png</normalon>
</iconset>
</property>
<property name="text">
<string>Explain</string>
</property>
<property name="toolTip">
<string>Explain the (selected) query</string>
</property>
<property name="shortcut">
<string>F7</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources> <resources>

View file

@ -35,11 +35,15 @@ SOURCES += main.cpp\
connectionlistmodel.cpp \ connectionlistmodel.cpp \
connectionconfig.cpp \ connectionconfig.cpp \
backuprestore.cpp \ backuprestore.cpp \
databaseoverviewform.cpp \
dbschema_database.cpp \ dbschema_database.cpp \
querytab.cpp \ querytab.cpp \
stopwatch.cpp \ stopwatch.cpp \
util.cpp util.cpp \
databaseinspectorwidget.cpp \
pgtype.cpp \
pgsqldatabasecatalogue.cpp \
pgtypecontainer.cpp \
tuplesresultwidget.cpp
HEADERS += mainwindow.h \ HEADERS += mainwindow.h \
serverproperties.h \ serverproperties.h \
@ -60,17 +64,22 @@ HEADERS += mainwindow.h \
connectionconfig.h \ connectionconfig.h \
scopeguard.h \ scopeguard.h \
expected.h \ expected.h \
databaseoverviewform.h \
dbschema_database.h \ dbschema_database.h \
querytab.h \ querytab.h \
stopwatch.h \ stopwatch.h \
util.h util.h \
databaseinspectorwidget.h \
pgtype.h \
pgsqldatabasecatalogue.h \
pgtypecontainer.h \
tuplesresultwidget.h
FORMS += mainwindow.ui \ FORMS += mainwindow.ui \
serverproperties.ui \ serverproperties.ui \
databasewindow.ui \ databasewindow.ui \
connectionmanagerwindow.ui \ connectionmanagerwindow.ui \
databaseoverviewform.ui \ databaseinspectorwidget.ui \
tuplesresultwidget.ui \
querytab.ui querytab.ui
RESOURCES += \ RESOURCES += \

View file

@ -40,9 +40,9 @@ QueryTab::QueryTab(MainWindow *win, QWidget *parent) :
highlighter.reset(new SqlHighlighter(ui->queryEdit->document())); highlighter.reset(new SqlHighlighter(ui->queryEdit->document()));
connect(ui->queryEdit, &QPlainTextEdit::textChanged, this, &QueryTab::queryTextChanged); connect(ui->queryEdit, &QPlainTextEdit::textChanged, this, &QueryTab::queryTextChanged);
m_stopwatch.setOutputLabel(ui->lblElapsedTime); // m_stopwatch.setOutputLabel(ui->lblElapsedTime);
ui->lblElapsedTime->clear(); // ui->lblElapsedTime->clear();
ui->lblRowCount->clear(); // ui->lblRowCount->clear();
} }
QueryTab::~QueryTab() QueryTab::~QueryTab()
@ -167,14 +167,14 @@ void QueryTab::execute()
std::string cmd = getCommand(); std::string cmd = getCommand();
m_stopwatch.start(); m_stopwatch.start();
m_dbConnection.send(cmd, m_dbConnection.send(cmd,
[this](std::shared_ptr<Pgsql::Result> res) [this](std::shared_ptr<Pgsql::Result> res, qint64 elapsedms)
{ {
m_win->QueueTask([this, res]() { query_ready(res); }); m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); });
}); });
} }
} }
void QueryTab::explainAnalyze() void QueryTab::explain(bool analyze)
{ {
ui->explainTreeView->setModel(nullptr); ui->explainTreeView->setModel(nullptr);
explainModel.reset(); explainModel.reset();
@ -182,10 +182,14 @@ void QueryTab::explainAnalyze()
addLog("Explain clicked"); addLog("Explain clicked");
std::string analyze_str;
if (analyze) {
analyze_str = "ANALYZE, ";
}
m_stopwatch.start(); m_stopwatch.start();
std::string cmd = "EXPLAIN (ANALYZE, VERBOSE, BUFFERS, FORMAT JSON) " + getCommand(); std::string cmd = "EXPLAIN (" + analyze_str + "VERBOSE, BUFFERS, FORMAT JSON) " + getCommand();
m_dbConnection.send(cmd, m_dbConnection.send(cmd,
[this](std::shared_ptr<Pgsql::Result> res) [this](std::shared_ptr<Pgsql::Result> res, qint64 )
{ {
if (res) { if (res) {
// Process explain data seperately // Process explain data seperately
@ -216,7 +220,9 @@ void QueryTab::cancel()
void QueryTab::setFileName(const QString &filename) void QueryTab::setFileName(const QString &filename)
{ {
m_fileName = filename; m_fileName = filename;
setTabCaption(m_fileName); QFileInfo fileInfo(filename);
QString fn(fileInfo.fileName());
setTabCaption(fn, m_fileName);
} }
bool QueryTab::continueWithoutSavingWarning() bool QueryTab::continueWithoutSavingWarning()
@ -403,7 +409,7 @@ std::string QueryTab::getCommand() const
return command.toUtf8().data(); return command.toUtf8().data();
} }
void QueryTab::setTabCaption(const QString &caption) void QueryTab::setTabCaption(const QString &caption, const QString &tooltip)
{ {
QWidget * w = parentWidget(); QWidget * w = parentWidget();
QWidget * p = w->parentWidget(); QWidget * p = w->parentWidget();
@ -412,32 +418,45 @@ void QueryTab::setTabCaption(const QString &caption)
int i = tabwidget->indexOf(this); int i = tabwidget->indexOf(this);
if (i >= 0) { if (i >= 0) {
tabwidget->setTabText(i, caption); tabwidget->setTabText(i, caption);
tabwidget->setTabToolTip(i, tooltip);
} }
} }
} }
void QueryTab::query_ready(std::shared_ptr<Pgsql::Result> dbres) void QueryTab::query_ready(std::shared_ptr<Pgsql::Result> dbres, qint64 elapsedms)
{ {
m_stopwatch.stop();
if (dbres) { if (dbres) {
addLog("query_ready with result"); addLog("query_ready with result");
auto st = dbres->resultStatus(); auto st = dbres->resultStatus();
if (st == PGRES_TUPLES_OK) { if (st == PGRES_TUPLES_OK) {
//int n_rows = dbres->getRows(); //int n_rows = dbres->getRows();
QString rowcount_str = QString("rows: %1").arg(dbres->getRows()); //QString rowcount_str = QString("rows: %1").arg(dbres->getRows());
ui->lblRowCount->setText(rowcount_str);
resultModel.reset(new QueryResultModel(nullptr , dbres)); auto result_model = std::make_shared<QueryResultModel>(nullptr , dbres);
ui->ResultView->setModel(resultModel.get()); TuplesResultWidget *trw = new TuplesResultWidget;
ui->tabWidget->setCurrentWidget(ui->dataTab); trw->setResult(result_model, elapsedms);
resultList.push_back(trw);
ui->tabWidget->addTab(trw, "Data");
// ui->lblRowCount->setText(rowcount_str);
// resultModel.reset(new QueryResultModel(nullptr , dbres));
// ui->ResultView->setModel(resultModel.get());
// ui->tabWidget->setCurrentWidget(ui->dataTab);
//statusBar()->showMessage(tr("Query ready.")); //statusBar()->showMessage(tr("Query ready."));
} }
else { else {
if (st == PGRES_COMMAND_OK) { if (st == PGRES_COMMAND_OK) {
// statusBar()->showMessage(tr("Command OK.")); // statusBar()->showMessage(tr("Command OK."));
QString msg = tr("Query returned succesfully: %1 rows affected, %2 execution time.") int tuples_affected = dbres->tuplesAffected();
.arg(QString::number(dbres->tuplesAffected())) QString msg;
.arg(m_stopwatch.elapsed()); //msfloatToHumanReadableString(elapsedTime.count())); if (tuples_affected >= 0)
msg = tr("Query returned succesfully: %1 rows affected, execution time %2")
.arg(QString::number(tuples_affected))
.arg(msfloatToHumanReadableString(elapsedms));
else
msg = tr("Query returned succesfully, execution time %1")
.arg(msfloatToHumanReadableString(elapsedms));
ui->messagesEdit->append(msg); ui->messagesEdit->append(msg);
ui->tabWidget->setCurrentWidget(ui->messageTab); ui->tabWidget->setCurrentWidget(ui->messageTab);
@ -476,6 +495,7 @@ void QueryTab::query_ready(std::shared_ptr<Pgsql::Result> dbres)
} }
} }
else { else {
m_stopwatch.stop();
addLog("query_ready with NO result"); addLog("query_ready with NO result");
// statusBar()->showMessage(tr("Query cancelled.")); // statusBar()->showMessage(tr("Query cancelled."));
} }
@ -483,7 +503,10 @@ void QueryTab::query_ready(std::shared_ptr<Pgsql::Result> dbres)
void QueryTab::clearResult() void QueryTab::clearResult()
{ {
ui->ResultView->setModel(nullptr); // ui->ResultView->setModel(nullptr);
resultModel.reset(); // resultModel.reset();
ui->lblRowCount->clear(); for (auto e : resultList)
delete e;
resultList.clear();
// ui->lblRowCount->clear();
} }

View file

@ -5,12 +5,13 @@
#include "queryresultmodel.h" #include "queryresultmodel.h"
#include "queryexplainmodel.h" #include "queryexplainmodel.h"
#include "stopwatch.h" #include "stopwatch.h"
#include "tuplesresultwidget.h"
#include <QWidget> #include <QWidget>
#include <memory> #include <memory>
namespace Ui { namespace Ui {
class QueryTab; class QueryTab;
} }
class MainWindow; class MainWindow;
@ -38,11 +39,22 @@ public:
void saveCopyAs(); void saveCopyAs();
void execute(); void execute();
void explainAnalyze(); void explain(bool analyze);
void cancel(); void cancel();
bool canClose(); bool canClose();
private: private:
// struct ResultTab {
// public:
// std::shared_ptr<QueryResultModel> resultModel;
// std::shared_ptr<TuplesResultWidget> tuplesResult;
//// ResultTab(std::shared_ptr<QueryResultModel> rm, Ui::TuplesResult *tr)
//// : resultModel(rm), tuplesResult(tr)
//// {}
// };
using ResultTabContainer = std::vector<TuplesResultWidget*>;
Ui::QueryTab *ui; Ui::QueryTab *ui;
MainWindow *m_win; MainWindow *m_win;
std::unique_ptr<SqlHighlighter> highlighter; std::unique_ptr<SqlHighlighter> highlighter;
@ -58,17 +70,20 @@ private:
QString promptUserForSaveSqlFilename(); QString promptUserForSaveSqlFilename();
ASyncDBConnection m_dbConnection; ASyncDBConnection m_dbConnection;
std::unique_ptr<QueryResultModel> resultModel;
std::unique_ptr<QueryExplainModel> explainModel; std::unique_ptr<QueryExplainModel> explainModel;
ResultTabContainer resultList;
void addLog(QString s); void addLog(QString s);
std::string getCommand() const; std::string getCommand() const;
void explain_ready(ExplainRoot::SPtr explain); void explain_ready(ExplainRoot::SPtr explain);
void query_ready(std::shared_ptr<Pgsql::Result> dbres); void query_ready(std::shared_ptr<Pgsql::Result> dbres, qint64 elapsedms);
void setTabCaption(const QString &caption); void setTabCaption(const QString &caption, const QString &tooltip);
void clearResult(); void clearResult();
private slots: private slots:

View file

@ -65,61 +65,6 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="dataTab">
<attribute name="title">
<string>Data</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTableView" name="ResultView">
<property name="font">
<font>
<family>Source Sans Pro</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<attribute name="verticalHeaderMinimumSectionSize">
<number>20</number>
</attribute>
</widget>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="lblElapsedTime">
<property name="text">
<string>0ms</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblRowCount">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="explainTab"> <widget class="QWidget" name="explainTab">
<attribute name="title"> <attribute name="title">
<string>Explain</string> <string>Explain</string>

View file

@ -10,5 +10,8 @@
<file>icons/lightbulb.png</file> <file>icons/lightbulb.png</file>
<file>icons/table_save.png</file> <file>icons/table_save.png</file>
<file>icons/page_white_add.png</file> <file>icons/page_white_add.png</file>
<file>icons/page_white_delete.png</file>
<file>icons/lightbulb_off.png</file>
<file>icons/information.png</file>
</qresource> </qresource>
</RCC> </RCC>

26
tuplesresultwidget.cpp Normal file
View file

@ -0,0 +1,26 @@
#include "tuplesresultwidget.h"
#include "ui_tuplesresultwidget.h"
#include "util.h"
TuplesResultWidget::TuplesResultWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::TuplesResultWidget)
{
ui->setupUi(this);
ui->lblRowCount->setText(QString());
}
TuplesResultWidget::~TuplesResultWidget()
{
delete ui;
}
void TuplesResultWidget::setResult(std::shared_ptr<QueryResultModel> res, float ms)
{
resultModel = res;
ui->ResultView->setModel(resultModel.get());
QString rowcount_str = QString("rows: %1").arg(resultModel->rowCount());
ui->lblRowCount->setText(rowcount_str);
ui->lblElapsedTime->setText(msfloatToHumanReadableString(ms));
}

26
tuplesresultwidget.h Normal file
View file

@ -0,0 +1,26 @@
#ifndef TUPLESRESULTWIDGET_H
#define TUPLESRESULTWIDGET_H
#include "queryresultmodel.h"
#include <QWidget>
namespace Ui {
class TuplesResultWidget;
}
class TuplesResultWidget : public QWidget
{
Q_OBJECT
public:
explicit TuplesResultWidget(QWidget *parent = 0);
~TuplesResultWidget();
void setResult(std::shared_ptr<QueryResultModel> res, float ms);
private:
Ui::TuplesResultWidget *ui;
std::shared_ptr<QueryResultModel> resultModel;
};
#endif // TUPLESRESULTWIDGET_H

99
tuplesresultwidget.ui Normal file
View file

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TuplesResultWidget</class>
<widget class="QWidget" name="TuplesResultWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QTableView" name="ResultView">
<property name="font">
<font>
<family>Source Sans Pro</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<attribute name="verticalHeaderDefaultSectionSize">
<number>20</number>
</attribute>
<attribute name="verticalHeaderMinimumSectionSize">
<number>16</number>
</attribute>
</widget>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lblElapsedTime">
<property name="text">
<string>0ms</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblRowCount">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>