aboutsummaryrefslogtreecommitdiff
path: root/desktop-editor/dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-editor/dialog.cpp')
-rw-r--r--desktop-editor/dialog.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/desktop-editor/dialog.cpp b/desktop-editor/dialog.cpp
new file mode 100644
index 00000000..4b4d066a
--- /dev/null
+++ b/desktop-editor/dialog.cpp
@@ -0,0 +1,199 @@
+#include "dialog.h"
+#include "ui_dialog.h"
+#include <QFileDialog>
+#include <QRegExp>
+#include <QTemporaryFile>
+#include <QMessageBox>
+#include "LuminaUtils.h"
+
+Dialog::Dialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::Dialog)
+{
+ ui->setupUi(this);
+ desktopType="application"; //default value
+}
+
+
+Dialog::~Dialog()
+{
+ delete ui;
+}
+
+//Inform the user that required input parameters are missing
+void Dialog::MissingInputs()
+{
+ qDebug() << "We cannot continue without a desktop file !!!";
+ QMessageBox::critical(this, tr("Error"), tr("The application requires inputs: <-application>|<-link> desktopfile") );
+ exit(1);
+}
+
+
+//Initialise the layout of the screen.
+void Dialog::Initialise(QString param)
+{
+ //"application" is the default layout.
+
+ //in case of "link", several objects are no required
+ if (param.startsWith("-link")) {
+ ui->cbRunInTerminal->setVisible(false);
+ ui->cbStartupNotification->setVisible(false);
+ ui->lCommand->setVisible(false);
+ ui->pbCommand->setVisible(false);
+ ui->label_3->setVisible(false);
+ ui->label_6->setVisible(false);
+ ui->label_4->setText("URL"); //we use the WorkingDir boxes for URL
+ desktopType="link";
+ }
+}
+
+//load the desktop file or the required template
+void Dialog::LoadDesktopFile(QString input)
+{
+ //if we have "-" as 1st char, it means that this is not a desktop file, but a parameter
+ desktopFileName = input;
+ if (input.startsWith("-")) {
+ QMessageBox::critical(this,tr("Error"),tr("The filename cannot start with a \"-\"."));
+ exit(1);
+ }
+
+ //if proposed file does not exist, than we will create one based on the templates
+ //TODO: have a config directory to store templates
+ if (!QFile::exists(input)) {
+ if (desktopType=="link") { QFile::copy("./desktop-link.template", desktopFileName);}
+ else { QFile::copy("./desktop-app.template", desktopFileName);}
+ }
+
+ //use the standard LXDG object and load the desktop file
+ bool ok = false;
+ DF = LXDG::loadDesktopFile(desktopFileName, ok);
+ if( ok ) {
+ ui->lName->setText(DF.name);
+ ui->lComment->setText(DF.comment);
+ ui->lCommand->setText(DF.exec);
+ //in case of "link" desktop, we populate the correct content in lWorkingDir
+ if (desktopType=="link") {
+ ui->lWorkingDir->setText(DF.url);
+ } else {
+ ui->lWorkingDir->setText(DF.path);
+ }
+ if (DF.startupNotify) ui->cbStartupNotification->setChecked(true); else ui->cbStartupNotification->setChecked(false);
+ if (DF.useTerminal) ui->cbRunInTerminal->setChecked(true); else ui->cbRunInTerminal->setChecked(false);
+ iconFileName="";
+ ui->pbIcon->setIcon(QPixmap(DF.icon));
+ } else {
+ QMessageBox::critical(this, tr("Error"), tr("Problem to read the desktop file called:") + desktopFileName );
+ exit(1);
+ }
+}
+
+
+void Dialog::on_pbCommand_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open command"), "~", tr("All Files (*)"));
+ ui->lCommand->setText(fileName);
+}
+
+
+void Dialog::on_pbWorkingDir_clicked()
+{
+ QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
+ QString directory = QFileDialog::getExistingDirectory(this,
+ tr("Working Directory"),
+ ui->lWorkingDir->text(),
+ options);
+ ui->lWorkingDir->setText(directory);
+}
+
+//this function is just like a regexp.
+//we just change the required lines and we don't touch to the rest of the file and copy it back.
+void textReplace(QString &origin, QString from, QString to, QString topic)
+{
+ if (!from.isEmpty()) {
+ //TODO RegExp with ^ to detect begining of the line is not working
+ origin.replace(QRegExp("\n" + topic + "\\s*=\\s*" + from + "\n",Qt::CaseInsensitive),"\n" + topic + "=" + to + "\n");
+ } else {
+ //TODO: check if last char in \n. If not add it
+ origin.append(topic + "=" + to + "\n");
+ }
+}
+
+//we save the changes to the destination file
+void Dialog::on_pbApply_clicked()
+{
+
+ QByteArray fileData;
+ QFile file(desktopFileName);
+ if (file.open(QFile::ReadWrite)) {
+ QString from,to;
+ fileData = file.readAll();
+ QString text(fileData);
+
+ QString desktopTypeVal="Application";
+ if (DF.type == XDGDesktop::APP) { desktopTypeVal="Application"; }
+ else if (DF.type == XDGDesktop::LINK) { desktopTypeVal="Link"; }
+ else if (DF.type == XDGDesktop::DIR) { desktopTypeVal="Dir"; }
+ textReplace(text, desktopTypeVal, desktopType, "Type");
+
+ if (ui->lName->isModified()) { textReplace(text, DF.name, ui->lName->text(), "Name");}
+ if (ui->lComment->isModified()) { textReplace(text, DF.comment, ui->lComment->text(), "Comment");}
+ if (ui->lCommand->isModified()) { textReplace(text, DF.exec, ui->lCommand->text(),"Exec");}
+ if (desktopType=="link") {
+ //incase of "link" layout WorkingDir is corresponding to the URL
+ if (ui->lWorkingDir->isModified()) { textReplace(text, DF.url, ui->lWorkingDir->text(),"URL");}
+ } else {
+ if (ui->lWorkingDir->isModified()) { textReplace(text, DF.path, ui->lWorkingDir->text(),"Path");}
+ }
+ if (ui->cbStartupNotification->isChecked() != DF.startupNotify) {
+ if (DF.startupNotify) {from="true"; to="false";} else {from="false"; to="true";}
+ textReplace(text, from, to,"StartupNotify");
+ }
+ if (ui->cbRunInTerminal->isChecked() != DF.useTerminal) {
+ if (DF.useTerminal) {from="true"; to="false";} else {from="false"; to="true";}
+ textReplace(text, from, to,"Terminal");
+ }
+ if (!iconFileName.isEmpty()) {
+ from=DF.icon;
+ to=iconFileName;
+ textReplace(text, from, to,"Icon");
+ }
+
+ file.seek(0);
+ file.write(text.toUtf8());
+
+ file.resize(file.pos());//remove possible trailing lines
+
+ file.close();
+
+ //hack required to update the icon on the desktop
+ //maybe the solution would be to have a QFileSystemWatcher (in AppLauncherPlugin.cpp)
+ //on files instead of ~/Desktop
+ QTemporaryFile tempFile ;
+ tempFile.setAutoRemove(false);
+ tempFile.open();
+ tempFile.close();
+ qDebug() << "temp file:" << tempFile.fileName();
+
+ //TODO: capture errors
+ QString cmd = "mv";
+ cmd = cmd + " " + desktopFileName + " " + tempFile.fileName();
+ qDebug() << "cmd:" << cmd;
+ int ret = LUtils::runCmd(cmd);
+
+ cmd = "mv";
+ cmd = cmd + " " + tempFile.fileName() + " " + desktopFileName;
+ qDebug() << "cmd:" << cmd;
+ ret = LUtils::runCmd(cmd);
+ }
+}
+
+
+void Dialog::on_pbIcon_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open command"), "~", tr("Image Files (*.png *.jpg *.bmp)"));
+ qDebug() << "icon:" << fileName;
+ ui->pbIcon->setIcon(QPixmap(fileName));
+ iconFileName=fileName;
+}
bgstack15