1 #include <QFile>
2 #include <QSettings>
3 #include "lthemeengine.h"
4 #include "qsseditordialog.h"
5 #include "ui_qsseditordialog.h"
6
7 #include <QTemporaryFile>
8 #include <QTextStream>
9
10 #include <LuminaXDG.h>
11 #include <LUtils.h>
12
QSSEditorDialog(const QString & filePath,QWidget * parent)13 QSSEditorDialog::QSSEditorDialog(const QString &filePath, QWidget *parent) : QDialog(parent), m_ui(new Ui::QSSEditorDialog){
14 m_ui->setupUi(this);
15 m_filePath = filePath;
16 QFile file(filePath);
17 file.open(QIODevice::ReadOnly);
18 m_ui->textEdit->setPlainText(QString::fromUtf8(file.readAll()));
19 setWindowTitle(tr("%1 - Style Sheet Editor").arg(file.fileName()));
20 QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
21 restoreGeometry(settings.value("QSSEditor/geometry").toByteArray());
22 //Generate the list of standard colors for the user to pick
23 QStringList colors;
24 colors << tr("base (alternate)")+"::::alternate-base"
25 << tr("base")+"::::base"
26 << tr("text (bright)")+"::::bright-text"
27 << tr("button")+"::::button"
28 << tr("text (button)")+"::::button-text"
29 << tr("dark")+"::::dark"
30 << tr("highlight")+"::::highlight"
31 << tr("text (highlight)")+"::::highlighted-text"
32 << tr("light")+"::::light"
33 << tr("link")+"::::link"
34 << tr("link (visited)")+"::::link-visited"
35 << tr("mid")+"::::mid"
36 << tr("midlight")+"::::midlight"
37 << tr("shadow")+"::::shadow"
38 << tr("text")+"::::text"
39 << tr("window")+"::::window"
40 << tr("text (window)")+"::::window-text";
41 colors.sort(); //sort by translated display name
42 colorMenu = new QMenu(m_ui->tool_color);
43 for(int i=0; i<colors.length(); i++){ colorMenu->addAction( colors[i].section("::::",0,0) )->setWhatsThis(colors[i].section("::::",1,1) ); }
44 m_ui->tool_color->setMenu(colorMenu);
45 connect(colorMenu, SIGNAL(triggered(QAction*)), this, SLOT(colorPicked(QAction*)) );
46 validateTimer = new QTimer(this);
47 validateTimer->setInterval(500); //1/2 second after finish typing
48 validateTimer->setSingleShot(true);
49 connect(validateTimer, SIGNAL(timeout()), this, SLOT(validateStyleSheet()) );
50 connect(m_ui->textEdit, SIGNAL(textChanged()), validateTimer, SLOT(start()) );
51 }
52
~QSSEditorDialog()53 QSSEditorDialog::~QSSEditorDialog(){
54 delete m_ui;
55 }
56
save()57 void QSSEditorDialog::save(){
58 QFile file(m_filePath);
59 file.open(QIODevice::WriteOnly);
60 file.write(m_ui->textEdit->toPlainText().toUtf8());
61 }
62
hideEvent(QHideEvent *)63 void QSSEditorDialog::hideEvent(QHideEvent *){
64 QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
65 settings.setValue("QSSEditor/geometry", saveGeometry());
66 }
67
on_buttonBox_clicked(QAbstractButton * button)68 void QSSEditorDialog::on_buttonBox_clicked(QAbstractButton *button){
69 QDialogButtonBox::StandardButton id = m_ui->buttonBox->standardButton(button);
70 if(id == QDialogButtonBox::Ok){
71 save();
72 accept();
73 }
74 else if(id == QDialogButtonBox::Save){ save(); }
75 else{ reject(); }
76 }
77
colorPicked(QAction * act)78 void QSSEditorDialog::colorPicked(QAction* act){
79 QString id = act->whatsThis();
80 if(id.isEmpty()){ return; }
81 m_ui->textEdit->insertPlainText( QString("palette(%1)").arg(id) );
82 }
83
isStyleSheetValid(const QString & styleSheet)84 bool QSSEditorDialog::isStyleSheetValid(const QString &styleSheet){
85 QTemporaryFile tempfile;
86 if(tempfile.open()){
87 QTextStream out(&tempfile);
88 out << styleSheet;
89 out.flush();
90 tempfile.close();
91 }
92 QStringList log = LUtils::getCmdOutput("lthemeengine-sstest", QStringList() << tempfile.fileName());
93 qDebug() << "Got Validation Log:" << log;
94 return log.join("").simplified().isEmpty();
95 }
96
validateStyleSheet()97 void QSSEditorDialog::validateStyleSheet(){
98 qDebug() << "Validating StyleSheet:";
99 bool ok = isStyleSheetValid(m_ui->textEdit->toPlainText());
100
101 //Now update the button/label as needed
102 int sz = this->fontMetrics().height();
103 if(ok){
104 m_ui->label_status_icon->setPixmap(LXDG::findIcon("dialog-ok","").pixmap(sz,sz) );
105 m_ui->label_status_icon->setToolTip(tr("Valid StyleSheet"));
106 }else{
107 m_ui->label_status_icon->setPixmap(LXDG::findIcon("dialog-cancel","").pixmap(sz,sz) );
108 m_ui->label_status_icon->setToolTip(tr("Invalid StyleSheet"));
109 }
110 }
111