Skip to content

Commit 9583ae4

Browse files
Merge remote-tracking branch 'upstream/master' into xy-point-extent
2 parents d8647dd + 0382df2 commit 9583ae4

8 files changed

Lines changed: 118 additions & 26 deletions

File tree

CGame.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include "files.h"
1212
#include "globals.h"
1313
#include "s25util/file_handle.h"
14+
#include <libsiedler2/ArchivItem_Ini.h>
15+
#include <libsiedler2/libsiedler2.h>
1416
#include <boost/filesystem.hpp>
1517
#include <boost/nowide/cstdio.hpp>
1618
#include <boost/program_options.hpp>
@@ -156,6 +158,39 @@ void CGame::delMapObj()
156158
MapObj.reset();
157159
}
158160

161+
void CGame::enterEditor(const boost::filesystem::path& filepath)
162+
{
163+
for(auto& menu : Menus)
164+
menu->setWaste();
165+
setMapObj(std::make_unique<CMap>(filepath));
166+
}
167+
168+
void CGame::LoadSettings()
169+
{
170+
const bfs::path settingsPath = RTTRCONFIG.ExpandPath("<RTTR_USERDATA>/s25edit.ini");
171+
libsiedler2::Archiv settings;
172+
if(libsiedler2::Load(settingsPath, settings) != 0)
173+
return;
174+
const auto* ini = dynamic_cast<const libsiedler2::ArchivItem_Ini*>(settings.find("editor"));
175+
if(!ini)
176+
return;
177+
GameResolution.x = ini->getValue("width", static_cast<int>(GameResolution.x));
178+
GameResolution.y = ini->getValue("height", static_cast<int>(GameResolution.y));
179+
fullscreen = ini->getValue("fullscreen", fullscreen);
180+
}
181+
182+
void CGame::SaveSettings() const
183+
{
184+
libsiedler2::Archiv settings;
185+
settings.push(std::make_unique<libsiedler2::ArchivItem_Ini>("editor"));
186+
auto& ini = dynamic_cast<libsiedler2::ArchivItem_Ini&>(*settings.find("editor"));
187+
ini.setValue("width", GameResolution.x);
188+
ini.setValue("height", GameResolution.y);
189+
ini.setValue("fullscreen", static_cast<int>(fullscreen));
190+
const bfs::path settingsPath = RTTRCONFIG.ExpandPath("<RTTR_USERDATA>/s25edit.ini");
191+
libsiedler2::Write(settingsPath, settings);
192+
}
193+
159194
void CGame::GameLoop()
160195
{
161196
for(auto&& callback : Callbacks)
@@ -309,6 +344,7 @@ int main(int argc, char* argv[])
309344
auto s2 = std::make_unique<CGame>(
310345
Extent(programOptions["width"].as<unsigned>(), programOptions["height"].as<unsigned>()),
311346
programOptions["fullscreen"].as<bool>());
347+
s2->LoadSettings();
312348
result = s2->Execute();
313349
} catch(...)
314350
{

CGame.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "CIO/CFont.h"
99
#include "SdlSurface.h"
10+
#include <boost/filesystem/path.hpp>
1011
#include <Point.h>
1112
#include <memory>
1213
#include <vector>
@@ -42,6 +43,7 @@ class CGame
4243
CFont lastFps;
4344

4445
Uint32 lastFrameTime = 0;
46+
unsigned suppressResizeEvents_ = 0;
4547

4648
// structure for mouse cursor
4749
struct
@@ -65,15 +67,20 @@ class CGame
6567
std::unique_ptr<CMap> MapObj;
6668

6769
void SetAppIcon();
70+
void RecreateDisplayResources();
6871

6972
public:
73+
void LoadSettings();
74+
void SaveSettings() const;
75+
7076
CGame(Extent GameResolution_, bool fullscreen_);
7177
~CGame();
7278

7379
int Execute();
7480

7581
bool Init();
7682
bool ReCreateWindow();
83+
void UpdateDisplaySize(const Extent& newSize);
7784

7885
void EventHandling(SDL_Event* Event);
7986

@@ -92,6 +99,7 @@ class CGame
9299
void setMapObj(std::unique_ptr<CMap> MapObj);
93100
CMap* getMapObj();
94101
void delMapObj();
102+
void enterEditor(const boost::filesystem::path& filepath);
95103
SDL_Surface* getDisplaySurface() const { return Surf_Display.get(); };
96104
auto getRes() const { return GameResolution; }
97105
};

