git repos / blockattack-game

blame: source/code/MenuSystem.cpp

normal view · raw

f3ef3495 sago007 2008-11-13 20:00 1
/*
c53e6443 sago007 2012-04-17 11:04 2
===========================================================================
c53e6443 sago007 2012-04-17 11:04 3
blockattack - Block Attack - Rise of the Blocks
c53e6443 sago007 2012-04-17 11:04 4
Copyright (C) 2005-2012 Poul Sander
c53e6443 sago007 2012-04-17 11:04 5
c53e6443 sago007 2012-04-17 11:04 6
This program is free software: you can redistribute it and/or modify
c53e6443 sago007 2012-04-17 11:04 7
it under the terms of the GNU General Public License as published by
c53e6443 sago007 2012-04-17 11:04 8
the Free Software Foundation, either version 2 of the License, or
c53e6443 sago007 2012-04-17 11:04 9
(at your option) any later version.
c53e6443 sago007 2012-04-17 11:04 10
c53e6443 sago007 2012-04-17 11:04 11
This program is distributed in the hope that it will be useful,
c53e6443 sago007 2012-04-17 11:04 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
c53e6443 sago007 2012-04-17 11:04 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c53e6443 sago007 2012-04-17 11:04 14
GNU General Public License for more details.
c53e6443 sago007 2012-04-17 11:04 15
c53e6443 sago007 2012-04-17 11:04 16
You should have received a copy of the GNU General Public License
c53e6443 sago007 2012-04-17 11:04 17
along with this program.  If not, see http://www.gnu.org/licenses/
c53e6443 sago007 2012-04-17 11:04 18
c53e6443 sago007 2012-04-17 11:04 19
Source information and contacts persons can be found at
f6d8a699 sago007 2018-10-07 12:16 20
https://blockattack.net
c53e6443 sago007 2012-04-17 11:04 21
===========================================================================
f3ef3495 sago007 2008-11-13 20:00 22
*/
f3ef3495 sago007 2008-11-13 20:00 23
b7590374 sago007 2011-05-19 16:15 24
be3946f1 Poul Sander 2024-05-13 21:14 25
#include "BlockGame.hpp"
f3ef3495 sago007 2008-11-13 20:00 26
#include "MenuSystem.h"
f3ef3495 sago007 2008-11-13 20:00 27
#include "common.h"
7d604e02 sago007 2015-11-29 18:39 28
#include "global.hpp"
a077dceb sago007 2016-03-19 19:19 29
#include "gamecontroller.h"
e35cd386 Poul Sander 2023-11-29 20:33 30
#include "menudef_themes.hpp"
f3ef3495 sago007 2008-11-13 20:00 31
20d77c6e sago007 2016-11-12 16:28 32
static int oldmousex = 0;
20d77c6e sago007 2016-11-12 16:28 33
static int oldmousey = 0;
f3ef3495 sago007 2008-11-13 20:00 34
094b2dfe sago007 2016-06-12 10:50 35
void ButtonGfx::setSurfaces() {
72383a9e sago007 2016-10-30 11:56 36
	this->xsize = globalData.spriteHolder->GetSprite(menu_marked).GetWidth();
72383a9e sago007 2016-10-30 11:56 37
	this->ysize = globalData.spriteHolder->GetSprite(menu_marked).GetHeight();
72383a9e sago007 2016-10-30 11:56 38
	if (globalData.verboseLevel) {
f6d8a699 sago007 2018-10-07 12:16 39
		std::cout << "Surfaces set, size: " << this->xsize << " , " << this->ysize << "\n";
acd79baf sago007 2015-11-22 19:37 40
	}
f3ef3495 sago007 2008-11-13 20:00 41
}
f3ef3495 sago007 2008-11-13 20:00 42
60b2bac0 Poul Sander 2023-11-10 20:43 43
sago::SagoTextField* ButtonGfx::getLabel(const std::string& text, bool marked) const {
342ea507 Poul Sander 2023-07-27 20:38 44
	if (!marked) {
342ea507 Poul Sander 2023-07-27 20:38 45
		const auto& theLabel = labels.find(text);
342ea507 Poul Sander 2023-07-27 20:38 46
		if (theLabel != labels.end()) {
342ea507 Poul Sander 2023-07-27 20:38 47
			return labels[text].get();
342ea507 Poul Sander 2023-07-27 20:38 48
		}
342ea507 Poul Sander 2023-07-27 20:38 49
	}
747473d1 Poul Sander 2023-11-12 16:02 50
	else {
747473d1 Poul Sander 2023-11-12 16:02 51
		const auto& theLabel = labels_marked.find(text);
747473d1 Poul Sander 2023-11-12 16:02 52
		if (theLabel != labels_marked.end()) {
747473d1 Poul Sander 2023-11-12 16:02 53
			return labels_marked[text].get();
747473d1 Poul Sander 2023-11-12 16:02 54
		}
d91e7363 sago007 2018-03-26 13:09 55
	}
9f7a6344 sago007 2018-03-30 12:05 56
	std::shared_ptr<sago::SagoTextField> newField = std::make_shared<sago::SagoTextField>();
d91e7363 sago007 2018-03-26 13:09 57
	newField->SetHolder(&globalData.spriteHolder->GetDataHolder());
d91e7363 sago007 2018-03-26 13:09 58
	newField->SetFont("freeserif");
36bbe751 sago007 2018-03-26 17:27 59
	newField->SetFontSize(30);
d8fe60bd sago007 2018-04-02 16:15 60
	newField->SetOutline(1, {64,64,64,255});
342ea507 Poul Sander 2023-07-27 20:38 61
	if (marked) {
342ea507 Poul Sander 2023-07-27 20:38 62
		newField->SetOutline(3, {32,32,32,255});
342ea507 Poul Sander 2023-07-27 20:38 63
	}
0b8fb137 sago007 2018-03-31 19:53 64
	newField->SetText(text);
342ea507 Poul Sander 2023-07-27 20:38 65
	if (!marked) {
342ea507 Poul Sander 2023-07-27 20:38 66
		labels[text] = newField;
342ea507 Poul Sander 2023-07-27 20:38 67
		return labels[text].get();
342ea507 Poul Sander 2023-07-27 20:38 68
	}
342ea507 Poul Sander 2023-07-27 20:38 69
	labels_marked[text] = newField;
342ea507 Poul Sander 2023-07-27 20:38 70
	return labels_marked[text].get();
d91e7363 sago007 2018-03-26 13:09 71
}
d91e7363 sago007 2018-03-26 13:09 72
5f8ce673 Poul Sander 2021-06-05 22:18 73
Button::Button(const Button& b) : action{b.action}, popOnRun{b.popOnRun}, label{b.label}, marked{b.marked} {
5db03af6 Poul Sander 2018-11-07 19:39 74
}
5db03af6 Poul Sander 2018-11-07 19:39 75
5db03af6 Poul Sander 2018-11-07 19:39 76
Button& Button::operator=(const Button& other) {
5db03af6 Poul Sander 2018-11-07 19:39 77
	action = other.action;
5db03af6 Poul Sander 2018-11-07 19:39 78
	label = other.label;
5db03af6 Poul Sander 2018-11-07 19:39 79
	marked = other.marked;
5f8ce673 Poul Sander 2021-06-05 22:18 80
	popOnRun = other.popOnRun;
5db03af6 Poul Sander 2018-11-07 19:39 81
	return *this;
f3ef3495 sago007 2008-11-13 20:00 82
}
f3ef3495 sago007 2008-11-13 20:00 83
f6d8a699 sago007 2018-10-07 12:16 84
void Button::setLabel(const std::string& text) {
c53e6443 sago007 2012-04-17 11:04 85
	label = text;
60b2bac0 Poul Sander 2023-11-10 20:43 86
	standardButton.setSurfaces();
f3ef3495 sago007 2008-11-13 20:00 87
}
f3ef3495 sago007 2008-11-13 20:00 88
29edda2d sago007 2016-10-08 18:06 89
void Button::setAction(void (*action2run)(void)) {
c53e6443 sago007 2012-04-17 11:04 90
	action = action2run;
f3ef3495 sago007 2008-11-13 20:00 91
}
f3ef3495 sago007 2008-11-13 20:00 92
ecef5838 sago007 2015-11-24 20:01 93
void Button::doAction() {
6258a442 sago007 2015-11-14 22:11 94
	if (action) {
29edda2d sago007 2016-10-08 18:06 95
		action();
6258a442 sago007 2015-11-14 22:11 96
		return;
6258a442 sago007 2015-11-14 22:11 97
	}
f6d8a699 sago007 2018-10-07 12:16 98
	std::cerr << "Warning: button \"" << label << "\" has no action assigned!";
f3ef3495 sago007 2008-11-13 20:00 99
}
f3ef3495 sago007 2008-11-13 20:00 100
ecef5838 sago007 2015-11-24 20:01 101
void Button::setPopOnRun(bool popOnRun) {
67a32395 sago007 2012-04-19 18:40 102
	this->popOnRun = popOnRun;
67a32395 sago007 2012-04-19 18:40 103
}
67a32395 sago007 2012-04-19 18:40 104
ecef5838 sago007 2015-11-24 20:01 105
bool Button::isPopOnRun() const {
67a32395 sago007 2012-04-19 18:40 106
	return popOnRun;
67a32395 sago007 2012-04-19 18:40 107
}
67a32395 sago007 2012-04-19 18:40 108
092bdebe sago007 2017-03-19 14:39 109
static void drawToScreen(const Button& b) {
c0a3362c sago007 2016-10-07 20:23 110
	if (b.marked) {
62b87fe3 Poul Sander 2025-03-04 20:16 111
		globalData.spriteHolder->GetSprite(b.standardButton.menu_marked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y, &globalData.logicalResize);
c0a3362c sago007 2016-10-07 20:23 112
	}
c0a3362c sago007 2016-10-07 20:23 113
	else {
62b87fe3 Poul Sander 2025-03-04 20:16 114
		globalData.spriteHolder->GetSprite(b.standardButton.menu_unmarked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y, &globalData.logicalResize);
c0a3362c sago007 2016-10-07 20:23 115
	}
092bdebe sago007 2017-03-19 14:39 116
60b2bac0 Poul Sander 2023-11-10 20:43 117
	b.standardButton.getLabel(b.getLabel(), b.marked)->Draw(globalData.screen, b.x+b.standardButton.xsize/2,b.y+b.standardButton.ysize/2,
62b87fe3 Poul Sander 2025-03-04 20:16 118
	        sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center, &globalData.logicalResize);
1b710a1e sago007 2016-09-28 19:01 119
}
1b710a1e sago007 2016-09-28 19:01 120
517ed886 Poul Sander 2025-12-14 14:38 121
void Button::drawToScreen(SDL_Renderer* target) const {
517ed886 Poul Sander 2025-12-14 14:38 122
	::drawToScreen(*this);
517ed886 Poul Sander 2025-12-14 14:38 123
}
517ed886 Poul Sander 2025-12-14 14:38 124
517ed886 Poul Sander 2025-12-14 14:38 125
void ButtonWithAdjustment::drawToScreen(SDL_Renderer* target) const {
517ed886 Poul Sander 2025-12-14 14:38 126
	// Draw the main button
517ed886 Poul Sander 2025-12-14 14:38 127
	if (marked) {
517ed886 Poul Sander 2025-12-14 14:38 128
		globalData.spriteHolder->GetSprite(standardButton.menu_marked).Draw(globalData.screen, SDL_GetTicks(), x, y, &globalData.logicalResize);
517ed886 Poul Sander 2025-12-14 14:38 129
	}
517ed886 Poul Sander 2025-12-14 14:38 130
	else {
517ed886 Poul Sander 2025-12-14 14:38 131
		globalData.spriteHolder->GetSprite(standardButton.menu_unmarked).Draw(globalData.screen, SDL_GetTicks(), x, y, &globalData.logicalResize);
517ed886 Poul Sander 2025-12-14 14:38 132
	}
517ed886 Poul Sander 2025-12-14 14:38 133
517ed886 Poul Sander 2025-12-14 14:38 134
	standardButton.getLabel(getLabel(), marked)->Draw(globalData.screen, x+standardButton.xsize/2, y+standardButton.ysize/2,
517ed886 Poul Sander 2025-12-14 14:38 135
	        sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center, &globalData.logicalResize);
517ed886 Poul Sander 2025-12-14 14:38 136
517ed886 Poul Sander 2025-12-14 14:38 137
	// Draw left adjustment button (down arrow)
517ed886 Poul Sander 2025-12-14 14:38 138
	int adjustSize = getAdjustButtonSize();
517ed886 Poul Sander 2025-12-14 14:38 139
	int leftX = x - adjustSize - 10;
c4ae70b7 Poul Sander 2025-12-14 15:05 140
	int leftY = y;
c4ae70b7 Poul Sander 2025-12-14 15:05 141
	Uint32 currentTime = SDL_GetTicks();
c4ae70b7 Poul Sander 2025-12-14 15:05 142
	bool leftMarked = (currentTime - leftButtonMarkTime) < MARK_DURATION;
c4ae70b7 Poul Sander 2025-12-14 15:05 143
	if (leftMarked) {
c4ae70b7 Poul Sander 2025-12-14 15:05 144
		globalData.spriteHolder->GetSprite("menu_marked").DrawScaled(globalData.screen, SDL_GetTicks(), leftX, leftY, adjustSize, adjustSize, &globalData.logicalResize);
c4ae70b7 Poul Sander 2025-12-14 15:05 145
	}
c4ae70b7 Poul Sander 2025-12-14 15:05 146
	else {
c4ae70b7 Poul Sander 2025-12-14 15:05 147
		globalData.spriteHolder->GetSprite("menu_unmarked").DrawScaled(globalData.screen, SDL_GetTicks(), leftX, leftY, adjustSize, adjustSize, &globalData.logicalResize);
c4ae70b7 Poul Sander 2025-12-14 15:05 148
	}
c4ae70b7 Poul Sander 2025-12-14 15:05 149
	standardButton.getLabel("\u25c0", leftMarked)->Draw(globalData.screen, leftX+adjustSize/2, leftY+adjustSize/2,
517ed886 Poul Sander 2025-12-14 14:38 150
	        sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center, &globalData.logicalResize);
517ed886 Poul Sander 2025-12-14 14:38 151
517ed886 Poul Sander 2025-12-14 14:38 152
	// Draw right adjustment button (up arrow)
517ed886 Poul Sander 2025-12-14 14:38 153
	int rightX = x + standardButton.xsize + 10;
c4ae70b7 Poul Sander 2025-12-14 15:05 154
	int rightY = y;
c4ae70b7 Poul Sander 2025-12-14 15:05 155
	bool rightMarked = (currentTime - rightButtonMarkTime) < MARK_DURATION;
c4ae70b7 Poul Sander 2025-12-14 15:05 156
	if (rightMarked) {
c4ae70b7 Poul Sander 2025-12-14 15:05 157
		globalData.spriteHolder->GetSprite("menu_marked").DrawScaled(globalData.screen, SDL_GetTicks(), rightX, rightY, adjustSize, adjustSize, &globalData.logicalResize);
c4ae70b7 Poul Sander 2025-12-14 15:05 158
	}
c4ae70b7 Poul Sander 2025-12-14 15:05 159
	else {
c4ae70b7 Poul Sander 2025-12-14 15:05 160
		globalData.spriteHolder->GetSprite("menu_unmarked").DrawScaled(globalData.screen, SDL_GetTicks(), rightX, rightY, adjustSize, adjustSize, &globalData.logicalResize);
c4ae70b7 Poul Sander 2025-12-14 15:05 161
	}
c4ae70b7 Poul Sander 2025-12-14 15:05 162
	standardButton.getLabel("\u25b6", rightMarked)->Draw(globalData.screen, rightX+adjustSize/2, rightY+adjustSize/2,
517ed886 Poul Sander 2025-12-14 14:38 163
	        sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center, &globalData.logicalResize);
517ed886 Poul Sander 2025-12-14 14:38 164
}
517ed886 Poul Sander 2025-12-14 14:38 165
517ed886 Poul Sander 2025-12-14 14:38 166
bool ButtonWithAdjustment::isClickedAdjustLeft(int mx, int my) const {
517ed886 Poul Sander 2025-12-14 14:38 167
	int adjustSize = getAdjustButtonSize();
517ed886 Poul Sander 2025-12-14 14:38 168
	int leftX = x - adjustSize - 10;
c4ae70b7 Poul Sander 2025-12-14 15:05 169
	int leftY = y;
517ed886 Poul Sander 2025-12-14 14:38 170
	if (mx >= leftX && my >= leftY && mx <= leftX + adjustSize && my <= leftY + adjustSize) {
517ed886 Poul Sander 2025-12-14 14:38 171
		return true;
517ed886 Poul Sander 2025-12-14 14:38 172
	}
517ed886 Poul Sander 2025-12-14 14:38 173
	return false;
517ed886 Poul Sander 2025-12-14 14:38 174
}
517ed886 Poul Sander 2025-12-14 14:38 175
517ed886 Poul Sander 2025-12-14 14:38 176
bool ButtonWithAdjustment::isClickedAdjustRight(int mx, int my) const {
517ed886 Poul Sander 2025-12-14 14:38 177
	int adjustSize = getAdjustButtonSize();
517ed886 Poul Sander 2025-12-14 14:38 178
	int rightX = x + standardButton.xsize + 10;
c4ae70b7 Poul Sander 2025-12-14 15:05 179
	int rightY = y;
517ed886 Poul Sander 2025-12-14 14:38 180
	if (mx >= rightX && my >= rightY && mx <= rightX + adjustSize && my <= rightY + adjustSize) {
517ed886 Poul Sander 2025-12-14 14:38 181
		return true;
517ed886 Poul Sander 2025-12-14 14:38 182
	}
517ed886 Poul Sander 2025-12-14 14:38 183
	return false;
517ed886 Poul Sander 2025-12-14 14:38 184
}
517ed886 Poul Sander 2025-12-14 14:38 185
7b384c3f sago007 2016-10-08 17:34 186
092bdebe sago007 2017-03-19 14:39 187
static bool isClicked(const Button& b, int x,int y) {
60b2bac0 Poul Sander 2023-11-10 20:43 188
	if ( x >= b.x && y >= b.y && x<= b.x+b.standardButton.xsize && y <= b.y + b.standardButton.ysize) {
7b384c3f sago007 2016-10-08 17:34 189
		return true;
7b384c3f sago007 2016-10-08 17:34 190
	}
7b384c3f sago007 2016-10-08 17:34 191
	return false;
7b384c3f sago007 2016-10-08 17:34 192
}
7b384c3f sago007 2016-10-08 17:34 193
95ab6b0d sago007 2016-11-12 16:11 194
void Menu::drawSelf(SDL_Renderer* target) {
95ab6b0d sago007 2016-11-12 16:11 195
	DrawBackground(target);
a1e83d35 sago007 2016-10-08 17:29 196
	for (const Button* b : buttons) {
517ed886 Poul Sander 2025-12-14 14:38 197
		b->drawToScreen(target);
6258a442 sago007 2015-11-14 22:11 198
	}
517ed886 Poul Sander 2025-12-14 14:38 199
	exit.drawToScreen(target);
62b87fe3 Poul Sander 2025-03-04 20:16 200
	exit.standardButton.getLabel(title, false)->Draw(target, 50, 50, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
f3ef3495 sago007 2008-11-13 20:00 201
}
f3ef3495 sago007 2008-11-13 20:00 202
f3ef3495 sago007 2008-11-13 20:00 203
ecef5838 sago007 2015-11-24 20:01 204
void Menu::placeButtons() {
c53e6443 sago007 2012-04-17 11:04 205
	int nextY = 100;
1b710a1e sago007 2016-09-28 19:01 206
	int X = 50;
1b710a1e sago007 2016-09-28 19:01 207
	for (Button* it : buttons) {
517ed886 Poul Sander 2025-12-14 14:38 208
		// For all buttons, center based on the main button width to keep them aligned
517ed886 Poul Sander 2025-12-14 14:38 209
		int centerX = (globalData.xsize - it->standardButton.xsize)/2;
517ed886 Poul Sander 2025-12-14 14:38 210
		it->x = centerX;
1b710a1e sago007 2016-09-28 19:01 211
		it->y = nextY;
60b2bac0 Poul Sander 2023-11-10 20:43 212
		nextY += it->standardButton.ysize+10;
517ed886 Poul Sander 2025-12-14 14:38 213
		X = it->x;
c53e6443 sago007 2012-04-17 11:04 214
	}
c53e6443 sago007 2012-04-17 11:04 215
	exit.x = X;
c53e6443 sago007 2012-04-17 11:04 216
	exit.y = nextY;
f3ef3495 sago007 2008-11-13 20:00 217
}
f3ef3495 sago007 2008-11-13 20:00 218
ecef5838 sago007 2015-11-24 20:01 219
void Menu::addButton(Button* b) {
c53e6443 sago007 2012-04-17 11:04 220
	buttons.push_back(b);
c53e6443 sago007 2012-04-17 11:04 221
	b->marked = false;
c53e6443 sago007 2012-04-17 11:04 222
	placeButtons();
f3ef3495 sago007 2008-11-13 20:00 223
}
f3ef3495 sago007 2008-11-13 20:00 224
ddceb7e8 Poul Sander 2023-10-18 11:02 225
Menu::Menu(SDL_Renderer* screen) {
ddceb7e8 Poul Sander 2023-10-18 11:02 226
	buttons = std::vector<Button*>(10);
ddceb7e8 Poul Sander 2023-10-18 11:02 227
	isSubmenu = true;
ddceb7e8 Poul Sander 2023-10-18 11:02 228
	this->screen = screen;
c53e6443 sago007 2012-04-17 11:04 229
	exit.setLabel( _("Back") );
f3ef3495 sago007 2008-11-13 20:00 230
}
f3ef3495 sago007 2008-11-13 20:00 231
ddceb7e8 Poul Sander 2023-10-18 11:02 232
Menu::Menu(SDL_Renderer* screen,bool submenu) {
ddceb7e8 Poul Sander 2023-10-18 11:02 233
	buttons = std::vector<Button*>(0);
ddceb7e8 Poul Sander 2023-10-18 11:02 234
	isSubmenu = submenu;
ddceb7e8 Poul Sander 2023-10-18 11:02 235
	this->screen = screen;
ecef5838 sago007 2015-11-24 20:01 236
	if (isSubmenu) {
c53e6443 sago007 2012-04-17 11:04 237
		exit.setLabel( _("Back") );
acd79baf sago007 2015-11-22 19:37 238
	}
acd79baf sago007 2015-11-22 19:37 239
	else {
c53e6443 sago007 2012-04-17 11:04 240
		exit.setLabel( _("Exit") );
acd79baf sago007 2015-11-22 19:37 241
	}
f3ef3495 sago007 2008-11-13 20:00 242
}
f3ef3495 sago007 2008-11-13 20:00 243
ddceb7e8 Poul Sander 2023-10-18 11:02 244
Menu::Menu(SDL_Renderer* screen, const std::string& title, bool submenu) {
ddceb7e8 Poul Sander 2023-10-18 11:02 245
	buttons = std::vector<Button*>(0);
ddceb7e8 Poul Sander 2023-10-18 11:02 246
	isSubmenu = submenu;
ddceb7e8 Poul Sander 2023-10-18 11:02 247
	this->screen = screen;
ddceb7e8 Poul Sander 2023-10-18 11:02 248
	this->title = title;
ecef5838 sago007 2015-11-24 20:01 249
	if (isSubmenu) {
c53e6443 sago007 2012-04-17 11:04 250
		exit.setLabel(_("Back") );
acd79baf sago007 2015-11-22 19:37 251
	}
acd79baf sago007 2015-11-22 19:37 252
	else {
c53e6443 sago007 2012-04-17 11:04 253
		exit.setLabel(_("Exit") );
acd79baf sago007 2015-11-22 19:37 254
	}
cc3ef158 sago007 2011-07-03 16:13 255
}
cc3ef158 sago007 2011-07-03 16:13 256
826cf176 sago007 2016-03-12 10:53 257
bool isUpEvent(const SDL_Event& event) {
826cf176 sago007 2016-03-12 10:53 258
	if ( event.type == SDL_KEYDOWN ) {
826cf176 sago007 2016-03-12 10:53 259
		if (event.key.keysym.sym == SDLK_UP) {
826cf176 sago007 2016-03-12 10:53 260
			return true;
826cf176 sago007 2016-03-12 10:53 261
		}
826cf176 sago007 2016-03-12 10:53 262
	}
016b3bf0 Poul Sander 2023-11-15 17:58 263
	return GameControllerIsUpEvent(event);
826cf176 sago007 2016-03-12 10:53 264
}
826cf176 sago007 2016-03-12 10:53 265
d5efd7d1 sago007 2016-03-12 11:32 266
bool isDownEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 267
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 268
		if (event.key.keysym.sym == SDLK_DOWN) {
d5efd7d1 sago007 2016-03-12 11:32 269
			return true;
d5efd7d1 sago007 2016-03-12 11:32 270
		}
d5efd7d1 sago007 2016-03-12 11:32 271
	}
