diff options
author | Ken Moore <ken@ixsystems.com> | 2017-03-02 09:43:19 -0500 |
---|---|---|
committer | Ken Moore <ken@ixsystems.com> | 2017-03-02 09:43:19 -0500 |
commit | 33681a12eb754af6f057e8a6984db4af18dc010b (patch) | |
tree | 708a16ed1ce3ee80ac6cf1e61c77ccc9ac569b12 /src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp | |
parent | Update the help text for lumina-open to include the "-action <ActionID>" synt... (diff) | |
download | lumina-33681a12eb754af6f057e8a6984db4af18dc010b.tar.gz lumina-33681a12eb754af6f057e8a6984db4af18dc010b.tar.bz2 lumina-33681a12eb754af6f057e8a6984db4af18dc010b.zip |
Clean up some of the applauncher context menu functionality:
1) Add the ability for plugins to set their own high-priority context menu, and put the plugin modification menu into that as needed.
2) For the applauncher plugin, generate a custom context menu specifically for the file in question. This may include the various "actions" in .desktop files as appropriate, and also adds shortcuts for launch, open, open-with, file properties, and delete file.
Diffstat (limited to 'src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp')
-rw-r--r-- | src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp index 14599c5d..8d8106f7 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp +++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp @@ -20,6 +20,9 @@ AppLauncherPlugin::AppLauncherPlugin(QWidget* parent, QString ID) : LDPlugin(par connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT( loadButton()) ); connect(this, SIGNAL(PluginActivated()), this, SLOT(buttonClicked()) ); //in case they use the context menu to launch it. + this->setContextMenu( new QMenu(this) ); + connect(this->contextMenu(), SIGNAL(triggered(QAction*)), this, SLOT(actionTriggered(QAction*)) ); + loadButton(); //QTimer::singleShot(0,this, SLOT(loadButton()) ); } @@ -32,6 +35,7 @@ void AppLauncherPlugin::Cleanup(){ void AppLauncherPlugin::loadButton(){ QString def = this->ID().section("::",1,50).section("---",0,0).simplified(); QString path = this->readSetting("applicationpath",def).toString(); //use the default if necessary + this->contextMenu()->clear(); //qDebug() << "Default Application Launcher:" << def << path; bool ok = QFile::exists(path); if(!ok){ emit RemovePlugin(this->ID()); return;} @@ -53,6 +57,16 @@ void AppLauncherPlugin::loadButton(){ button->setIcon( QIcon(LXDG::findIcon(file.icon,"system-run").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); if(!file.comment.isEmpty()){button->setToolTip(file.comment); } txt = file.name; + //Put the simple Open action first (no open-with for .desktop files) + this->contextMenu()->addAction(button->icon(), QString(tr("Launch %1")).arg(file.name), this, SLOT(buttonClicked()) ); + //See if there are any "actions" listed for this file, and put them in the context menu as needed. + if(!file.actions.isEmpty()){ + for(int i=0; i<file.actions.length(); i++){ + QAction *tmp = this->contextMenu()->addAction( file.actions[i].name ); + tmp->setIcon( LXDG::findIcon(file.actions[i].icon,"quickopen-file") ); + tmp->setWhatsThis( file.actions[i].ID ); + } + } if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } watcher->addPath(file.filePath); //make sure to update this shortcut if the file changes } @@ -82,6 +96,16 @@ void AppLauncherPlugin::loadButton(){ button->setText( tr("Click to Set") ); if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } } + //Now adjust the context menu for the button as needed + if(this->contextMenu()->isEmpty()){ + this->contextMenu()->addAction(LXDG::findIcon("document-open",""), tr("Open"), this, SLOT(buttonClicked()) ); + this->contextMenu()->addAction(LXDG::findIcon("document-preview",""), tr("Open With"), this, SLOT(openWith()) ); + } + this->contextMenu()->addAction(LXDG::findIcon("document-properties",""), tr("Properties"), this, SLOT(fileProperties()) ); + if(QFileInfo(path).isWritable()){ + this->contextMenu()->addSeparator(); + this->contextMenu()->addAction(LXDG::findIcon("document-close",""), tr("Delete File"), this, SLOT(fileDelete()) ); + } //If the file is a symlink, put the overlay on the icon if(QFileInfo(path).isSymLink()){ QImage img = button->icon().pixmap(QSize(icosize,icosize)).toImage(); @@ -132,7 +156,7 @@ void AppLauncherPlugin::loadButton(){ QTimer::singleShot(100, this, SLOT(update()) ); //Make sure to re-draw the image in a moment } -void AppLauncherPlugin::buttonClicked(){ +void AppLauncherPlugin::buttonClicked(bool openwith){ QString path = button->whatsThis(); if(path.isEmpty() || !QFile::exists(path) ){ //prompt for the user to select an application @@ -144,8 +168,33 @@ void AppLauncherPlugin::buttonClicked(){ if(!ok || names.indexOf(app)<0){ return; } //cancelled this->saveSetting("applicationpath", apps[ names.indexOf(app) ]->filePath); QTimer::singleShot(0,this, SLOT(loadButton())); + }else if(openwith){ + LSession::LaunchApplication("lumina-open -select \""+path+"\""); }else{ LSession::LaunchApplication("lumina-open \""+path+"\""); } } + +void AppLauncherPlugin::actionTriggered(QAction *act){ + if(act->whatsThis().isEmpty()){ return; } + QString path = button->whatsThis(); + if(path.isEmpty() || !QFile::exists(path)){ return; } //invalid file + LSession::LaunchApplication("lumina-open -action \""+act->whatsThis()+"\" \""+path+"\""); +} + +void AppLauncherPlugin::openWith(){ + buttonClicked(true); +} + +void AppLauncherPlugin::fileProperties(){ + QString path = button->whatsThis(); + if(path.isEmpty() || !QFile::exists(path)){ return; } //invalid file + LSession::LaunchApplication("lumina-fileinfo \""+path+"\""); +} + +void AppLauncherPlugin::fileDelete(){ + QString path = button->whatsThis(); + if(path.isEmpty() || !QFile::exists(path)){ return; } //invalid file + QFile::remove(path); +} |