From ed5ecf7ea7a482b4649e66ecb35fbc60af680684 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 25 Apr 2016 13:08:12 -0400 Subject: Rearrange the Lumina source tree quite a bit: Now the utilites are arranged by category (core, core-utils, desktop-utils), so all the -utils may be excluded by a package system (or turned into separate packages) as needed. --- src-qt5/core/lumina-open/LFileDialog.cpp | 286 +++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 src-qt5/core/lumina-open/LFileDialog.cpp (limited to 'src-qt5/core/lumina-open/LFileDialog.cpp') diff --git a/src-qt5/core/lumina-open/LFileDialog.cpp b/src-qt5/core/lumina-open/LFileDialog.cpp new file mode 100644 index 00000000..c0417935 --- /dev/null +++ b/src-qt5/core/lumina-open/LFileDialog.cpp @@ -0,0 +1,286 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2013, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "LFileDialog.h" +#include "ui_LFileDialog.h" + +LFileDialog::LFileDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LFileDialog() ){ + ui->setupUi(this); //load the designer file + //set the output flags to the defaults + appSelected = false; + setDefault = false; + appExec.clear(); + appPath.clear(); + appFile.clear(); + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); + settings = new QSettings("LuminaDE", "lumina-open",this); + //Connect the signals/slots + connect(ui->combo_apps, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI()) ); + connect(ui->radio_rec, SIGNAL(toggled(bool)), this, SLOT(radioChanged()) ); + connect(ui->radio_avail, SIGNAL(toggled(bool)), this, SLOT(radioChanged()) ); + connect(ui->radio_custom, SIGNAL(toggled(bool)), this, SLOT(radioChanged()) ); +} + +LFileDialog::~LFileDialog(){ + +} + +// ---------- +// PUBLIC +// ---------- +void LFileDialog::setFileInfo(QString filename, QString extension, bool isFile){ + //Set the labels for the file + qDebug() << "SetFileInfo:" << filename << extension << isFile; + ui->label_file->setText( this->fontMetrics().elidedText( filename, Qt::ElideMiddle, 300 ) ); + bool shownetwork = false; + if(isFile){ ui->label_extension->setText( "("+extension+")"); } + else if(extension=="email"){ ui->label_extension->setText( QString(tr("(Email Link)")) ); shownetwork = true; } + else if(extension.startsWith("x-scheme-handler/")){ ui->label_extension->setText( QString(tr("(Internet URL - %1)")).arg(extension.section("/",-1)) ); shownetwork = true; } + else{ui->label_extension->setText("("+extension+" link)"); } + fileEXT = extension; //NOTE: this is the mime-type for the file now, not the extension + generateAppList(shownetwork); +} + +//static functions +QString LFileDialog::getDefaultApp(QString extension){ + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); + if(extension.contains("/")){ + return LXDG::findDefaultAppForMime(extension); + }else{ + return QSettings("LuminaDE", "lumina-open").value("default/"+extension,"").toString(); + } +} + +void LFileDialog::setDefaultApp(QString extension, QString appFile){ + if(extension.contains("/")){ + //mime type default: set on the system itself + if(appFile.endsWith(".desktop")){ appFile = appFile.section("/",-1); } //only need the relative path + LXDG::setDefaultAppForMime(extension, appFile); + }else{ + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); + if(appFile.isEmpty()){ + QSettings("LuminaDE", "lumina-open").remove("default/"+extension); + }else{ + QSettings("LuminaDE", "lumina-open").setValue("default/"+extension,appFile); + } + } +} + +// ----------- +// PRIVATE +// ----------- +QStringList LFileDialog::getPreferredApplications(){ + QStringList out; + //First list all the applications registered for that same mimetype + QString mime = fileEXT; + out << LXDG::findAvailableAppsForMime(mime); + + //Now search the internal settings for that extension and find any applications last used + QStringList keys = settings->allKeys(); + for(int i=0; ivalue(keys[i]).toString().split(":::"); + qDebug() << "Found Files:" << keys[i] << files; + bool cleaned = false; + for(int j=0; jsetValue(keys[i], files.join(":::")); } //update the registry + if(!out.isEmpty()){ break; } //already found files + } + } + //Make sure we don't have any duplicates before we return the list + out.removeDuplicates(); + return out; +} + +void LFileDialog::setPreferredApplication(QString desktopfile){ + QStringList keys = settings->allKeys(); + for(int i=0; ivalue(keys[i]).toString().split(":::"); + files.removeAll(desktopfile); + QStringList newfiles; + newfiles << desktopfile; + //Only keep the 5 most recent preferred applications per extension + for(int j=0; j<5 && jsetValue(keys[i], newfiles.join(":::")); + return; + } + } + //No key found for this extension - make a new one + settings->setValue(fileEXT.toLower(), desktopfile); +} + +QString LFileDialog::translateCat(QString cat){ + QString out; + if(cat=="Audio"){ out = tr("Audio"); } + else if(cat=="Video"){ out = tr("Video"); } + else if(cat=="Multimedia"){ out = tr("Multimedia"); } + else if(cat=="Development"){ out = tr("Development"); } + else if(cat=="Education"){ out = tr("Education"); } + else if(cat=="Game"){ out = tr("Game"); } + else if(cat=="Graphics"){ out = tr("Graphics"); } + else if(cat=="Network"){ out = tr("Network"); } + else if(cat=="Office"){ out = tr("Office"); } + else if(cat=="Science"){ out = tr("Science"); } + else if(cat=="Settings"){ out = tr("Settings"); } + else if(cat=="System"){ out = tr("System"); } + else if(cat=="Utility"){ out = tr("Utilities"); } + else if(cat=="Other"){ out = tr("Other"); } + else{ out = cat; } + return out; +} + +// ----------------- +// PRIVATE SLOTS +// ----------------- +void LFileDialog::updateUI(){ + //Check for a selected application + bool good = false; + if(ui->radio_custom->isChecked()){ + if(!ui->line_bin->text().isEmpty()){ + QString bin = ui->line_bin->text(); + good = LUtils::isValidBinary(bin); + //Now verify that the file exists and is executable + if( good ){ + ui->label_goodbin->setPixmap(QPixmap(":/icons/good.png")); + }else{ + ui->label_goodbin->setPixmap(QPixmap(":/icons/bad.png")); + } + } + } + else if(ui->radio_rec->isChecked()){ + good = true; //a valid app is always selected on this page if it is available + } + else if(ui->combo_apps->count() > 0 && !ui->combo_apps->currentData().toString().isEmpty() ){ + good=true; + } + ui->tool_ok->setEnabled(good); +} + +void LFileDialog::generateAppList(bool shownetwork){ + //Now load the preferred applications + PREFAPPS = getPreferredApplications(); + ui->combo_rec->clear(); + //Now get the application mimetype for the file extension (if available) + QString mimetype = fileEXT; + //Now add all the detected applications + QHash< QString, QList > hash = LXDG::sortDesktopCats( LXDG::systemDesktopFiles() ); + QStringList cat = hash.keys(); + cat.sort(); //sort alphabetically + ui->combo_apps->clear(); + for(int c=0; c app = hash[cat[c]]; + if(app.length()<1){ continue; } + if(ui->combo_apps->count() >1){ ui->combo_apps->insertSeparator(ui->combo_apps->count()); } + ui->combo_apps->addItem(translateCat(cat[c])); + ui->combo_apps->insertSeparator(ui->combo_apps->count()); + for(int a=0; acombo_apps->addItem(LXDG::findIcon(app[a].icon, "application-x-desktop"), app[a].name, app[a].filePath); + //Check to see if this app matches the mime type + if(app[a].mimeList.contains(mimetype) && !mimetype.isEmpty()){ + // also put this app in the preferred list + PREFAPPS.append(app[a].filePath); + //If this is the first preferred app found - select this app initially + if(ui->combo_apps->currentIndex()<=0){ ui->combo_apps->setCurrentIndex(ui->combo_apps->count()-1); } + } + } + } + if(ui->combo_apps->currentIndex()<=0){ ui->combo_apps->setCurrentIndex(2); } //Start on the first "real" app - not the first category header + //Now add all the preferred applications + PREFAPPS.removeDuplicates(); + for(int i=0; icombo_rec->addItem( LXDG::findIcon(dFile.icon, "application-x-desktop"), dFile.name); + if(i==0){ ui->combo_rec->setCurrentIndex(0); } //make sure the first item is selected + }else{ + PREFAPPS.removeAt(i); //invalid app + i--; + } + } + //Update the UI + if(PREFAPPS.isEmpty()){ + ui->radio_rec->setEnabled(false); //no preferred apps + ui->radio_avail->setChecked(true); + }else{ + ui->radio_rec->setChecked(true); + } +} + +void LFileDialog::radioChanged(){ + if(ui->radio_rec->isChecked()){ + ui->stackedWidget->setCurrentWidget(ui->page_rec); + }else if(ui->radio_avail->isChecked()){ + ui->stackedWidget->setCurrentWidget(ui->page_avail); + }else{ + ui->stackedWidget->setCurrentWidget(ui->page_custom); + } + //ui->check_default->setEnabled( !ui->radio_custom->isChecked() ); + updateUI(); +} + +/*void LFileDialog::on_group_binary_toggled(bool checked){ + ui->label_goodbin->setVisible(checked); + ui->line_bin->setVisible(checked); + ui->tool_findBin->setVisible(checked); + updateUI(); +}*/ + +void LFileDialog::on_tool_ok_clicked(){ + appSelected = true; + setDefault = ui->check_default->isChecked(); + if(ui->radio_custom->isChecked()){ + appExec = ui->line_bin->text(); + }else if(ui->radio_rec->isChecked()){ + //application selected + bool ok = false; + XDGDesktop app = LXDG::loadDesktopFile(PREFAPPS[ui->combo_rec->currentIndex()], ok); + //Set the output variables + appExec = LXDG::getDesktopExec(app); + appPath = app.path; + appFile = app.filePath; + setPreferredApplication(app.filePath); //bump this to the top of the preferred list for next time + }else{ + //application selected + bool ok = false; + XDGDesktop app = LXDG::loadDesktopFile(ui->combo_apps->currentData().toString(), ok); + //Set the output variables + appExec = LXDG::getDesktopExec(app); + appPath = app.path; + appFile = app.filePath; + setPreferredApplication(app.filePath); //save this app to this extension as a recommendation + } + this->close(); +} + +void LFileDialog::on_tool_cancel_clicked(){ + appSelected = false; + this->close(); +} + +void LFileDialog::on_tool_findBin_clicked(){ + QString filepath = QFileDialog::getOpenFileName(this, tr("Find Application Binary"), QDir::homePath() ); + if(filepath.isEmpty()){ return; } + ui->line_bin->setText(filepath); +} + +void LFileDialog::on_line_bin_textChanged(){ + updateUI(); +} + -- cgit