aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.cpp350
-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, 731 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..b0217db8
--- /dev/null
+++ b/lumina-fileinfo/dialog.cpp
@@ -0,0 +1,350 @@
+#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.open();
+ tempFile.close();
+
+ //TODO: capture errors
+ QString cmd = "mv";
+ cmd = cmd + " " + desktopFileName + " " + tempFile.fileName();
+ int ret = LUtils::runCmd(cmd);
+
+ cmd = "mv";
+ cmd = cmd + " " + tempFile.fileName() + " " + desktopFileName;
+ ret = LUtils::runCmd(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