016b3bf0 Poul Sander 2023-11-15 17:58 272
	return GameControllerIsDownEvent(event);
d21782d4 sago007 2016-03-13 11:17 273
}
d21782d4 sago007 2016-03-13 11:17 274
d21782d4 sago007 2016-03-13 11:17 275
bool isLeftEvent(const SDL_Event& event) {
d21782d4 sago007 2016-03-13 11:17 276
	if ( event.type == SDL_KEYDOWN ) {
d21782d4 sago007 2016-03-13 11:17 277
		if (event.key.keysym.sym == SDLK_LEFT) {
d21782d4 sago007 2016-03-13 11:17 278
			return true;
d21782d4 sago007 2016-03-13 11:17 279
		}
d21782d4 sago007 2016-03-13 11:17 280
	}
016b3bf0 Poul Sander 2023-11-15 17:58 281
	return GameControllerIsLeftEvent(event);
d21782d4 sago007 2016-03-13 11:17 282
}
d21782d4 sago007 2016-03-13 11:17 283
d21782d4 sago007 2016-03-13 11:17 284
bool isRightEvent(const SDL_Event& event) {
d21782d4 sago007 2016-03-13 11:17 285
	if ( event.type == SDL_KEYDOWN ) {
877b7c65 sago007 2016-04-09 09:32 286
		if (event.key.keysym.sym == SDLK_RIGHT) {
d21782d4 sago007 2016-03-13 11:17 287
			return true;
d21782d4 sago007 2016-03-13 11:17 288
		}
d21782d4 sago007 2016-03-13 11:17 289
	}
016b3bf0 Poul Sander 2023-11-15 17:58 290
	return GameControllerIsRightEvent(event);
d5efd7d1 sago007 2016-03-12 11:32 291
}
d5efd7d1 sago007 2016-03-12 11:32 292
d5efd7d1 sago007 2016-03-12 11:32 293
bool isEscapeEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 294
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 295
		if ( event.key.keysym.sym == SDLK_ESCAPE ) {
d5efd7d1 sago007 2016-03-12 11:32 296
			return true;
d5efd7d1 sago007 2016-03-12 11:32 297
		}
