Allow the user to create a shortcut on the desktop and/or application folder (#2966)

This commit is contained in:
Alexandru Ionut Tripon 2025-05-10 12:12:04 +03:00 committed by GitHub
commit 2c838f8c2c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 199 additions and 120 deletions

View File

@ -892,6 +892,11 @@ QString getDesktopDir()
return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
} }
QString getApplicationsDir()
{
return QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
}
// Cross-platform Shortcut creation // Cross-platform Shortcut creation
bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon)
{ {
@ -903,16 +908,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri
return false; return false;
} }
#if defined(Q_OS_MACOS) #if defined(Q_OS_MACOS)
// Create the Application QDir application = destination + ".app/";
QDir applicationDirectory =
QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/" + BuildConfig.LAUNCHER_NAME + " Instances/";
if (!applicationDirectory.mkpath(".")) {
qWarning() << "Couldn't create application directory";
return false;
}
QDir application = applicationDirectory.path() + "/" + name + ".app/";
if (application.exists()) { if (application.exists()) {
qWarning() << "Application already exists!"; qWarning() << "Application already exists!";

View File

@ -353,6 +353,9 @@ bool checkProblemticPathJava(QDir folder);
// Get the Directory representing the User's Desktop // Get the Directory representing the User's Desktop
QString getDesktopDir(); QString getDesktopDir();
// Get the Directory representing the User's Applications directory
QString getApplicationsDir();
// Overrides one folder with the contents of another, preserving items exclusive to the first folder // Overrides one folder with the contents of another, preserving items exclusive to the first folder
// Equivalent to doing QDir::rename, but allowing for overrides // Equivalent to doing QDir::rename, but allowing for overrides
bool overrideFolder(QString overwritten_path, QString override_path); bool overrideFolder(QString overwritten_path, QString override_path);

View File

@ -206,6 +206,26 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi
exportInstanceMenu->addAction(ui->actionExportInstanceMrPack); exportInstanceMenu->addAction(ui->actionExportInstanceMrPack);
exportInstanceMenu->addAction(ui->actionExportInstanceFlamePack); exportInstanceMenu->addAction(ui->actionExportInstanceFlamePack);
ui->actionExportInstance->setMenu(exportInstanceMenu); ui->actionExportInstance->setMenu(exportInstanceMenu);
QList<QAction*> shortcutActions = { ui->actionCreateInstanceShortcutOther };
if (!DesktopServices::isFlatpak()) {
QString desktopDir = FS::getDesktopDir();
QString applicationDir = FS::getApplicationsDir();
if(!applicationDir.isEmpty())
shortcutActions.push_front(ui->actionCreateInstanceShortcutApplications);
if(!desktopDir.isEmpty())
shortcutActions.push_front(ui->actionCreateInstanceShortcutDesktop);
}
if(shortcutActions.length() > 1) {
auto shortcutInstanceMenu = new QMenu(this);
for(auto action : shortcutActions)
shortcutInstanceMenu->addAction(action);
ui->actionCreateInstanceShortcut->setMenu(shortcutInstanceMenu);
}
} }
// hide, disable and show stuff // hide, disable and show stuff
@ -1514,18 +1534,11 @@ void MainWindow::on_actionKillInstance_triggered()
} }
} }
void MainWindow::on_actionCreateInstanceShortcut_triggered() void MainWindow::createInstanceShortcut(QString shortcutFilePath)
{ {
if (!m_selectedInstance) if (!m_selectedInstance)
return; return;
auto desktopPath = FS::getDesktopDir();
if (desktopPath.isEmpty()) {
// TODO come up with an alternative solution (open "save file" dialog)
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find desktop?!"));
return;
}
QString desktopFilePath;
QString appPath = QApplication::applicationFilePath(); QString appPath = QApplication::applicationFilePath();
QString iconPath; QString iconPath;
QStringList args; QStringList args;
@ -1594,13 +1607,6 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered()
} }
if (DesktopServices::isFlatpak()) { if (DesktopServices::isFlatpak()) {
desktopFilePath = FS::PathCombine(desktopPath, FS::RemoveInvalidFilenameChars(m_selectedInstance->name()) + ".desktop");
QFileDialog fileDialog;
// workaround to make sure the portal file dialog opens in the desktop directory
fileDialog.setDirectoryUrl(desktopPath);
desktopFilePath = fileDialog.getSaveFileName(this, tr("Create Shortcut"), desktopFilePath, tr("Desktop Entries") + " (*.desktop)");
if (desktopFilePath.isEmpty())
return; // file dialog canceled by user
appPath = "flatpak"; appPath = "flatpak";
args.append({ "run", BuildConfig.LAUNCHER_APPID }); args.append({ "run", BuildConfig.LAUNCHER_APPID });
} }
@ -1639,20 +1645,99 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered()
return; return;
#endif #endif
args.append({ "--launch", m_selectedInstance->id() }); args.append({ "--launch", m_selectedInstance->id() });
if (FS::createShortcut(desktopFilePath, appPath, args, m_selectedInstance->name(), iconPath)) {
#if not defined(Q_OS_MACOS) if (!FS::createShortcut(std::move(shortcutFilePath), appPath, args, m_selectedInstance->name(), iconPath)) {
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
#else
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance!"));
#endif
} else {
#if not defined(Q_OS_MACOS) #if not defined(Q_OS_MACOS)
iconFile.remove(); iconFile.remove();
#endif #endif
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!"));
return;
} }
} }
void MainWindow::on_actionCreateInstanceShortcutOther_triggered()
{
if (!m_selectedInstance)
return;
QString defaultedDir = FS::getDesktopDir();
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
QString extension = ".desktop";
#elif defined(Q_OS_WINDOWS)
QString extension = ".lnk";
#else
QString extension = "";
#endif
QString shortcutFilePath = FS::PathCombine(defaultedDir, FS::RemoveInvalidFilenameChars(m_selectedInstance->name()) + extension);
QFileDialog fileDialog;
// workaround to make sure the portal file dialog opens in the desktop directory
fileDialog.setDirectoryUrl(defaultedDir);
shortcutFilePath =
fileDialog.getSaveFileName(this, tr("Create Shortcut"), shortcutFilePath, tr("Desktop Entries") + " (*" + extension + ")");
if (shortcutFilePath.isEmpty())
return; // file dialog canceled by user
if(shortcutFilePath.endsWith(extension))
shortcutFilePath = shortcutFilePath.mid(0, shortcutFilePath.length() - extension.length());
createInstanceShortcut(shortcutFilePath);
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance!"));
}
void MainWindow::on_actionCreateInstanceShortcut_triggered()
{
if (!m_selectedInstance)
return;
if (DesktopServices::isFlatpak())
on_actionCreateInstanceShortcutOther_triggered();
else
on_actionCreateInstanceShortcutDesktop_triggered();
}
void MainWindow::on_actionCreateInstanceShortcutDesktop_triggered()
{
if (!m_selectedInstance)
return;
QString desktopDir = FS::getDesktopDir();
if (desktopDir.isEmpty()) {
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find desktop?!"));
return;
}
QString shortcutFilePath = FS::PathCombine(FS::getDesktopDir(), FS::RemoveInvalidFilenameChars(m_selectedInstance->name()));
createInstanceShortcut(shortcutFilePath);
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
}
void MainWindow::on_actionCreateInstanceShortcutApplications_triggered()
{
if (!m_selectedInstance)
return;
QString applicationsDir = FS::getApplicationsDir();
if (applicationsDir.isEmpty()) {
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find applications folder?!"));
return;
}
#if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
applicationsDir = FS::PathCombine(applicationsDir, BuildConfig.LAUNCHER_DISPLAYNAME + " Instances");
QDir applicationsDirQ(applicationsDir);
if (!applicationsDirQ.mkpath(".")) {
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instances folder in applications folder!"));
return;
}
#endif
QString shortcutFilePath = FS::PathCombine(applicationsDir, FS::RemoveInvalidFilenameChars(m_selectedInstance->name()));
createInstanceShortcut(shortcutFilePath);
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance in your applications folder!"));
}
void MainWindow::taskEnd() void MainWindow::taskEnd()
{ {
QObject* sender = QObject::sender(); QObject* sender = QObject::sender();

View File

@ -167,6 +167,10 @@ class MainWindow : public QMainWindow {
void on_actionCreateInstanceShortcut_triggered(); void on_actionCreateInstanceShortcut_triggered();
void on_actionCreateInstanceShortcutDesktop_triggered();
void on_actionCreateInstanceShortcutApplications_triggered();
void on_actionCreateInstanceShortcutOther_triggered();
void taskEnd(); void taskEnd();
/** /**
@ -226,6 +230,7 @@ class MainWindow : public QMainWindow {
void setSelectedInstanceById(const QString& id); void setSelectedInstanceById(const QString& id);
void updateStatusCenter(); void updateStatusCenter();
void setInstanceActionsEnabled(bool enabled); void setInstanceActionsEnabled(bool enabled);
void createInstanceShortcut(QString shortcutDirPath);
void runModalTask(Task* task); void runModalTask(Task* task);
void instanceFromInstanceTask(InstanceTask* task); void instanceFromInstanceTask(InstanceTask* task);

View File

@ -131,7 +131,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>27</height> <height>22</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="fileMenu"> <widget class="QMenu" name="fileMenu">
@ -235,8 +235,7 @@
</widget> </widget>
<action name="actionMoreNews"> <action name="actionMoreNews">
<property name="icon"> <property name="icon">
<iconset theme="news"> <iconset theme="news"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>More news...</string> <string>More news...</string>
@ -250,8 +249,7 @@
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="cat"> <iconset theme="cat"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Meow</string> <string>&amp;Meow</string>
@ -286,8 +284,7 @@
</action> </action>
<action name="actionAddInstance"> <action name="actionAddInstance">
<property name="icon"> <property name="icon">
<iconset theme="new"> <iconset theme="new"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Add Instanc&amp;e...</string> <string>Add Instanc&amp;e...</string>
@ -298,8 +295,7 @@
</action> </action>
<action name="actionCheckUpdate"> <action name="actionCheckUpdate">
<property name="icon"> <property name="icon">
<iconset theme="checkupdate"> <iconset theme="checkupdate"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Update...</string> <string>&amp;Update...</string>
@ -313,8 +309,7 @@
</action> </action>
<action name="actionSettings"> <action name="actionSettings">
<property name="icon"> <property name="icon">
<iconset theme="settings"> <iconset theme="settings"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Setti&amp;ngs...</string> <string>Setti&amp;ngs...</string>
@ -328,8 +323,7 @@
</action> </action>
<action name="actionManageAccounts"> <action name="actionManageAccounts">
<property name="icon"> <property name="icon">
<iconset theme="accounts"> <iconset theme="accounts"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Manage Accounts...</string> <string>&amp;Manage Accounts...</string>
@ -337,8 +331,7 @@
</action> </action>
<action name="actionLaunchInstance"> <action name="actionLaunchInstance">
<property name="icon"> <property name="icon">
<iconset theme="launch"> <iconset theme="launch"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Launch</string> <string>&amp;Launch</string>
@ -349,8 +342,7 @@
</action> </action>
<action name="actionKillInstance"> <action name="actionKillInstance">
<property name="icon"> <property name="icon">
<iconset theme="status-bad"> <iconset theme="status-bad"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Kill</string> <string>&amp;Kill</string>
@ -364,8 +356,7 @@
</action> </action>
<action name="actionRenameInstance"> <action name="actionRenameInstance">
<property name="icon"> <property name="icon">
<iconset theme="rename"> <iconset theme="rename"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Rename</string> <string>Rename</string>
@ -376,8 +367,7 @@
</action> </action>
<action name="actionChangeInstGroup"> <action name="actionChangeInstGroup">
<property name="icon"> <property name="icon">
<iconset theme="tag"> <iconset theme="tag"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Change Group...</string> <string>&amp;Change Group...</string>
@ -399,8 +389,7 @@
</action> </action>
<action name="actionEditInstance"> <action name="actionEditInstance">
<property name="icon"> <property name="icon">
<iconset theme="settings"> <iconset theme="settings"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Edit...</string> <string>&amp;Edit...</string>
@ -414,8 +403,7 @@
</action> </action>
<action name="actionViewSelectedInstFolder"> <action name="actionViewSelectedInstFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Folder</string> <string>&amp;Folder</string>
@ -426,8 +414,7 @@
</action> </action>
<action name="actionDeleteInstance"> <action name="actionDeleteInstance">
<property name="icon"> <property name="icon">
<iconset theme="delete"> <iconset theme="delete"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Dele&amp;te</string> <string>Dele&amp;te</string>
@ -441,8 +428,7 @@
</action> </action>
<action name="actionCopyInstance"> <action name="actionCopyInstance">
<property name="icon"> <property name="icon">
<iconset theme="copy"> <iconset theme="copy"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Cop&amp;y...</string> <string>Cop&amp;y...</string>
@ -456,8 +442,7 @@
</action> </action>
<action name="actionExportInstance"> <action name="actionExportInstance">
<property name="icon"> <property name="icon">
<iconset theme="export"> <iconset theme="export"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>E&amp;xport...</string> <string>E&amp;xport...</string>
@ -468,8 +453,7 @@
</action> </action>
<action name="actionExportInstanceZip"> <action name="actionExportInstanceZip">
<property name="icon"> <property name="icon">
<iconset theme="launcher"> <iconset theme="launcher"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Prism Launcher (zip)</string> <string>Prism Launcher (zip)</string>
@ -477,8 +461,7 @@
</action> </action>
<action name="actionExportInstanceMrPack"> <action name="actionExportInstanceMrPack">
<property name="icon"> <property name="icon">
<iconset theme="modrinth"> <iconset theme="modrinth"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Modrinth (mrpack)</string> <string>Modrinth (mrpack)</string>
@ -486,8 +469,7 @@
</action> </action>
<action name="actionExportInstanceFlamePack"> <action name="actionExportInstanceFlamePack">
<property name="icon"> <property name="icon">
<iconset theme="flame"> <iconset theme="flame"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>CurseForge (zip)</string> <string>CurseForge (zip)</string>
@ -495,20 +477,18 @@
</action> </action>
<action name="actionCreateInstanceShortcut"> <action name="actionCreateInstanceShortcut">
<property name="icon"> <property name="icon">
<iconset theme="shortcut"> <iconset theme="shortcut"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Create Shortcut</string> <string>Create Shortcut</string>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Creates a shortcut on your desktop to launch the selected instance.</string> <string>Creates a shortcut on a selected folder to launch the selected instance.</string>
</property> </property>
</action> </action>
<action name="actionNoAccountsAdded"> <action name="actionNoAccountsAdded">
<property name="icon"> <property name="icon">
<iconset theme="noaccount"> <iconset theme="noaccount"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>No accounts added!</string> <string>No accounts added!</string>
@ -519,8 +499,7 @@
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="noaccount"> <iconset theme="noaccount"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>No Default Account</string> <string>No Default Account</string>
@ -531,8 +510,7 @@
</action> </action>
<action name="actionCloseWindow"> <action name="actionCloseWindow">
<property name="icon"> <property name="icon">
<iconset theme="status-bad"> <iconset theme="status-bad"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Close &amp;Window</string> <string>Close &amp;Window</string>
@ -546,8 +524,7 @@
</action> </action>
<action name="actionViewInstanceFolder"> <action name="actionViewInstanceFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Instances</string> <string>&amp;Instances</string>
@ -558,8 +535,7 @@
</action> </action>
<action name="actionViewLauncherRootFolder"> <action name="actionViewLauncherRootFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Launcher &amp;Root</string> <string>Launcher &amp;Root</string>
@ -570,8 +546,7 @@
</action> </action>
<action name="actionViewCentralModsFolder"> <action name="actionViewCentralModsFolder">
<property name="icon"> <property name="icon">
<iconset theme="centralmods"> <iconset theme="centralmods"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Central Mods</string> <string>&amp;Central Mods</string>
@ -582,8 +557,7 @@
</action> </action>
<action name="actionViewSkinsFolder"> <action name="actionViewSkinsFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Skins</string> <string>&amp;Skins</string>
@ -594,8 +568,7 @@
</action> </action>
<action name="actionViewIconsFolder"> <action name="actionViewIconsFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Instance Icons</string> <string>Instance Icons</string>
@ -606,8 +579,7 @@
</action> </action>
<action name="actionViewLogsFolder"> <action name="actionViewLogsFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Logs</string> <string>Logs</string>
@ -623,8 +595,7 @@
</action> </action>
<action name="actionReportBug"> <action name="actionReportBug">
<property name="icon"> <property name="icon">
<iconset theme="bug"> <iconset theme="bug"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Report a Bug or Suggest a Feature</string> <string>Report a Bug or Suggest a Feature</string>
@ -635,8 +606,7 @@
</action> </action>
<action name="actionDISCORD"> <action name="actionDISCORD">
<property name="icon"> <property name="icon">
<iconset theme="discord"> <iconset theme="discord"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Discord Guild</string> <string>&amp;Discord Guild</string>
@ -647,8 +617,7 @@
</action> </action>
<action name="actionMATRIX"> <action name="actionMATRIX">
<property name="icon"> <property name="icon">
<iconset theme="matrix"> <iconset theme="matrix"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Matrix Space</string> <string>&amp;Matrix Space</string>
@ -659,8 +628,7 @@
</action> </action>
<action name="actionREDDIT"> <action name="actionREDDIT">
<property name="icon"> <property name="icon">
<iconset theme="reddit-alien"> <iconset theme="reddit-alien"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Sub&amp;reddit</string> <string>Sub&amp;reddit</string>
@ -671,8 +639,7 @@
</action> </action>
<action name="actionAbout"> <action name="actionAbout">
<property name="icon"> <property name="icon">
<iconset theme="about"> <iconset theme="about"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;About %1</string> <string>&amp;About %1</string>
@ -686,8 +653,7 @@
</action> </action>
<action name="actionClearMetadata"> <action name="actionClearMetadata">
<property name="icon"> <property name="icon">
<iconset theme="refresh"> <iconset theme="refresh"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Clear Metadata Cache</string> <string>&amp;Clear Metadata Cache</string>
@ -698,8 +664,7 @@
</action> </action>
<action name="actionAddToPATH"> <action name="actionAddToPATH">
<property name="icon"> <property name="icon">
<iconset theme="custom-commands"> <iconset theme="custom-commands"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Install to &amp;PATH</string> <string>Install to &amp;PATH</string>
@ -710,8 +675,7 @@
</action> </action>
<action name="actionFoldersButton"> <action name="actionFoldersButton">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Folders</string> <string>Folders</string>
@ -722,8 +686,7 @@
</action> </action>
<action name="actionHelpButton"> <action name="actionHelpButton">
<property name="icon"> <property name="icon">
<iconset theme="help"> <iconset theme="help"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Help</string> <string>Help</string>
@ -734,8 +697,7 @@
</action> </action>
<action name="actionAccountsButton"> <action name="actionAccountsButton">
<property name="icon"> <property name="icon">
<iconset theme="noaccount"> <iconset theme="noaccount"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Accounts</string> <string>Accounts</string>
@ -743,8 +705,7 @@
</action> </action>
<action name="actionOpenWiki"> <action name="actionOpenWiki">
<property name="icon"> <property name="icon">
<iconset theme="help"> <iconset theme="help"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>%1 &amp;Help</string> <string>%1 &amp;Help</string>
@ -755,8 +716,7 @@
</action> </action>
<action name="actionViewWidgetThemeFolder"> <action name="actionViewWidgetThemeFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Widget Themes</string> <string>&amp;Widget Themes</string>
@ -767,8 +727,7 @@
</action> </action>
<action name="actionViewIconThemeFolder"> <action name="actionViewIconThemeFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>I&amp;con Theme</string> <string>I&amp;con Theme</string>
@ -779,8 +738,7 @@
</action> </action>
<action name="actionViewCatPackFolder"> <action name="actionViewCatPackFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Cat Packs</string> <string>Cat Packs</string>
@ -791,8 +749,7 @@
</action> </action>
<action name="actionViewJavaFolder"> <action name="actionViewJavaFolder">
<property name="icon"> <property name="icon">
<iconset theme="viewfolder"> <iconset theme="viewfolder"/>
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Java</string> <string>Java</string>
@ -801,6 +758,39 @@
<string>Open the Java folder in a file browser. Only available if the built-in Java downloader is used.</string> <string>Open the Java folder in a file browser. Only available if the built-in Java downloader is used.</string>
</property> </property>
</action> </action>
<action name="actionCreateInstanceShortcutDesktop">
<property name="text">
<string>Desktop</string>
</property>
<property name="toolTip">
<string>Creates an shortcut to this instance on your desktop</string>
</property>
<property name="menuRole">
<enum>QAction::TextHeuristicRole</enum>
</property>
</action>
<action name="actionCreateInstanceShortcutApplications">
<property name="text">
<string>Applications</string>
</property>
<property name="toolTip">
<string>Create a shortcut of this instance on your start menu</string>
</property>
<property name="menuRole">
<enum>QAction::TextHeuristicRole</enum>
</property>
</action>
<action name="actionCreateInstanceShortcutOther">
<property name="text">
<string>Other...</string>
</property>
<property name="toolTip">
<string>Creates a shortcut in a folder selected by you</string>
</property>
<property name="menuRole">
<enum>QAction::TextHeuristicRole</enum>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>