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
|
#include "StarModsMenu.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"
#include "StarGuiReader.hpp"
#include "StarLabelWidget.hpp"
#include "StarButtonWidget.hpp"
#include "StarListWidget.hpp"
namespace Star {
ModsMenu::ModsMenu() {
auto assets = Root::singleton().assets();
GuiReader reader;
reader.registerCallback("linkbutton", bind(&ModsMenu::openLink, this));
reader.registerCallback("workshopbutton", bind(&ModsMenu::openWorkshop, this));
reader.construct(assets->json("/interface/modsmenu/modsmenu.config:paneLayout"), this);
m_assetsSources = assets->assetSources();
m_modList = fetchChild<ListWidget>("mods.list");
for (auto const& assetsSource : m_assetsSources) {
auto modName = m_modList->addItem()->fetchChild<LabelWidget>("name");
modName->setText(bestModName(assets->assetSourceMetadata(assetsSource), assetsSource));
}
m_modName = findChild<LabelWidget>("modname");
m_modAuthor = findChild<LabelWidget>("modauthor");
m_modVersion = findChild<LabelWidget>("modversion");
m_modPath = findChild<LabelWidget>("modpath");
m_modDescription = findChild<LabelWidget>("moddescription");
m_linkButton = fetchChild<ButtonWidget>("linkbutton");
m_copyLinkButton = fetchChild<ButtonWidget>("copylinkbutton");
auto linkLabel = fetchChild<LabelWidget>("linklabel");
auto copyLinkLabel = fetchChild<LabelWidget>("copylinklabel");
auto workshopLinkButton = fetchChild<ButtonWidget>("workshopbutton");
auto& guiContext = GuiContext::singleton();
bool hasDesktopService = (bool)guiContext.applicationController()->desktopService();
workshopLinkButton->setEnabled(hasDesktopService);
m_linkButton->setVisibility(hasDesktopService);
m_copyLinkButton->setVisibility(!hasDesktopService);
m_linkButton->setEnabled(false);
m_copyLinkButton->setEnabled(false);
linkLabel->setVisibility(hasDesktopService);
copyLinkLabel->setVisibility(!hasDesktopService);
}
void ModsMenu::update(float dt) {
Pane::update(dt);
size_t selectedItem = m_modList->selectedItem();
if (selectedItem == NPos) {
m_modName->setText("");
m_modAuthor->setText("");
m_modVersion->setText("");
m_modPath->setText("");
m_modDescription->setText("");
} else {
String assetsSource = m_assetsSources.at(selectedItem);
JsonObject assetsSourceMetadata = Root::singleton().assets()->assetSourceMetadata(assetsSource);
m_modName->setText(bestModName(assetsSourceMetadata, assetsSource));
m_modAuthor->setText(assetsSourceMetadata.value("author", "No Author Set").toString());
m_modVersion->setText(assetsSourceMetadata.value("version", "No Version Set").printString());
m_modPath->setText(assetsSource);
m_modDescription->setText(assetsSourceMetadata.value("description", "").toString());
String link = assetsSourceMetadata.value("link", "").toString();
m_linkButton->setEnabled(!link.empty());
m_copyLinkButton->setEnabled(!link.empty());
}
}
String ModsMenu::bestModName(JsonObject const& metadata, String const& sourcePath) {
if (auto ptr = metadata.ptr("friendlyName"))
return ptr->toString();
if (auto ptr = metadata.ptr("name"))
return ptr->toString();
String baseName = File::baseName(sourcePath);
if (baseName.contains("."))
baseName.rextract(".");
return baseName;
}
void ModsMenu::openLink() {
size_t selectedItem = m_modList->selectedItem();
if (selectedItem == NPos)
return;
String assetsSource = m_assetsSources.at(selectedItem);
JsonObject assetsSourceMetadata = Root::singleton().assets()->assetSourceMetadata(assetsSource);
String link = assetsSourceMetadata.value("link", "").toString();
if (link.empty())
return;
auto& guiContext = GuiContext::singleton();
if (auto desktopService = guiContext.applicationController()->desktopService())
desktopService->openUrl(link);
else
guiContext.setClipboard(link);
}
void ModsMenu::openWorkshop() {
auto assets = Root::singleton().assets();
auto& guiContext = GuiContext::singleton();
if (auto desktopService = guiContext.applicationController()->desktopService())
desktopService->openUrl(assets->json("/interface/modsmenu/modsmenu.config:workshopLink").toString());
}
}
|