CGame_Event.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,14 @@ void CGame::EventHandling(SDL_Event* Event)
6363

6464
switch(Event->key.keysym.sym)
6565
{
66-
case SDLK_F2: fullscreen = !fullscreen; break;
66+
case SDLK_RETURN:
67+
case SDLK_KP_ENTER:
68+
if(Event->key.keysym.mod & KMOD_ALT)
69+
{
70+
fullscreen = !fullscreen;
71+
SaveSettings();
72+
}
73+
break;
6774

6875
#ifdef _ADMINMODE
6976
case SDLK_F3: // if CTRL and ALT are pressed
@@ -377,6 +384,20 @@ void CGame::EventHandling(SDL_Event* Event)
377384
break;
378385
}
379386

387+
case SDL_WINDOWEVENT:
388+
{
389+
if(Event->window.event == SDL_WINDOWEVENT_RESIZED)
390+
{
391+
if(suppressResizeEvents_ > 0)
392+
{
393+
suppressResizeEvents_--;
394+
break; // Skip stale event from our own window recreation
395+
}
396+
UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2));
397+
}
398+
break;
399+
}
400+
380401
case SDL_QUIT: Running = false; break;
381402

382403
default: break;

CGame_Init.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include "CGame.h"
77
#include "CIO/CFile.h"
8+
#include "CIO/CMenu.h"
9+
#include "CIO/CWindow.h"
810
#include "CMap.h"
911
#include "CSurface.h"
1012
#include "SGE/sge_blib.h"
@@ -17,27 +19,44 @@
1719

1820
bool CGame::ReCreateWindow()
1921
{
22+
suppressResizeEvents_ = 3;
2023
displayTexture_.reset();
2124
renderer_.reset();
2225
window_.reset();
2326
window_.reset(SDL_CreateWindow("Return to the Roots Map editor [BETA]", SDL_WINDOWPOS_CENTERED,
2427
SDL_WINDOWPOS_CENTERED, GameResolution.x, GameResolution.y,
25-
fullscreen ? SDL_WINDOW_FULLSCREEN : 0));
28+
fullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE));
2629
if(!window_)
2730
return false;
2831
renderer_.reset(SDL_CreateRenderer(window_.get(), -1, 0));
2932
if(!renderer_)
3033
return false;
31-
displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x,
32-
GameResolution.y);
33-
Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true);
34+
RecreateDisplayResources();
3435
if(!displayTexture_ || !Surf_Display)
3536
return false;
3637

3738
SetAppIcon();
3839
return true;
3940
}
4041

