aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Moore <moorekou@gmail.com>2015-04-21 00:12:51 -0400
committerKen Moore <moorekou@gmail.com>2015-04-21 00:12:51 -0400
commit6729dcd0cdafe09b061f9d7b36648388bbae4534 (patch)
tree7605ac7551ec061013e60aa9a73cc9380ebe3c9b
parentMake sure to check the list of watched files and reset it if something was re... (diff)
parenttest the return code of the command to mv file to refresh the icon. (diff)
downloadlumina-6729dcd0cdafe09b061f9d7b36648388bbae4534.tar.gz
lumina-6729dcd0cdafe09b061f9d7b36648388bbae4534.tar.bz2
lumina-6729dcd0cdafe09b061f9d7b36648388bbae4534.zip
Merge pull request #92 from william-os4y/deskEditor
I propose you the lumina-fileinfo
-rw-r--r--lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp11
-rw-r--r--lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h1
-rw-r--r--lumina-fileinfo/defaults/fileinfo-app.template11
-rw-r--r--lumina-fileinfo/defaults/fileinfo-link.template7
-rw-r--r--lumina-fileinfo/dialog.cpp359
-rw-r--r--lumina-fileinfo/dialog.h48
-rw-r--r--lumina-fileinfo/dialog.ui226
-rw-r--r--lumina-fileinfo/lumina-fileinfo.desktop10
-rw-r--r--lumina-fileinfo/lumina-fileinfo.pro40
-rw-r--r--lumina-fileinfo/lumina-fileinfo.qrc6
-rw-r--r--lumina-fileinfo/main.cpp20
-rw-r--r--lumina.pro3
12 files changed, 740 insertions, 2 deletions
diff --git a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp
index 273f1958..f8e85cea 100644
--- a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp
+++ b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp
@@ -37,6 +37,8 @@ DesktopViewPlugin::DesktopViewPlugin(QWidget* parent, QString ID) : LDPlugin(par
menu->addAction( LXDG::findIcon("zoom-out",""), tr("Decrease Icons"), this, SLOT(decreaseIconSize()) );
menu->addSeparator();
menu->addAction( LXDG::findIcon("edit-delete",""), tr("Delete"), this, SLOT(deleteItems()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("system-search",""), tr("Properties"), this, SLOT(displayProperties()) );
this->layout()->addWidget(list);
this->setInitialSize(600,600);
watcher = new QFileSystemWatcher(this);
@@ -165,4 +167,11 @@ void DesktopViewPlugin::updateContents(){
}
list->addItem(it);
}
-} \ No newline at end of file
+}
+
+void DesktopViewPlugin::displayProperties(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ for(int i=0; i<sel.length(); i++){
+ LSession::LaunchApplication("lumina-fileinfo \""+sel[i]->whatsThis());
+ }
+}
diff --git a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h
index 09cb7bcf..90bc20eb 100644
--- a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h
+++ b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h
@@ -38,6 +38,7 @@ private slots:
void increaseIconSize();
void decreaseIconSize();
void updateContents();
+ void displayProperties();
public slots:
diff --git a/lumina-fileinfo/defaults/fileinfo-app.template b/lumina-fileinfo/defaults/fileinfo-app.template
new file mode 100644
index 00000000..8519d3a1
--- /dev/null
+++ b/lumina-fileinfo/defaults/fileinfo-app.template
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Encoding=UTF-8
+Name=Name
+Exec=Command
+Icon=system-help.png
+StartupNotify=false
+Terminal=false
+Type=Application
+Categories=Application
+Comment=Comment
diff --git a/lumina-fileinfo/defaults/fileinfo-link.template b/lumina-fileinfo/defaults/fileinfo-link.template
new file mode 100644
index 00000000..4a0b7830
--- /dev/null
+++ b/lumina-fileinfo/defaults/fileinfo-link.template
@@ -0,0 +1,7 @@
+[Desktop Entry]
+Version=1.0
+Encoding=UTF-8
+Name=Name
+Icon=system-help.png
+Type=Link
+Comment=Comment
diff --git a/lumina-fileinfo/dialog.cpp b/lumina-fileinfo/dialog.cpp
new file mode 100644
index 00000000..0c7c3a6a
--- /dev/null
+++ b/lumina-fileinfo/dialog.cpp
@@ -0,0 +1,359 @@
+#include "dialog.h"
+#include "ui_dialog.h"
+#include <QFileDialog>
+#include <QRegExp>
+#include <QTemporaryFile>
+#include <QMessageBox>
+#include "LuminaUtils.h"
+#include <LuminaOS.h>
+
+
+
+//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 Dialog::textReplace(QString &origin, QString from, QString to, QString topic)
+{
+ if (origin.contains(QRegExp("\n" + topic + "\\s*=\\s*" + from + "\n",Qt::CaseInsensitive))) {
+ origin.replace(QRegExp("\n" + topic + "\\s*=\\s*" + from + "\n",Qt::CaseInsensitive),"\n" + topic + "=" + to + "\n");
+ } else {
+ origin.append(topic + "=" + to + "\n");
+ }
+}
+
+//get the template from the user home directory or from the qrc files
+void Dialog::copyTemplate(QString templateType)
+{
+ if ((templateType == "-link") or (templateType == "-app")) {
+ if (QFile::exists(QDir::homePath() + "/.lumina/LuminaDE/fileinfo" + templateType + ".template")) {
+ //We take the template from homedir
+ QFile::copy(QDir::homePath() + "/.lumina/LuminaDE/fileinfo" + templateType + ".template", desktopFileName);
+ } else {
+ //last possibility is to use the qrc template.
+ //But based on the initialisation, this should never occurs
+ QFile::copy(":defaults/fileinfo" + templateType + ".template", desktopFileName);
+ }
+ } else {
+ //error message for developpers
+ qDebug() << "copyTemplate only accept '-link' or '-app' as parameter";
+ }
+}
+
+
+
+
+Dialog::Dialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::Dialog)
+{
+ ui->setupUi(this);
+ desktopType="Application"; //default value
+
+ //Setup all the icons using libLumina
+ this->setWindowIcon( LXDG::findIcon("preferences-desktop-default-applications","") );
+ ui->pbWorkingDir->setIcon( LXDG::findIcon("folder","") );
+ ui->pbCommand->setIcon( LXDG::findIcon("system-search","") );
+
+ //we copy qrc templates in the home dir of the user.
+ //this allow the user to adapt those template to is own whishes
+ QString templateFile = QDir::homePath() + "/.lumina/LuminaDE/fileinfo-link.template";
+ if (!QFile::exists(templateFile)) {
+ QFile::copy(":defaults/fileinfo-link.template", templateFile);
+ QFile(templateFile).setPermissions(QFileDevice::ReadUser|QFileDevice::WriteUser);
+ }
+ templateFile = QDir::homePath() + "/.lumina/LuminaDE/fileinfo-app.template";
+ if (!QFile::exists(templateFile)) {
+ QFile::copy(":defaults/fileinfo-app.template", templateFile);
+ QFile(templateFile).setPermissions(QFileDevice::ReadUser|QFileDevice::WriteUser);
+ }
+}
+
+
+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)
+{
+
+ //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->lblCommand->setVisible(false);
+ ui->lblOptions->setVisible(false);
+ ui->lblWorkingDir->setText(tr("URL")); //we use the WorkingDir boxes for URL
+ desktopType="link";
+ }
+ if (param.startsWith("-app")) {
+ ui->cbRunInTerminal->setVisible(true);
+ ui->cbStartupNotification->setVisible(true);
+ ui->lCommand->setVisible(true);
+ ui->pbCommand->setVisible(true);
+ ui->lblCommand->setVisible(true);
+ ui->lblOptions->setVisible(true);
+ ui->lblWorkingDir->setText(tr("Working dir"));
+ desktopType="app";
+ }
+}
+
+
+
+
+//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
+ if (!QFile::exists(input)) {
+ if (desktopType=="link") {
+ copyTemplate("-link");
+ } else {
+ copyTemplate("-app");
+ }
+ }
+
+ //use the standard LXDG object and load the desktop file
+ bool ok = false;
+ DF = LXDG::loadDesktopFile(desktopFileName, ok);
+ if( ok ) {
+ if ((DF.type == XDGDesktop::LINK) && (desktopType!="link" )) {
+ //we open a desktop type "link" but it was not mentionned by parameters
+ Dialog::Initialise("-link");
+ }
+ 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(LXDG::findIcon(DF.icon,""));
+ } else {
+ QMessageBox::critical(this, tr("Error"), tr("Problem to read the desktop file called:") + desktopFileName );
+ exit(1);
+ }
+
+ //we load the file in memory and will adapt it before saving it to disk
+ QFile file(desktopFileName);
+ inMemoryFile="";
+ if (file.open(QFile::ReadOnly)) {
+ QTextStream fileData(&file);
+ inMemoryFile = fileData.readAll();
+ file.close();
+ //perform some validation checks
+ //TODO: put those Regex in a config file.
+ //this will allow checks improvements without compilation of the file
+ if ((inMemoryFile.contains(QRegExp(".*\\[Desktop Entry\\].*\n"))) &&
+ (inMemoryFile.contains(QRegExp("\n\\s*Type\\s*=.*\n"))) &&
+ (inMemoryFile.contains(QRegExp("\n\\s*Name\\s*=.*\n")))) {
+ //qDebug() << "sounds a good file";
+ } else {
+ //qDebug() << "wrong file!!!!";
+ QMessageBox msgBox;
+ msgBox.setIcon(QMessageBox::Question);
+ msgBox.setText(tr("There are some issues with this file !!!!"));
+ msgBox.setInformativeText(tr("Either you correct this file your self with an editor, or you start from scratch using the link or app template.\nPlease note that this process will update the file called:") + desktopFileName);
+ QPushButton *linkButton = msgBox.addButton("Link",QMessageBox::AcceptRole);
+ QPushButton *appButton = msgBox.addButton("App",QMessageBox::ResetRole);
+ QPushButton *cancelButton = msgBox.addButton("Cancel",QMessageBox::NoRole);
+ msgBox.exec();
+ if (msgBox.clickedButton() == linkButton) {
+ QFile::remove(desktopFileName);
+ copyTemplate("-link");
+ Initialise("-link");
+ LoadDesktopFile(desktopFileName);
+ }
+ if (msgBox.clickedButton() == appButton) {
+ QFile::remove(desktopFileName);
+ copyTemplate("-app");
+ Initialise("-app");
+ LoadDesktopFile(desktopFileName);
+ }
+ if (msgBox.clickedButton() == cancelButton) {
+ //we stop here
+ exit(0);
+ }
+ }
+ }
+}
+
+
+void Dialog::on_pbCommand_clicked()
+{
+ //the default directory is the user's home directory
+ QString commandFolder = QDir::homePath();
+ if (!ui->lCommand->text().isEmpty()) commandFolder = ui->lCommand->text().section('/', 0, -2);
+ if (commandFolder.isEmpty()) commandFolder = QDir::homePath();
+
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open command"), commandFolder, tr("All Files (*)"));
+ if (!fileName.isEmpty()) {
+ ui->lCommand->setText(fileName);
+ ui->lCommand->setModified(true);
+ }
+}
+
+
+void Dialog::on_pbWorkingDir_clicked()
+{
+ //the default directory is /
+ QString workingDir = "/";
+ if (ui->lWorkingDir->text().isEmpty()) workingDir = "/";
+ else workingDir = ui->lWorkingDir->text();
+ QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
+ QString directory = QFileDialog::getExistingDirectory(this,
+ tr("Working Directory"),
+ workingDir,
+ options);
+ if (!directory.isEmpty()) {
+ ui->lWorkingDir->setText(directory);
+ ui->lWorkingDir->setModified(true);
+ }
+}
+
+//we save the changes to the destination file
+void Dialog::on_pbApply_clicked()
+{
+ QString from,to;
+ 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(inMemoryFile, desktopTypeVal, desktopType, "Type");
+
+ if (ui->lName->isModified()) { textReplace(inMemoryFile, DF.name, ui->lName->text(), "Name");}
+ if (ui->lComment->isModified()) { textReplace(inMemoryFile, DF.comment, ui->lComment->text(), "Comment");}
+ if (ui->lCommand->isModified()) { textReplace(inMemoryFile, DF.exec, ui->lCommand->text(),"Exec");}
+ if (desktopType=="link") {
+ //incase of "link" layout WorkingDir is corresponding to the URL
+ if (ui->lWorkingDir->isModified()) { textReplace(inMemoryFile, DF.url, ui->lWorkingDir->text(),"URL");}
+ } else {
+ if (ui->lWorkingDir->isModified()) { textReplace(inMemoryFile, 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(inMemoryFile, from, to,"StartupNotify");
+ }
+ if (ui->cbRunInTerminal->isChecked() != DF.useTerminal) {
+ if (DF.useTerminal) {from="true"; to="false";} else {from="false"; to="true";}
+ textReplace(inMemoryFile, from, to,"Terminal");
+ }
+ if (!iconFileName.isEmpty()) {
+ from=DF.icon;
+ to=iconFileName;
+ textReplace(inMemoryFile, from, to,"Icon");
+ }
+
+ QFile file(desktopFileName);
+ if (file.open(QFile::ReadWrite)) {
+ file.seek(0);
+ file.write(inMemoryFile.toUtf8());
+
+ file.resize(file.pos());//remove possible trailing lines
+
+ file.close();
+ } else {
+ //problem to write to the disk
+ QMessageBox::critical(this, tr("Problem to write to disk"), tr("We have a problem to write the adapted desktop file to the disk. Can you re-try the modification after solving the issue with the disk ?"));
+ }
+
+ //hack required to update the icon on the desktop
+ QTemporaryFile tempFile ;
+ tempFile.setAutoRemove(false);
+ tempFile.setFileTemplate("/tmp/lumina-XXXXXX");
+ tempFile.open();
+ tempFile.close();
+
+ QString cmd = "mv";
+ cmd = cmd + " " + desktopFileName + " " + tempFile.fileName();
+ int ret = LUtils::runCmd(cmd);
+ if (ret !=0 ) {
+ qDebug() << "Problem to execute:" << cmd;
+ QMessageBox::critical(this, tr("Problem to write to disk"), tr("We have a problem to execute the following command:") + cmd);
+
+ }
+
+ cmd = "mv";
+ cmd = cmd + " " + tempFile.fileName() + " " + desktopFileName;
+ ret = LUtils::runCmd(cmd);
+ if (ret !=0 ) {
+ qDebug() << "Problem to execute:" << cmd;
+ QMessageBox::critical(this, tr("Problem to write to disk"), tr("We have a problem to execute the following command:") + cmd);
+ }
+}
+
+
+void Dialog::on_pbIcon_clicked()
+{
+ //the default directory is local/share/icons
+ QString iconFolder = LOS::AppPrefix()+"/share/icons";
+ if (!iconFileName.isEmpty()) iconFolder = iconFileName.section('/', 0, -2);
+ else if (!DF.icon.isEmpty()) iconFolder = DF.icon.section('/', 0, -2);
+ if (iconFolder.isEmpty()) iconFolder = LOS::AppPrefix()+"/share/icons";
+
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open command"), iconFolder, tr("Image Files (*.png *.jpg *.bmp)"));
+ if (!fileName.isEmpty()) {
+ ui->pbIcon->setIcon(QPixmap(fileName));
+ iconFileName=fileName;
+ }
+}
+
+void Dialog::on_lName_textChanged(QString text)
+{
+ if (text != DF.name && inMemoryFile.contains(QRegExp("\nName\\[\\S+\\]\\s*=",Qt::CaseInsensitive))) {
+ QMessageBox msgBox;
+ msgBox.setText(tr("By modifying this value, you will loose all translated versions"));
+ msgBox.setInformativeText(tr("The field: Name is translated in several other languages. If you want to continue, you will loose all translated versions"));
+ msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
+ int answer = msgBox.exec();
+ if (answer==QMessageBox::Ok) {
+ //remove all translated versions. The lang cannot be null, but the value can be.
+ inMemoryFile.replace(QRegExp("\nName\\[\\S+\\]\\s*=[^\n]*",Qt::CaseInsensitive), "");
+ } else {
+ ui->lName->setText(DF.name);
+ }
+ }
+}
+
+void Dialog::on_lComment_textChanged(QString text)
+{
+ if (text != DF.name && inMemoryFile.contains(QRegExp("\nComment\\[\\S+\\]\\s*=",Qt::CaseInsensitive))) {
+ QMessageBox msgBox;
+ msgBox.setText(tr("By modifying this value, you will loose all translated versions"));
+ msgBox.setInformativeText(tr("The field: Comment is translated in several other languages. If you want to continue, you will loose all translated versions"));
+ msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
+ int answer = msgBox.exec();
+ if (answer==QMessageBox::Ok) {
+ //remove all translated versions. The lang cannot be null, but the value can be.
+ inMemoryFile.replace(QRegExp("\nComment\\[\\S+\\]\\s*=[^\n]*",Qt::CaseInsensitive), "");
+ } else {
+ ui->lName->setText(DF.comment);
+ }
+ }
+}
+
diff --git a/lumina-fileinfo/dialog.h b/lumina-fileinfo/dialog.h
new file mode 100644
index 00000000..cfc9fde7
--- /dev/null
+++ b/lumina-fileinfo/dialog.h
@@ -0,0 +1,48 @@
+#ifndef DIALOG_H
+#define DIALOG_H
+
+#include <QDialog>
+#include <LuminaXDG.h>
+
+namespace Ui {
+class Dialog;
+}
+
+class Dialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit Dialog(QWidget *parent = 0);
+
+ XDGDesktop DF ;
+ QString inMemoryFile;
+
+ QString desktopFileName ;
+ QString iconFileName;
+ QString desktopType;
+
+ void Initialise(QString);
+ void MissingInputs();
+ void LoadDesktopFile(QString);
+
+ ~Dialog();
+
+private slots:
+
+ void on_pbCommand_clicked();
+ void on_pbWorkingDir_clicked();
+ void on_pbApply_clicked();
+ void on_pbIcon_clicked();
+
+ void textReplace(QString &origin, QString from, QString to, QString topic);
+ void copyTemplate(QString templateType);
+
+ void on_lName_textChanged(QString text);
+ void on_lComment_textChanged(QString text);
+
+private:
+ Ui::Dialog *ui;
+};
+
+#endif // DIALOG_H
diff --git a/lumina-fileinfo/dialog.ui b/lumina-fileinfo/dialog.ui
new file mode 100644
index 00000000..8cca25d4
--- /dev/null
+++ b/lumina-fileinfo/dialog.ui
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>383</width>
+ <height>288</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Desktop Editor</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="3" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblWorkingDir">
+ <property name="text">
+ <string>Working dir:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="pbWorkingDir">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normalon>../../../../usr/local/share/icons/gnome/32x32/places/folder.png</normalon>
+ </iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="pbCommand">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normalon>../../../../usr/local/share/icons/gnome/32x32/actions/gnome-run.png</normalon>
+ </iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QCheckBox" name="cbStartupNotification">
+ <property name="text">
+ <string>Use startup notification</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="lWorkingDir">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblIcon">
+ <property name="text">
+ <string>Icon:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblCommand">
+ <property name="text">
+ <string>Command:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblComment">
+ <property name="text">
+ <string>Comment:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lCommand"/>
+ </item>
+ <item row="4" column="1" alignment="Qt::AlignLeft">
+ <widget class="QPushButton" name="pbIcon">
+ <property name="maximumSize">
+ <size>
+ <width>275</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normalon>../../../../usr/local/share/icons/gnome/32x32/categories/xfce-graphics.png</normalon>
+ </iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QCheckBox" name="cbRunInTerminal">
+ <property name="text">
+ <string>Run in terminal</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblName">
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="lblOptions">
+ <property name="text">
+ <string>Options</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QLineEdit" name="lName"/>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QLineEdit" name="lComment"/>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pbCancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pbApply">
+ <property name="text">
+ <string>Apply</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <tabstops>
+ <tabstop>lName</tabstop>
+ <tabstop>lComment</tabstop>
+ <tabstop>lCommand</tabstop>
+ <tabstop>lWorkingDir</tabstop>
+ <tabstop>pbIcon</tabstop>
+ <tabstop>cbStartupNotification</tabstop>
+ <tabstop>cbRunInTerminal</tabstop>
+ <tabstop>pbCancel</tabstop>
+ <tabstop>pbApply</tabstop>
+ <tabstop>pbCommand</tabstop>
+ <tabstop>pbWorkingDir</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>pbCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>289</x>
+ <y>286</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>274</x>
+ <y>316</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>pbApply</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>375</x>
+ <y>286</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>372</x>
+ <y>318</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/lumina-fileinfo/lumina-fileinfo.desktop b/lumina-fileinfo/lumina-fileinfo.desktop
new file mode 100644
index 00000000..d5b5ddf9
--- /dev/null
+++ b/lumina-fileinfo/lumina-fileinfo.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Exec=/home/wi/nas/github/lumina/desktop-editor/desktop-editor
+Icon=/usr/local/share/pixmaps/Lumina-DE.png
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=System;
+Name=Lumina Desktop Information
+Comment=View information about the Lumina Desktop Environment
+
diff --git a/lumina-fileinfo/lumina-fileinfo.pro b/lumina-fileinfo/lumina-fileinfo.pro
new file mode 100644
index 00000000..9524f9ef
--- /dev/null
+++ b/lumina-fileinfo/lumina-fileinfo.pro
@@ -0,0 +1,40 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2015-02-24T18:52:15
+#
+#-------------------------------------------------
+
+QT += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = lumina-fileinfo
+TEMPLATE = app
+
+isEmpty(PREFIX) {
+ PREFIX = /usr/local
+}
+target.path = $$PREFIX/bin
+
+isEmpty(LIBPREFIX) {
+ LIBPREFIX = $$PREFIX/lib
+}
+
+
+SOURCES += main.cpp\
+ dialog.cpp
+
+HEADERS += dialog.h
+
+FORMS += dialog.ui
+
+RESOURCES+= lumina-fileinfo.qrc
+
+INCLUDEPATH += $$PREFIX/include
+
+LIBS += -L$$LIBPREFIX -lLuminaUtils
+
+desktop.files=lumina-search.desktop
+desktop.path=$$PREFIX/share/applications/
+
+INSTALLS += target desktop
diff --git a/lumina-fileinfo/lumina-fileinfo.qrc b/lumina-fileinfo/lumina-fileinfo.qrc
new file mode 100644
index 00000000..4667589a
--- /dev/null
+++ b/lumina-fileinfo/lumina-fileinfo.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource>
+ <file>defaults/fileinfo-app.template</file>
+ <file>defaults/fileinfo-link.template</file>
+ </qresource>
+</RCC>
diff --git a/lumina-fileinfo/main.cpp b/lumina-fileinfo/main.cpp
new file mode 100644
index 00000000..deefd46f
--- /dev/null
+++ b/lumina-fileinfo/main.cpp
@@ -0,0 +1,20 @@
+#include <QApplication>
+#include "dialog.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ Dialog w;
+ if (argc==2) {
+ w.LoadDesktopFile(QString(argv[1]).simplified());
+ } else if (argc==3) {
+ w.Initialise(QString(argv[1]).simplified());
+ w.LoadDesktopFile(QString(argv[2]).simplified());
+ } else {
+ w.MissingInputs();
+ }
+ a.setApplicationName("Lumina File Info");
+ w.show();
+
+ return a.exec();
+}
diff --git a/lumina.pro b/lumina.pro
index 5c0fc5eb..e594f45f 100644
--- a/lumina.pro
+++ b/lumina.pro
@@ -8,5 +8,6 @@ SUBDIRS+= libLumina \
lumina-screenshot \
lumina-search \
lumina-info \
- lumina-xconfig
+ lumina-xconfig \
+ lumina-fileinfo
bgstack15