1 /* Copyright (c) 2020-2021 hors<horsicq@gmail.com>
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in all
11 * copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 * SOFTWARE.
20 */
21 #include "xoptions.h"
22
XOptions(QObject * pParent)23 XOptions::XOptions(QObject *pParent) : QObject(pParent)
24 {
25 g_bIsNeedRestart=false;
26 g_bIsNative=checkNative();
27
28 g_sName=QString("%1.ini").arg(qApp->applicationName()); // default name
29 }
30
setValueIDs(QList<ID> listVariantIDs)31 void XOptions::setValueIDs(QList<ID> listVariantIDs)
32 {
33 this->g_listValueIDs=listVariantIDs;
34 }
35
setDefaultValues(QMap<XOptions::ID,QVariant> mapDefaultValues)36 void XOptions::setDefaultValues(QMap<XOptions::ID, QVariant> mapDefaultValues)
37 {
38 this->g_mapDefaultValues=mapDefaultValues;
39 }
40
addID(ID id,QVariant varDefaultValue)41 void XOptions::addID(ID id, QVariant varDefaultValue)
42 {
43 g_listValueIDs.append(id);
44
45 if(varDefaultValue.isValid())
46 {
47 g_mapDefaultValues.insert(id,varDefaultValue);
48 }
49 }
50
setNative(bool bValue)51 void XOptions::setNative(bool bValue)
52 {
53 g_bIsNative=bValue;
54 }
55
isNative()56 bool XOptions::isNative()
57 {
58 return g_bIsNative;
59 }
60
isAppImage()61 bool XOptions::isAppImage()
62 {
63 // TODO more checks
64 bool bResult=false;
65
66 QString sApplicationDirPath=qApp->applicationDirPath();
67
68 bResult=(sApplicationDirPath.contains("/tmp/.mount_")); // TODO check
69
70 return bResult;
71 }
72
setName(QString sValue)73 void XOptions::setName(QString sValue)
74 {
75 g_sName=sValue;
76 }
77
load()78 void XOptions::load()
79 {
80 QSettings *pSettings=nullptr;
81
82 if(g_bIsNative)
83 {
84 pSettings=new QSettings;
85 }
86 else
87 {
88 pSettings=new QSettings(getApplicationDataPath()+QDir::separator()+QString("%1").arg(g_sName),QSettings::IniFormat);
89 }
90
91 #ifdef QT_DEBUG
92 if(pSettings)
93 {
94 qDebug("XOptions load file %s",pSettings->fileName().toLatin1().data());
95 }
96 #endif
97
98 qint32 nNumberOfIDs=g_listValueIDs.count();
99
100 bool bSaveLastDirectory=false;
101 bool bLastDirectory=false;
102 bool bSaveRecentFiles=false;
103 bool bRecentFiles=false;
104
105 for(qint32 i=0;i<nNumberOfIDs;i++)
106 {
107 if(g_listValueIDs.at(i)==ID_SAVELASTDIRECTORY)
108 {
109 bSaveLastDirectory=true;
110 }
111
112 if(g_listValueIDs.at(i)==ID_NU_LASTDIRECTORY)
113 {
114 bLastDirectory=true;
115 }
116
117 if(g_listValueIDs.at(i)==ID_SAVERECENTFILES)
118 {
119 bSaveRecentFiles=true;
120 }
121
122 if(g_listValueIDs.at(i)==ID_NU_RECENTFILES)
123 {
124 bRecentFiles=true;
125 }
126 }
127
128 if(bSaveLastDirectory&&(!bLastDirectory))
129 {
130 g_listValueIDs.append(ID_NU_LASTDIRECTORY);
131 }
132
133 if(bSaveRecentFiles&&(!bRecentFiles))
134 {
135 g_listValueIDs.append(ID_NU_RECENTFILES);
136 }
137
138 nNumberOfIDs=g_listValueIDs.count();
139
140 for(qint32 i=0;i<nNumberOfIDs;i++)
141 {
142 ID id=g_listValueIDs.at(i);
143 QString sName=idToString(id);
144
145 QVariant varDefault;
146
147 if(g_mapDefaultValues.contains(id))
148 {
149 varDefault=g_mapDefaultValues.value(id);
150 }
151 else
152 {
153 switch(id)
154 {
155 case ID_STAYONTOP: varDefault=false; break;
156 case ID_SCANAFTEROPEN: varDefault=true; break;
157 case ID_RECURSIVESCAN: varDefault=true; break;
158 case ID_DEEPSCAN: varDefault=true; break;
159 case ID_HEURISTICSCAN: varDefault=true; break;
160 case ID_SAVELASTDIRECTORY: varDefault=true; break;
161 case ID_SAVERECENTFILES: varDefault=true; break;
162 case ID_SAVEBACKUP: varDefault=true; break;
163 case ID_STYLE: varDefault="Fusion"; break; // TODO Check styles in OSX and Linux
164 case ID_LANG: varDefault="System"; break;
165 case ID_QSS: varDefault=""; break;
166 case ID_DATABASEPATH: varDefault="$data/db"; break;
167 case ID_INFOPATH: varDefault="$data/info"; break;
168 case ID_SCANENGINE: varDefault="die"; break;
169 case ID_DISASMSYNTAX: varDefault=""; break;
170 case ID_ROOTPATH: varDefault=""; break;
171 case ID_DATAPATH: varDefault="$data/data"; break;
172 case ID_JSON: varDefault=""; break;
173 case ID_SINGLEAPPLICATION: varDefault=false; break;
174 case ID_SEARCHSIGNATURESPATH: varDefault="$data/signatures"; break;
175 case ID_STRUCTSPATH: varDefault="$data/structs"; break;
176 case ID_AUTHUSER: varDefault=""; break;
177 case ID_AUTHTOKEN: varDefault=""; break;
178 case ID_SHOWLOGO: varDefault=true; break;
179 case ID_NU_RECENTFILES: varDefault=QList<QVariant>(); break;
180 case ID_NU_LASTDIRECTORY: varDefault=""; break;
181 default: varDefault="";
182 }
183 }
184
185 QVariant variant=pSettings->value(sName,varDefault);
186
187 if(!variant.toString().contains("$data"))
188 {
189 if( (id==ID_DATABASEPATH)||
190 (id==ID_INFOPATH)||
191 (id==ID_DATAPATH)||
192 (id==ID_SEARCHSIGNATURESPATH)||
193 (id==ID_STRUCTSPATH))
194 {
195 if(!QDir(variant.toString()).exists())
196 {
197 variant=varDefault;
198 }
199 }
200 }
201
202 if(g_bIsNative)
203 {
204 if(variant.toString().contains("$data"))
205 {
206 QString sValue=variant.toString();
207 sValue=sValue.replace("$data",getApplicationDataPath());
208 variant=sValue;
209 }
210 }
211
212 g_mapValues.insert(id,variant);
213 }
214
215 QString sLastDirectory=g_mapValues.value(ID_NU_LASTDIRECTORY).toString();
216
217 if(sLastDirectory!="")
218 {
219 if(!QDir(sLastDirectory).exists())
220 {
221 g_mapValues.insert(ID_NU_LASTDIRECTORY,"");
222 }
223 }
224
225 delete pSettings;
226 }
227
save()228 void XOptions::save()
229 {
230 QSettings *pSettings=nullptr;
231
232 if(g_bIsNative)
233 {
234 pSettings=new QSettings;
235 }
236 else
237 {
238 pSettings=new QSettings(getApplicationDataPath()+QDir::separator()+QString("%1").arg(g_sName),QSettings::IniFormat);
239 }
240
241 #ifdef QT_DEBUG
242 if(pSettings)
243 {
244 qDebug("XOptions save file %s",pSettings->fileName().toLatin1().data());
245 }
246 #endif
247
248 qint32 nNumberOfIDs=g_listValueIDs.count();
249
250 for(qint32 i=0;i<nNumberOfIDs;i++)
251 {
252 ID id=g_listValueIDs.at(i);
253 QString sName=idToString(id);
254 pSettings->setValue(sName,g_mapValues.value(id));
255 }
256
257 delete pSettings;
258 }
259
getValue(XOptions::ID id)260 QVariant XOptions::getValue(XOptions::ID id)
261 {
262 return g_mapValues.value(id);
263 }
264
setValue(XOptions::ID id,QVariant vValue)265 void XOptions::setValue(XOptions::ID id, QVariant vValue)
266 {
267 if( (id==ID_STYLE)||
268 (id==ID_LANG)||
269 (id==ID_QSS)||
270 (id==ID_SEARCHSIGNATURESPATH)|| // TODO remove
271 (id==ID_STRUCTSPATH)) // TODO remove
272 {
273 QVariant vOld=g_mapValues.value(id);
274
275 if(vValue!=vOld)
276 {
277 g_bIsNeedRestart=true;
278 }
279 }
280
281 g_mapValues.insert(id,vValue);
282 }
283
clearValue(XOptions::ID id)284 void XOptions::clearValue(XOptions::ID id)
285 {
286 g_mapValues.insert(id,"");
287 }
288
idToString(ID id)289 QString XOptions::idToString(ID id)
290 {
291 QString sResult=QString("Unknown");
292
293 switch(id)
294 {
295 case ID_STAYONTOP: sResult=QString("StayOnTop"); break;
296 case ID_SCANAFTEROPEN: sResult=QString("ScanAfterOpen"); break;
297 case ID_RECURSIVESCAN: sResult=QString("RecursiveScan"); break;
298 case ID_DEEPSCAN: sResult=QString("DeepScan"); break;
299 case ID_HEURISTICSCAN: sResult=QString("HeuristicScan"); break;
300 case ID_SAVELASTDIRECTORY: sResult=QString("SaveLastDirectory"); break;
301 case ID_SAVERECENTFILES: sResult=QString("SaveRecentFiles"); break;
302 case ID_SAVEBACKUP: sResult=QString("SaveBackup"); break;
303 case ID_STYLE: sResult=QString("Style"); break;
304 case ID_LANG: sResult=QString("Lang"); break;
305 case ID_QSS: sResult=QString("Qss"); break;
306 case ID_DATABASEPATH: sResult=QString("DatabasePath"); break;
307 case ID_INFOPATH: sResult=QString("InfoPath"); break;
308 case ID_SCANENGINE: sResult=QString("ScanEngine"); break;
309 case ID_DISASMSYNTAX: sResult=QString("DisasmSyntax"); break;
310 case ID_ROOTPATH: sResult=QString("RootPath"); break;
311 case ID_DATAPATH: sResult=QString("DataPath"); break;
312 case ID_JSON: sResult=QString("Json"); break;
313 case ID_SINGLEAPPLICATION: sResult=QString("SingleApplication"); break;
314 case ID_SEARCHSIGNATURESPATH: sResult=QString("SearchSignaturesPath"); break;
315 case ID_STRUCTSPATH: sResult=QString("StructsPath"); break;
316 case ID_AUTHUSER: sResult=QString("AuthUser"); break;
317 case ID_AUTHTOKEN: sResult=QString("AuthToken"); break;
318 case ID_SHOWLOGO: sResult=QString("ShowLogo"); break;
319 case ID_NU_RECENTFILES: sResult=QString("RecentFiles"); break;
320 case ID_NU_LASTDIRECTORY: sResult=QString("LastDirectory"); break;
321 }
322
323 return sResult;
324 }
325
getLastDirectory()326 QString XOptions::getLastDirectory()
327 {
328 QString sResult;
329
330 bool bSaveLastDirectory=getValue(ID_SAVELASTDIRECTORY).toBool();
331 QString sLastDirectory=getValue(ID_NU_LASTDIRECTORY).toString();
332
333 if(bSaveLastDirectory&&(sLastDirectory!="")&&QDir().exists(sLastDirectory))
334 {
335 sResult=sLastDirectory;
336 }
337
338 return sResult;
339 }
340
setLastDirectory(QString sPathName)341 void XOptions::setLastDirectory(QString sPathName)
342 {
343 QFileInfo fi(sPathName);
344
345 if(fi.isFile())
346 {
347 sPathName=fi.absolutePath();
348 }
349 else if(fi.isDir())
350 {
351 sPathName=fi.absoluteFilePath();
352 }
353
354 if(getValue(ID_SAVELASTDIRECTORY).toBool())
355 {
356 setValue(ID_NU_LASTDIRECTORY,sPathName);
357 }
358 }
359
setLastFileName(QString sFileName)360 void XOptions::setLastFileName(QString sFileName)
361 {
362 QFileInfo fi(sFileName);
363
364 QString sDirectory;
365
366 if(fi.isFile())
367 {
368 sDirectory=fi.absolutePath();
369 }
370
371 if(getValue(ID_SAVELASTDIRECTORY).toBool())
372 {
373 setValue(ID_NU_LASTDIRECTORY,sDirectory);
374 }
375
376 if(getValue(ID_SAVERECENTFILES).toBool())
377 {
378 QString _sFileName=QString("\"%1\"").arg(fi.absoluteFilePath());
379
380 QList<QVariant> listFiles=getValue(ID_NU_RECENTFILES).toList();
381
382 listFiles.removeAll(_sFileName);
383
384 listFiles.append(QVariant(_sFileName));
385
386 if(listFiles.count()>N_MAX_RECENTFILES)
387 {
388 listFiles.removeLast();
389 }
390
391 g_mapValues.insert(ID_NU_RECENTFILES,listFiles);
392 }
393 }
394
clearRecentFiles()395 void XOptions::clearRecentFiles()
396 {
397 g_mapValues.insert(ID_NU_RECENTFILES,QList<QVariant>());
398 }
399
getRecentFiles()400 QList<QString> XOptions::getRecentFiles()
401 {
402 QList<QString> listResult;
403
404 QList<QVariant> listFiles=getValue(ID_NU_RECENTFILES).toList();
405
406 qint32 nNumberOfRecords=listFiles.size();
407
408 for(qint32 i=0;i<nNumberOfRecords;i++)
409 {
410 listResult.append(listFiles.at(i).toString());
411 }
412
413 return listResult;
414 }
415
getDatabasePath()416 QString XOptions::getDatabasePath()
417 {
418 return getValue(ID_DATABASEPATH).toString();
419 }
420
getInfoPath()421 QString XOptions::getInfoPath()
422 {
423 return getValue(ID_INFOPATH).toString();
424 }
425
getScanEngine()426 QString XOptions::getScanEngine()
427 {
428 return getValue(ID_SCANENGINE).toString();
429 }
430
getDisasmSyntax()431 QString XOptions::getDisasmSyntax()
432 {
433 return getValue(ID_DISASMSYNTAX).toString();
434 }
435
getRootPath()436 QString XOptions::getRootPath()
437 {
438 return getValue(ID_ROOTPATH).toString();
439 }
440
getDataPath()441 QString XOptions::getDataPath()
442 {
443 return getValue(ID_DATAPATH).toString();
444 }
445
getJson()446 QString XOptions::getJson()
447 {
448 return getValue(ID_JSON).toString();
449 }
450
getAuthUser()451 QString XOptions::getAuthUser()
452 {
453 return getValue(ID_AUTHUSER).toString();
454 }
455
getAuthToken()456 QString XOptions::getAuthToken()
457 {
458 return getValue(ID_AUTHTOKEN).toString();
459 }
460
461 #ifdef QT_GUI_LIB
adjustStayOnTop(QWidget * pWidget)462 void XOptions::adjustStayOnTop(QWidget *pWidget)
463 {
464 Qt::WindowFlags wf=pWidget->windowFlags();
465
466 if(isStayOnTop())
467 {
468 wf|=Qt::WindowStaysOnTopHint;
469 }
470 else
471 {
472 wf&=~(Qt::WindowStaysOnTopHint);
473 }
474
475 pWidget->setWindowFlags(wf);
476 pWidget->show();
477 }
478 #endif
479 #ifdef QT_GUI_LIB
setMonoFont(QWidget * pWidget,qint32 nSize)480 void XOptions::setMonoFont(QWidget *pWidget,qint32 nSize)
481 {
482 QFont font=pWidget->font();
483
484 #ifdef Q_OS_WIN
485 font.setFamily("Courier");
486 #endif
487 #ifdef Q_OS_LINUX
488 font.setFamily("Monospace"); // TODO Check
489 #endif
490 #ifdef Q_OS_OSX
491 font.setFamily("Menlo"); // TODO Check
492 #endif
493
494 if(nSize!=-1)
495 {
496 font.setPointSize(nSize);
497 }
498
499 pWidget->setFont(font);
500 }
501 #endif
502 #ifdef QT_GUI_LIB
setCheckBox(QCheckBox * pCheckBox,XOptions::ID id)503 void XOptions::setCheckBox(QCheckBox *pCheckBox, XOptions::ID id)
504 {
505 pCheckBox->setChecked(getValue(id).toBool());
506 }
507 #endif
508 #ifdef QT_GUI_LIB
getCheckBox(QCheckBox * pCheckBox,XOptions::ID id)509 void XOptions::getCheckBox(QCheckBox *pCheckBox, XOptions::ID id)
510 {
511 setValue(id,pCheckBox->isChecked());
512 }
513 #endif
514 #ifdef QT_GUI_LIB
setComboBox(QComboBox * pComboBox,XOptions::ID id)515 void XOptions::setComboBox(QComboBox *pComboBox, XOptions::ID id)
516 {
517 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
518 const QSignalBlocker signalBlocker(pComboBox);
519 #else
520 const bool bBlocked1=pComboBox->blockSignals(true);
521 #endif
522
523 pComboBox->clear();
524
525 QString sValue=getValue(id).toString();
526
527 if(id==ID_STYLE)
528 {
529 pComboBox->addItem("Default","");
530 QStringList listKeys=QStyleFactory::keys();
531
532 qint32 nNumberOfKeys=listKeys.count();
533
534 for(qint32 i=0;i<nNumberOfKeys;i++)
535 {
536 QString sRecord=listKeys.at(i);
537 pComboBox->addItem(sRecord,sRecord);
538 }
539 }
540 else if(id==ID_LANG)
541 {
542 pComboBox->addItem("English","");
543 pComboBox->addItem("System","System");
544
545 QList<QString> listFileNames=getAllFilesFromDirectory(getApplicationLangPath(),"*.qm");
546
547 qint32 nNumberOfRecords=listFileNames.count();
548
549 for(qint32 i=0;i<nNumberOfRecords;i++)
550 {
551 QFileInfo fi(listFileNames.at(i));
552
553 QString sRecord=fi.completeBaseName();
554
555 QLocale locale(sRecord.section("_",1,-1));
556 QString sLocale=locale.nativeLanguageName();
557
558 if(sRecord.count("_")==2)
559 {
560 sLocale+=QString("(%1)").arg(locale.nativeCountryName());
561 }
562
563 pComboBox->addItem(sLocale,sRecord);
564 }
565 }
566 else if(id==ID_QSS)
567 {
568 pComboBox->addItem("Default","");
569
570 QList<QString> listFileNames=getAllFilesFromDirectory(getApplicationQssPath(),"*.qss");
571
572 qint32 nNumberOfRecords=listFileNames.count();
573
574 for(qint32 i=0;i<nNumberOfRecords;i++)
575 {
576 QFileInfo fi(listFileNames.at(i));
577
578 QString sRecord=fi.completeBaseName();
579
580 pComboBox->addItem(sRecord,sRecord);
581 }
582 }
583 else if(id==ID_SCANENGINE)
584 {
585 pComboBox->addItem(QString("Auto"),"auto");
586 pComboBox->addItem(QString("Detect It Easy(DiE)"),"die");
587 pComboBox->addItem(QString("Nauz File Detector(NFD)"),"nfd");
588 }
589
590 qint32 nNumberOfItems=pComboBox->count();
591 qint32 nIndex=-1;
592
593 for(qint32 i=0;i<nNumberOfItems;i++)
594 {
595 if(sValue==pComboBox->itemData(i,Qt::UserRole))
596 {
597 nIndex=i;
598 }
599 }
600
601 if(nIndex!=-1)
602 {
603 pComboBox->setCurrentIndex(nIndex);
604 }
605
606 #if QT_VERSION < QT_VERSION_CHECK(5,3,0)
607 pComboBox->blockSignals(bBlocked1);
608 #endif
609 }
610 #endif
611 #ifdef QT_GUI_LIB
getComboBox(QComboBox * pComboBox,XOptions::ID id)612 void XOptions::getComboBox(QComboBox *pComboBox, XOptions::ID id)
613 {
614 setValue(id,pComboBox->currentData());
615 }
616 #endif
617 #ifdef QT_GUI_LIB
setLineEdit(QLineEdit * pLineEdit,XOptions::ID id)618 void XOptions::setLineEdit(QLineEdit *pLineEdit, XOptions::ID id)
619 {
620 pLineEdit->setText(getValue(id).toString());
621 }
622 #endif
623 #ifdef QT_GUI_LIB
getLineEdit(QLineEdit * pLineEdit,XOptions::ID id)624 void XOptions::getLineEdit(QLineEdit *pLineEdit, XOptions::ID id)
625 {
626 setValue(id,pLineEdit->text());
627 }
628 #endif
isSaveBackup()629 bool XOptions::isSaveBackup()
630 {
631 return getValue(XOptions::ID_SAVEBACKUP).toBool();
632 }
633
isSaveLastDirectory()634 bool XOptions::isSaveLastDirectory()
635 {
636 return getValue(XOptions::ID_SAVELASTDIRECTORY).toBool();
637 }
638
isSaveRecentFiles()639 bool XOptions::isSaveRecentFiles()
640 {
641 return getValue(XOptions::ID_SAVERECENTFILES).toBool();
642 }
643
isRestartNeeded()644 bool XOptions::isRestartNeeded()
645 {
646 return g_bIsNeedRestart;
647 }
648
isStayOnTop()649 bool XOptions::isStayOnTop()
650 {
651 return getValue(XOptions::ID_STAYONTOP).toBool();
652 }
653
isScanAfterOpen()654 bool XOptions::isScanAfterOpen()
655 {
656 return getValue(XOptions::ID_SCANAFTEROPEN).toBool();
657 }
658
isRecursiveScan()659 bool XOptions::isRecursiveScan()
660 {
661 return getValue(XOptions::ID_RECURSIVESCAN).toBool();
662 }
663
isDeepScan()664 bool XOptions::isDeepScan()
665 {
666 return getValue(XOptions::ID_DEEPSCAN).toBool();
667 }
668
isHeuristicScan()669 bool XOptions::isHeuristicScan()
670 {
671 return getValue(XOptions::ID_HEURISTICSCAN).toBool();
672 }
673
isSingleApplication()674 bool XOptions::isSingleApplication()
675 {
676 return getValue(XOptions::ID_SINGLEAPPLICATION).toBool();
677 }
678
isShowLogo()679 bool XOptions::isShowLogo()
680 {
681 return getValue(XOptions::ID_SHOWLOGO).toBool();
682 }
683
getSearchSignaturesPath()684 QString XOptions::getSearchSignaturesPath()
685 {
686 return getValue(XOptions::ID_SEARCHSIGNATURESPATH).toString();
687 }
688
getStructsPath()689 QString XOptions::getStructsPath()
690 {
691 return getValue(XOptions::ID_STRUCTSPATH).toString();
692 }
693 #ifdef QT_GUI_LIB
adjustApplicationView(QString sTranslationName,XOptions * pOptions)694 void XOptions::adjustApplicationView(QString sTranslationName, XOptions *pOptions)
695 {
696 QString sStyle=pOptions->getValue(XOptions::ID_STYLE).toString();
697
698 if(sStyle!="")
699 {
700 qApp->setStyle(QStyleFactory::create(sStyle));
701 }
702
703 QTranslator *pTranslator=new QTranslator; // Important
704 QString sLang=pOptions->getValue(XOptions::ID_LANG).toString();
705 QString sLangsPath=pOptions->getApplicationLangPath();
706
707 bool bLoad=false;
708
709 if(sLang=="System")
710 {
711 QLocale locale=QLocale::system();
712 if(locale!=QLocale::English)
713 {
714 bLoad=pTranslator->load(locale,sTranslationName,"_",sLangsPath,".qm");
715 }
716 }
717 else if(sLang!="")
718 {
719 bLoad=pTranslator->load(sLang,sLangsPath);
720 }
721
722 if(bLoad)
723 {
724 qApp->installTranslator(pTranslator);
725 }
726
727 QString sQss=pOptions->getValue(XOptions::ID_QSS).toString();
728
729 if(sQss!="")
730 {
731 QString sQssFileName=pOptions->getApplicationQssPath()+QDir::separator()+QString("%1.qss").arg(sQss);
732
733 if(QFile::exists(sQssFileName))
734 {
735 QFile file;
736 file.setFileName(sQssFileName);
737
738 if(file.open(QIODevice::ReadOnly))
739 {
740 QByteArray baQss=file.readAll();
741 qApp->setStyleSheet(baQss.data());
742 file.close();
743 }
744 }
745 }
746 }
747 #endif
748 #ifdef QT_GUI_LIB
adjustApplicationView(QString sApplicationFileName,QString sTranslationName)749 void XOptions::adjustApplicationView(QString sApplicationFileName,QString sTranslationName)
750 {
751 XOptions xOptions;
752
753 xOptions.setName(sApplicationFileName);
754
755 QList<XOptions::ID> listIDs;
756
757 listIDs.append(XOptions::ID_STYLE);
758 listIDs.append(XOptions::ID_LANG);
759 listIDs.append(XOptions::ID_QSS);
760
761 xOptions.setValueIDs(listIDs);
762 xOptions.load();
763
764 xOptions.adjustApplicationView(sTranslationName,&xOptions);
765 }
766 #endif
767 #ifdef QT_GUI_LIB
getMainWidget(QWidget * pWidget)768 QWidget *XOptions::getMainWidget(QWidget *pWidget)
769 {
770 QWidget *pResult=pWidget;
771
772 while(pResult->parent())
773 {
774 pResult=qobject_cast<QWidget *>(pResult->parent());
775 }
776
777 return pResult;
778 }
779 #endif
780 #ifdef QT_GUI_LIB
saveModel(QAbstractItemModel * pModel,QString sFileName)781 bool XOptions::saveModel(QAbstractItemModel *pModel,QString sFileName)
782 {
783 bool bResult=false;
784
785 QFile file;
786 file.setFileName(sFileName);
787
788 if(file.open(QIODevice::ReadWrite))
789 {
790 qint32 nNumberOfRows=pModel->rowCount();
791 qint32 nNumberOfColumns=pModel->columnCount();
792
793 QString sResult;
794
795 for(qint32 i=0;i<nNumberOfRows;i++)
796 {
797 for(qint32 j=0;j<nNumberOfColumns;j++)
798 {
799 QString sText=pModel->data(pModel->index(i,j)).toString();
800
801 if(j!=(nNumberOfColumns-1))
802 {
803 sResult+=QString("%1\t").arg(sText);
804 }
805 else
806 {
807 sResult+=QString("%1\r\n").arg(sText);
808 }
809 }
810 }
811
812 file.resize(0);
813 file.write(sResult.toLatin1().data());
814
815 file.close();
816
817 bResult=true;
818 }
819
820 return bResult;
821 }
822 #endif
823 #ifdef QT_GUI_LIB
saveTextEdit(QTextEdit * pTextEdit,QString sFileName)824 bool XOptions::saveTextEdit(QTextEdit *pTextEdit, QString sFileName)
825 {
826 bool bResult=false;
827
828 QFile file;
829 file.setFileName(sFileName);
830
831 if(file.open(QIODevice::ReadWrite))
832 {
833 QString sResult=pTextEdit->toPlainText();
834
835 file.resize(0);
836 file.write(sResult.toLatin1().data());
837
838 file.close();
839
840 bResult=true;
841 }
842
843 return bResult;
844 }
845 #endif
846 #ifdef QT_GUI_LIB
savePlainTextEdit(QPlainTextEdit * pPlainTextEdit,QString sFileName)847 bool XOptions::savePlainTextEdit(QPlainTextEdit *pPlainTextEdit, QString sFileName)
848 {
849 bool bResult=false;
850
851 QFile file;
852 file.setFileName(sFileName);
853
854 if(file.open(QIODevice::ReadWrite))
855 {
856 QString sResult=pPlainTextEdit->toPlainText();
857
858 file.resize(0);
859 file.write(sResult.toLatin1().data());
860
861 file.close();
862
863 bResult=true;
864 }
865
866 return bResult;
867 }
868 #endif
869 #ifdef QT_GUI_LIB
saveTableView(QTableView * pTableView,QString sFileName)870 bool XOptions::saveTableView(QTableView *pTableView, QString sFileName)
871 {
872 return saveModel(pTableView->model(),sFileName);
873 }
874 #endif
875 #ifdef QT_GUI_LIB
saveTableWidget(QTableWidget * pTableWidget,QString sFileName)876 bool XOptions::saveTableWidget(QTableWidget *pTableWidget, QString sFileName)
877 {
878 return saveModel(pTableWidget->model(),sFileName);
879 }
880 #endif
881 #ifdef QT_GUI_LIB
saveListView(QListView * pListView,QString sFileName)882 bool XOptions::saveListView(QListView *pListView, QString sFileName)
883 {
884 return saveModel(pListView->model(),sFileName);
885 }
886 #endif
887 #ifdef QT_GUI_LIB
saveListWidget(QListWidget * pListWidget,QString sFileName)888 bool XOptions::saveListWidget(QListWidget *pListWidget, QString sFileName)
889 {
890 return saveModel(pListWidget->model(),sFileName);
891 }
892 #endif
893 #ifdef QT_GUI_LIB
saveTreeView(QTreeView * pTreeView,QString sFileName)894 bool XOptions::saveTreeView(QTreeView *pTreeView, QString sFileName)
895 {
896 return saveModel(pTreeView->model(),sFileName);
897 }
898 #endif
899 #ifdef QT_GUI_LIB
saveTreeWidget(QTreeWidget * pTreeWidget,QString sFileName)900 bool XOptions::saveTreeWidget(QTreeWidget *pTreeWidget, QString sFileName)
901 {
902 return saveModel(pTreeWidget->model(),sFileName);
903 }
904 #endif
905 #ifdef QT_GUI_LIB
saveTextBrowser(QTextBrowser * pTextBrowser,QString sFileName)906 bool XOptions::saveTextBrowser(QTextBrowser *pTextBrowser, QString sFileName)
907 {
908 bool bResult=false;
909
910 QFile file;
911 file.setFileName(sFileName);
912
913 if(file.open(QIODevice::ReadWrite))
914 {
915 QString sResult=pTextBrowser->toPlainText();
916
917 file.resize(0);
918 file.write(sResult.toLatin1().data());
919
920 file.close();
921
922 bResult=true;
923 }
924
925 return bResult;
926 }
927 #endif
928 #ifdef QT_GUI_LIB
saveTextBrowserHtml(QTextBrowser * pTextBrowser,QString sFileName)929 bool XOptions::saveTextBrowserHtml(QTextBrowser *pTextBrowser, QString sFileName)
930 {
931 bool bResult=false;
932
933 QFile file;
934 file.setFileName(sFileName);
935
936 if(file.open(QIODevice::ReadWrite))
937 {
938 QString sResult=pTextBrowser->toHtml();
939
940 file.resize(0);
941 file.write(sResult.toLatin1().data());
942
943 file.close();
944
945 bResult=true;
946 }
947
948 return bResult;
949 }
950 #endif
getApplicationLangPath()951 QString XOptions::getApplicationLangPath()
952 {
953 QString sResult;
954
955 sResult=getApplicationDataPath()+QDir::separator()+"lang";
956
957 return sResult;
958 }
959
getApplicationQssPath()960 QString XOptions::getApplicationQssPath()
961 {
962 QString sResult;
963
964 sResult=getApplicationDataPath()+QDir::separator()+"qss";
965
966 return sResult;
967 }
968
getAllFilesFromDirectory(QString sDirectory,QString sExtension)969 QList<QString> XOptions::getAllFilesFromDirectory(QString sDirectory, QString sExtension)
970 {
971 QDir directory(sDirectory);
972
973 return directory.entryList(QStringList()<<sExtension,QDir::Files);
974 }
975
checkNative()976 bool XOptions::checkNative()
977 {
978 bool bResult=false;
979 #ifdef Q_OS_MAC
980 bResult=true;
981 #elif defined(Q_OS_LINUX)
982 QString sApplicationDirPath=qApp->applicationDirPath();
983
984 if( (sApplicationDirPath=="/bin")||
985 (sApplicationDirPath=="/usr/bin")||
986 (sApplicationDirPath=="/usr/local/bin")||
987 isAppImage())
988 {
989 bResult=true;
990 }
991 else
992 {
993 bResult=false;
994 }
995 #elif defined(Q_OS_WIN)
996 QString sApplicationDirPath=qApp->applicationDirPath();
997
998 if(sApplicationDirPath.contains("C:\\Program Files\\")||sApplicationDirPath.contains("C:\\Program Files (x86)\\"))
999 {
1000 bResult=true;
1001 }
1002 #endif
1003
1004 return bResult;
1005 }
1006
getApplicationDataPath()1007 QString XOptions::getApplicationDataPath()
1008 {
1009 QString sResult;
1010
1011 QString sApplicationDirPath=qApp->applicationDirPath();
1012
1013 #ifdef Q_OS_MAC
1014 sResult=sApplicationDirPath+"/../Resources";
1015 #elif defined(Q_OS_LINUX)
1016 if(g_bIsNative)
1017 {
1018 if(sApplicationDirPath.contains("/tmp/.mount_")) // AppImage
1019 {
1020 sResult=sApplicationDirPath.section("/",0,2);
1021 }
1022
1023 sResult+=QString("/usr/lib/%1").arg(qApp->applicationName());
1024 }
1025 else
1026 {
1027 sResult=sApplicationDirPath;
1028 }
1029 #else
1030 sResult=sApplicationDirPath;
1031 #endif
1032
1033 return sResult;
1034 }
1035
getTitle(QString sName,QString sVersion)1036 QString XOptions::getTitle(QString sName, QString sVersion)
1037 {
1038 QString sResult;
1039 #if QT_VERSION >= QT_VERSION_CHECK(5,4,0)
1040 sResult=QString("%1 v%2 [%3](%4)").arg(sName,sVersion,QSysInfo::prettyProductName(),QSysInfo::buildCpuArchitecture());
1041 #else
1042 sResult=QString("%1 v%2").arg(sName,sVersion); // TODO OS Name, For Windows Arch GetVersionExA
1043 #endif
1044
1045 return sResult;
1046 }
1047
1048 #ifdef Q_OS_WIN
registerContext(QString sApplicationName,QString sType,QString sApplicationFilePath)1049 bool XOptions::registerContext(QString sApplicationName, QString sType, QString sApplicationFilePath)
1050 {
1051 QSettings settings(QString("HKEY_CLASSES_ROOT\\%1\\shell\\%2\\command").arg(sType,sApplicationName),QSettings::NativeFormat);
1052 settings.setValue(".","\""+sApplicationFilePath.replace("/","\\")+"\" \"%1\"");
1053
1054 QSettings settingsIcon(QString("HKEY_CLASSES_ROOT\\%1\\shell\\%2").arg(sType,sApplicationName),QSettings::NativeFormat);
1055 settingsIcon.setValue("Icon","\""+sApplicationFilePath.replace("/","\\")+"\"");
1056
1057 // TODO Check if not send message
1058 return checkContext(sApplicationName,sType);
1059 }
1060 #endif
1061 #ifdef Q_OS_WIN
clearContext(QString sApplicationName,QString sType)1062 bool XOptions::clearContext(QString sApplicationName, QString sType)
1063 {
1064 QSettings settings(QString("HKEY_CLASSES_ROOT\\%1\\shell\\%2").arg(sType,sApplicationName),QSettings::NativeFormat);
1065 settings.clear();
1066
1067 // TODO Check if not send message
1068 return !(checkContext(sApplicationName,sType));
1069 }
1070 #endif
1071 #ifdef Q_OS_WIN
checkContext(QString sApplicationName,QString sType)1072 bool XOptions::checkContext(QString sApplicationName, QString sType)
1073 {
1074 QSettings settings(QString("HKEY_CLASSES_ROOT\\%1\\shell").arg(sType),QSettings::NativeFormat);
1075
1076 return (settings.value(QString("%1/command/Default").arg(sApplicationName)).toString()!="");
1077 }
1078 #endif
1079