1 #include <QIcon>
2 
3 #include "settings.h"
4 #include "imageformatsetup.h"
5 #include "imagewidget.h"
6 #include "qmc2main.h"
7 #include "options.h"
8 #include "macros.h"
9 #include "softwarelist.h"
10 #include "softwaresnapshot.h"
11 
12 extern MainWindow *qmc2MainWindow;
13 extern Settings *qmc2Config;
14 extern Options *qmc2Options;
15 extern SoftwareSnap *qmc2SoftwareSnap;
16 extern SoftwareSnapshot *qmc2SoftwareSnapshot;
17 
ImageFormatSetup(QWidget * parent)18 ImageFormatSetup::ImageFormatSetup(QWidget *parent)
19 	: QDialog(parent)
20 {
21 	setupUi(this);
22 	m_previousClassIndex = -1;
23 #if QT_VERSION < 0x050000
24 	treeWidget->header()->setMovable(false);
25 #else
26 	treeWidget->header()->setSectionsMovable(false);
27 #endif
28 	artworkClassPrefixes << "prv" << "fly" << "cab" << "ctl" << "mrq" << "ttl" << "pcb" << "sws";
29 	artworkClassNames << tr("Preview") << tr("Flyer") << tr("Cabinet") << tr("Controller") << tr("Marquee") << tr("Title") << tr("PCB") << tr("Software snap");
30 	artworkClassIcons << ":/data/img/camera.png" << ":/data/img/thumbnail.png" << ":/data/img/arcadecabinet.png" << ":/data/img/joystick.png" << ":/data/img/marquee.png" << ":/data/img/arcademode.png" << ":/data/img/circuit.png" << ":/data/img/pacman.png";
31 	qmc2Config->beginGroup("Artwork");
32 	foreach (QString name, qmc2Config->childGroups()) {
33 		QString nameCopy = name;
34 		artworkClassPrefixes << "aw:" + name;
35 		artworkClassNames << nameCopy.replace("&", QString());
36 		artworkClassIcons << qmc2Config->value(QString("%1/Icon").arg(name), QString()).toString();
37 	}
38 	qmc2Config->endGroup();
39 	restoreActiveFormats(true);
40 	connect(treeWidget->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));
41 }
42 
restoreActiveFormats(bool init)43 void ImageFormatSetup::restoreActiveFormats(bool init)
44 {
45 	foreach (QString fmt, m_activeFormats.keys())
46 		m_activeFormats[fmt].clear();
47 	m_activeFormats.clear();
48 	for (int i = 0; i < artworkClassPrefixes.count(); i++) {
49 		QStringList imgFmts;
50 		if ( artworkClassPrefixes[i].startsWith("aw:") )
51 			imgFmts = qmc2Config->value(QString("Artwork/%1/ActiveFormats").arg(artworkClassPrefixes[i].split(":")[1]), QStringList()).toStringList();
52 		else
53 			imgFmts = qmc2Config->value(QMC2_FRONTEND_PREFIX + QString("ActiveImageFormats/%1").arg(artworkClassPrefixes[i]), QStringList()).toStringList();
54 		if ( imgFmts.isEmpty() )
55 			m_activeFormats[artworkClassPrefixes[i]] << QMC2_IMAGE_FORMAT_INDEX_PNG;
56 		else for (int j = 0; j < imgFmts.count(); j++)
57 			m_activeFormats[artworkClassPrefixes[i]] << imgFmts[j].toInt();
58 		if ( init )
59 			comboBoxImageType->addItem(QIcon(artworkClassIcons[i]), artworkClassNames[i], artworkClassPrefixes[i]);
60 	}
61 }
62 
checkForModifications()63 void ImageFormatSetup::checkForModifications()
64 {
65 	bool modified = false;
66 	for (int i = 0; i < artworkClassPrefixes.count() && !modified; i++) {
67 		QList<int> storedFormats;
68 		QStringList imgFmts;
69 		if ( artworkClassPrefixes[i].startsWith("aw:") )
70 			imgFmts = qmc2Config->value(QString("Artwork/%1/ActiveFormats").arg(artworkClassPrefixes[i].split(":")[1]), QStringList()).toStringList();
71 		else
72 			imgFmts = qmc2Config->value(QMC2_FRONTEND_PREFIX + QString("ActiveImageFormats/%1").arg(artworkClassPrefixes[i]), QStringList()).toStringList();
73 		if ( imgFmts.isEmpty() )
74 			storedFormats << QMC2_IMAGE_FORMAT_INDEX_PNG;
75 		else for (int j = 0; j < imgFmts.count(); j++)
76 			storedFormats << imgFmts[j].toInt();
77 		modified = (m_activeFormats[artworkClassPrefixes[i]] != storedFormats);
78 	}
79 	pushButtonRestore->setEnabled(modified);
80 }
81 
rowsInserted(const QModelIndex &,int,int)82 void ImageFormatSetup::rowsInserted(const QModelIndex &, int, int)
83 {
84 	QString artworkClass = comboBoxImageType->itemData(comboBoxImageType->currentIndex()).toString();
85 	m_activeFormats[artworkClass].clear();
86 	for (int i = 0; i < treeWidget->topLevelItemCount(); i++) {
87 		QTreeWidgetItem *tlItem = treeWidget->topLevelItem(i);
88 		if ( tlItem->checkState(QMC2_IMGFMT_SETUP_COLUMN_ACT) == Qt::Checked )
89 			m_activeFormats[artworkClass] << ImageWidget::formatNames.indexOf(tlItem->text(QMC2_IMGFMT_SETUP_COLUMN_NAME));
90 	}
91 	QTimer::singleShot(0, this, SLOT(checkForModifications()));
92 }
93 
adjustIconSizes()94 void ImageFormatSetup::adjustIconSizes()
95 {
96 	QFont f;
97 	f.fromString(qmc2Config->value(QMC2_FRONTEND_PREFIX + "GUI/Font").toString());
98 	QFontMetrics fm(f);
99 	QSize iconSize = QSize(fm.height() - 2, fm.height() - 2);
100 	pushButtonOk->setIconSize(iconSize);
101 	pushButtonCancel->setIconSize(iconSize);
102 	pushButtonRestore->setIconSize(iconSize);
103 	comboBoxImageType->setIconSize(iconSize);
104 }
105 
on_pushButtonOk_clicked()106 void ImageFormatSetup::on_pushButtonOk_clicked()
107 {
108 	QString artworkClass = comboBoxImageType->itemData(comboBoxImageType->currentIndex()).toString();
109 	m_activeFormats[artworkClass].clear();
110 	for (int i = 0; i < treeWidget->topLevelItemCount(); i++) {
111 		QTreeWidgetItem *tlItem = treeWidget->topLevelItem(i);
112 		if ( tlItem->checkState(QMC2_IMGFMT_SETUP_COLUMN_ACT) == Qt::Checked )
113 			m_activeFormats[artworkClass] << ImageWidget::formatNames.indexOf(tlItem->text(QMC2_IMGFMT_SETUP_COLUMN_NAME));
114 	}
115 	QMapIterator<QString, QList<int> > it(m_activeFormats);
116 	while ( it.hasNext() ) {
117 		it.next();
118 		QStringList prioList;
119 		foreach (int format, it.value())
120 			prioList << QString::number(format);
121 		if ( it.key().startsWith("aw:") )
122 			qmc2Config->setValue(QString("Artwork/%1/ActiveFormats").arg(it.key().split(":")[1]), prioList);
123 		else
124 			qmc2Config->setValue(QMC2_FRONTEND_PREFIX + QString("ActiveImageFormats/%1").arg(it.key()), prioList);
125 	}
126 	ImageWidget::reloadArtworkFormats();
127 	// FIXME: begin: integrate this in ImageWidget::reloadArtworkFormats()
128 	if ( qmc2SoftwareSnap )
129 		qmc2SoftwareSnap->reloadActiveFormats();
130 	if ( qmc2SoftwareSnapshot )
131 		qmc2SoftwareSnapshot->reloadActiveFormats();
132 	// FIXME: end
133 	accept();
134 }
135 
on_pushButtonCancel_clicked()136 void ImageFormatSetup::on_pushButtonCancel_clicked()
137 {
138 	reject();
139 }
140 
on_pushButtonRestore_clicked()141 void ImageFormatSetup::on_pushButtonRestore_clicked()
142 {
143 	restoreActiveFormats();
144 	m_previousClassIndex = -1;
145 	on_comboBoxImageType_currentIndexChanged(comboBoxImageType->currentIndex());
146 	QTimer::singleShot(0, this, SLOT(checkForModifications()));
147 }
148 
on_comboBoxImageType_currentIndexChanged(int index)149 void ImageFormatSetup::on_comboBoxImageType_currentIndexChanged(int index)
150 {
151 	if ( m_previousClassIndex > -1 ) {
152 		QString previousArtworkClass = comboBoxImageType->itemData(m_previousClassIndex).toString();
153 		m_activeFormats[previousArtworkClass].clear();
154 		for (int i = 0; i < treeWidget->topLevelItemCount(); i++) {
155 			QTreeWidgetItem *tlItem = treeWidget->topLevelItem(i);
156 			if ( tlItem->checkState(QMC2_IMGFMT_SETUP_COLUMN_ACT) == Qt::Checked )
157 				m_activeFormats[previousArtworkClass] << ImageWidget::formatNames.indexOf(tlItem->text(QMC2_IMGFMT_SETUP_COLUMN_NAME));
158 		}
159 	}
160 
161 	treeWidget->clear();
162 
163 	QList<QTreeWidgetItem *> insertItems;
164 	QList<int> activeFormats = m_activeFormats[artworkClassPrefixes[index]];
165 	for (int i = 0; i < QMC2_IMAGE_FORMAT_COUNT; i++) {
166 		QTreeWidgetItem *item = new QTreeWidgetItem();
167 		item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
168 		item->setText(QMC2_IMGFMT_SETUP_COLUMN_NAME, ImageWidget::formatNames[i]);
169 		item->setText(QMC2_IMGFMT_SETUP_COLUMN_DESC, ImageWidget::formatDescriptions[i]);
170 		item->setText(QMC2_IMGFMT_SETUP_COLUMN_EXT, ImageWidget::formatExtensions[i]);
171 		if ( activeFormats.indexOf(i) < 0 ) {
172 			item->setText(QMC2_IMGFMT_SETUP_COLUMN_ACT, "(" + tr("deactivated") + ")");
173 			item->setCheckState(QMC2_IMGFMT_SETUP_COLUMN_ACT, Qt::Unchecked);
174 		} else {
175 			item->setText(QMC2_IMGFMT_SETUP_COLUMN_ACT, "(" + tr("activated") + ")");
176 			item->setCheckState(QMC2_IMGFMT_SETUP_COLUMN_ACT, Qt::Checked);
177 		}
178 		insertItems << item;
179 	}
180 
181 	int prio = 0;
182 	for (int i = 0; i < activeFormats.count(); i++) {
183 		bool found = false;
184 		int format = activeFormats[i];
185 		for (int j = 0; j < insertItems.count() && !found; j++) {
186 			if ( ImageWidget::formatNames.indexOf(insertItems[j]->text(QMC2_IMGFMT_SETUP_COLUMN_NAME)) == format ) {
187 				insertItems.insert(prio++, insertItems.takeAt(j));
188 				found = true;
189 			}
190 		}
191 	}
192 
193 	treeWidget->insertTopLevelItems(0, insertItems);
194 
195 	for (int i = 0; i < treeWidget->columnCount(); i++)
196 		treeWidget->resizeColumnToContents(i);
197 
198 	m_previousClassIndex = index;
199 }
200 
on_treeWidget_itemClicked(QTreeWidgetItem * item,int column)201 void ImageFormatSetup::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
202 {
203 	if ( column == QMC2_IMGFMT_SETUP_COLUMN_ACT ) {
204 		if ( item->text(QMC2_IMGFMT_SETUP_COLUMN_ACT) == "(" + tr("activated") + ")" ) {
205 			item->setText(QMC2_IMGFMT_SETUP_COLUMN_ACT, "(" + tr("deactivated") + ")");
206 			item->setCheckState(QMC2_IMGFMT_SETUP_COLUMN_ACT, Qt::Unchecked);
207 		} else {
208 			item->setText(QMC2_IMGFMT_SETUP_COLUMN_ACT, "(" + tr("activated") + ")");
209 			item->setCheckState(QMC2_IMGFMT_SETUP_COLUMN_ACT, Qt::Checked);
210 		}
211 		QString artworkClass = comboBoxImageType->itemData(comboBoxImageType->currentIndex()).toString();
212 		m_activeFormats[artworkClass].clear();
213 		for (int i = 0; i < treeWidget->topLevelItemCount(); i++) {
214 			QTreeWidgetItem *tlItem = treeWidget->topLevelItem(i);
215 			if ( tlItem->checkState(QMC2_IMGFMT_SETUP_COLUMN_ACT) == Qt::Checked )
216 				m_activeFormats[artworkClass] << ImageWidget::formatNames.indexOf(tlItem->text(QMC2_IMGFMT_SETUP_COLUMN_NAME));
217 		}
218 		QTimer::singleShot(0, this, SLOT(checkForModifications()));
219 	}
220 }
221 
showEvent(QShowEvent * e)222 void ImageFormatSetup::showEvent(QShowEvent *e)
223 {
224 	adjustIconSizes();
225 	restoreGeometry(qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/ImageFormatSetup/Geometry", QByteArray()).toByteArray());
226 	comboBoxImageType->setCurrentIndex(qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/ImageFormatSetup/ImageType", QMC2_IMAGE_FORMAT_INDEX_PNG).toInt());
227 
228 	if ( e )
229 		QDialog::showEvent(e);
230 }
231 
hideEvent(QHideEvent * e)232 void ImageFormatSetup::hideEvent(QHideEvent *e)
233 {
234 	qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/ImageFormatSetup/Geometry", saveGeometry());
235 	qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/ImageFormatSetup/ImageType", comboBoxImageType->currentIndex());
236 
237 	if ( e )
238 		QDialog::hideEvent(e);
239 }
240