174 lines
No EOL
5.3 KiB
C++
174 lines
No EOL
5.3 KiB
C++
#include "Gui.hpp"
|
|
|
|
TTF_Font *load_font_from_file(std::string path_to_file)
|
|
{
|
|
TTF_Font *font = TTF_OpenFont(path_to_file.c_str(), 12); // what about memory leaks?
|
|
if (font == nullptr)
|
|
{
|
|
std::cerr << "Failed to load TTF!" << TTF_GetError() << std::endl;
|
|
return font;
|
|
}
|
|
return font;
|
|
}
|
|
|
|
bool TextInfoBox::load_text(std::string text)
|
|
{
|
|
SDL_DestroyTexture(this->texture);
|
|
SDL_Surface *surface = TTF_RenderUTF8_Solid(this->font, text.c_str(), color);
|
|
if (surface == nullptr)
|
|
{
|
|
std::cerr << "Unable to render text to surface! " << TTF_GetError() << std::endl;
|
|
}
|
|
else if (surface->w > this->dimensions.w || surface->h > this->dimensions.h)
|
|
{
|
|
std::cerr << "Overfull TextBox!" << SDL_GetError() << std::endl;
|
|
}
|
|
else
|
|
{
|
|
this->create_texture_from_surface(surface);
|
|
}
|
|
SDL_FreeSurface(surface);
|
|
return (this->texture != nullptr);
|
|
}
|
|
|
|
|
|
bool InfoBox::create_texture_from_surface(SDL_Surface *surface)
|
|
{
|
|
SDL_SetRenderTarget(this->renderer->get_renderer(), this->texture);
|
|
this->texture = SDL_CreateTextureFromSurface(this->renderer->get_renderer(), surface);
|
|
if (this->texture == nullptr)
|
|
{
|
|
std::cerr << "Unable to render texture from surface!" << SDL_GetError() << std::endl;
|
|
}
|
|
SDL_SetRenderTarget(this->renderer->get_renderer(), nullptr); // reset the render target
|
|
return (this->texture != nullptr);
|
|
}
|
|
|
|
bool InfoBox::render(SDL_Renderer *renderer, const SDL_Rect target)
|
|
{
|
|
if (this->visible)
|
|
{
|
|
if (!SDL_RenderCopy(renderer, this->texture, &(this->dimensions), &target))
|
|
{
|
|
std::cerr << "Failed to render TextBox Texture!" << SDL_GetError() << std::endl;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void logSDLError(std::ostream &os, const std::string &msg)
|
|
{
|
|
os << msg << " error:" << SDL_GetError() << std::endl;
|
|
}
|
|
|
|
SDL_Point Window::toggle_fullscreen()
|
|
{
|
|
SDL_DisplayMode dm;
|
|
SDL_GetCurrentDisplayMode(SDL_GetWindowDisplayIndex(this->window), &dm);
|
|
if (!this->fullscreen)
|
|
{
|
|
this->fullscreen = true;
|
|
SDL_SetWindowSize(this->window, dm.w, dm.h);
|
|
SDL_SetWindowFullscreen(this->window, SDL_WINDOW_FULLSCREEN);
|
|
}
|
|
else
|
|
{
|
|
this->fullscreen = false;
|
|
SDL_SetWindowFullscreen(this->window, 0);
|
|
SDL_SetWindowSize(this->window, this->initial_dimensions->w, this->initial_dimensions->h);
|
|
SDL_SetWindowPosition(this->window, this->initial_dimensions->x, this->initial_dimensions->y);
|
|
}
|
|
SDL_Point window_size = {0, 0};
|
|
SDL_GetWindowSize(window, &(window_size.x), &(window_size.y));
|
|
return window_size;
|
|
}
|
|
|
|
bool Window::position_inside_window(SDL_Point position)
|
|
{
|
|
SDL_DisplayMode dm;
|
|
SDL_GetCurrentDisplayMode(SDL_GetWindowDisplayIndex(this->window), &dm);
|
|
return position.x > 0 && position.x < dm.w && position.y > 0 && position.y < dm.h;
|
|
}
|
|
|
|
int Window::get_window_id()
|
|
{
|
|
return SDL_GetWindowID(this->window);
|
|
}
|
|
|
|
void Renderer::set_draw_color(SDL_Color color)
|
|
{
|
|
SDL_SetRenderDrawColor(this->renderer, color.r, color.g, color.b, color.a);
|
|
}
|
|
|
|
void Renderer::clear()
|
|
{
|
|
SDL_RenderClear(this->renderer);
|
|
}
|
|
|
|
void Renderer::present()
|
|
{
|
|
SDL_RenderPresent(this->renderer);
|
|
}
|
|
|
|
void TextInfoBox::handle_event(const SDL_Event *event)
|
|
{
|
|
}
|
|
|
|
void SideBar::handle_event(const SDL_Event *event)
|
|
{
|
|
std::ostringstream output;
|
|
Cluster *cluster = this->field->get_grid()->get_cluster(this->field);
|
|
Resource cluster_resources = this->field->get_grid()->get_resources_of_cluster(cluster);
|
|
Resource field_resources = this->field->get_resources();
|
|
MarkerUpdate *update = (MarkerUpdate *) event->user.data1;
|
|
/* switch (event->type)
|
|
{
|
|
case (BOB_FIELD_UPDATE_EVENT):
|
|
output << this->field->get_owner()->get_name() << std::endl;
|
|
output << "● " << cluster_resources.circle << " (" << field_resources.circle << ")" << std::endl;
|
|
output << "▲ " << cluster_resources.triangle << " (" << field_resources.triangle << ")" << std::endl;
|
|
output << "■ " << cluster_resources.square << " (" << field_resources.square << ")" << std::endl;
|
|
this->field_info->load_text(output.str());
|
|
break;
|
|
case (BOB_UPDATE_MARKER_EVENT):
|
|
this->field = update->field;
|
|
break;
|
|
default:
|
|
break;
|
|
}*/
|
|
}
|
|
|
|
void FieldInfoBox::handle_event(const SDL_Event *event)
|
|
{
|
|
}
|
|
|
|
void ButtonInfoBox::handle_event(const SDL_Event *event)
|
|
{
|
|
switch (event->type)
|
|
{
|
|
case (SDL_MOUSEBUTTONDOWN):
|
|
this->upgrade_box->set_visible(!(this->upgrade_box->get_visible()));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
|
|
void UpgradeInfoBox::handle_event(const SDL_Event *event)
|
|
{
|
|
TextInfoBox::handle_event(event);
|
|
}
|
|
|
|
void SideBar::render(SDL_Renderer *renderer)
|
|
{
|
|
SDL_Rect f_dimensions = this->field_info->get_dimensions();
|
|
this->field_info->render(renderer, {this->dimensions.x, this->dimensions.y, f_dimensions.w, f_dimensions.h});
|
|
for (auto &elem : *upgrades_list)
|
|
{
|
|
f_dimensions = elem->get_dimensions();
|
|
elem->render(renderer, {this->dimensions.x, this->dimensions.y, f_dimensions.w, f_dimensions.h});
|
|
}
|
|
f_dimensions = this->upgrade_info->get_dimensions();
|
|
this->upgrade_info->render(renderer, {this->dimensions.x, this->dimensions.y, f_dimensions.w, f_dimensions.h});
|
|
} |