unread message status + fade in ui
This commit is contained in:
parent
dd316d2589
commit
4afe39dacc
2
external/solanaceae_message3
vendored
2
external/solanaceae_message3
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 53d65a06855129135e5884f50d9983676290ac24
|
Subproject commit c577a1fa3d19272d481a0ed4a5b8715524204928
|
2
external/solanaceae_tox
vendored
2
external/solanaceae_tox
vendored
@ -1 +1 @@
|
|||||||
Subproject commit dd596bdad8d71654ff21dd3a032d6eb2dd7139a8
|
Subproject commit 5700d9d17febedec690dc24193bc65607d8d9fda
|
@ -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; [
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user