#include "fiko/ui/agac_simge_kayit.hpp" #include #include namespace fiko::ui { namespace { // Değer bir görüntü dosyası yolu mu (.svg/.png/.jpg/.jpeg/.bmp/.gif — büyük/küçük duyarsız). bool dosyaYoluMu(const std::string& s) { auto sonEk = [&](const char* e) { const size_t n = std::strlen(e); if (s.size() < n) return false; for (size_t i = 0; i < n; ++i) if (std::tolower((unsigned char)s[s.size() - n + i]) != (unsigned char)e[i]) return false; return true; }; return sonEk(".svg") || sonEk(".png") || sonEk(".jpg") || sonEk(".jpeg") || sonEk(".bmp") || sonEk(".gif"); } } // namespace AgacSimgeKayit& AgacSimgeKayit::global() { static AgacSimgeKayit g; return g; } AgacSimgeKayit::Giris* AgacSimgeKayit::bul(const char* anahtar) { for (Giris& g : girisler_) if (g.anahtar == anahtar) return &g; return nullptr; } const AgacSimgeKayit::Giris* AgacSimgeKayit::bul(const char* anahtar) const { for (const Giris& g : girisler_) if (g.anahtar == anahtar) return &g; return nullptr; } void AgacSimgeKayit::kaydet(const char* anahtar, const char* ad, const char* varsayilanGlif) { if (bul(anahtar)) return; Giris g; g.anahtar = anahtar; g.ad = ad; g.varsayilan = varsayilanGlif ? varsayilanGlif : ""; girisler_.push_back(std::move(g)); } void AgacSimgeKayit::ayarla(const char* anahtar, const std::string& deger) { Giris* g = bul(anahtar); if (!g) return; g->ham = deger; if (deger.empty() || deger == g->varsayilan) { // override yok → sağlayıcı glifi kullanılır g->kullaniciAyarli = false; g->simge = Simge{}; return; } if (dosyaYoluMu(deger)) { const ImTextureID d = kitaplik::yukle(std::string("agacsimge_") + anahtar, deger, 0); if (d) { g->simge = Simge::dokulu(d); g->kullaniciAyarli = true; } else { // yüklenemedi → override yok (glif fallback) g->simge = Simge{}; g->kullaniciAyarli = false; } } else { // emoji/glif — ham vektörde kararlı (reserve → realloc yok) g->simge = Simge(g->ham.c_str()); g->kullaniciAyarli = true; } } Simge AgacSimgeKayit::al(const char* anahtar) const { const Giris* g = bul(anahtar); return (g && g->kullaniciAyarli) ? g->simge : Simge{}; } Simge AgacSimgeKayit::coz(std::uint64_t ogeId, const char* tipAnahtar, const char* saglayiciGlif) const { const Simge o = ogeAl(ogeId); if (!o.bosMu()) return o; // 1) öğe-bazlı override (en yüksek öncelik) if (tipAnahtar) { const Simge t = al(tipAnahtar); if (!t.bosMu()) return t; // 2) tip-default override (Ayarlar) } return Simge(saglayiciGlif); // 3) sağlayıcı / varsayılan glif (null → boş → çizilmez) } const std::string& AgacSimgeKayit::hamDeger(const char* anahtar) const { static const std::string bos; const Giris* g = bul(anahtar); return g ? g->ham : bos; } Simge AgacSimgeKayit::onizleSimge(const char* anahtar) const { const Giris* g = bul(anahtar); if (!g) return Simge{}; if (g->kullaniciAyarli) return g->simge; return Simge(g->varsayilan.c_str()); // varsayilan Giris'te → işaretçi kararlı } void AgacSimgeKayit::ogeAyarla(std::uint64_t id, const std::string& deger) { if (deger.empty()) { ogeler_.erase(id); return; } OgeSimge& slot = ogeler_[id]; slot.ham = deger; if (dosyaYoluMu(deger)) { char ad[48]; std::snprintf(ad, sizeof(ad), "oge_%llu", (unsigned long long)id); const ImTextureID d = kitaplik::yukle(ad, deger, 0); if (d) { slot.simge = Simge::dokulu(d); } else { ogeler_.erase(id); // yüklenemedi → override yok } } else { slot.simge = Simge(slot.ham.c_str()); // emoji — slot node-based → ham işaretçisi kararlı } } Simge AgacSimgeKayit::ogeAl(std::uint64_t id) const { const auto it = ogeler_.find(id); return it == ogeler_.end() ? Simge{} : it->second.simge; } const std::string& AgacSimgeKayit::ogeHam(std::uint64_t id) const { static const std::string bos; const auto it = ogeler_.find(id); return it == ogeler_.end() ? bos : it->second.ham; } void AgacSimgeKayit::ogeTemizle(std::uint64_t id) { ogeler_.erase(id); } std::vector> AgacSimgeKayit::ogeListesi() const { std::vector> v; v.reserve(ogeler_.size()); for (const auto& [id, o] : ogeler_) v.emplace_back(id, o.ham); return v; } void AgacSimgeKayit::ogeleriTemizle() { ogeler_.clear(); } void agacSimgeVarsayilanlariKur() { AgacSimgeKayit& k = AgacSimgeKayit::global(); if (!k.girisler().empty()) return; // bir kez k.kaydet("govde", "Katı Gövde", "▣"); k.kaydet("sketch", "Eskiz", "✎"); // NOT: "feature"/"gsd" generic YOK — her spesifik tip (feature.pad, gsd.fill…) // uygulama katmanında (ayar_kayitlari) registry'den ayrı ayrı kaydedilir. k.kaydet("datum", "Referans / Datum", "✛"); k.kaydet("tel", "Tel-Kafes (GSD)", "〰"); k.kaydet("yuzey", "Açık Yüzey (GSD)", "◗"); k.kaydet("grup", "Grup / Klasör", "🗀"); k.kaydet("olcum", "Ölçüm", "📐"); k.kaydet("parametre", "Parametre ƒ(x)", "ƒ"); k.kaydet("analiz", "Analiz", "🔬"); k.kaydet("isik", "Işık", "💡"); k.kaydet("konum", "Görünüm (Kamera)", "🎥"); k.kaydet("malzeme", "Malzeme", "🎨"); k.kaydet("cam_op", "CAM Operasyon", "▣"); k.kaydet("cam_takim", "CAM Takım", "🔧"); } } // namespace fiko::ui