@@ -13,6 +13,8 @@ struct UpdateInfo { | |||||
std::string name; | std::string name; | ||||
std::string version; | std::string version; | ||||
std::string changelogUrl; | std::string changelogUrl; | ||||
/** Only defined if plugin does not meet Rack version requirement */ | |||||
std::string minRackVersion; | |||||
bool downloaded = false; | bool downloaded = false; | ||||
}; | }; | ||||
@@ -664,26 +664,37 @@ struct SyncUpdateItem : ui::MenuItem { | |||||
return NULL; | return NULL; | ||||
library::UpdateInfo update = it->second; | library::UpdateInfo update = it->second; | ||||
if (update.changelogUrl == "") | |||||
return NULL; | |||||
ui::Menu* menu = new ui::Menu; | ui::Menu* menu = new ui::Menu; | ||||
std::string changelogUrl = update.changelogUrl; | |||||
menu->addChild(createMenuItem("Changelog", "", [=]() { | |||||
system::openBrowser(changelogUrl); | |||||
})); | |||||
if (update.minRackVersion != "") { | |||||
menu->addChild(createMenuLabel(string::f("Requires Rack %s+", update.minRackVersion.c_str()))); | |||||
} | |||||
if (update.changelogUrl != "") { | |||||
std::string changelogUrl = update.changelogUrl; | |||||
menu->addChild(createMenuItem("Changelog", "", [=]() { | |||||
system::openBrowser(changelogUrl); | |||||
})); | |||||
} | |||||
if (menu->children.empty()) { | |||||
delete menu; | |||||
return NULL; | |||||
} | |||||
return menu; | return menu; | ||||
} | } | ||||
void step() override { | void step() override { | ||||
disabled = library::isSyncing; | |||||
if (library::isSyncing) | |||||
disabled = true; | |||||
auto it = library::updateInfos.find(slug); | auto it = library::updateInfos.find(slug); | ||||
if (it != library::updateInfos.end()) { | if (it != library::updateInfos.end()) { | ||||
library::UpdateInfo update = it->second; | library::UpdateInfo update = it->second; | ||||
if (update.minRackVersion != "") | |||||
disabled = true; | |||||
if (update.downloaded) { | if (update.downloaded) { | ||||
rightText = CHECKMARK_STRING; | rightText = CHECKMARK_STRING; | ||||
disabled = true; | disabled = true; | ||||
@@ -12,6 +12,7 @@ | |||||
#include <asset.hpp> | #include <asset.hpp> | ||||
#include <settings.hpp> | #include <settings.hpp> | ||||
#include <plugin.hpp> | #include <plugin.hpp> | ||||
#include <string.hpp> | |||||
namespace rack { | namespace rack { | ||||
@@ -278,6 +279,16 @@ void checkUpdates() { | |||||
if (changelogUrlJ) | if (changelogUrlJ) | ||||
update.changelogUrl = json_string_value(changelogUrlJ); | update.changelogUrl = json_string_value(changelogUrlJ); | ||||
// Get minRackVersion | |||||
json_t* minRackVersionJ = json_object_get(manifestJ, "minRackVersion"); | |||||
if (minRackVersionJ) { | |||||
std::string minRackVersion = json_string_value(minRackVersionJ); | |||||
// Check that Rack version is at least minRackVersion | |||||
if (string::Version(APP_VERSION) < string::Version(minRackVersion)) { | |||||
update.minRackVersion = minRackVersion; | |||||
} | |||||
} | |||||
// Add update to updates map | // Add update to updates map | ||||
updateInfos[pluginSlug] = update; | updateInfos[pluginSlug] = update; | ||||
} | } | ||||
@@ -349,6 +360,10 @@ void syncUpdate(std::string slug) { | |||||
return; | return; | ||||
UpdateInfo update = it->second; | UpdateInfo update = it->second; | ||||
// Don't update if not compatible with Rack version | |||||
if (update.minRackVersion != "") | |||||
return; | |||||
updateSlug = slug; | updateSlug = slug; | ||||
DEFER({updateSlug = "";}); | DEFER({updateSlug = "";}); | ||||