Lua: Fix type confusion between signed and unsigned
[lsnes.git] / src / core / jukebox.cpp
blobc2084d7a0e8c1480045363cdae2bbd23254c28e3
1 #include "cmdhelp/jukebox.hpp"
2 #include "core/jukebox.hpp"
3 #include "core/settings.hpp"
4 #include "library/settingvar.hpp"
6 #include <stdexcept>
8 namespace
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));
29 private:
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);
41 current_slot = 0;
44 save_jukebox::~save_jukebox()
46 delete listener;
49 size_t save_jukebox::get_slot()
51 if(!current_size)
52 throw std::runtime_error("No save slots available");
53 return current_slot;
56 void save_jukebox::set_slot(size_t slot)
58 if(slot >= current_size)
59 throw std::runtime_error("Selected slot out of range");
60 current_slot = slot;
61 if(update) update();
64 void save_jukebox::cycle_next()
66 if(!current_size)
67 throw std::runtime_error("No save slots available");
68 current_slot++;
69 if(current_slot >= current_size)
70 current_slot = 0;
71 if(update) update();
74 void save_jukebox::cycle_prev()
76 if(!current_size)
77 throw std::runtime_error("No save slots available");
78 if(current_slot)
79 current_slot--;
80 else
81 current_slot = current_size - 1;
82 if(update) update();
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)
97 current_size = size;
98 if(current_slot >= current_size)
99 current_slot = 0;
100 if(update) update();
103 void save_jukebox::set_update(std::function<void()> _update)
105 update = _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);
118 set_slot(slot - 1);