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