mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-12-17 04:26:47 +08:00
312 lines
11 KiB
C++
312 lines
11 KiB
C++
#include <filesystem>
|
|
#include <vector>
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#include "layout.h"
|
|
#include "localization.h"
|
|
#include "rd_log.h"
|
|
#include "render.h"
|
|
|
|
namespace crossdesk {
|
|
|
|
std::vector<std::string> GetRootEntries() {
|
|
std::vector<std::string> roots;
|
|
#ifdef _WIN32
|
|
DWORD mask = GetLogicalDrives();
|
|
for (char letter = 'A'; letter <= 'Z'; ++letter) {
|
|
if (mask & 1) {
|
|
roots.push_back(std::string(1, letter) + ":\\");
|
|
}
|
|
mask >>= 1;
|
|
}
|
|
#else
|
|
roots.push_back("/");
|
|
#endif
|
|
return roots;
|
|
}
|
|
|
|
int Render::ShowSimpleFileBrowser() {
|
|
std::string display_text;
|
|
|
|
if (selected_current_file_path_.empty()) {
|
|
selected_current_file_path_ = std::filesystem::current_path().string();
|
|
}
|
|
|
|
if (!tls_cert_path_self_.empty()) {
|
|
display_text =
|
|
std::filesystem::path(tls_cert_path_self_).filename().string();
|
|
} else if (selected_current_file_path_ != "Root") {
|
|
display_text =
|
|
std::filesystem::path(selected_current_file_path_).filename().string();
|
|
if (display_text.empty()) {
|
|
display_text = selected_current_file_path_;
|
|
}
|
|
}
|
|
|
|
if (display_text.empty()) {
|
|
display_text =
|
|
localization::select_a_file[localization_language_index_].c_str();
|
|
}
|
|
|
|
if (show_file_browser_) {
|
|
ImGui::PushItemFlag(ImGuiItemFlags_AutoClosePopups, false);
|
|
|
|
float fixed_width = title_bar_button_width_ * 3.8f;
|
|
ImGui::SetNextItemWidth(fixed_width);
|
|
ImGui::SetNextWindowSizeConstraints(ImVec2(fixed_width, 0),
|
|
ImVec2(fixed_width, 100.0f));
|
|
|
|
if (ImGui::BeginCombo("##select_a_file", display_text.c_str(), 0)) {
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
bool file_selected = false;
|
|
|
|
auto roots = GetRootEntries();
|
|
if (selected_current_file_path_ == "Root" ||
|
|
!std::filesystem::exists(selected_current_file_path_) ||
|
|
!std::filesystem::is_directory(selected_current_file_path_)) {
|
|
for (const auto& root : roots) {
|
|
if (ImGui::Selectable(root.c_str())) {
|
|
selected_current_file_path_ = root;
|
|
tls_cert_path_self_.clear();
|
|
}
|
|
}
|
|
} else {
|
|
std::filesystem::path p(selected_current_file_path_);
|
|
|
|
if (ImGui::Selectable("..")) {
|
|
if (std::find(roots.begin(), roots.end(),
|
|
selected_current_file_path_) != roots.end()) {
|
|
selected_current_file_path_ = "Root";
|
|
} else if (p.has_parent_path()) {
|
|
selected_current_file_path_ = p.parent_path().string();
|
|
} else {
|
|
selected_current_file_path_ = "Root";
|
|
}
|
|
tls_cert_path_self_.clear();
|
|
}
|
|
|
|
try {
|
|
for (const auto& entry : std::filesystem::directory_iterator(
|
|
selected_current_file_path_)) {
|
|
std::string name = entry.path().filename().string();
|
|
if (entry.is_directory()) {
|
|
if (ImGui::Selectable(name.c_str())) {
|
|
selected_current_file_path_ = entry.path().string();
|
|
tls_cert_path_self_.clear();
|
|
}
|
|
} else {
|
|
if (ImGui::Selectable(name.c_str())) {
|
|
tls_cert_path_self_ = entry.path().string();
|
|
file_selected = true;
|
|
show_file_browser_ = false;
|
|
}
|
|
}
|
|
}
|
|
} catch (const std::exception& e) {
|
|
ImGui::TextColored(ImVec4(1, 0, 0, 1), "Error: %s", e.what());
|
|
}
|
|
}
|
|
|
|
ImGui::EndCombo();
|
|
}
|
|
ImGui::PopItemFlag();
|
|
} else {
|
|
show_file_browser_ = true;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int Render::SelfHostedServerWindow() {
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
if (show_self_hosted_server_config_window_) {
|
|
if (self_hosted_server_config_window_pos_reset_) {
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetNextWindowPos(
|
|
ImVec2(io.DisplaySize.x * 0.298f, io.DisplaySize.y * 0.25f));
|
|
ImGui::SetNextWindowSize(
|
|
ImVec2(io.DisplaySize.x * 0.407f, io.DisplaySize.y * 0.41f));
|
|
} else {
|
|
ImGui::SetNextWindowPos(
|
|
ImVec2(io.DisplaySize.x * 0.27f, io.DisplaySize.y * 0.3f));
|
|
ImGui::SetNextWindowSize(
|
|
ImVec2(io.DisplaySize.x * 0.465f, io.DisplaySize.y * 0.41f));
|
|
}
|
|
|
|
self_hosted_server_config_window_pos_reset_ = false;
|
|
}
|
|
|
|
// Settings
|
|
{
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
|
|
|
|
ImGui::Begin(localization::self_hosted_server_settings
|
|
[localization_language_index_]
|
|
.c_str(),
|
|
nullptr,
|
|
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse |
|
|
ImGuiWindowFlags_NoSavedSettings);
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
|
|
{
|
|
ImGui::AlignTextToFramePadding();
|
|
ImGui::Text("%s", localization::self_hosted_server_address
|
|
[localization_language_index_]
|
|
.c_str());
|
|
ImGui::SameLine();
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.5f);
|
|
} else {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 3.43f);
|
|
}
|
|
ImGui::SetNextItemWidth(title_bar_button_width_ * 3.8f);
|
|
|
|
ImGui::InputText("##signal_server_ip_self_", signal_server_ip_self_,
|
|
IM_ARRAYSIZE(signal_server_ip_self_),
|
|
ImGuiInputTextFlags_AlwaysOverwrite);
|
|
}
|
|
|
|
ImGui::Separator();
|
|
|
|
{
|
|
ImGui::AlignTextToFramePadding();
|
|
ImGui::Text(
|
|
"%s",
|
|
localization::self_hosted_server_port[localization_language_index_]
|
|
.c_str());
|
|
ImGui::SameLine();
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.5f);
|
|
} else {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 3.43f);
|
|
}
|
|
ImGui::SetNextItemWidth(title_bar_button_width_ * 3.8f);
|
|
|
|
ImGui::InputText("##signal_server_port_self_", signal_server_port_self_,
|
|
IM_ARRAYSIZE(signal_server_port_self_));
|
|
}
|
|
|
|
ImGui::Separator();
|
|
|
|
{
|
|
ImGui::AlignTextToFramePadding();
|
|
ImGui::Text("%s", localization::self_hosted_server_coturn_server_port
|
|
[localization_language_index_]
|
|
.c_str());
|
|
ImGui::SameLine();
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.5f);
|
|
} else {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 3.43f);
|
|
}
|
|
ImGui::SetNextItemWidth(title_bar_button_width_ * 3.8f);
|
|
|
|
ImGui::InputText("##coturn_server_port_self_", coturn_server_port_self_,
|
|
IM_ARRAYSIZE(coturn_server_port_self_));
|
|
}
|
|
|
|
ImGui::Separator();
|
|
|
|
{
|
|
ImGui::AlignTextToFramePadding();
|
|
ImGui::Text("%s", localization::self_hosted_server_certificate_path
|
|
[localization_language_index_]
|
|
.c_str());
|
|
ImGui::SameLine();
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.5f);
|
|
} else {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 3.43f);
|
|
}
|
|
ImGui::SetNextItemWidth(title_bar_button_width_ * 3.8f);
|
|
|
|
ShowSimpleFileBrowser();
|
|
}
|
|
|
|
if (stream_window_inited_) {
|
|
ImGui::EndDisabled();
|
|
}
|
|
|
|
ImGui::Dummy(ImVec2(0.0f, title_bar_button_width_ * 0.25f));
|
|
|
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.32f);
|
|
} else {
|
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.7f);
|
|
}
|
|
|
|
ImGui::PopStyleVar();
|
|
|
|
// OK
|
|
if (ImGui::Button(
|
|
localization::ok[localization_language_index_].c_str())) {
|
|
show_self_hosted_server_config_window_ = false;
|
|
|
|
config_center_->SetServerHost(signal_server_ip_self_);
|
|
config_center_->SetServerPort(atoi(signal_server_port_self_));
|
|
config_center_->SetCoturnServerPort(atoi(coturn_server_port_self_));
|
|
config_center_->SetCertFilePath(tls_cert_path_self_);
|
|
strncpy(signal_server_ip_, signal_server_ip_self_,
|
|
sizeof(signal_server_ip_) - 1);
|
|
signal_server_ip_[sizeof(signal_server_ip_) - 1] = '\0';
|
|
strncpy(signal_server_port_, signal_server_port_self_,
|
|
sizeof(signal_server_port_) - 1);
|
|
signal_server_port_[sizeof(signal_server_port_) - 1] = '\0';
|
|
strncpy(coturn_server_port_, coturn_server_port_self_,
|
|
sizeof(coturn_server_port_) - 1);
|
|
coturn_server_port_[sizeof(coturn_server_port_) - 1] = '\0';
|
|
strncpy(cert_file_path_, tls_cert_path_self_.c_str(),
|
|
sizeof(cert_file_path_) - 1);
|
|
cert_file_path_[sizeof(cert_file_path_) - 1] = '\0';
|
|
|
|
self_hosted_server_config_window_pos_reset_ = true;
|
|
}
|
|
|
|
ImGui::SameLine();
|
|
// Cancel
|
|
if (ImGui::Button(
|
|
localization::cancel[localization_language_index_].c_str())) {
|
|
show_self_hosted_server_config_window_ = false;
|
|
self_hosted_server_config_window_pos_reset_ = true;
|
|
strncpy(signal_server_ip_self_,
|
|
config_center_->GetSignalServerHost().c_str(),
|
|
sizeof(signal_server_ip_self_) - 1);
|
|
signal_server_ip_self_[sizeof(signal_server_ip_self_) - 1] = '\0';
|
|
int signal_port = config_center_->GetSignalServerPort();
|
|
if (signal_port > 0) {
|
|
strncpy(signal_server_port_self_, std::to_string(signal_port).c_str(),
|
|
sizeof(signal_server_port_self_) - 1);
|
|
signal_server_port_self_[sizeof(signal_server_port_self_) - 1] = '\0';
|
|
} else {
|
|
signal_server_port_self_[0] = '\0';
|
|
}
|
|
int coturn_port = config_center_->GetCoturnServerPort();
|
|
if (coturn_port > 0) {
|
|
strncpy(coturn_server_port_self_, std::to_string(coturn_port).c_str(),
|
|
sizeof(coturn_server_port_self_) - 1);
|
|
coturn_server_port_self_[sizeof(coturn_server_port_self_) - 1] = '\0';
|
|
} else {
|
|
coturn_server_port_self_[0] = '\0';
|
|
}
|
|
tls_cert_path_self_ = config_center_->GetCertFilePath();
|
|
}
|
|
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
ImGui::End();
|
|
ImGui::PopStyleVar(2);
|
|
ImGui::PopStyleColor();
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
} // namespace crossdesk
|