From 8a7d87a312b3dc42877577e99533c96d48714368 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 13 Mar 2021 13:10:47 -0500 Subject: Added sliders to the settings menu #7 --- src/renderer.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/renderer.cpp') diff --git a/src/renderer.cpp b/src/renderer.cpp index f7644ca..b28e3cb 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1,4 +1,5 @@ #include "renderer.h" +#include #include #include "consts.h" #include "game.h" @@ -570,11 +571,33 @@ void Renderer::renderMenu(Game& game, const Menu& menu) { SDL_RenderFillRect(ren_.get(), nullptr); const int lineHeight = 16; + const int sliderBarWidth = 9; int totalHeight = menu.getItems().size() * lineHeight; std::vector positions; + std::deque sliderText; + int maxSliderLineWidth = 0; + int sliderAlignX = 0; + // First, find all of the sliders so we can figure out how to align them. + for (const MenuItem& menuItem : menu.getItems()) { + if (menuItem.type == MenuType::Slider) { + MessageCache output; + renderMessageLine(output, menuItem.text, game); + + int width = output.charIndexToWidth.back() + sliderBarWidth * menuItem.maxValue; + if (width > maxSliderLineWidth) { + maxSliderLineWidth = width; + sliderAlignX = (CANVAS_WIDTH - maxSliderLineWidth) / 2 + output.charIndexToWidth.back(); + } + + sliderText.push_back(std::move(output)); + } + } + + // Now, render all of the items. int index = 0; for (const MenuItem& menuItem : menu.getItems()) { + int lineY = (CANVAS_HEIGHT - totalHeight) / 2 + lineHeight * index; switch (menuItem.type) { case MenuType::Command: { MessageCache output; @@ -582,7 +605,24 @@ void Renderer::renderMenu(Game& game, const Menu& menu) { SDL_Rect dest { (CANVAS_WIDTH - output.charIndexToWidth.back()) / 2, - (CANVAS_HEIGHT - totalHeight) / 2 + lineHeight * index, + lineY, + MESSAGE_TEXT_WIDTH, + game.getFont().getCharacterHeight() + }; + + SDL_SetRenderTarget(ren_.get(), menuTex_.get()); + SDL_RenderCopy(ren_.get(), output.renderedTex.get(), nullptr, &dest); + + positions.emplace_back(dest.x, dest.y); + + break; + } + case MenuType::Slider: { + MessageCache& output = sliderText.front(); + + SDL_Rect dest { + sliderAlignX - output.charIndexToWidth.back(), + lineY, MESSAGE_TEXT_WIDTH, game.getFont().getCharacterHeight() }; @@ -592,6 +632,19 @@ void Renderer::renderMenu(Game& game, const Menu& menu) { positions.emplace_back(dest.x, dest.y); + for (int j = 0; j < menuItem.maxValue; j++) { + int boxTexId = menuItem.value > j ? loadImageFromFile("../res/slider_on.png") : loadImageFromFile("../res/slider_off.png"); + const SDL_Rect boxDest { + sliderAlignX + j * sliderBarWidth, + lineY + 2, + 8, + 8 }; + SDL_SetRenderTarget(ren_.get(), menuTex_.get()); + SDL_RenderCopy(ren_.get(), textures_.at(boxTexId).get(), nullptr, &boxDest); + } + + sliderText.pop_front(); + break; } } -- cgit 1.4.1