#include "istakip_sema_penceresi.hpp" #include #include #include #include #include "fiko/istakip/istemci.hpp" #include "fiko/istakip/model.hpp" #include "fiko/ui/bilesen_ek.hpp" // toastGoster #include "fiko/ui/pencere_cerceve.hpp" #include "imgui.h" #include "istakip_sema.hpp" #include "istakip_servis.hpp" #include "uygulama_baglam.hpp" namespace fiko { namespace { using istakip::IsKayit; bool g_acik = false; bool g_pin = false; // Sağdaki form: bir türün düzenlenebilir kopyası (sabit char buffer'lar — // dinamik satır ekleme/silme ImGui InputText ile doğrudan std::string // göstermek yerine bu şekilde daha güvenli/basit). struct AlanDuzen { char ad[32] = {}; char etiket[48] = {}; int tipIndex = 0; // varsayilanTipler() sırasıyla bool tabloda = true; }; const char* const TIPLER[] = {"metin", "sayi", "tarih", "para"}; constexpr int TIP_ADET = 4; u64 g_duzenKimlik = 0; // 0 = yeni tür formu char g_turId[32] = {}; char g_ikon[8] = {}; char g_baslik[48] = {}; char g_tekil[48] = {}; char g_renk[8] = {}; char g_bagTur[32] = {}; int g_sira = 0; std::vector g_alanlar; std::vector> g_durumlar; void formuTemizle() { g_duzenKimlik = 0; std::memset(g_turId, 0, sizeof(g_turId)); std::memset(g_ikon, 0, sizeof(g_ikon)); std::memset(g_baslik, 0, sizeof(g_baslik)); std::memset(g_tekil, 0, sizeof(g_tekil)); std::snprintf(g_renk, sizeof(g_renk), "%s", "#4C9BE8"); std::memset(g_bagTur, 0, sizeof(g_bagTur)); g_sira = 50; g_alanlar.clear(); g_durumlar.clear(); } int tipIndexBul(const std::string& tip) { for (int i = 0; i < TIP_ADET; ++i) if (tip == TIPLER[i]) return i; return 0; } void formuYukle(const TurSema& t, u64 kimlik) { g_duzenKimlik = kimlik; std::snprintf(g_turId, sizeof(g_turId), "%s", t.tur_id.c_str()); std::snprintf(g_ikon, sizeof(g_ikon), "%s", t.ikon.c_str()); std::snprintf(g_baslik, sizeof(g_baslik), "%s", t.baslik.c_str()); std::snprintf(g_tekil, sizeof(g_tekil), "%s", t.tekil.c_str()); std::snprintf(g_renk, sizeof(g_renk), "%s", t.renk.empty() ? "#4C9BE8" : t.renk.c_str()); std::snprintf(g_bagTur, sizeof(g_bagTur), "%s", t.bag_tur.c_str()); g_sira = t.sira; g_alanlar.clear(); for (const AlanSema& a : t.alanlar) { AlanDuzen d; std::snprintf(d.ad, sizeof(d.ad), "%s", a.ad.c_str()); std::snprintf(d.etiket, sizeof(d.etiket), "%s", a.etiket.c_str()); d.tipIndex = tipIndexBul(a.tip); d.tabloda = a.tabloda; g_alanlar.push_back(d); } g_durumlar.clear(); for (const std::string& d : t.durumlar) { std::array buf{}; std::snprintf(buf.data(), buf.size(), "%s", d.c_str()); g_durumlar.push_back(buf); } } // Formdan TurSema kurar (boş "ad" alan satırları / boş durum satırları atlanır). TurSema formdanTurSema() { TurSema t; t.tur_id = g_turId; t.ikon = g_ikon; t.baslik = g_baslik; t.tekil = g_tekil; t.renk = g_renk; t.bag_tur = g_bagTur; t.sira = g_sira; for (const AlanDuzen& d : g_alanlar) { if (!d.ad[0]) continue; AlanSema a; a.ad = d.ad; a.etiket = d.etiket[0] ? d.etiket : d.ad; a.tip = TIPLER[d.tipIndex]; a.tabloda = d.tabloda; t.alanlar.push_back(std::move(a)); } for (const auto& buf : g_durumlar) if (buf[0]) t.durumlar.emplace_back(buf.data()); return t; } } // namespace void istakipSemaPencereAc() { g_acik = true; if (g_turId[0] == '\0' && g_duzenKimlik == 0 && g_alanlar.empty()) formuTemizle(); } void istakipSemaPencereDuzenleAc(const char* tur_id) { g_acik = true; const istakip::IsIstemci* veri = g_istakipServis.veri(); if (!veri) { formuTemizle(); return; } for (const IsKayit* k : veri->turListe("_sema")) { TurSema t = semaKayitOku(*k); if (t.tur_id == tur_id) { formuYukle(t, k->kimlik); return; } } formuTemizle(); } void istakipSemaPenceresiCiz(UygulamaBaglam&) { if (!g_acik) return; ui::Pencere p{"⚙ Şema Tasarımcı###istakip_sema", &g_acik, {.boyut = {720, 560}, .minBoyut = {560, 420}, .pinDurum = &g_pin, .skin = ui::PencereSkin::WebCam}}; if (!p) return; const istakip::IsIstemci* veri = g_istakipServis.veri(); if (!veri) { ImGui::TextDisabled("İş Takip kapalı — önce Ayarlar'dan bağlanın."); return; } // ── SOL: mevcut türler + yeni tür düğmesi ────────────────────────────── ImGui::BeginChild("##semaSol", {200, 0}, ImGuiChildFlags_Borders); if (ImGui::Button("➕ Yeni Tür", {-1, 0})) formuTemizle(); ImGui::Separator(); const auto& ts = turlarOku(*veri); for (const TurSema& t : ts) { char etiket[80]; std::snprintf(etiket, sizeof(etiket), "%s %s", t.ikon.c_str(), t.baslik.c_str()); if (ImGui::Selectable(etiket, g_turId == t.tur_id)) istakipSemaPencereDuzenleAc(t.tur_id.c_str()); } ImGui::EndChild(); ImGui::SameLine(); // ── SAĞ: form ─────────────────────────────────────────────────────────── ImGui::BeginChild("##semaSag", {0, 0}); ImGui::SeparatorText(g_duzenKimlik ? "Türü Düzenle" : "Yeni Tür"); const float et = 100.0f; auto satir = [&](const char* baslikTxt, char* buf, size_t boyut, const char* ipucu = nullptr) { ImGui::AlignTextToFramePadding(); ImGui::TextUnformatted(baslikTxt); ImGui::SameLine(et); ImGui::PushID(baslikTxt); ImGui::SetNextItemWidth(-1); if (ipucu) ImGui::InputTextWithHint("##v", ipucu, buf, boyut); else ImGui::InputText("##v", buf, boyut); ImGui::PopID(); }; satir("tur_id", g_turId, sizeof(g_turId), "örn: makine_bakim (benzersiz, boşluksuz)"); satir("İkon", g_ikon, sizeof(g_ikon), "emoji, örn: 🔧"); satir("Başlık", g_baslik, sizeof(g_baslik), "sekme başlığı, örn: Makine Bakımları"); satir("Tekil", g_tekil, sizeof(g_tekil), "\"Yeni ...\" etiketi, örn: Bakım Kaydı"); satir("Renk", g_renk, sizeof(g_renk), "#RRGGBB"); satir("Bağlı Tür", g_bagTur, sizeof(g_bagTur), "zincirde bağlı olduğu tur_id (boş=kök)"); ImGui::AlignTextToFramePadding(); ImGui::TextUnformatted("Sıra"); ImGui::SameLine(et); ImGui::SetNextItemWidth(80); ImGui::InputInt("##sira", &g_sira, 0); ImGui::Spacing(); // ── Alanlar ──────────────────────────────────────────────────────────── ImGui::SeparatorText("Alanlar"); if (ImGui::BeginTable("##semaAlanlar", 5, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersInnerH, {0, ImGui::GetTextLineHeightWithSpacing() * 6})) { ImGui::TableSetupColumn("Anahtar", ImGuiTableColumnFlags_WidthFixed, 100); ImGui::TableSetupColumn("Etiket", ImGuiTableColumnFlags_WidthFixed, 120); ImGui::TableSetupColumn("Tip", ImGuiTableColumnFlags_WidthFixed, 90); ImGui::TableSetupColumn("Tablo", ImGuiTableColumnFlags_WidthFixed, 44); ImGui::TableSetupColumn("##sil", ImGuiTableColumnFlags_WidthFixed, 28); ImGui::TableHeadersRow(); int silinecek = -1; for (int i = 0; i < (int)g_alanlar.size(); ++i) { AlanDuzen& a = g_alanlar[(size_t)i]; ImGui::TableNextRow(); ImGui::PushID(i); ImGui::TableSetColumnIndex(0); ImGui::SetNextItemWidth(-1); ImGui::InputText("##ad", a.ad, sizeof(a.ad)); ImGui::TableSetColumnIndex(1); ImGui::SetNextItemWidth(-1); ImGui::InputText("##et", a.etiket, sizeof(a.etiket)); ImGui::TableSetColumnIndex(2); ImGui::SetNextItemWidth(-1); if (ImGui::BeginCombo("##tip", TIPLER[a.tipIndex])) { for (int ti = 0; ti < TIP_ADET; ++ti) if (ImGui::Selectable(TIPLER[ti], ti == a.tipIndex)) a.tipIndex = ti; ImGui::EndCombo(); } ImGui::TableSetColumnIndex(3); ImGui::Checkbox("##tb", &a.tabloda); ImGui::TableSetColumnIndex(4); if (ImGui::SmallButton("🗑")) silinecek = i; ImGui::PopID(); } if (silinecek >= 0) g_alanlar.erase(g_alanlar.begin() + silinecek); ImGui::EndTable(); } if (ImGui::SmallButton("+ Alan Ekle")) g_alanlar.push_back({}); ImGui::Spacing(); // ── Durumlar ─────────────────────────────────────────────────────────── ImGui::SeparatorText("Durum Akışı (boş = düz tablo, Kanban yok)"); { int silinecek = -1; for (int i = 0; i < (int)g_durumlar.size(); ++i) { ImGui::PushID(1000 + i); ImGui::SetNextItemWidth(160); ImGui::InputText("##durum", g_durumlar[(size_t)i].data(), g_durumlar[(size_t)i].size()); ImGui::SameLine(); if (ImGui::SmallButton("🗑")) silinecek = i; ImGui::PopID(); } if (silinecek >= 0) g_durumlar.erase(g_durumlar.begin() + silinecek); if (ImGui::SmallButton("+ Durum Ekle")) g_durumlar.push_back({}); } ImGui::Spacing(); // ── Kaydet / Sil / Vazgeç ───────────────────────────────────────────── if (ImGui::Button("💾 Kaydet")) { if (!g_turId[0]) { ui::toastGoster("tur_id boş olamaz", ui::ToastTip::Uyari); } else { const TurSema t = formdanTurSema(); if (g_istakipServis.yaz(semaKayitYaz(t, g_duzenKimlik), 0) == 0) ui::toastGoster("Kaydedilemedi — bağlantı/yetki kontrol edin", ui::ToastTip::Uyari); else ui::toastGoster("Şema kaydedildi", ui::ToastTip::Basari); } } ImGui::SameLine(); if (g_duzenKimlik) { if (ImGui::Button("🗑 Türü Sil")) { IsKayit sil; sil.kimlik = g_duzenKimlik; sil.tur = "_sema"; sil.silindi = true; g_istakipServis.yaz(sil, 0); formuTemizle(); ui::toastGoster("Tür silindi (mevcut kayıtlar tur alanıyla kalır, yalnız tanım kalktı)", ui::ToastTip::Bilgi); } ImGui::SameLine(); } if (ImGui::Button("✖ Vazgeç")) formuTemizle(); ImGui::EndChild(); } } // namespace fiko