- 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:
Casey Langen 2017-01-26 18:45:26 -08:00
parent de859a7f7a
commit 879df9321d
7 changed files with 110 additions and 8 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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 */
}

View File

@ -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();
};

View File

@ -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;
}

View File

@ -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();
}