Compare commits

...

1 Commits

Author SHA1 Message Date
d795d328d3
wip contact tree 2024-10-14 09:47:37 +02:00
5 changed files with 126 additions and 0 deletions

View File

@ -80,6 +80,8 @@ target_sources(tomato PUBLIC
./chat_gui/icons/group.cpp
./chat_gui/contact_list.hpp
./chat_gui/contact_list.cpp
./chat_gui/contact_tree.hpp
./chat_gui/contact_tree.cpp
./chat_gui/file_selector.hpp
./chat_gui/file_selector.cpp
./chat_gui/send_image_popup.hpp

View File

@ -0,0 +1,97 @@
#include "./contact_tree.hpp"
#include <solanaceae/contact/components.hpp>
#include "./contact_list.hpp"
#include "entt/entity/entity.hpp"
#include <imgui/imgui.h>
namespace Components {
struct TagTreeViewOpen {};
};
ContactTreeWindow::ContactTreeWindow(Contact3Registry& cr, Theme& theme, ContactTextureCache& ctc) : _cr(cr), _theme(theme), _ctc(ctc) {
}
void ContactTreeWindow::render(void) {
//{ // main window menubar injection
// // assumes the window "tomato" was rendered already by cg
// if (ImGui::Begin("tomato")) {
// if (ImGui::BeginMenuBar()) {
// ImGui::Separator();
// if (ImGui::BeginMenu("Settings")) {
// if (ImGui::MenuItem("settings window", nullptr, _show_window)) {
// _show_window = !_show_window;
// }
// ImGui::EndMenu();
// }
// ImGui::EndMenuBar();
// }
// }
// ImGui::End();
//}
if (_show_window) {
if (ImGui::Begin("ContactTreeWindow", &_show_window)) {
if (ImGui::BeginTable("##table", 1, ImGuiTableFlags_None)) {
// first we need all root nodes
for (const auto [cv_root] : _cr.view<Contact::Components::TagRoot>().each()) {
ImGui::TableNextRow();
ImGui::PushID(entt::to_integral(cv_root));
ImGui::TableNextColumn();
Contact3Handle c_root {_cr, cv_root};
bool open = c_root.all_of<Components::TagTreeViewOpen>();
bool has_children = c_root.all_of<Contact::Components::ParentOf>();
// roots are usually no normal contacts
// they should display as a protocol or profile or account
// TODO: set some table background instead of full span selected?
if (renderContactBig(_theme, _ctc, c_root, 2, false, true)) {
// clicked, toggle open
if (open) {
c_root.remove<Components::TagTreeViewOpen>();
open = false;
} else {
c_root.emplace_or_replace<Components::TagTreeViewOpen>();
open = true;
}
}
if (open) {
// render children
ImGui::Indent();
if (c_root.all_of<Contact::Components::ParentOf>()) {
for (const auto cv_child : c_root.get<Contact::Components::ParentOf>().subs) {
ImGui::PushID(entt::to_integral(cv_child));
Contact3Handle c_child {_cr, cv_child};
renderContactBig(_theme, _ctc, c_child, 2);
ImGui::PopID();
}
} else {
// TODO: remove
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::TextDisabled("no parent of");
}
ImGui::Unindent();
}
ImGui::PopID();
}
ImGui::EndTable();
}
}
ImGui::End();
}
}

View File

@ -0,0 +1,23 @@
#pragma once
#include <solanaceae/contact/contact_model3.hpp>
#include "./texture_cache_defs.hpp"
// fwd
struct Theme;
class ContactTreeWindow {
bool _show_window {true};
Contact3Registry& _cr;
Theme& _theme;
ContactTextureCache& _ctc;
public:
ContactTreeWindow(Contact3Registry& cr, Theme& theme, ContactTextureCache& ctc);
void render(void);
};

View File

@ -43,6 +43,7 @@ MainScreen::MainScreen(SimpleConfigModel&& conf_, SDL_Renderer* renderer_, Theme
mil(),
msg_tc(mil, sdlrtu),
cg(conf, os, rmm, cr, sdlrtu, contact_tc, msg_tc, theme),
ctw(cr, theme, contact_tc),
sw(conf),
osui(os),
tuiu(tc, conf),
@ -357,6 +358,7 @@ Screen* MainScreen::render(float time_delta, bool&) {
const float msgtc_interval = msg_tc.update();
const float cg_interval = cg.render(time_delta); // render
ctw.render();
sw.render(); // render
osui.render();
tuiu.render(); // render

View File

@ -30,6 +30,7 @@
#include "./message_image_loader.hpp"
#include "./chat_gui4.hpp"
#include "./chat_gui/contact_tree.hpp"
#include "./chat_gui/settings_window.hpp"
#include "./object_store_ui.hpp"
#include "./tox_ui_utils.hpp"
@ -92,6 +93,7 @@ struct MainScreen final : public Screen {
TextureCache<void*, Message3Handle, MessageImageLoader> msg_tc;
ChatGui4 cg;
ContactTreeWindow ctw;
SettingsWindow sw;
ObjectStoreUI osui;
ToxUIUtils tuiu;