#include "fiko/ui/pencere_cerceve.hpp" #include #include #include #include "fiko/ui/bilesen.hpp" #include "fiko/ui/pencere_util.hpp" #include "fiko/ui/tema.hpp" #include "fiko/ui/web_skin.hpp" #include "imgui_internal.h" namespace fiko::ui { namespace { // Pin durumu dış depo verilmediğinde başlığa göre kalıcı iç depo. std::unordered_map& pinDepo() { static std::unordered_map d; return d; } } // namespace namespace { PencereSkin& varsayilanSkinDepo() { // Varsayılan görünüm = WebCam (teal cam + cyan + ızgara). Tüm pencereler bu tarzda // açılır (Fikri 07-23: "tüm pencereleri webskin'e çevir"). skin_webcam ayarı // (varsayılan açık) bunu kapatıp eski düz temaya döndürebilir. Açıkça skin yazan // pencereler (ör. kafa WebCam) zaten etkilenmez. static PencereSkin s = PencereSkin::WebCam; return s; } } // namespace void pencereVarsayilanSkinAyarla(PencereSkin s) { varsayilanSkinDepo() = s; } PencereSkin pencereVarsayilanSkin() { return varsayilanSkinDepo(); } Pencere::Pencere(const char* baslik, bool* acik, const PencereSecenek& s) : govde_(false), skin_(s.skin == PencereSkin::Varsayilan ? pencereVarsayilanSkin() : s.skin), skinGovde_(false) { if (skin_ == PencereSkin::WebCam) webSkinKromBasla(); // Begin ÖNCESİ (chrome) bool* pin = s.pinDurum; if (s.pin && !pin) pin = &pinDepo()[ImHashStr(baslik)]; // Yükseklik tavanı: pencere hiçbir zaman ekranı aşmasın (ilk açılış oturması). // maxYukOran >= 1.0 → cap KAPALI (tam yükseklik / çoklu-monitör serbest); tek // viewport WorkSize'ına göre yanlış kısıt oluşmaz. const float oran = s.maxYukOran <= 0.0f ? 0.90f : s.maxYukOran; float tavan = FLT_MAX; if (oran < 1.0f) tavan = ImGui::GetMainViewport()->WorkSize.y * oran; if (s.tamAlan) { // Tam alan: kısıt YOK (min de dahil — küçülmeyi engellerdi), konum/boyut her kare // viewport'a eşitlenir. FirstUseEver DEĞİL Always: OS penceresi boyutlanınca içerik // onunla birlikte gelsin. const ImGuiViewport* vp = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(vp->WorkPos, ImGuiCond_Always); ImGui::SetNextWindowSize(vp->WorkSize, ImGuiCond_Always); } else { ImGui::SetNextWindowSizeConstraints(s.minBoyut, ImVec2{FLT_MAX, tavan}); ImGui::SetNextWindowSize(s.boyut, ImGuiCond_FirstUseEver); } if (s.bgAlfa >= 0.0f) ImGui::SetNextWindowBgAlpha(s.bgAlfa); // Tam alan (araç kipi) penceresi kavramsal olarak "arka plan konteyneri" — sürecin // TEK penceresi, tüm viewport'u kaplar. NoBringToFrontOnFocus OLMADAN: kullanıcı bu // pencere içinde herhangi bir yere tıklayınca (ör. 3D kamera sürüklemesi — neredeyse // her yer bu pencerenin içi) ImGui onu z-sırasının EN ÖNÜNE alır; pencere tüm ekranı // kapladığından, üstüne AÇILAN küçük yardımcı pencereler (ör. Doğrusal Nokta Ofseti, // Kaçma Değerleri) hem görsel olarak altta kalır hem de tıklama artık onlara değil bu // pencereye gider — kullanıcı onları bir daha öne getiremez/etkileşemez. Bayrağı ekle: // odaklansa da pencere DAİMA z-sırasının EN ARKASINDA (ilk çizilen/en alt katman) // kalır, sonradan Begin edilen tüm yardımcı pencereler her zaman üstte ve tıklanabilir. ImGuiWindowFlags bayrak = s.bayrak; if (s.tamAlan) bayrak |= ImGuiWindowFlags_NoBringToFrontOnFocus; if (s.pin && pin) ustteTutSinif(*pin); govde_ = ImGui::Begin(baslik, acik, bayrak); if (govde_ && s.pin && pin) ustteTutDugmesi(baslik, *pin); // Gövde stili (grid + pill widget) pin düğmesinden SONRA: grid başlık/pin altından // başlar. Katlı pencerede çizim yok → push da yok (dtor'da simetrik pop). if (govde_ && skin_ == PencereSkin::WebCam) { webSkinGovdeBasla(s.gridAdim); skinGovde_ = true; } } Pencere::~Pencere() { if (skinGovde_) webSkinGovdeBitir(); // End'den ÖNCE (pencere-içi stil) ImGui::End(); if (skin_ == PencereSkin::WebCam) webSkinKromBitir(); // End'den SONRA (chrome) } bool sekmeBaslat(const char* kimlik, ImGuiTabBarFlags bayrak) { return ImGui::BeginTabBar(kimlik, bayrak | ImGuiTabBarFlags_FittingPolicyScroll); } void sekmeKapat() { ImGui::EndTabBar(); } bool sekme(const char* etiket, const char* ikon, ImGuiTabItemFlags bayrak) { if (ikon && *ikon) { char buf[160]; std::snprintf(buf, sizeof(buf), "%s %s", ikon, etiket); return ImGui::BeginTabItem(buf, nullptr, bayrak); } return ImGui::BeginTabItem(etiket, nullptr, bayrak); } void sekmeBitir() { ImGui::EndTabItem(); } bool bolum(const char* ikon, const char* baslik, const char* kimlik) { const Tema& t = tema(); char lbl[192]; std::snprintf(lbl, sizeof(lbl), "%s %s###%s", ikon ? ikon : "", baslik, kimlik ? kimlik : baslik); ImGui::PushStyleColor(ImGuiCol_Header, {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.14f}); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.28f}); const bool acik = ImGui::CollapsingHeader(lbl, ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed); ImGui::PopStyleColor(2); return acik; } } // namespace fiko::ui