1 #ifndef MACHINELIST_H
2 #define MACHINELIST_H
3 
4 #include <QtGui>
5 #include <QIcon>
6 #include <QTreeWidgetItem>
7 #include <QHash>
8 #include <QList>
9 
10 #include "xmldbmgr.h"
11 #include "userdatadbmgr.h"
12 #include "datinfodbmgr.h"
13 #include "iconcachedbmgr.h"
14 #include "machinelistdbmgr.h"
15 #include "macros.h"
16 
17 class MachineList : public QObject
18 {
19 	Q_OBJECT
20 
21 	public:
22 		int numTotalMachines;
23 		int numMachines;
24 		int numCorrectMachines;
25 		int numMostlyCorrectMachines;
26 		int numIncorrectMachines;
27 		int numNotFoundMachines;
28 		int numUnknownMachines;
29 		int numMatchedMachines;
30 		int numTaggedSets;
31 		int numVerifyRoms;
32 		int uncommittedXmlDbRows;
33 		bool verifyCurrentOnly;
34 		bool autoRomCheck;
35 		bool mergeCategories;
36 		bool dtdBufferReady;
37 		bool initialLoad;
38 		char oldRomState;
39 		QIcon qmc2UnknownImageIcon;
40 		QIcon qmc2UnknownBIOSImageIcon;
41 		QIcon qmc2UnknownDeviceImageIcon;
42 		QIcon qmc2CorrectImageIcon;
43 		QIcon qmc2CorrectBIOSImageIcon;
44 		QIcon qmc2CorrectDeviceImageIcon;
45 		QIcon qmc2MostlyCorrectImageIcon;
46 		QIcon qmc2MostlyCorrectBIOSImageIcon;
47 		QIcon qmc2MostlyCorrectDeviceImageIcon;
48 		QIcon qmc2IncorrectImageIcon;
49 		QIcon qmc2IncorrectBIOSImageIcon;
50 		QIcon qmc2IncorrectDeviceImageIcon;
51 		QIcon qmc2NotFoundImageIcon;
52 		QIcon qmc2NotFoundBIOSImageIcon;
53 		QIcon qmc2NotFoundDeviceImageIcon;
54 		QProcess *loadProc;
55 		QProcess *verifyProc;
56 		QTime loadTimer;
57 		QTime verifyTimer;
58 		QTime parseTimer;
59 		QTime miscTimer;
60 		QFile romStateCache;
61 		QFile machineListCache;
62 		QTextStream tsRomCache;
63 		QTextStream tsMachineListCache;
64 		QString emulatorType;
65 		QString emulatorVersion;
66 		QString verifyLastLine;
67 		QString xmlLineBuffer;
68 		QStringList emulatorIdentifiers;
69 		QStringList verifiedList;
70 		QHash<QString, QString> driverNameHash;
71 		QHash<QString, char> machineStatusHash;
72 		QHash<QString, QString *> categoryNames;
73 		QHash<QString, QString *> categoryHash;
74 		QHash<QString, QString *> versionNames;
75 		QHash<QString, QString *> versionHash;
76 		QHash<QString, bool> biosSets;
77 		QHash<QString, bool> deviceSets;
78 		QHash<QString, QStringList> hierarchyHash;
79 		QTreeWidgetItem *checkedItem;
80 
81 		static QStringList romTypeNames;
82 		static QStringList phraseTranslatorList;
83 		static QHash<QString, QString> reverseTranslations;
84 		static QHash<QString, QString> machineStateTranslations;
85 		static bool creatingCatView;
86 		static bool creatingVerView;
87 		static QString trQuestionMark;
88 		static QString trWaitingForData;
89 
90 		QString lookupDriverName(const QString &);
91 		QString romStatus(const QString &, bool translated = false);
92 		QString &status();
romState(const QString & systemName)93 		char romState(const QString &systemName) { char state = machineStatusHash.value(systemName); return (state == 0 ? 'U' : state); }
isBios(const QString & systemName)94 		bool isBios(const QString &systemName) { return biosSets.contains(systemName); }
isDevice(const QString & systemName)95 		bool isDevice(const QString &systemName) { return deviceSets.contains(systemName); }
rank(const QString & systemName)96 		int rank(const QString &systemName) { return userDataDb()->rank(systemName); }
comment(const QString systemName)97 		QString comment(const QString systemName) { return userDataDb()->comment(systemName); }
98 
99 		void reopenIconCacheDb();
100 		bool loadIcon(const QString &, QTreeWidgetItem *);
clearCategoryNames()101 		void clearCategoryNames() { qDeleteAll(categoryNames); categoryNames.clear(); }
clearVersionNames()102 		void clearVersionNames() { qDeleteAll(versionNames); versionNames.clear(); }
103 
104 		QString sortCriteriaName(int);
xmlDb()105 		XmlDatabaseManager *xmlDb() { return m_xmlDb; }
userDataDb()106 		UserDataDatabaseManager *userDataDb() { return m_userDataDb; }
datInfoDb()107 		DatInfoDatabaseManager *datInfoDb() { return m_datInfoDb; }
machineListDb()108 		MachineListDatabaseManager *machineListDb() { return m_machineListDb; }
iconCacheDb()109 		IconCacheDatabaseManager *iconCacheDb() { return m_iconCacheDb; }
110 
111 		MachineList(QObject *parent = 0);
112 		~MachineList();
113 
114 	public slots:
115 		void load();
116 		void verify(bool currentOnly = false);
117 		void loadCatverIni();
118 		void createVersionView();
119 		void loadCategoryIni();
120 		void createCategoryView();
121 		void loadFavorites();
122 		void saveFavorites();
123 		void loadPlayHistory();
124 		void savePlayHistory();
125 
126 		// process management
127 		void loadStarted();
128 		void loadFinished(int, QProcess::ExitStatus);
129 		void loadReadyReadStandardOutput();
130 		void verifyStarted();
131 		void verifyFinished(int, QProcess::ExitStatus);
132 		void verifyReadyReadStandardOutput();
133 
134 		// internal methods
135 		QString value(QString, QString, bool translate = false);
136 		void parse();
137 		void parseMachineDetail(QTreeWidgetItem *);
138 		void insertAttributeItems(QTreeWidgetItem *, QString, QStringList, QStringList, bool translate = false);
139 		void insertAttributeItems(QList<QTreeWidgetItem *> *itemList, QString element, QStringList attributes, QStringList descriptions, bool translate = false);
140 		void enableWidgets(bool enable = true);
disableWidgets()141 		void disableWidgets() { enableWidgets(false); }
142 		void filter(bool initial = false);
143 		void filterOne(QTreeWidgetItem *item, char romState);
144 
145 	signals:
146 		void widgetsEnabled(bool);
147 
148 	private:
149 		XmlDatabaseManager *m_xmlDb;
150 		UserDataDatabaseManager *m_userDataDb;
151 		DatInfoDatabaseManager *m_datInfoDb;
152 		MachineListDatabaseManager *m_machineListDb;
153 		IconCacheDatabaseManager *m_iconCacheDb;
154 		QString m_trL, m_trC, m_trM, m_trI, m_trN, m_trU, m_trS, m_trT;
155 		QString m_statusString, m_statusTemplate;
156 		bool m_showC, m_showM, m_showI, m_showN, m_showU;
157 		bool m_showDeviceSets, m_showBiosSets;
158 		bool m_doFilter;
159 };
160 
161 class MachineListItem : public QTreeWidgetItem
162 {
163 	public:
164 		static Qt::ItemFlags defaultItemFlags;
165 
QTreeWidgetItem(parentTreeWidget,QTreeWidgetItem::UserType)166 		MachineListItem(QTreeWidget *parentTreeWidget = 0) : QTreeWidgetItem(parentTreeWidget, QTreeWidgetItem::UserType) {}
MachineListItem(QTreeWidgetItem * parentItem)167 		MachineListItem(QTreeWidgetItem *parentItem) : QTreeWidgetItem(parentItem, QTreeWidgetItem::UserType) {}
168 
169 		virtual bool operator<(const QTreeWidgetItem &) const;
170 
id()171 		QString id() { return text(QMC2_MACHINELIST_COLUMN_NAME); }
name()172 		QString name() { return id(); }
description()173 		QString description() { return text(QMC2_MACHINELIST_COLUMN_MACHINE); }
manufacturer()174 		QString manufacturer() { return text(QMC2_MACHINELIST_COLUMN_MANU); }
year()175 		QString year() { return text(QMC2_MACHINELIST_COLUMN_YEAR); }
romTypes()176 		QString romTypes() { return text(QMC2_MACHINELIST_COLUMN_RTYPES); }
driverStatus()177 		QString driverStatus() { return text(QMC2_MACHINELIST_COLUMN_DRVSTAT); }
sourceFile()178 		QString sourceFile() { return text(QMC2_MACHINELIST_COLUMN_SRCFILE); }
category()179 		QString category() { return text(QMC2_MACHINELIST_COLUMN_CATEGORY); }
version()180 		QString version() { return text(QMC2_MACHINELIST_COLUMN_VERSION); }
machineIcon()181 		QIcon machineIcon() { return icon(QMC2_MACHINELIST_COLUMN_MACHINE); }
players()182 		int players() { bool ok; int p = text(QMC2_MACHINELIST_COLUMN_PLAYERS).toInt(&ok); return ok ? p : -1; }
rank()183 		int rank() { return whatsThis(QMC2_MACHINELIST_COLUMN_RANK).toInt(); }
isParent()184 		bool isParent() { return parentId().isEmpty(); }
isClone()185 		bool isClone() { return !isParent(); }
tagged()186 		bool tagged() { return checkState(QMC2_MACHINELIST_COLUMN_TAG) == Qt::Checked; }
187 		bool isBios();
188 		bool isDevice();
189 		char romStatus();
190 		QString parentId();
191 };
192 
193 #endif
194