satdump/src-interface/main_ui.cpp

275 lines
10 KiB
C++
Raw Normal View History

2025-07-06 22:54:20 +02:00
#include "common/imgui_utils.h"
2024-05-18 19:22:33 +02:00
#define SATDUMP_DLL_EXPORT2 1
2025-06-01 13:18:41 +02:00
#include "common/audio/audio_sink.h"
2025-05-03 12:12:36 +02:00
#include "common/widgets/markdown_helper.h"
#include "core/backend.h"
2025-06-01 13:18:41 +02:00
#include "core/plugin.h"
#include "core/resources.h"
2025-05-03 12:12:36 +02:00
#include "imgui/imgui.h"
#include "imgui/imgui_flags.h"
2023-05-20 22:40:36 +02:00
#include "imgui_notify/imgui_notify.h"
2025-07-06 22:54:20 +02:00
#include "main_ui.h"
2023-05-20 22:40:36 +02:00
#include "notify_logger_sink.h"
2025-05-03 12:12:36 +02:00
#include "offline.h"
#include "processing.h"
#include "satdump_vars.h"
#include "settings.h"
2023-08-09 22:21:32 -04:00
#include "status_logger_sink.h"
2022-08-08 10:45:19 +02:00
2023-10-04 21:40:08 +02:00
#include "imgui/implot/implot.h"
2024-12-20 20:47:52 +01:00
#include "imgui/implot3d/implot3d.h"
2023-10-04 21:40:08 +02:00
2022-03-10 19:56:37 +01:00
namespace satdump
2021-08-15 16:47:44 +02:00
{
2024-05-18 19:22:33 +02:00
SATDUMP_DLL2 std::shared_ptr<RecorderApplication> recorder_app;
2025-06-22 17:18:53 +02:00
SATDUMP_DLL2 std::shared_ptr<explorer::ExplorerApplication> explorer_app;
2024-05-18 18:05:04 +02:00
std::vector<std::shared_ptr<Application>> other_apps;
2024-05-18 19:22:33 +02:00
SATDUMP_DLL2 bool update_ui = true;
2024-01-06 08:24:56 -05:00
bool open_recorder;
2022-06-20 18:54:33 +02:00
widgets::MarkdownHelper credits_md;
2023-05-20 22:40:36 +02:00
std::shared_ptr<NotifyLoggerSink> notify_logger_sink;
2023-08-09 22:21:32 -04:00
std::shared_ptr<StatusLoggerSink> status_logger_sink;
2023-05-20 22:40:36 +02:00
void initMainUI()
2022-03-10 19:56:37 +01:00
{
2023-10-04 21:40:08 +02:00
ImPlot::CreateContext();
2024-12-20 20:47:52 +01:00
ImPlot3D::CreateContext();
2023-10-04 21:40:08 +02:00
audio::registerSinks();
2022-03-10 19:56:37 +01:00
offline::setup();
2022-03-30 15:41:23 +02:00
settings::setup();
2022-06-20 18:54:33 +02:00
// Load credits MD
std::ifstream ifs(resources::getResourcePath("credits.md"));
std::string credits_markdown((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
credits_md.set_md(credits_markdown);
2022-05-07 18:16:24 +02:00
recorder_app = std::make_shared<RecorderApplication>();
2025-06-22 17:18:53 +02:00
explorer_app = std::make_shared<explorer::ExplorerApplication>();
2025-06-08 16:57:37 +02:00
open_recorder = satdump_cfg.main_cfg.contains("cli") && satdump_cfg.main_cfg["cli"].contains("start_recorder_device");
2023-05-20 22:40:36 +02:00
2024-05-18 18:05:04 +02:00
eventBus->fire_event<AddGUIApplicationEvent>({other_apps});
2023-10-04 21:40:08 +02:00
// Logger status bar sync
2023-08-10 12:03:26 -04:00
status_logger_sink = std::make_shared<StatusLoggerSink>();
2023-10-04 21:40:08 +02:00
if (status_logger_sink->is_shown())
2023-08-09 22:21:32 -04:00
logger->add_sink(status_logger_sink);
// Shut down the logger init buffer manually to prevent init warnings
// From showing as a toast, or in the product processor screen
completeLoggerInit();
// Logger notify sink
notify_logger_sink = std::make_shared<NotifyLoggerSink>();
logger->add_sink(notify_logger_sink);
2022-03-10 19:56:37 +01:00
}
2021-08-15 16:47:44 +02:00
2022-05-08 16:35:54 +02:00
void exitMainUI()
{
2022-05-08 16:58:14 +02:00
recorder_app->save_settings();
2025-06-22 17:18:53 +02:00
// TODOREWORK SAVING AGAIN? explorer_app->save_settings();
2025-06-08 16:57:37 +02:00
satdump_cfg.saveUser();
2022-12-17 16:55:11 +01:00
recorder_app.reset();
2025-06-22 17:18:53 +02:00
explorer_app.reset();
2022-05-08 16:35:54 +02:00
}
2025-07-05 22:22:17 +02:00
// TODOREWORKUI
bool offline_en = false;
2025-07-06 22:54:20 +02:00
bool about_en = false;
bool settings_en = false;
2025-07-05 22:22:17 +02:00
2023-12-31 16:49:23 -05:00
void renderMainUI()
2021-08-15 16:47:44 +02:00
{
if (update_ui)
{
2024-01-22 23:39:05 -05:00
style::setStyle();
style::setFonts(ui_scale);
update_ui = false;
}
2023-12-31 16:49:23 -05:00
std::pair<int, int> dims = backend::beginFrame();
2024-01-26 22:45:55 -05:00
dims.second -= status_logger_sink->draw();
2022-09-17 16:22:26 +02:00
2022-05-07 18:16:24 +02:00
// else
{
2022-03-10 19:56:37 +01:00
ImGui::SetNextWindowPos({0, 0});
2024-01-26 22:45:55 -05:00
ImGui::SetNextWindowSize({(float)dims.first, (float)dims.second});
2025-07-05 22:22:17 +02:00
ImGui::Begin("SatDump UI", nullptr, NOWINDOW_FLAGS | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_MenuBar);
#if 1
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Others"))
{
2025-07-06 22:54:20 +02:00
if (ImGui::MenuItem("Offline Processing"))
offline_en = true;
if (ImGui::MenuItem("About"))
about_en = true;
if (ImGui::MenuItem("Settings"))
settings_en = true;
2025-07-05 22:22:17 +02:00
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
if (offline_en)
2025-07-06 22:54:20 +02:00
ImGui::OpenPopup("offline");
// if (offline_en)
if (ImGui::BeginPopupModal("offline", &offline_en, ImGuiWindowFlags_AlwaysAutoResize))
2025-07-05 22:22:17 +02:00
{
2025-07-06 22:54:20 +02:00
// ImGui::BeginChild("Offline Processing");
2025-07-05 22:22:17 +02:00
if (processing::is_processing)
{
// ImGui::BeginChild("OfflineProcessingChild");
processing::ui_call_list_mutex->lock();
int live_width = dims.first; // ImGui::GetWindowWidth();
int live_height = /*ImGui::GetWindowHeight()*/ dims.second - ImGui::GetCursorPos().y;
float winheight = processing::ui_call_list->size() > 0 ? live_height / processing::ui_call_list->size() : live_height;
float currentPos = ImGui::GetCursorPos().y;
ImGui::PushStyleColor(ImGuiCol_TitleBg, ImGui::GetStyleColorVec4(ImGuiCol_TitleBgActive));
for (std::shared_ptr<pipeline::ProcessingModule> module : *processing::ui_call_list)
{
ImGui::SetNextWindowPos({0, currentPos});
currentPos += winheight;
ImGui::SetNextWindowSize({(float)live_width, (float)winheight});
module->drawUI(false);
}
ImGui::PopStyleColor();
processing::ui_call_list_mutex->unlock();
// ImGui::EndChild();
}
else
{
2025-07-06 22:54:20 +02:00
// ImGui::BeginChild("offlineprocessing", ImGui::GetContentRegionAvail());
2025-07-05 22:22:17 +02:00
offline::render();
2025-07-06 22:54:20 +02:00
// ImGui::EndChild();
2025-07-05 22:22:17 +02:00
}
2025-07-06 22:54:20 +02:00
// ImGui::EndChild();
ImGui::EndPopup();
}
if (settings_en)
ImGui::OpenPopup("Settings");
if (ImGui::BeginPopupModal("Settings", &settings_en, /*ImGuiWindowFlags_AlwaysAutoResize |*/ ImGuiWindowFlags_AlwaysVerticalScrollbar))
{
settings::render();
ImGui::EndPopup();
}
if (about_en)
ImGui::OpenPopup("About");
if (ImGui::BeginPopupModal("About", &about_en, /*ImGuiWindowFlags_AlwaysAutoResize |*/ ImGuiWindowFlags_AlwaysVerticalScrollbar))
{
credits_md.render();
ImGui::EndPopup();
2025-07-05 22:22:17 +02:00
}
2025-07-06 22:54:20 +02:00
explorer_app->draw(false);
2025-07-05 22:22:17 +02:00
#else
2022-03-10 19:56:37 +01:00
if (ImGui::BeginTabBar("Main TabBar", ImGuiTabBarFlags_None))
{
2022-03-10 19:56:37 +01:00
if (ImGui::BeginTabItem("Offline processing"))
{
2022-05-03 17:00:43 +02:00
if (processing::is_processing)
{
// ImGui::BeginChild("OfflineProcessingChild");
processing::ui_call_list_mutex->lock();
2023-12-31 16:49:23 -05:00
int live_width = dims.first; // ImGui::GetWindowWidth();
int live_height = /*ImGui::GetWindowHeight()*/ dims.second - ImGui::GetCursorPos().y;
2022-05-03 17:00:43 +02:00
float winheight = processing::ui_call_list->size() > 0 ? live_height / processing::ui_call_list->size() : live_height;
float currentPos = ImGui::GetCursorPos().y;
2023-11-20 14:18:52 -05:00
ImGui::PushStyleColor(ImGuiCol_TitleBg, ImGui::GetStyleColorVec4(ImGuiCol_TitleBgActive));
for (std::shared_ptr<pipeline::ProcessingModule> module : *processing::ui_call_list)
2022-05-03 17:00:43 +02:00
{
ImGui::SetNextWindowPos({0, currentPos});
currentPos += winheight;
ImGui::SetNextWindowSize({(float)live_width, (float)winheight});
module->drawUI(false);
2022-05-03 17:00:43 +02:00
}
2023-11-20 14:18:52 -05:00
ImGui::PopStyleColor();
2022-05-03 17:00:43 +02:00
processing::ui_call_list_mutex->unlock();
// ImGui::EndChild();
}
else
{
ImGui::BeginChild("offlineprocessing", ImGui::GetContentRegionAvail());
2022-05-03 17:00:43 +02:00
offline::render();
ImGui::EndChild();
2022-05-03 17:00:43 +02:00
}
2022-03-10 19:56:37 +01:00
ImGui::EndTabItem();
}
2024-01-06 08:24:56 -05:00
if (ImGui::BeginTabItem("Recorder", nullptr, open_recorder ? ImGuiTabItemFlags_SetSelected : ImGuiTabItemFlags_None))
2022-05-07 18:16:24 +02:00
{
2024-01-06 08:24:56 -05:00
open_recorder = false;
2022-05-07 18:16:24 +02:00
recorder_app->draw();
ImGui::EndTabItem();
}
2025-06-22 17:18:53 +02:00
if (ImGui::BeginTabItem("Explorer"))
2024-12-29 20:13:58 +01:00
{
2025-06-22 17:18:53 +02:00
explorer_app->draw();
2024-12-29 20:13:58 +01:00
ImGui::EndTabItem();
2022-05-07 18:16:24 +02:00
}
2024-05-18 18:05:04 +02:00
for (auto &app : other_apps)
{
2024-05-18 18:05:04 +02:00
if (ImGui::BeginTabItem(std::string(app->get_name() + "##appsoption").c_str()))
2022-05-07 18:16:24 +02:00
{
2024-05-18 18:05:04 +02:00
app->draw();
ImGui::EndTabItem();
}
}
2022-03-30 15:41:23 +02:00
if (ImGui::BeginTabItem("Settings"))
{
ImGui::BeginChild("settings", ImGui::GetContentRegionAvail());
2022-03-30 15:41:23 +02:00
settings::render();
ImGui::EndChild();
2022-03-30 15:41:23 +02:00
ImGui::EndTabItem();
}
2023-10-13 16:19:24 -04:00
if (ImGui::BeginTabItem("About"))
2022-06-20 18:54:33 +02:00
{
2022-09-11 16:15:15 +02:00
ImGui::BeginChild("credits_md", ImGui::GetContentRegionAvail(), false, ImGuiWindowFlags_AlwaysVerticalScrollbar);
2022-06-20 18:54:33 +02:00
credits_md.render();
2022-09-11 16:15:15 +02:00
ImGui::EndChild();
2022-06-20 18:54:33 +02:00
ImGui::EndTabItem();
}
}
2022-03-10 19:56:37 +01:00
ImGui::EndTabBar();
2025-07-05 22:22:17 +02:00
#endif
2023-11-20 14:18:52 -05:00
ImGuiUtils_SendCurrentWindowToBack();
2022-03-10 19:56:37 +01:00
ImGui::End();
if (settings::show_imgui_demo)
2024-12-06 19:49:11 +01:00
{
ImGui::ShowDemoWindow();
2024-12-06 19:49:11 +01:00
ImPlot::ShowDemoWindow();
2024-12-20 20:47:52 +01:00
ImPlot3D::ShowDemoWindow();
2024-12-06 19:49:11 +01:00
}
2022-03-10 19:56:37 +01:00
}
2023-05-20 22:40:36 +02:00
// Render toasts on top of everything, at the end of your code!
// You should push style vars here
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.f);
2024-09-08 22:25:10 -04:00
ImGui::PushStyleColor(ImGuiCol_WindowBg, (ImVec4)style::theme.notification_bg);
notify_logger_sink->notify_mutex.lock();
ImGui::RenderNotifications();
notify_logger_sink->notify_mutex.unlock();
ImGui::PopStyleVar(1);
2023-05-20 22:40:36 +02:00
ImGui::PopStyleColor(1);
2023-12-31 16:49:23 -05:00
backend::endFrame();
}
2022-03-10 19:56:37 +01:00
2024-05-18 19:22:33 +02:00
SATDUMP_DLL2 ctpl::thread_pool ui_thread_pool(8);
2025-05-03 12:12:36 +02:00
} // namespace satdump