diff --git a/data/strings/en.ini b/data/strings/en.ini
index e26d4a3bd..6376fb5b7 100644
--- a/data/strings/en.ini
+++ b/data/strings/en.ini
@@ -1075,6 +1075,7 @@ title = Enter License
default_message = If you need a license key, go to
license_key = License Key
activating_message = Activating...
+activated_message = Aseprite has been successfully activated!
[tileset_selector]
new_tileset = New Tileset
diff --git a/data/widgets/enter_license.xml b/data/widgets/enter_license.xml
index 501788830..2e2b18323 100644
--- a/data/widgets/enter_license.xml
+++ b/data/widgets/enter_license.xml
@@ -17,7 +17,7 @@
-
+
diff --git a/src/app/ui/enter_license.cpp b/src/app/ui/enter_license.cpp
index 5f682fda2..91307b838 100644
--- a/src/app/ui/enter_license.cpp
+++ b/src/app/ui/enter_license.cpp
@@ -10,6 +10,8 @@
#include "app/i18n/strings.h"
+#include "app/resource_finder.h"
+#include "base/fs.h"
#include "enter_license.h"
#include "enter_license.xml.h"
#include "ui/message.h"
@@ -32,43 +34,83 @@ EnterLicense::EnterLicense() : m_timer(500, this), m_activationInProgress(false)
okButton()->setEnabled(false);
okButton()->Click.connect([this](ui::Event&) {
- icon()->setVisible(false);
- message()->setText(app::Strings::instance()->enter_license_activating_message());
- layout();
- setEnabled(false);
- std::string key = licenseKey()->text();
- m_activationInProgress = true;
- m_activation = std::thread([this, key]() {
- drm::LicenseManager::instance()->activate(key, get_app_name(), get_app_version());
- });
+ startActivation();
});
+ m_activatedConn = drm::LicenseManager::instance()->Activated.connect(
+ [this](drm::ActivatedEvent& ev) { onActivated(ev); });
+
m_activationFailedConn = drm::LicenseManager::instance()->ActivationFailed.connect(
[this](drm::LicenseManager::Exception& e) { onActivationFailed(e); });
+
Close.connect([this]() {
+ m_activatedConn.disconnect();
m_activationFailedConn.disconnect();
});
m_timer.start();
}
-void EnterLicense::onBeforeClose(ui::CloseEvent& ev) {
+void EnterLicense::onBeforeClose(ui::CloseEvent& ev)
+{
if (m_activationInProgress) {
ev.cancel();
}
}
-void EnterLicense::onActivationFailed(drm::LicenseManager::Exception& e) {
+void EnterLicense::onActivationFailed(drm::LicenseManager::Exception& e)
+{
ui::execute_from_ui_thread([this, e]() {
- if (m_activation.joinable())
- m_activation.join();
- setEnabled(true);
- icon()->setVisible(true);
- message()->setText(e.what());
- layout();
- m_activationInProgress = false;
+ showError(e.what());
+ });
+}
+
+void EnterLicense::onActivated(drm::ActivatedEvent& ev)
+{
+ drm::LicenseManager::instance()->save(ev.getToken());
+
+ ui::execute_from_ui_thread([this, ev]() {
+ showSuccess();
+ });
+}
+
+void EnterLicense::startActivation()
+{
+ icon()->setVisible(false);
+ message()->setText(app::Strings::instance()->enter_license_activating_message());
+ layout();
+ setEnabled(false);
+ std::string key = licenseKey()->text();
+ m_activationInProgress = true;
+ m_activation = std::thread([this, key]() {
+ drm::LicenseManager::instance()->activate(key, get_app_name(), get_app_version());
});
}
+void EnterLicense::showError(const std::string& msg)
+{
+ if (m_activation.joinable())
+ m_activation.join();
+
+ setEnabled(true);
+ icon()->setVisible(true);
+ message()->setText(msg);
+ layout();
+ m_activationInProgress = false;
+}
+
+void EnterLicense::showSuccess()
+{
+ if (m_activation.joinable())
+ m_activation.join();
+
+ setEnabled(true);
+ icon()->setVisible(false);
+ message()->setText(app::Strings::instance()->enter_license_activated_message());
+ layout();
+ okButton()->setEnabled(false);
+ m_activationInProgress = false;
+}
+
}
\ No newline at end of file
diff --git a/src/app/ui/enter_license.h b/src/app/ui/enter_license.h
index 7d40449e6..ad6068cd6 100644
--- a/src/app/ui/enter_license.h
+++ b/src/app/ui/enter_license.h
@@ -20,12 +20,18 @@ public:
protected:
void onBeforeClose(ui::CloseEvent& ev) override;
void onActivationFailed(drm::LicenseManager::Exception& e);
+ void onActivated(drm::ActivatedEvent& ev);
private:
std::thread m_activation;
ui::Timer m_timer;
bool m_activationInProgress;
obs::connection m_activationFailedConn;
+ obs::connection m_activatedConn;
+
+ void startActivation();
+ void showError(const std::string& msg);
+ void showSuccess();
};
}