mirror of
https://github.com/clangen/musikcube.git
synced 2025-03-14 04:18:36 +00:00
- Implemented playlist renaming
- Standardized PlayQueueOverlay widths for all overlays - Fixed TextInput::SetText() to set the cursor at the proper position
This commit is contained in:
parent
de859a7f7a
commit
879df9321d
@ -51,6 +51,9 @@ static std::string INSERT_PLAYLIST_TRACK_QUERY =
|
||||
static std::string DELETE_PLAYLIST_TRACKS_QUERY =
|
||||
"DELETE FROM playlist_tracks WHERE playlist_id=?;";
|
||||
|
||||
static std::string RENAME_PLAYLIST_QUERY =
|
||||
"UPDATE playlists SET name=? WHERE id=?";
|
||||
|
||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
||||
const std::string& playlistName,
|
||||
std::shared_ptr<musik::core::TrackList> tracks)
|
||||
@ -67,6 +70,14 @@ std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Replace(
|
||||
new SavePlaylistQuery(playlistId, tracks));
|
||||
}
|
||||
|
||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Rename(
|
||||
const DBID playlistId,
|
||||
const std::string& playlistName)
|
||||
{
|
||||
return std::shared_ptr<SavePlaylistQuery>(
|
||||
new SavePlaylistQuery(playlistId, playlistName));
|
||||
}
|
||||
|
||||
SavePlaylistQuery::SavePlaylistQuery(
|
||||
const std::string& playlistName,
|
||||
std::shared_ptr<musik::core::TrackList> tracks)
|
||||
@ -77,13 +88,21 @@ SavePlaylistQuery::SavePlaylistQuery(
|
||||
}
|
||||
|
||||
SavePlaylistQuery::SavePlaylistQuery(
|
||||
DBID playlistId,
|
||||
const DBID playlistId,
|
||||
std::shared_ptr<musik::core::TrackList> tracks)
|
||||
{
|
||||
this->playlistId = playlistId;
|
||||
this->tracks = tracks;
|
||||
}
|
||||
|
||||
SavePlaylistQuery::SavePlaylistQuery(
|
||||
const DBID playlistId,
|
||||
const std::string& playlistName)
|
||||
{
|
||||
this->playlistId = playlistId;
|
||||
this->playlistName = playlistName;
|
||||
}
|
||||
|
||||
SavePlaylistQuery::~SavePlaylistQuery() {
|
||||
}
|
||||
|
||||
@ -130,6 +149,17 @@ bool SavePlaylistQuery::CreatePlaylist(musik::core::db::Connection &db) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SavePlaylistQuery::RenamePlaylist(musik::core::db::Connection &db) {
|
||||
ScopedTransaction transaction(db);
|
||||
|
||||
/* delete existing tracks, we'll replace 'em */
|
||||
Statement renamePlaylist(RENAME_PLAYLIST_QUERY.c_str(), db);
|
||||
renamePlaylist.BindText(0, this->playlistName);
|
||||
renamePlaylist.BindInt(1, this->playlistId);
|
||||
|
||||
return (renamePlaylist.Step() != db::Error);
|
||||
}
|
||||
|
||||
bool SavePlaylistQuery::ReplacePlaylist(musik::core::db::Connection &db) {
|
||||
ScopedTransaction transaction(db);
|
||||
|
||||
@ -152,7 +182,10 @@ bool SavePlaylistQuery::ReplacePlaylist(musik::core::db::Connection &db) {
|
||||
}
|
||||
|
||||
bool SavePlaylistQuery::OnRun(musik::core::db::Connection &db) {
|
||||
if (playlistId != -1) {
|
||||
if (playlistName.size() && playlistId != 0) {
|
||||
return this->RenamePlaylist(db);
|
||||
}
|
||||
else if (playlistId != -1) {
|
||||
return this->ReplacePlaylist(db);
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,10 @@ namespace musik {
|
||||
const DBID playlistId,
|
||||
std::shared_ptr<musik::core::TrackList> tracks);
|
||||
|
||||
static std::shared_ptr<SavePlaylistQuery> Rename(
|
||||
const DBID playlistId,
|
||||
const std::string& playlistName);
|
||||
|
||||
virtual std::string Name() { return "SavePlaylistQuery"; }
|
||||
|
||||
virtual ~SavePlaylistQuery();
|
||||
@ -64,10 +68,15 @@ namespace musik {
|
||||
std::shared_ptr<musik::core::TrackList> tracks);
|
||||
|
||||
SavePlaylistQuery(
|
||||
DBID playlistId,
|
||||
const DBID playlistId,
|
||||
std::shared_ptr<musik::core::TrackList> tracks);
|
||||
|
||||
SavePlaylistQuery(
|
||||
const DBID playlistId,
|
||||
const std::string& newName);
|
||||
|
||||
bool CreatePlaylist(musik::core::db::Connection &db);
|
||||
bool RenamePlaylist(musik::core::db::Connection &db);
|
||||
bool ReplacePlaylist(musik::core::db::Connection &db);
|
||||
bool AddTracksToPlaylist(musik::core::db::Connection &db, DBID playlistId);
|
||||
|
||||
|
@ -225,6 +225,14 @@ bool NowPlayingLayout::KeyPress(const std::string& key) {
|
||||
PlayQueueOverlays::ShowSavePlaylistOverlay(this->playback, this->library);
|
||||
return true;
|
||||
}
|
||||
else if (key == "M-r") {
|
||||
PlayQueueOverlays::ShowRenamePlaylistOverlay(this->library);
|
||||
return true;
|
||||
}
|
||||
else if (key == "M-d") {
|
||||
PlayQueueOverlays::ShowDeletePlaylistOverlay(this->library);
|
||||
return true;
|
||||
}
|
||||
else if (ProcessEditOperation(key)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -50,6 +50,8 @@
|
||||
#include <cursespp/DialogOverlay.h>
|
||||
#include <cursespp/InputOverlay.h>
|
||||
|
||||
#define DEFAULT_OVERLAY_WIDTH 30
|
||||
|
||||
using namespace musik::core;
|
||||
using namespace musik::core::audio;
|
||||
using namespace musik::core::library::constants;
|
||||
@ -99,6 +101,7 @@ static void showPlaylistListOverlay(
|
||||
|
||||
dialog->SetAdapter(adapter)
|
||||
.SetTitle(title)
|
||||
.SetWidth(DEFAULT_OVERLAY_WIDTH)
|
||||
.SetSelectedIndex(0)
|
||||
.SetItemSelectedCallback(callback);
|
||||
|
||||
@ -127,6 +130,7 @@ void PlayQueueOverlays::ShowAddTrackOverlay(
|
||||
dialog->SetAdapter(adapter)
|
||||
.SetTitle("add to play queue")
|
||||
.SetSelectedIndex(0)
|
||||
.SetWidth(DEFAULT_OVERLAY_WIDTH)
|
||||
.SetItemSelectedCallback(
|
||||
[trackId, &playback](cursespp::IScrollAdapterPtr adapter, size_t index) {
|
||||
auto editor = playback.Edit();
|
||||
@ -160,6 +164,7 @@ void PlayQueueOverlays::ShowAddCategoryOverlay(
|
||||
dialog->SetAdapter(adapter)
|
||||
.SetTitle("add to play queue")
|
||||
.SetSelectedIndex(0)
|
||||
.SetWidth(DEFAULT_OVERLAY_WIDTH)
|
||||
.SetItemSelectedCallback(
|
||||
[&playback, library, fieldColumn, fieldId]
|
||||
(cursespp::IScrollAdapterPtr adapter, size_t index) {
|
||||
@ -227,7 +232,7 @@ static void createNewPlaylist(
|
||||
std::shared_ptr<InputOverlay> dialog(new InputOverlay());
|
||||
|
||||
dialog->SetTitle("playlist name")
|
||||
.SetWidth(36)
|
||||
.SetWidth(DEFAULT_OVERLAY_WIDTH)
|
||||
.SetText("")
|
||||
.SetInputAcceptedCallback(
|
||||
[tracks, library](const std::string& name) {
|
||||
@ -268,4 +273,48 @@ void PlayQueueOverlays::ShowSavePlaylistOverlay(
|
||||
library->Enqueue(SavePlaylistQuery::Replace(playlistId, tracks));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static void renamePlaylist(
|
||||
musik::core::ILibraryPtr library,
|
||||
const DBID playlistId,
|
||||
const std::string& oldName)
|
||||
{
|
||||
std::shared_ptr<InputOverlay> dialog(new InputOverlay());
|
||||
|
||||
dialog->SetTitle("new playlist name")
|
||||
.SetWidth(DEFAULT_OVERLAY_WIDTH)
|
||||
.SetText(oldName)
|
||||
.SetInputAcceptedCallback(
|
||||
[library, playlistId](const std::string& name) {
|
||||
if (name.size()) {
|
||||
library->Enqueue(SavePlaylistQuery::Rename(playlistId, name));
|
||||
}
|
||||
});
|
||||
|
||||
cursespp::App::Overlays().Push(dialog);
|
||||
}
|
||||
|
||||
void PlayQueueOverlays::ShowRenamePlaylistOverlay(musik::core::ILibraryPtr library) {
|
||||
std::shared_ptr<CategoryListQuery> query = queryPlaylists(library);
|
||||
auto result = query->GetResult();
|
||||
|
||||
std::shared_ptr<Adapter> adapter(new Adapter());
|
||||
adapter->SetSelectable(true);
|
||||
addPlaylistsToAdapter(adapter, result);
|
||||
|
||||
showPlaylistListOverlay(
|
||||
"rename playlist",
|
||||
adapter,
|
||||
[library, result](cursespp::IScrollAdapterPtr adapter, size_t index) {
|
||||
if (index != ListWindow::NO_SELECTION) {
|
||||
DBID playlistId = (*result)[index]->id;
|
||||
std::string playlistName = (*result)[index]->displayValue;
|
||||
renamePlaylist(library, playlistId, playlistName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void PlayQueueOverlays::ShowDeletePlaylistOverlay(musik::core::ILibraryPtr library) {
|
||||
/* stubbed */
|
||||
}
|
@ -64,6 +64,12 @@ namespace musik {
|
||||
musik::core::audio::PlaybackService& playback,
|
||||
musik::core::ILibraryPtr library);
|
||||
|
||||
static void ShowRenamePlaylistOverlay(
|
||||
musik::core::ILibraryPtr library);
|
||||
|
||||
static void ShowDeletePlaylistOverlay(
|
||||
musik::core::ILibraryPtr library);
|
||||
|
||||
private:
|
||||
PlayQueueOverlays();
|
||||
};
|
||||
|
@ -209,9 +209,6 @@ void App::Run(ILayoutPtr layout) {
|
||||
else if (kn == "^D") { /* ctrl+d quits */
|
||||
quit = true;
|
||||
}
|
||||
else if (kn == "M-r") {
|
||||
Window::InvalidateScreen();
|
||||
}
|
||||
else if (kn == "KEY_RESIZE") {
|
||||
resizeAt = App::Now() + REDRAW_DEBOUNCE_MS;
|
||||
}
|
||||
|
@ -182,7 +182,7 @@ void TextInput::SetText(const std::string& value) {
|
||||
if (value != this->buffer) {
|
||||
this->buffer = value;
|
||||
this->bufferLength = u8len(buffer);
|
||||
this->position = 0;
|
||||
this->position = this->bufferLength;
|
||||
this->TextChanged(this, this->buffer);
|
||||
this->Redraw();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user