2025-06-22 17:18:53 +02:00
# include "explorer.h"
2024-12-29 20:13:58 +01:00
// #include "image_handler.h"
// #include "radiation_handler.h"
// #include "scatterometer_handler.h"
2024-12-31 17:01:12 +01:00
// #include "core/config.h"
// #include "products/dataset.h"
2024-12-29 20:13:58 +01:00
# include "common/utils.h"
2025-05-25 14:30:24 +02:00
// #include "core/resources.h"
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
2025-04-27 12:24:09 +02: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"
2025-05-19 22:26:32 +02:00
# 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
2025-05-25 14:30:24 +02:00
# 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
2025-05-25 14:30:24 +02: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 " ) ;
2025-05-19 22:26:32 +02:00
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-01-31 10:34:47 +01:00
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-06-14 21:56:36 +02:00
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
2025-05-19 22:26:32 +02:00
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
2025-08-02 15:41:29 +02: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 " ) ;
2025-08-02 15:41:29 +02:00
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 ( ) ) ;
2025-08-02 15:41:29 +02:00
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 " ) ;
}
2025-08-02 15:41:29 +02:00
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
2025-08-02 15:41:29 +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?
{
2025-05-19 22:26:32 +02:00
if ( file_open_dialog . update ( ) )
2025-01-03 10:03:04 +01:00
{
2025-05-19 22:26:32 +02: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 ( ) )
{
2025-05-19 22:26:32 +02:00
// 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
{
2025-05-19 22:26:32 +02:00
file_open_dialog . render ( " Open File " , " Open File " , " " , { { " All Files " , " * " } } ) ;
2025-01-02 17:04:32 +01:00
2025-05-23 12:30:42 +02: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-05-23 12:30:42 +02:00
{
2025-06-22 17:18:53 +02:00
tryOpenFileInExplorer ( quickOpenString ) ;
2025-05-23 12:30:42 +02:00
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-06-22 17:18:53 +02:00
tryOpenFileInExplorer ( std : : string ( ImGui : : GetClipboardText ( ) ) ) ;
2025-05-23 12:30:42 +02:00
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 " ) )
2025-05-19 22:26:32 +02:00
{ // 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 > ( ) ) ;
2025-04-12 09:07:02 +02:00
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-05-19 22:26:32 +02: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 } ) ;
2025-08-05 23:16:31 +02:00
ImGui : : Button ( " Start Processing " ) ;
}
{
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 } ) ;
2025-08-05 23:16:31 +02:00
ImGui : : Button ( " Add Recorder " ) ;
}
2025-08-02 14:56:42 +02:00
// ImVec2 slogan_size1 = ImGui::CalcTextSize(slogan1.c_str());
// ImGui::SetCursorPos({((float)dims.first / 2) - (slogan_size1.x / 2), ((float)dims.second / 2) + (80 * scale)});
// ImGui::TextUnformatted(slogan1.c_str());
// ImVec2 slogan_size2 = ImGui::CalcTextSize(slogan2.c_str());
// ImGui::SetCursorPos({((float)dims.first / 2) - (slogan_size2.x / 2), ((float)dims.second / 2) + (100 * scale)});
// ImGui::TextUnformatted(slogan2.c_str());
2025-08-01 00:39:05 +02:00
2025-08-05 19:07:45 +02:00
// ImGui::SetCursorPos({20 * ui_scale, ((float)dims.second / 2.2f)});
// float table_height = dims.second - 250 * ui_scale;
// if (ImGui::BeginTable("##dscovrinstrumentstable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, {ImGui::GetWindowWidth() - 40 * ui_scale, table_height}))
// {
// ImGui::TableNextRow(0, table_height / 2);
// ImGui::TableSetColumnIndex(0);
// ImGui::Text("Shortcuts");
// ImGui::Button("Add Recorder");
// ImGui::Button("Open File");
// ImGui::TableSetColumnIndex(1);
// ImGui::Text("Tip of the day");
// ImGui::Text("Did you know you could know that you could");
// ImGui::Text("know that you could know how to know to be");
// ImGui::Text("able to know?");
// ImGui::TableNextRow(0, table_height / 2);
// ImGui::TableSetColumnIndex(0);
// ImGui::Text("Something else!?");
// ImGui::TableSetColumnIndex(1);
// ImGui::Text("Yes, why not?");
// ImGui::EndTable();
// }
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 ) ) ;
} } ) ;
#if 0 // TODOREWORK ADD MENU
else if ( std : : filesystem : : path ( path ) . has_extension ( ) )
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
// Plugin loaders
2025-07-25 19:35:55 +02:00
eventBus - > fire_event < ExplorerRequestFileLoad > ( { path , loaders } ) ;
2025-07-24 21:55:57 +02:00
// Load it
if ( loaders . size ( ) = = 1 )
2025-01-03 22:43:40 +01:00
{
2025-07-24 21:55:57 +02:00
loaders [ 0 ] . second ( path , this ) ;
2025-01-03 22:43:40 +01:00
}
2025-07-24 21:55:57 +02:00
else if ( loaders . size ( ) > 1 )
2025-01-03 22:43:40 +01:00
{
2025-07-24 21:55:57 +02:00
throw satdump_exception ( " More than one loader available! TODO SELECTION MENU! " ) ;
2025-01-03 22:43:40 +01:00
}
2025-04-06 10:27:54 +02:00
else
2025-01-03 22:43:40 +01:00
{
2025-07-24 21:55:57 +02:00
throw satdump_exception ( " No loader found for file : " + path + " ! " ) ;
2025-01-03 22:43:40 +01:00
}
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-06-22 17:18:53 +02:00
} // namespace explorer
2025-04-15 19:06:12 +01:00
} ; // namespace satdump