#include "fiko/baglam/baglam_kural.hpp" #include "fiko/cekirdek/cekirdek.hpp" // Cekirdek + MenuOge (registri süzgeci) namespace fiko::baglam { namespace { // Kısa yardımcı: yaprak öneri (inline kimlik → sunum inline çözümü). BaglamOnerisi O(const char* kimlik, const char* etiket, const char* simge, int yon = -1) { return {kimlik, etiket, simge, true, yon, {}}; } // Ara-öğe (alt-halka): kimlik boş; çocuklar tıklanınca açılır. BaglamOnerisi G(const char* etiket, const char* simge, std::vector cocuklar) { return {"", etiket, simge, true, -1, std::move(cocuklar)}; } } // namespace // (a) Registry-meta süzgeci — TEK kaynak registry; toolbar/halka/HUD aynı meta'yı okur. void registriOner(Cekirdek& c, const BaglamHedef& h, const BaglamDurum& d, std::vector& cikti) { if (h.kategori == HedefKategori::Bos) return; // boşluk = per-tip (nested Ekle) yolu const u32 kb = kategoriBit(h.kategori); for (const MenuOge& o : c.menuler().hepsi()) { if (o.hedefMaske == 0) continue; // global → bağlam halkasına girmez if (!(o.hedefMaske & kb)) continue; // bu kategoride uygun değil if (!(o.workbench.empty() || o.workbench == d.workbench)) continue; if (d.secimSayi < o.minSecim || d.secimSayi > o.maxSecim) continue; const bool etkin = !o.etkinMi || o.etkinMi(c); cikti.push_back({regKimlik(o.grup, o.ad), o.ad, o.simge, etkin, -1, {}}); } } // (b) Tip/kategori-özel hesaplanmış öğeler — nesnenin "kendi" bildirdiği komutlar. // Kısa kimlikler sunumun mevcut inline çözümüyle birebir (sec/agirlik/yakinlas/sil/ // gizle/kisit + primitif ekle) → regresyon yok. Registry komutları (fillet/pad/olç...) // registriOner'dan gelir; burada yalnız hesaplanmış/inline eylemler. void tipOner(const BaglamHedef& h, const BaglamDurum& d, std::vector& cikti) { switch (h.kategori) { case HedefKategori::Bos: { // Boşluk sağ-tık → workbench'e göre genel sahne komutları (nested). if (d.workbench == "sketcher") { cikti.push_back(G("Çizim", "✎", {O("cizgi", "Çizgi", "/"), O("cember", "Çember", "◯"), O("dikdortgen", "Dikdörtgen", "▭")})); cikti.push_back(O("kisit", "Kısıt", "⟂")); } else { cikti.push_back(G("Ekle", "➕", {O("kutu_ekle", "Kutu", "◼"), O("silindir_ekle", "Silindir", "⬭")})); cikti.push_back(O("tumunu_sigdir", "Sığdır", "⤢")); cikti.push_back(O("gorunum", "Görünüm", "👁")); } break; } case HedefKategori::Govde: { // Katı gövde: doğrudan nesneye uygulanan hızlı eylemler (yon = radyal slot). cikti.push_back(O("sec", "Seç", "🖈", 0)); cikti.push_back(O("agirlik", "Ağırlık", "⚖", 1)); cikti.push_back(O("yakinlas", "Yakınlaş", "🔍", 3)); cikti.push_back(O("sil", "Sil", "🗑", 4)); cikti.push_back(O("gizle", "Gizle", "🚫", 6)); break; } case HedefKategori::RefDuzlem: case HedefKategori::RefEksen: case HedefKategori::Orijin: // Datum: sketch (registriOner) + gizle. Origin gövde gizleme datum kümesini kapatır. cikti.push_back(O("gizle", "Gizle", "🚫")); break; case HedefKategori::GsdTel: case HedefKategori::GsdYuzey: case HedefKategori::TakimYolu: cikti.push_back(O("gizle", "Gizle", "🚫")); break; default: // Yüz/Kenar/Vertex: gizle her zaman uygulanabilir (registry fillet/olç yanında). cikti.push_back(O("gizle", "Gizle", "🚫")); break; } (void)h.dugumTip; // örnek-seviye ayrım Dalga 4 (FikoNesne köprü); tip-seviye yeter } namespace { struct RegistriSaglayici : BaglamKuralSaglayici { void oner(const BaglamHedef& h, const BaglamDurum& d, Cekirdek& c, std::vector& cikti) const override { registriOner(c, h, d, cikti); } }; struct TipSaglayici : BaglamKuralSaglayici { void oner(const BaglamHedef& h, const BaglamDurum& d, Cekirdek&, std::vector& cikti) const override { tipOner(h, d, cikti); } }; } // namespace void varsayilanKurallariKur(BaglamKuralKaydi& kayit) { kayit.ekle(std::make_unique()); kayit.ekle(std::make_unique()); } } // namespace fiko::baglam