#pragma once // Arama kutulu mini bağlam menüsü — Doğrudan Modelleme (Plasticity/Fusion tarzı): // yüze/kenara sağ-tık → imleç yanında ufak dikey pencere, üstte filtre kutusu, altında // SEÇİLİ topolojiye göre komutlar. Radyal halkanın (baglam_menu) alternatifi; her öğe // kendi eylemini (std::function) taşır → politikadan bağımsız, tam kontrol. Klavye: // yaz→filtrele, ↑↓ gez, Enter çalıştır, Esc kapat. Dış tık kapatır. #include #include #include #include "fiko/core/temel.hpp" #include "imgui.h" namespace fiko { // ---- Komut kullanım öğrenmesi (BAĞLAMA GÖRE son + sık) ---- // Sayaç KomutCalisti olayından beslenir (Cekirdek::komutCalistir TEK merkezden yayınlar) // ve "fikocad.ayar"da kalıcıdır (oturumlar arası). Her kayıt bir BAĞLAM kovasındadır // ("duz_yuz", "coklu_govde", "bosluk"…) → menü duruma göre öğrenir: delik yüzeyinde // öğrendiğin komut, boşluğa sağ-tıklayınca önerilmez. void komutKullanimArtir(const std::string& baglam, const std::string& grup, const std::string& ad); // DM menüsü açılırken o anki bağlamı bildirir. KomutCalisti bağlam TAŞIMAZ (genel olay); // menüden çalışan komut bu değere yazılır, başka kaynak (toolbar/kısayol) "genel" kovasına. void dmBaglamAyarla(const std::string& baglam); const std::string& dmBaglam(); struct OgrenilenKomut { std::string grup, ad; bool son = false; // true = son kullandığın (MRU), false = sık kullandığın }; // Bu bağlamda öğrenilenler: önce SON kullanılanlar (MRU), sonra en SIK kullanılanlar // (MRU'da geçenler tekrarlanmaz). Bağlamda hiç geçmiş yoksa "genel" kovasına düşer // (soğuk başlangıç: menü ilk günden boş kalmasın). std::vector komutOgrenilen(const std::string& baglam, int maksSon, int maksSik); // EN SON çalışan komut — bağlamdan BAĞIMSIZ (tüm kovaların en büyük damgası). // Menünün "🔁 Tekrarla" öğesi: yüz seç → komut → BAŞKA yüz seç → aynı komut, aramadan. // false = henüz hiç komut çalışmadı. bool komutSonCalisan(std::string& grup, std::string& ad); // Öğrenme ana anahtarı (AyarSistemi "menu.ogrenme_aktif", varsayılan AÇIK). Kapalı → // hiç sayaç tutulmaz ve menüde "son/sık kullandığın" + "🔁 Tekrarla" çıkmaz (menü // deterministik olur — eğitim/demo için). bool& menuOgrenmeAktif(); // Öğrenilenleri tamamen sil (ayar penceresi "Öğrenilenleri sıfırla"). void komutOgrenmeSifirla(); struct AramaMenuOge { std::string etiket; // görünen ad (Türkçe) std::string simge; // glif (UTF-8; ui::Simge ile çizilir) std::string ipucu; // opsiyonel kısa açıklama (sağda soluk) std::function calistir; // seçilince yürütülür bool etkin = true; // pasif → soluk, tıklanamaz }; struct AramaMenuDurum { bool acik = false; ImVec2 konum{}; // açılış ekran konumu (imleç) std::vector ogeler; // bağlamsal komut listesi char filtre[64] = ""; int secili = 0; // filtrelenmiş liste içindeki vurgulu satır bool yeniAcildi = false; // ilk çizim karesi → InputText'e klavye odağı ver // Filtre BOŞKEN arama kutusunun hemen altına çizilen kompakt bant (DM grafik özellik // satırı). Yükseklik açılışta sabitlenir → menü genişliği/yerleşimi oynamaz; kullanıcı // yazmaya başlayınca bant gizlenir (liste normale döner). Boş → bant yok. std::function ustPanel; float ustPanelYuk = 0.0f; bool kapatIstegi = false; // ustPanel içi eylem menüyü kapatmak isterse (içerik bayatladı) std::function kapanis; // menü kapanırken (renk/alfa oturumu kesinleştirme vb.) std::vector gorunurTmp; // filtre sonucu (kare-kare yeniden kullanılır → tahsis yok) }; // Menüyü verilen konumda bağlam komutlarıyla aç (öncekini değiştirir). void aramaMenuAc(AramaMenuDurum& d, ImVec2 konum, std::vector ogeler); // Her karede çağrılır; açık değilse hemen döner. Seçim → öğe.calistir() + kapat. void aramaMenuCiz(AramaMenuDurum& d, ImGuiIO& io); } // namespace fiko