bsnes/icarus/ui/scan-dialog.cpp

124 lines
3.5 KiB
C++

ScanDialog::ScanDialog() {
scanDialog = this;
onClose(&Application::quit);
layout.setMargin(5);
pathEdit.onActivate([&] { refresh(); });
refreshButton.setImage(Icon::Action::Refresh).setBordered(false).onActivate([&] {
pathEdit.setText(settings["icarus/Path"].text());
refresh();
});
homeButton.setImage(Icon::Go::Home).setBordered(false).onActivate([&] {
pathEdit.setText(userpath());
refresh();
});
upButton.setImage(Icon::Go::Up).setBordered(false).onActivate([&] {
pathEdit.setText(dirname(settings["icarus/Path"].text()));
refresh();
});
scanList.onActivate([&] { activate(); });
selectAllButton.setText("Select All").onActivate([&] {
for(auto& item : scanList.items()) {
if(item.cell(0).checkable()) item.cell(0).setChecked(true);
}
});
unselectAllButton.setText("Unselect All").onActivate([&] {
for(auto& item : scanList.items()) {
if(item.cell(0).checkable()) item.cell(0).setChecked(false);
}
});
settingsButton.setText("Settings ...").onActivate([&] {
settingsDialog->setCentered(*this);
settingsDialog->setVisible();
settingsDialog->setFocused();
});
importButton.setText("Import ...").onActivate([&] { import(); });
setTitle("icarus");
setSize({800, 480});
setCentered();
}
auto ScanDialog::show() -> void {
setVisible();
pathEdit.setText(settings["icarus/Path"].text());
refresh();
}
auto ScanDialog::refresh() -> void {
scanList.reset();
scanList.append(ListViewHeader().setVisible(false).append(ListViewColumn().setExpandable()));
auto pathname = pathEdit.text().transform("\\", "/").rtrim("/").append("/");
if(!directory::exists(pathname)) return;
settings["icarus/Path"].setValue(pathname);
pathEdit.setText(pathname);
auto contents = directory::icontents(pathname);
for(auto& name : contents) {
if(!name.endsWith("/")) continue;
if(gamePakType(suffixname(name))) continue;
scanList.append(ListViewItem().append(ListViewCell().setImage(Icon::Emblem::Folder).setText(name.rtrim("/"))));
}
for(auto& name : contents) {
if(name.endsWith("/")) continue;
if(!gameRomType(suffixname(name).downcase())) continue;
scanList.append(ListViewItem().append(ListViewCell().setCheckable().setImage(Icon::Emblem::File).setText(name)));
}
Application::processEvents();
scanList.resizeColumns();
scanList.setFocused();
}
auto ScanDialog::activate() -> void {
if(auto item = scanList.selected()) {
string location{settings["icarus/Path"].text(), item.cell(0).text()};
if(directory::exists(location) && !gamePakType(suffixname(location))) {
pathEdit.setText(location);
refresh();
}
}
}
auto ScanDialog::import() -> void {
lstring filenames;
for(auto& item : scanList.items()) {
if(item.cell(0).checked()) {
filenames.append(string{settings["icarus/Path"].text(), item.cell(0).text()});
}
}
if(!filenames) {
MessageDialog().setParent(*this).setText("Nothing selected to import.").error();
return;
}
setVisible(false);
importDialog->run(filenames);
}
auto ScanDialog::gamePakType(const string& type) -> bool {
return type == ".sys"
|| type == ".fc"
|| type == ".sfc"
|| type == ".gb"
|| type == ".gbc"
|| type == ".gba"
|| type == ".bs"
|| type == ".st";
}
auto ScanDialog::gameRomType(const string& type) -> bool {
return type == ".zip"
|| type == ".fc" || type == ".nes"
|| type == ".sfc" || type == ".smc"
|| type == ".gb"
|| type == ".gbc"
|| type == ".gba"
|| type == ".bs"
|| type == ".st";
}