diff options
Diffstat (limited to 'lumina-fileinfo')
-rw-r--r-- | lumina-fileinfo/dialog.cpp | 239 | ||||
-rw-r--r-- | lumina-fileinfo/dialog.h | 46 | ||||
-rw-r--r-- | lumina-fileinfo/dialog.ui | 226 | ||||
-rw-r--r-- | lumina-fileinfo/fileinfo-app.template | 11 | ||||
-rw-r--r-- | lumina-fileinfo/fileinfo-link.template | 7 | ||||
-rw-r--r-- | lumina-fileinfo/lumina-fileinfo.desktop | 10 | ||||
-rw-r--r-- | lumina-fileinfo/lumina-fileinfo.pro | 40 | ||||
-rw-r--r-- | lumina-fileinfo/main.cpp | 20 |
8 files changed, 599 insertions, 0 deletions
diff --git a/lumina-fileinfo/dialog.cpp b/lumina-fileinfo/dialog.cpp new file mode 100644 index 00000000..bcb3a14d --- /dev/null +++ b/lumina-fileinfo/dialog.cpp @@ -0,0 +1,239 @@ +#include "dialog.h" +#include "ui_dialog.h" +#include <QFileDialog> +#include <QRegExp> +#include <QTemporaryFile> +#include <QMessageBox> +#include "LuminaUtils.h" +#include <LuminaOS.h> + +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","") ); +} + + +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("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("./fileinfo-link.template", desktopFileName);} + else { QFile::copy("./fileinfo-app.template", desktopFileName);} + } + + //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(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() +{ + //the default directory is the user's home directory + QString commandFolder = "~"; + if (!ui->lCommand->text().isEmpty()) commandFolder = ui->lCommand->text().section('/', 0, -2); + if (commandFolder.isEmpty()) commandFolder = "~"; + + 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); + } +} + +//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*=",Qt::CaseInsensitive))) { + QMessageBox msgBox; + msgBox.setText(tr("By modifying this value, you will loose all translated versions")); + msgBox.setInformativeText(tr("The field:") + topic + tr( "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. + origin.replace(QRegExp("\n" + topic + "\\[\\S+\\]\\s*=[^\n]*",Qt::CaseInsensitive), ""); + } + else return; + } + if (!from.isEmpty()) { + 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 + 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; + } +} diff --git a/lumina-fileinfo/dialog.h b/lumina-fileinfo/dialog.h new file mode 100644 index 00000000..e58f0938 --- /dev/null +++ b/lumina-fileinfo/dialog.h @@ -0,0 +1,46 @@ +#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 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); + +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/fileinfo-app.template b/lumina-fileinfo/fileinfo-app.template new file mode 100644 index 00000000..8519d3a1 --- /dev/null +++ b/lumina-fileinfo/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/fileinfo-link.template b/lumina-fileinfo/fileinfo-link.template new file mode 100644 index 00000000..4a0b7830 --- /dev/null +++ b/lumina-fileinfo/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/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/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(); +} |