diff --git a/core/core.cpp b/core/core.cpp index 645f45f8..f7d2592e 100644 --- a/core/core.cpp +++ b/core/core.cpp @@ -12,11 +12,11 @@ extern "C" { #include -void core :: init() +void core :: init(struct core_init_data *init) { filter_init(); tags_init(); - collection :: init(); + collection :: init(init->collection_ops); playlist :: init(); deck :: init(); audio :: init(); diff --git a/core/library.cpp b/core/library.cpp index 589db613..de802353 100644 --- a/core/library.cpp +++ b/core/library.cpp @@ -25,7 +25,9 @@ public: { std::vector::iterator it; - file_open(&f, OPEN_WRITE); + if (!file_open(&f, OPEN_WRITE)) + return; + file_writef(&f, "%u %u", q_flags, q_sort.size()); for (it = q_sort.begin(); it != q_sort.end(); it++) file_writef(&f, " %u %d", it->field, it->ascending); @@ -51,16 +53,6 @@ public: } file_close(&f); } - - void set_flag(queue_flags f) { queue :: set_flag(f); save(); } - void unset_flag(queue_flags f) { queue :: unset_flag(f); save(); } - - void sort(compare_t field, bool ascending) - { - queue :: sort(field, ascending); - save(); - }; - }; static LibraryQueue library_q; @@ -147,11 +139,11 @@ static void validate_library(void *data) * External API begins here */ -void collection :: init() +void collection :: init(struct queue_ops *ops) { struct db_entry *track, *next; - queue_init(&library_q, Q_ENABLED | Q_REPEAT, NULL); + queue_init(&library_q, Q_ENABLED | Q_REPEAT, ops); db_for_each(track, next, track_db_get()) { if (TRACK(track)->tr_library->li_enabled) @@ -164,6 +156,14 @@ void collection :: init() library_q.sort(COMPARE_YEAR, false); library_q.sort(COMPARE_TRACK, false); } + + library_q.set_flag(Q_SAVE_SORT); + library_q.set_flag(Q_SAVE_FLAGS); +} + +void collection :: save(struct queue *queue, enum queue_flags flag) +{ + library_q.save(); } struct library *collection :: add(const std::string &dir) diff --git a/gui/collection.cpp b/gui/collection.cpp index 36ac9745..f5648a3f 100644 --- a/gui/collection.cpp +++ b/gui/collection.cpp @@ -48,6 +48,10 @@ public: static CollectionTab *collection_tab; +struct queue_ops collection_ops = { + collection :: save, +}; + void init_collection_tab() { collection_tab = new CollectionTab; diff --git a/gui/ocarina.cpp b/gui/ocarina.cpp index 684d7935..2f9a53f4 100644 --- a/gui/ocarina.cpp +++ b/gui/ocarina.cpp @@ -9,6 +9,11 @@ static std::string ocarina_dir = ""; static Glib::RefPtr ocarina_app; + +struct core_init_data init_data = { + &collection_ops, +}; + namespace gui { Glib::RefPtr __O_BUILDER; @@ -47,7 +52,7 @@ int main(int argc, char **argv) gst :: init(&argc, &argv); - core :: init(); + core :: init(&init_data); plist :: init(); manager :: init(); diff --git a/include/core/core.h b/include/core/core.h index d875c052..ce595ab9 100644 --- a/include/core/core.h +++ b/include/core/core.h @@ -4,6 +4,13 @@ #ifndef OCARINA_CORE_CORE_H #define OCARINA_CORE_CORE_H +#include + + +struct core_init_data { + struct queue_ops *collection_ops; +}; + /** * Namespace for basic core library functions. */ @@ -14,7 +21,7 @@ namespace core * Initializes all components of the core library, including reading * databases from disk and setting up gstreamer. */ - void init(); + void init(struct core_init_data *); void deinit(); } diff --git a/include/core/library.h b/include/core/library.h index f5ed1618..f2bfa679 100644 --- a/include/core/library.h +++ b/include/core/library.h @@ -26,7 +26,9 @@ namespace collection * Scan over every Track tag and add each enabled Track to the * library queue. */ - void init(); + void init(struct queue_ops *); + + void save(struct queue *, enum queue_flags); /** * Add a new directory to the library. diff --git a/include/gui/ocarina.h b/include/gui/ocarina.h index 50219300..9ce0d629 100644 --- a/include/gui/ocarina.h +++ b/include/gui/ocarina.h @@ -30,6 +30,7 @@ namespace gui } } +extern struct queue_ops collection_ops; void on_pq_created(queue *, unsigned int); void post_init_queue_tabs(); diff --git a/tests/core/audio.cpp b/tests/core/audio.cpp index 81b89d2f..8fb7e2ea 100644 --- a/tests/core/audio.cpp +++ b/tests/core/audio.cpp @@ -88,7 +88,7 @@ void test_init() filter_init(); tags_init(); - collection :: init(); + collection :: init(NULL); deck :: init(); audio :: init(); diff --git a/tests/core/deck.cpp b/tests/core/deck.cpp index 018cbc4e..c8f8a01e 100644 --- a/tests/core/deck.cpp +++ b/tests/core/deck.cpp @@ -23,7 +23,7 @@ static void test_init() test_cp_data_dir(); filter_init(); tags_init(); - collection :: init(); + collection :: init(NULL); deck :: init(); test_equal(queue_has_flag(collection :: get_queue(), Q_RANDOM), true); diff --git a/tests/core/library.cpp b/tests/core/library.cpp index b6163bb6..35bfbdd3 100644 --- a/tests/core/library.cpp +++ b/tests/core/library.cpp @@ -19,7 +19,7 @@ static void test_init() test_cp_data_dir(); filter_init(); tags_init(); - collection :: init(); + collection :: init(NULL); test_not_equal(q, Q_NULL); test_equal(queue_has_flag(q, Q_ENABLED), true); diff --git a/tests/core/playlist.cpp b/tests/core/playlist.cpp index 449d696f..a39df9fc 100644 --- a/tests/core/playlist.cpp +++ b/tests/core/playlist.cpp @@ -20,7 +20,7 @@ static void test_init() test_cp_data_dir(); filter_init(); tags_init(); - collection :: init(); + collection :: init(NULL); playlist :: init(); test_not_equal(q, Q_NULL);