#include "ana_panel.hpp" #include #include #include #include #include "com/fikatia_uygulama.hpp" #include "com/fikom_sunucu.hpp" #include "fiko/ui/efekt.hpp" #include "imgui.h" #include "post_paneli.hpp" namespace fikatia { namespace { FikatiaUygulama g_catia; std::string g_hata; std::string g_surum; struct DokumanSatir { std::string ad, tip, yol; }; std::vector g_dokumanlar; std::vector g_gunluk; std::string utf8(const std::wstring& w) { if (w.empty()) return {}; const int n = WideCharToMultiByte(CP_UTF8, 0, w.c_str(), (int)w.size(), nullptr, 0, nullptr, nullptr); std::string s(n, '\0'); WideCharToMultiByte(CP_UTF8, 0, w.c_str(), (int)w.size(), s.data(), n, nullptr, nullptr); return s; } void yenile() { g_hata.clear(); try { g_surum = utf8(g_catia.surumBilgisi()); g_dokumanlar.clear(); for (const auto& d : g_catia.dokumanlar()) g_dokumanlar.push_back({utf8(d.ad), utf8(d.tip), utf8(d.tamYol)}); } catch (const FikomHata& h) { g_hata = std::string("Veri okunamadi: ") + h.what(); } } void baglan(bool baslat) { // NOT: baglanti ana thread'de senkron (STA); uzun surerse worker + marshalling'e tasinacak. g_hata = utf8(g_catia.baglan(baslat)); if (g_hata.empty()) yenile(); } // ---- Renk paleti (futuristik HUD) ---- constexpr ImVec4 CAM_GOK = {0.20f, 0.90f, 1.00f, 1.0f}; // cyan — bagli/aktif constexpr ImVec4 MOR = {0.62f, 0.35f, 1.00f, 1.0f}; // ikincil vurgu constexpr ImVec4 KEHRIBAR = {1.00f, 0.62f, 0.15f, 1.0f}; // beklemede constexpr ImVec4 YESIL = {0.35f, 0.95f, 0.55f, 1.0f}; ImU32 renk(const ImVec4& r, float alfa) { return ImGui::ColorConvertFloat4ToU32(ImVec4(r.x, r.y, r.z, r.w * alfa)); } // ---- 3D HUD cekirdegi: tel-kafes ikosahedron + yorunge halkalari + istemci uydulari. // ImDrawList uzerine perspektif projeksiyon; sabit topoloji, kare basina tahsis yok. void hudCekirdekCiz(ImDrawList* dl, ImVec2 merkez, float yaricap, bool bagli, int istemci) { const float t = (float)ImGui::GetTime(); const ImVec4 ana = bagli ? CAM_GOK : KEHRIBAR; // Birim ikosahedron: 12 kose / 30 kenar constexpr float X = 0.5257311f, Z = 0.8506508f; static const float K[12][3] = {{-X, 0, Z}, {X, 0, Z}, {-X, 0, -Z}, {X, 0, -Z}, {0, Z, X}, {0, Z, -X}, {0, -Z, X}, {0, -Z, -X}, {Z, X, 0}, {-Z, X, 0}, {Z, -X, 0}, {-Z, -X, 0}}; static const int E[30][2] = {{0, 4}, {0, 9}, {0, 1}, {0, 6}, {0, 11}, {1, 4}, {1, 8}, {1, 10}, {1, 6}, {2, 3}, {2, 5}, {2, 7}, {2, 9}, {2, 11}, {3, 5}, {3, 7}, {3, 8}, {3, 10},{4, 5}, {4, 8}, {4, 9}, {5, 8}, {5, 9}, {6, 7}, {6, 10},{6, 11},{7, 10}, {7, 11}, {8, 10}, {9, 11}}; const float donme = t * 0.45f; const float egim = 0.42f + 0.12f * std::sin(t * 0.23f); const float cy = std::cos(donme), sy = std::sin(donme); const float cx = std::cos(egim), sx = std::sin(egim); const float uzaklik = 3.2f; auto izdusum = [&](float x, float y, float z, float olcek, ImVec2& p, float& derinlik) { const float x1 = x * cy + z * sy; // Y ekseni donme const float z1 = -x * sy + z * cy; const float y1 = y * cx - z1 * sx; // X ekseni egim const float z2 = y * sx + z1 * cx; const float persp = uzaklik / (uzaklik + z2); p = ImVec2(merkez.x + x1 * olcek * persp, merkez.y - y1 * olcek * persp); derinlik = z2; // -1..1 (buyuk = arkada) }; // Kenarlar: derinlige gore solan cizgiler (arkadakiler silik — derinlik hissi) for (const auto& e : E) { ImVec2 a, b; float da, db; izdusum(K[e[0]][0], K[e[0]][1], K[e[0]][2], yaricap, a, da); izdusum(K[e[1]][0], K[e[1]][1], K[e[1]][2], yaricap, b, db); const float alfa = 0.85f - 0.55f * ((da + db) * 0.5f + 1.0f) * 0.5f; dl->AddLine(a, b, renk(ana, alfa), (da + db < 0) ? 1.8f : 1.0f); } // Koseler: parlak noktalar for (const auto& k : K) { ImVec2 p; float d; izdusum(k[0], k[1], k[2], yaricap, p, d); if (d < 0.15f) dl->AddCircleFilled(p, 2.2f, renk(ana, 0.9f)); } // Yorunge halkasi (XZ duzlemi, ters yonde doner) + istemci uydulari const float halkaYaricap = 1.45f; ImVec2 onceki{}; bool oncekiVar = false; for (int i = 0; i <= 48; ++i) { const float a = (float)i / 48.0f * 6.2831853f - t * 0.25f; ImVec2 p; float d; izdusum(std::cos(a) * halkaYaricap, 0.0f, std::sin(a) * halkaYaricap, yaricap, p, d); if (oncekiVar) dl->AddLine(onceki, p, renk(MOR, d < 0 ? 0.55f : 0.18f), 1.0f); onceki = p; oncekiVar = true; } const int uydu = istemci < 8 ? istemci : 8; for (int i = 0; i < uydu; ++i) { const float a = t * 0.9f + (float)i * 6.2831853f / (float)(uydu); ImVec2 p; float d; izdusum(std::cos(a) * halkaYaricap, 0.0f, std::sin(a) * halkaYaricap, yaricap, p, d); const float parla = d < 0 ? 1.0f : 0.5f; dl->AddCircleFilled(p, 5.0f, renk(YESIL, 0.20f * parla)); dl->AddCircleFilled(p, 3.0f, renk(YESIL, 0.85f * parla)); } // Bagliyken nabiz dalgasi: genisleyen halka (2sn periyot) if (bagli) { const float faz = std::fmod(t, 2.0f) / 2.0f; dl->AddCircle(merkez, yaricap * (0.4f + faz * 1.3f), renk(CAM_GOK, (1.0f - faz) * 0.35f), 48, 1.5f); } } // Glow cerceveli durum karti; icerigi cagiran cizer void kartBasla(const char* kimlik, ImVec2 boyut, const ImVec4& vurgu) { ImGui::BeginChild(kimlik, boyut, ImGuiChildFlags_Borders); ImDrawList* dl = ImGui::GetWindowDrawList(); const ImVec2 minK = ImGui::GetWindowPos(); const ImVec2 maxK = ImVec2(minK.x + ImGui::GetWindowSize().x, minK.y + ImGui::GetWindowSize().y); fiko::ui::Efektler::glow(dl, minK, maxK, vurgu, MOR, 6.0f, 10.0f, 0.55f, 0.0f); } } // namespace void anaPanelCiz() { const ImGuiViewport* vp = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(vp->WorkPos); ImGui::SetNextWindowSize(vp->WorkSize); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(18, 14)); ImGui::Begin("Fikatia", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar); ImDrawList* dl = ImGui::GetWindowDrawList(); const ImVec2 pMin = vp->WorkPos; const ImVec2 pMax = ImVec2(pMin.x + vp->WorkSize.x, pMin.y + vp->WorkSize.y); fiko::ui::Efektler::aurora(dl, pMin, pMax, 0.30f, 3.5f); const bool bagli = g_catia.bagli(); const ImVec4 durumRenk = bagli ? CAM_GOK : KEHRIBAR; // ---- Baslik seridi ---- ImGui::SetWindowFontScale(1.55f); ImGui::TextColored(CAM_GOK, "FIKATIA"); ImGui::SetWindowFontScale(1.0f); ImGui::SameLine(); ImGui::TextColored(MOR, "// CATIA OTOMASYON CEKIRDEGI"); ImGui::SameLine(ImGui::GetContentRegionAvail().x - 250.0f); ImGui::TextColored(durumRenk, bagli ? "[ CATIA HATTI AKTIF ]" : "[ BEKLEMEDE ]"); ImGui::SameLine(); ImGui::TextColored(YESIL, "IST:%d", sunucuIstemciSayisi()); ImGui::Separator(); ImGui::Spacing(); // ---- Sol: 3D HUD cekirdegi + kontrol ---- const float solGenislik = 360.0f; kartBasla("hud3d", ImVec2(solGenislik, 0), durumRenk); { ImDrawList* hdl = ImGui::GetWindowDrawList(); const ImVec2 kMin = ImGui::GetWindowPos(); const ImVec2 kBoyut = ImGui::GetWindowSize(); const ImVec2 merkez = ImVec2(kMin.x + kBoyut.x * 0.5f, kMin.y + kBoyut.y * 0.34f); hudCekirdekCiz(hdl, merkez, kBoyut.x * 0.30f, bagli, sunucuIstemciSayisi()); // HUD altinda durum + kontroller ImGui::SetCursorPosY(kBoyut.y * 0.66f); ImGui::Indent(14.0f); ImGui::TextColored(durumRenk, bagli ? "CATIA BAGLI" : "CATIA BAGLI DEGIL"); if (bagli && !g_surum.empty()) ImGui::TextDisabled("%s", g_surum.c_str()); ImGui::Spacing(); if (bagli) { if (ImGui::Button("Yenile", ImVec2(150, 0))) { if (g_catia.canli()) yenile(); else g_hata = "CATIA baglantisi koptu (uygulama kapatilmis olabilir)."; } if (ImGui::Button("Baglantiyi Kes", ImVec2(150, 0))) { g_catia.kopar(); g_dokumanlar.clear(); g_surum.clear(); } } else { if (ImGui::Button("Calisan CATIA'ya Baglan", ImVec2(200, 0))) baglan(false); if (ImGui::Button("CATIA Baslat ve Baglan", ImVec2(200, 0))) baglan(true); } ImGui::Spacing(); ImGui::TextDisabled("COM: Fikatia.Sistem"); ImGui::TextDisabled("CreateObject(\"Fikatia.Sistem\")"); ImGui::TextDisabled("Pencere kapatilinca tepsiye iner."); ImGui::Unindent(14.0f); } ImGui::EndChild(); ImGui::SameLine(); // ---- Sag: dokumanlar + gunluk ---- ImGui::BeginGroup(); const float sagGenislik = ImGui::GetContentRegionAvail().x; const float gunlukYukseklik = 170.0f; const float dokumanYukseklik = ImGui::GetContentRegionAvail().y - gunlukYukseklik - 8.0f; kartBasla("dokumanlar", ImVec2(sagGenislik, dokumanYukseklik), CAM_GOK); if (ImGui::BeginTabBar("sagSekmeler")) { if (ImGui::BeginTabItem("DOKUMANLAR")) { ImGui::TextDisabled("(%d acik dokuman)", (int)g_dokumanlar.size()); if (!g_hata.empty()) ImGui::TextColored(ImVec4(0.95f, 0.4f, 0.4f, 1.0f), "%s", g_hata.c_str()); if (bagli && ImGui::BeginTable("dokumanTablo", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersInnerH)) { ImGui::TableSetupColumn("Ad"); ImGui::TableSetupColumn("Tip", ImGuiTableColumnFlags_WidthFixed, 100.0f); ImGui::TableSetupColumn("Yol"); ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableHeadersRow(); for (const auto& d : g_dokumanlar) { ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::TextColored(YESIL, "%s", d.ad.c_str()); ImGui::TableNextColumn(); ImGui::TextUnformatted(d.tip.c_str()); ImGui::TableNextColumn(); ImGui::TextDisabled("%s", d.yol.c_str()); } ImGui::EndTable(); } else if (!bagli) { ImGui::TextDisabled("Baglanti bekleniyor..."); } ImGui::EndTabItem(); } if (ImGui::BeginTabItem("FIKOPOST")) { if (ImGui::BeginChild("postIcerik", ImVec2(0, 0))) postPanelIcerikCiz(); ImGui::EndChild(); ImGui::EndTabItem(); } ImGui::EndTabBar(); } ImGui::EndChild(); kartBasla("gunluk", ImVec2(sagGenislik, gunlukYukseklik), MOR); { ImGui::TextColored(MOR, "SISTEM GUNLUGU"); ImGui::SameLine(); ImGui::TextDisabled("(%d)", (int)g_gunluk.size()); if (ImGui::BeginChild("gunlukListe", ImVec2(0, 0))) { for (const auto& s : g_gunluk) ImGui::TextUnformatted(s.c_str()); if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY() - 4.0f) ImGui::SetScrollHereY(1.0f); } ImGui::EndChild(); } ImGui::EndChild(); ImGui::EndGroup(); ImGui::End(); ImGui::PopStyleVar(); } void sunucuGunlukEkle(const std::wstring& satir) { g_gunluk.push_back(utf8(satir)); if (g_gunluk.size() > 500) g_gunluk.erase(g_gunluk.begin()); } } // namespace fikatia