Skip to content

Commit fc01c45

Browse files
Merge remote-tracking branch 'upstream/master' into resize-window
2 parents d5b08a6 + 9800519 commit fc01c45

8 files changed

Lines changed: 100 additions & 10 deletions

File tree

CGame.cpp

Lines changed: 29 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,32 @@ void CGame::delMapObj()
156158
MapObj.reset();
157159
}
158160

161+
void CGame::LoadSettings()
162+
{
163+
const bfs::path settingsPath = RTTRCONFIG.ExpandPath("<RTTR_USERDATA>/s25edit.ini");
164+
libsiedler2::Archiv settings;
165+
if(libsiedler2::Load(settingsPath, settings) != 0)
166+
return;
167+
const auto* ini = dynamic_cast<const libsiedler2::ArchivItem_Ini*>(settings.find("editor"));
168+
if(!ini)
169+
return;
170+
GameResolution.x = ini->getValue("width", static_cast<int>(GameResolution.x));
171+
GameResolution.y = ini->getValue("height", static_cast<int>(GameResolution.y));
172+
fullscreen = ini->getValue("fullscreen", fullscreen);
173+
}
174+
175+
void CGame::SaveSettings() const
176+
{
177+
libsiedler2::Archiv settings;
178+
settings.push(std::make_unique<libsiedler2::ArchivItem_Ini>("editor"));
179+
auto& ini = dynamic_cast<libsiedler2::ArchivItem_Ini&>(*settings.find("editor"));
180+
ini.setValue("width", GameResolution.x);
181+
ini.setValue("height", GameResolution.y);
182+
ini.setValue("fullscreen", static_cast<int>(fullscreen));
183+
const bfs::path settingsPath = RTTRCONFIG.ExpandPath("<RTTR_USERDATA>/s25edit.ini");
184+
libsiedler2::Write(settingsPath, settings);
185+
}
186+
159187
void CGame::GameLoop()
160188
{
161189
for(auto&& callback : Callbacks)
@@ -309,6 +337,7 @@ int main(int argc, char* argv[])
309337
auto s2 = std::make_unique<CGame>(
310338
Extent(programOptions["width"].as<unsigned>(), programOptions["height"].as<unsigned>()),
311339
programOptions["fullscreen"].as<bool>());
340+
s2->LoadSettings();
312341
result = s2->Execute();
313342
} catch(...)
314343
{

CGame.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class CGame
4242
CFont lastFps;
4343

4444
Uint32 lastFrameTime = 0;
45+
unsigned suppressResizeEvents_ = 0;
4546

4647
// structure for mouse cursor
4748
struct
@@ -65,15 +66,20 @@ class CGame
6566
std::unique_ptr<CMap> MapObj;
6667

6768
void SetAppIcon();
69+
void RecreateDisplayResources();
6870

6971
public:
72+
void LoadSettings();
73+
void SaveSettings() const;
74+
7075
CGame(Extent GameResolution_, bool fullscreen_);
7176
~CGame();
7277

7378
int Execute();
7479

7580
bool Init();
7681
bool ReCreateWindow();
82+
void UpdateDisplaySize(const Extent& newSize);
7783

7884
void EventHandling(SDL_Event* Event);
7985

CGame_Event.cpp

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

9999
switch(Event->key.keysym.sym)
100100
{
101-
case SDLK_F2: fullscreen = !fullscreen; break;
101+
case SDLK_RETURN:
102+
case SDLK_KP_ENTER:
103+
if(Event->key.keysym.mod & KMOD_ALT)
104+
{
105+
fullscreen = !fullscreen;
106+
SaveSettings();
107+
}
108+
break;
102109

103110
#ifdef _ADMINMODE
104111
case SDLK_F3: // if CTRL and ALT are pressed
@@ -408,6 +415,20 @@ void CGame::EventHandling(SDL_Event* Event)
408415
break;
409416
}
410417

418+
case SDL_WINDOWEVENT:
419+
{
420+
if(Event->window.event == SDL_WINDOWEVENT_RESIZED)
421+
{
422+
if(suppressResizeEvents_ > 0)
423+
{
424+
suppressResizeEvents_--;
425+
break; // Skip stale event from our own window recreation
426+
}
427+
UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2));
428+
}
429+
break;
430+
}
431+
411432
case SDL_QUIT: Running = false; break;
412433

