玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
Operate.cpp
1#include <QMetaMethod>
2#include <QInputDialog>
3#include <QCheckBox>
4#include <QLoggingCategory>
5#include <QApplication>
6#include <QRegularExpression>
7
8#include "Operate.h"
9#include "Plugin.h"
10#include "RabbitCommonTools.h"
11#include "RabbitCommonDir.h"
12
13static Q_LOGGING_CATEGORY(log, "Operate")
14
16 : QObject{plugin}
17 , m_SecurityLevel(CSecurityLevel::Level::No)
18 , m_pPlugin(plugin)
19 , m_pActionSettings(nullptr)
20{
21 qDebug(log) << Q_FUNC_INFO;
22 bool check = false;
23 if(QApplication::clipboard())
24 {
25 check = connect(QApplication::clipboard(), SIGNAL(dataChanged()),
26 this, SIGNAL(sigClipBoardChanged()));
27 Q_ASSERT(check);
28 }
29}
30
31COperate::~COperate()
32{
33 qDebug(log) << Q_FUNC_INFO;
34}
35
36const QString COperate::Id()
37{
38 Q_ASSERT(GetPlugin());
39 QString szId = GetPlugin()->Name() + "_" + Protocol()
40 + "_" + QString::number((int)GetPlugin()->Type());
41 static QRegularExpression exp("[-@:/#%!^&* \\.]");
42 szId = szId.replace(exp, "_");
43 return szId;
44}
45
46const QString COperate::Name()
47{
48 return GetPlugin()->DisplayName();
49}
50
51const QString COperate::Description()
52{
53 QString szDescription;
54 if(!Name().isEmpty())
55 szDescription = tr("Name: ") + Name() + "\n";
56
57 if(!GetTypeName().isEmpty())
58 szDescription += tr("Type:") + GetTypeName() + "\n";
59
60 if(!Protocol().isEmpty()) {
61 szDescription += tr("Protocol: ") + Protocol();
62#ifdef DEBUG
63 if(!GetPlugin()->DisplayName().isEmpty())
64 szDescription += " - " + GetPlugin()->DisplayName();
65#endif
66 szDescription += "\n";
67 }
68
70 if(GetSecurityLevel() != CSecurityLevel::Level::No) {
71 szDescription += tr("Security level: ");
72 if(!sl.GetUnicodeIcon().isEmpty())
73 szDescription += sl.GetUnicodeIcon() + " ";
74 szDescription += sl.GetString() + "\n";
75 }
76
77 szDescription += tr("Description: ") + GetPlugin()->Description();
78 return szDescription;
79}
80
81const QString COperate::Protocol() const
82{
83 return GetPlugin()->Protocol();
84}
85
86const QString COperate::GetTypeName() const
87{
88 Q_ASSERT(GetPlugin());
89 return GetPlugin()->TypeName(GetPlugin()->Type());
90}
91
92const QIcon COperate::Icon() const
93{
94 return GetPlugin()->Icon();
95}
96
97int COperate::OpenDialogSettings(QWidget *parent)
98{
99 int nRet = QDialog::Accepted;
100 QDialog* p = OnOpenDialogSettings(parent);
101 if(p)
102 {
103 // The dialog is closed when the connect is close.
104 bool check = connect(this, SIGNAL(sigFinished()),
105 p, SLOT(reject()));
106 Q_ASSERT(check);
107 p->setWindowIcon(this->Icon());
108 p->setWindowTitle(tr("Set ") + GetPlugin()->DisplayName());
109 p->setAttribute(Qt::WA_DeleteOnClose);
110 nRet = RC_SHOW_WINDOW(p);
111 } else {
112 qCritical(log) << "The Protocol [" << Protocol() << "] don't settings dialog";
113 }
114 return nRet;
115}
116
117QMenu* COperate::GetMenu(QWidget* parent)
118{
119 if(m_Menu.actions().isEmpty())
120 return nullptr;
121 return &m_Menu;
122}
123
125{
126 return nullptr;
127}
128
129CSecurityLevel::Levels COperate::GetSecurityLevel() const
130{
131 return m_SecurityLevel;
132}
133
134void COperate::slotSetSecurityLevel(CSecurityLevel::Levels level)
135{
136 if(m_SecurityLevel == level)
137 return;
138 m_SecurityLevel = level;
139 emit sigSecurityLevel();
140 slotUpdateName();
141}
142
143QString COperate::GetSettingsFile()
144{
145 if(m_szSettings.isEmpty())
146 {
147 QString szId = Id();
148 static QRegularExpression exp("[-@:#%!^&* .]");
149 szId = szId.replace(exp, "_");
150 m_szSettings = RabbitCommon::CDir::Instance()->GetDirUserData()
151 + QDir::separator()
152 + szId
153 + ".rrc";
154 }
155 return m_szSettings;
156}
157
158int COperate::SetSettingsFile(const QString &szFile)
159{
160 m_szSettings = szFile;
161 return 0;
162}
163
164int COperate::Load(QString szFile)
165{
166 Q_ASSERT(!szFile.isEmpty());
167 if(szFile.isEmpty())
168 {
169 qCritical(log) << "The load file is empty";
170 return -1;
171 }
172 qInfo(log) << "Load configure file:" << szFile;
173 QSettings set(szFile, QSettings::IniFormat);
174 return Load(set);
175}
176
177int COperate::Save(QString szFile)
178{
179 Q_ASSERT(!szFile.isEmpty());
180 if(szFile.isEmpty())
181 {
182 qCritical(log) << "The load file is empty";
183 return -1;
184 }
185 qInfo(log) << "Save configure file:" << szFile;
186 QSettings set(szFile, QSettings::IniFormat);
187 return Save(set);
188}
189
191{
192 m_Menu.setIcon(m_pPlugin->Icon());
193 m_Menu.setTitle(m_pPlugin->DisplayName());
194 m_Menu.setToolTip(m_pPlugin->DisplayName());
195 m_Menu.setStatusTip(m_pPlugin->DisplayName());
196
197 m_pActionSettings = new QAction(QIcon::fromTheme("system-settings"),
198 tr("Settings"), &m_Menu);
199 if(m_pActionSettings) {
200 bool check = connect(m_pActionSettings, SIGNAL(triggered()),
201 this, SLOT(slotSettings()));
202 Q_ASSERT(check);
203 }
204 return 0;
205}
206
208{
209 return 0;
210}
211
212void COperate::slotSettings()
213{
214 int nRet = OpenDialogSettings();
215 if(QDialog::Accepted == nRet)
216 emit sigUpdateParameters(this);
217}
218
220{
221 return m_pPlugin;
222}
223
225{
226 QString szMsg = "There is not parameters! "
227 "please first create parameters, "
228 "then call SetParameter() in the ";
229 szMsg += metaObject()->className() + QString("::")
230 + metaObject()->className();
231 szMsg += QString("() or ") + metaObject()->className()
232 + QString("::") + "Initial()";
233 szMsg += " to set the parameters pointer. "
234 "Default set CParameterClient for the parameters of operate "
235 "(CParameterOperate or its derived classes) "
236 "See CManager::CreateOperate. "
237 "If you are sure the parameter of operate "
238 "does not need CParameterClient. "
239 "Please overload the SetGlobalParameters() in the ";
240 szMsg += QString(metaObject()->className()) + " . don't set it";
241 qCritical(log) << szMsg.toStdString().c_str();
242 Q_ASSERT_X(false, Q_FUNC_INFO, szMsg.toStdString().c_str());
243
244 return 0;
245}
246
247void COperate::slotUpdateName()
248{
249 emit sigUpdateName(Name());
250}
251
252QObject* COperate::createObject(const QString& className, QObject* parent)
253{
254 Q_UNUSED(parent);
255 int type =
256#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
257 QMetaType::fromName(className.toStdString().c_str()).id();
258#else
259 QMetaType::type(className.toStdString().c_str());
260#endif
261 if(QMetaType::UnknownType == type)
262 {
263 qCritical(log) << className << " is QMetaType::UnknownType";
264 return nullptr;
265 }
266 QObject *obj =
267#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
268 (QObject*)QMetaType(type).create();
269#else
270 (QObject*)QMetaType::create(type);
271#endif
272 if(nullptr == obj)
273 {
274 qCritical(log) << "QMetaType::create fail: " << type;
275 return nullptr;
276 }
277 //const QMetaObject* metaObj = QMetaType::metaObjectForType(type);
278 //QObject *obj = metaObj->newInstance(Q_ARG(QObject*, parent));
279 return obj;
280}
281
282void COperate::slotBlockShowWidget(const QString& className, int &nRet, void* pContext)
283{
284 bool check = false;
285 QObject *obj = createObject(className);
286 Q_ASSERT_X(obj, "Connecter", QString("Create object failed: " + className).toStdString().c_str());
287 /*
288 const QMetaObject* metaObject = obj->metaObject();
289 QStringList methods;
290 for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
291 methods << QString::fromLatin1(metaObject->method(i).methodSignature());
292 qDebug(log) << methods;
293 //*/
294 if(-1 == obj->metaObject()->indexOfMethod("SetContext(void*)"))
295 {
296 QString szErr;
297 szErr = "The class " + className + " is not method SetContext. It must be SetContext(void*) method.";
298 qCritical(log) << szErr;
299 Q_ASSERT_X(false, "Connecter", szErr.toStdString().c_str());
300 }
301 obj->metaObject()->invokeMethod(obj, "SetContext", Q_ARG(void*, pContext));
302
303 if(obj->inherits("QDialog"))
304 {
305 QDialog* pDlg = qobject_cast<QDialog*>(obj);
306 pDlg->setAttribute(Qt::WA_DeleteOnClose);
307 check = connect(this, SIGNAL(sigFinished()),
308 pDlg, SLOT(reject()));
309 Q_ASSERT(check);
310 nRet = RC_SHOW_WINDOW(pDlg);
311 } else if(obj->inherits("QWidget")) {
312 QWidget* pWdg = qobject_cast<QWidget*>(obj);
313 pWdg->setAttribute(Qt::WA_DeleteOnClose);
314 check = connect(this, SIGNAL(sigFinished()),
315 pWdg, SLOT(close()));
316 Q_ASSERT(check);
317 nRet = RC_SHOW_WINDOW(pWdg);
318 }
319}
320
321void COperate::slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage,
322 QMessageBox::StandardButtons buttons,
323 QMessageBox::StandardButton &nRet,
324 bool &checkBox,
325 QString szCheckBoxContext)
326{
327 QCheckBox* pBox = nullptr;
328 QMessageBox msg(QMessageBox::Information,
329 szTitle, szMessage, buttons, GetViewer());
330 if(!szCheckBoxContext.isEmpty())
331 {
332 pBox = new QCheckBox(szCheckBoxContext);
333 if(pBox)
334 pBox->setCheckable(true);
335 msg.setCheckBox(pBox);
336 }
337 nRet = (QMessageBox::StandardButton)RC_SHOW_WINDOW(&msg);
338 if(pBox)
339 checkBox = pBox->isChecked();
340}
341
342void COperate::slotBlockInputDialog(const QString &szTitle, const QString &szLable,
343 const QString &szMessage,
344 QString& szText)
345{
346 bool ok = false;
347 QString t = QInputDialog::getText(nullptr,
348 szTitle,
349 szLable,
350 QLineEdit::Normal,
351 szMessage,
352 &ok);
353 if(ok && !t.isEmpty())
354 szText = t;
355}
356
357void COperate::slotSetClipboard(QMimeData* data)
358{
359 QClipboard* pClipboard = QApplication::clipboard();
360 if(pClipboard) {
361 // pClipboard->disconnect(this);
362
363 pClipboard->setMimeData(data);
364
365 // bool check = connect(pClipboard, SIGNAL(dataChanged()),
366 // this, SIGNAL(sigClipBoardChanged()));
367 // Q_ASSERT(check);
368 }
369}
操作接口。
Definition Operate.h:51
virtual QDialog * OnOpenDialogSettings(QWidget *parent=nullptr)=0
得到设置对话框
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
Definition Operate.cpp:97
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
Definition Operate.cpp:129
void sigFinished()
断开连接成功信号。仅由插件触发
virtual const QIcon Icon() const
图标
Definition Operate.cpp:92
virtual CStats * GetStats()
得到统计信息。如果有,其派生类则需要重载此函数提供统计信息。
Definition Operate.cpp:124
static QObject * createObject(const QString &className, QObject *parent=NULL)
Create Object
Definition Operate.cpp:252
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
Definition Operate.cpp:190
virtual QWidget * GetViewer()=0
得到显示视图
virtual void slotBlockShowWidget(const QString &className, int &nRet, void *pContext)
阻塞后台线程,并在前台线程中显示窗口。
Definition Operate.cpp:282
virtual Q_INVOKABLE int Load(QSettings &set)=0
加载参数
virtual const QString Protocol() const
协议
Definition Operate.cpp:81
virtual Q_INVOKABLE int SetGlobalParameters(CParameterPlugin *pPara)=0
应用插件全局参数
Definition Operate.cpp:224
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
Definition Operate.cpp:207
virtual void slotSetClipboard(QMimeData *data)
Definition Operate.cpp:357
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:219
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:342
virtual const QString Name()
名称
Definition Operate.cpp:46
virtual void slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton &nRet, bool &checkBox, QString szCheckBoxContext=QString())
阻塞后台线程,并在前台线程中显示消息对话框(QMessageBox)
Definition Operate.cpp:321
virtual const QString Description()
描述
Definition Operate.cpp:51
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual Q_INVOKABLE int Save(QSettings &set)=0
保存参数
virtual const QString Id()
标识
Definition Operate.cpp:36
void sigUpdateName(const QString &szName)
void sigSecurityLevel()
当安全级别改变时触发。其派生类不要直接触发,需要使用 slotSetSecurityLevel 触发
virtual const QString GetTypeName() const
类型名
Definition Operate.cpp:86
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
Definition Operate.cpp:117
插件的全局参数。
插件接口
Definition Plugin.h:15
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:76
virtual const QString Protocol() const =0
协议
virtual const QString Description() const =0
描述
安全级别
Definition Stats.h:79
Definition Stats.h:11