Compare commits
4 Commits
dev-998000
...
dev-858b9d
Author | SHA1 | Date | |
---|---|---|---|
858b9dfcfa | |||
bc8b631b84 | |||
52278f6726 | |||
29fd1bfb62 |
2
external/solanaceae_message3
vendored
2
external/solanaceae_message3
vendored
Submodule external/solanaceae_message3 updated: f9f70a05b1...96b76dc67f
2
external/solanaceae_message_serializer
vendored
2
external/solanaceae_message_serializer
vendored
Submodule external/solanaceae_message_serializer updated: 1409485ef1...1a3fcc6757
2
external/solanaceae_tox
vendored
2
external/solanaceae_tox
vendored
Submodule external/solanaceae_tox updated: 1d724ef951...560eab1f6c
@ -52,14 +52,14 @@ add_executable(tomato
|
|||||||
./sdl_clipboard_utils.hpp
|
./sdl_clipboard_utils.hpp
|
||||||
./sdl_clipboard_utils.cpp
|
./sdl_clipboard_utils.cpp
|
||||||
|
|
||||||
./file_selector.hpp
|
./chat_gui/file_selector.hpp
|
||||||
./file_selector.cpp
|
./chat_gui/file_selector.cpp
|
||||||
|
|
||||||
./send_image_popup.hpp
|
./chat_gui/send_image_popup.hpp
|
||||||
./send_image_popup.cpp
|
./chat_gui/send_image_popup.cpp
|
||||||
|
|
||||||
./settings_window.hpp
|
./chat_gui/settings_window.hpp
|
||||||
./settings_window.cpp
|
./chat_gui/settings_window.cpp
|
||||||
|
|
||||||
./tox_ui_utils.hpp
|
./tox_ui_utils.hpp
|
||||||
./tox_ui_utils.cpp
|
./tox_ui_utils.cpp
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#include "./send_image_popup.hpp"
|
#include "./send_image_popup.hpp"
|
||||||
|
|
||||||
#include "./image_loader_sdl_bmp.hpp"
|
#include "../image_loader_sdl_bmp.hpp"
|
||||||
#include "./image_loader_stb.hpp"
|
#include "../image_loader_stb.hpp"
|
||||||
#include "./image_loader_webp.hpp"
|
#include "../image_loader_webp.hpp"
|
||||||
#include "./image_loader_qoi.hpp"
|
#include "../image_loader_qoi.hpp"
|
||||||
#include "./image_loader_sdl_image.hpp"
|
#include "../image_loader_sdl_image.hpp"
|
||||||
|
|
||||||
#include <imgui/imgui.h>
|
#include <imgui/imgui.h>
|
||||||
|
|
@ -5,8 +5,8 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "./image_loader.hpp"
|
#include "../image_loader.hpp"
|
||||||
#include "./texture_cache.hpp"
|
#include "../texture_cache.hpp"
|
||||||
|
|
||||||
struct SendImagePopup {
|
struct SendImagePopup {
|
||||||
TextureUploaderI& _tu;
|
TextureUploaderI& _tu;
|
@ -1,7 +1,5 @@
|
|||||||
#include "./chat_gui4.hpp"
|
#include "./chat_gui4.hpp"
|
||||||
|
|
||||||
#include "./file_selector.hpp"
|
|
||||||
|
|
||||||
#include <solanaceae/message3/components.hpp>
|
#include <solanaceae/message3/components.hpp>
|
||||||
#include <solanaceae/tox_messages/components.hpp>
|
#include <solanaceae/tox_messages/components.hpp>
|
||||||
#include <solanaceae/contact/components.hpp>
|
#include <solanaceae/contact/components.hpp>
|
||||||
@ -457,11 +455,11 @@ float ChatGui4::render(float time_delta) {
|
|||||||
if (ImGui::TableNextColumn()) {
|
if (ImGui::TableNextColumn()) {
|
||||||
// TODO: theming for hardcoded values
|
// TODO: theming for hardcoded values
|
||||||
|
|
||||||
if (!msg_reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
|
if (!msg_reg.all_of<Message::Components::ReceivedBy>(e)) {
|
||||||
// TODO: dedup?
|
// TODO: dedup?
|
||||||
ImGui::TextDisabled("_");
|
ImGui::TextDisabled("_");
|
||||||
} else {
|
} else {
|
||||||
const auto list = msg_reg.get<Message::Components::Remote::TimestampReceived>(e).ts;
|
const auto list = msg_reg.get<Message::Components::ReceivedBy>(e).ts;
|
||||||
// wrongly assumes contacts never get removed from a group
|
// wrongly assumes contacts never get removed from a group
|
||||||
if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
|
if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
|
||||||
// if partically delivered
|
// if partically delivered
|
||||||
@ -503,8 +501,8 @@ float ChatGui4::render(float time_delta) {
|
|||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
// TODO: dedup
|
// TODO: dedup
|
||||||
if (msg_reg.all_of<Message::Components::Remote::TimestampRead>(e)) {
|
if (msg_reg.all_of<Message::Components::ReadBy>(e)) {
|
||||||
const auto list = msg_reg.get<Message::Components::Remote::TimestampRead>(e).ts;
|
const auto list = msg_reg.get<Message::Components::ReadBy>(e).ts;
|
||||||
// wrongly assumes contacts never get removed from a group
|
// wrongly assumes contacts never get removed from a group
|
||||||
if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
|
if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
|
||||||
// if partially read
|
// if partially read
|
||||||
@ -1053,11 +1051,11 @@ void ChatGui4::renderMessageExtra(Message3Registry& reg, const Message3 e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove?
|
// TODO: remove?
|
||||||
if (reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
|
if (reg.all_of<Message::Components::ReceivedBy>(e)) {
|
||||||
std::string synced_by_text {"receivedBy:"};
|
std::string synced_by_text {"receivedBy:"};
|
||||||
const int64_t now_ts_s = int64_t(Message::getTimeMS() / 1000u);
|
const int64_t now_ts_s = int64_t(Message::getTimeMS() / 1000u);
|
||||||
|
|
||||||
for (const auto& [c, syned_ts] : reg.get<Message::Components::Remote::TimestampReceived>(e).ts) {
|
for (const auto& [c, syned_ts] : reg.get<Message::Components::ReceivedBy>(e).ts) {
|
||||||
if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
|
if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
|
||||||
synced_by_text += "\n sself"; // required (except when synced externally)
|
synced_by_text += "\n sself"; // required (except when synced externally)
|
||||||
} else if (_cr.all_of<Contact::Components::TagSelfWeak>(c)) {
|
} else if (_cr.all_of<Contact::Components::TagSelfWeak>(c)) {
|
||||||
@ -1088,7 +1086,6 @@ void ChatGui4::renderContactList(void) {
|
|||||||
bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected) {
|
bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected) {
|
||||||
// TODO:
|
// TODO:
|
||||||
// - unread message
|
// - unread message
|
||||||
// - avatar img
|
|
||||||
// - connection status
|
// - connection status
|
||||||
// - user status
|
// - user status
|
||||||
// - status message
|
// - status message
|
||||||
@ -1117,10 +1114,27 @@ bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool got_selected = ImGui::Selectable(label.c_str(), show_selected, 0, {0,3*TEXT_BASE_HEIGHT});
|
const bool got_selected = ImGui::Selectable(label.c_str(), show_selected, 0, {0,3*TEXT_BASE_HEIGHT});
|
||||||
|
|
||||||
if (request_incoming || request_outgoing) {
|
if (request_incoming || request_outgoing) {
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginItemTooltip()) {
|
||||||
|
if (_cr.all_of<Contact::Components::ConnectionState>(c)) {
|
||||||
|
const auto cstate = _cr.get<Contact::Components::ConnectionState>(c).state;
|
||||||
|
ImGui::Text("Connection state: %s",
|
||||||
|
(cstate == Contact::Components::ConnectionState::disconnected)
|
||||||
|
? "offline"
|
||||||
|
: (cstate == Contact::Components::ConnectionState::direct)
|
||||||
|
? "online (direct)"
|
||||||
|
: "online (cloud)"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
ImGui::TextUnformatted("Connection state: unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndTooltip();
|
||||||
|
}
|
||||||
|
|
||||||
ImVec2 post_curser_pos = ImGui::GetCursorPos();
|
ImVec2 post_curser_pos = ImGui::GetCursorPos();
|
||||||
|
|
||||||
ImVec2 img_curser {
|
ImVec2 img_curser {
|
||||||
@ -1189,14 +1203,16 @@ bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected
|
|||||||
ImGui::TextUnformatted("Incoming request/invite");
|
ImGui::TextUnformatted("Incoming request/invite");
|
||||||
} else if (request_outgoing) {
|
} else if (request_outgoing) {
|
||||||
ImGui::TextUnformatted("Outgoing request/invite");
|
ImGui::TextUnformatted("Outgoing request/invite");
|
||||||
}
|
} else {
|
||||||
//ImGui::Text("status message...");
|
//ImGui::Text("status message...");
|
||||||
|
}
|
||||||
//ImGui::TextDisabled("hi");
|
//ImGui::TextDisabled("hi");
|
||||||
//ImGui::RenderTextEllipsis
|
//ImGui::RenderTextEllipsis
|
||||||
}
|
}
|
||||||
ImGui::EndGroup();
|
ImGui::EndGroup();
|
||||||
|
|
||||||
ImGui::SetCursorPos(post_curser_pos);
|
ImGui::SetCursorPos(post_curser_pos);
|
||||||
|
|
||||||
return got_selected;
|
return got_selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include "./texture_cache.hpp"
|
#include "./texture_cache.hpp"
|
||||||
#include "./tox_avatar_loader.hpp"
|
#include "./tox_avatar_loader.hpp"
|
||||||
#include "./message_image_loader.hpp"
|
#include "./message_image_loader.hpp"
|
||||||
#include "./file_selector.hpp"
|
#include "./chat_gui/file_selector.hpp"
|
||||||
#include "./send_image_popup.hpp"
|
#include "./chat_gui/send_image_popup.hpp"
|
||||||
|
|
||||||
#include <entt/container/dense_map.hpp>
|
#include <entt/container/dense_map.hpp>
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::vector<std::string> plugins) :
|
MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::string new_username, std::vector<std::string> plugins) :
|
||||||
renderer(renderer_),
|
renderer(renderer_),
|
||||||
rmm(cr),
|
rmm(cr),
|
||||||
msnj{cr, {}, {}},
|
msnj{cr, {}, {}},
|
||||||
@ -44,9 +44,10 @@ MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::stri
|
|||||||
conf.set("tox", "save_file_path", save_path);
|
conf.set("tox", "save_file_path", save_path);
|
||||||
|
|
||||||
{ // name stuff
|
{ // name stuff
|
||||||
|
// a new profile will not have this set
|
||||||
auto name = tc.toxSelfGetName();
|
auto name = tc.toxSelfGetName();
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
name = "tomato";
|
name = new_username;
|
||||||
}
|
}
|
||||||
conf.set("tox", "name", name);
|
conf.set("tox", "name", name);
|
||||||
tc.setSelfName(name); // TODO: this is ugly
|
tc.setSelfName(name); // TODO: this is ugly
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "./message_image_loader.hpp"
|
#include "./message_image_loader.hpp"
|
||||||
|
|
||||||
#include "./chat_gui4.hpp"
|
#include "./chat_gui4.hpp"
|
||||||
#include "./settings_window.hpp"
|
#include "./chat_gui/settings_window.hpp"
|
||||||
#include "./tox_ui_utils.hpp"
|
#include "./tox_ui_utils.hpp"
|
||||||
#include "./tox_dht_cap_histo.hpp"
|
#include "./tox_dht_cap_histo.hpp"
|
||||||
#include "./tox_friend_faux_offline_messaging.hpp"
|
#include "./tox_friend_faux_offline_messaging.hpp"
|
||||||
@ -89,7 +89,7 @@ struct MainScreen final : public Screen {
|
|||||||
uint64_t _window_hidden_ts {0};
|
uint64_t _window_hidden_ts {0};
|
||||||
float _time_since_event {0.f};
|
float _time_since_event {0.f};
|
||||||
|
|
||||||
MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::vector<std::string> plugins);
|
MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::string new_username, std::vector<std::string> plugins);
|
||||||
~MainScreen(void);
|
~MainScreen(void);
|
||||||
|
|
||||||
bool handleEvent(SDL_Event& e) override;
|
bool handleEvent(SDL_Event& e) override;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <imgui/imgui.h>
|
#include <imgui/imgui.h>
|
||||||
#include <imgui/misc/cpp/imgui_stdlib.h>
|
#include <imgui/misc/cpp/imgui_stdlib.h>
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
@ -33,13 +34,13 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
_fss.requestFile(
|
_fss.requestFile(
|
||||||
[](const auto& path) -> bool { return std::filesystem::is_regular_file(path); },
|
[](const auto& path) -> bool { return std::filesystem::is_regular_file(path); },
|
||||||
[this](const auto& path) {
|
[this](const auto& path) {
|
||||||
tox_profile_path = path.string();
|
_tox_profile_path = path.string();
|
||||||
},
|
},
|
||||||
[](){}
|
[](){}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextUnformatted(tox_profile_path.c_str());
|
ImGui::TextUnformatted(_tox_profile_path.c_str());
|
||||||
|
|
||||||
ImGui::TextUnformatted("password:");
|
ImGui::TextUnformatted("password:");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@ -56,8 +57,22 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
if (ImGui::BeginTabItem("create profile")) {
|
if (ImGui::BeginTabItem("create profile")) {
|
||||||
_new_save = true;
|
_new_save = true;
|
||||||
|
|
||||||
ImGui::TextUnformatted("TODO: profile path");
|
ImGui::TextUnformatted("username:");
|
||||||
ImGui::TextUnformatted("TODO: profile name");
|
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<unsigned char>(c)) && c != '-' && c != '.') {
|
||||||
|
c = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp_copy.empty()) {
|
||||||
|
tmp_copy = "unnamed-tomato";
|
||||||
|
}
|
||||||
|
|
||||||
|
_tox_profile_path = tmp_copy + ".tox";
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::TextUnformatted("password:");
|
ImGui::TextUnformatted("password:");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@ -69,6 +84,8 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Checkbox("show password", &_show_password);
|
ImGui::Checkbox("show password", &_show_password);
|
||||||
|
|
||||||
|
ImGui::TextUnformatted("TODO: profile path (current path for now)");
|
||||||
|
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("plugins")) {
|
if (ImGui::BeginTabItem("plugins")) {
|
||||||
@ -81,7 +98,6 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
ImGui::TextUnformatted(it->c_str());
|
ImGui::TextUnformatted(it->c_str());
|
||||||
|
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
@ -105,7 +121,7 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (!_new_save && !std::filesystem::is_regular_file(tox_profile_path)) {
|
if (!_new_save && !std::filesystem::is_regular_file(_tox_profile_path)) {
|
||||||
// load but file missing
|
// load but file missing
|
||||||
|
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
@ -115,7 +131,7 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) {
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) {
|
||||||
ImGui::SetTooltip("file does not exist");
|
ImGui::SetTooltip("file does not exist");
|
||||||
}
|
}
|
||||||
} else if (_new_save && std::filesystem::exists(tox_profile_path)) {
|
} else if (_new_save && std::filesystem::exists(_tox_profile_path)) {
|
||||||
// new but file exists
|
// new but file exists
|
||||||
|
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
@ -127,7 +143,7 @@ Screen* StartScreen::render(float, bool&) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::Button("load", {60, 25})) {
|
if (ImGui::Button("load", {60, 25})) {
|
||||||
auto new_screen = std::make_unique<MainScreen>(_renderer, tox_profile_path, _password, queued_plugin_paths);
|
auto new_screen = std::make_unique<MainScreen>(_renderer, _tox_profile_path, _password, _user_name, queued_plugin_paths);
|
||||||
return new_screen.release();
|
return new_screen.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "./screen.hpp"
|
#include "./screen.hpp"
|
||||||
|
|
||||||
#include "./file_selector.hpp"
|
#include "./chat_gui/file_selector.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -17,11 +17,12 @@ struct StartScreen final : public Screen {
|
|||||||
FileSelector _fss;
|
FileSelector _fss;
|
||||||
|
|
||||||
bool _new_save {false};
|
bool _new_save {false};
|
||||||
|
std::string _user_name {"unnamed-tomato"};
|
||||||
|
|
||||||
bool _show_password {false};
|
bool _show_password {false};
|
||||||
std::string _password;
|
std::string _password;
|
||||||
|
|
||||||
std::string tox_profile_path {"tomato.tox"};
|
std::string _tox_profile_path {"unnamed-tomato.tox"};
|
||||||
std::vector<std::string> queued_plugin_paths;
|
std::vector<std::string> queued_plugin_paths;
|
||||||
|
|
||||||
StartScreen(void) = delete;
|
StartScreen(void) = delete;
|
||||||
|
@ -134,7 +134,7 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!mr->any_of<
|
if (!mr->any_of<
|
||||||
Message::Components::Remote::TimestampReceived
|
Message::Components::ReceivedBy
|
||||||
>(msg)
|
>(msg)
|
||||||
) {
|
) {
|
||||||
continue; // skip
|
continue; // skip
|
||||||
@ -144,7 +144,7 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
|
|||||||
continue; // not outbound (in private)
|
continue; // not outbound (in private)
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& ts_received = mr->get<Message::Components::Remote::TimestampReceived>(msg).ts;
|
const auto& ts_received = mr->get<Message::Components::ReceivedBy>(msg).ts;
|
||||||
// not target
|
// not target
|
||||||
if (ts_received.contains(c)) {
|
if (ts_received.contains(c)) {
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user