mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-16 17:10:20 +08:00
210 lines
8.4 KiB
C++
210 lines
8.4 KiB
C++
#include "application/gui_application.h"
|
|
#include "layout.h"
|
|
#include "localization.h"
|
|
#include "rd_log.h"
|
|
|
|
namespace crossdesk {
|
|
|
|
bool GuiApplication::ConnectionStatusWindow(
|
|
std::shared_ptr<RemoteSession> &props) {
|
|
ImGuiIO &io = ImGui::GetIO();
|
|
bool ret_flag = false;
|
|
|
|
ImGui::SetNextWindowPos(
|
|
ImVec2(io.DisplaySize.x * 0.33f, io.DisplaySize.y * 0.33f));
|
|
ImGui::SetNextWindowSize(
|
|
ImVec2(io.DisplaySize.x * 0.33f, io.DisplaySize.y * 0.33f));
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, window_rounding_ * 0.5f);
|
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, window_rounding_);
|
|
|
|
ImGui::Begin("ConnectionStatusWindow", nullptr,
|
|
ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove |
|
|
ImGuiWindowFlags_NoSavedSettings);
|
|
ImGui::PopStyleVar(2);
|
|
ImGui::PopStyleColor();
|
|
|
|
auto connection_status_window_width = ImGui::GetWindowSize().x;
|
|
auto connection_status_window_height = ImGui::GetWindowSize().y;
|
|
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
std::string text;
|
|
const ConnectionStatus status = props->connection_status_.load();
|
|
|
|
if (ConnectionStatus::Connecting == status) {
|
|
text = localization::p2p_connecting[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// cancel
|
|
if (ImGui::Button(
|
|
localization::cancel[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
re_enter_remote_id_ = true;
|
|
LOG_INFO("User cancelled connecting to [{}]", props->remote_id_);
|
|
if (props->peer_) {
|
|
LeaveConnection(props->peer_, props->remote_id_.c_str());
|
|
}
|
|
ret_flag = true;
|
|
}
|
|
} else if (ConnectionStatus::Gathering == status) {
|
|
text = localization::p2p_gathering[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// cancel
|
|
if (ImGui::Button(
|
|
localization::cancel[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
re_enter_remote_id_ = true;
|
|
LOG_INFO("User cancelled connecting to [{}]", props->remote_id_);
|
|
if (props->peer_) {
|
|
LeaveConnection(props->peer_, props->remote_id_.c_str());
|
|
}
|
|
ret_flag = true;
|
|
}
|
|
} else if (ConnectionStatus::Connected == status) {
|
|
text = localization::p2p_connected[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
}
|
|
} else if (ConnectionStatus::Disconnected == status) {
|
|
text = localization::p2p_disconnected[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
}
|
|
} else if (ConnectionStatus::Failed == status) {
|
|
text = localization::p2p_failed[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
}
|
|
} else if (ConnectionStatus::Closed == status) {
|
|
text = localization::p2p_closed[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
}
|
|
} else if (ConnectionStatus::IncorrectPassword == status) {
|
|
if (!password_validating_) {
|
|
if (password_validating_time_ == 1) {
|
|
text = localization::input_password[localization_language_index_];
|
|
} else {
|
|
text = localization::reinput_password[localization_language_index_];
|
|
}
|
|
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.336f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.4f);
|
|
ImGui::SetNextItemWidth(connection_status_window_width * 0.33f);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
|
|
|
|
if (focus_on_input_widget_) {
|
|
ImGui::SetKeyboardFocusHere();
|
|
focus_on_input_widget_ = false;
|
|
}
|
|
|
|
ImGui::InputText("##password", props->remote_password_,
|
|
IM_ARRAYSIZE(props->remote_password_),
|
|
ImGuiInputTextFlags_CharsNoBlank);
|
|
|
|
ImGui::SetWindowFontScale(0.4f);
|
|
|
|
ImVec2 text_size = ImGui::CalcTextSize(
|
|
localization::remember_password[localization_language_index_]
|
|
.c_str());
|
|
ImGui::SetCursorPosX((connection_status_window_width - text_size.x) *
|
|
0.45f);
|
|
ImGui::Checkbox(
|
|
localization::remember_password[localization_language_index_].c_str(),
|
|
&(props->remember_password_));
|
|
ImGui::SetWindowFontScale(0.5f);
|
|
ImGui::PopStyleVar();
|
|
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.325f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.75f);
|
|
// ok
|
|
if (ImGui::Button(
|
|
localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter)) {
|
|
show_connection_status_window_ = true;
|
|
password_validating_ = true;
|
|
props->rejoin_ = true;
|
|
need_to_rejoin_ = true;
|
|
focus_on_input_widget_ = true;
|
|
}
|
|
|
|
ImGui::SameLine();
|
|
// cancel
|
|
if (ImGui::Button(
|
|
localization::cancel[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
memset(props->remote_password_, 0, sizeof(props->remote_password_));
|
|
show_connection_status_window_ = false;
|
|
focus_on_input_widget_ = true;
|
|
}
|
|
} else if (password_validating_) {
|
|
text = localization::validate_password[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
}
|
|
} else if (ConnectionStatus::NoSuchTransmissionId == status) {
|
|
text = localization::no_such_id[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter)) {
|
|
show_connection_status_window_ = false;
|
|
re_enter_remote_id_ = true;
|
|
DestroyPeer(&props->peer_);
|
|
ret_flag = true;
|
|
}
|
|
} else if (ConnectionStatus::RemoteUnavailable == status) {
|
|
text = localization::device_offline[localization_language_index_];
|
|
ImGui::SetCursorPosX(connection_status_window_width * 0.43f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.67f);
|
|
// ok
|
|
if (ImGui::Button(localization::ok[localization_language_index_].c_str()) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
|
show_connection_status_window_ = false;
|
|
re_enter_remote_id_ = true;
|
|
DestroyPeer(&props->peer_);
|
|
ret_flag = true;
|
|
}
|
|
}
|
|
|
|
auto text_width = ImGui::CalcTextSize(text.c_str()).x;
|
|
ImGui::SetCursorPosX((connection_status_window_width - text_width) * 0.5f);
|
|
ImGui::SetCursorPosY(connection_status_window_height * 0.2f);
|
|
ImGui::Text("%s", text.c_str());
|
|
ImGui::SetWindowFontScale(1.0f);
|
|
|
|
ImGui::End();
|
|
ImGui::PopStyleVar();
|
|
|
|
return ret_flag;
|
|
}
|
|
} // namespace crossdesk
|