#include "geri_bildirim_penceresi.hpp" #include #include #include "fiko/cekirdek/surum.hpp" #include "fiko/ui/tema.hpp" #include "fiko_cam_pencere.hpp" #include "imgui.h" #include "uygulama_baglam.hpp" namespace fiko { GeriBildirimServisi& geriBildirimServisi() { static GeriBildirimServisi s; return s; } namespace { const char* kKategoriAd[3] = {"🐞 Hata", "💡 Öneri", "❓ Soru"}; // Gövdeye giden sade etiket (UI emojisi sunucuya gitmesin). const char* kKategoriDeger[3] = {"Hata", "Öneri", "Soru"}; } // namespace void geriBildirimPenceresiCiz(UygulamaBaglam& b, GeriBildirimServisi& svc, GeriBildirimUI& ui) { // Açılış kenarı: viewport dokusu SON çizilen 3B kareyi tutar → kullanıcının // şikâyet ettiği görüntü budur. Pencere ImGui overlay'i olduğu için yakalamaya // girmez. Senkron GPU readback — yalnız bu tek jestte, sıcak yolda değil. if (ui.acik && !ui.oncekiAcik) { svc.ekranTemizle(); ui.ekranEkle = geriBildirimEkranGoruntusuVarsayilan(); if (ui.ekranEkle && b.ekranYakala) { std::vector png; if (b.ekranYakala(png)) svc.ekranAyarla(std::move(png)); } if (svc.durum() != GeriBildirimServisi::Durum::Gonderiliyor) svc.durumAyarla(GeriBildirimServisi::Durum::Bosta); } ui.oncekiAcik = ui.acik; if (!ui.acik) return; const ImVec4 SOLUK = ui::tema().metinSoluk; const ImVec4 YESIL = ui::tema().basari; const ImVec4 CYAN = ui::tema().vurgu; const ImVec4 HATA_RENK = ui::tema().hata; const auto durum = svc.durum(); const bool gonderiliyor = durum == GeriBildirimServisi::Durum::Gonderiliyor; bool acik = true; { CamPencere pen{"💬 Geri Bildirim###geribildirim", &acik, {.boyut = {420, 0}}}; if (!pen) { ui.acik = acik; return; } ImGui::TextColored(SOLUK, "Sürüm %s · %s", SURUM_METIN, geriBildirimCihazMetni().c_str()); ImGui::Separator(); ImGui::BeginDisabled(gonderiliyor); ImGui::SetNextItemWidth(-1); ImGui::Combo("##kategori", &ui.kategori, kKategoriAd, 3); ImGui::TextColored(SOLUK, "Ne oldu? Ne yapmaya çalışıyordunuz?"); ImGui::InputTextMultiline("##mesaj", ui.mesaj, sizeof(ui.mesaj), {-1, 120}); // Ekran görüntüsü: kutu işaretlenince (kapalıyken açılırsa) o anki kare yakalanır. if (ImGui::Checkbox("📷 Ekran görüntüsünü ekle", &ui.ekranEkle)) { if (ui.ekranEkle) { if (b.ekranYakala) { std::vector png; if (b.ekranYakala(png)) svc.ekranAyarla(std::move(png)); } } else { svc.ekranTemizle(); } } if (ui.ekranEkle) { const size_t bayt = svc.ekranBayt(); if (bayt > 0) ImGui::TextColored(SOLUK, " 3B görünüm yakalandı (%.0f KB)", (double)bayt / 1024.0); else ImGui::TextColored(HATA_RENK, " Görüntü yakalanamadı — mesaj yalnız metin gider."); } ImGui::EndDisabled(); ImGui::Separator(); const bool bosMesaj = ui.mesaj[0] == '\0'; ImGui::BeginDisabled(gonderiliyor || bosMesaj); if (ImGui::Button("📨 Gönder", {-1, 0})) { geriBildirimGonderBaslat(svc, ui.mesaj, kKategoriDeger[ui.kategori], ui.ekranEkle); } ImGui::EndDisabled(); if (bosMesaj && !gonderiliyor) ImGui::TextColored(SOLUK, "Göndermek için mesaj yazın."); switch (durum) { case GeriBildirimServisi::Durum::Gonderiliyor: ImGui::TextColored(CYAN, "⟳ Gönderiliyor…"); break; case GeriBildirimServisi::Durum::Gonderildi: ImGui::TextColored(YESIL, "✔ Teşekkürler! Geri bildiriminiz iletildi."); if (ImGui::Button("Yeni geri bildirim", {-1, 0})) { ui.mesaj[0] = '\0'; svc.durumAyarla(GeriBildirimServisi::Durum::Bosta); ui.oncekiAcik = false; // sonraki kare açılış kenarı → görüntü tazelenir } break; case GeriBildirimServisi::Durum::Hata: ImGui::TextColored(HATA_RENK, "⚠ Gönderilemedi:"); ImGui::TextWrapped("%s", svc.sonHata().c_str()); ImGui::TextColored(SOLUK, "Mesajınız korundu — tekrar deneyebilirsiniz."); break; default: break; } } // CamPencere RAII → End() ui.acik = acik; } } // namespace fiko