satdump/src-interface/explorer/explorer.cpp

539 lines
23 KiB
C++
Raw Normal View History

2025-06-22 17:18:53 +02:00
#include "explorer.h"
2025-08-31 16:46:10 +02:00
2024-12-29 20:13:58 +01:00
#include "common/utils.h"
2025-08-31 16:46:10 +02:00
2025-07-24 21:55:57 +02:00
#include "core/exception.h"
2025-04-15 19:06:12 +01:00
#include "core/plugin.h"
2024-12-29 20:13:58 +01:00
#include "core/style.h"
2025-04-15 19:06:12 +01:00
#include "dsp/cyclo_test.h"
2025-04-21 23:17:21 +02:00
#include "dsp/flowgraph/dsp_flowgraph_handler.h"
#include "handlers/dataset/dataset_handler.h"
#include "handlers/dummy_handler.h"
#include "handlers/product/image_product_handler.h" // TODOREWORK CLEAN
#include "handlers/projection/projection_handler.h"
#include "handlers/trash/trash_handler.h"
#include "handlers/vector/shapefile_handler.h"
2025-03-14 11:12:18 +01:00
// TODOREWORK
#include "core/resources.h"
2025-08-01 00:39:05 +02:00
#include "image/image.h"
2025-06-09 00:06:07 +02:00
#include "imgui/imgui.h"
2024-12-29 20:13:58 +01:00
2025-03-15 23:37:59 +01:00
// TODOREWORK
2025-03-22 11:51:53 +01:00
#include "dsp/newrec.h"
2025-04-15 19:06:12 +01:00
#include "dsp/waterfall_test.h"
2025-03-15 23:37:59 +01:00
#include "image/io.h"
2025-04-06 10:27:54 +02:00
2025-04-15 19:06:12 +01:00
#include "imgui/imgui_filedrop.h"
2025-08-01 00:39:05 +02:00
#include "imgui/imgui_image.h"
2025-07-14 21:21:55 +02:00
#include "main_ui.h"
2025-08-02 14:56:42 +02:00
#include <cstddef>
2025-08-01 00:39:05 +02:00
#include <cstdint>
2025-08-05 19:07:45 +02:00
#include <fstream>
#include <string>
2025-04-15 19:06:12 +01:00
2024-12-29 20:13:58 +01:00
namespace satdump
{
2025-06-22 17:18:53 +02:00
namespace explorer
2024-12-29 20:13:58 +01:00
{
2025-07-23 12:21:02 +02:00
ExplorerApplication::ExplorerApplication()
2024-12-29 20:13:58 +01:00
{
2025-06-22 17:18:53 +02:00
master_handler = std::make_shared<handlers::DummyHandler>("MasterHandlerExplorer");
2025-03-22 11:51:53 +01:00
// Add trashcan
2025-06-22 17:18:53 +02:00
trash_handler = std::make_shared<handlers::DummyHandler>("TrashHandlerExplorer");
auto trash_h = std::make_shared<handlers::TrashHandler>();
2025-03-14 14:39:05 +01:00
trash_h->setCanBeDragged(false);
2025-03-22 11:51:53 +01:00
trash_handler->addSubHandler(trash_h);
trash_handler->setCanBeDraggedTo(false);
2025-07-13 14:40:31 +02:00
// Add processing handler "spot"
processing_handler = std::make_shared<handlers::DummyHandler>("ProcessingHandlerExplorer");
processing_handler->setCanBeDraggedTo(false);
2025-07-18 10:52:31 +02:00
// Enable dropping files onto the explorer.
2025-04-15 19:06:12 +01:00
eventBus->register_handler<imgui_utils::FileDropEvent>(
[this](const imgui_utils::FileDropEvent &v)
{
for (auto &f : v.files)
2025-06-22 17:18:53 +02:00
tryOpenFileInExplorer(f);
2025-04-15 19:06:12 +01:00
});
2025-06-22 17:18:53 +02:00
// Enable adding handlers to the explorer externally
2025-07-24 11:53:20 +02:00
eventBus->register_handler<ExplorerAddHandlerEvent>([this](const ExplorerAddHandlerEvent &e) { addHandler(e.h, e.open, e.is_processing); });
2025-07-18 10:52:31 +02:00
// Returns the last selected handler of a specific type if available
2025-05-15 14:04:34 +02:00
eventBus->register_handler<GetLastSelectedOfTypeEvent>(
[this](const GetLastSelectedOfTypeEvent &v)
{
if (last_selected_handler.count(v.type))
v.h = last_selected_handler[v.type];
else
v.h = nullptr;
2025-05-15 14:04:34 +02:00
});
2025-08-05 19:07:45 +02:00
// Load if the day if we can, "randomly"
if (resources::resourceExists("tod.txt"))
{
std::ifstream message_of_the_day_f(resources::getResourcePath("tod.txt"));
std::vector<std::string> lines;
std::string l;
while (std::getline(message_of_the_day_f, l))
lines.push_back(l);
int this_line = time(0) % lines.size();
tip_of_the_day = lines[this_line];
}
2024-12-31 17:01:12 +01:00
}
2024-12-29 20:13:58 +01:00
2025-07-18 12:19:40 +02:00
ExplorerApplication::~ExplorerApplication() {}
2024-12-29 20:13:58 +01:00
2025-07-24 11:53:20 +02:00
void ExplorerApplication::addHandler(std::shared_ptr<handlers::Handler> h, bool open, bool is_processing)
{
if (is_processing)
processing_handler->addSubHandler(h);
else
{
// Try adding to a group if possible
bool added = false;
for (auto &v : group_definitions)
{
for (auto &v2 : v.second)
{
if (v2 == h->getID())
{
if (groups_handlers.count(v.first) == 0)
groups_handlers.emplace(v.first, std::make_shared<handlers::DummyHandler>(v.first + "HandlerExplorer"));
groups_handlers[v.first]->addSubHandler(h);
added = true;
}
}
}
if (!added)
master_handler->addSubHandler(h);
}
if (open)
curr_handler = h;
}
2025-06-22 17:18:53 +02:00
void ExplorerApplication::drawPanel()
2024-12-29 20:13:58 +01:00
{
2024-12-31 17:01:12 +01:00
ImGui::SetNextItemWidth(ImGui::GetWindowWidth() / 2);
2024-12-29 20:13:58 +01:00
bool handler_present = false;
2025-08-11 16:15:55 +02:00
if (ImGui::CollapsingHeader("Root", ImGuiTreeNodeFlags_DefaultOpen))
2024-12-29 20:13:58 +01:00
{
2025-05-15 14:04:34 +02:00
auto prev_curr = curr_handler;
2024-12-31 17:01:12 +01:00
if (ImGui::BeginTable("##masterhandlertable", 1, ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders))
{
ImGui::TableSetupColumn("##masterhandlertable_col", ImGuiTableColumnFlags_None);
ImGui::TableNextColumn();
2024-12-29 20:13:58 +01:00
2025-07-24 11:53:20 +02:00
bool rendering_separators = false;
if (processing_handler->hasSubhandlers())
2025-07-13 14:40:31 +02:00
{
2025-07-24 11:53:20 +02:00
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::SeparatorText("Processing");
handler_present |= processing_handler->drawTreeMenu(curr_handler);
2025-07-24 11:53:20 +02:00
for (auto &h : processing_handler->getAllSubHandlers())
2025-07-13 14:40:31 +02:00
if (h->getName() == "PROCESSING_DONE") // TODOREWORK MASSIVE HACK
2025-07-24 11:53:20 +02:00
processing_handler->delSubHandler(h);
rendering_separators = true;
}
for (auto &v : groups_handlers)
{
if (v.second->hasSubhandlers())
{
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::SeparatorText(v.first.c_str());
handler_present |= v.second->drawTreeMenu(curr_handler);
2025-07-24 11:53:20 +02:00
rendering_separators = true;
}
2025-07-13 14:40:31 +02:00
}
2025-07-24 11:53:20 +02:00
if (rendering_separators)
{
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::SeparatorText("Others");
}
handler_present |= master_handler->drawTreeMenu(curr_handler);
handler_present |= trash_handler->drawTreeMenu(curr_handler);
2024-12-29 20:13:58 +01:00
2024-12-31 17:01:12 +01:00
ImGui::EndTable();
}
2024-12-29 20:13:58 +01:00
2025-05-15 14:04:34 +02:00
if (prev_curr != curr_handler)
last_selected_handler.insert_or_assign(curr_handler->getID(), curr_handler);
2025-01-02 17:04:32 +01:00
}
2025-07-08 22:01:05 +02:00
if (!handler_present)
curr_handler.reset();
2025-07-08 22:01:05 +02:00
if (curr_handler)
curr_handler->drawMenu();
2025-01-02 17:04:32 +01:00
}
2025-06-22 17:18:53 +02:00
void ExplorerApplication::drawMenuBar()
2025-01-02 17:04:32 +01:00
{
2025-01-03 10:03:04 +01:00
// Handle File Stuff TODOREWORK?
{
if (file_open_dialog.update())
2025-01-03 10:03:04 +01:00
{
std::string prod_path = file_open_dialog.getPath();
2025-05-03 12:12:36 +02:00
if (prod_path.size() > 0)
2025-06-22 17:18:53 +02:00
tryOpenFileInExplorer(prod_path);
2025-05-03 12:12:36 +02:00
else
logger->trace("No file selected");
2025-01-03 10:03:04 +01:00
}
}
2025-01-02 17:04:32 +01:00
if (ImGui::BeginMenuBar())
{
// Main "Open" menu, for files, other handlers, etc
2025-01-02 17:04:32 +01:00
if (ImGui::BeginMenu("File"))
2025-01-01 05:57:58 +01:00
{
file_open_dialog.render("Open File", "Open File", "", {{"All Files", "*"}});
2025-01-02 17:04:32 +01:00
if (ImGui::BeginMenu("Quick Open"))
{
ImGui::InputText("##quickvieweropen", &quickOpenString);
2025-06-25 20:23:10 +02:00
bool go = ImGui::IsItemDeactivatedAfterEdit();
ImGui::SameLine();
if (ImGui::Button("Go##loadfromhttpgo") || go)
{
2025-06-22 17:18:53 +02:00
tryOpenFileInExplorer(quickOpenString);
quickOpenString.clear();
}
2025-06-25 20:23:10 +02:00
ImGui::SameLine();
2025-06-09 00:06:07 +02:00
if (ImGui::Button("Paste & Load"))
2025-08-17 13:17:36 +02:00
{
// Returns nullptr if clipboard didn't have text or failed for some reason
if (ImGui::GetClipboardText() != nullptr)
{
tryOpenFileInExplorer(std::string(ImGui::GetClipboardText()));
}
}
ImGui::EndMenu();
}
2025-08-11 16:15:55 +02:00
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Add"))
{
if (ImGui::MenuItem("Projection"))
addHandler(std::make_shared<handlers::ProjectionHandler>());
2025-06-22 18:09:25 +02:00
if (ImGui::BeginMenu("Tools"))
{ // TODOREWORK?
2025-03-09 10:16:40 +01:00
if (ImGui::MenuItem("DSP Flowgraph"))
2025-07-24 11:53:20 +02:00
addHandler(std::make_shared<handlers::DSPFlowGraphHandler>());
2025-03-15 23:37:59 +01:00
if (ImGui::MenuItem("Waterfall TEST"))
2025-07-24 11:53:20 +02:00
addHandler(std::make_shared<handlers::WaterfallTestHandler>());
2025-03-22 11:51:53 +01:00
if (ImGui::MenuItem("NewRec TEST"))
2025-07-24 11:53:20 +02:00
addHandler(std::make_shared<handlers::NewRecHandler>());
if (ImGui::MenuItem("CycloHelper TEST"))
2025-07-24 11:53:20 +02:00
addHandler(std::make_shared<handlers::CycloHelperHandler>());
2025-01-02 17:04:32 +01:00
ImGui::EndMenu();
2025-01-01 05:57:58 +01:00
}
2025-06-22 18:09:25 +02:00
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Handler", bool(curr_handler)))
{
2025-01-04 23:03:13 +01:00
if (curr_handler && ImGui::BeginMenu("Config"))
{
if (ImGui::MenuItem("JSON To Clipboard"))
2025-06-22 11:50:58 +02:00
{
2025-01-04 23:03:13 +01:00
ImGui::SetClipboardText(curr_handler->getConfig().dump(4).c_str());
2025-06-22 11:50:58 +02:00
logger->warn("Copied to clipboard!");
}
2025-01-04 23:03:13 +01:00
if (ImGui::MenuItem("JSON From Clipboard"))
2025-06-22 11:50:58 +02:00
{
2025-01-04 23:03:13 +01:00
curr_handler->setConfig(nlohmann::json::parse(ImGui::GetClipboardText()));
2025-06-22 11:50:58 +02:00
logger->warn("Copied from clipboard!");
}
2025-01-04 23:03:13 +01:00
ImGui::EndMenu();
}
2025-01-02 17:04:32 +01:00
ImGui::EndMenu();
}
2025-06-22 18:09:25 +02:00
// TODOREWORK
2025-01-02 17:04:32 +01:00
if (curr_handler)
{
if (ImGui::BeginMenu("Current"))
2025-01-01 05:57:58 +01:00
{
2025-01-02 17:04:32 +01:00
curr_handler->drawMenuBar();
ImGui::EndMenu();
2025-01-01 05:57:58 +01:00
}
}
2024-12-29 20:13:58 +01:00
2025-05-18 20:05:55 +02:00
eventBus->fire_event<RenderLoadMenuElementsEvent>({curr_handler, master_handler});
2025-03-25 21:33:06 +01:00
2025-01-02 17:04:32 +01:00
ImGui::EndMenuBar();
2024-12-29 20:13:58 +01:00
}
}
2025-08-01 00:39:05 +02:00
void ExplorerApplication::drawContents()
{
if (ImGui::BeginChild("WelcomeChild"))
{
if (satdump_logo_texture == 0)
{
image::Image img;
image::load_png(img, resources::getResourcePath("icon.png"));
satdump_logo_texture = makeImageTexture();
uint32_t *px = new uint32_t[img.width() * img.height()];
image::image_to_rgba(img, px);
updateImageTexture(satdump_logo_texture, (uint32_t *)px, img.width(), img.height());
delete[] px;
}
2025-08-02 14:56:42 +02:00
#if 0
ImGui::Image((void *)satdump_logo_texture, ImVec2(50 * ui_scale, 50 * ui_scale));
ImGui::SameLine();
ImGui::PushFont(style::bigFont);
ImGui::TextUnformatted(" Welcome to SatDump!");
ImGui::PopFont();
if (ImGui::BeginTable("##dscovrinstrumentstable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, {-1, ImGui::GetWindowHeight()}))
{
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::Text("Shortcuts");
ImGui::TableSetColumnIndex(1);
ImGui::Text("Tip of the day");
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::Text("Something else!?");
ImGui::TableSetColumnIndex(1);
ImGui::Text("Yes, why not?");
ImGui::EndTable();
}
#else
std::pair<float, float> dims = {ImGui::GetWindowWidth(), ImGui::GetWindowHeight()};
float scale = backend::device_scale;
std::string title = "Welcome to SatDump!";
2025-08-01 00:39:05 +02:00
{
ImGui::PushFont(style::bigFont);
ImVec2 title_size = ImGui::CalcTextSize(title.c_str());
2025-08-05 19:07:45 +02:00
ImGui::SetCursorPos({((float)dims.first / 2) - (75 * scale), ((float)dims.second / 2.f) - title_size.y - (90 * scale)});
2025-08-01 00:39:05 +02:00
ImGui::Image((void *)satdump_logo_texture, ImVec2(150 * scale, 150 * scale));
2025-08-05 19:07:45 +02:00
ImGui::SetCursorPos({((float)dims.first / 2) - (title_size.x / 2), ((float)dims.second / 2.0f) - title_size.y + (75 * scale)});
2025-08-01 00:39:05 +02:00
ImGui::TextUnformatted(title.c_str());
ImGui::PopFont();
2025-08-07 07:28:53 +02:00
float last_pos = 0;
2025-08-05 19:07:45 +02:00
for (int p = 0, i = 0; p < tip_of_the_day.length();)
{
int cutLength = 0;
for (int pp = p + 50; pp < tip_of_the_day.length(); pp++)
{
cutLength = pp;
if (tip_of_the_day[pp] == ' ')
break;
}
std::string line = tip_of_the_day.substr(p, cutLength - p);
ImVec2 line_size = ImGui::CalcTextSize(line.c_str());
2025-08-07 07:28:53 +02:00
last_pos = ((float)dims.second / 2) + ((80 + i * 20) * scale);
ImGui::SetCursorPos({((float)dims.first / 2) - (line_size.x / 2), last_pos});
2025-08-05 19:07:45 +02:00
ImGui::TextDisabled("%s", line.c_str());
p += line.size();
i++;
}
2025-08-05 23:16:31 +02:00
{
ImVec2 line_size = ImGui::CalcTextSize("Start Processing");
2025-08-07 07:28:53 +02:00
ImGui::SetCursorPos({((float)dims.first / 2) - (line_size.x / 2), last_pos + (26 * 1) * scale});
if (ImGui::Button("Start Processing"))
showProcessing(); // TODOREWORK do not bind this directly.
2025-08-05 23:16:31 +02:00
}
{
ImVec2 line_size = ImGui::CalcTextSize("Add Recorder");
2025-08-07 07:28:53 +02:00
ImGui::SetCursorPos({((float)dims.first / 2) - (line_size.x / 2), last_pos + (26 * 2) * scale});
if (ImGui::Button("Add Recorder"))
2025-08-13 13:52:48 +02:00
tryOpenSomethingInExplorer(
[](ExplorerApplication *)
{
2025-08-13 13:56:22 +02:00
logger->warn("Adding Recorder!");
2025-08-13 13:52:48 +02:00
eventBus->fire_event<explorer::ExplorerAddHandlerEvent>({std::make_shared<RecorderApplication>()}); // TODOREWORK do not bind this directly.
});
2025-08-05 23:16:31 +02:00
}
2025-08-01 00:39:05 +02:00
}
2025-08-02 14:56:42 +02:00
#endif
2025-08-01 00:39:05 +02:00
ImGui::EndChild();
}
}
2024-12-29 20:13:58 +01:00
2025-07-23 12:21:02 +02:00
void ExplorerApplication::draw()
2024-12-29 20:13:58 +01:00
{
2025-07-05 22:22:17 +02:00
drawMenuBar();
2025-06-22 17:18:53 +02:00
ImVec2 explorer_size = ImGui::GetContentRegionAvail();
2024-12-29 20:13:58 +01:00
2025-07-23 12:21:02 +02:00
if (ImGui::BeginTable("##explorer_table", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_BordersInnerV))
2024-12-29 20:13:58 +01:00
{
2025-06-22 17:18:53 +02:00
ImGui::TableSetupColumn("##panel_v", ImGuiTableColumnFlags_None, explorer_size.x * panel_ratio);
ImGui::TableSetupColumn("##view", ImGuiTableColumnFlags_None, explorer_size.x * (1.0f - panel_ratio));
2024-12-31 17:01:12 +01:00
ImGui::TableNextColumn();
2024-12-29 20:13:58 +01:00
2024-12-31 17:01:12 +01:00
float left_width = ImGui::GetColumnWidth(0);
2025-06-22 17:18:53 +02:00
float right_width = explorer_size.x - left_width;
2024-12-31 17:01:12 +01:00
if (left_width != last_width && last_width != -1)
2025-06-22 17:18:53 +02:00
panel_ratio = left_width / explorer_size.x;
2024-12-31 17:01:12 +01:00
last_width = left_width;
2024-12-29 20:13:58 +01:00
2025-07-05 22:22:17 +02:00
ImGui::BeginChild("ExplorerChildPanel", {left_width, float(explorer_size.y - 10)}, false);
2024-12-31 17:01:12 +01:00
drawPanel();
ImGui::EndChild();
2024-12-29 20:13:58 +01:00
2024-12-31 17:01:12 +01:00
ImGui::TableNextColumn();
ImGui::BeginGroup();
2024-12-29 20:13:58 +01:00
2024-12-31 17:01:12 +01:00
if (curr_handler)
2025-06-22 17:18:53 +02:00
curr_handler->drawContents({float(right_width - 9 * ui_scale), float(explorer_size.y)});
2025-01-02 17:04:32 +01:00
else
drawContents();
2024-12-29 20:13:58 +01:00
2024-12-31 17:01:12 +01:00
ImGui::EndGroup();
ImGui::EndTable();
2024-12-29 20:13:58 +01:00
}
}
2025-01-03 10:03:04 +01:00
2025-06-22 17:18:53 +02:00
void ExplorerApplication::tryOpenFileInExplorer(std::string path)
2025-01-03 10:03:04 +01:00
{
auto fun = [this, path]()
{
2025-07-14 21:21:55 +02:00
eventBus->fire_event<SetIsProcessingEvent>({});
2025-04-06 10:27:54 +02:00
try
2025-01-03 10:03:04 +01:00
{
2025-07-24 21:55:57 +02:00
// Get available loaders
std::vector<std::pair<std::string, std::function<void(std::string, ExplorerApplication *)>>> loaders;
2025-01-03 10:03:04 +01:00
2025-07-24 21:55:57 +02:00
// Default stuff
2025-04-06 10:27:54 +02:00
if (std::filesystem::path(path).extension().string() == ".cbor")
2025-07-24 21:55:57 +02:00
loaders.push_back({"Product Loader", [](std::string path, ExplorerApplication *e)
{
logger->trace("Explorer loading product " + path);
try
{
auto prod_h = handlers::getProductHandlerForProduct(products::loadProduct(path));
e->addHandler(prod_h);
}
catch (std::exception &e)
{
logger->error("Error loading product! Maybe not a valid product? (Reminder : Pre-2.0.0 products are NOT compatible with 2.0.0) Details : %s",
e.what());
}
}});
2025-04-06 10:27:54 +02:00
else if (std::filesystem::path(path).extension().string() == ".json")
2025-07-24 21:55:57 +02:00
loaders.push_back(
{"Dataset Loader", [](std::string path, ExplorerApplication *e)
{
logger->trace("Viewer loading dataset " + path);
try
{
products::DataSet dataset;
dataset.load(path);
std::shared_ptr<handlers::DatasetHandler> dat_h = std::make_shared<handlers::DatasetHandler>(std::filesystem::path(path).parent_path().string(), dataset);
e->addHandler(dat_h);
}
catch (std::exception &e)
{
logger->error("Error loading dataset! Maybe not a valid dataset? (Reminder : Pre-2.0.0 datasets are NOT compatible with 2.0.0) Details : %s", e.what());
}
}});
else if (std::filesystem::path(path).extension().string() == ".shp")
loaders.push_back({"Shapefile Loader", [](std::string path, ExplorerApplication *e)
{
logger->trace("Viewer loading shapefile " + path);
e->addHandler(std::make_shared<handlers::ShapefileHandler>(path));
}});
2025-08-25 20:01:59 +02:00
// Plugin loaders
eventBus->fire_event<ExplorerRequestFileLoad>({path, loaders});
#if 1 // TODOREWORK ADD MENU
if (loaders.size() == 0)
2025-07-24 21:55:57 +02:00
loaders.push_back({"Image Loader", [](std::string path, ExplorerApplication *e)
{
logger->trace("Viewer loading image " + path);
image::Image img;
image::load_img(img, path);
if (img.size() > 0)
e->addHandler(std::make_shared<handlers::ImageHandler>(img, std::filesystem::path(path).stem().string()));
else
logger->error("Could not open this file as image!");
}});
#endif
// Load it
if (loaders.size() == 1)
{
2025-07-24 21:55:57 +02:00
loaders[0].second(path, this);
}
2025-07-24 21:55:57 +02:00
else if (loaders.size() > 1)
{
2025-08-25 19:58:55 +02:00
logger->error("More than one loader available! TODO SELECTION MENU!");
loaders[loaders.size() - 1].second(path, this);
}
2025-04-06 10:27:54 +02:00
else
{
2025-07-24 21:55:57 +02:00
throw satdump_exception("No loader found for file : " + path + "!");
}
2025-01-03 10:03:04 +01:00
}
2025-04-06 10:27:54 +02:00
catch (std::exception &e)
2025-02-03 07:52:21 +01:00
{
2025-04-06 10:27:54 +02:00
logger->error("Error opening file! => %s", e.what());
2025-02-03 07:52:21 +01:00
}
2025-07-14 21:21:55 +02:00
eventBus->fire_event<SetIsDoneProcessingEvent>({});
2025-01-03 10:03:04 +01:00
};
2025-07-18 12:19:40 +02:00
file_open_queue.push(fun);
2025-01-03 10:03:04 +01:00
}
2025-08-13 13:52:48 +02:00
void ExplorerApplication::tryOpenSomethingInExplorer(std::function<void(ExplorerApplication *)> f)
{
auto fun = [f, this]()
{
eventBus->fire_event<SetIsProcessingEvent>({});
try
{
f(this);
}
catch (std::exception &e)
{
logger->error("Error opening file! => %s", e.what());
}
eventBus->fire_event<SetIsDoneProcessingEvent>({});
};
file_open_queue.push(fun);
}
2025-06-22 17:18:53 +02:00
} // namespace explorer
2025-04-15 19:06:12 +01:00
}; // namespace satdump