diff --git a/src/start_screen.cpp b/src/start_screen.cpp index 9541e7c..ca5af03 100644 --- a/src/start_screen.cpp +++ b/src/start_screen.cpp @@ -184,271 +184,281 @@ Screen* StartScreen::render(float, bool&) { const float TEXT_PROCEED_WIDTH = ImGui::CalcTextSize("proceed").x; const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); - ImGui::SetNextWindowSize({656,334}, ImGuiCond_FirstUseEver); - ImGui::Begin("start screen"); + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(viewport->WorkPos); + ImGui::SetNextWindowSize(viewport->WorkSize); - // TODO: imgui tox profile selector? + constexpr auto bg_window_flags = + ImGuiWindowFlags_NoDecoration | + ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoBringToFrontOnFocus; - // +---------------------------- - // | |*tox profile*| plugins | toxcore config | - // | +------+ +-------- - // | | ICON | | fileselector/dropdown? - // | | | | password input - // | +------+ +-------- - // | [proceed] - // +---------------------------- + if (ImGui::Begin("start screen", nullptr, bg_window_flags)) { + // TODO: imgui tox profile selector? - if (ImGui::BeginChild("conf", {0, ImGui::GetContentRegionAvail().y - TEXT_BASE_HEIGHT*2.f})) { - if (ImGui::BeginTabBar("view")) { - if (ImGui::BeginTabItem("load profile")) { - _new_save = false; + // +---------------------------- + // | |*tox profile*| plugins | toxcore config | + // | +------+ +-------- + // | | ICON | | fileselector/dropdown? + // | | | | password input + // | +------+ +-------- + // | [proceed] + // +---------------------------- - ImGui::TextUnformatted("profile :"); - ImGui::SameLine(); - if (ImGui::Button("select")) { - _fss.requestFile( - [](const auto& path) -> bool { return std::filesystem::is_regular_file(path); }, - [this](const auto& path) { - _tox_profile_path = path.string(); - }, - [](){} - ); - } - ImGui::SameLine(); - ImGui::TextUnformatted(_tox_profile_path.c_str()); + if (ImGui::BeginChild("conf", {0, ImGui::GetContentRegionAvail().y - TEXT_BASE_HEIGHT*2.f})) { + if (ImGui::BeginTabBar("view")) { + if (ImGui::BeginTabItem("load profile")) { + _new_save = false; - ImGui::TextUnformatted("password:"); - ImGui::SameLine(); - if (_show_password) { - ImGui::InputText("##password", &_password); - } else { - ImGui::InputText("##password", &_password, ImGuiInputTextFlags_Password); - } - ImGui::SameLine(); - ImGui::Checkbox("show password", &_show_password); - - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("create profile")) { - _new_save = true; - - ImGui::TextUnformatted("username:"); - ImGui::SameLine(); - if (ImGui::InputText("##user_name", &_user_name)) { - std::string tmp_copy = _user_name; - for (auto& c : tmp_copy) { - if (!std::isalnum(static_cast(c)) && c != '-' && c != '.') { - c = '_'; - } - } - - if (tmp_copy.empty()) { - tmp_copy = "unnamed-tomato"; - } - - _tox_profile_path = tmp_copy + ".tox"; - } - - ImGui::TextUnformatted("password:"); - ImGui::SameLine(); - if (_show_password) { - ImGui::InputText("##password", &_password); - } else { - ImGui::InputText("##password", &_password, ImGuiInputTextFlags_Password); - } - ImGui::SameLine(); - ImGui::Checkbox("show password", &_show_password); - - ImGui::TextUnformatted("TODO: profile path (current path for now)"); - - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("plugins")) { - // list of selected plugins (in order) - for (auto it = queued_plugin_paths.begin(); it != queued_plugin_paths.end();) { - ImGui::PushID(it->c_str()); - if (ImGui::SmallButton("-")) { - it = queued_plugin_paths.erase(it); - ImGui::PopID(); - continue; + ImGui::TextUnformatted("profile :"); + ImGui::SameLine(); + if (ImGui::Button("select")) { + _fss.requestFile( + [](const auto& path) -> bool { return std::filesystem::is_regular_file(path); }, + [this](const auto& path) { + _tox_profile_path = path.string(); + }, + [](){} + ); } ImGui::SameLine(); - ImGui::TextUnformatted(it->c_str()); + ImGui::TextUnformatted(_tox_profile_path.c_str()); - ImGui::PopID(); - it++; - } - - if (ImGui::Button("+")) { - _fss.requestFile( - [](const auto& path) -> bool { return std::filesystem::is_regular_file(path); }, - [this](const auto& path) { - queued_plugin_paths.push_back(path.string()); - }, - [](){} - ); - } - - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("toxcore")) { - ImGui::TextDisabled("Be advised that no settings are written to disk.\nUse a config file if you don't want to set these values every start."); - - ImGui::SeparatorText("DNS"); - - { - static bool value {true}; - if (ImGui::Checkbox("DNS lookups", &value)) { - _conf.set("tox", "dns", value); + ImGui::TextUnformatted("password:"); + ImGui::SameLine(); + if (_show_password) { + ImGui::InputText("##password", &_password); + } else { + ImGui::InputText("##password", &_password, ImGuiInputTextFlags_Password); } - ImGui::SetItemTooltip("Allow toxcore to use your systems name resolver."); + ImGui::SameLine(); + ImGui::Checkbox("show password", &_show_password); + + ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("create profile")) { + _new_save = true; - ImGui::SeparatorText("Proxy"); - - static int proxy_type {0}; - if (ImGui::Combo("proxy type", &proxy_type, "NONE\0HTTP\0SOCKS5\0")) { - if (proxy_type == 0) { - _conf.set("tox", "proxy_type", std::string_view{"NONE"}); - } else if (proxy_type == 1) { - _conf.set("tox", "proxy_type", std::string_view{"HTTP"}); - } else if (proxy_type == 2) { - _conf.set("tox", "proxy_type", std::string_view{"SOCKS5"}); - } - } - - ImGui::BeginDisabled(proxy_type == 0); - { - { - static std::string value; - if (ImGui::InputText("host", &value)) { - _conf.set("tox", "proxy_host", value); + ImGui::TextUnformatted("username:"); + ImGui::SameLine(); + if (ImGui::InputText("##user_name", &_user_name)) { + std::string tmp_copy = _user_name; + for (auto& c : tmp_copy) { + if (!std::isalnum(static_cast(c)) && c != '-' && c != '.') { + c = '_'; + } } - ImGui::SetItemTooltip("toxcore does not currently support authentication."); + + if (tmp_copy.empty()) { + tmp_copy = "unnamed-tomato"; + } + + _tox_profile_path = tmp_copy + ".tox"; + } + + ImGui::TextUnformatted("password:"); + ImGui::SameLine(); + if (_show_password) { + ImGui::InputText("##password", &_password); + } else { + ImGui::InputText("##password", &_password, ImGuiInputTextFlags_Password); + } + ImGui::SameLine(); + ImGui::Checkbox("show password", &_show_password); + + ImGui::TextUnformatted("TODO: profile path (current path for now)"); + + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("plugins")) { + // list of selected plugins (in order) + for (auto it = queued_plugin_paths.begin(); it != queued_plugin_paths.end();) { + ImGui::PushID(it->c_str()); + if (ImGui::SmallButton("-")) { + it = queued_plugin_paths.erase(it); + ImGui::PopID(); + continue; + } + ImGui::SameLine(); + ImGui::TextUnformatted(it->c_str()); + + ImGui::PopID(); + it++; + } + + if (ImGui::Button("+")) { + _fss.requestFile( + [](const auto& path) -> bool { return std::filesystem::is_regular_file(path); }, + [this](const auto& path) { + queued_plugin_paths.push_back(path.string()); + }, + [](){} + ); + } + + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("toxcore")) { + ImGui::TextDisabled("Be advised that no settings are written to disk.\nUse a config file if you don't want to set these values every start."); + + ImGui::SeparatorText("DNS"); + + { + static bool value {true}; + if (ImGui::Checkbox("DNS lookups", &value)) { + _conf.set("tox", "dns", value); + } + ImGui::SetItemTooltip("Allow toxcore to use your systems name resolver."); + } + + ImGui::SeparatorText("Proxy"); + + static int proxy_type {0}; + if (ImGui::Combo("proxy type", &proxy_type, "NONE\0HTTP\0SOCKS5\0")) { + if (proxy_type == 0) { + _conf.set("tox", "proxy_type", std::string_view{"NONE"}); + } else if (proxy_type == 1) { + _conf.set("tox", "proxy_type", std::string_view{"HTTP"}); + } else if (proxy_type == 2) { + _conf.set("tox", "proxy_type", std::string_view{"SOCKS5"}); + } + } + + ImGui::BeginDisabled(proxy_type == 0); + { + { + static std::string value; + if (ImGui::InputText("host", &value)) { + _conf.set("tox", "proxy_host", value); + } + ImGui::SetItemTooltip("toxcore does not currently support authentication."); + } + + { + static uint16_t value {0}; + if (ImGui::InputScalar("port", ImGuiDataType_U16, &value)) { + _conf.set("tox", "proxy_port", int64_t(value)); + } + } + } + ImGui::EndDisabled(); + + ImGui::SeparatorText("IP connectivity"); + + { + static bool value {true}; + if (ImGui::Checkbox("ipv6", &value)) { + _conf.set("tox", "ipv6_enabled", value); + } + } + + { + static bool value {true}; + if (ImGui::Checkbox("udp", &value)) { + _conf.set("tox", "udp_enabled", value); + } + } + + { + static bool value {true}; + if (ImGui::Checkbox("hole punching", &value)) { + _conf.set("tox", "hole_punching_enabled", value); + } + ImGui::SetItemTooltip("Perform NAT hole punching.\nOnly meaningful if udp is enabled."); } { static uint16_t value {0}; - if (ImGui::InputScalar("port", ImGuiDataType_U16, &value)) { - _conf.set("tox", "proxy_port", int64_t(value)); + if (ImGui::InputScalar("start port", ImGuiDataType_U16, &value)) { + _conf.set("tox", "start_port", int64_t(value)); } + ImGui::SetItemTooltip("The range in which toxcore finds a free port.\nOnly meaningful if udp is enabled."); } - } - ImGui::EndDisabled(); - - ImGui::SeparatorText("IP connectivity"); - - { - static bool value {true}; - if (ImGui::Checkbox("ipv6", &value)) { - _conf.set("tox", "ipv6_enabled", value); + { + static uint16_t value {0}; + if (ImGui::InputScalar("end port", ImGuiDataType_U16, &value)) { + _conf.set("tox", "end_port", int64_t(value)); + } + ImGui::SetItemTooltip("The range in which toxcore finds a free port.\nOnly meaningful if udp is enabled."); } - } - { - static bool value {true}; - if (ImGui::Checkbox("udp", &value)) { - _conf.set("tox", "udp_enabled", value); + ImGui::SeparatorText("local discovery"); + { + static bool value {true}; + if (ImGui::Checkbox("local discovery", &value)) { + _conf.set("tox", "local_discovery_enabled", value); + } + ImGui::SetItemTooltip("Perform broadcasts in your local networks to find other peers.\nOnly meaningful if udp is enabled."); } - } - { - static bool value {true}; - if (ImGui::Checkbox("hole punching", &value)) { - _conf.set("tox", "hole_punching_enabled", value); + ImGui::SeparatorText("tcp relay server"); + { + static uint16_t value {0}; + if (ImGui::InputScalar("server port", ImGuiDataType_U16, &value)) { + _conf.set("tox", "tcp_port", int64_t(value)); + } + ImGui::SetItemTooltip("Run a tcp relay server in your client, aiding the network with another relay node.\n!! Check local juristiction and law to not get in trouble.\n0 is disabled"); } - ImGui::SetItemTooltip("Perform NAT hole punching.\nOnly meaningful if udp is enabled."); + + ImGui::EndTabItem(); } - { - static uint16_t value {0}; - if (ImGui::InputScalar("start port", ImGuiDataType_U16, &value)) { - _conf.set("tox", "start_port", int64_t(value)); - } - ImGui::SetItemTooltip("The range in which toxcore finds a free port.\nOnly meaningful if udp is enabled."); - } - { - static uint16_t value {0}; - if (ImGui::InputScalar("end port", ImGuiDataType_U16, &value)) { - _conf.set("tox", "end_port", int64_t(value)); - } - ImGui::SetItemTooltip("The range in which toxcore finds a free port.\nOnly meaningful if udp is enabled."); + if (ImGui::BeginTabItem("about")) { + ImGuiTomatoAbout(); + ImGui::EndTabItem(); } - ImGui::SeparatorText("local discovery"); - { - static bool value {true}; - if (ImGui::Checkbox("local discovery", &value)) { - _conf.set("tox", "local_discovery_enabled", value); - } - ImGui::SetItemTooltip("Perform broadcasts in your local networks to find other peers.\nOnly meaningful if udp is enabled."); - } - - ImGui::SeparatorText("tcp relay server"); - { - static uint16_t value {0}; - if (ImGui::InputScalar("server port", ImGuiDataType_U16, &value)) { - _conf.set("tox", "tcp_port", int64_t(value)); - } - ImGui::SetItemTooltip("Run a tcp relay server in your client, aiding the network with another relay node.\n!! Check local juristiction and law to not get in trouble.\n0 is disabled"); - } - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("about")) { - ImGuiTomatoAbout(); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - } - ImGui::EndChild(); - - ImGui::Separator(); - - if (!_new_save && !std::filesystem::is_regular_file(_tox_profile_path)) { - // load but file missing - - ImGui::BeginDisabled(); - ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f}); - ImGui::EndDisabled(); - - if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("file does not exist"); - } - } else if (_new_save && std::filesystem::exists(_tox_profile_path)) { - // new but file exists - - ImGui::BeginDisabled(); - ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f}); - ImGui::EndDisabled(); - - if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("file already exists"); - } - } else { - if (ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f})) { - _error_string.clear(); - - try { - auto new_screen = std::make_unique(_conf, _renderer, _theme, _tox_profile_path, _password, _user_name, queued_plugin_paths); - if (!new_screen) { - throw std::runtime_error("failed to init main screen."); - } - ImGui::End(); // start screen - return new_screen.release(); - } catch (const std::exception& e) { - _error_string = std::string{"ToxCore/MainScreen creation failed with: "} + e.what(); - } catch (...) { - _error_string = "ToxCore/MainScreen creation failed with unknown error"; + ImGui::EndTabBar(); } } + ImGui::EndChild(); - if (!_error_string.empty()) { - ImGui::SameLine(); - ImGui::TextColored({1.f, 0.5f, 0.5f, 1.f}, "%s", _error_string.c_str()); + ImGui::Separator(); + + if (!_new_save && !std::filesystem::is_regular_file(_tox_profile_path)) { + // load but file missing + + ImGui::BeginDisabled(); + ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f}); + ImGui::EndDisabled(); + + if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("file does not exist"); + } + } else if (_new_save && std::filesystem::exists(_tox_profile_path)) { + // new but file exists + + ImGui::BeginDisabled(); + ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f}); + ImGui::EndDisabled(); + + if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("file already exists"); + } + } else { + if (ImGui::Button("proceed", {TEXT_PROCEED_WIDTH*1.5f, TEXT_BASE_HEIGHT*1.5f})) { + _error_string.clear(); + + try { + auto new_screen = std::make_unique(_conf, _renderer, _theme, _tox_profile_path, _password, _user_name, queued_plugin_paths); + if (!new_screen) { + throw std::runtime_error("failed to init main screen."); + } + ImGui::End(); // start screen + return new_screen.release(); + } catch (const std::exception& e) { + _error_string = std::string{"ToxCore/MainScreen creation failed with: "} + e.what(); + } catch (...) { + _error_string = "ToxCore/MainScreen creation failed with unknown error"; + } + } + + if (!_error_string.empty()) { + ImGui::SameLine(); + ImGui::TextColored({1.f, 0.5f, 0.5f, 1.f}, "%s", _error_string.c_str()); + } } }