1 #include "core/advdumper.hpp"
2 #include "core/command.hpp"
3 #include "core/dispatch.hpp"
4 #include "core/instance.hpp"
5 #include "core/moviedata.hpp"
6 #include "core/project.hpp"
7 #include "core/queue.hpp"
8 #include "core/rom.hpp"
9 #include "core/ui-services.hpp"
10 #include "library/keyboard.hpp"
14 void fill_namemap(project_info
& p
, uint64_t id
, std::map
<uint64_t, std::string
>& namemap
,
15 std::map
<uint64_t, std::set
<uint64_t>>& childmap
)
17 namemap
[id
] = p
.get_branch_name(id
);
18 auto s
= p
.branch_children(id
);
20 fill_namemap(p
, i
, namemap
, childmap
);
24 void update_dumperinfo(emulator_instance
& inst
, std::map
<std::string
, dumper_information_1
>& new_dumpers
,
25 dumper_factory_base
* d
)
27 struct dumper_information_1 inf
;
30 std::set
<std::string
> mset
= d
->list_submodes();
32 inf
.modes
[i
] = d
->modename(i
);
33 inf
.active
= inst
.mdumper
->busy(d
);
34 new_dumpers
[d
->id()] = inf
;
38 void do_flush_slotinfo();
40 void UI_get_branch_map(emulator_instance
& inst
, uint64_t& cur
, std::map
<uint64_t, std::string
>& namemap
,
41 std::map
<uint64_t, std::set
<uint64_t>>& childmap
)
43 auto project
= inst
.project
;
44 inst
.iqueue
->run([project
, &cur
, &namemap
, &childmap
]() {
45 auto p
= project
->get();
47 fill_namemap(*p
, 0, namemap
, childmap
);
48 cur
= p
->get_current_branch();
52 void UI_call_flush(emulator_instance
& inst
, std::function
<void(std::exception
&)> onerror
)
54 auto project
= inst
.project
;
55 inst
.iqueue
->run_async([project
]() {
56 auto p
= project
->get();
61 void UI_create_branch(emulator_instance
& inst
, uint64_t id
, const std::string
& name
,
62 std::function
<void(std::exception
&)> onerror
)
64 auto project
= inst
.project
;
65 inst
.iqueue
->run_async([project
, id
, name
]() {
66 auto p
= project
->get();
68 p
->create_branch(id
, name
);
73 void UI_rename_branch(emulator_instance
& inst
, uint64_t id
, const std::string
& name
,
74 std::function
<void(std::exception
&)> onerror
)
76 auto project
= inst
.project
;
77 auto supdater
= inst
.supdater
;
78 inst
.iqueue
->run_async([project
, supdater
, id
, name
]() {
79 auto p
= project
->get();
81 p
->set_branch_name(id
, name
);
87 void UI_reparent_branch(emulator_instance
& inst
, uint64_t id
, uint64_t pid
,
88 std::function
<void(std::exception
&)> onerror
)
90 auto project
= inst
.project
;
91 auto supdater
= inst
.supdater
;
92 inst
.iqueue
->run_async([project
, supdater
, id
, pid
]() {
93 auto p
= project
->get();
95 p
->set_parent_branch(id
, pid
);
101 void UI_delete_branch(emulator_instance
& inst
, uint64_t id
, std::function
<void(std::exception
&)> onerror
)
103 auto project
= inst
.project
;
104 inst
.iqueue
->run_async([project
, id
]() {
105 auto p
= project
->get();
107 p
->delete_branch(id
);
112 void UI_switch_branch(emulator_instance
& inst
, uint64_t id
, std::function
<void(std::exception
&)> onerror
)
114 auto project
= inst
.project
;
115 auto supdater
= inst
.supdater
;
116 inst
.iqueue
->run_async([project
, supdater
, id
]() {
117 auto p
= project
->get();
119 p
->set_current_branch(id
);
125 project_author_info
UI_load_author_info(emulator_instance
& inst
)
127 project_author_info x
;
128 inst
.iqueue
->run([&inst
, &x
]() {
129 project_info
* proj
= inst
.project
->get();
130 x
.is_project
= (proj
!= NULL
);
131 x
.autorunlua
= false;
133 x
.projectname
= proj
->name
;
134 x
.directory
= proj
->directory
;
135 x
.prefix
= proj
->prefix
;
136 x
.luascripts
= proj
->luascripts
;
137 x
.gamename
= proj
->gamename
;
138 for(auto i
: proj
->authors
)
139 x
.authors
.push_back(i
);
141 x
.prefix
= get_mprefix_for_project();
142 x
.gamename
= inst
.mlogic
->get_mfile().gamename
;
143 for(auto i
: inst
.mlogic
->get_mfile().authors
)
144 x
.authors
.push_back(i
);
150 void UI_save_author_info(emulator_instance
& inst
, project_author_info
& info
)
152 inst
.iqueue
->run([&inst
, info
]() {
153 project_info
* proj
= inst
.project
->get();
154 std::set
<std::string
> oldscripts
;
155 std::vector
<std::pair
<std::string
, std::string
>> _authors(info
.authors
.begin(), info
.authors
.end());
157 for(auto i
: proj
->luascripts
)
158 oldscripts
.insert(i
);
159 proj
->gamename
= info
.gamename
;
160 proj
->authors
= _authors
;
161 proj
->prefix
= info
.prefix
;
162 proj
->directory
= info
.directory
;
163 proj
->name
= info
.projectname
;
164 proj
->luascripts
= info
.luascripts
;
166 //For save status to immediately update.
168 inst
.supdater
->update();
169 inst
.dispatch
->title_change();
171 inst
.mlogic
->get_mfile().gamename
= info
.gamename
;
172 inst
.mlogic
->get_mfile().authors
= _authors
;
173 set_mprefix_for_project(info
.prefix
);
175 if(proj
&& info
.autorunlua
)
176 for(auto i
: info
.luascripts
)
177 if(!oldscripts
.count(i
))
178 inst
.command
->invoke("run-lua " + i
);
182 dumper_information
UI_get_dumpers(emulator_instance
& inst
)
184 dumper_information x
;
185 inst
.iqueue
->run([&inst
, &x
]() {
186 std::set
<dumper_factory_base
*> dset
= dumper_factory_base::get_dumper_set();
188 update_dumperinfo(inst
, x
.dumpers
, i
);
193 void UI_start_dump(emulator_instance
& inst
, dumper_factory_base
& factory
, const std::string
& mode
,
194 const std::string
& prefix
)
196 lsnes_instance
.iqueue
->run([&inst
, &factory
, mode
, prefix
]() {
197 inst
.mdumper
->start(factory
, mode
, prefix
);
201 void UI_end_dump(emulator_instance
& inst
, dumper_factory_base
& factory
)
203 lsnes_instance
.iqueue
->run([&inst
, &factory
]() {
204 auto in
= inst
.mdumper
->get_instance(&factory
);
209 void UI_do_keypress(emulator_instance
& inst
, const keyboard::modifier_set
& mods
, keyboard::key_key
& key
,
213 inst
.iqueue
->run_async([mods
, _key
, polarity
]() {
214 _key
->set_state(mods
, polarity
? 1 : 0);
215 }, [](std::exception
& e
) {});
218 bool UI_has_movie(emulator_instance
& inst
)
221 lsnes_instance
.iqueue
->run([&inst
, &ret
]() {
222 ret
= !!*inst
.mlogic
&& !inst
.rom
->isnull();
227 void UI_save_movie(emulator_instance
& inst
, std::ostringstream
& stream
)
229 lsnes_instance
.iqueue
->run([&inst
, &stream
]() {
230 inst
.mlogic
->get_mfile().is_savestate
= false;
231 auto prj
= inst
.project
->get();
233 inst
.mlogic
->get_mfile().gamename
= prj
->gamename
;
234 inst
.mlogic
->get_mfile().authors
= prj
->authors
;
236 inst
.mlogic
->get_mfile().active_macros
.clear();
237 inst
.mlogic
->get_mfile().save(stream
, inst
.mlogic
->get_rrdata());
241 std::pair
<std::string
, std::string
> UI_lookup_platform_and_game(emulator_instance
& inst
)
245 lsnes_instance
.iqueue
->run([&inst
, &plat
, &game
]() {
246 auto prj
= inst
.project
->get();
248 game
= prj
->gamename
;
250 game
= inst
.mlogic
->get_mfile().gamename
;
251 plat
= lookup_sysregion_mapping(inst
.mlogic
->get_mfile().gametype
->get_name());
253 return std::make_pair(plat
, game
);
256 std::string
UI_get_project_otherpath(emulator_instance
& inst
)
259 lsnes_instance
.iqueue
->run([&inst
, &path
]() {
260 path
= inst
.project
->otherpath();
265 std::string
UI_get_project_moviepath(emulator_instance
& inst
)
268 lsnes_instance
.iqueue
->run([&inst
, &path
]() {
269 path
= inst
.project
->moviepath();
274 bool UI_in_project_context(emulator_instance
& inst
)
277 lsnes_instance
.iqueue
->run([&inst
, &pc
]() {
278 pc
= (inst
.project
->get() != NULL
);