diff --git a/pglab/FunctionsPage.cpp b/pglab/FunctionsPage.cpp index 5745030..9b8dd03 100644 --- a/pglab/FunctionsPage.cpp +++ b/pglab/FunctionsPage.cpp @@ -4,13 +4,33 @@ #include "CustomDataRole.h" #include "PgLabItemDelegate.h" #include "ProcTableModel.h" +#include "SqlCodePreview.h" +#include #include #include +#include -FunctionsPage::FunctionsPage(QWidget *parent) : QWidget(parent) +FunctionsPage::FunctionsPage(QWidget *parent) + : QSplitter(Qt::Horizontal, parent) { - + // create widgets m_functionTable = new QTableView(this); + m_detailTabs = new QTabWidget(this); + m_definitionView = new SqlCodePreview(this); + + // build widget tree + // add top level widgets to splitter + addWidget(m_functionTable); + addWidget(m_detailTabs); + + // add widgets to detail tabs + m_detailTabs->addTab(m_definitionView, "SQL"); + +// auto mainLayout = new QVBoxLayout; +// mainLayout->addWidget(m_functionTable); +// setLayout(mainLayout); + + // Do further initialization of widgets and models SetTableViewDefault(m_functionTable); m_model = new ProcTableModel(this); @@ -23,14 +43,21 @@ FunctionsPage::FunctionsPage(QWidget *parent) : QWidget(parent) auto item_delegate = new PgLabItemDelegate(this); m_functionTable->setItemDelegate(item_delegate); - auto mainLayout = new QVBoxLayout; - mainLayout->addWidget(m_functionTable); - setLayout(mainLayout); + + connect(m_functionTable->selectionModel(), &QItemSelectionModel::currentRowChanged, this, + &FunctionsPage::functionTable_currentRowChanged); + + + retranslateUi(); } -void FunctionsPage::retranslateUi(bool all) +void FunctionsPage::retranslateUi() { + auto set_tabtext = [this] (QWidget *widget, QString translation) { + m_detailTabs->setTabText(m_detailTabs->indexOf(widget), translation); + }; + set_tabtext(m_definitionView, QApplication::translate("FunctionsPage", "SQL", nullptr)); } void FunctionsPage::setCatalog(std::shared_ptr cat) @@ -38,3 +65,34 @@ void FunctionsPage::setCatalog(std::shared_ptr cat) m_catalog = cat; m_model->setCatalog(cat); } + +void FunctionsPage::functionTable_currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous) +{ + if (current.row() != previous.row()) { + if (current.isValid()) { + auto source_index = m_sortFilterProxy->mapToSource(current); + auto proc = m_model->proc(source_index.row()); + + selectedProcChanged(proc); + } + else + selectedProcChanged({}); + } +} + +void FunctionsPage::selectedProcChanged(const std::optional &proc) +{ + + updateSqlTab(proc); +} + +void FunctionsPage::updateSqlTab(const std::optional &proc) +{ + if (!proc.has_value()) { + m_definitionView->clear(); + return; + } + QString create_sql = proc->createSql(); + + m_definitionView->setPlainText(create_sql); +} diff --git a/pglab/FunctionsPage.h b/pglab/FunctionsPage.h index 805825a..a82969f 100644 --- a/pglab/FunctionsPage.h +++ b/pglab/FunctionsPage.h @@ -1,15 +1,19 @@ #ifndef FUNCTIONSPAGE_H #define FUNCTIONSPAGE_H -#include +#include #include +#include class QTableView; class PgDatabaseCatalog; class ProcTableModel; class CustomFilterSortModel; +class QTabWidget; +class SqlCodePreview; +class PgProc; -class FunctionsPage : public QWidget { +class FunctionsPage : public QSplitter { Q_OBJECT public: explicit FunctionsPage(QWidget *parent = nullptr); @@ -19,14 +23,19 @@ signals: public slots: + void functionTable_currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous); private: QTableView *m_functionTable = nullptr; + QTabWidget *m_detailTabs = nullptr; + SqlCodePreview *m_definitionView = nullptr; ProcTableModel *m_model = nullptr; CustomFilterSortModel *m_sortFilterProxy = nullptr; std::shared_ptr m_catalog; - void retranslateUi(bool all = true); + void retranslateUi(); + void selectedProcChanged(const std::optional &proc); + void updateSqlTab(const std::optional &proc); }; #endif // FUNCTIONSPAGE_H diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index b6dbaf1..5429167 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -170,7 +170,6 @@ void TablesPage::tableListTable_layoutChanged(const QList void TablesPage::selectedTableChanged(const std::optional &table) { m_columnsPage->setData(m_catalog, table); - //ui->columnsTable->resizeColumnsToContents(); m_constraintModel->setData(m_catalog, table); ui->constraintsTable->resizeColumnsToContents();