From cc3becd5662504dc2e838a7e6a2349b025223ca7 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 23 Oct 2015 09:04:23 -0400 Subject: [PATCH] core/tags/genre: Directly inherit from DatabaseEntry Signed-off-by: Anna Schumaker --- core/queue.cpp | 2 +- core/tags/genre.cpp | 41 ++++++++++++++++++++++++++++++++++++--- gui/queue/model.cpp | 2 +- include/core/tags/genre.h | 14 +++++++++++-- tests/core/tags/genre.cpp | 14 ++++++------- 5 files changed, 59 insertions(+), 14 deletions(-) diff --git a/core/queue.cpp b/core/queue.cpp index 940b0c28..de0139b0 100644 --- a/core/queue.cpp +++ b/core/queue.cpp @@ -84,7 +84,7 @@ static inline int track_compare(Track *lhs, Track *rhs, sort_t field) case SORT_COUNT: return lhs->count() - rhs->count(); case SORT_GENRE: - return lhs->genre()->compare(rhs->genre()); + return genre_compare(lhs->genre(), rhs->genre()); case SORT_LENGTH: return lhs->length() - rhs->length(); case SORT_PLAYED: diff --git a/core/tags/genre.cpp b/core/tags/genre.cpp index f2bd7b73..53927ce5 100644 --- a/core/tags/genre.cpp +++ b/core/tags/genre.cpp @@ -1,19 +1,49 @@ /** * Copyright 2014 (c) Anna Schumaker. */ +extern "C" { +#include +} #include static database genre_db; - -genre :: genre() : GenericTag() {} +genre :: genre() {} genre :: genre(const std::string &name) - : GenericTag(name) { + gchar *lower = string_lowercase(name.c_str()); + + ge_name = name; + ge_lower = lower; + + g_free(lower); } +const std::string genre :: primary_key() const +{ + return ge_name; +} + +void genre :: read(file &file) +{ + gchar *name = file_readl(&file); + gchar *g_lc = string_lowercase(name); + + ge_name = name; + ge_lower = g_lc; + + g_free(name); + g_free(g_lc); +} + +void genre :: write(file &file) +{ + file_writef(&file, "%s", ge_name.c_str()); +} + + void genre_db_init() { db_init(&genre_db, "genre.db", true); @@ -34,3 +64,8 @@ struct genre *genre_get(const unsigned int index) { return db_at(&genre_db, index); } + +int genre_compare(struct genre *lhs, struct genre *rhs) +{ + return string_compare(lhs->ge_lower.c_str(), rhs->ge_lower.c_str()); +} diff --git a/gui/queue/model.cpp b/gui/queue/model.cpp index 61deb0d1..19f7627c 100644 --- a/gui/queue/model.cpp +++ b/gui/queue/model.cpp @@ -123,7 +123,7 @@ void QueueModel::get_value_vfunc(const Gtk::TreeIter &iter, int column, case 5: return set_val(track->album()->al_year, value); case 6: - return set_val(track->genre()->name(), value); + return set_val(track->genre()->ge_name, value); case 7: return set_val(track->count(), value); case 8: diff --git a/include/core/tags/genre.h b/include/core/tags/genre.h index 7ba877db..fbec588f 100644 --- a/include/core/tags/genre.h +++ b/include/core/tags/genre.h @@ -4,14 +4,17 @@ #ifndef OCARINA_CORE_TAGS_GENRE_H #define OCARINA_CORE_TAGS_GENRE_H -#include +#include /** * The Genre tag is used to store the name of genres added * to the tag database. */ -struct genre : public GenericTag { +struct genre : public DatabaseEntry { public: + std::string ge_name; /* This genre's name. */ + std::string ge_lower; /* This genre's name (lowercased). */ + genre(); /**< Genre tag constructor. */ /** @@ -20,6 +23,10 @@ public: * @param name Genre name. */ genre(const std::string &); + + const std::string primary_key() const; + void read(file &); + void write(file &); }; @@ -35,4 +42,7 @@ struct genre *genre_find(const std::string &); /* Called to get a genre tag with a specific index. */ struct genre *genre_get(const unsigned int); +/* Called to compare two genre tags. */ +int genre_compare(struct genre *, struct genre *); + #endif /* OCARINA_CORE_TAGS_GENRE_H */ diff --git a/tests/core/tags/genre.cpp b/tests/core/tags/genre.cpp index 6adc16de..ccd5adff 100644 --- a/tests/core/tags/genre.cpp +++ b/tests/core/tags/genre.cpp @@ -6,15 +6,15 @@ static void test_verify_empty(struct genre *genre) { - test_equal(genre->name(), ""); - test_equal(genre->lowercase(), ""); + test_equal(genre->ge_name, ""); + test_equal(genre->ge_lower, ""); test_equal(genre->primary_key(), ""); } static void test_verify_vg(struct genre *genre) { - test_equal(genre->name(), "Video Game Music"); - test_equal(genre->lowercase(), "video game music"); + test_equal(genre->ge_name, "Video Game Music"); + test_equal(genre->ge_lower, "video game music"); test_equal(genre->primary_key(), "Video Game Music"); } @@ -53,9 +53,9 @@ static void test_genre_compare() struct genre *video = new struct genre("Video Game Music"); struct genre *game = new struct genre("game music"); - test_equal(video->compare(video), 0); - test_equal(video->compare(game), 1); - test_equal(game->compare(video), -1); + test_equal(genre_compare(video, video), 0); + test_equal(genre_compare(video, game), 1); + test_equal(genre_compare(game, video), -1); delete game; delete video;