Add <functional> to files that use std::function
[lsnes.git] / src / core / jukebox.cpp
blob78e4226a5e23d85423bb2effdcd7260552ab521a
1 #include "cmdhelp/jukebox.hpp"
2 #include "core/jukebox.hpp"
3 #include "core/settings.hpp"
4 #include "library/settingvar.hpp"
6 #include <functional>
7 #include <stdexcept>
9 namespace
11 settingvar::supervariable<settingvar::model_bool<settingvar::yes_no>> SET_jukebox_dflt_binary(lsnes_setgrp,
12 "jukebox-default-binary", "Movie‣Saving‣Saveslots binary", true);
13 settingvar::supervariable<settingvar::model_int<0,999999999>> SET_jukebox_size(lsnes_setgrp, "jukebox-size",
14 "Movie‣Number of save slots", 12);
17 struct save_jukebox_listener : public settingvar::listener
19 save_jukebox_listener(settingvar::group& _grp, save_jukebox& _jukebox)
20 : grp(_grp), jukebox(_jukebox)
22 grp.add_listener(*this);
24 ~save_jukebox_listener() throw() { grp.remove_listener(*this); };
25 void on_setting_change(settingvar::group& _grp, const settingvar::base& val)
27 if(val.get_iname() == "jukebox-size")
28 jukebox.set_size((size_t)SET_jukebox_size(_grp));
30 private:
31 settingvar::group& grp;
32 save_jukebox& jukebox;
35 save_jukebox::save_jukebox(settingvar::group& _settings, command::group& _cmd)
36 : settings(_settings), cmd(_cmd),
37 slotsel(cmd, CJUKEBOX::sel, [this](const std::string& a) { this->do_slotsel(a); }),
38 cycleprev(cmd, CJUKEBOX::prev, [this]() { this->cycle_prev(); }),
39 cyclenext(cmd, CJUKEBOX::next, [this]() { this->cycle_next(); })
41 listener = new save_jukebox_listener(_settings, *this);
42 current_slot = 0;
45 save_jukebox::~save_jukebox()
47 delete listener;
50 size_t save_jukebox::get_slot()
52 if(!current_size)
53 throw std::runtime_error("No save slots available");
54 return current_slot;
57 void save_jukebox::set_slot(size_t slot)
59 if(slot >= current_size)
60 throw std::runtime_error("Selected slot out of range");
61 current_slot = slot;
62 if(update) update();
65 void save_jukebox::cycle_next()
67 if(!current_size)
68 throw std::runtime_error("No save slots available");
69 current_slot++;
70 if(current_slot >= current_size)
71 current_slot = 0;
72 if(update) update();
75 void save_jukebox::cycle_prev()
77 if(!current_size)
78 throw std::runtime_error("No save slots available");
79 if(current_slot)
80 current_slot--;
81 else
82 current_slot = current_size - 1;
83 if(update) update();
86 bool save_jukebox::save_binary()
88 return SET_jukebox_dflt_binary(settings);
91 std::string save_jukebox::get_slot_name()
93 return (stringfmt() << "$SLOT:" << (get_slot() + 1)).str();
96 void save_jukebox::set_size(size_t size)
98 current_size = size;
99 if(current_slot >= current_size)
100 current_slot = 0;
101 if(update) update();
104 void save_jukebox::set_update(std::function<void()> _update)
106 update = _update;
109 void save_jukebox::unset_update()
111 update = std::function<void()>();
114 void save_jukebox::do_slotsel(const std::string& args)
116 if(!regex_match("[1-9][0-9]{0,8}", args))
117 throw std::runtime_error("Bad slot number");
118 uint32_t slot = parse_value<uint32_t>(args);
119 set_slot(slot - 1);