d5efd7d1 sago007 2016-03-12 11:32 298
	}
d5efd7d1 sago007 2016-03-12 11:32 299
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
c257f027 Poul Sander 2020-08-08 16:29 300
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_B || event.cbutton.button == SDL_CONTROLLER_BUTTON_BACK ) {
d5efd7d1 sago007 2016-03-12 11:32 301
			return true;
d5efd7d1 sago007 2016-03-12 11:32 302
		}
d5efd7d1 sago007 2016-03-12 11:32 303
	}
d5efd7d1 sago007 2016-03-12 11:32 304
	return false;
d5efd7d1 sago007 2016-03-12 11:32 305
}
d5efd7d1 sago007 2016-03-12 11:32 306
d5efd7d1 sago007 2016-03-12 11:32 307
bool isConfirmEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 308
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 309
		if (event.key.keysym.sym == SDLK_RETURN || event.key.keysym.sym == SDLK_KP_ENTER ) {
d5efd7d1 sago007 2016-03-12 11:32 310
			return true;
d5efd7d1 sago007 2016-03-12 11:32 311
		}
d5efd7d1 sago007 2016-03-12 11:32 312
	}
d5efd7d1 sago007 2016-03-12 11:32 313
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
c257f027 Poul Sander 2020-08-08 16:29 314
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_A ) {
d5efd7d1 sago007 2016-03-12 11:32 315
			return true;
d5efd7d1 sago007 2016-03-12 11:32 316
		}
