Rabbit Remote Control 0.0.37
Loading...
Searching...
No Matches
Operate.cpp
1#include <QMetaMethod>
2#include <QInputDialog>
3#include <QCheckBox>
4#include <QLoggingCategory>
5#include <QApplication>
6
7#include "Operate.h"
8#include "Plugin.h"
9#include "RabbitCommonTools.h"
10#include "RabbitCommonDir.h"
11
12static Q_LOGGING_CATEGORY(log, "Operate")
13
15 : QObject{plugin}
16 , m_pPlugin(plugin)
17 , m_pActionSettings(nullptr)
18{
19 qDebug(log) << Q_FUNC_INFO;
20 if(QApplication::clipboard())
21 {
22 bool check = connect(QApplication::clipboard(), SIGNAL(dataChanged()),
23 this, SIGNAL(sigClipBoardChanged()));
24 Q_ASSERT(check);
25 }
26}
27
28COperate::~COperate()
29{
30 qDebug(log) << Q_FUNC_INFO;
31}
32
33const QString COperate::Id()
34{
35 Q_ASSERT(GetPlugin());
36 QString szId = QString::number((int)GetPlugin()->Type()) + "_" + Protocol()
37 + "_" + GetPlugin()->Name();
38 return szId;
39}
40
41const QString COperate::Name()
42{
43 return GetPlugin()->DisplayName();
44}
45
46const QString COperate::Description()
47{
48 QString szDescription;
49 if(!Name().isEmpty())
50 szDescription = tr("Name: ") + Name() + "\n";
51
52 if(!GetTypeName().isEmpty())
53 szDescription += tr("Type:") + GetTypeName() + "\n";
54
55 if(!Protocol().isEmpty()) {
56 szDescription += tr("Protocol: ") + Protocol();
57#ifdef DEBUG
58 if(!GetPlugin()->DisplayName().isEmpty())
59 szDescription += " - " + GetPlugin()->DisplayName();
60#endif
61 szDescription += "\n";
62 }
63
64 if(GetSecurityLevel() != SecurityLevel::No)
65 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
66
67 szDescription += tr("Description: ") + GetPlugin()->Description();
68 return szDescription;
69}
70
71const QString COperate::Protocol() const
72{
73 return GetPlugin()->Protocol();
74}
75
76const QString COperate::GetTypeName() const
77{
78 Q_ASSERT(GetPlugin());
79 return GetPlugin()->TypeName(GetPlugin()->Type());
80}
81
82const QIcon COperate::Icon() const
83{
84 return GetPlugin()->Icon();
85}
86
87int COperate::OpenDialogSettings(QWidget *parent)
88{
89 int nRet = QDialog::Accepted;
90 QDialog* p = OnOpenDialogSettings(parent);
91 if(p)
92 {
93 // The dialog is closed when the connect is close.
94 bool check = connect(this, SIGNAL(sigFinished()),
95 p, SLOT(reject()));
96 Q_ASSERT(check);
97 p->setWindowIcon(this->Icon());
98 p->setWindowTitle(tr("Set ") + GetPlugin()->DisplayName());
99 p->setAttribute(Qt::WA_DeleteOnClose);
100 nRet = RC_SHOW_WINDOW(p);
101 } else {
102 qCritical(log) << "The Protocol [" << Protocol() << "] don't settings dialog";
103 }
104 return nRet;
105}
106
107QMenu* COperate::GetMenu(QWidget* parent)
108{
109 if(m_Menu.actions().isEmpty())
110 return nullptr;
111 return &m_Menu;
112}
113
114COperate::SecurityLevel COperate::GetSecurityLevel()
115{
116 return SecurityLevel::No;
117}
118
119QString COperate::GetSecurityLevelString()
120{
121 return GetSecurityLevelString(GetSecurityLevel());
122}
123
124QString COperate::GetSecurityLevelString(SecurityLevel level)
125{
126 switch (level) {
127 case SecurityLevel::No:
128 return tr("No");
129 case SecurityLevel::Secure:
130 return tr("Secure");
131 case SecurityLevel::NonSecureAuthentication:
132 return tr("Non-secure authentication over a secure channel");
133 case SecurityLevel::Normal:
134 return tr("Channel is secure.");
135 case SecurityLevel::SecureAuthentication:
136 return tr("There is security verification, not a secure channel.");
137 case SecurityLevel::Risky:
138 return tr("Risky");
139 default:
140 break;
141 }
142 return QString();
143}
144
145QColor COperate::GetSecurityLevelColor()
146{
147 return GetSecurityLevelColor(GetSecurityLevel());
148}
149
150QColor COperate::GetSecurityLevelColor(SecurityLevel level)
151{
152 switch (level) {
153 case SecurityLevel::Secure:
154 return Qt::GlobalColor::green;
155 case SecurityLevel::NonSecureAuthentication:
156 return Qt::GlobalColor::blue;
157 case SecurityLevel::Normal:
158 return Qt::GlobalColor::yellow;
159 case SecurityLevel::SecureAuthentication:
160 return Qt::GlobalColor::darkRed;
161 case SecurityLevel::Risky:
162 return Qt::GlobalColor::red;
163 default:
164 break;
165 }
166 return QColor();
167}
168
169QString COperate::GetSettingsFile()
170{
171 if(m_szSettings.isEmpty())
172 {
173 m_szSettings = RabbitCommon::CDir::Instance()->GetDirUserData()
174 + QDir::separator()
175 + Id()
176 + ".rrc";
177 }
178 return m_szSettings;
179}
180
181int COperate::SetSettingsFile(const QString &szFile)
182{
183 m_szSettings = szFile;
184 return 0;
185}
186
187int COperate::Load(QString szFile)
188{
189 Q_ASSERT(!szFile.isEmpty());
190 if(szFile.isEmpty())
191 {
192 qCritical(log) << "The load file is empty";
193 return -1;
194 }
195 QSettings set(szFile, QSettings::IniFormat);
196 return Load(set);
197}
198
199int COperate::Save(QString szFile)
200{
201 Q_ASSERT(!szFile.isEmpty());
202 if(szFile.isEmpty())
203 {
204 qCritical(log) << "The load file is empty";
205 return -1;
206 }
207 QSettings set(szFile, QSettings::IniFormat);
208 return Save(set);
209}
210
211int COperate::Load(QSettings &set)
212{
213 int nRet = 0;
214 Q_UNUSED(set);
215 return nRet;
216}
217
218int COperate::Save(QSettings &set)
219{
220 int nRet = 0;
221 Q_UNUSED(set);
222 return nRet;
223}
224
226{
227 m_Menu.setIcon(m_pPlugin->Icon());
228 m_Menu.setTitle(m_pPlugin->DisplayName());
229 m_Menu.setToolTip(m_pPlugin->DisplayName());
230 m_Menu.setStatusTip(m_pPlugin->DisplayName());
231
232 m_pActionSettings = new QAction(QIcon::fromTheme("system-settings"),
233 tr("Settings"), &m_Menu);
234 if(m_pActionSettings) {
235 bool check = connect(m_pActionSettings, SIGNAL(triggered()),
236 this, SLOT(slotSettings()));
237 Q_ASSERT(check);
238 }
239 return 0;
240}
241
243{
244 return 0;
245}
246
247void COperate::slotSettings()
248{
249 int nRet = OpenDialogSettings();
250 if(QDialog::Accepted == nRet)
251 emit sigUpdateParameters(this);
252}
253
255{
256 return m_pPlugin;
257}
258
260{
261 auto pPlugin = pPara;
262 if(pPlugin)
263 {
264 bool check = connect(pPlugin, SIGNAL(sigShowProtocolPrefixChanged()),
265 this, SLOT(slotUpdateName()));
266 Q_ASSERT(check);
267 check = connect(pPlugin, SIGNAL(sigSHowIpPortInNameChanged()),
268 this, SLOT(slotUpdateName()));
269 Q_ASSERT(check);
270 }
271 return 0;
272}
273
274void COperate::slotUpdateName()
275{
276 emit sigUpdateName(Name());
277}
278
279QObject* COperate::createObject(const QString& className, QObject* parent)
280{
281 Q_UNUSED(parent);
282 int type =
283#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
284 QMetaType::fromName(className.toStdString().c_str()).id();
285#else
286 QMetaType::type(className.toStdString().c_str());
287#endif
288 if(QMetaType::UnknownType == type)
289 {
290 qCritical(log) << className << " is QMetaType::UnknownType";
291 return nullptr;
292 }
293 QObject *obj =
294#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
295 (QObject*)QMetaType(type).create();
296#else
297 (QObject*)QMetaType::create(type);
298#endif
299 if(nullptr == obj)
300 {
301 qCritical(log) << "QMetaType::create fail: " << type;
302 return nullptr;
303 }
304 //const QMetaObject* metaObj = QMetaType::metaObjectForType(type);
305 //QObject *obj = metaObj->newInstance(Q_ARG(QObject*, parent));
306 return obj;
307}
308
309void COperate::slotBlockShowWidget(const QString& className, int &nRet, void* pContext)
310{
311 bool check = false;
312 QObject *obj = createObject(className);
313 Q_ASSERT_X(obj, "Connecter", QString("Create object failed: " + className).toStdString().c_str());
314 /*
315 const QMetaObject* metaObject = obj->metaObject();
316 QStringList methods;
317 for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
318 methods << QString::fromLatin1(metaObject->method(i).methodSignature());
319 qDebug(log) << methods;
320 //*/
321 if(-1 == obj->metaObject()->indexOfMethod("SetContext(void*)"))
322 {
323 QString szErr;
324 szErr = "The class " + className + " is not method SetContext. It must be SetContext(void*) method.";
325 qCritical(log) << szErr;
326 Q_ASSERT_X(false, "Connecter", szErr.toStdString().c_str());
327 }
328 obj->metaObject()->invokeMethod(obj, "SetContext", Q_ARG(void*, pContext));
329
330 if(obj->inherits("QDialog"))
331 {
332 QDialog* pDlg = qobject_cast<QDialog*>(obj);
333 pDlg->setAttribute(Qt::WA_DeleteOnClose);
334 check = connect(this, SIGNAL(sigFinished()),
335 pDlg, SLOT(reject()));
336 Q_ASSERT(check);
337 nRet = RC_SHOW_WINDOW(pDlg);
338 } else if(obj->inherits("QWidget")) {
339 QWidget* pWdg = qobject_cast<QWidget*>(obj);
340 pWdg->setAttribute(Qt::WA_DeleteOnClose);
341 check = connect(this, SIGNAL(sigFinished()),
342 pWdg, SLOT(close()));
343 Q_ASSERT(check);
344 nRet = RC_SHOW_WINDOW(pWdg);
345 }
346}
347
348void COperate::slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage,
349 QMessageBox::StandardButtons buttons,
350 QMessageBox::StandardButton &nRet,
351 bool &checkBox,
352 QString szCheckBoxContext)
353{
354 QCheckBox* pBox = nullptr;
355 QMessageBox msg(QMessageBox::Information,
356 szTitle, szMessage, buttons, GetViewer());
357 if(!szCheckBoxContext.isEmpty())
358 {
359 pBox = new QCheckBox(szCheckBoxContext);
360 if(pBox)
361 pBox->setCheckable(true);
362 msg.setCheckBox(pBox);
363 }
364 nRet = (QMessageBox::StandardButton)RC_SHOW_WINDOW(&msg);
365 if(pBox)
366 checkBox = pBox->isChecked();
367}
368
369void COperate::slotBlockInputDialog(const QString &szTitle, const QString &szLable,
370 const QString &szMessage,
371 QString& szText)
372{
373 bool ok = false;
374 QString t = QInputDialog::getText(nullptr,
375 szTitle,
376 szLable,
377 QLineEdit::Normal,
378 szMessage,
379 &ok);
380 if(ok && !t.isEmpty())
381 szText = t;
382}
383
384void COperate::slotSetClipboard(QMimeData* data)
385{
386 QClipboard* pClipboard = QApplication::clipboard();
387 if(pClipboard) {
388 // pClipboard->disconnect(this);
389
390 pClipboard->setMimeData(data);
391
392 // bool check = connect(pClipboard, SIGNAL(dataChanged()),
393 // this, SIGNAL(sigClipBoardChanged()));
394 // Q_ASSERT(check);
395 }
396}
Operate interface.
Definition Operate.h:50
virtual QDialog * OnOpenDialogSettings(QWidget *parent=nullptr)=0
Open settgins dialog.
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
Definition Operate.cpp:87
virtual int Load(QSettings &set)
Load parameters.
Definition Operate.cpp:211
virtual int Save(QSettings &set)
Save parameters.
Definition Operate.cpp:218
void sigFinished()
Successful disconnection signal.
virtual const QIcon Icon() const
Icon.
Definition Operate.cpp:82
virtual Q_INVOKABLE int Initial()
Initial parameters and resource.
Definition Operate.cpp:225
virtual QWidget * GetViewer()=0
Get Viewer.
virtual void slotBlockShowWidget(const QString &className, int &nRet, void *pContext)
Blocks the background thread and displays the window in the foreground thread.
Definition Operate.cpp:309
virtual const QString Protocol() const
Protocol.
Definition Operate.cpp:71
virtual Q_INVOKABLE int SetGlobalParameters(CParameterPlugin *pPara)=0
Apply the global parameters of the plug-in.
Definition Operate.cpp:259
virtual Q_INVOKABLE int Clean()
Clean parameters and resource.
Definition Operate.cpp:242
virtual void slotSetClipboard(QMimeData *data)
Definition Operate.cpp:384
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Definition Operate.cpp:254
virtual void slotBlockInputDialog(const QString &szTitle, const QString &szLable, const QString &szMessage, QString &szText)
Block background threads and display input dialogs in foreground threads (QInputDialog)
Definition Operate.cpp:369
virtual const QString Name()
Name.
Definition Operate.cpp:41
virtual void slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton &nRet, bool &checkBox, QString szCheckBoxContext=QString())
Block background threads and display message dialogs in foreground threads (QMessageBox)
Definition Operate.cpp:348
virtual const QString Description()
Description.
Definition Operate.cpp:46
void sigUpdateParameters(COperate *pOperate)
Update parameters, notify application to save or show parameters.
virtual const QString Id()
Identity.
Definition Operate.cpp:33
void sigUpdateName(const QString &szName)
virtual const QString GetTypeName() const
Get type name.
Definition Operate.cpp:76
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu.
Definition Operate.cpp:107
Global parameters of plugins.
Plugin interface.
Definition Plugin.h:15
virtual const QString Name() const =0
This name must be the same as the project name (${PROJECT_NAME}). The translation file (${PROJECT_NAM...
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Description() const =0
Plugin description.