1 #include "cmdhelp/jukebox.hpp"
2 #include "core/jukebox.hpp"
3 #include "core/settings.hpp"
4 #include "library/settingvar.hpp"
10 settingvar::supervariable
<settingvar::model_bool
<settingvar::yes_no
>> SET_jukebox_dflt_binary(lsnes_setgrp
,
11 "jukebox-default-binary", "Movie‣Saving‣Saveslots binary", true);
12 settingvar::supervariable
<settingvar::model_int
<0,999999999>> SET_jukebox_size(lsnes_setgrp
, "jukebox-size",
13 "Movie‣Number of save slots", 12);
16 struct save_jukebox_listener
: public settingvar::listener
18 save_jukebox_listener(settingvar::group
& _grp
, save_jukebox
& _jukebox
)
19 : grp(_grp
), jukebox(_jukebox
)
21 grp
.add_listener(*this);
23 ~save_jukebox_listener() throw() { grp
.remove_listener(*this); };
24 void on_setting_change(settingvar::group
& _grp
, const settingvar::base
& val
)
26 if(val
.get_iname() == "jukebox-size")
27 jukebox
.set_size((size_t)SET_jukebox_size(_grp
));
30 settingvar::group
& grp
;
31 save_jukebox
& jukebox
;
34 save_jukebox::save_jukebox(settingvar::group
& _settings
, command::group
& _cmd
)
35 : settings(_settings
), cmd(_cmd
),
36 slotsel(cmd
, CJUKEBOX::sel
, [this](const std::string
& a
) { this->do_slotsel(a
); }),
37 cycleprev(cmd
, CJUKEBOX::prev
, [this]() { this->cycle_prev(); }),
38 cyclenext(cmd
, CJUKEBOX::next
, [this]() { this->cycle_next(); })
40 listener
= new save_jukebox_listener(_settings
, *this);
44 save_jukebox::~save_jukebox()
49 size_t save_jukebox::get_slot()
52 throw std::runtime_error("No save slots available");
56 void save_jukebox::set_slot(size_t slot
)
58 if(slot
>= current_size
)
59 throw std::runtime_error("Selected slot out of range");
64 void save_jukebox::cycle_next()
67 throw std::runtime_error("No save slots available");
69 if(current_slot
>= current_size
)
74 void save_jukebox::cycle_prev()
77 throw std::runtime_error("No save slots available");
81 current_slot
= current_size
- 1;
85 bool save_jukebox::save_binary()
87 return SET_jukebox_dflt_binary(settings
);
90 std::string
save_jukebox::get_slot_name()
92 return (stringfmt() << "$SLOT:" << (get_slot() + 1)).str();
95 void save_jukebox::set_size(size_t size
)
98 if(current_slot
>= current_size
)
103 void save_jukebox::set_update(std::function
<void()> _update
)
108 void save_jukebox::unset_update()
110 update
= std::function
<void()>();
113 void save_jukebox::do_slotsel(const std::string
& args
)
115 if(!regex_match("[1-9][0-9]{0,8}", args
))
116 throw std::runtime_error("Bad slot number");
117 uint32_t slot
= parse_value
<uint32_t>(args
);