diff --git a/plugins/builtin/include/content/views/view_store.hpp b/plugins/builtin/include/content/views/view_store.hpp index ffc4b8be5..619c040b0 100644 --- a/plugins/builtin/include/content/views/view_store.hpp +++ b/plugins/builtin/include/content/views/view_store.hpp @@ -13,6 +13,13 @@ namespace hex::plugin::builtin { + enum class RequestStatus { + NotAttempted, + InProgress, + Failed, + Succeded, + }; + struct StoreEntry { std::string name; std::string description; @@ -45,6 +52,7 @@ namespace hex::plugin::builtin { std::future> m_apiRequest; std::future> m_download; std::fs::path m_downloadPath; + RequestStatus m_requestStatus = RequestStatus::NotAttempted; std::vector m_patterns, m_includes, m_magics, m_constants, m_yara, m_encodings; diff --git a/plugins/builtin/source/content/views/view_store.cpp b/plugins/builtin/source/content/views/view_store.cpp index 3ac759b59..225fe4991 100644 --- a/plugins/builtin/source/content/views/view_store.cpp +++ b/plugins/builtin/source/content/views/view_store.cpp @@ -25,10 +25,10 @@ namespace hex::plugin::builtin { using namespace std::literals::chrono_literals; ViewStore::ViewStore() : View("hex.builtin.view.store.name") { - this->refresh(); - ContentRegistry::Interface::addMenuItem("hex.builtin.menu.help", 3000, [&, this] { if (ImGui::MenuItem("hex.builtin.view.store.name"_lang)) { + if (this->m_requestStatus == RequestStatus::NotAttempted) + this->refresh(); TaskManager::doLater([] { ImGui::OpenPopup(View::toWindowName("hex.builtin.view.store.name").c_str()); }); this->getWindowOpenState() = true; } @@ -126,6 +126,11 @@ namespace hex::plugin::builtin { } void ViewStore::refresh() { + // do not refresh if a refresh is already in progress + if (this->m_requestStatus == RequestStatus::InProgress) + return; + this->m_requestStatus = RequestStatus::InProgress; + this->m_patterns.clear(); this->m_includes.clear(); this->m_magics.clear(); @@ -138,7 +143,8 @@ namespace hex::plugin::builtin { void ViewStore::parseResponse() { auto response = this->m_apiRequest.get(); - if (response.code == 200) { + this->m_requestStatus = response.code == 200 ? RequestStatus::Succeded : RequestStatus::Failed; + if (this->m_requestStatus == RequestStatus::Succeded) { auto json = nlohmann::json::parse(response.body); auto parseStoreEntries = [](auto storeJson, const std::string &name, fs::ImHexPath pathType, std::vector &results) { @@ -198,7 +204,10 @@ namespace hex::plugin::builtin { this->parseResponse(); } - this->drawStore(); + if (this->m_requestStatus == RequestStatus::Failed) + ImGui::TextFormattedColored(ImGui::GetCustomColorVec4(ImGuiCustomCol_ToolbarRed), "hex.builtin.view.store.netfailed"_lang); + + this->drawStore(); ImGui::EndPopup(); } else { diff --git a/plugins/builtin/source/lang/de_DE.cpp b/plugins/builtin/source/lang/de_DE.cpp index cd6090ee1..0362fee2e 100644 --- a/plugins/builtin/source/lang/de_DE.cpp +++ b/plugins/builtin/source/lang/de_DE.cpp @@ -437,6 +437,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.encodings", "Encodings" }, { "hex.builtin.view.store.tab.yara", "Yara Rules" }, { "hex.builtin.view.store.loading", "Store inhalt wird geladen..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "Datei konnte nicht heruntergeladen werden! Zielordner konnte nicht gefunden werden." }, { "hex.builtin.view.diff.name", "Diffing" }, diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index d752b78f7..3aead816b 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -441,6 +441,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Yara Rules" }, { "hex.builtin.view.store.tab.encodings", "Encodings" }, { "hex.builtin.view.store.loading", "Loading store content..." }, + { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "Failed to download file! Destination folder does not exist." }, { "hex.builtin.view.diff.name", "Diffing" }, diff --git a/plugins/builtin/source/lang/it_IT.cpp b/plugins/builtin/source/lang/it_IT.cpp index 61652c2f2..e87e7aa48 100644 --- a/plugins/builtin/source/lang/it_IT.cpp +++ b/plugins/builtin/source/lang/it_IT.cpp @@ -442,6 +442,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.encodings", "Encodings" }, { "hex.builtin.view.store.tab.yara", "Regole di Yara" }, { "hex.builtin.view.store.loading", "Caricamento del content store..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "Impossibile scaricare file! La cartella di destinazione non esiste." }, { "hex.builtin.view.diff.name", "Diffing" }, diff --git a/plugins/builtin/source/lang/ja_JP.cpp b/plugins/builtin/source/lang/ja_JP.cpp index 344e6e3b1..2f58fe32a 100644 --- a/plugins/builtin/source/lang/ja_JP.cpp +++ b/plugins/builtin/source/lang/ja_JP.cpp @@ -443,6 +443,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Yaraルール" }, { "hex.builtin.view.store.tab.encodings", "エンコード" }, { "hex.builtin.view.store.loading", "ストアコンテンツを読み込み中…" }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "ファイルのダウンロードに失敗しました。ダウンロード先フォルダが存在しません。" }, { "hex.builtin.view.diff.name", "比較" }, diff --git a/plugins/builtin/source/lang/ko_KR.cpp b/plugins/builtin/source/lang/ko_KR.cpp index d3105678b..9a035e5cd 100644 --- a/plugins/builtin/source/lang/ko_KR.cpp +++ b/plugins/builtin/source/lang/ko_KR.cpp @@ -440,6 +440,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Yara 규칙" }, { "hex.builtin.view.store.tab.encodings", "인코딩" }, { "hex.builtin.view.store.loading", "스토어 콘텐츠 불러오는 중..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "파일 다운로드에 실패했습니다! 저장 폴더가 존재하지 않습니다." }, { "hex.builtin.view.diff.name", "파일 비교" }, diff --git a/plugins/builtin/source/lang/pt_BR.cpp b/plugins/builtin/source/lang/pt_BR.cpp index cb239dfbf..7880e9951 100644 --- a/plugins/builtin/source/lang/pt_BR.cpp +++ b/plugins/builtin/source/lang/pt_BR.cpp @@ -440,6 +440,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Regras Yara" }, { "hex.builtin.view.store.tab.encodings", "Codificações" }, { "hex.builtin.view.store.loading", "Carregando conteúdo da loja..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "Falha ao baixar o arquivo! A pasta de destino não existe." }, { "hex.builtin.view.diff.name", "Diferenciando" }, diff --git a/plugins/builtin/source/lang/zh_CN.cpp b/plugins/builtin/source/lang/zh_CN.cpp index e8d60c896..8f6843734 100644 --- a/plugins/builtin/source/lang/zh_CN.cpp +++ b/plugins/builtin/source/lang/zh_CN.cpp @@ -442,6 +442,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Yara 规则" }, { "hex.builtin.view.store.tab.encodings", "编码" }, { "hex.builtin.view.store.loading", "正在加载在线内容..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "下载文件失败!目标文件夹不存在。" }, { "hex.builtin.view.diff.name", "差异" }, diff --git a/plugins/builtin/source/lang/zh_TW.cpp b/plugins/builtin/source/lang/zh_TW.cpp index 543f17688..ab244f805 100644 --- a/plugins/builtin/source/lang/zh_TW.cpp +++ b/plugins/builtin/source/lang/zh_TW.cpp @@ -440,6 +440,7 @@ namespace hex::plugin::builtin { { "hex.builtin.view.store.tab.yara", "Yara 規則" }, { "hex.builtin.view.store.tab.encodings", "編碼" }, { "hex.builtin.view.store.loading", "正在載入商店內容..." }, + // { "hex.builtin.view.store.netfailed", "Net request to load store content failed!" }, { "hex.builtin.view.store.download_error", "無法下載檔案!目的地資料夾不存在。" }, { "hex.builtin.view.diff.name", "Diffing" },