Moving things from the application specific DatabaseWindow to generic LMainWindow (Leon framework)
To achieve flexibility the getDatabase call on the context which was application specific to has been replaced with a type based object registry.
This commit is contained in:
parent
4a78330153
commit
fd603a7434
5 changed files with 137 additions and 99 deletions
|
|
@ -48,7 +48,7 @@ CrudTab::~CrudTab()
|
|||
|
||||
void CrudTab::setConfig(Oid oid) //std::shared_ptr<OpenDatabase> db, const PgClass &table)
|
||||
{
|
||||
m_db = context()->getDatabase();;
|
||||
m_db = context()->getObject<OpenDatabase>(); // getDatabase();;
|
||||
m_table = *m_db->catalog()->classes()->getByKey(oid);
|
||||
m_crudModel->setConfig(m_db, *m_table);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,10 +47,10 @@ namespace DatabaseWindow_details {
|
|||
m_window->setTabIcon(content, iconname);
|
||||
}
|
||||
|
||||
std::shared_ptr<OpenDatabase> getDatabase() override
|
||||
{
|
||||
return m_window->getDatabase();
|
||||
}
|
||||
// std::shared_ptr<OpenDatabase> getDatabase() override
|
||||
// {
|
||||
// return m_window->getDatabase();
|
||||
// }
|
||||
|
||||
void showStatusMessage(const QString &msg) override
|
||||
{
|
||||
|
|
@ -72,9 +72,30 @@ using namespace DatabaseWindow_details;
|
|||
LMainWindow::LMainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
{
|
||||
m_tabWidget = new QTabWidget(this);
|
||||
m_tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
|
||||
m_tabWidget->setDocumentMode(true);
|
||||
|
||||
setCentralWidget(m_tabWidget);
|
||||
|
||||
// menu
|
||||
auto menuBar = new QMenuBar(this);
|
||||
setMenuBar(menuBar);
|
||||
|
||||
// tooolbar
|
||||
m_mainToolBar = new QToolBar(this);
|
||||
addToolBar(Qt::TopToolBarArea, m_mainToolBar);
|
||||
|
||||
// statusbar
|
||||
auto statusBar = new QStatusBar(this);
|
||||
setStatusBar(statusBar);
|
||||
|
||||
m_fileMenu = new QMenu("File T", this);
|
||||
|
||||
createActions();
|
||||
m_mainToolBar->addAction(m_closeAction);
|
||||
|
||||
// QMetaObject::connectSlotsByName(this);
|
||||
}
|
||||
|
||||
void LMainWindow::initModuleMenus()
|
||||
|
|
@ -95,6 +116,19 @@ void LMainWindow::addModuleMenuActions()
|
|||
}
|
||||
}
|
||||
|
||||
void LMainWindow::createActions()
|
||||
{
|
||||
{
|
||||
auto action = m_closeAction = new QAction(this);
|
||||
QIcon icon;
|
||||
icon.addFile(QString::fromUtf8(":/icons/page_white_delete.png"), QSize(), QIcon::Normal, QIcon::On);
|
||||
action->setIcon(icon);
|
||||
connect(m_closeAction, &QAction::triggered, this, &DatabaseWindow::actionClose_triggered);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void LMainWindow::addMenuAction(const MenuAction &ma)
|
||||
{
|
||||
qDebug() << "add action " << ma.text();
|
||||
|
|
@ -109,69 +143,56 @@ void LMainWindow::addMenuAction(const MenuAction &ma)
|
|||
|
||||
// auto ac = new QAction(this);
|
||||
// ac->
|
||||
|
||||
|
||||
}
|
||||
|
||||
void LMainWindow::actionClose_triggered()
|
||||
{
|
||||
m_tabWidget->tabCloseRequested(m_tabWidget->currentIndex());
|
||||
}
|
||||
|
||||
|
||||
void LMainWindow::addPage(PluginContentWidget* page, QString caption)
|
||||
{
|
||||
m_tabWidget->addTab(page, caption);
|
||||
m_tabWidget->setCurrentWidget(page);
|
||||
}
|
||||
|
||||
void LMainWindow::setTabCaptionForWidget(QWidget *widget, const QString &caption, const QString &hint)
|
||||
{
|
||||
auto index = m_tabWidget->indexOf(widget);
|
||||
m_tabWidget->setTabText(index, caption);
|
||||
m_tabWidget->setTabToolTip(index, hint);
|
||||
}
|
||||
|
||||
void LMainWindow::setTabIcon(QWidget *widget, const QString &iconname)
|
||||
{
|
||||
auto index = m_tabWidget->indexOf(widget);
|
||||
auto n = ":/icons/16x16/" + iconname;
|
||||
m_tabWidget->setTabIcon(index, QIcon(n));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
DatabaseWindow::DatabaseWindow(MasterController *master, QWidget *parent)
|
||||
: LMainWindow(parent)
|
||||
// , ui(new Ui::DatabaseWindow)
|
||||
|
||||
, m_masterController(master)
|
||||
{
|
||||
// ui->setupUi(this);
|
||||
// ui->tabWidget->setDocumentMode(true);
|
||||
|
||||
// auto centralWidget = new QWidget(this);
|
||||
// auto verticalLayout_3 = new QVBoxLayout(centralWidget);
|
||||
// verticalLayout_3->setSpacing(4);
|
||||
// verticalLayout_3->setContentsMargins(4, 4, 4, 4);
|
||||
|
||||
m_tabWidget = new QTabWidget(this);
|
||||
m_tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
|
||||
m_tabWidget->setDocumentMode(true);
|
||||
// verticalLayout_3->addWidget(m_tabWidget);
|
||||
|
||||
setCentralWidget(m_tabWidget);
|
||||
|
||||
createActions();
|
||||
|
||||
auto menuBar = new QMenuBar(this);
|
||||
setMenuBar(menuBar);
|
||||
|
||||
m_mainToolBar = new QToolBar(this);
|
||||
m_mainToolBar->addAction(m_closeAction);
|
||||
addToolBar(Qt::TopToolBarArea, m_mainToolBar);
|
||||
|
||||
auto statusBar = new QStatusBar(this);
|
||||
setStatusBar(statusBar);
|
||||
|
||||
m_context = new DatabaseWindowContentContext(this);
|
||||
|
||||
connect(&loadWatcher, &QFutureWatcher<LoadCatalog::Result>::finished,
|
||||
this, &DatabaseWindow::catalogLoaded);
|
||||
|
||||
initModuleMenus();
|
||||
|
||||
QMetaObject::connectSlotsByName(this);
|
||||
}
|
||||
|
||||
DatabaseWindow::~DatabaseWindow()
|
||||
{
|
||||
delete m_context;
|
||||
// delete ui;
|
||||
}
|
||||
|
||||
void DatabaseWindow::createActions()
|
||||
{
|
||||
{
|
||||
auto action = m_closeAction = new QAction(this);
|
||||
QIcon icon;
|
||||
icon.addFile(QString::fromUtf8(":/icons/page_white_delete.png"), QSize(), QIcon::Normal, QIcon::On);
|
||||
action->setIcon(icon);
|
||||
connect(m_closeAction, &QAction::triggered, this, &DatabaseWindow::actionClose_triggered);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QueryTab* DatabaseWindow::newSqlPage()
|
||||
{
|
||||
|
|
@ -226,6 +247,7 @@ void DatabaseWindow::catalogLoaded()
|
|||
try {
|
||||
//SCOPE_EXIT { loadFuture = {}; };
|
||||
m_database = loadWatcher.future().result();
|
||||
m_context->registerObject(m_database);
|
||||
|
||||
auto tt = new TablesPage(m_context, this);
|
||||
tt->setCatalog(m_database->catalog());
|
||||
|
|
@ -308,11 +330,6 @@ void DatabaseWindow::on_actionExport_data_triggered()
|
|||
}
|
||||
}
|
||||
|
||||
void DatabaseWindow::actionClose_triggered()
|
||||
{
|
||||
on_tabWidget_tabCloseRequested(m_tabWidget->currentIndex());
|
||||
}
|
||||
|
||||
void DatabaseWindow::on_actionAbout_triggered()
|
||||
{
|
||||
QMessageBox::about(this, "pgLab 0.1", tr(
|
||||
|
|
@ -468,15 +485,6 @@ void DatabaseWindow::removeToolBarButtonsForPage(PluginContentWidget *page)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void DatabaseWindow::addPage(PluginContentWidget* page, QString caption)
|
||||
{
|
||||
m_tabWidget->addTab(page, caption);
|
||||
m_tabWidget->setCurrentWidget(page);
|
||||
|
||||
//addToolBarButtonsForPage(page);
|
||||
}
|
||||
|
||||
void DatabaseWindow::removePage(PluginContentWidget *)
|
||||
{
|
||||
|
||||
|
|
@ -509,17 +517,3 @@ void DatabaseWindow::on_actionGenerate_code_triggered()
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
void DatabaseWindow::setTabCaptionForWidget(QWidget *widget, const QString &caption, const QString &hint)
|
||||
{
|
||||
auto index = m_tabWidget->indexOf(widget);
|
||||
m_tabWidget->setTabText(index, caption);
|
||||
m_tabWidget->setTabToolTip(index, hint);
|
||||
}
|
||||
|
||||
void DatabaseWindow::setTabIcon(QWidget *widget, const QString &iconname)
|
||||
{
|
||||
auto index = m_tabWidget->indexOf(widget);
|
||||
auto n = ":/icons/16x16/" + iconname;
|
||||
m_tabWidget->setTabIcon(index, QIcon(n));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,16 +51,33 @@ public:
|
|||
LMainWindow(QWidget *parent = nullptr);
|
||||
|
||||
void initModuleMenus();
|
||||
void setTabCaptionForWidget(QWidget *widget, const QString &caption, const QString &hint);
|
||||
void setTabIcon(QWidget *widget, const QString &iconname);
|
||||
|
||||
/// Called when a newly created page is added to the QTabWidget
|
||||
void addPage(PluginContentWidget* page, QString caption);
|
||||
protected:
|
||||
QTabWidget *m_tabWidget = nullptr;
|
||||
QToolBar *m_mainToolBar = nullptr;
|
||||
|
||||
// Standard menu's
|
||||
QMenu *m_fileMenu = nullptr;
|
||||
|
||||
// Standard actions
|
||||
QAction *m_closeAction = nullptr;
|
||||
|
||||
DatabaseWindow_details::DatabaseWindowContentContext *m_context;
|
||||
|
||||
void addModuleMenuActions();
|
||||
|
||||
private:
|
||||
QMenu *m_fileMenu = nullptr;
|
||||
|
||||
private:
|
||||
|
||||
void createActions();
|
||||
void addMenuAction(const MenuAction &ma);
|
||||
|
||||
private slots:
|
||||
void actionClose_triggered();
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -79,19 +96,8 @@ public:
|
|||
|
||||
void newCodeGenPage(QString query, std::shared_ptr<const Pgsql::Result> dbres);
|
||||
|
||||
void setTabCaptionForWidget(QWidget *widget, const QString &caption, const QString &hint);
|
||||
void setTabIcon(QWidget *widget, const QString &iconname);
|
||||
|
||||
/// Called when a newly created page is added to the QTabWidget
|
||||
void addPage(PluginContentWidget* page, QString caption);
|
||||
private:
|
||||
|
||||
QTabWidget *m_tabWidget = nullptr;
|
||||
QToolBar *m_mainToolBar = nullptr;
|
||||
|
||||
// Standard actions
|
||||
QAction *m_closeAction = nullptr;
|
||||
|
||||
ConnectionConfig m_config;
|
||||
std::shared_ptr<OpenDatabase> m_database;
|
||||
|
||||
|
|
@ -143,7 +149,6 @@ private:
|
|||
|
||||
QFutureWatcher<LoadCatalog::Result> loadWatcher;
|
||||
|
||||
void createActions();
|
||||
QueryTab *GetActiveQueryTab();
|
||||
|
||||
void closeEvent(QCloseEvent *event);
|
||||
|
|
@ -165,7 +170,6 @@ private slots:
|
|||
void on_actionLoad_SQL_triggered();
|
||||
void on_actionSave_SQL_triggered();
|
||||
void on_actionExport_data_triggered();
|
||||
void actionClose_triggered();
|
||||
void on_actionAbout_triggered();
|
||||
void on_actionSave_SQL_as_triggered();
|
||||
void on_actionSave_copy_of_SQL_as_triggered();
|
||||
|
|
|
|||
|
|
@ -31,8 +31,9 @@ QueryTab::QueryTab(IPluginContentWidgetContext *context_, QWidget *parent)
|
|||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
m_config = context()->getDatabase()->config();
|
||||
m_catalog = context()->getDatabase()->catalog();
|
||||
auto db = context()->getObject<OpenDatabase>();
|
||||
m_config = db->config();
|
||||
m_catalog = db->catalog();
|
||||
|
||||
connect(&m_dbConnection, &ASyncDBConnection::onStateChanged, this, &QueryTab::connectionStateChanged);
|
||||
connect(&m_dbConnection, &ASyncDBConnection::onNotice, this, &QueryTab::receiveNotice);
|
||||
|
|
@ -40,7 +41,7 @@ QueryTab::QueryTab(IPluginContentWidgetContext *context_, QWidget *parent)
|
|||
ui->queryEdit->setFont(UserConfiguration::instance()->codeFont());
|
||||
|
||||
highlighter = new SqlSyntaxHighlighter(ui->queryEdit->document());
|
||||
auto open_database = context()->getDatabase();
|
||||
auto open_database = context()->getObject<OpenDatabase>();
|
||||
if (open_database) {
|
||||
auto cat = open_database->catalog();
|
||||
highlighter->setTypes(*cat->types());
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@
|
|||
#define IPLUGINCONTENTWIDGETCONTEXT_H
|
||||
|
||||
#include <QString>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <typeindex>
|
||||
#include "plugin_support/ModuleActionParameters.h"
|
||||
|
||||
class OpenDatabase;
|
||||
|
|
@ -13,6 +15,9 @@ class PluginContentWidget;
|
|||
*
|
||||
* It provides interface for operating on the context without needing to many details.
|
||||
* Actual default implementation is in PluginContentWidgetContextBase.
|
||||
*
|
||||
* objectRegistry implementation is from Igor Tandetnik answer to the following question
|
||||
* https://stackoverflow.com/questions/35413745/using-shared-ptr-with-a-generic-registry-or-shared-object-storage-or-not
|
||||
*/
|
||||
class IPluginContentWidgetContext {
|
||||
public:
|
||||
|
|
@ -32,11 +37,6 @@ public:
|
|||
*/
|
||||
virtual void setIcon(PluginContentWidget *content, const QString &iconname) = 0;
|
||||
|
||||
/** Returns an OpenDatabase object the widget can use to access
|
||||
* the database.
|
||||
*/
|
||||
virtual std::shared_ptr<OpenDatabase> getDatabase() = 0;
|
||||
|
||||
virtual void showStatusMessage(const QString &msg) = 0;
|
||||
|
||||
virtual void moduleAction(
|
||||
|
|
@ -46,6 +46,45 @@ public:
|
|||
) = 0;
|
||||
|
||||
virtual void addContentWidget(PluginContentWidget *widget) = 0;
|
||||
|
||||
template<typename T, class...Args>
|
||||
bool addObjects(Args&&...args);
|
||||
template<typename T>
|
||||
bool registerObject(std::shared_ptr<T> object);
|
||||
template<typename T>
|
||||
std::shared_ptr<T> getObject() const;
|
||||
private:
|
||||
std::map<std::type_index, std::shared_ptr<void> > m_objectRegistry;
|
||||
|
||||
};
|
||||
|
||||
template<typename T, class...Args>
|
||||
bool IPluginContentWidgetContext::addObjects(Args&&...args)
|
||||
{
|
||||
std::type_index key(typeid(T));
|
||||
if (!m_objectRegistry.count(key)) {
|
||||
auto p = std::make_shared<T>(std::forward<Args>(args)...);
|
||||
m_objectRegistry[key] = p;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool IPluginContentWidgetContext::registerObject(std::shared_ptr<T> object)
|
||||
{
|
||||
return m_objectRegistry.emplace(std::type_index(typeid(T)), object).second;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::shared_ptr<T> IPluginContentWidgetContext::getObject() const
|
||||
{
|
||||
auto it = m_objectRegistry.find(typeid(T));
|
||||
if (it == m_objectRegistry.end()) {
|
||||
return {};
|
||||
}
|
||||
return std::static_pointer_cast<T>(it->second);
|
||||
}
|
||||
|
||||
|
||||
#endif // IPLUGINCONTENTWIDGETCONTEXT_H
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue