diff --git a/driveruilayer.cpp b/driveruilayer.cpp index c5557934..fad3977e 100644 --- a/driveruilayer.cpp +++ b/driveruilayer.cpp @@ -63,7 +63,6 @@ void driver_ui::render_menu_contents() { ImGui::MenuItem(m_mappanel.name().c_str(), "Tab", &m_mappanel.is_open); ImGui::MenuItem(m_vehiclelist.name().c_str(), nullptr, &m_vehiclelist.is_open); ImGui::MenuItem(m_trainingcardpanel.name().c_str(), nullptr, &m_trainingcardpanel.is_open); - ImGui::MenuItem(m_cameraviewpanel.name().c_str(), nullptr, &m_cameraviewpanel.is_open); if (DebugModeFlag) ImGui::MenuItem(m_perfgraphpanel.name().c_str(), nullptr, &m_perfgraphpanel.is_open); @@ -226,6 +225,11 @@ driver_ui::set_cursor( bool const Visible ) { // render() subclass details void driver_ui::render_() { + const std::string *rec_name = m_trainingcardpanel.is_recording(); + if (rec_name && !m_cameraviewpanel.is_open) + m_cameraviewpanel.rec_name = *rec_name; + m_cameraviewpanel.is_open = !!rec_name; + // pause/quit modal auto const popupheader { STR_C("Simulation Paused") }; diff --git a/driveruipanels.cpp b/driveruipanels.cpp index e99bf89e..f4d29d58 100644 --- a/driveruipanels.cpp +++ b/driveruipanels.cpp @@ -33,7 +33,7 @@ drivingaid_panel::update() { if( false == is_open ) { return; } - text_lines.clear(); + text_lines.clear(); auto const *train { simulation::Train }; auto const *controlled { ( train ? train->Dynamic() : nullptr ) }; diff --git a/widgets/cameraview_extcam.cpp b/widgets/cameraview_extcam.cpp index 96961a81..a3ab8a5c 100644 --- a/widgets/cameraview_extcam.cpp +++ b/widgets/cameraview_extcam.cpp @@ -27,13 +27,19 @@ ui::cameraview_panel::~cameraview_panel() { void ui::cameraview_panel::render() { - if (!is_open) + if (!is_open) { exit_thread = true; + return; + } - if (is_open) - ImGui::SetNextWindowSizeConstraints(ImVec2(200, 200), ImVec2(2500, 2500), cameraview_window_callback); + ImGui::SetNextWindowSizeConstraints(ImVec2(200, 200), ImVec2(2500, 2500), cameraview_window_callback); - ui_panel::render(); + auto const panelname{(title.empty() ? m_name : title) + "###" + m_name}; + if (ImGui::Begin(panelname.c_str())) { + render_contents(); + } + + ImGui::End(); } void ui::cameraview_panel::render_contents() @@ -82,7 +88,16 @@ void ui::cameraview_panel::render_contents() void ui::cameraview_panel::workthread_func() { - piped_proc proc(Global.extcam_cmd); + std::string cmdline = Global.extcam_cmd; + + if (!rec_name.empty()) { + const std::string magic{"{RECORD}"}; + size_t pos = cmdline.find(magic); + if (pos != -1) + cmdline.replace(pos, magic.size(), rec_name); + } + + piped_proc proc(cmdline); size_t frame_size = Global.extcam_res.x * Global.extcam_res.y * 3; uint8_t *read_buffer = new uint8_t[frame_size]; diff --git a/widgets/cameraview_extcam.h b/widgets/cameraview_extcam.h index fcf1c69b..d65a1213 100644 --- a/widgets/cameraview_extcam.h +++ b/widgets/cameraview_extcam.h @@ -27,5 +27,7 @@ class cameraview_panel : public ui_panel void render() override; void render_contents() override; + + std::string rec_name; }; } // namespace ui diff --git a/widgets/trainingcard.cpp b/widgets/trainingcard.cpp index 81c21c14..9acea1d8 100644 --- a/widgets/trainingcard.cpp +++ b/widgets/trainingcard.cpp @@ -24,6 +24,7 @@ void trainingcard_panel::clear() { start_time_wall.reset(); state.store(0); + recording_timestamp.clear(); place.clear(); trainee_name.clear(); @@ -53,10 +54,7 @@ void trainingcard_panel::save_thread_func() tm = std::localtime(&now); std::string to = std::to_string(tm->tm_hour) + ":" + std::to_string(tm->tm_min); - std::string rep = std::to_string(tm->tm_year + 1900) + std::to_string(tm->tm_mon + 1) + std::to_string(tm->tm_mday) - + std::to_string(tm->tm_hour) + std::to_string(tm->tm_min) + "_" + std::string(trainee_name.c_str()) + "_" + std::string(instructor_name.c_str()); - - std::fstream temp("reports/" + rep + ".html", std::ios_base::out | std::ios_base::binary); + std::fstream temp("reports/" + recording_timestamp + ".html", std::ios_base::out | std::ios_base::binary); std::fstream input("report_template.html", std::ios_base::in | std::ios_base::binary); std::string in_line; @@ -82,7 +80,7 @@ void trainingcard_panel::save_thread_func() input.close(); temp.close(); - state.store(EndRecording(rep)); + state.store(EndRecording(recording_timestamp)); } void trainingcard_panel::render_contents() @@ -151,6 +149,9 @@ void trainingcard_panel::render_contents() if (!start_time_wall) { if (ImGui::Button("Rozpocznij szkolenie")) { start_time_wall = std::time(nullptr); + std::tm *tm = std::localtime(&(*start_time_wall)); + recording_timestamp = std::to_string(tm->tm_year + 1900) + std::to_string(tm->tm_mon + 1) + std::to_string(tm->tm_mday) + + std::to_string(tm->tm_hour) + std::to_string(tm->tm_min) + "_" + std::string(trainee_name.c_str()) + "_" + std::string(instructor_name.c_str()); int ret = StartRecording(); if (ret != 1) { @@ -172,3 +173,11 @@ void trainingcard_panel::render_contents() } } } + +const std::string *trainingcard_panel::is_recording() +{ + if (!start_time_wall) + return nullptr; + + return &recording_timestamp; +} diff --git a/widgets/trainingcard.h b/widgets/trainingcard.h index a02d4bc7..5fcbf8bd 100644 --- a/widgets/trainingcard.h +++ b/widgets/trainingcard.h @@ -31,4 +31,7 @@ class trainingcard_panel : public ui_panel ~trainingcard_panel(); void render_contents() override; + const std::string *is_recording(); + + std::string recording_timestamp; };