Autosave preferences
This commit is contained in:
20
rsrc/dialogs/pref-autosave.xml
Normal file
20
rsrc/dialogs/pref-autosave.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
||||
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
|
||||
<dialog defbtn='okay'>
|
||||
<pict type='dlog' num='16' top='8' left='8'/>
|
||||
<text size='large' relative='pos pos-in' rel-anchor='prev' top='0' left='4' width='218' height='16'>
|
||||
Autosave Preferences
|
||||
</text>
|
||||
<text name='max-files-head' size='large' relative='pos-in pos' rel-anchor='prev' top='17' left='0'>Max autosave files:</text>
|
||||
<field name='max-files' type='uint' relative='neg-in neg' rel-anchor='prev' top='2' left='5' width='40' height='15'/>
|
||||
<text name='triggers-head' size='large' relative='neg pos' anchor='max-files-head' top='17' left='0' width='260' height='17'>Autosave when:</text>
|
||||
<led name='RestComplete' relative='pos-in pos' anchor='triggers-head' top='4' left='4'>The party finishes resting</led>
|
||||
<led name='Eat' relative='pos-in pos' rel-anchor='prev' top='6' left='0'>The party eats a full meal (while wandering, not resting)</led>
|
||||
<led name='TownWaitComplete' relative='pos-in pos' rel-anchor='prev' top='6' left='0'>The party spends a long time waiting in town/a dungeon</led>
|
||||
<led name='EnterTown' relative='pos-in pos' rel-anchor='prev' top='6' left='0'>The party enters town/a dungeon</led>
|
||||
<led name='ExitTown' relative='pos-in pos' rel-anchor='prev' top='6' left='0'>The party exits town/a dungeon</led>
|
||||
<led name='EndOutdoorCombat' relative='pos-in pos' rel-anchor='prev' top='6' left='0'>The party finishes combat outdoors</led>
|
||||
|
||||
<button name='okay' relative='abs pos' rel-anchor='prev' type='regular' top='7' left='354'>OK</button>
|
||||
<button name='cancel' relative='neg pos-in' anchor='okay' type='regular' def-key='esc' top='0' left='73'>Cancel</button>
|
||||
</dialog>
|
@@ -52,7 +52,11 @@
|
||||
<text name='misc-head' size='large' relative='pos-in pos' anchor='targeting-head' top='60' left='0' width='182' height='17'>Miscellaneous:</text>
|
||||
<led name='nosound' relative='pos-in pos' anchor='misc-head' top='6' left='15'>No Sounds</led>
|
||||
<led name='fancypicker' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Use in-game save file browser</led>
|
||||
<led name='repeatdesc' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Show room descriptions more than once</led>
|
||||
<led name='autosave-toggle' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Autosave</led>
|
||||
<button name='autosave-details' type='tiny' text-size='10' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>
|
||||
Details
|
||||
</button>
|
||||
<led name='repeatdesc' relative='pos-in pos' anchor='autosave-toggle' top='10' left='0'>Show room descriptions more than once</led>
|
||||
<led name='easier' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Make game easier (monsters much weaker)</led>
|
||||
<led name='lesswm' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Fewer wandering monsters</led>
|
||||
<led name='skipsplash' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>Skip splash screen on startup</led>
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include "fileio/fileio.hpp"
|
||||
#include "fileio/resmgr/res_dialog.hpp"
|
||||
#include "fileio/resmgr/res_strings.hpp"
|
||||
#include "dialogxml/widgets/field.hpp"
|
||||
#include "dialogxml/widgets/scrollbar.hpp"
|
||||
#include "dialogxml/widgets/button.hpp"
|
||||
#include "dialogxml/widgets/ledgroup.hpp"
|
||||
@@ -1241,6 +1242,69 @@ void save_prefs(){
|
||||
}
|
||||
}
|
||||
|
||||
void autosave_preferences(cDialog* parent);
|
||||
|
||||
static bool prefs_autosave_event_filter(cDialog& me, std::string id, eKeyMod mod) {
|
||||
if(id == "autosave-toggle"){
|
||||
dynamic_cast<cLed&>(me["autosave-toggle"]).defaultClickHandler(me, id, mod);
|
||||
if(dynamic_cast<cLed&>(me["autosave-toggle"]).getState() != led_off){
|
||||
me["autosave-details"].show();
|
||||
}
|
||||
else{
|
||||
me["autosave-details"].hide();
|
||||
}
|
||||
}else if(id == "autosave-details"){
|
||||
autosave_preferences(&me);
|
||||
}
|
||||
// Messy: Using the same handler for the autosave buttons in the main preferences,
|
||||
// and the buttons in the autosave details window.
|
||||
else{
|
||||
bool did_cancel = false;
|
||||
bool save_ok = false;
|
||||
|
||||
if(id == "okay") {
|
||||
save_ok = me.toast(true);
|
||||
} else if(id == "cancel") {
|
||||
me.toast(false);
|
||||
did_cancel = true;
|
||||
}
|
||||
|
||||
if(!did_cancel && save_ok) {
|
||||
set_pref("Autosave_Max", std::stoi(dynamic_cast<cTextField&>(me["max-files"]).getText()));
|
||||
for(cDialogIterator iter = me.begin(); iter != me.end(); ++iter){
|
||||
std::string id = iter->first;
|
||||
cControl* ctrl = iter->second;
|
||||
cLed* led = dynamic_cast<cLed*>(ctrl);
|
||||
if(led != nullptr){
|
||||
set_pref("Autosave_" + id, led->getState() != led_off);
|
||||
}
|
||||
}
|
||||
save_prefs();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void autosave_preferences(cDialog* parent) {
|
||||
cDialog prefsDlog(*ResMgr::dialogs.get("pref-autosave"), parent);
|
||||
|
||||
int max_autosaves = get_int_pref("Autosave_Max", MAX_AUTOSAVE_DEFAULT);
|
||||
cTextField& max_files = dynamic_cast<cTextField&>(prefsDlog["max-files"]);
|
||||
max_files.setText(std::to_string(max_autosaves));
|
||||
|
||||
for(cDialogIterator iter = prefsDlog.begin(); iter != prefsDlog.end(); ++iter){
|
||||
std::string id = iter->first;
|
||||
cControl* ctrl = iter->second;
|
||||
cLed* led = dynamic_cast<cLed*>(ctrl);
|
||||
if(led != nullptr){
|
||||
led->setState(get_bool_pref("Autosave_" + id, true) ? led_red : led_off);
|
||||
}
|
||||
}
|
||||
prefsDlog.attachClickHandlers(&prefs_autosave_event_filter, {"okay", "cancel"});
|
||||
prefsDlog.run();
|
||||
}
|
||||
|
||||
|
||||
static bool prefs_event_filter (cDialog& me, std::string id, eKeyMod) {
|
||||
bool did_cancel = false;
|
||||
|
||||
@@ -1264,6 +1328,7 @@ static bool prefs_event_filter (cDialog& me, std::string id, eKeyMod) {
|
||||
|
||||
set_pref("DirectionalKeyScrolling", dynamic_cast<cLed&>(me["screen-shift"]).getState() != led_off);
|
||||
set_pref("FancyFilePicker", dynamic_cast<cLed&>(me["fancypicker"]).getState() != led_off);
|
||||
set_pref("Autosave", dynamic_cast<cLed&>(me["autosave-toggle"]).getState() != led_off);
|
||||
set_pref("RepeatRoomDescriptions", dynamic_cast<cLed&>(me["repeatdesc"]).getState() != led_off);
|
||||
set_pref("ShowInstantHelp", dynamic_cast<cLed&>(me["nohelp"]).getState() == led_off);
|
||||
|
||||
@@ -1333,6 +1398,7 @@ void pick_preferences(bool record) {
|
||||
set_cursor(sword_curs);
|
||||
|
||||
cDialog prefsDlog(*ResMgr::dialogs.get("preferences"));
|
||||
prefsDlog.attachClickHandlers(&prefs_autosave_event_filter, {"autosave-toggle", "autosave-details"});
|
||||
prefsDlog.attachClickHandlers(&prefs_event_filter, {"okay", "cancel"});
|
||||
prefsDlog.attachClickHandlers(&reset_help, {"resethelp"});
|
||||
|
||||
@@ -1360,6 +1426,10 @@ void pick_preferences(bool record) {
|
||||
|
||||
dynamic_cast<cLed&>(prefsDlog["nosound"]).setState(get_bool_pref("PlaySounds", true) ? led_off : led_red);
|
||||
dynamic_cast<cLed&>(prefsDlog["fancypicker"]).setState(get_bool_pref("FancyFilePicker", true) ? led_red : led_off);
|
||||
bool autosave_on = get_bool_pref("Autosave", true);
|
||||
dynamic_cast<cLed&>(prefsDlog["autosave-toggle"]).setState(autosave_on ? led_red : led_off);
|
||||
if(!autosave_on)
|
||||
prefsDlog["autosave-details"].hide();
|
||||
dynamic_cast<cLed&>(prefsDlog["repeatdesc"]).setState(get_bool_pref("RepeatRoomDescriptions") ? led_red : led_off);
|
||||
dynamic_cast<cLed&>(prefsDlog["nohelp"]).setState(get_bool_pref("ShowInstantHelp", true) ? led_off : led_red);
|
||||
if(overall_mode == MODE_STARTUP && !party_in_memory) {
|
||||
|
@@ -481,7 +481,6 @@ bool load_scenario_header(fs::path file,scen_header_type& scen_head){
|
||||
return true;
|
||||
}
|
||||
|
||||
const int MAX_AUTOSAVE_DEFAULT = 5;
|
||||
void try_auto_save(std::string reason) {
|
||||
if(!get_bool_pref("Autosave", true)) return;
|
||||
if(!get_bool_pref("Autosave_" + reason, true)) return;
|
||||
|
@@ -19,6 +19,8 @@ const int NUM_ITEM_G = 120;
|
||||
const int NUM_FACE_G = 80;
|
||||
const int NUM_DLOG_G = 28;
|
||||
|
||||
const int MAX_AUTOSAVE_DEFAULT = 5;
|
||||
|
||||
struct scen_header_type{
|
||||
int intro_pic;
|
||||
eContentRating rating;
|
||||
|
Reference in New Issue
Block a user