Songbook search improvements
This commit is contained in:
parent
6fa0afd758
commit
13f91aa195
@ -9,7 +9,6 @@
|
|||||||
"hint" : "Search",
|
"hint" : "Search",
|
||||||
"maxWidth" : 50
|
"maxWidth" : 50
|
||||||
},
|
},
|
||||||
|
|
||||||
"lblBandInput" : {
|
"lblBandInput" : {
|
||||||
"position" : [3, 68]
|
"position" : [3, 68]
|
||||||
},
|
},
|
||||||
|
@ -27,57 +27,25 @@ SongbookInterface::SongbookInterface(PlayerPtr player) {
|
|||||||
|
|
||||||
reader.construct(assets->json("/interface/windowconfig/songbook.config:paneLayout"), this);
|
reader.construct(assets->json("/interface/windowconfig/songbook.config:paneLayout"), this);
|
||||||
|
|
||||||
auto songList = fetchChild<ListWidget>("songs.list");
|
Root::singleton().registerReloadListener(
|
||||||
auto search = fetchChild<TextBoxWidget>("search")->getText();
|
m_reloadListener = make_shared<CallbackListener>([this]() {
|
||||||
|
refresh(true);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
if (m_searchValue != search)
|
refresh(true);
|
||||||
m_searchValue = search;
|
|
||||||
|
|
||||||
m_files = assets->scan(".abc");
|
|
||||||
sort(m_files, [](String const& a, String const& b) -> bool { return b.compare(a, String::CaseInsensitive) > 0; });
|
|
||||||
for (auto s : m_files) {
|
|
||||||
auto song = s.substr(7, s.length() - (7 + 4));
|
|
||||||
if (song.contains(m_searchValue, String::CaseInsensitive)) {
|
|
||||||
auto widget = songList->addItem();
|
|
||||||
widget->setData(s);
|
|
||||||
auto songName = widget->fetchChild<LabelWidget>("songName");
|
|
||||||
songName->setText(song);
|
|
||||||
|
|
||||||
widget->show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SongbookInterface::update(float dt) {
|
void SongbookInterface::update(float dt) {
|
||||||
Pane::update(dt);
|
Pane::update(dt);
|
||||||
|
refresh();
|
||||||
auto search = fetchChild<TextBoxWidget>("search")->getText();
|
|
||||||
if (m_searchValue != search) {
|
|
||||||
m_searchValue = search;
|
|
||||||
|
|
||||||
auto songList = fetchChild<ListWidget>("songs.list");
|
|
||||||
songList->clear();
|
|
||||||
|
|
||||||
for (auto s : m_files) {
|
|
||||||
auto song = s.substr(7, s.length() - (7 + 4));
|
|
||||||
if (song.contains(m_searchValue, String::CaseInsensitive)) {
|
|
||||||
auto widget = songList->addItem();
|
|
||||||
widget->setData(s);
|
|
||||||
auto songName = widget->fetchChild<LabelWidget>("songName");
|
|
||||||
songName->setText(song);
|
|
||||||
|
|
||||||
widget->show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SongbookInterface::play() {
|
bool SongbookInterface::play() {
|
||||||
auto songList = fetchChild<ListWidget>("songs.list");
|
auto songList = fetchChild<ListWidget>("songs.list");
|
||||||
auto songWidget = songList->selectedWidget();
|
auto songWidget = songList->selectedWidget();
|
||||||
if (!songWidget)
|
if (!songWidget) return false;
|
||||||
return false;
|
auto& songName = m_files.at(songWidget->data().toUInt());
|
||||||
auto songName = songWidget->data().toString();
|
|
||||||
auto group = fetchChild<TextBoxWidget>("group")->getText();
|
auto group = fetchChild<TextBoxWidget>("group")->getText();
|
||||||
|
|
||||||
JsonObject song;
|
JsonObject song;
|
||||||
@ -89,4 +57,45 @@ bool SongbookInterface::play() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SongbookInterface::refresh(bool reloadFiles) {
|
||||||
|
if (reloadFiles) {
|
||||||
|
m_files = Root::singleton().assets()->scanExtension(".abc").values();
|
||||||
|
sort(m_files, [](String const& a, String const& b) -> bool { return b.compare(a, String::CaseInsensitive) > 0; });
|
||||||
|
}
|
||||||
|
auto search = fetchChild<TextBoxWidget>("search")->getText();
|
||||||
|
if (m_lastSearch != search || reloadFiles) {
|
||||||
|
m_lastSearch = search;
|
||||||
|
auto songList = fetchChild<ListWidget>("songs.list");
|
||||||
|
songList->clear();
|
||||||
|
if (search.empty()) {
|
||||||
|
for (size_t i = 0; i != m_files.size(); ++i) {
|
||||||
|
auto widget = songList->addItem();
|
||||||
|
widget->setData(i);
|
||||||
|
auto songName = widget->fetchChild<LabelWidget>("songName");
|
||||||
|
songName->setText(m_files[i]);
|
||||||
|
widget->show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (size_t i = 0; i != m_files.size(); ++i) {
|
||||||
|
StringView song = m_files[i];
|
||||||
|
auto find = song.find(search, 0, String::CaseInsensitive);
|
||||||
|
if (find != NPos) {
|
||||||
|
auto widget = songList->addItem();
|
||||||
|
widget->setData(i);
|
||||||
|
String text = "";
|
||||||
|
size_t last = 0;
|
||||||
|
do {
|
||||||
|
text += strf("^#bbb;{}^#7f7;{}", song.substr(last, find - last), song.substr(find, search.size()));
|
||||||
|
last = find + search.size();
|
||||||
|
find = song.find(search, last, String::CaseInsensitive);
|
||||||
|
} while (find != NPos);
|
||||||
|
auto songName = widget->fetchChild<LabelWidget>("songName");
|
||||||
|
songName->setText(text + strf("^#bbb;{}", song.substr(last)));
|
||||||
|
widget->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "StarSongbook.hpp"
|
#include "StarSongbook.hpp"
|
||||||
#include "StarPane.hpp"
|
#include "StarPane.hpp"
|
||||||
|
#include "StarListener.hpp"
|
||||||
|
|
||||||
namespace Star {
|
namespace Star {
|
||||||
|
|
||||||
@ -18,8 +19,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
PlayerPtr m_player;
|
PlayerPtr m_player;
|
||||||
StringList m_files;
|
StringList m_files;
|
||||||
String m_searchValue;
|
String m_lastSearch;
|
||||||
|
CallbackListenerPtr m_reloadListener;
|
||||||
bool play();
|
bool play();
|
||||||
|
void refresh(bool reloadFiles = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user