#include "baglam_hud.hpp" #include #include #include #include "belge.hpp" // Belge, baglamMotoru, BaglamKarar, HedefKategori #include "fiko/girdi/baglam_politika.hpp" // girdi::PolitikaKarar #include "fiko/ui/tema.hpp" // ui::Tema / tema / u32 / karisim #include "imgui.h" namespace fiko { namespace { // İmleç-altı semantik kategorinin kısa Türkçe adı (HUD/ipucu başlığı). const char* baglamKategoriAd(baglam::HedefKategori k) { using K = baglam::HedefKategori; switch (k) { case K::Bos: return "Boşluk"; case K::Govde: return "Gövde"; case K::YuzDuz: return "Düz Yüz"; case K::YuzSilindir: return "Silindirik Yüz"; case K::YuzKonik: return "Konik Yüz"; case K::YuzKure: return "Küresel Yüz"; case K::YuzEgri: return "Eğri Yüz"; case K::KenarCizgi: return "Doğru Kenar"; case K::KenarYay: return "Yay"; case K::KenarCember: return "Çember Kenar"; case K::KenarSpline: return "Spline Kenar"; case K::Vertex: return "Köşe"; case K::RefDuzlem: return "Referans Düzlem"; case K::RefEksen: return "Referans Eksen"; case K::Orijin: return "Orijin"; case K::SketchEntity: return "Eskiz Öğesi"; case K::GsdTel: return "Tel-Kafes"; case K::GsdYuzey: return "Yüzey"; case K::OlcumNesne: return "Ölçüm"; case K::CamGeometri: return "CAM Geometri"; case K::TakimYolu: return "Takım Yolu"; default: return ""; } } } // namespace void baglamIpucuHudCiz(Belge& belge, bool hoverHudAcik, bool vpHover, const girdi::PolitikaKarar& sonPolitika) { if (!hoverHudAcik || !vpHover || sonPolitika.gecerli()) return; const auto& mk = belge.baglamMotoru.sonKarar(); const baglam::HedefKategori kat = mk.hedef.kategori; static baglam::HedefKategori hudSonKat = baglam::HedefKategori::Bos; static double hudBasla = 0.0; const double simdiSn = ImGui::GetTime(); if (kat != hudSonKat) { hudSonKat = kat; hudBasla = simdiSn; } if (kat != baglam::HedefKategori::Bos && (simdiSn - hudBasla) > 0.30) { const ui::Tema& t = ui::tema(); ImDrawList* dl = ImGui::GetForegroundDrawList(); ImFont* f = ImGui::GetFont(); const float baslikB = 13.0f, satirB = 11.5f; char baslik[96]; if (mk.hedef.olcu > 0.0) std::snprintf(baslik, sizeof(baslik), "%s · %.2f", baglamKategoriAd(kat), mk.hedef.olcu); else std::snprintf(baslik, sizeof(baslik), "%s", baglamKategoriAd(kat)); // En uygun 2-3 komut etiketi (yaprak + ara-öğe; pasifleri atla). char eylem[128]; int ekli = 0; int uzun = std::snprintf(eylem, sizeof(eylem), "Sağ-tık: "); for (const auto& o : mk.ogeler) { if (!o.etkin || o.etiket.empty() || ekli >= 3) continue; const int yaz = std::snprintf(eylem + uzun, sizeof(eylem) - uzun, "%s%s", ekli > 0 ? " · " : "", o.etiket.c_str()); if (yaz <= 0 || uzun + yaz >= (int)sizeof(eylem)) break; uzun += yaz; ++ekli; } const ImVec2 bB = f->CalcTextSizeA(baslikB, FLT_MAX, 0.0f, baslik); const ImVec2 eB = ekli > 0 ? f->CalcTextSizeA(satirB, FLT_MAX, 0.0f, eylem) : ImVec2{0, 0}; const float padX = 9.0f, padY = 6.0f, satirAra = 3.0f; const float w = std::max(bB.x, eB.x) + padX * 2.0f; const float h = padY * 2.0f + bB.y + (ekli > 0 ? satirAra + eB.y : 0.0f); ImVec2 p = ImGui::GetMousePos(); p.x += 18.0f; p.y += 20.0f; const ImGuiViewport* mvp = ImGui::GetMainViewport(); if (p.x + w > mvp->WorkPos.x + mvp->WorkSize.x) p.x = ImGui::GetMousePos().x - w - 12.0f; if (p.y + h > mvp->WorkPos.y + mvp->WorkSize.y) p.y = ImGui::GetMousePos().y - h - 12.0f; const ImVec2 mn = p, mx{p.x + w, p.y + h}; dl->AddRectFilled(mn, mx, ui::u32(ui::karisim(t.panel, t.arka, 0.15f), 0.95f), t.yuvarlak); dl->AddRect(mn, mx, ui::u32(t.vurgu, 0.55f), t.yuvarlak, 0, 1.2f); dl->AddText(f, baslikB, {mn.x + padX, mn.y + padY}, ui::u32(ui::karisim(t.metin, t.vurgu, 0.20f)), baslik); if (ekli > 0) dl->AddText(f, satirB, {mn.x + padX, mn.y + padY + bB.y + satirAra}, ui::u32(t.metinSoluk), eylem); } } } // namespace fiko