mirror of https://github.com/bsnes-emu/bsnes.git
117 lines
3.3 KiB
C++
117 lines
3.3 KiB
C++
|
ScanDialog::ScanDialog() {
|
||
|
scanDialog = this;
|
||
|
|
||
|
onClose(&Application::quit);
|
||
|
layout.setMargin(5);
|
||
|
pathEdit.onActivate([&] { refresh(); });
|
||
|
refreshButton.setIcon(Icon::Action::Refresh).setBordered(false).onActivate([&] {
|
||
|
pathEdit.setText(settings.activePath);
|
||
|
refresh();
|
||
|
});
|
||
|
homeButton.setIcon(Icon::Go::Home).setBordered(false).onActivate([&] {
|
||
|
pathEdit.setText(userpath());
|
||
|
refresh();
|
||
|
});
|
||
|
upButton.setIcon(Icon::Go::Up).setBordered(false).onActivate([&] {
|
||
|
pathEdit.setText(settings.activePath.dirname());
|
||
|
refresh();
|
||
|
});
|
||
|
scanList.onActivate([&] { activate(); });
|
||
|
selectAllButton.setText("Select All").onActivate([&] {
|
||
|
for(auto& item : scanList.items()) item.cell(0).setChecked(true);
|
||
|
});
|
||
|
unselectAllButton.setText("Unselect All").onActivate([&] {
|
||
|
for(auto& item : scanList.items()) item.cell(0).setChecked(false);
|
||
|
});
|
||
|
createManifestsLabel.setChecked(settings.createManifests).setText("Create Manifests").onToggle([&] {
|
||
|
settings.createManifests = createManifestsLabel.checked();
|
||
|
});
|
||
|
importButton.setText("Import ...").onActivate([&] { import(); });
|
||
|
|
||
|
setTitle("icarus");
|
||
|
setSize({800, 480});
|
||
|
setCentered();
|
||
|
}
|
||
|
|
||
|
auto ScanDialog::show() -> void {
|
||
|
setVisible();
|
||
|
pathEdit.setText(settings.activePath);
|
||
|
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;
|
||
|
|
||
|
pathEdit.setText(settings.activePath = pathname);
|
||
|
auto contents = directory::icontents(pathname);
|
||
|
|
||
|
for(auto& name : contents) {
|
||
|
if(!name.endsWith("/")) continue;
|
||
|
if(gamePakType(name.suffixname())) continue;
|
||
|
scanList.append(ListViewItem().append(ListViewCell().setIcon(Icon::Emblem::Folder).setText(name.rtrim("/"))));
|
||
|
}
|
||
|
|
||
|
for(auto& name : contents) {
|
||
|
if(name.endsWith("/")) continue;
|
||
|
if(!gameRomType(name.suffixname().downcase())) continue;
|
||
|
scanList.append(ListViewItem().append(ListViewCell().setCheckable().setIcon(Icon::Emblem::File).setText(name)));
|
||
|
}
|
||
|
|
||
|
Application::processEvents();
|
||
|
scanList.resizeColumns();
|
||
|
scanList.setFocused();
|
||
|
}
|
||
|
|
||
|
auto ScanDialog::activate() -> void {
|
||
|
if(auto item = scanList.selected()) {
|
||
|
string location{settings.activePath, item.cell(0).text()};
|
||
|
if(directory::exists(location) && !gamePakType(location.suffixname())) {
|
||
|
pathEdit.setText(location);
|
||
|
refresh();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
auto ScanDialog::import() -> void {
|
||
|
lstring filenames;
|
||
|
for(auto& item : scanList.items()) {
|
||
|
if(item.cell(0).checked()) {
|
||
|
filenames.append(string{settings.activePath, 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";
|
||
|
}
|