413434
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, Uint16 x = 0, Uint16 y = 0, Uint16 w = 20, Uint16 h = 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: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ void callback::submenuOptions(int Param)
229229
SELECTBOX_1920_1400,
230230
SELECTBOX_1920_1440,
231231
SELECTBOX_2048_1152,
232-
SELECTBOX_2048_1536
232+
SELECTBOX_2048_1536,
233+
SELECTBOX_3840_2160
233234
};
234235

235236
switch(Param)
@@ -251,9 +252,9 @@ void callback::submenuOptions(int Param)
251252
if(ButtonFullscreen)
252253
SubMenu->delButton(ButtonFullscreen);
253254
ButtonFullscreen =
254-
SubMenu->addButton(submenuOptions, FULLSCREEN, (int)(global::s2->GameResolution.x / 2 - 100), 190, 200,
255+
SubMenu->addButton(submenuOptions, FULLSCREEN, (int)(global::s2->GameResolution.x / 2 - 100), 410, 200,
255256
20, BUTTON_RED1, (global::s2->fullscreen ? "WINDOW" : "FULLSCREEN"));
256-
SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Point16(0, 120), Extent16(200, 110),
257+
SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Point16(0, 340), Extent16(200, 330),
257258
FontSize::Medium, FontColor::Yellow, BUTTON_GREY);
258259
SelectBoxRes->addOption("800 x 600 (SVGA)", submenuOptions, SELECTBOX_800_600);
259260
SelectBoxRes->addOption("832 x 624 (Half Megapixel)", submenuOptions, SELECTBOX_832_624);
@@ -297,6 +298,7 @@ void callback::submenuOptions(int Param)
297298
SelectBoxRes->addOption("1920 x 1440", submenuOptions, SELECTBOX_1920_1440);
298299
SelectBoxRes->addOption("2048 x 1152 (QWXGA)", submenuOptions, SELECTBOX_2048_1152);
299300
SelectBoxRes->addOption("2048 x 1536 (SUXGA)", submenuOptions, SELECTBOX_2048_1536);
301+
SelectBoxRes->addOption("3840 x 2160 (4K UHD)", submenuOptions, SELECTBOX_3840_2160);
300302
break;
301303

302304
case MAINMENU:
@@ -317,6 +319,7 @@ void callback::submenuOptions(int Param)
317319

318320
case GRAPHICS_CHANGE:
319321
assert(SubMenu);
322+
global::s2->SaveSettings();
320323
SubMenu->setWaste();
321324
TextResolution = nullptr;
322325
ButtonFullscreen = nullptr;
@@ -577,6 +580,12 @@ void callback::submenuOptions(int Param)
577580
submenuOptions(GRAPHICS_CHANGE);
578581
break;
579582

583+
case SELECTBOX_3840_2160:
584+
global::s2->GameResolution.x = 3840;
585+
global::s2->GameResolution.y = 2160;
586+
submenuOptions(GRAPHICS_CHANGE);
587+
break;
588+
580589
default: break;
581590
}
582591
}
@@ -611,7 +620,7 @@ void callback::EditorHelpMenu(int Param)
611620
"..............................F1");
612621
SelectBoxHelp->addOption(
613622
"Window/"
614-
"Fullscreen........................................................................................F2");
623+
"Fullscreen...................................................................................Alt+Enter");
615624
SelectBoxHelp->addOption(
616625
"Zoom in/normal/out......................................................................F5/F6/"
617626
"F7");

0 commit comments

Comments
 (0)