DolphinQT: Gives option to add desktop shortcut

When a game is selected, the option to add a shortcut of the game to the desktop is given. Uses native Windows API since Qt lacks support for adding shortcuts.
This commit is contained in:
Aminoa 2020-12-26 18:02:15 -06:00 committed by Shawn Hoffman
parent 79a234eff7
commit 23e565d94c
2 changed files with 61 additions and 0 deletions

View File

@ -53,6 +53,20 @@
#include "UICommon/GameFile.h"
#ifdef _WIN32
#include <QCoreApplication>
#include <shlobj.h>
#include <wil/com.h>
// This file uses some identifiers which are defined as macros in Windows headers.
// Undefine them for the intellisense parser to solve some red squiggles.
#ifdef __INTELLISENSE__
#ifdef DeleteFile
#undef DeleteFile
#endif
#endif
#endif
GameList::GameList(QWidget* parent) : QStackedWidget(parent), m_model(this)
{
m_list_proxy = new ListProxyModel(this);
@ -382,6 +396,15 @@ void GameList::ShowContextMenu(const QPoint&)
menu->addAction(tr("Open &Containing Folder"), this, &GameList::OpenContainingFolder);
menu->addAction(tr("Delete File..."), this, &GameList::DeleteFile);
#ifdef _WIN32
menu->addAction(tr("Add Shortcut to Desktop"), this, [this] {
if (!AddShortcutToDesktop())
{
ModalMessageBox::critical(this, tr("Add Shortcut to Desktop"),
tr("There was an issue adding a shortcut to the desktop"));
}
});
#endif
menu->addSeparator();
@ -631,6 +654,41 @@ void GameList::OpenGCSaveFolder()
ModalMessageBox::information(this, tr("Information"), tr("No save data found."));
}
#ifdef _WIN32
bool GameList::AddShortcutToDesktop()
{
auto init = wil::CoInitializeEx_failfast(COINIT_APARTMENTTHREADED);
auto shell_link = wil::CoCreateInstanceNoThrow<ShellLink, IShellLink>();
if (!shell_link)
return false;
std::wstring dolphin_path = QCoreApplication::applicationFilePath().toStdWString();
if (FAILED(shell_link->SetPath(dolphin_path.c_str())))
return false;
const auto game = GetSelectedGame();
const auto& file_path = game->GetFilePath();
std::wstring args = UTF8ToTStr("-e \"" + file_path + "\"");
if (FAILED(shell_link->SetArguments(args.c_str())))
return false;
wil::unique_cotaskmem_string desktop;
if (FAILED(SHGetKnownFolderPath(FOLDERID_Desktop, KF_FLAG_NO_ALIAS, nullptr, &desktop)))
return false;
const auto& game_name = game->GetLongName();
std::wstring desktop_path = std::wstring(desktop.get()) + UTF8ToTStr("\\" + game_name + ".lnk");
auto persist_file = shell_link.try_query<IPersistFile>();
if (!persist_file)
return false;
if (FAILED(persist_file->Save(desktop_path.c_str(), TRUE)))
return false;
return true;
}
#endif
void GameList::DeleteFile()
{
ModalMessageBox confirm_dialog(this);

View File

@ -65,6 +65,9 @@ private:
void OpenWiki();
void SetDefaultISO();
void DeleteFile();
#ifdef _WIN32
bool AddShortcutToDesktop();
#endif
void InstallWAD();
void UninstallWAD();
void ExportWiiSave();