42+
void CGame::RecreateDisplayResources()
43+
{
44+
displayTexture_.reset();
45+
displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x,
46+
GameResolution.y);
47+
Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true);
48+
}
49+
50+
void CGame::UpdateDisplaySize(const Extent& newSize)
51+
{
52+
GameResolution = newSize;
53+
RecreateDisplayResources();
54+
for(auto& menu : Menus)
55+
menu->resetSurface();
56+
for(auto& wnd : Windows)
57+
wnd->resetSurface();
58+
}
59+
4160
bool CGame::Init()
4261
{
4362
std::cout << "Return to the Roots Map editor\n";

CGame_Render.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void CGame::SetAppIcon()
3939

4040
void CGame::Render()
4141
{
42+
suppressResizeEvents_ = 0;
4243
if(Extent(Surf_Display->w, Surf_Display->h) != GameResolution
4344
|| fullscreen != ((SDL_GetWindowFlags(window_.get()) & SDL_WINDOW_FULLSCREEN) != 0))
4445
{

CIO/CControlContainer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ class CControlContainer
6868
}
6969
void setWaste() { waste = true; }
7070
bool isWaste() const { return waste; }
71+
void resetSurface()
72+
{
73+
surface.reset();
74+
needRender = true;
75+
}
7176
// Methods
7277
CButton* addButton(void callback(int), int clickedParam, Position pos = {0, 0}, Extent size = {20, 20},
7378
int color = BUTTON_GREY, const char* text = nullptr, int picture = -1);

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ ELSE()
3838
ENDIF()
3939

4040
add_executable(s25edit ${MAIN_SOURCES} ${CIO_SOURCES} ${icon_RC})
41-
target_link_libraries(s25edit PRIVATE SGE rttrConfig s25Common gamedata endian::static Boost::nowide PUBLIC Boost::disable_autolinking Boost::program_options)
41+
target_link_libraries(s25edit PRIVATE SGE rttrConfig s25Common gamedata siedler2 endian::static Boost::nowide PUBLIC Boost::disable_autolinking Boost::program_options)
4242
target_include_directories(s25edit PRIVATE include)
4343
target_compile_features(s25edit PRIVATE cxx_std_17)
4444

callbacks.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ void callback::mainmenu(int Param)
133133
{
134134
ENDGAME = 1,
135135
STARTEDITOR,
136+
LOADMAP,
136137
OPTIONS
137138
};
138139

@@ -141,11 +142,11 @@ void callback::mainmenu(int Param)
141142
case INITIALIZING_CALL:
142143
MainMenu = global::s2->RegisterMenu(std::make_unique<CMenu>(SPLASHSCREEN_MAINMENU));
143144
MainMenu->addButton(mainmenu, ENDGAME, Position(50, 400), Extent(200, 20), BUTTON_RED1, "Quit program");
145+
MainMenu->addButton(mainmenu, STARTEDITOR, Position(50, 160), Extent(200, 20), BUTTON_RED1, "Start editor");
146+
MainMenu->addButton(mainmenu, LOADMAP, Position(50, 200), Extent(200, 20), BUTTON_GREEN2, "Load map");
144147
#ifdef _ADMINMODE
145-
MainMenu->addButton(submenu1, INITIALIZING_CALL, Position(50, 200), Extent(200, 20), BUTTON_GREY,
146-
"Submenu_1");
148+
MainMenu->addButton(submenu1, INITIALIZING_CALL, Position(50, 240), Extent(200, 20), BUTTON_GREY, "Submenu_1");
147149
#endif
148-
MainMenu->addButton(mainmenu, STARTEDITOR, Position(50, 160), Extent(200, 20), BUTTON_RED1, "Start editor");
149150
MainMenu->addButton(mainmenu, OPTIONS, Position(50, 370), Extent(200, 20), BUTTON_GREEN2, "Options");
150151
break;
151152

@@ -158,14 +159,9 @@ void callback::mainmenu(int Param)
158159
global::s2->Running = false;
159160
break;
160161

161-
case STARTEDITOR:
162-
assert(MainMenu);
163-
PleaseWait(INITIALIZING_CALL);
164-
global::s2->setMapObj(std::make_unique<CMap>(""));
165-
MainMenu->setWaste();
166-
MainMenu = nullptr;
167-
PleaseWait(WINDOW_QUIT_MESSAGE);
168-
break;
162+
case STARTEDITOR: global::s2->enterEditor(""); break;
163+
164+
case LOADMAP: EditorLoadMenu(INITIALIZING_CALL); break;
169165

170166
case OPTIONS:
171167
assert(MainMenu);
@@ -230,7 +226,8 @@ void callback::submenuOptions(int Param)
230226
SELECTBOX_1920_1400,
231227
SELECTBOX_1920_1440,
232228
SELECTBOX_2048_1152,
233-
SELECTBOX_2048_1536
229+
SELECTBOX_2048_1536,
230+
SELECTBOX_3840_2160
234231
};
235232

236233
switch(Param)
@@ -252,9 +249,9 @@ void callback::submenuOptions(int Param)
252249
if(ButtonFullscreen)
253250
SubMenu->delButton(ButtonFullscreen);
254251
ButtonFullscreen =
255-
SubMenu->addButton(submenuOptions, FULLSCREEN, Position(global::s2->GameResolution.x / 2 - 100, 190),
252+
SubMenu->addButton(submenuOptions, FULLSCREEN, Position(global::s2->GameResolution.x / 2 - 100, 410),
256253
Extent(200, 20), BUTTON_RED1, (global::s2->fullscreen ? "WINDOW" : "FULLSCREEN"));
257-
SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Position(0, 120), Extent(200, 110),
254+
SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Position(0, 340), Extent(200, 330),
258255
FontSize::Medium, FontColor::Yellow, BUTTON_GREY);
259256
SelectBoxRes->addOption("800 x 600 (SVGA)", submenuOptions, SELECTBOX_800_600);
260257
SelectBoxRes->addOption("832 x 624 (Half Megapixel)", submenuOptions, SELECTBOX_832_624);
@@ -298,6 +295,7 @@ void callback::submenuOptions(int Param)
298295
SelectBoxRes->addOption("1920 x 1440", submenuOptions, SELECTBOX_1920_1440);
299296
SelectBoxRes->addOption("2048 x 1152 (QWXGA)", submenuOptions, SELECTBOX_2048_1152);
300297
SelectBoxRes->addOption("2048 x 1536 (SUXGA)", submenuOptions, SELECTBOX_2048_1536);
298+
SelectBoxRes->addOption("3840 x 2160 (4K UHD)", submenuOptions, SELECTBOX_3840_2160);
301299
break;
302300

303301
case MAINMENU:
@@ -318,6 +316,7 @@ void callback::submenuOptions(int Param)
318316

319317
case GRAPHICS_CHANGE:
320318
assert(SubMenu);
319+
global::s2->SaveSettings();
321320
SubMenu->setWaste();
322321
TextResolution = nullptr;
323322
ButtonFullscreen = nullptr;
@@ -578,6 +577,12 @@ void callback::submenuOptions(int Param)
578577
submenuOptions(GRAPHICS_CHANGE);
579578
break;
580579

580+
case SELECTBOX_3840_2160:
581+
global::s2->GameResolution.x = 3840;
582+
global::s2->GameResolution.y = 2160;
583+
submenuOptions(GRAPHICS_CHANGE);
584+
break;
585+
581586
default: break;
582587
}
583588
}
@@ -611,7 +616,7 @@ void callback::EditorHelpMenu(int Param)
611616
"..............................F1");
612617
SelectBoxHelp->addOption(
613618
"Window/"
614-
"Fullscreen........................................................................................F2");
619+
"Fullscreen...................................................................................Alt+Enter");
615620
SelectBoxHelp->addOption(
616621
"Zoom in/normal/out......................................................................F5/F6/"
617622
"F7");
@@ -741,7 +746,6 @@ void callback::EditorMainMenu(int Param)
741746
void callback::EditorLoadMenu(int Param)
742747
{
743748
static CWindow* WNDLoad = nullptr;
744-
static CMap* MapObj = nullptr;
745749
static std::string curFilename;
746750

747751
enum
@@ -758,8 +762,6 @@ void callback::EditorLoadMenu(int Param)
758762
break;
759763
WNDLoad = global::s2->RegisterWindow(std::make_unique<CWindow>(
760764
EditorLoadMenu, WINDOWQUIT, WindowPos::Center, Extent(280, 320), "Load", WINDOW_GREEN1, WINDOW_CLOSE));
761-
MapObj = global::s2->getMapObj();
762-
763765
auto* CB_Filename = WNDLoad->addSelectBox(Position(10, 5), Extent(160, 280), FontSize::Medium);
764766
curFilename.clear();
765767
for(const auto& itFile : bfs::directory_iterator(global::userMapsPath))
@@ -799,15 +801,15 @@ void callback::EditorLoadMenu(int Param)
799801
EditorAnimalMenu(MAP_QUIT);
800802
EditorPlayerMenu(MAP_QUIT);
801803

802-
MapObj->destructMap();
803804
bfs::path filepath = global::userMapsPath / curFilename;
804805
if(!filepath.has_extension())
805806
filepath.replace_extension("SWD");
806807
if(!bfs::exists(filepath))
807808
filepath.replace_extension("WLD");
808809
if(!bfs::exists(filepath))
809810
filepath.replace_extension("SWD");
810-
MapObj->constructMap(filepath);
811+
812+
global::s2->enterEditor(filepath);
811813

812814
// we need to check which of these windows was active before
813815
/*

0 commit comments

Comments
 (0)