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