#include "BrushesPanel.h" #include #include "../ManagementContext/StyleManagmentContext.h" #include "../Tools/Tool.h" void BrushesPanel::OnActivate() { state = OPEN; } void BrushesPanel::OnDeactivate() { state = CLOSED; } void BrushesPanel::OnRender() { if (!state) { return; } Tool* activeTool = Tool::GetActive(); if (!activeTool->UseBrushlist()) { return; } const Brush* activeBrush = activeTool->GetActiveBrush(); if (activeTool && activeTool->RequestBrushlistRefresh) { brushes.clear(); brushes = activeTool->Brushes; activeTool->RequestBrushlistRefresh = false; RenderPreviews(); } const ImGuiViewport* viewport = ImGui::GetMainViewport(); ImVec2 work_pos = viewport->WorkPos; ImVec2 work_size = viewport->WorkSize; ImVec2 window_pos; window_pos.x = work_pos.x + (work_size.x / 2); window_pos.y = work_pos.y + work_size.y - 64; if (state != DETACHED) { ImGui::SetNextWindowPos(window_pos, 0, ImVec2(0.5f, 1.0f)); } ImGui::SetNextWindowSizeConstraints(ImVec2(352, 512), ImVec2(FLT_MAX, FLT_MAX)); if (!beginCustomWindow("Brushes")) { return; } ImGui::PushItemWidth(-FLT_MIN); StyleManagmentContext::Push(BRUSHLIST); if (brushes.size() > 0 && ImGui::BeginListBox("##BrushListBox", ImVec2(brushes.front()->Preview->GetWidth(), -FLT_MIN))) { static bool usingScrollbar = (int)brushes.size() > 512 / brushes.front()->Preview->GetHeight(); for (Brush* brush : brushes) { char stringBuffers[3][50]; std::snprintf(stringBuffers[0], sizeof(stringBuffers[0]), "%s", brush->Name.c_str()); std::snprintf(stringBuffers[1], sizeof(stringBuffers[1]), "%.1f", brush->Size); std::snprintf(stringBuffers[2], sizeof(stringBuffers[2]), "##%p", (void*)brush); if (brush->IsPreviewDirty()) { brush->GeneratePreview(); } Texture* preview = brush->Preview; ImVec2 initialPos = ImGui::GetCursorScreenPos(); ImGui::SetCursorScreenPos(initialPos); if (activeBrush && ImGui::Selectable(stringBuffers[2], brush == activeBrush ? true : false, 0, ImVec2(preview->GetWidth(), preview->GetHeight()))) { activeTool->SetActiveBrush(brush); brush->GeneratePreview(); } ImGui::SetCursorScreenPos(ImVec2(initialPos.x, initialPos.y)); ImGui::Image(preview->Get(), ImVec2(preview->GetWidth(), preview->GetHeight())); /*ImGui::SetCursorScreenPos(ImVec2(initialPos.x + preview->GetWidth() - ImGui::CalcTextSize(" Edit ").x - 4.0f - (usingScrollbar ? 12.0f : 0.0f), initialPos.y + preview->GetHeight() - 24.0f)); ImGui::PushID(brush); ImGui::Button(" Edit "); ImGui::PopID();*/ ImGui::SetCursorScreenPos(ImVec2(initialPos.x + 4.0f, initialPos.y + preview->GetHeight() - 24.0f)); ImGui::Text("%s", stringBuffers[0]); ImGui::SetCursorScreenPos(ImVec2(initialPos.x + preview->GetWidth() - ImGui::CalcTextSize(stringBuffers[1]).x - 4.0f - (usingScrollbar ? 12.0f : 0.0f), initialPos.y + 4.0f)); ImGui::Text("%s", stringBuffers[1]); ImGui::SetCursorScreenPos(ImVec2(initialPos.x, initialPos.y + preview->GetHeight())); } ImGui::EndListBox(); } StyleManagmentContext::Pop(); ImGui::PopItemWidth(); endCustomWindow(); } void BrushesPanel::RenderPreviews() { for (Brush* brush : brushes) { brush->GeneratePreview(); } }