RabbitCommon v2.2.6
Loading...
Searching...
No Matches
RabbitCommonTools.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include "RabbitCommonTools.h"
5#include "RabbitCommonDir.h"
6#ifdef HAVE_ADMINAUTHORISER
7#include "AdminAuthoriser/adminauthoriser.h"
8#endif
9#include "RabbitCommonRegister.h"
10#include "Log/Log.h"
11
12#include <QSettings>
13
14#ifdef HAVE_RABBITCOMMON_GUI
15 #include <QIcon>
16 #include <QMainWindow>
17 #include "Style.h"
18 #include <QApplication>
19#else
20 #include <QCoreApplication>
21#endif
22
23#include <QLocale>
24#include <QDir>
25#include <QStandardPaths>
26#include <QSslSocket>
27
28#if defined(Q_OS_ANDROID)
29#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
30 #include <QtCore/private/qandroidextras_p.h>
31#endif
32#endif
33
34#if defined(HAVE_OPENSSL)
35 #include "openssl/opensslv.h"
36#endif
37
38#ifdef WINDOWS
39 #include <windows.h>
40 #include <tchar.h>
41// #include <stdio.h>
42 //#include "lm.h"
43 //#pragma comment(lib,"netapi32.lib")
44#elif UNIX
45 #include <pwd.h>
46 #include <unistd.h>
47#endif
48
49#ifdef Q_OS_WIN
50 #include "CoreDump/MiniDumper.h"
51#endif
52
53#ifdef HAVE_RABBITCOMMON_GUI
54 #include "Log/DockDebugLog.h"
55 #include "Log/DlgFilter.h"
56 extern CDockDebugLog* g_pDcokDebugLog;
57#endif
58
59inline void g_RabbitCommon_InitResource()
60{
61 Q_INIT_RESOURCE(ResourceRabbitCommon);
62
63#ifdef BUILD_QUIWidget
64 Q_INIT_RESOURCE(QUIWidget);
65#endif
66#if DEBUG
67 // Must set cmake parameters: -DCMAKE_BUILD_TYPE=Debug
68 //Q_INIT_RESOURCE(translations_RabbitCommon);
69#ifdef BUILD_QUIWidget
70 Q_INIT_RESOURCE(QUIWidgetQss);
71#endif
72#endif
73}
74
75inline void g_RabbitCommon_CleanResource()
76{
77 Q_CLEANUP_RESOURCE(ResourceRabbitCommon);
78#ifdef BUILD_QUIWidget
79 Q_CLEANUP_RESOURCE(QUIWidget);
80#endif
81#if DEBUG
82 //Q_CLEANUP_RESOURCE(translations_RabbitCommon);
83#ifdef BUILD_QUIWidget
84 Q_CLEANUP_RESOURCE(QUIWidgetQss);
85#endif
86#endif
87}
88
89namespace RabbitCommon {
90
91static Q_LOGGING_CATEGORY(log, "RabbitCommon.Tools")
92static Q_LOGGING_CATEGORY(logTranslation, "RabbitCommon.Tools.Translation")
93
94CTools::CTools() :
95 m_Initialized(false)
96{
97}
98
99CTools::~CTools()
100{
101#if HAVE_RABBITCOMMON_GUI
102 if(g_pDcokDebugLog)
103 delete g_pDcokDebugLog;
104#endif
105}
106
107CTools* CTools::Instance()
108{
109 static CTools* pTools = nullptr;
110 if(nullptr == pTools)
111 pTools = new CTools();
112 return pTools;
113}
114
115int CTools::SetLanguage(const QString szLanguage)
116{
117 m_szLanguage = szLanguage;
118 return 0;
119}
120
121QString CTools::GetLanguage()
122{
123 if(m_szLanguage.isEmpty())
124 return QLocale::system().name();
125 return m_szLanguage;
126}
127
129{
130 QString szReturn;
131 QString szVersion(RabbitCommon_VERSION);
132 QString szRevision(RabbitCommon_REVISION);
133 if(szRevision.isEmpty()) {
134 szReturn = QObject::tr("Version: ") + szVersion;
135 } else {
136 szReturn = QObject::tr("Version: ") + szVersion + QObject::tr(" (From revision: ");
137#if (defined(HAVE_CMARK) || defined(HAVE_CMARK_GFM)) && defined(HAVE_WebEngineWidgets)
138 szReturn += "[" + szRevision + "](http://github.com/KangLin/RabbitCommon/tree/" + szRevision + ")";
139#else
140 szReturn += szRevision;
141#endif
142 szReturn += ") ";
143 }
144 return szReturn;
145}
146
148{
149 QString szInfo;
150 szInfo = QObject::tr("- Functions:") + "\n";
151#if defined(HAVE_RABBITCOMMON_GUI)
152 szInfo += QObject::tr(" - Have GUI") + "\n";
153#endif
154#if defined(HAVE_ABOUT)
155 szInfo += QObject::tr(" - Have about diaglog") + "\n";
156// #ifdef HAVE_CMARK_GFM
157// szInfo += QObject::tr(" - Use cmark-gfm") + "\n";
158// #elif HAVE_CMARK
159// szInfo += QObject::tr(" - Use cmark") + "\n";
160// #endif
161// #ifdef HAVE_WebEngineWidgets
162// szInfo += QObject::tr(" - Use WebEngineWidgets") + "\n";
163// #endif
164#endif
165#if defined(HAVE_UPDATE)
166 szInfo += QObject::tr(" - Have update") + "\n";
167#endif
168#if defined(HAVE_OPENSSL)
169 szInfo += QObject::tr(" - Have encrypt(OPENSSL)") + "\n";
170#endif
171#if defined(BUILD_QUIWidget)
172 szInfo += QObject::tr(" - Have QUIWidget") + "\n";
173#endif
174 szInfo += QObject::tr(" - Applicatoin paths and files: ") + "\n";
175 szInfo += QObject::tr(" - Install root path: ") + RabbitCommon::CDir::Instance()->GetDirApplicationInstallRoot() + "\n";
176 szInfo += QObject::tr(" - Application path: ") + RabbitCommon::CDir::Instance()->GetDirApplication() + "\n";
177 szInfo += QObject::tr(" - Configure path: ") + RabbitCommon::CDir::Instance()->GetDirConfig() + "\n";
178 szInfo += QObject::tr(" - Configure file: ") + RabbitCommon::CDir::Instance()->GetFileApplicationConfigure() + "\n";
179 szInfo += QObject::tr(" - Translations path: ") + RabbitCommon::CDir::Instance()->GetDirTranslations() + "\n";
180 szInfo += QObject::tr(" - Log path: ") + RabbitCommon::CDir::Instance()->GetDirLog() + "\n";
181 szInfo += QObject::tr(" - Data path: ") + RabbitCommon::CDir::Instance()->GetDirData() + "\n";
182 szInfo += QObject::tr(" - Icons path: ") + RabbitCommon::CDir::Instance()->GetDirIcons() + "\n";
183 szInfo += QObject::tr(" - Database path: ") + RabbitCommon::CDir::Instance()->GetDirDatabase() + "\n";
184 szInfo += QObject::tr(" - Database file: ") + RabbitCommon::CDir::Instance()->GetDirDatabaseFile() + "\n";
185 szInfo += QObject::tr(" - Plugins path: ") + RabbitCommon::CDir::Instance()->GetDirPlugins() + "\n";
186 szInfo += QObject::tr(" - User folders and files: ") + "\n";
187 szInfo += QObject::tr(" - Documents path: ") + RabbitCommon::CDir::Instance()->GetDirUserDocument() + "\n";
188 szInfo += QObject::tr(" - Configure path: ") + RabbitCommon::CDir::Instance()->GetDirUserConfig() + "\n";
189 szInfo += QObject::tr(" - Configure file: ") + RabbitCommon::CDir::Instance()->GetFileUserConfigure() + "\n";
190 szInfo += QObject::tr(" - Data path: ") + RabbitCommon::CDir::Instance()->GetDirUserData() + "\n";
191 szInfo += QObject::tr(" - Image path: ") + RabbitCommon::CDir::Instance()->GetDirUserImage() + "\n";
192 szInfo += QObject::tr(" - Database path: ") + RabbitCommon::CDir::Instance()->GetDirUserDatabase() + "\n";
193 szInfo += QObject::tr(" - Database file: ") + RabbitCommon::CDir::Instance()->GetDirUserDatabaseFile() + "\n";
194
195 szInfo += QObject::tr("- Dependent libraries:") + "\n";
196 szInfo += QObject::tr(" - OpenSSL:") + "\n";
197#if defined(HAVE_OPENSSL)
198 szInfo += " - " + QObject::tr("RabbitCommon Build Version: ") + OPENSSL_VERSION_TEXT + "\n";
199#endif
200 if(QSslSocket::supportsSsl())
201 {
202#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 3))
203 szInfo += " - Qt " + QObject::tr("Build Version: ") + QSslSocket::sslLibraryBuildVersionString() + "\n";
204#endif
205 szInfo += " - " + QObject::tr("Installed Version: ") + QSslSocket::sslLibraryVersionString() + "\n";
206 } else {
207#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 3))
208 szInfo += " - Qt " + QObject::tr("Build Version: ") + QSslSocket::sslLibraryBuildVersionString() + "\n";
209#endif
210 szInfo += " - " + QObject::tr("Don't install OPENSSL dynamic library. Please install it") + "\n";
211 }
212#ifdef HAVE_CMARK_GFM
213 szInfo += QObject::tr(" - cmark-gfm") + "\n";
214#elif HAVE_CMARK
215 szInfo += QObject::tr(" - cmark") + "\n";
216#endif
217#ifdef HAVE_WebEngineWidgets
218 szInfo += QObject::tr(" - WebEngineWidgets") + "\n";
219#endif
220 return szInfo;
221}
222
223int CTools::AndroidRequestPermission(const QString &permission)
224{
225#if defined (Q_OS_ANDROID)
226 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
227 // get android storage permission
228 // 该接口也可以直接使用字符串,可自行跳转到头文件自行查看
229
230 if (QtAndroidPrivate::checkPermission(permission).result()
231 == QtAndroidPrivate::Denied)
232 {
233 QtAndroidPrivate::requestPermission(permission).waitForFinished();
234 }
235 qInfo(log) << "android permission" << permission << ";status:"
236 << QtAndroidPrivate::checkPermission(permission).result();
237 #endif
238#endif
239
240 return 0;
241}
242
243int CTools::AndroidRequestPermission(const QStringList &permissions)
244{
245 foreach (auto p, permissions) {
246 AndroidRequestPermission(p);
247 }
248 return 0;
249}
250
251void CTools::Init(const QString szLanguage)
252{
253 if(m_Initialized)
254 return;
255
256 QStringList permissions;
257 permissions << "android.permission.WRITE_EXTERNAL_STORAGE"
258 << "android.permission.INTERNET"
259 << "android.permission.ACCESS_NETWORK_STATE"
260 << "android.permission.CHANGE_WIFI_STATE"
261 << "android.permission.ACCESS_WIFI_STATE"
262 << "android.permission.ACCESS_NETWORK_STATE"
263 << "android.permission.CHANGE_NETWORK_STATE";
264 AndroidRequestPermission(permissions);
265 RabbitCommon::CLog::Instance();
266 SetLanguage(szLanguage);
267 qInfo(logTranslation) << "Language:" << szLanguage;
268 InitResource();
269 InstallTranslator("RabbitCommon", TranslationType::Library, szLanguage);
270 //Init qt translation
271 QString szQtTranslationPath;
272#if defined(Q_OS_LINUX)
273 szQtTranslationPath = "/usr/share/qt"
274 + QString::number(QT_VERSION_MAJOR)
275 + QDir::separator() + "translations";
276 QDir d(szQtTranslationPath);
277 if(!d.exists())
278 {
279 szQtTranslationPath = CDir::Instance()->GetDirApplication()
280 + QDir::separator() + "translations";
281 }
282#else
283 szQtTranslationPath = CDir::Instance()->GetDirApplication()
284 + QDir::separator() + "translations";
285#endif
286 QStringList qtTranslations;
287 qtTranslations << "qt" << "qtbase" << "qtmultimedia" << "qtwebengine"
288 << "qtlocation";
289 foreach(auto f, qtTranslations) {
290 QString szFile = szQtTranslationPath + QDir::separator()
291 + f + "_" + szLanguage + ".qm";
292 QFile file(szFile);
293 if(file.exists())
294 InstallTranslatorFile(szFile);
295 else
296 qWarning(logTranslation) << "The file isn't exists:" << szFile;
297 }
298
299#ifdef HAVE_RABBITCOMMON_GUI
300 CStyle::Instance()->LoadStyle();
301#endif //HAVE_RABBITCOMMON_GUI
302}
303
305{
306 foreach(auto t, m_Translator) {
307 QCoreApplication::removeTranslator(t.data());
308 }
309 m_Translator.clear();
310 CleanResource();
311}
312
313QSharedPointer<QTranslator> CTools::InstallTranslatorFile(const QString szFile)
314{
315 QSharedPointer<QTranslator> translator
316 = QSharedPointer<QTranslator>(new QTranslator());
317 if(!translator) {
318 qCritical(logTranslation) << "new QTranslator fail";
319 return translator;
320 }
321 bool bRet = translator->load(szFile);
322 if(bRet)
323 {
324 bRet = QCoreApplication::installTranslator(translator.data());
325 if(bRet)
326 {
327 m_Translator.push_back(translator);
328 qDebug(logTranslation) << "Install translator:" << szFile;
329 return translator;
330 }
331 else {
332 qCritical(logTranslation) << "Install translator fail:" << szFile;
333 }
334 } else
335 qCritical(logTranslation) << "Load translator file fail:" << szFile;
336 return QSharedPointer<QTranslator>();
337}
338
339QSharedPointer<QTranslator> CTools::InstallTranslator(
340 const QString szName,
341 TranslationType type,
342 const QString szPluginDir,
343 const QString szLanguage)
344{
345 QString szTranslationName = szName;
346
347 QString szSuffix;
348 QString szPath;
349 szSuffix = QDir::separator() + szTranslationName + "_" + szLanguage + ".qm";
350 switch(type) {
351 case TranslationType::Application:
352 szPath = CDir::Instance()->GetDirTranslations();
353 if(szTranslationName.isEmpty())
354 szTranslationName = QCoreApplication::applicationName();
355 break;
356 case TranslationType::Library: {
357 szPath = CDir::Instance()->GetDirTranslations();
358 if(szTranslationName.isEmpty()) {
359 qCritical(logTranslation) << "Please set translation name";
360 Q_ASSERT(false);
361 }
362#if defined(Q_OS_LINUX)
363 QFile file(szPath + szSuffix);
364 if(!file.exists()) {
365 szPath = CDir::Instance()->GetDirTranslations("/usr/share");
366 file.setFileName(szPath + szSuffix);
367 if(!file.exists()) {
368 szPath = CDir::Instance()->GetDirTranslations(
369 "/usr/local/share");
370 }
371 }
372#endif
373 break;
374 }
375 case TranslationType::Plugin:
376 szPath = CDir::Instance()->GetDirPluginsTranslation(szPluginDir);
377 if(szTranslationName.isEmpty()) {
378 qCritical(logTranslation) << "Please set translation name";
379 Q_ASSERT(false);
380 }
381 break;
382 }
383
384 QString szFile = szPath + szSuffix;
385 QFile file(szFile);
386 if(!file.exists())
387 {
388 qCritical(logTranslation) << "File isn't exit:" << szFile;
389 return QSharedPointer<QTranslator>();
390 }
391
392 return InstallTranslatorFile(szFile);
393}
394
395int CTools::RemoveTranslator(QSharedPointer<QTranslator> translator)
396{
397 foreach(auto t, m_Translator) {
398 if(t == translator) {
399 QCoreApplication::removeTranslator(t.data());
400 m_Translator.removeAll(t);
401 return 0;
402 }
403 }
404 return -1;
405}
406
407void CTools::InitResource()
408{
409 g_RabbitCommon_InitResource();
410}
411
412void CTools::CleanResource()
413{
414 g_RabbitCommon_CleanResource();
415}
416
417bool CTools::EnableCoreDump(bool bPrompt)
418{
419 Q_UNUSED(bPrompt);
420#ifdef Q_OS_WIN
421 //static RabbitCommon::CMiniDumper dumper(bPrompt);
422 RabbitCommon::EnableMiniDumper();
423 return true;
424#endif
425 return false;
426}
427
428bool CTools::executeByRoot(const QString &program, const QStringList &arguments)
429{
430#ifdef HAVE_ADMINAUTHORISER
431 return CAdminAuthoriser::Instance()->execute(program, arguments);
432#else
433 return false;
434#endif
435}
436
437int CTools::InstallStartRun(const QString &szName, const QString &szPath, bool bAllUser)
438{
439 Q_UNUSED(szName)
440 Q_UNUSED(szPath)
441 Q_UNUSED(bAllUser)
442
443 QString appPath;
444 appPath = QCoreApplication::applicationFilePath();
445
446 if(!szPath.isEmpty())
447 appPath = szPath;
448 if(appPath.isEmpty())
449 {
450 qCCritical(log) << "szPath is empty";
451 return -1;
452 }
453 if(bAllUser)
454 return RabbitCommon::CRegister::InstallStartRun();
455 return RabbitCommon::CRegister::InstallStartRunCurrentUser();
456 //See: debian/postinst and Install/install.sh
457 //Ubuntu use gnome-session-properties
458 // - Current user: ~/.config/autostart
459 // - All user: /etc/xdg/autostart/
460 //https://blog.csdn.net/DinnerHowe/article/details/79025282
461 QString szLink = CRegister::GetDesktopFileLink(szName, bAllUser);
462 if(QFile::exists(szLink))
463 if(RemoveStartRun(szName, bAllUser))
464 {
465 qCCritical(log) << "RemoveStartRun" << szName << "fail";
466 return -1;
467 }
468
469 appPath = CRegister::GetDesktopFileName(szPath, szName);
470 QFile f(appPath);
471 if(!f.exists())
472 {
473 qCCritical(log) << "The desktop file is not exist." << appPath;
474 return -2;
475 }
476 bool ret = f.link(szLink);
477 if(!ret)
478 {
479 QString szCmd = "ln -s " + appPath + " " + szLink;
480 if(!executeByRoot(szCmd))
481 qCritical(log) << "CTools::InstallStartRun: file link"
482 << f.fileName() << " to " << szLink << f.error();
483 return -1;
484 }
485 return 0;
486
487}
488
489int CTools::RemoveStartRun(const QString &szName, bool bAllUser)
490{
491 Q_UNUSED(szName);
492 QString appName = QCoreApplication::applicationName();
493 if(!szName.isEmpty())
494 appName = szName;
495 if(bAllUser)
496 return RabbitCommon::CRegister::RemoveStartRun();
497 return RabbitCommon::CRegister::RemoveStartRunCurrentUser();
498
499 QString szLink = CRegister::GetDesktopFileLink(szName, bAllUser);
500 if(!QFile::exists(szLink)) return 0;
501
502 QDir d;
503 if(d.remove(szLink)) return 0;
504
505 QString szCmd = "rm " + szLink;
506 if(executeByRoot(szCmd)) return 0;
507 qCritical(log) << "execute" << szCmd << "fail";
508 return -1;
509
510}
511
512bool CTools::IsStartRun(const QString &szName, bool bAllUser)
513{
514 Q_UNUSED(szName);
515
516 if(bAllUser)
517 return RabbitCommon::CRegister::IsStartRun();
518 return RabbitCommon::CRegister::IsStartRunCurrentUser();
519
520 QString szLink = CRegister::GetDesktopFileLink(szName, bAllUser);
521 if(QFile::exists(szLink))
522 return true;
523 return false;
524}
525
526int CTools::GenerateDesktopFile(const QString &szPath,
527 const QString &szName)
528{
529 int nRet = 0;
530
531 QString szFile = CRegister::GetDesktopFileName(szPath, szName);
532
533 QString szContent;
534 szContent = "[Desktop Entry]\n";
535 szContent += "Name=" + QCoreApplication::applicationName() + "\n";
536 szContent += "Comment=" + QCoreApplication::applicationName() + "\n";
537#ifdef HAVE_RABBITCOMMON_GUI
538 szContent += "Name[" + QLocale::system().name() + "]=" + QApplication::applicationDisplayName() + "\n";
539 szContent += "Comment[" + QLocale::system().name() + "]=" + QApplication::applicationDisplayName() + "\n";
540#else
541 szContent += "Name[" + QLocale::system().name() + "]=" + QCoreApplication::applicationName() + "\n";
542 szContent += "Comment[" + QLocale::system().name() + "]=" + QCoreApplication::applicationName() + "\n";
543#endif
544 szContent += "Icon=" + QCoreApplication::applicationName() + "\n";
545 szContent += "Exec=" + QCoreApplication::applicationFilePath() + "\n";
546 szContent += "Categories=Application;Development;\n";
547 szContent += "Terminal=false\n";
548 szContent += "StartupNotify=true\n";
549
550 QFile f(szFile);
551 if(!f.open(QFile::WriteOnly))
552 {
553 return f.error();
554 }
555 f.write(szContent.toStdString().c_str());
556 f.close();
557 return nRet;
558}
559
560QString CTools::GetCurrentUser()
561{
562#ifdef UNIX
563 struct passwd *pwd;
564 pwd = getpwuid(getuid());
565 return pwd->pw_name;
566#elif WINDOWS
567 CHAR szUserName[MAX_PATH] = {0};
568 DWORD dwSize=MAX_PATH;
569 ::GetUserNameA(szUserName, &dwSize);
570 return szUserName;
571 //return QString::fromWCharArray(szUserName, dwSize);
572#else
573 return QDir::home().dirName();
574#endif
575}
576
577QString CTools::GetHostName()
578{
579 char buf[255];
580 gethostname(buf, sizeof(buf));
581 return buf;
582}
583
584#ifdef HAVE_RABBITCOMMON_GUI
585QAction* CTools::AddStyleMenu(QMenu *pMenu, QWidget *parent)
586{
587 return pMenu->addAction(QIcon::fromTheme("style"),
588 QObject::tr("Style"),
589 [=](){
590 CFrmStyle* s = new CFrmStyle(parent);
591 if(s)
592 s->show();
593 });
594}
595
596void CTools::InsertStyleMenu(QMenu *pMenu, QAction *before, QWidget *parent)
597{
598 QAction* pAction = new QAction(QIcon::fromTheme("style"),
599 QObject::tr("Style"), parent);
600 QObject::connect(pAction, &QAction::triggered, [=](){
601 CFrmStyle* s = new CFrmStyle(parent);
602 if(s)
603 s->show();
604 });
605 pMenu->insertAction(before, pAction);
606}
607
608QMenu* CTools::GetLogMenu(QWidget *parentMainWindow)
609{
610 QMenu* pMenu = new QMenu(QObject::tr("Log"), parentMainWindow);
611 if(!pMenu) return pMenu;
612 pMenu->setIcon(QIcon::fromTheme("folder-open"));
613 pMenu->addAction(QIcon::fromTheme("emblem-system"),
614 QObject::tr("Settings"),
615 [](){
616 CDlgFilter dlg;
617 QString szInclude, szExclude;
618 CLog::Instance()->GetFilter(szInclude, szExclude);
619 dlg.SetFilter(szInclude, szExclude);
620 if(QDialog::Accepted == dlg.exec())
621 {
622 dlg.GetFilter(szInclude, szExclude);
623 CLog::Instance()->SetFilter(szInclude, szExclude);
624 }
625 });
626 pMenu->addAction(QIcon::fromTheme("document-open"),
627 QObject::tr("Open Log configure file"),
628 [](){RabbitCommon::OpenLogConfigureFile();});
629 pMenu->addAction(QIcon::fromTheme("document-open"),
630 QObject::tr("Open Log file"),
631 [](){RabbitCommon::OpenLogFile();});
632 pMenu->addAction(QIcon::fromTheme("folder-open"),
633 QObject::tr("Open log folder"),
634 [](){RabbitCommon::OpenLogFolder();});
635 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(parentMainWindow);
636 if(pMainWindow) {
637 if(!g_pDcokDebugLog)
638 g_pDcokDebugLog = new CDockDebugLog(pMainWindow);
639 pMainWindow->addDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea,
640 g_pDcokDebugLog);
641 // Must set ObjectName then restore it. See: saveState help document
642 g_pDcokDebugLog->setObjectName("dockDebugLog");
643 QAction* pDock = g_pDcokDebugLog->toggleViewAction();
644 pMenu->addAction(pDock);
645 pDock->setText(QObject::tr("Log dock"));
646 pDock->setIcon(QIcon::fromTheme("floating"));
647 } else {
648 qWarning(log) << "CTools::GetLogMenu: Don't use dock debug log."
649 << "The parent suggest is MainWindow pointer";
650 }
651
652 return pMenu;
653}
654
655int CTools::RestoreWidget(QWidget *pWidget)
656{
657 int nRet = 0;
658 Q_ASSERT(pWidget);
659 if(!pWidget) return -1;
660 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
661 QSettings::IniFormat);
662 QByteArray geometry
663 = set.value("MainWindow/Status/Geometry").toByteArray();
664 if(!geometry.isEmpty()) {
665 if(!pWidget->restoreGeometry(geometry))
666 qWarning(log) << "Restore geometry fail";
667 }
668 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(pWidget);
669 if(pMainWindow) {
670 QByteArray state = set.value("MainWindow/Status/State").toByteArray();
671 if(!state.isEmpty()) {
672 if(!pMainWindow->restoreState(state))
673 qWarning(log) << "Restore state fail";
674 }
675 }
676 return nRet;
677}
678
679int CTools::SaveWidget(QWidget *pWidget)
680{
681 int nRet = 0;
682 Q_ASSERT(pWidget);
683 if(!pWidget) return -1;
684 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
685 QSettings::IniFormat);
686 set.setValue("MainWindow/Status/Geometry", pWidget->saveGeometry());
687 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(pWidget);
688 if(pMainWindow) {
689 set.setValue("MainWindow/Status/State", pMainWindow->saveState());
690 }
691 return nRet;
692}
693
694#endif
695
696} //namespace RabbitCommon
Set filter dialog.
Definition DlgFilter.h:15
The CDockDebugLog class.
Set style and icon theme form.
Definition FrmStyle.h:87
QString GetDirData(bool bReadOnly=false)
Get data directory.
QString GetDirTranslations(QString szPrefix=QString())
static QString GetDesktopFileLink(const QString &szName=QString(), bool bAllUser=false)
GetDesktopFileLink.
static QString GetDesktopFileName(const QString &szPath=QString(), const QString &szName=QString())
Generate the name of desktop file.
static bool EnableCoreDump(bool bPrompt=true)
Enable core dump.
QSharedPointer< QTranslator > InstallTranslator(const QString szName=QString(), TranslationType type=TranslationType::Application, const QString szPluginDir="plugins", const QString szLanguage=QLocale::system().name())
Install translation.
static int GenerateDesktopFile(const QString &szPath=QString(), const QString &szName=QString())
GenerateDesktopFile: Generate desktop file.
static QString Information()
RabbitCommon information.
void Init(const QString szLanguage=QLocale::system().name())
static bool executeByRoot(const QString &program, const QStringList &arguments=QStringList())
executeByRoot: Run with administrator privileges
static int InstallStartRun(const QString &szName=QString(), const QString &szPath=QString(), bool bAllUser=false)
InstallStartRun: auto run when startup.
static QString Version()
RabbitCommon version.