玉兔远程控制 0.1.0-bate9
载入中...
搜索中...
未找到
ParameterDatabaseUI.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QMessageBox>
4#include <QSqlDatabase>
5#include <QLoggingCategory>
6#include <QSet>
7#include <QFileDialog>
8#include <QWhatsThisClickedEvent>
9#include <QDesktopServices>
10
11#include "RabbitCommonDir.h"
12#include "ParameterNet.h"
13#include "ParameterUser.h"
14#include "ParameterDatabaseUI.h"
15#include "ui_ParameterDatabaseUI.h"
16#include "ParameterGlobal.h"
17#include "Database.h"
18
19static Q_LOGGING_CATEGORY(log, "Para.Database.UI")
21 : CParameterUI(parent)
22 , ui(new Ui::CParameterDatabaseUI)
23 , m_pParaDB(nullptr)
24 , m_pParaGlobal(nullptr)
25 , m_Net(nullptr)
26{
27 bool check = false;
28 ui->setupUi(this);
29
30 setWindowTitle(tr("Database"));
31
32 ui->leDatabaseName->installEventFilter(this);
33 QString szUrl;
34 szUrl = "<a href=https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual#sharing-operation-parameters>" + tr("Sharing \"Operation Parameters\"") + "</a>";
35 ui->gpSaveOperateSettings->setWhatsThis(szUrl);
36 ui->gpSaveOperateSettings->installEventFilter(this);
37 ui->rbSaveSettingsToDatabase->setWhatsThis(szUrl);
38 ui->rbSaveSettingsToDatabase->installEventFilter(this);
39 ui->rbSaveSettingsToLocal->setWhatsThis(szUrl);
40 ui->rbSaveSettingsToLocal->installEventFilter(this);
41
42 ui->pbBrowser->setVisible(false);
43
44 QStringList drivers = QSqlDatabase::drivers();
45 qDebug(log) << "Database:" << drivers;
46 QSet<QString> supportDrivers = CParameterDatabase::GetSupportDatabase();
47 QSet<QString> drv(drivers.begin(), drivers.end());
48 QSet<QString> interDb = drv.intersect(supportDrivers);
49 QStringList lstDb(interDb.begin(), interDb.end());
50 ui->cbType->addItems(lstDb);
51 slotTypeCurrentTextChanged(ui->cbType->currentText());
52 check = connect(ui->cbType, &QComboBox::currentTextChanged,
53 this, &CParameterDatabaseUI::slotTypeCurrentTextChanged);
54 Q_ASSERT(check);
55}
56
57CParameterDatabaseUI::~CParameterDatabaseUI()
58{
59 delete ui;
60}
61
63{
64 m_pParaGlobal = qobject_cast<CParameterGlobal*>(pParameter);
65 if(!m_pParaGlobal) return -1;
66
67 m_pParaDB = &m_pParaGlobal->m_Database;
68 if(!m_pParaDB) return -1;
69
70 m_Net = m_pParaDB->m_Net;
71 ui->wNet->SetParameter(&m_Net);
72
73 ui->cbType->setCurrentText(m_pParaDB->GetType());
74 ui->leDatabaseName->setText(m_pParaDB->GetDatabaseName());
75 ui->leOptions->setText(m_pParaDB->GetOptions());
76
77 switch(m_pParaGlobal->GetSaveSettingsType()) {
78 case CParameterGlobal::SaveSettingsType::File:
79 ui->rbSaveSettingsToLocal->setChecked(true);
80 break;
81 case CParameterGlobal::SaveSettingsType::Database:
82 ui->rbSaveSettingsToDatabase->setChecked(true);
83 break;
84 }
85 ui->lbDatabaseWarn->setVisible(
86 ui->rbSaveSettingsToDatabase->isChecked()
87 && ui->cbType->currentText() != "QSQLITE");
88
89 return 0;
90}
91
93{
94 if(!validity) return true;
95
96 if(ui->cbType->currentText() == "QMYSQL") {
97 if(!ui->wNet->CheckValidity(validity)) {
98 return false;
99 }
100 }
101
102 if(ui->rbSaveSettingsToLocal->isChecked()) {
103 if(ui->cbType->currentText() != "QSQLITE") {
104 QString szErr = tr("Save operate settings to:") + " \"" + tr("Local") + "\". " + tr("but the database is not set local database \"QSQLITE\".");
105 szErr += "\n\n";
106 szErr += tr("Please modify database \"Type\" to \"QSQLITE\"") + " ";
107 szErr += tr("or modify ") + tr("Save operate settings to:") + " " + tr("Database");
108 QMessageBox::critical(this, tr("Error"), szErr);
109 qCritical(log) << szErr;
110 ui->rbSaveSettingsToDatabase->setFocus();
111 return false;
112 }
113 }
114
115 return true;
116}
117
119{
120 ui->wNet->Accept();
121 m_pParaDB->m_Net = m_Net;
122 m_pParaDB->SetType(ui->cbType->currentText());
123
124 m_pParaDB->SetDatabaseName(ui->leDatabaseName->text());
125 m_pParaDB->SetOptions(ui->leOptions->text());
126
127 if(ui->rbSaveSettingsToLocal->isChecked()) {
128 m_pParaGlobal->SetSaveSettingsType(CParameterGlobal::SaveSettingsType::File);
129 } else if(ui->rbSaveSettingsToDatabase->isChecked()) {
130 m_pParaGlobal->SetSaveSettingsType(CParameterGlobal::SaveSettingsType::Database);
131 }
132
133 return 0;
134}
135
136void CParameterDatabaseUI::slotTypeCurrentTextChanged(const QString &text)
137{
138 QString szMsg;
139 QString szHelp;
140 szMsg = tr("Set the database name");
141
142 bool bBrowser = false;
143 bool bNet = true;
144 if("QSQLITE" == text) {
145 szMsg = tr("Set the sqlite database file. If is empty, then use default database file.");
146 bBrowser = true;
147 bNet = false;
148 } else if("QODBC" == text) {
149 szMsg = tr("The name can either be a DSN, a DSN filename (in which case the file must have a .dsn extension), or a connection string.");
150 szHelp = szMsg + " <a href=https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual_zh_CN#%E5%9C%A8-windows-%E4%B8%8B%E4%BD%BF%E7%94%A8-odbc-%E8%AE%BF%E9%97%AE-mysql-%E6%95%B0%E6%8D%AE%E5%BA%93>" + tr("Configure database") + "</a>";
151 bNet = false;
152 } else if("QMYSQL" == text) {
153 bNet = true;
154 if(m_pParaDB) {
155 auto &net = m_pParaDB->m_Net;
156 if(0 == net.GetPort()) {
157 net.SetPort(3306);
158 ui->wNet->SetParameter(&net);
159 }
160 }
161 }
162
163 if(szHelp.isEmpty())
164 szHelp = szMsg + " <a href=https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual_zh_CN#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93>" + tr("Configure database") + "</a>";
165 ui->leDatabaseName->setWhatsThis(szHelp);
166 ui->leDatabaseName->setPlaceholderText(szMsg);
167 ui->leDatabaseName->setToolTip(szMsg);
168 ui->pbBrowser->setVisible(bBrowser);
169 ui->wNet->setVisible(bNet);
170
171 ui->lbDatabaseWarn->setVisible(
172 ui->rbSaveSettingsToDatabase->isChecked()
173 && ui->cbType->currentText() != "QSQLITE");
174}
175
176void CParameterDatabaseUI::on_pbBrowser_clicked()
177{
178 QString szTitle;
179 QString szFilter;
180 szTitle = tr("Database file");
181 szFilter = tr("Database file (*.db);; All files (*.*)");
182 QString szFile = QFileDialog::getSaveFileName(
183 nullptr, szTitle,
184 RabbitCommon::CDir::Instance()->GetDirUserDatabase(),
185 szFilter);
186 if(szFile.isEmpty()) return;
187 ui->leDatabaseName->setText(szFile);
188}
189
190bool CParameterDatabaseUI::eventFilter(QObject *watched, QEvent *event)
191{
192 if(event->type() == QEvent::WhatsThisClicked) {
193 QWhatsThisClickedEvent* e = (QWhatsThisClickedEvent*)event;
194 if(e) {
195 qDebug(log) << e->href();
196 return QDesktopServices::openUrl(e->href());
197 }
198 }
199 return QWidget::eventFilter(watched, event);
200}
201
202void CParameterDatabaseUI::on_rbSaveSettingsToDatabase_toggled(bool checked)
203{
204 ui->lbDatabaseWarn->setVisible(checked && ui->cbType->currentText() != "QSQLITE");
205}
206
207void CParameterDatabaseUI::on_pbTest_clicked()
208{
209 CParameterDatabase dbPara;
210 dbPara.SetType(ui->cbType->currentText());
211 dbPara.SetDatabaseName(ui->leDatabaseName->text());
212 dbPara.SetOptions(ui->leOptions->text());
213 if(!CheckValidity(true))
214 return;
215 ui->wNet->Accept();
216 dbPara.m_Net = m_Net;
217 CDatabase db;
218 bool bRet = db.OpenDatabase(&dbPara);
219 if(bRet) {
220 bRet = db.IsOpen();
221 }
222 if(bRet)
223 QMessageBox::information(this, tr("Test"), tr("Test is successfully!"));
224 else
225 QMessageBox::critical(this, tr("Test"),
226 tr("Test is failed!") + "\n\n"
227 + db.GetError());
228 db.CloseDatabase();
229}
230
提供打开数据库和初始化数据库等接口
Definition Database.h:21
void CloseDatabase()
Close database
Definition Database.cpp:321
bool OpenDatabase(const CParameterDatabase *pPara=nullptr, const QString &szConnectName=QString())
Open a new database
Definition Database.cpp:69
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual bool CheckValidity(bool validity) override
检查参数的有效性
virtual int Accept() override
接受参数。如果需要,可先调用 CheckValidity
参数界面接口
Definition ParameterUI.h:15
参数接口
Definition Parameter.h:218