satdump/src-interface/main_ui.cpp

245 lines
9 KiB
C++
Raw Normal View History

2021-08-15 16:47:44 +02:00
#include "main_ui.h"
#include "imgui/imgui_flags.h"
#include "imgui/imgui.h"
#include "processing.h"
#include "offline.h"
2022-03-30 15:41:23 +02:00
#include "settings.h"
2022-03-10 19:56:37 +01:00
#include "error.h"
2022-03-30 15:41:23 +02:00
#include "satdump_vars.h"
#include "core/config.h"
#include "core/style.h"
2022-06-20 18:54:33 +02:00
#include "resources.h"
#include "common/widgets/markdown_helper.h"
#include "common/audio/audio_sink.h"
2023-05-20 22:40:36 +02:00
#include "imgui_notify/imgui_notify.h"
#include "notify_logger_sink.h"
2022-08-08 10:45:19 +02:00
2022-12-17 16:55:11 +01:00
// #define ENABLE_DEBUG_MAP
2022-08-11 12:25:30 +02:00
#ifdef ENABLE_DEBUG_MAP
#include "common/widgets/image_view.h"
2022-08-08 22:14:13 +02:00
float lat = 0, lon = 0, lat1 = 0, lon1 = 0;
2022-08-08 10:45:19 +02:00
int zoom = 0;
2022-08-08 22:14:13 +02:00
image::Image<uint8_t> img(800, 400, 3);
2022-08-08 10:45:19 +02:00
ImageViewWidget ivw;
2022-08-11 12:25:30 +02:00
#endif
2022-03-20 20:56:32 +01:00
2022-03-10 19:56:37 +01:00
namespace satdump
2021-08-15 16:47:44 +02:00
{
2022-05-07 18:16:24 +02:00
std::shared_ptr<RecorderApplication> recorder_app;
std::shared_ptr<ViewerApplication> viewer_app;
2022-04-24 12:43:34 +02:00
bool in_app = false; // true;
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;
2022-03-10 19:56:37 +01:00
void initMainUI()
{
audio::registerSinks();
2022-03-10 19:56:37 +01:00
offline::setup();
2022-03-30 15:41:23 +02:00
settings::setup();
light_theme = config::main_cfg["user_interface"]["light_theme"]["value"].get<bool>();
float manual_dpi_scaling = config::main_cfg["user_interface"]["manual_dpi_scaling"]["value"].get<float>();
2023-05-30 21:24:53 +02:00
#ifdef __ANDROID__
manual_dpi_scaling *= 3; // Otherwise it's just too small by default!
#endif
2022-03-30 15:41:23 +02:00
ui_scale = manual_dpi_scaling;
// Setup Theme
2022-09-07 18:44:52 +02:00
if (light_theme)
style::setLightStyle(manual_dpi_scaling);
2022-03-30 15:41:23 +02:00
else
2022-09-07 18:44:52 +02:00
style::setDarkStyle(manual_dpi_scaling);
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);
credits_md.init();
registerApplications();
2022-04-12 20:18:44 +02:00
registerViewerHandlers();
2022-05-07 18:16:24 +02:00
recorder_app = std::make_shared<RecorderApplication>();
viewer_app = std::make_shared<ViewerApplication>();
2023-05-20 22:40:36 +02:00
// 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()
{
2023-01-22 20:39:51 +01:00
viewer_app.reset();
2022-05-08 16:58:14 +02:00
recorder_app->save_settings();
2022-12-17 16:55:11 +01:00
recorder_app.reset();
2022-05-08 16:35:54 +02:00
}
bool main_ui_is_processing_selected = false;
2022-03-10 19:56:37 +01:00
void renderMainUI(int wwidth, int wheight)
2021-08-15 16:47:44 +02:00
{
2022-09-17 16:22:26 +02:00
// ImGui::ShowDemoWindow();
2022-05-07 18:16:24 +02:00
/*if (in_app)
{
ImGui::SetNextWindowPos({0, 0});
ImGui::SetNextWindowSize({(float)wwidth, (float)wheight});
2022-05-02 08:11:47 -07:00
ImGui::Begin("Main", NULL, NOWINDOW_FLAGS | ImGuiWindowFlags_NoDecoration);
current_app->draw();
ImGui::End();
2022-05-07 18:16:24 +02:00
}*/
2022-05-03 17:00:43 +02:00
/*else if (processing::is_processing)
2021-08-15 16:47:44 +02:00
{
2022-03-10 19:56:37 +01:00
processing::ui_call_list_mutex->lock();
float winheight = processing::ui_call_list->size() > 0 ? wheight / processing::ui_call_list->size() : wheight;
float currentPos = 0;
for (std::shared_ptr<ProcessingModule> module : *processing::ui_call_list)
{
ImGui::SetNextWindowPos({0, currentPos});
currentPos += winheight;
ImGui::SetNextWindowSize({(float)wwidth, (float)winheight});
module->drawUI(false);
}
processing::ui_call_list_mutex->unlock();
2022-05-03 17:00:43 +02:00
}*/
2022-05-07 18:16:24 +02:00
// else
{
2022-03-10 19:56:37 +01:00
ImGui::SetNextWindowPos({0, 0});
ImGui::SetNextWindowSize({(float)wwidth, (processing::is_processing & main_ui_is_processing_selected) ? -1.0f : (float)wheight});
2022-05-02 08:11:47 -07:00
ImGui::Begin("Main", NULL, NOWINDOW_FLAGS | ImGuiWindowFlags_NoDecoration);
2022-03-10 19:56:37 +01:00
if (ImGui::BeginTabBar("Main TabBar", ImGuiTabBarFlags_None))
{
main_ui_is_processing_selected = false;
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();
int live_width = wwidth; // ImGui::GetWindowWidth();
int live_height = /*ImGui::GetWindowHeight()*/ wheight - 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;
for (std::shared_ptr<ProcessingModule> module : *processing::ui_call_list)
{
ImGui::SetNextWindowPos({0, currentPos});
currentPos += winheight;
ImGui::SetNextWindowSize({(float)live_width, (float)winheight});
module->drawUI(false);
2022-05-03 17:00:43 +02:00
}
processing::ui_call_list_mutex->unlock();
// ImGui::EndChild();
}
else
{
offline::render();
}
2022-03-10 19:56:37 +01:00
ImGui::EndTabItem();
main_ui_is_processing_selected = true;
2022-03-10 19:56:37 +01:00
}
2022-05-07 18:16:24 +02:00
if (ImGui::BeginTabItem("Recorder"))
{
recorder_app->draw();
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem("Viewer"))
{
viewer_app->draw();
ImGui::EndTabItem();
}
2022-09-07 13:19:23 +02:00
#if 0
if (ImGui::BeginTabItem("Applications"))
{
2022-04-12 20:18:44 +02:00
// current_app->draw();
2022-05-07 18:16:24 +02:00
if (in_app)
{
2022-05-07 18:16:24 +02:00
// current_app->draw();
}
else
{
for (std::pair<const std::string, std::function<std::shared_ptr<Application>()>> &appEntry : application_registry)
{
2022-05-07 18:16:24 +02:00
if (ImGui::Button(appEntry.first.c_str()))
{
in_app = true;
// current_app = application_registry[appEntry.first]();
}
}
}
ImGui::EndTabItem();
}
2022-09-07 13:19:23 +02:00
#endif
2022-03-30 15:41:23 +02:00
if (ImGui::BeginTabItem("Settings"))
{
settings::render();
ImGui::EndTabItem();
}
2022-06-20 18:54:33 +02:00
if (ImGui::BeginTabItem("Credits"))
{
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-08-11 12:25:30 +02:00
#ifdef ENABLE_DEBUG_MAP
2022-08-08 10:45:19 +02:00
if (ImGui::BeginTabItem("Map"))
{
2022-08-08 16:15:26 +02:00
tileMap tm;
2022-08-08 10:45:19 +02:00
ImGui::SetNextItemWidth(120);
ImGui::InputFloat("Latitude", &lat);
ImGui::SameLine();
ImGui::SetNextItemWidth(120);
ImGui::InputFloat("Longitude", &lon);
2022-08-08 22:14:13 +02:00
ImGui::SetNextItemWidth(120);
ImGui::InputFloat("Latitude##1", &lat1);
ImGui::SameLine();
ImGui::SetNextItemWidth(120);
ImGui::InputFloat("Longitude##1", &lon1);
2022-08-08 10:45:19 +02:00
ImGui::SetNextItemWidth(250);
ImGui::SliderInt("Zoom", &zoom, 0, 19);
if (ImGui::Button("Get tile from server"))
{
2022-08-11 12:25:30 +02:00
// mapTile tl(tm.downloadTile(tm.coorToTile({lat, lon}, zoom), zoom));
2022-08-10 18:30:38 +02:00
img = tm.getMapImage({lat, lon}, {lat1, lon1}, zoom);
2022-08-11 12:25:30 +02:00
ivw.update(img);
2022-08-08 10:45:19 +02:00
}
2022-08-08 22:14:13 +02:00
ivw.draw(ImVec2(800, 400));
2022-08-08 10:45:19 +02:00
ImGui::EndTabItem();
}
2022-08-11 12:25:30 +02:00
#endif
}
2022-03-10 19:56:37 +01:00
ImGui::EndTabBar();
ImGui::End();
2022-03-10 19:56:37 +01:00
if (error::hasError)
error::render();
if (settings::show_imgui_demo)
ImGui::ShowDemoWindow();
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); // Round borders
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(43.f / 255.f, 43.f / 255.f, 43.f / 255.f, 100.f / 255.f)); // Background color
ImGui::RenderNotifications(); // <-- Here we render all notifications
ImGui::PopStyleVar(1); // Don't forget to Pop()
ImGui::PopStyleColor(1);
}
2022-03-10 19:56:37 +01:00
2022-03-30 15:41:23 +02:00
bool light_theme;
2022-03-10 19:56:37 +01:00
ctpl::thread_pool ui_thread_pool(8);
}