diff options
Diffstat (limited to 'src/cmd.c')
| -rw-r--r-- | src/cmd.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/cmd.c b/src/cmd.c new file mode 100644 index 0000000..45a591b --- /dev/null +++ b/src/cmd.c @@ -0,0 +1,99 @@ +#include "cmd.h" + +#include "data.h" +#include "list.h" +#include "player.h" +#include "ref.h" +#include "track.h" +#include "tui.h" +#include "util.h" + +#include <stdbool.h> + +#define CMD_ERROR(...) do { \ + free(cmd_status); \ + cmd_status = awprintf(__VA_ARGS__); \ + return false; \ + } while (0) + +static bool cmd_save(const wchar_t *args); +static bool cmd_move(const wchar_t *args); +static bool cmd_add(const wchar_t *args); + +const struct cmd commands[] = { + { L"save", cmd_save }, + { L"move", cmd_move }, + { L"add", cmd_add }, +}; + +const size_t command_count = ARRLEN(commands); + +wchar_t *cmd_status; + +void +cmd_init(void) +{ + cmd_status = NULL; +} + +bool +cmd_save(const wchar_t *args) +{ + data_save(); + return 0; +} + +bool +cmd_move(const wchar_t *name) +{ + struct link *link; + struct track *track; + struct tag *tag; + char *newpath; + + tag = tag_find(name); + if (!tag) CMD_ERROR(L"Tag not found"); + + link = list_at(tracks_vis, track_nav.sel); + if (!link) CMD_ERROR(L"No track selected"); + track = UPCAST(link, struct ref)->data; + + newpath = aprintf("%s/%s", tag->fpath, track->fname); + ASSERT(newpath != NULL); + move_file(track->fpath, newpath); + free(track->fpath); + track->fpath = newpath; + + link_pop(link); + list_push_back(&tag->tracks, link); + + return 1; +} + +bool +cmd_add(const wchar_t *name) +{ + struct link *link; + struct track *track; + struct ref *ref; + struct tag *tag; + char *newpath; + + tag = tag_find(name); + if (!tag) return 0; + + link = list_at(&player->playlist, track_nav.sel); + if (!link) return 0; + track = UPCAST(link, struct ref)->data; + + newpath = aprintf("%s/%s", tag->fpath, track->fname); + ASSERT(newpath != NULL); + copy_file(track->fpath, newpath); + track->fpath = newpath; + + track = track_alloc(tag->fpath, track->fname, get_fid(tag->fpath)); + ref = ref_init(track); + list_push_back(&tag->tracks, &ref->link); + + return 1; +} |
