1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Robert Bieber
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "projectmodel.h"
23 #include "configdocument.h"
24 #include "ui_configdocument.h"
25 #include "preferencesdialog.h"
27 #include <QMessageBox>
30 #include <QFileDialog>
33 ConfigDocument::ConfigDocument(QMap
<QString
, QString
>& settings
, QString file
,
36 ui(new Ui::ConfigDocument
),
37 filePath(file
), block(false)
40 editor
= new CodeEditor(this);
41 editor
->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded
);
42 editor
->setLineWrapMode(CodeEditor::NoWrap
);
43 ui
->splitter
->addWidget(editor
);
45 QObject::connect(editor
, SIGNAL(textChanged()),
46 this, SLOT(textChanged()));
48 /* Loading the splitter status */
49 QSettings appSettings
;
50 appSettings
.beginGroup("ConfigDocument");
52 if(!appSettings
.value("textVisible", true).toBool())
54 editor
->setVisible(false);
55 ui
->textButton
->setChecked(false);
59 ui
->textButton
->setChecked(true);
61 if(!appSettings
.value("linesVisible", false).toBool())
63 ui
->scrollArea
->setVisible(false);
64 ui
->linesButton
->setChecked(false);
68 ui
->linesButton
->setChecked(true);
71 if(!appSettings
.value("splitter", QByteArray()).toByteArray().isNull())
72 ui
->splitter
->restoreState(appSettings
.value("splitter").toByteArray());
74 appSettings
.endGroup();
76 /* Populating the known keys list */
77 QFile
fin(":/resources/configkeys");
78 fin
.open(QFile::ReadOnly
);
80 QStringList
* container
= &primaryKeys
;
83 QString current
= QString(fin
.readLine());
85 container
= &secondaryKeys
;
86 else if(current
!= "\n")
87 container
->append(current
.trimmed());
90 /* Loading the text file */
91 QFile
finT(settings
.value("configfile", ""));
92 if(finT
.open(QFile::Text
| QFile::ReadOnly
))
94 editor
->setPlainText(QString(finT
.readAll()));
98 saved
= toPlainText();
100 QObject::connect(ui
->addKeyButton
, SIGNAL(pressed()),
101 this, SLOT(addClicked()));
103 QObject::connect(ui
->linesButton
, SIGNAL(toggled(bool)),
104 this, SLOT(buttonChecked()));
105 QObject::connect(ui
->textButton
, SIGNAL(toggled(bool)),
106 this, SLOT(buttonChecked()));
111 ConfigDocument::~ConfigDocument()
114 editor
->deleteLater();
117 void ConfigDocument::changeEvent(QEvent
*e
)
119 QWidget::changeEvent(e
);
121 case QEvent::LanguageChange
:
122 ui
->retranslateUi(this);
129 QString
ConfigDocument::title() const
131 QStringList decompose
= filePath
.split("/");
132 return decompose
.last();
135 void ConfigDocument::save()
137 QFile
fout(filePath
);
145 fout
.open(QFile::WriteOnly
);
146 fout
.write(toPlainText().toAscii());
149 saved
= toPlainText();
150 emit
titleChanged(title());
151 emit
configFileChanged(file());
154 void ConfigDocument::saveAs()
156 /* Determining the directory to open */
157 QString directory
= filePath
;
160 settings
.beginGroup("ProjectModel");
162 directory
= settings
.value("defaultDirectory", "").toString();
164 filePath
= QFileDialog::getSaveFileName(this, tr("Save Document"),
166 ProjectModel::fileFilter());
167 directory
= filePath
;
171 directory
.chop(filePath
.length() - filePath
.lastIndexOf('/') - 1);
172 settings
.setValue("defaultDirectory", directory
);
175 QFile
fout(filePath
);
176 fout
.open(QFile::WriteOnly
);
177 fout
.write(toPlainText().toAscii());
180 saved
= toPlainText();
181 emit
titleChanged(title());
182 emit
configFileChanged(file());
186 bool ConfigDocument::requestClose()
188 if(toPlainText() != saved
)
190 /* Spawning the "Are you sure?" dialog */
191 QMessageBox
confirm(this);
192 confirm
.setWindowTitle(tr("Confirm Close"));
193 confirm
.setText(title() + tr(" has been modified."));
194 confirm
.setInformativeText(tr("Do you want to save your changes?"));
195 confirm
.setStandardButtons(QMessageBox::Save
| QMessageBox::Discard
196 | QMessageBox::Cancel
);
197 confirm
.setDefaultButton(QMessageBox::Save
);
198 int confirmation
= confirm
.exec();
202 case QMessageBox::Save
:
204 /* After calling save, make sure the user actually went through */
205 if(toPlainText() != saved
)
210 case QMessageBox::Discard
:
213 case QMessageBox::Cancel
:
220 QString
ConfigDocument::toPlainText() const
222 return editor
->toPlainText();
225 void ConfigDocument::syncFromBoxes()
233 for(int i
= 0; i
< keys
.count(); i
++)
235 buffer
+= keys
[i
]->currentText();
237 buffer
+= values
[i
]->text();
241 editor
->setPlainText(buffer
);
244 void ConfigDocument::syncFromText()
251 QStringList lines
= editor
->toPlainText().split("\n");
252 QList
<QPair
<QString
, QString
> > splits
;
253 for(int i
= 0; i
< lines
.count(); i
++)
255 QString line
= lines
[i
];
256 QStringList split
= line
.split(":");
257 if(split
.count() != 2)
260 splits
.append(QPair
<QString
, QString
>(split
[0].trimmed(),
261 split
[1].trimmed()));
264 while(deleteButtons
.count() > splits
.count())
266 deleteButtons
[0]->deleteLater();
267 keys
[0]->deleteLater();
268 values
[0]->deleteLater();
269 containers
[0]->deleteLater();
270 labels
[0]->deleteLater();
272 deleteButtons
.removeAt(0);
275 containers
.removeAt(0);
279 int initialCount
= deleteButtons
.count();
280 for(int i
= 0; i
< splits
.count(); i
++)
282 if(i
>= initialCount
)
284 addRow(splits
[i
].first
, splits
[i
].second
);
288 int index
= keys
[i
]->findText(splits
[i
].first
);
290 keys
[i
]->setCurrentIndex(index
);
292 keys
[i
]->setEditText(splits
[i
].first
);
293 values
[i
]->setText(splits
[i
].second
);
298 void ConfigDocument::addRow(QString key
, QString value
)
300 QHBoxLayout
* layout
= new QHBoxLayout();
301 NoScrollCombo
* keyEdit
= new NoScrollCombo(this);
302 QLineEdit
* valueEdit
= new QLineEdit(value
, this);
303 QPushButton
* delButton
= new QPushButton(tr("-"), this);
304 QLabel
* label
= new QLabel(":");
306 /* Loading the combo box options */
307 keyEdit
->setInsertPolicy(QComboBox::InsertAlphabetically
);
308 keyEdit
->setEditable(true);
309 keyEdit
->addItems(primaryKeys
);
310 keyEdit
->insertSeparator(keyEdit
->count());
311 keyEdit
->addItems(secondaryKeys
);
312 if(keyEdit
->findText(key
) != -1)
313 keyEdit
->setCurrentIndex(keyEdit
->findText(key
));
315 keyEdit
->setEditText(key
);
318 layout
->addWidget(keyEdit
);
319 layout
->addWidget(label
);
320 layout
->addWidget(valueEdit
);
321 layout
->addWidget(delButton
);
323 delButton
->setSizePolicy(QSizePolicy::Maximum
, QSizePolicy::Fixed
);
324 delButton
->setMaximumWidth(35);
326 QObject::connect(delButton
, SIGNAL(clicked()),
327 this, SLOT(deleteClicked()));
328 QObject::connect(keyEdit
, SIGNAL(currentIndexChanged(QString
)),
329 this, SLOT(boxesChanged()));
330 QObject::connect(keyEdit
, SIGNAL(textChanged(QString
)),
331 this, SLOT(boxesChanged()));
332 QObject::connect(valueEdit
, SIGNAL(textChanged(QString
)),
333 this, SLOT(boxesChanged()));
335 ui
->configBoxes
->addLayout(layout
);
337 containers
.append(layout
);
338 keys
.append(keyEdit
);
339 values
.append(valueEdit
);
340 deleteButtons
.append(delButton
);
341 labels
.append(label
);
345 void ConfigDocument::deleteClicked()
347 QPushButton
* button
= dynamic_cast<QPushButton
*>(sender());
348 int row
= deleteButtons
.indexOf(button
);
350 deleteButtons
[row
]->deleteLater();
351 keys
[row
]->deleteLater();
352 values
[row
]->deleteLater();
353 containers
[row
]->deleteLater();
354 labels
[row
]->deleteLater();
356 deleteButtons
.removeAt(row
);
358 values
.removeAt(row
);
359 containers
.removeAt(row
);
360 labels
.removeAt(row
);
362 if(saved
!= toPlainText())
363 emit
titleChanged(title() + "*");
365 emit
titleChanged(title());
368 void ConfigDocument::addClicked()
370 addRow(tr("Key"), tr("Value"));
373 void ConfigDocument::boxesChanged()
379 void ConfigDocument::textChanged()
385 void ConfigDocument::contentsChanged()
387 if(toPlainText() != saved
)
388 emit
titleChanged(title() + "*");
390 emit
titleChanged(title());
393 void ConfigDocument::buttonChecked()
395 editor
->setVisible(ui
->textButton
->isChecked());
396 ui
->scrollArea
->setVisible(ui
->linesButton
->isChecked());
399 settings
.beginGroup("ConfigDocument");
400 settings
.setValue("textVisible", ui
->textButton
->isChecked());
401 settings
.setValue("linesVisible", ui
->linesButton
->isChecked());
405 void ConfigDocument::connectPrefs(PreferencesDialog
*prefs
)
407 QObject::connect(prefs
, SIGNAL(accepted()),
408 this, SLOT(settingsChanged()));
412 void ConfigDocument::settingsChanged()
414 /* Setting the editor colors */
416 settings
.beginGroup("SkinDocument");
418 QColor fg
= settings
.value("fgColor", Qt::black
).value
<QColor
>();
419 QColor bg
= settings
.value("bgColor", Qt::white
).value
<QColor
>();
421 palette
.setColor(QPalette::All
, QPalette::Base
, bg
);
422 palette
.setColor(QPalette::All
, QPalette::Text
, fg
);
423 editor
->setPalette(palette
);
425 QColor highlight
= settings
.value("errorColor", Qt::red
).value
<QColor
>();
426 editor
->setErrorColor(highlight
);
428 /* Setting the font */
429 QFont
def("Monospace");
430 def
.setStyleHint(QFont::TypeWriter
);
431 QFont family
= settings
.value("fontFamily", def
).value
<QFont
>();
432 family
.setPointSize(settings
.value("fontSize", 12).toInt());
433 editor
->setFont(family
);