#include "fiko/ui/tema.hpp" #include namespace fiko::ui { namespace { Tema koyuTema() { Tema t; // varsayılanlar zaten Koyu return t; } Tema neonTema() { Tema t; t.ad = "Neon"; t.arka = {0.035f, 0.030f, 0.060f, 0.96f}; t.panel = {0.070f, 0.060f, 0.115f, 1.0f}; t.cerceve = {0.10f, 0.09f, 0.17f, 1.0f}; t.kenar = {0.30f, 0.85f, 1.00f, 0.35f}; t.metin = {0.88f, 0.95f, 1.00f, 1.0f}; t.metinSoluk = {0.45f, 0.52f, 0.68f, 1.0f}; t.vurgu = {0.00f, 0.95f, 1.00f, 1.0f}; t.vurgu2 = {1.00f, 0.25f, 0.85f, 1.0f}; t.yuvarlak = 8.0f; t.glowSiddet = 1.6f; return t; } Tema acikTema() { Tema t; t.ad = "Açık"; t.koyu = false; t.arka = {0.93f, 0.94f, 0.97f, 0.98f}; t.panel = {0.97f, 0.97f, 0.99f, 1.0f}; t.cerceve = {0.88f, 0.89f, 0.93f, 1.0f}; t.kenar = {0.62f, 0.67f, 0.78f, 0.55f}; t.metin = {0.12f, 0.14f, 0.20f, 1.0f}; t.metinSoluk = {0.42f, 0.46f, 0.54f, 1.0f}; t.vurgu = {0.05f, 0.45f, 0.90f, 1.0f}; t.vurgu2 = {0.62f, 0.15f, 0.85f, 1.0f}; t.basari = {0.10f, 0.62f, 0.30f, 1.0f}; t.uyari = {0.85f, 0.55f, 0.05f, 1.0f}; t.hata = {0.85f, 0.15f, 0.20f, 1.0f}; t.glowSiddet = 0.5f; return t; } Tema webTema() { Tema t; t.ad = "Web"; t.glass = true; // KOYU TURKUAZ CAM paleti (web DialogFiko rgba(0,127,127) eslenigi). // NOT: Eski "buzlu beyaz cam + koyu yazi" paleti KALDIRILDI — uygulamanin // WebCam pencere skini ve bilesenleri BEYAZ metin varsayiyor; acik cam // zeminle birlesince "acik zemin + acik yazi" okunmazligi oluyordu. // Koyu turkuaz zemin hem skin'in beyaz yazisiyla hem de tema token'lariyla // her kosulda okunur kontrast verir. t.arka = {0.02f, 0.20f, 0.22f, 0.86f}; t.panel = {0.03f, 0.26f, 0.28f, 0.92f}; t.cerceve = {0.05f, 0.32f, 0.34f, 0.90f}; t.kenar = {0.50f, 1.00f, 1.00f, 0.30f}; t.metin = {0.92f, 0.99f, 1.00f, 1.0f}; t.metinSoluk = {0.58f, 0.78f, 0.82f, 1.0f}; t.vurgu = {0.18f, 0.86f, 1.00f, 1.0f}; t.vurgu2 = {0.45f, 0.65f, 1.00f, 1.0f}; t.basari = {0.30f, 0.85f, 0.50f, 1.0f}; t.uyari = {1.00f, 0.75f, 0.25f, 1.0f}; t.hata = {1.00f, 0.42f, 0.45f, 1.0f}; t.yuvarlak = 11.0f; t.glowSiddet = 0.9f; return t; } Tema g_temalar[4] = {koyuTema(), webTema(), neonTema(), acikTema()}; Tema g_aktif = koyuTema(); float g_yogunluk = 1.0f; // padding ölçek çarpanı (temaUygula okur) } // namespace const Tema& tema() { return g_aktif; } int temaSayisi() { return 4; } const Tema& temaAl(int indeks) { return g_temalar[indeks < 0 ? 0 : indeks % 4]; } ImU32 u32(const ImVec4& r, float alfaCarpan) { ImVec4 k = r; k.w *= alfaCarpan; return ImGui::ColorConvertFloat4ToU32(k); } ImVec4 karisim(const ImVec4& a, const ImVec4& b, float t) { return {a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t}; } void temaUygula(const Tema& t) { g_aktif = t; ImGuiStyle& stil = ImGui::GetStyle(); stil.WindowRounding = t.yuvarlak + 4.0f; stil.ChildRounding = t.yuvarlak + 2.0f; stil.FrameRounding = t.yuvarlak; stil.GrabRounding = t.yuvarlak; stil.PopupRounding = t.yuvarlak + 2.0f; stil.TabRounding = t.yuvarlak; stil.ScrollbarRounding = t.yuvarlak + 2.0f; stil.WindowBorderSize = 0.0f; stil.PopupBorderSize = 1.0f; // Kompakt/futuristik yoğunluk: daha az padding → ekranda daha fazla alan. // g_yogunluk ile ölçeklenir (Kompakt/Normal/Ferah — yogunlukAyarla). const float d = g_yogunluk; stil.FramePadding = {5.0f * d, 2.5f * d}; stil.ItemSpacing = {5.0f * d, 3.0f * d}; stil.ItemInnerSpacing = {4.0f * d, 2.0f * d}; stil.WindowPadding = {7.0f * d, 5.0f * d}; stil.CellPadding = {3.0f * d, 2.0f * d}; stil.IndentSpacing = 16.0f * d; stil.ScrollbarSize = 9.0f; stil.GrabMinSize = 8.0f; stil.TabBarBorderSize = 0.0f; stil.SeparatorTextPadding = {14.0f, 2.0f}; stil.SelectableTextAlign = {0.0f, 0.5f}; const ImVec4 vurguYumusak = karisim(t.cerceve, t.vurgu, 0.30f); const ImVec4 vurguOrta = karisim(t.cerceve, t.vurgu, 0.55f); ImVec4* r = stil.Colors; r[ImGuiCol_Text] = t.metin; r[ImGuiCol_TextDisabled] = t.metinSoluk; r[ImGuiCol_WindowBg] = t.arka; r[ImGuiCol_ChildBg] = {0, 0, 0, 0}; r[ImGuiCol_PopupBg] = {t.arka.x, t.arka.y, t.arka.z, 0.98f}; r[ImGuiCol_Border] = t.kenar; r[ImGuiCol_BorderShadow] = {0, 0, 0, 0}; r[ImGuiCol_FrameBg] = t.cerceve; r[ImGuiCol_FrameBgHovered] = karisim(t.cerceve, t.vurgu, 0.18f); r[ImGuiCol_FrameBgActive] = karisim(t.cerceve, t.vurgu, 0.30f); r[ImGuiCol_TitleBg] = {t.panel.x, t.panel.y, t.panel.z, 1.0f}; r[ImGuiCol_TitleBgActive] = karisim(t.panel, t.vurgu, 0.12f); r[ImGuiCol_TitleBgCollapsed] = {t.panel.x, t.panel.y, t.panel.z, 0.8f}; r[ImGuiCol_MenuBarBg] = t.panel; r[ImGuiCol_ScrollbarBg] = {0, 0, 0, 0}; r[ImGuiCol_ScrollbarGrab] = karisim(t.cerceve, t.metinSoluk, 0.35f); r[ImGuiCol_ScrollbarGrabHovered] = karisim(t.cerceve, t.vurgu, 0.45f); r[ImGuiCol_ScrollbarGrabActive] = t.vurgu; r[ImGuiCol_CheckMark] = t.vurgu; r[ImGuiCol_SliderGrab] = karisim(t.vurgu, t.metin, 0.10f); r[ImGuiCol_SliderGrabActive] = t.vurgu; r[ImGuiCol_Button] = vurguYumusak; r[ImGuiCol_ButtonHovered] = vurguOrta; r[ImGuiCol_ButtonActive] = karisim(t.cerceve, t.vurgu, 0.75f); r[ImGuiCol_Header] = {vurguYumusak.x, vurguYumusak.y, vurguYumusak.z, 0.55f}; r[ImGuiCol_HeaderHovered] = {vurguOrta.x, vurguOrta.y, vurguOrta.z, 0.75f}; r[ImGuiCol_HeaderActive] = {vurguOrta.x, vurguOrta.y, vurguOrta.z, 0.90f}; r[ImGuiCol_Separator] = t.kenar; r[ImGuiCol_SeparatorHovered] = t.vurgu; r[ImGuiCol_SeparatorActive] = t.vurgu; r[ImGuiCol_ResizeGrip] = {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.15f}; r[ImGuiCol_ResizeGripHovered] = {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.5f}; r[ImGuiCol_ResizeGripActive] = t.vurgu; r[ImGuiCol_Tab] = t.panel; r[ImGuiCol_TabHovered] = vurguOrta; r[ImGuiCol_TabSelected] = karisim(t.panel, t.vurgu, 0.35f); r[ImGuiCol_TabDimmed] = t.panel; r[ImGuiCol_TabDimmedSelected] = karisim(t.panel, t.vurgu, 0.18f); r[ImGuiCol_DockingPreview] = {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.4f}; r[ImGuiCol_PlotLines] = t.vurgu; r[ImGuiCol_PlotHistogram] = t.vurgu2; r[ImGuiCol_TableHeaderBg] = t.panel; r[ImGuiCol_TableBorderStrong] = t.kenar; r[ImGuiCol_TableBorderLight] = {t.kenar.x, t.kenar.y, t.kenar.z, t.kenar.w * 0.5f}; r[ImGuiCol_TextSelectedBg] = {t.vurgu.x, t.vurgu.y, t.vurgu.z, 0.30f}; r[ImGuiCol_DragDropTarget] = t.vurgu2; r[ImGuiCol_NavCursor] = t.vurgu; r[ImGuiCol_ModalWindowDimBg] = {0, 0, 0, t.koyu ? 0.5f : 0.3f}; // Ayrı OS pencerelerinde köşe/saydamlık artefaktı olmasın (ImGui önerisi). // ANCAK cam temada pencere zeminini saydam BIRAK: DWM bulanıklık arka planı // gösterir; alpha 1.0 yapılrsa cam etkisi kaybolur. if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable && !t.glass) { stil.WindowRounding = 6.0f; r[ImGuiCol_WindowBg].w = 1.0f; } } bool temaSec(const char* ad) { for (int i = 0; i < temaSayisi(); ++i) if (std::strcmp(g_temalar[i].ad, ad) == 0) { temaUygula(g_temalar[i]); return true; } return false; } float yogunluk() { return g_yogunluk; } void yogunlukAyarla(float carpan) { g_yogunluk = carpan < 0.6f ? 0.6f : (carpan > 1.6f ? 1.6f : carpan); temaUygula(g_aktif); // token'ları yeni ölçekle yeniden döşe } } // namespace fiko::ui