mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
202 lines
6.8 KiB
C++
202 lines
6.8 KiB
C++
#include "localization.h"
|
|
#include "rd_log.h"
|
|
#include "render.h"
|
|
|
|
void Render::DrawConnectionStatusText(
|
|
std::shared_ptr<SubStreamWindowProperties>& props) {
|
|
std::string text;
|
|
switch (props->connection_status_) {
|
|
case ConnectionStatus::Disconnected:
|
|
text = localization::p2p_disconnected[localization_language_index_];
|
|
break;
|
|
case ConnectionStatus::Failed:
|
|
text = localization::p2p_failed[localization_language_index_];
|
|
break;
|
|
case ConnectionStatus::Closed:
|
|
text = localization::p2p_closed[localization_language_index_];
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (!text.empty()) {
|
|
ImVec2 size = ImGui::GetWindowSize();
|
|
ImVec2 text_size = ImGui::CalcTextSize(text.c_str());
|
|
ImGui::SetCursorPos(
|
|
ImVec2((size.x - text_size.x) * 0.5f,
|
|
(size.y - text_size.y - title_bar_height_) * 0.5f));
|
|
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 1.0f), "%s", text.c_str());
|
|
}
|
|
}
|
|
|
|
void Render::CloseTab(decltype(client_properties_)::iterator& it) {
|
|
CleanupPeer(it->second);
|
|
it = client_properties_.erase(it);
|
|
if (client_properties_.empty()) {
|
|
SDL_Event event;
|
|
event.type = SDL_EVENT_QUIT;
|
|
SDL_PushEvent(&event);
|
|
}
|
|
}
|
|
|
|
int Render::StreamWindow() {
|
|
ImGui::SetNextWindowPos(
|
|
ImVec2(0, fullscreen_button_pressed_ ? 0 : title_bar_height_),
|
|
ImGuiCond_Always);
|
|
ImGui::SetNextWindowSize(ImVec2(stream_window_width_, stream_window_height_),
|
|
ImGuiCond_Always);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0));
|
|
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
|
|
ImGui::Begin("VideoBg", nullptr,
|
|
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration |
|
|
ImGuiWindowFlags_NoBringToFrontOnFocus |
|
|
ImGuiWindowFlags_NoDocking);
|
|
ImGui::PopStyleColor(2);
|
|
ImGui::PopStyleVar();
|
|
|
|
ImGuiWindowFlags stream_window_flag =
|
|
ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoDecoration |
|
|
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoMove;
|
|
|
|
if (!fullscreen_button_pressed_) {
|
|
ImGui::SetNextWindowPos(ImVec2(20, 0), ImGuiCond_Always);
|
|
ImGui::SetNextWindowSize(ImVec2(0, 20), ImGuiCond_Always);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 8.0f));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.0f));
|
|
ImGui::Begin("TabBar", nullptr,
|
|
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration |
|
|
ImGuiWindowFlags_NoBringToFrontOnFocus |
|
|
ImGuiWindowFlags_NoDocking);
|
|
ImGui::PopStyleColor();
|
|
ImGui::PopStyleVar(2);
|
|
|
|
if (ImGui::BeginTabBar("StreamTabBar",
|
|
ImGuiTabBarFlags_Reorderable |
|
|
ImGuiTabBarFlags_AutoSelectNewTabs)) {
|
|
is_tab_bar_hovered_ = ImGui::IsWindowHovered();
|
|
|
|
for (auto it = client_properties_.begin();
|
|
it != client_properties_.end();) {
|
|
auto& props = it->second;
|
|
if (!props->tab_opened_) {
|
|
CloseTab(it);
|
|
continue;
|
|
}
|
|
|
|
ImGui::SetWindowFontScale(0.6f);
|
|
std::string tab_label =
|
|
enable_srtp_
|
|
? std::string(ICON_FA_SHIELD_HALVED) + " " + props->remote_id_
|
|
: props->remote_id_;
|
|
if (ImGui::BeginTabItem(tab_label.c_str(), &props->tab_opened_)) {
|
|
props->tab_selected_ = true;
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
|
|
ImGui::SetNextWindowSize(
|
|
ImVec2(stream_window_width_, stream_window_height_),
|
|
ImGuiCond_Always);
|
|
ImGui::SetNextWindowPos(
|
|
ImVec2(0, fullscreen_button_pressed_ ? 0 : title_bar_height_),
|
|
ImGuiCond_Always);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.0f));
|
|
ImGui::Begin(props->remote_id_.c_str(), nullptr, stream_window_flag);
|
|
ImGui::PopStyleColor();
|
|
ImGui::PopStyleVar(2);
|
|
|
|
ImVec2 pos = ImGui::GetWindowPos();
|
|
ImVec2 size = ImGui::GetWindowSize();
|
|
props->render_window_x_ = pos.x;
|
|
props->render_window_y_ = pos.y;
|
|
props->render_window_width_ = size.x;
|
|
props->render_window_height_ = size.y;
|
|
UpdateRenderRect();
|
|
|
|
ControlWindow(props);
|
|
|
|
focused_remote_id_ = props->remote_id_;
|
|
|
|
if (!props->peer_) {
|
|
it = client_properties_.erase(it);
|
|
if (client_properties_.empty()) {
|
|
SDL_Event event;
|
|
event.type = SDL_EVENT_QUIT;
|
|
SDL_PushEvent(&event);
|
|
}
|
|
} else {
|
|
DrawConnectionStatusText(props);
|
|
++it;
|
|
}
|
|
|
|
ImGui::End();
|
|
ImGui::EndTabItem();
|
|
} else {
|
|
props->tab_selected_ = false;
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
++it;
|
|
}
|
|
}
|
|
|
|
ImGui::EndTabBar();
|
|
}
|
|
|
|
ImGui::End(); // End TabBar
|
|
} else {
|
|
for (auto it = client_properties_.begin();
|
|
it != client_properties_.end();) {
|
|
auto& props = it->second;
|
|
if (!props->tab_opened_) {
|
|
CloseTab(it);
|
|
continue;
|
|
}
|
|
|
|
if (props->tab_selected_) {
|
|
ImGui::SetNextWindowSize(
|
|
ImVec2(stream_window_width_, stream_window_height_),
|
|
ImGuiCond_Always);
|
|
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.0f));
|
|
ImGui::Begin(props->remote_id_.c_str(), nullptr, stream_window_flag);
|
|
ImGui::PopStyleColor();
|
|
ImGui::PopStyleVar(2);
|
|
|
|
ImVec2 pos = ImGui::GetWindowPos();
|
|
ImVec2 size = ImGui::GetWindowSize();
|
|
props->render_window_x_ = pos.x;
|
|
props->render_window_y_ = pos.y;
|
|
props->render_window_width_ = size.x;
|
|
props->render_window_height_ = size.y;
|
|
UpdateRenderRect();
|
|
|
|
ControlWindow(props);
|
|
ImGui::End();
|
|
|
|
if (!props->peer_) {
|
|
fullscreen_button_pressed_ = false;
|
|
SDL_SetWindowFullscreen(stream_window_, false);
|
|
it = client_properties_.erase(it);
|
|
if (client_properties_.empty()) {
|
|
SDL_Event event;
|
|
event.type = SDL_EVENT_QUIT;
|
|
SDL_PushEvent(&event);
|
|
}
|
|
} else {
|
|
DrawConnectionStatusText(props);
|
|
++it;
|
|
}
|
|
} else {
|
|
++it;
|
|
}
|
|
}
|
|
}
|
|
|
|
// UpdateRenderRect();
|
|
ImGui::End(); // End VideoBg
|
|
|
|
return 0;
|
|
} |