1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/*
* Copyright (C) 2016-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#include "GUIDialogSelectGameClient.h"
#include "FileItem.h"
#include "dialogs/GUIDialogSelect.h"
#include "filesystem/AddonsDirectory.h"
#include "games/addons/GameClient.h"
#include "guilib/GUIComponent.h"
#include "guilib/GUIWindowManager.h"
#include "guilib/LocalizeStrings.h"
#include "guilib/WindowIDs.h"
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
#include "utils/log.h"
using namespace KODI;
using namespace KODI::MESSAGING;
using namespace GAME;
std::string CGUIDialogSelectGameClient::ShowAndGetGameClient(const std::string& gamePath,
const GameClientVector& candidates,
const GameClientVector& installable)
{
std::string gameClient;
LogGameClients(candidates, installable);
std::string extension = URIUtils::GetExtension(gamePath);
// "Select emulator for {0:s}"
CGUIDialogSelect* dialog =
GetDialog(StringUtils::Format(g_localizeStrings.Get(35258), extension));
if (dialog != nullptr)
{
// Turn the addons into items
CFileItemList items;
CFileItemList installableItems;
for (const auto& candidate : candidates)
{
CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(candidate, candidate->ID()));
item->SetLabel2(g_localizeStrings.Get(35257)); // "Installed"
items.Add(std::move(item));
}
for (const auto& addon : installable)
{
CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(addon, addon->ID()));
installableItems.Add(std::move(item));
}
items.Sort(SortByLabel, SortOrderAscending);
installableItems.Sort(SortByLabel, SortOrderAscending);
items.Append(installableItems);
dialog->SetItems(items);
dialog->Open();
// If the "Get More" button has been pressed, show a list of installable addons
if (dialog->IsConfirmed())
{
int selectedIndex = dialog->GetSelectedItem();
if (0 <= selectedIndex && selectedIndex < items.Size())
{
gameClient = items[selectedIndex]->GetPath();
CLog::Log(LOGDEBUG, "Select game client dialog: User selected emulator {}", gameClient);
}
else
{
CLog::Log(LOGDEBUG, "Select game client dialog: User selected invalid emulator {}",
selectedIndex);
}
}
else
{
CLog::Log(LOGDEBUG, "Select game client dialog: User cancelled game client installation");
}
}
return gameClient;
}
CGUIDialogSelect* CGUIDialogSelectGameClient::GetDialog(const std::string& title)
{
CGUIDialogSelect* dialog =
CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(
WINDOW_DIALOG_SELECT);
if (dialog != nullptr)
{
dialog->Reset();
dialog->SetHeading(CVariant{title});
dialog->SetUseDetails(true);
}
return dialog;
}
void CGUIDialogSelectGameClient::LogGameClients(const GameClientVector& candidates,
const GameClientVector& installable)
{
CLog::Log(LOGDEBUG, "Select game client dialog: Found {} candidates",
static_cast<unsigned int>(candidates.size()));
for (const auto& gameClient : candidates)
CLog::Log(LOGDEBUG, "Adding {} as a candidate", gameClient->ID());
if (!installable.empty())
{
CLog::Log(LOGDEBUG, "Select game client dialog: Found {} installable clients",
static_cast<unsigned int>(installable.size()));
for (const auto& gameClient : installable)
CLog::Log(LOGDEBUG, "Adding {} as an installable client", gameClient->ID());
}
}
|