unread message status + fade in ui

This commit is contained in:
Green Sky 2023-09-29 18:15:18 +02:00
parent dd316d2589
commit 4afe39dacc
No known key found for this signature in database
5 changed files with 79 additions and 8 deletions

@ -1 +1 @@
Subproject commit 53d65a06855129135e5884f50d9983676290ac24 Subproject commit c577a1fa3d19272d481a0ed4a5b8715524204928

@ -1 +1 @@
Subproject commit dd596bdad8d71654ff21dd3a032d6eb2dd7139a8 Subproject commit 5700d9d17febedec690dc24193bc65607d8d9fda

View File

@ -30,9 +30,12 @@
# for some reason, buildInputs performs some magic an converts them to build dependencies, not runtime dependencies # for some reason, buildInputs performs some magic an converts them to build dependencies, not runtime dependencies
# also, non static dependencies (?? how to ensure ??) # also, non static dependencies (?? how to ensure ??)
dlopenBuildInputs = with pkgs; [ dlopenBuildInputs = with pkgs; [
dbus
xorg.libX11 xorg.libX11
xorg.libXext xorg.libXext
xorg.xorgproto xorg.xorgproto
libxkbcommon
xorg.libICE xorg.libICE
xorg.libXi xorg.libXi
xorg.libXScrnSaver xorg.libXScrnSaver
@ -40,7 +43,10 @@
xorg.libXinerama xorg.libXinerama
xorg.libXrandr xorg.libXrandr
xorg.libXxf86vm xorg.libXxf86vm
libGL libGL
pipewire
]; ];
buildInputs = with pkgs; [ buildInputs = with pkgs; [

View File

@ -14,6 +14,7 @@
#include "./media_meta_info_loader.hpp" #include "./media_meta_info_loader.hpp"
#include "./sdl_clipboard_utils.hpp" #include "./sdl_clipboard_utils.hpp"
#include "solanaceae/message3/registry_message_model.hpp"
#include <string> #include <string>
#include <variant> #include <variant>
@ -22,6 +23,19 @@
#include <filesystem> #include <filesystem>
#include <ctime> #include <ctime>
namespace Components {
struct UnreadFade {
// fades form 1 to 0
float fade {1.f};
};
} // Components
static float lerp(float a, float b, float t) {
return a + t * (b - a);
}
ChatGui4::ChatGui4( ChatGui4::ChatGui4(
ConfigModelI& conf, ConfigModelI& conf,
RegistryMessageModel& rmm, RegistryMessageModel& rmm,
@ -167,6 +181,22 @@ void ChatGui4::render(void) {
//ImGui::TableNextRow(0, TEXT_BASE_HEIGHT); //ImGui::TableNextRow(0, TEXT_BASE_HEIGHT);
Message3Registry& msg_reg = *msg_reg_ptr; Message3Registry& msg_reg = *msg_reg_ptr;
// do systems TODO: extract
{ // fade system
std::vector<Message3> to_remove;
msg_reg.view<Components::UnreadFade>().each([&to_remove](const Message3 e, Components::UnreadFade& fade) {
// TODO: configurable
const float fade_duration = 7.5f;
// TODO: dynamic fps
fade.fade -= 1.f/fade_duration * (1.f/60.f);
if (fade.fade <= 0.f) {
to_remove.push_back(e);
}
});
msg_reg.remove<Components::UnreadFade>(to_remove.cbegin(), to_remove.cend());
}
msg_reg.view<Message::Components::ContactFrom, Message::Components::ContactTo, Message::Components::Timestamp>() msg_reg.view<Message::Components::ContactFrom, Message::Components::ContactTo, Message::Components::Timestamp>()
.use<Message::Components::Timestamp>() .use<Message::Components::Timestamp>()
.each([&](const Message3 e, Message::Components::ContactFrom& c_from, Message::Components::ContactTo& c_to, Message::Components::Timestamp ts .each([&](const Message3 e, Message::Components::ContactFrom& c_from, Message::Components::ContactTo& c_to, Message::Components::Timestamp ts
@ -184,6 +214,15 @@ void ChatGui4::render(void) {
ImGui::TextUnformatted("<unk>"); ImGui::TextUnformatted("<unk>");
} }
// use username as visibility test
if (ImGui::IsItemVisible() && msg_reg.all_of<Message::Components::TagUnread>(e)) {
// get time now
const uint64_t ts_now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
msg_reg.emplace_or_replace<Message::Components::Read>(e, ts_now);
msg_reg.remove<Message::Components::TagUnread>(e);
msg_reg.emplace_or_replace<Components::UnreadFade>(e, 1.f);
}
// highlight self // highlight self
if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_from.c)) { if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_from.c)) {
ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.7f, 0.3f, 0.20f)); ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.7f, 0.3f, 0.20f));
@ -194,10 +233,31 @@ void ChatGui4::render(void) {
//ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); //ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
} }
std::optional<ImVec4> row_bg;
// private group message // private group message
if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) { if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) {
ImU32 row_bg_color = ImGui::GetColorU32(ImVec4(0.5f, 0.2f, 0.5f, 0.35f)); const ImVec4 priv_msg_hi_col = ImVec4(0.5f, 0.2f, 0.5f, 0.35f);
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color); ImU32 row_bg_color = ImGui::GetColorU32(priv_msg_hi_col);
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, row_bg_color);
row_bg = priv_msg_hi_col;
}
// fade
if (msg_reg.all_of<Components::UnreadFade>(e)) {
ImVec4 hi_color = ImGui::GetStyleColorVec4(ImGuiCol_PlotHistogramHovered);
hi_color.w = 0.8f;
const ImVec4 orig_color = row_bg.value_or(ImGui::GetStyleColorVec4(ImGuiCol_TableRowBg)); // imgui defaults to 0,0,0,0
const float fade_frac = msg_reg.get<Components::UnreadFade>(e).fade;
ImVec4 res_color{
lerp(orig_color.x, hi_color.x, fade_frac),
lerp(orig_color.y, hi_color.y, fade_frac),
lerp(orig_color.z, hi_color.z, fade_frac),
lerp(orig_color.w, hi_color.w, fade_frac),
};
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, ImGui::GetColorU32(res_color));
} }
} }
@ -588,7 +648,14 @@ bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected
ImGui::SameLine(); ImGui::SameLine();
ImGui::BeginGroup(); ImGui::BeginGroup();
{ {
ImGui::Text("%s", (_cr.all_of<Contact::Components::Name>(c) ? _cr.get<Contact::Components::Name>(c).name.c_str() : "<unk>")); // TODO: is there a better way?
// maybe cache mm?
bool has_unread = false;
if (const auto* mm = _rmm.get(c); mm != nullptr && !mm->storage<Message::Components::TagUnread>().empty()) {
has_unread = true;
}
ImGui::Text("%s%s", has_unread?"* ":"", (_cr.all_of<Contact::Components::Name>(c) ? _cr.get<Contact::Components::Name>(c).name.c_str() : "<unk>"));
if (request_incoming) { if (request_incoming) {
ImGui::TextUnformatted("Incoming request/invite"); ImGui::TextUnformatted("Incoming request/invite");
} else if (request_outgoing) { } else if (request_outgoing) {

View File

@ -85,9 +85,7 @@ Screen* MainScreen::poll(bool& quit) {
cg.render(); cg.render();
if constexpr (false) { if constexpr (false) {
bool open = !quit; ImGui::ShowDemoWindow();
ImGui::ShowDemoWindow(&open);
quit = !open;
} }
#if 0 #if 0