d5efd7d1 sago007 2016-03-12 11:32 317
	}
d5efd7d1 sago007 2016-03-12 11:32 318
	return false;
d5efd7d1 sago007 2016-03-12 11:32 319
}
d5efd7d1 sago007 2016-03-12 11:32 320
00e866da sago007 2016-10-31 20:47 321
00e866da sago007 2016-10-31 20:47 322
bool Menu::IsActive() {
00e866da sago007 2016-10-31 20:47 323
	return running;
00e866da sago007 2016-10-31 20:47 324
}
00e866da sago007 2016-10-31 20:47 325
void Menu::Draw(SDL_Renderer* target) {
00e866da sago007 2016-10-31 20:47 326
	placeButtons();
95ab6b0d sago007 2016-11-12 16:11 327
	drawSelf(target);
a44568bd sago007 2018-03-26 11:13 328
#if DEBUG
a44568bd sago007 2018-03-26 11:13 329
	static unsigned long int Frames;
a44568bd sago007 2018-03-26 11:13 330
	static unsigned long int Ticks;
a44568bd sago007 2018-03-26 11:13 331
	static char FPS[10];
e7e189c7 sago007 2018-03-31 15:30 332
	static sago::SagoTextField fpsField;
e7e189c7 sago007 2018-03-31 15:30 333
	sagoTextSetBlueFont(fpsField);
a44568bd sago007 2018-03-26 11:13 334
	Frames++;
a44568bd sago007 2018-03-26 11:13 335
	if (SDL_GetTicks() >= Ticks + 1000) {
a44568bd sago007 2018-03-26 11:13 336
		if (Frames > 999) {
a44568bd sago007 2018-03-26 11:13 337
			Frames=999;
a44568bd sago007 2018-03-26 11:13 338
		}
a44568bd sago007 2018-03-26 11:13 339
		snprintf(FPS, sizeof(FPS), "%lu fps", Frames);
a44568bd sago007 2018-03-26 11:13 340
		Frames = 0;
a44568bd sago007 2018-03-26 11:13 341
		Ticks = SDL_GetTicks();
a44568bd sago007 2018-03-26 11:13 342
	}
e7e189c7 sago007 2018-03-31 15:30 343
	fpsField.SetText(FPS);
d066ac27 Poul Sander 2025-07-19 13:18 344
	fpsField.Draw(globalData.screen, globalData.xsize - 4, 4, sago::SagoTextField::Alignment::right, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a44568bd sago007 2018-03-26 11:13 345
#endif
00e866da sago007 2016-10-31 20:47 346
}
092bdebe sago007 2017-03-19 14:39 347
void Menu::ProcessInput(const SDL_Event& event, bool& processed) {
016b3bf0 Poul Sander 2023-11-15 17:58 348
	if (GameControllerIsConnectionEvent(event)) {
409492c9 sago007 2020-06-27 22:22 349
		UnInitGameControllers();
409492c9 sago007 2020-06-27 22:22 350
		InitGameControllers();
409492c9 sago007 2020-06-27 22:22 351
		processed = true;
409492c9 sago007 2020-06-27 22:22 352
	}
409492c9 sago007 2020-06-27 22:22 353
00e866da sago007 2016-10-31 20:47 354
	if (isUpEvent(event)) {
00e866da sago007 2016-10-31 20:47 355
		marked--;
00e866da sago007 2016-10-31 20:47 356
		if (marked<0) {
00e866da sago007 2016-10-31 20:47 357
			marked = buttons.size();    //not -1, since exit is after the last element in the list
00e866da sago007 2016-10-31 20:47 358
		}
c79aae93 sago007 2016-12-23 16:55 359
		processed = true;
00e866da sago007 2016-10-31 20:47 360
	}
00e866da sago007 2016-10-31 20:47 361
00e866da sago007 2016-10-31 20:47 362
	if (isDownEvent(event)) {
00e866da sago007 2016-10-31 20:47 363
		marked++;
00e866da sago007 2016-10-31 20:47 364
		if (marked> (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 365
			marked = 0;
00e866da sago007 2016-10-31 20:47 366
		}
c79aae93 sago007 2016-12-23 16:55 367
		processed = true;
00e866da sago007 2016-10-31 20:47 368
	}
00e866da sago007 2016-10-31 20:47 369
517ed886 Poul Sander 2025-12-14 14:38 370
	if (isLeftEvent(event)) {
517ed886 Poul Sander 2025-12-14 14:38 371
		if (marked < (int)buttons.size()) {
517ed886 Poul Sander 2025-12-14 14:38 372
			buttons.at(marked)->doLeft();
517ed886 Poul Sander 2025-12-14 14:38 373
		}
517ed886 Poul Sander 2025-12-14 14:38 374
		processed = true;
517ed886 Poul Sander 2025-12-14 14:38 375
	}
517ed886 Poul Sander 2025-12-14 14:38 376
517ed886 Poul Sander 2025-12-14 14:38 377
	if (isRightEvent(event)) {
517ed886 Poul Sander 2025-12-14 14:38 378
		if (marked < (int)buttons.size()) {
517ed886 Poul Sander 2025-12-14 14:38 379
			buttons.at(marked)->doRight();
517ed886 Poul Sander 2025-12-14 14:38 380
		}
517ed886 Poul Sander 2025-12-14 14:38 381
		processed = true;
517ed886 Poul Sander 2025-12-14 14:38 382
	}
517ed886 Poul Sander 2025-12-14 14:38 383
00e866da sago007 2016-10-31 20:47 384
	if (isEscapeEvent(event) && isSubmenu) {
00e866da sago007 2016-10-31 20:47 385
		running = false;
c79aae93 sago007 2016-12-23 16:55 386
		processed = true;
00e866da sago007 2016-10-31 20:47 387
	}
00e866da sago007 2016-10-31 20:47 388
00e866da sago007 2016-10-31 20:47 389
	if (isConfirmEvent(event)) {
8283ed72 Poul Sander 2019-05-08 16:15 390
		bMouseUp = false;
00e866da sago007 2016-10-31 20:47 391
		if (marked < (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 392
			buttons.at(marked)->doAction();
00e866da sago007 2016-10-31 20:47 393
			if (buttons.at(marked)->isPopOnRun()) {
00e866da sago007 2016-10-31 20:47 394
				running = false;
00e866da sago007 2016-10-31 20:47 395
			}
00e866da sago007 2016-10-31 20:47 396
		}
00e866da sago007 2016-10-31 20:47 397
		if (marked == (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 398
			running = false;
00e866da sago007 2016-10-31 20:47 399
		}
c79aae93 sago007 2016-12-23 16:55 400
		processed = true;
00e866da sago007 2016-10-31 20:47 401
	}
00e866da sago007 2016-10-31 20:47 402
}
00e866da sago007 2016-10-31 20:47 403
50fd2c5f sago007 2016-11-12 16:05 404
void Menu::Update() {
50fd2c5f sago007 2016-11-12 16:05 405
	for (int i=0; i<(int)buttons.size(); i++) {
50fd2c5f sago007 2016-11-12 16:05 406
		buttons.at(i)->marked = (i == marked);
50fd2c5f sago007 2016-11-12 16:05 407
	}
50fd2c5f sago007 2016-11-12 16:05 408
	exit.marked = (marked == (int)buttons.size());
50fd2c5f sago007 2016-11-12 16:05 409
	Uint8 buttonState = SDL_GetMouseState(nullptr,nullptr);
50fd2c5f sago007 2016-11-12 16:05 410
	// If the mouse button is released, make bMouseUp equal true
50fd2c5f sago007 2016-11-12 16:05 411
	if ( (buttonState&SDL_BUTTON(1))==0) {
50fd2c5f sago007 2016-11-12 16:05 412
		bMouseUp=true;
50fd2c5f sago007 2016-11-12 16:05 413
	}
62b87fe3 Poul Sander 2025-03-04 20:16 414
	int mousex = globalData.mousex;
62b87fe3 Poul Sander 2025-03-04 20:16 415
	int mousey = globalData.mousey;
62b87fe3 Poul Sander 2025-03-04 20:16 416
	globalData.logicalResize.PhysicalToLogical(globalData.mousex, globalData.mousey, mousex, mousey);
c7f2082f sago007 2016-03-13 11:48 417
62b87fe3 Poul Sander 2025-03-04 20:16 418
	if (abs(mousex-oldmousex)>5 || abs(mousey-oldmousey)>5) {
50fd2c5f sago007 2016-11-12 16:05 419
		for (int i=0; i< (int)buttons.size(); ++i) {
62b87fe3 Poul Sander 2025-03-04 20:16 420
			if (isClicked(*buttons.at(i), mousex, mousey)) {
50fd2c5f sago007 2016-11-12 16:05 421
				marked = i;
d5efd7d1 sago007 2016-03-12 11:32 422
			}
50fd2c5f sago007 2016-11-12 16:05 423
		}
62b87fe3 Poul Sander 2025-03-04 20:16 424
		if (isClicked(exit, mousex, mousey)) {
50fd2c5f sago007 2016-11-12 16:05 425
			marked = buttons.size();
50fd2c5f sago007 2016-11-12 16:05 426
		}
62b87fe3 Poul Sander 2025-03-04 20:16 427
		oldmousex = mousex;
62b87fe3 Poul Sander 2025-03-04 20:16 428
		oldmousey = mousey;
50fd2c5f sago007 2016-11-12 16:05 429
	}
c7f2082f sago007 2016-03-13 11:48 430
50fd2c5f sago007 2016-11-12 16:05 431
	//mouse clicked
50fd2c5f sago007 2016-11-12 16:05 432
	if ( (buttonState&SDL_BUTTON(1) )==SDL_BUTTON(1) && bMouseUp) {
50fd2c5f sago007 2016-11-12 16:05 433
		bMouseUp = false;
50fd2c5f sago007 2016-11-12 16:05 434
		for (int i=0; i< (int)buttons.size(); ++i) {
517ed886 Poul Sander 2025-12-14 14:38 435
			// Check for adjustment button clicks first
517ed886 Poul Sander 2025-12-14 14:38 436
			if (buttons.at(i)->isClickedAdjustLeft(mousex, mousey)) {
517ed886 Poul Sander 2025-12-14 14:38 437
				buttons.at(i)->doLeft();
517ed886 Poul Sander 2025-12-14 14:38 438
				return;
517ed886 Poul Sander 2025-12-14 14:38 439
			}
517ed886 Poul Sander 2025-12-14 14:38 440
			if (buttons.at(i)->isClickedAdjustRight(mousex, mousey)) {
517ed886 Poul Sander 2025-12-14 14:38 441
				buttons.at(i)->doRight();
517ed886 Poul Sander 2025-12-14 14:38 442
				return;
517ed886 Poul Sander 2025-12-14 14:38 443
			}
517ed886 Poul Sander 2025-12-14 14:38 444
			// Then check for main button click
62b87fe3 Poul Sander 2025-03-04 20:16 445
			if (isClicked(*buttons.at(i), mousex, mousey)) {
50fd2c5f sago007 2016-11-12 16:05 446
				buttons.at(i)->doAction();
50fd2c5f sago007 2016-11-12 16:05 447
				if (buttons.at(i)->isPopOnRun()) {
d5efd7d1 sago007 2016-03-12 11:32 448
					running = false;
d5efd7d1 sago007 2016-03-12 11:32 449
				}
4dbeef9f sago007 2018-04-14 10:48 450
				//Quit here to ensure that we do not continue checking buttons after we have done the action.
4dbeef9f sago007 2018-04-14 10:48 451
				return;
826cf176 sago007 2016-03-12 10:53 452
			}
c53e6443 sago007 2012-04-17 11:04 453
		}
62b87fe3 Poul Sander 2025-03-04 20:16 454
		if (isClicked(exit,  mousex, mousey)) {
50fd2c5f sago007 2016-11-12 16:05 455
			running = false;
c53e6443 sago007 2012-04-17 11:04 456
		}
50fd2c5f sago007 2016-11-12 16:05 457
	}
50fd2c5f sago007 2016-11-12 16:05 458
}
c53e6443 sago007 2012-04-17 11:04 459
1970-01-01 00:00 460