From 0d1c6d10b43496064aa3030a8993ffea02e4864b Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Wed, 23 Apr 2025 11:30:33 +0200 Subject: [PATCH 01/17] Created a new file for each media type in the Backend directory and main.cpp --- src/Backend/Book.cpp | 0 src/Backend/Book.h | 0 src/Backend/Magazine.cpp | 0 src/Backend/Magazine.h | 0 src/Backend/Media.cpp | 0 src/Backend/Media.h | 0 src/Backend/Movie.cpp | 0 src/Backend/Movie.h | 0 src/Backend/Podcast.cpp | 0 src/Backend/Podcast.h | 0 src/Backend/Song.cpp | 0 src/Backend/Song.h | 0 src/main.cpp | 0 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Backend/Book.cpp create mode 100644 src/Backend/Book.h create mode 100644 src/Backend/Magazine.cpp create mode 100644 src/Backend/Magazine.h create mode 100644 src/Backend/Media.cpp create mode 100644 src/Backend/Media.h create mode 100644 src/Backend/Movie.cpp create mode 100644 src/Backend/Movie.h create mode 100644 src/Backend/Podcast.cpp create mode 100644 src/Backend/Podcast.h create mode 100644 src/Backend/Song.cpp create mode 100644 src/Backend/Song.h create mode 100644 src/main.cpp diff --git a/src/Backend/Book.cpp b/src/Backend/Book.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Book.h b/src/Backend/Book.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Magazine.cpp b/src/Backend/Magazine.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Magazine.h b/src/Backend/Magazine.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Media.cpp b/src/Backend/Media.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Media.h b/src/Backend/Media.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Movie.cpp b/src/Backend/Movie.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Movie.h b/src/Backend/Movie.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Podcast.cpp b/src/Backend/Podcast.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Podcast.h b/src/Backend/Podcast.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Song.cpp b/src/Backend/Song.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Song.h b/src/Backend/Song.h new file mode 100644 index 0000000..e69de29 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e69de29 From 8a515803c3d9d398876f07200baf5ee9033d0d90 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Wed, 23 Apr 2025 12:27:26 +0200 Subject: [PATCH 02/17] Created a new file src/Backend/Date.cpp, Created a new file src/Backend/Date.h, Updated src/Backend/Media.cpp, Updated src/Backend/Media.h --- .vscode/settings.json | 46 +++++++++++++++++++++++++++++++++++++++++++ src/Backend/Date.cpp | 0 src/Backend/Date.h | 0 src/Backend/Media.cpp | 20 +++++++++++++++++++ src/Backend/Media.h | 32 ++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 src/Backend/Date.cpp create mode 100644 src/Backend/Date.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b9c81f2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,46 @@ +{ + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "random": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp", + "iostream": "cpp" + } +} \ No newline at end of file diff --git a/src/Backend/Date.cpp b/src/Backend/Date.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Date.h b/src/Backend/Date.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Media.cpp b/src/Backend/Media.cpp index e69de29..933c075 100644 --- a/src/Backend/Media.cpp +++ b/src/Backend/Media.cpp @@ -0,0 +1,20 @@ +#include "Media.h" +#include "Date.h" + +#include +#include + +Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv) + : title(t), author(a), genre(g), relaseDate(rD), kbSize(kb), isAvailable(isAv) {} + +Media::Media(const Media& media) + : title(media.title), author(media.author), genre(media.genre), + relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable) {} + +Media::Media() : title(""), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false) {} + +Media::~Media() {} // Pure virtual destructor + +void Media::setTile(const std::string& title) { + +} \ No newline at end of file diff --git a/src/Backend/Media.h b/src/Backend/Media.h index e69de29..9c24d7d 100644 --- a/src/Backend/Media.h +++ b/src/Backend/Media.h @@ -0,0 +1,32 @@ +#include +#include "Date.h" + +class Media{ + protected: + std::string title; + std::string author; + std::string genre; + Date relaseDate; + unsigned int kbSize; + bool isAvailable; + //int Rating; + //string Review; + public: + Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv); + Media(const Media& media); + Media(); + virtual ~Media() = 0; // Pure virtual destructor + + virtual void setTile(const std::string& title); + virtual const std::string& getTitle() const; + virtual void setAuthor(const std::string& author); + virtual const std::string& getAuthor() const; + virtual void setGenre(const std::string& genre); + virtual const std::string& getGenre() const; + virtual void setReleaseDate(const Date& releaseDate); + virtual const Date& getReleaseDate() const; + virtual void setKbSize(unsigned int kbSize); + virtual unsigned int getKbSize() const; + virtual void setIsAvailable(bool isAvailable); + virtual bool getIsAvailable() const; +}; \ No newline at end of file From 525f06930a2707e19531f03ae4aa6ea50ee3be73 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Wed, 23 Apr 2025 12:31:23 +0200 Subject: [PATCH 03/17] Updated Media.cpp with some implementations --- src/Backend/Media.cpp | 46 +++++++++++++++++++++++++++++++++++++++++-- src/Backend/Media.h | 24 +++++++++++----------- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/Backend/Media.cpp b/src/Backend/Media.cpp index 933c075..89dde9b 100644 --- a/src/Backend/Media.cpp +++ b/src/Backend/Media.cpp @@ -15,6 +15,48 @@ Media::Media() : title(""), author(""), genre(""), relaseDate(Date()), kbSize(0) Media::~Media() {} // Pure virtual destructor -void Media::setTile(const std::string& title) { - +void Media::setTile(const std::string& t) { + title = t; +} + +const std::string& Media::getTitle() const { + return title; +} +void Media::setAuthor(const std::string& a) { + author = a; +} +const std::string& Media::getAuthor() const { + return author; +} + +void Media::setGenre(const std::string& g) { + genre = g; +} + +const std::string& Media::getGenre() const { + return genre; +} + +void Media::setReleaseDate(const Date& rD) { + relaseDate = rD; +} + +const Date& Media::getReleaseDate() const { + return relaseDate; +} + +void Media::setKbSize(unsigned int kb) { + kbSize = kb; +} + +unsigned int Media::getKbSize() const { + return kbSize; +} + +void Media::setIsAvailable(bool isAv) { + isAvailable = isAv; +} + +bool Media::getIsAvailable() const { + return isAvailable; } \ No newline at end of file diff --git a/src/Backend/Media.h b/src/Backend/Media.h index 9c24d7d..10e3fd8 100644 --- a/src/Backend/Media.h +++ b/src/Backend/Media.h @@ -17,16 +17,16 @@ class Media{ Media(); virtual ~Media() = 0; // Pure virtual destructor - virtual void setTile(const std::string& title); - virtual const std::string& getTitle() const; - virtual void setAuthor(const std::string& author); - virtual const std::string& getAuthor() const; - virtual void setGenre(const std::string& genre); - virtual const std::string& getGenre() const; - virtual void setReleaseDate(const Date& releaseDate); - virtual const Date& getReleaseDate() const; - virtual void setKbSize(unsigned int kbSize); - virtual unsigned int getKbSize() const; - virtual void setIsAvailable(bool isAvailable); - virtual bool getIsAvailable() const; + void setTile(const std::string& t); + const std::string& getTitle() const; + void setAuthor(const std::string& a); + const std::string& getAuthor() const; + void setGenre(const std::string& g); + const std::string& getGenre() const; + void setReleaseDate(const Date& rD); + const Date& getReleaseDate() const; + void setKbSize(unsigned int kb); + unsigned int getKbSize() const; + void setIsAvailable(bool isAv); + bool getIsAvailable() const; }; \ No newline at end of file From 2c56ce6688f660a81c80b440923473e45c24b6d5 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Wed, 23 Apr 2025 13:32:39 +0200 Subject: [PATCH 04/17] Added .gitignore and .gitattributes --- .gitattributes | 2 ++ .gitignore | 1 + .vscode/settings.json | 46 ------------------------------------------- 3 files changed, 3 insertions(+), 46 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore delete mode 100644 .vscode/settings.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9297245 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.cpp linguistic-language=C++ +*.h linguistic-language=C++ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dbe9c82 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b9c81f2..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "files.associations": { - "array": "cpp", - "atomic": "cpp", - "bit": "cpp", - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "compare": "cpp", - "concepts": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "deque": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "random": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "initializer_list": "cpp", - "iosfwd": "cpp", - "limits": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "stdexcept": "cpp", - "streambuf": "cpp", - "typeinfo": "cpp", - "iostream": "cpp" - } -} \ No newline at end of file From a1e36fe7ecb871a6d3306a521212ee3d9521d10b Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Wed, 23 Apr 2025 13:48:40 +0200 Subject: [PATCH 05/17] Edited src/Backend/Date.cpp, src/Backend/Date.h, src/Backend/Media.cpp, src/Backend/Media.h --- src/Backend/Date.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++ src/Backend/Date.h | 33 +++++++++++++++++++++++ src/Backend/Media.cpp | 7 ++--- src/Backend/Media.h | 7 ++++- 4 files changed, 102 insertions(+), 6 deletions(-) diff --git a/src/Backend/Date.cpp b/src/Backend/Date.cpp index e69de29..4851e18 100644 --- a/src/Backend/Date.cpp +++ b/src/Backend/Date.cpp @@ -0,0 +1,61 @@ +#include "Date.h" +#include + +Date::Date(int d, int m, int y) : day(d), month(m), year(y) {} +Date::Date(const Date& date) : day(date.day), month(date.month), year(date.year) {} +Date::Date() : day(0), month(0), year(0) {} +Date::~Date() {} + +void Date::setDay(int d) { + day = d; +} + +int Date::getDay() const { + return day; +} + +void Date::setMonth(int m) { + month = m; +} + +int Date::getMonth() const { + return month; +} + +void Date::setYear(int y) { + year = y; +} + +int Date::getYear() const { + return year; +} + +bool Date::operator==(const Date& d) const { + return (day == d.day && month == d.month && year == d.year); +} + +bool Date::operator!=(const Date& d) const { + return !(*this == d); +} + +bool Date::operator<(const Date& d) const { + if (year != d.year) return year < d.year; + if (month != d.month) return month < d.month; + return day < d.day; +} + +bool Date::operator>(const Date& d) const { + return d < *this; +} + +bool Date::operator<=(const Date& d) const { + return !(*this > d); +} + +bool Date::operator>=(const Date& d) const { + return !(*this < d); +} + +void Date::printDate() const { + std::cout << day << "/" << month << "/" << year << std::endl; +} \ No newline at end of file diff --git a/src/Backend/Date.h b/src/Backend/Date.h index e69de29..3eec758 100644 --- a/src/Backend/Date.h +++ b/src/Backend/Date.h @@ -0,0 +1,33 @@ +#ifndef DATE_H +#define DATE_H +#include + +class Date { + protected: + int day; + int month; + int year; + + public: + Date(int d, int m, int y); + Date(const Date& date); + Date(); + virtual ~Date(); + + void setDay(int d); + int getDay() const; + void setMonth(int m); + int getMonth() const; + void setYear(int y); + int getYear() const; + bool operator==(const Date& d) const; + bool operator!=(const Date& d) const; + bool operator<(const Date& d) const; + bool operator>(const Date& d) const; + bool operator<=(const Date& d) const; + bool operator>=(const Date& d) const; + + void printDate() const; +}; + +#endif \ No newline at end of file diff --git a/src/Backend/Media.cpp b/src/Backend/Media.cpp index 89dde9b..4dd3189 100644 --- a/src/Backend/Media.cpp +++ b/src/Backend/Media.cpp @@ -4,12 +4,9 @@ #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv) - : title(t), author(a), genre(g), relaseDate(rD), kbSize(kb), isAvailable(isAv) {} +Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv): title(t), author(a), genre(g), relaseDate(rD), kbSize(kb), isAvailable(isAv) {} -Media::Media(const Media& media) - : title(media.title), author(media.author), genre(media.genre), - relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable) {} +Media::Media(const Media& media): title(media.title), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable) {} Media::Media() : title(""), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false) {} diff --git a/src/Backend/Media.h b/src/Backend/Media.h index 10e3fd8..d3c054f 100644 --- a/src/Backend/Media.h +++ b/src/Backend/Media.h @@ -1,3 +1,6 @@ +#ifndef MEDIA_H +#define MEDIA_H + #include #include "Date.h" @@ -29,4 +32,6 @@ class Media{ unsigned int getKbSize() const; void setIsAvailable(bool isAv); bool getIsAvailable() const; -}; \ No newline at end of file +}; + +#endif // MEDIA_H \ No newline at end of file From b836acbdf5450e618afd2c88549040ba15b9a433 Mon Sep 17 00:00:00 2001 From: Davide Colabove <161836667+DavideColabove@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:16:52 +0200 Subject: [PATCH 06/17] Update .gitattributes --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 9297245..78188f4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -*.cpp linguistic-language=C++ -*.h linguistic-language=C++ \ No newline at end of file +*.cpp linguistic-language=Cpp +*.h linguistic-language=Cpp From 0637b16e70e7d4fc1d0e617498c9605c7e6890b2 Mon Sep 17 00:00:00 2001 From: Davide Colabove <161836667+DavideColabove@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:17:16 +0200 Subject: [PATCH 07/17] Update .gitattributes --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 78188f4..ad85b31 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -*.cpp linguistic-language=Cpp -*.h linguistic-language=Cpp +*.cpp linguistic-language=C++ +*.h linguistic-language=C++ From 1e82b253ff0a0018b9bae2e7b229c6956d4cd1c8 Mon Sep 17 00:00:00 2001 From: Davide Colabove <161836667+DavideColabove@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:17:36 +0200 Subject: [PATCH 08/17] Update .gitattributes --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index ad85b31..5507249 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -*.cpp linguistic-language=C++ -*.h linguistic-language=C++ +*.cpp linguist-language=C++ +*.h linguist-language=C++ From cc7e65774aa637b19a7055970ddccebe44516bb2 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Tue, 5 Aug 2025 12:24:27 +0200 Subject: [PATCH 09/17] Edited Media.cpp --- src/Backend/{ => Elements}/Book.cpp | 0 src/Backend/{ => Elements}/Book.h | 0 src/Backend/{ => Elements}/Date.cpp | 0 src/Backend/{ => Elements}/Date.h | 0 src/Backend/{ => Elements}/Magazine.cpp | 0 src/Backend/{ => Elements}/Magazine.h | 0 src/Backend/{ => Elements}/Media.cpp | 6 +++--- src/Backend/{ => Elements}/Media.h | 0 src/Backend/{ => Elements}/Movie.cpp | 0 src/Backend/{ => Elements}/Movie.h | 0 src/Backend/{ => Elements}/Podcast.cpp | 0 src/Backend/{ => Elements}/Podcast.h | 0 src/Backend/{ => Elements}/Song.cpp | 0 src/Backend/{ => Elements}/Song.h | 0 14 files changed, 3 insertions(+), 3 deletions(-) rename src/Backend/{ => Elements}/Book.cpp (100%) rename src/Backend/{ => Elements}/Book.h (100%) rename src/Backend/{ => Elements}/Date.cpp (100%) rename src/Backend/{ => Elements}/Date.h (100%) rename src/Backend/{ => Elements}/Magazine.cpp (100%) rename src/Backend/{ => Elements}/Magazine.h (100%) rename src/Backend/{ => Elements}/Media.cpp (64%) rename src/Backend/{ => Elements}/Media.h (100%) rename src/Backend/{ => Elements}/Movie.cpp (100%) rename src/Backend/{ => Elements}/Movie.h (100%) rename src/Backend/{ => Elements}/Podcast.cpp (100%) rename src/Backend/{ => Elements}/Podcast.h (100%) rename src/Backend/{ => Elements}/Song.cpp (100%) rename src/Backend/{ => Elements}/Song.h (100%) diff --git a/src/Backend/Book.cpp b/src/Backend/Elements/Book.cpp similarity index 100% rename from src/Backend/Book.cpp rename to src/Backend/Elements/Book.cpp diff --git a/src/Backend/Book.h b/src/Backend/Elements/Book.h similarity index 100% rename from src/Backend/Book.h rename to src/Backend/Elements/Book.h diff --git a/src/Backend/Date.cpp b/src/Backend/Elements/Date.cpp similarity index 100% rename from src/Backend/Date.cpp rename to src/Backend/Elements/Date.cpp diff --git a/src/Backend/Date.h b/src/Backend/Elements/Date.h similarity index 100% rename from src/Backend/Date.h rename to src/Backend/Elements/Date.h diff --git a/src/Backend/Magazine.cpp b/src/Backend/Elements/Magazine.cpp similarity index 100% rename from src/Backend/Magazine.cpp rename to src/Backend/Elements/Magazine.cpp diff --git a/src/Backend/Magazine.h b/src/Backend/Elements/Magazine.h similarity index 100% rename from src/Backend/Magazine.h rename to src/Backend/Elements/Magazine.h diff --git a/src/Backend/Media.cpp b/src/Backend/Elements/Media.cpp similarity index 64% rename from src/Backend/Media.cpp rename to src/Backend/Elements/Media.cpp index 4dd3189..fdc60b0 100644 --- a/src/Backend/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -4,11 +4,11 @@ #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv): title(t), author(a), genre(g), relaseDate(rD), kbSize(kb), isAvailable(isAv) {} +Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), relaseDate(rD), mediaID(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} -Media::Media(const Media& media): title(media.title), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable) {} +Media::Media(const Media& media): title(media.title), mediaID(media.mediaID), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} -Media::Media() : title(""), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false) {} +Media::Media() : title(""), mediaID(0), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} Media::~Media() {} // Pure virtual destructor diff --git a/src/Backend/Media.h b/src/Backend/Elements/Media.h similarity index 100% rename from src/Backend/Media.h rename to src/Backend/Elements/Media.h diff --git a/src/Backend/Movie.cpp b/src/Backend/Elements/Movie.cpp similarity index 100% rename from src/Backend/Movie.cpp rename to src/Backend/Elements/Movie.cpp diff --git a/src/Backend/Movie.h b/src/Backend/Elements/Movie.h similarity index 100% rename from src/Backend/Movie.h rename to src/Backend/Elements/Movie.h diff --git a/src/Backend/Podcast.cpp b/src/Backend/Elements/Podcast.cpp similarity index 100% rename from src/Backend/Podcast.cpp rename to src/Backend/Elements/Podcast.cpp diff --git a/src/Backend/Podcast.h b/src/Backend/Elements/Podcast.h similarity index 100% rename from src/Backend/Podcast.h rename to src/Backend/Elements/Podcast.h diff --git a/src/Backend/Song.cpp b/src/Backend/Elements/Song.cpp similarity index 100% rename from src/Backend/Song.cpp rename to src/Backend/Elements/Song.cpp diff --git a/src/Backend/Song.h b/src/Backend/Elements/Song.h similarity index 100% rename from src/Backend/Song.h rename to src/Backend/Elements/Song.h From 32108a78f10cabe87d86ead46816cd63577f8152 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Tue, 5 Aug 2025 12:26:32 +0200 Subject: [PATCH 10/17] Fixed Media.h and Media.cpp files to ensure proper functionality and consistency. --- src/Backend/Elements/Media.cpp | 6 +++--- src/Backend/Elements/Media.h | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp index fdc60b0..ccba80b 100644 --- a/src/Backend/Elements/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -4,11 +4,11 @@ #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), relaseDate(rD), mediaID(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} +Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), relaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} -Media::Media(const Media& media): title(media.title), mediaID(media.mediaID), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} +Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} -Media::Media() : title(""), mediaID(0), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} +Media::Media() : title(""), id(0), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} Media::~Media() {} // Pure virtual destructor diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index d3c054f..304246d 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -10,12 +10,14 @@ class Media{ std::string author; std::string genre; Date relaseDate; + unsigned int id; unsigned int kbSize; bool isAvailable; + std::string imagePath; //int Rating; //string Review; public: - Media(std::string t, std::string a, std::string g, Date rD, unsigned int kb, bool isAv); + Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); Media(const Media& media); Media(); virtual ~Media() = 0; // Pure virtual destructor From 31737800711ee05ea73de6d8dda270c20e20171d Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Tue, 5 Aug 2025 12:36:37 +0200 Subject: [PATCH 11/17] Media.cpp and Media --- src/Backend/Elements/Media.cpp | 55 +++++++++++++++++++++++----------- src/Backend/Elements/Media.h | 17 ++++++----- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp index ccba80b..65e9d5b 100644 --- a/src/Backend/Elements/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -4,56 +4,77 @@ #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), relaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} +Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} -Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), genre(media.genre), relaseDate(media.relaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} +Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), genre(media.genre), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} -Media::Media() : title(""), id(0), author(""), genre(""), relaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} +Media::Media() : title(""), id(0), author(""), genre(""), releaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} -Media::~Media() {} // Pure virtual destructor +Media::~Media() {} -void Media::setTile(const std::string& t) { - title = t; +Media& Media::setTitle(const std::string& t) { + this->title = t; + return *this; } const std::string& Media::getTitle() const { return title; } -void Media::setAuthor(const std::string& a) { - author = a; + +Media& Media::setAuthor(const std::string& a) { + this->author = a; + return *this; } const std::string& Media::getAuthor() const { return author; } -void Media::setGenre(const std::string& g) { - genre = g; +Media& Media::setGenre(const std::string& g) { + this->genre = g; + return *this; } const std::string& Media::getGenre() const { return genre; } -void Media::setReleaseDate(const Date& rD) { - relaseDate = rD; +Media& Media::setReleaseDate(const Date& rD) { + this->releaseDate = rD; + return *this; } const Date& Media::getReleaseDate() const { - return relaseDate; + return releaseDate; +} + +Media& Media::setID(unsigned int id) { + this->id = id; + return *this; } -void Media::setKbSize(unsigned int kb) { - kbSize = kb; +Media& Media::setKbSize(unsigned int kb) { + this->kbSize = kb; + return *this; } unsigned int Media::getKbSize() const { return kbSize; } -void Media::setIsAvailable(bool isAv) { - isAvailable = isAv; +Media& Media::setIsAvailable(bool isAv) { + this->isAvailable = isAv; + return *this; } bool Media::getIsAvailable() const { return isAvailable; +} + +Media& Media::setImagePath(const std::string& im) { + this->imagePath = im; + return *this; +} + +const std::string& Media::getImagePath() const { + return imagePath; } \ No newline at end of file diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index 304246d..a53b862 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -9,7 +9,7 @@ class Media{ std::string title; std::string author; std::string genre; - Date relaseDate; + Date releaseDate; unsigned int id; unsigned int kbSize; bool isAvailable; @@ -22,18 +22,21 @@ class Media{ Media(); virtual ~Media() = 0; // Pure virtual destructor - void setTile(const std::string& t); + Media& setTitle(const std::string& t); const std::string& getTitle() const; - void setAuthor(const std::string& a); + Media& setAuthor(const std::string& a); const std::string& getAuthor() const; - void setGenre(const std::string& g); + Media& setGenre(const std::string& g); const std::string& getGenre() const; - void setReleaseDate(const Date& rD); + Media& setReleaseDate(const Date& rD); const Date& getReleaseDate() const; - void setKbSize(unsigned int kb); + Media& setKbSize(unsigned int kb); + Media& setID(unsigned int id); unsigned int getKbSize() const; - void setIsAvailable(bool isAv); + Media& setIsAvailable(bool isAv); bool getIsAvailable() const; + Media& setImagePath(const std::string& im); + const std::string& getImagePath() const; }; #endif // MEDIA_H \ No newline at end of file From 2f5fee4c47326a915978a647ed7e492062c9e41b Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Tue, 5 Aug 2025 12:39:18 +0200 Subject: [PATCH 12/17] Added new methods in Media.cpp and Media.h --- src/Backend/Elements/Media.cpp | 9 +++------ src/Backend/Elements/Media.h | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp index 65e9d5b..b00a2e0 100644 --- a/src/Backend/Elements/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -16,7 +16,6 @@ Media& Media::setTitle(const std::string& t) { this->title = t; return *this; } - const std::string& Media::getTitle() const { return title; } @@ -33,7 +32,6 @@ Media& Media::setGenre(const std::string& g) { this->genre = g; return *this; } - const std::string& Media::getGenre() const { return genre; } @@ -42,7 +40,6 @@ Media& Media::setReleaseDate(const Date& rD) { this->releaseDate = rD; return *this; } - const Date& Media::getReleaseDate() const { return releaseDate; } @@ -51,12 +48,14 @@ Media& Media::setID(unsigned int id) { this->id = id; return *this; } +unsigned int Media::getID() const { + return id; +} Media& Media::setKbSize(unsigned int kb) { this->kbSize = kb; return *this; } - unsigned int Media::getKbSize() const { return kbSize; } @@ -65,7 +64,6 @@ Media& Media::setIsAvailable(bool isAv) { this->isAvailable = isAv; return *this; } - bool Media::getIsAvailable() const { return isAvailable; } @@ -74,7 +72,6 @@ Media& Media::setImagePath(const std::string& im) { this->imagePath = im; return *this; } - const std::string& Media::getImagePath() const { return imagePath; } \ No newline at end of file diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index a53b862..9a9bd04 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -30,8 +30,9 @@ class Media{ const std::string& getGenre() const; Media& setReleaseDate(const Date& rD); const Date& getReleaseDate() const; - Media& setKbSize(unsigned int kb); Media& setID(unsigned int id); + unsigned int getID() const; + Media& setKbSize(unsigned int kb); unsigned int getKbSize() const; Media& setIsAvailable(bool isAv); bool getIsAvailable() const; From ffdef60271aef2fa51a40f8f4cd486a62396c983 Mon Sep 17 00:00:00 2001 From: DavideColabove Date: Tue, 5 Aug 2025 17:43:16 +0200 Subject: [PATCH 13/17] Added Movie.h and Movie.cpp --- src/Backend/Elements/Media.h | 2 +- src/Backend/Elements/Movie.cpp | 40 ++++++++++++++++++++++++++++++++++ src/Backend/Elements/Movie.h | 28 ++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index 9a9bd04..acf61a5 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -20,7 +20,7 @@ class Media{ Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); Media(const Media& media); Media(); - virtual ~Media() = 0; // Pure virtual destructor + virtual ~Media() = 0; Media& setTitle(const std::string& t); const std::string& getTitle() const; diff --git a/src/Backend/Elements/Movie.cpp b/src/Backend/Elements/Movie.cpp index e69de29..e4567c2 100644 --- a/src/Backend/Elements/Movie.cpp +++ b/src/Backend/Elements/Movie.cpp @@ -0,0 +1,40 @@ +#include "Movie.h" +#include "Date.h" +#include "Media.h" +#include + +Movie::Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang) + : Media(t, a, g, rD, id, kb, isAv, im), director(dir), duration(dur), language(lang) {} + +Movie::Movie(const Movie& movie) + : Media(movie), director(movie.director), duration(movie.duration), language(movie.language) {} + +Movie::Movie() : Media(), director(""), duration(0), language("") {} + +Movie::~Movie() {} + +Movie& Movie::setDirector(const std::string& dir) { + this->director = dir; + return *this; +} +const std::string& Movie::getDirector() const { + return director; +} + +Movie& Movie::setDuration(unsigned int dur) { + this->duration = dur; + return *this; +} +unsigned int Movie::getDuration() const { + return duration; +} + +Movie& Movie::setLanguage(const std::string& lang) { + this->language = lang; + return *this; +} +const std::string& Movie::getLanguage() const { + return language; +} + + diff --git a/src/Backend/Elements/Movie.h b/src/Backend/Elements/Movie.h index e69de29..21a8801 100644 --- a/src/Backend/Elements/Movie.h +++ b/src/Backend/Elements/Movie.h @@ -0,0 +1,28 @@ +#ifndef MOVIE_H +#define MOVIE_H + +#include "Date.h" +#include "Media.h" +#include + +class Movie : public Media { + private: + std::string director; + unsigned int duration; + std::string language; + + public: + Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang); + Movie(const Movie& movie); + Movie(); + ~Movie(); + + Movie& setDirector(const std::string& dir); + const std::string& getDirector() const; + Movie& setDuration(unsigned int dur); + unsigned int getDuration() const; + Movie& setLanguage(const std::string& lang); + const std::string& getLanguage() const; +}; + +#endif // MOVIE_H \ No newline at end of file From 8737042a83c4fcabe0aae33dac15ab1a5b74256c Mon Sep 17 00:00:00 2001 From: m4hd1-exe Date: Wed, 6 Aug 2025 17:12:05 +0200 Subject: [PATCH 14/17] - Modified abstract Media base class with virtual destructor - Implemented derived classes: Book, Movie, Song, Magazine, Podcast - Added custom Date class with validation and formatting - Created scoped enums for genres (BookGenre, MovieGenre, MusicGenre, etc.) and languages - Added enum-string conversion functions for GUI integration --- src/Backend/Elements/Book.cpp | 79 ++++++++ src/Backend/Elements/Book.h | 46 +++++ src/Backend/Elements/Date.cpp | 128 ++++++++---- src/Backend/Elements/Date.h | 61 +++--- src/Backend/Elements/Magazine.cpp | 94 +++++++++ src/Backend/Elements/Magazine.h | 51 +++++ src/Backend/Elements/Media.cpp | 17 +- src/Backend/Elements/Media.h | 15 +- src/Backend/Elements/Movie.cpp | 93 +++++++-- src/Backend/Elements/Movie.h | 47 +++-- src/Backend/Elements/Podcast.cpp | 95 +++++++++ src/Backend/Elements/Podcast.h | 51 +++++ src/Backend/Elements/Song.cpp | 94 +++++++++ src/Backend/Elements/Song.h | 51 +++++ src/Backend/Enums/Genres.cpp | 310 ++++++++++++++++++++++++++++++ src/Backend/Enums/Genres.h | 159 +++++++++++++++ src/Backend/Enums/Languages.cpp | 159 +++++++++++++++ src/Backend/Enums/Languages.h | 88 +++++++++ src/main.cpp | 88 +++++++++ 19 files changed, 1619 insertions(+), 107 deletions(-) create mode 100644 src/Backend/Enums/Genres.cpp create mode 100644 src/Backend/Enums/Genres.h create mode 100644 src/Backend/Enums/Languages.cpp create mode 100644 src/Backend/Enums/Languages.h diff --git a/src/Backend/Elements/Book.cpp b/src/Backend/Elements/Book.cpp index e69de29..ab59841 100644 --- a/src/Backend/Elements/Book.cpp +++ b/src/Backend/Elements/Book.cpp @@ -0,0 +1,79 @@ +#include "Book.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +// Constructors +Book::Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), pages(pages), isbn(isbn), language(language), genre(genre) {} + +Book::Book(const Book& book) + : Media(book), publisher(book.publisher), pages(book.pages), isbn(book.isbn), language(book.language), genre(book.genre) {} + +Book::Book() : Media(), publisher(""), pages(0), isbn(""), language(Enums::Language::ITALIAN), genre(Enums::BookGenre::FICTION) {} + +Book::~Book() {} + +// Virtual method implementations for non-trivial polymorphism +bool Book::isValid() const { + return !getTitle().empty() && !getAuthor().empty() && !publisher.empty() && + pages > 0 && !isbn.empty(); +} + +// Book-specific getters and setters +std::string Book::getPublisher() const { + return publisher; +} + +Book& Book::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Book::getPages() const { + return pages; +} + +Book& Book::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Book::getIsbn() const { + return isbn; +} + +Book& Book::setIsbn(const std::string& isbn) { + this->isbn = isbn; + return *this; +} + +Enums::Language Book::getLanguage() const { + return language; +} + +Book& Book::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Book::getLanguageString() const { + return Enums::languageToString(language); +} + +// Genre-specific methods +Enums::BookGenre Book::getGenre() const { + return genre; +} + +Book& Book::setGenre(Enums::BookGenre g) { + genre = g; + return *this; +} + +std::string Book::getGenreString() const { + return Enums::bookGenreToString(genre); +} diff --git a/src/Backend/Elements/Book.h b/src/Backend/Elements/Book.h index e69de29..e20f2a8 100644 --- a/src/Backend/Elements/Book.h +++ b/src/Backend/Elements/Book.h @@ -0,0 +1,46 @@ +#ifndef BOOK_H +#define BOOK_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +class Book : public Media { + private: + std::string publisher; + unsigned int pages; + std::string isbn; + Enums::Language language; + Enums::BookGenre genre; + + public: + // Constructors + Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language); + Book(const Book& book); + Book(); + virtual ~Book(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Book-specific getters and setters + std::string getPublisher() const; + Book& setPublisher(const std::string& pub); + unsigned int getPages() const; + Book& setPages(unsigned int p); + std::string getIsbn() const; + Book& setIsbn(const std::string& isbn); + Enums::Language getLanguage() const; + Book& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + + // Genre-specific methods + Enums::BookGenre getGenre() const; + Book& setGenre(Enums::BookGenre genre); + std::string getGenreString() const; +}; + +#endif // BOOK_H diff --git a/src/Backend/Elements/Date.cpp b/src/Backend/Elements/Date.cpp index 4851e18..ecd9104 100644 --- a/src/Backend/Elements/Date.cpp +++ b/src/Backend/Elements/Date.cpp @@ -1,61 +1,123 @@ #include "Date.h" -#include +#include +#include +#include -Date::Date(int d, int m, int y) : day(d), month(m), year(y) {} -Date::Date(const Date& date) : day(date.day), month(date.month), year(date.year) {} -Date::Date() : day(0), month(0), year(0) {} -Date::~Date() {} - -void Date::setDay(int d) { - day = d; +// Constructors +Date::Date(int y, int m, int d) : year(y), month(m), day(d) { + if (!isValid()) { + throw std::invalid_argument("Invalid date"); + } } -int Date::getDay() const { - return day; +Date::Date(const Date& date) : year(date.year), month(date.month), day(date.day) {} + +Date::Date() : year(1900), month(1), day(1) {} + +// Getters and setters +int Date::getYear() const { + return year; } -void Date::setMonth(int m) { - month = m; +Date& Date::setYear(int y) { + year = y; + if (!isValid()) { + throw std::invalid_argument("Invalid year"); + } + return *this; } int Date::getMonth() const { return month; } -void Date::setYear(int y) { - year = y; +Date& Date::setMonth(int m) { + month = m; + if (!isValid()) { + throw std::invalid_argument("Invalid month"); + } + return *this; } -int Date::getYear() const { - return year; +int Date::getDay() const { + return day; +} + +Date& Date::setDay(int d) { + day = d; + if (!isValid()) { + throw std::invalid_argument("Invalid day"); + } + return *this; +} + +// Utility methods +bool Date::isValid() const { + if (year < 1900 || year > 2100) return false; + if (month < 1 || month > 12) return false; + + int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + // Leap year check + if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) { + daysInMonth[1] = 29; + } + + return day >= 1 && day <= daysInMonth[month - 1]; +} + +std::string Date::toString() const { + return toString("YYYY-MM-DD"); } -bool Date::operator==(const Date& d) const { - return (day == d.day && month == d.month && year == d.year); +std::string Date::toString(const std::string& format) const { + std::string result = format; + + // Replace placeholders with actual values + std::string yearStr = std::to_string(year); + std::string monthStr = std::to_string(month); + std::string dayStr = std::to_string(day); + + // Pad with zeros if needed + if (monthStr.length() == 1) monthStr = "0" + monthStr; + if (dayStr.length() == 1) dayStr = "0" + dayStr; + + // Replace YYYY, MM, DD + size_t pos = result.find("YYYY"); + if (pos != std::string::npos) result.replace(pos, 4, yearStr); + + pos = result.find("MM"); + if (pos != std::string::npos) result.replace(pos, 2, monthStr); + + pos = result.find("DD"); + if (pos != std::string::npos) result.replace(pos, 2, dayStr); + + return result; } -bool Date::operator!=(const Date& d) const { - return !(*this == d); +// Operators +bool Date::operator==(const Date& other) const { + return year == other.year && month == other.month && day == other.day; } -bool Date::operator<(const Date& d) const { - if (year != d.year) return year < d.year; - if (month != d.month) return month < d.month; - return day < d.day; +bool Date::operator!=(const Date& other) const { + return !(*this == other); } -bool Date::operator>(const Date& d) const { - return d < *this; +bool Date::operator<(const Date& other) const { + if (year != other.year) return year < other.year; + if (month != other.month) return month < other.month; + return day < other.day; } -bool Date::operator<=(const Date& d) const { - return !(*this > d); +bool Date::operator>(const Date& other) const { + return other < *this; } -bool Date::operator>=(const Date& d) const { - return !(*this < d); +bool Date::operator<=(const Date& other) const { + return *this < other || *this == other; } -void Date::printDate() const { - std::cout << day << "/" << month << "/" << year << std::endl; -} \ No newline at end of file +bool Date::operator>=(const Date& other) const { + return *this > other || *this == other; +} \ No newline at end of file diff --git a/src/Backend/Elements/Date.h b/src/Backend/Elements/Date.h index 3eec758..d860175 100644 --- a/src/Backend/Elements/Date.h +++ b/src/Backend/Elements/Date.h @@ -1,33 +1,40 @@ #ifndef DATE_H #define DATE_H -#include -class Date { - protected: - int day; - int month; - int year; - - public: - Date(int d, int m, int y); - Date(const Date& date); - Date(); - virtual ~Date(); +#include - void setDay(int d); - int getDay() const; - void setMonth(int m); - int getMonth() const; - void setYear(int y); - int getYear() const; - bool operator==(const Date& d) const; - bool operator!=(const Date& d) const; - bool operator<(const Date& d) const; - bool operator>(const Date& d) const; - bool operator<=(const Date& d) const; - bool operator>=(const Date& d) const; - - void printDate() const; +class Date { +private: + int year; + int month; + int day; + +public: + // Constructors + Date(int y, int m, int d); + Date(const Date& date); + Date(); + + // Getters and setters + int getYear() const; + Date& setYear(int y); + int getMonth() const; + Date& setMonth(int m); + int getDay() const; + Date& setDay(int d); + + // Utility methods + bool isValid() const; + std::string toString() const; + std::string toString(const std::string& format) const; // format: "YYYY-MM-DD", "DD/MM/YYYY", etc. + + // Operators + bool operator==(const Date& other) const; + bool operator!=(const Date& other) const; + bool operator<(const Date& other) const; + bool operator>(const Date& other) const; + bool operator<=(const Date& other) const; + bool operator>=(const Date& other) const; }; -#endif \ No newline at end of file +#endif // DATE_H \ No newline at end of file diff --git a/src/Backend/Elements/Magazine.cpp b/src/Backend/Elements/Magazine.cpp index e69de29..c56d3d4 100644 --- a/src/Backend/Elements/Magazine.cpp +++ b/src/Backend/Elements/Magazine.cpp @@ -0,0 +1,94 @@ +#include "Magazine.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Magazine::Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), issueNumber(issueNumber), issn(issn), editor(editor), pages(pages), frequency(frequency), genre(genre) {} + +Magazine::Magazine(const Magazine& magazine) + : Media(magazine), publisher(magazine.publisher), issueNumber(magazine.issueNumber), issn(magazine.issn), + editor(magazine.editor), pages(magazine.pages), frequency(magazine.frequency), genre(magazine.genre) {} + +Magazine::Magazine() : Media(), publisher(""), issueNumber(0), issn(""), editor(""), pages(0), frequency(""), genre(Enums::MagazineGenre::NEWS) {} + +Magazine::~Magazine() {} + +// Virtual method implementations for non-trivial polymorphism +bool Magazine::isValid() const { + return !getTitle().empty() && !publisher.empty() && issueNumber > 0 && + !issn.empty() && !editor.empty() && pages > 0 && !frequency.empty(); +} + +// Magazine-specific getters and setters +std::string Magazine::getPublisher() const { + return publisher; +} + +Magazine& Magazine::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Magazine::getIssueNumber() const { + return issueNumber; +} + +Magazine& Magazine::setIssueNumber(unsigned int issue) { + issueNumber = issue; + return *this; +} + +std::string Magazine::getIssn() const { + return issn; +} + +Magazine& Magazine::setIssn(const std::string& issn) { + this->issn = issn; + return *this; +} + +std::string Magazine::getEditor() const { + return editor; +} + +Magazine& Magazine::setEditor(const std::string& ed) { + editor = ed; + return *this; +} + +unsigned int Magazine::getPages() const { + return pages; +} + +Magazine& Magazine::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Magazine::getFrequency() const { + return frequency; +} + +Magazine& Magazine::setFrequency(const std::string& freq) { + frequency = freq; + return *this; +} + +// Genre-specific methods +Enums::MagazineGenre Magazine::getGenre() const { + return genre; +} + +Magazine& Magazine::setGenre(Enums::MagazineGenre g) { + genre = g; + return *this; +} + +std::string Magazine::getGenreString() const { + return Enums::magazineGenreToString(genre); +} diff --git a/src/Backend/Elements/Magazine.h b/src/Backend/Elements/Magazine.h index e69de29..db92de2 100644 --- a/src/Backend/Elements/Magazine.h +++ b/src/Backend/Elements/Magazine.h @@ -0,0 +1,51 @@ +#ifndef MAGAZINE_H +#define MAGAZINE_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Magazine : public Media { + private: + std::string publisher; + unsigned int issueNumber; + std::string issn; + std::string editor; + unsigned int pages; + std::string frequency; // Monthly, Weekly, etc. + Enums::MagazineGenre genre; + + public: + // Constructors + Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency); + Magazine(const Magazine& magazine); + Magazine(); + virtual ~Magazine(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Magazine-specific getters and setters + std::string getPublisher() const; + Magazine& setPublisher(const std::string& pub); + unsigned int getIssueNumber() const; + Magazine& setIssueNumber(unsigned int issue); + std::string getIssn() const; + Magazine& setIssn(const std::string& issn); + std::string getEditor() const; + Magazine& setEditor(const std::string& ed); + unsigned int getPages() const; + Magazine& setPages(unsigned int p); + std::string getFrequency() const; + Magazine& setFrequency(const std::string& freq); + + // Genre-specific methods + Enums::MagazineGenre getGenre() const; + Magazine& setGenre(Enums::MagazineGenre genre); + std::string getGenreString() const; +}; + +#endif // MAGAZINE_H diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp index b00a2e0..e21d56e 100644 --- a/src/Backend/Elements/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -1,16 +1,15 @@ #include "Media.h" -#include "Date.h" #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} +Media::Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} -Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), genre(media.genre), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} +Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} + +Media::Media() : title(""), id(0), author(""), releaseDate(), kbSize(0), isAvailable(false), imagePath("") {} -Media::Media() : title(""), id(0), author(""), genre(""), releaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} -Media::~Media() {} Media& Media::setTitle(const std::string& t) { this->title = t; @@ -28,13 +27,7 @@ const std::string& Media::getAuthor() const { return author; } -Media& Media::setGenre(const std::string& g) { - this->genre = g; - return *this; -} -const std::string& Media::getGenre() const { - return genre; -} + Media& Media::setReleaseDate(const Date& rD) { this->releaseDate = rD; diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index acf61a5..52e3c9a 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -3,31 +3,32 @@ #include #include "Date.h" +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" class Media{ protected: std::string title; std::string author; - std::string genre; + // Genre will be handled by derived classes with specific enum types Date releaseDate; unsigned int id; unsigned int kbSize; bool isAvailable; std::string imagePath; - //int Rating; - //string Review; public: - Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); + Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); Media(const Media& media); Media(); - virtual ~Media() = 0; + virtual ~Media() = default; // Virtual destructor + + // Virtual methods for non-trivial polymorphism + virtual bool isValid() const = 0; // Validates media-specific attributes Media& setTitle(const std::string& t); const std::string& getTitle() const; Media& setAuthor(const std::string& a); const std::string& getAuthor() const; - Media& setGenre(const std::string& g); - const std::string& getGenre() const; Media& setReleaseDate(const Date& rD); const Date& getReleaseDate() const; Media& setID(unsigned int id); diff --git a/src/Backend/Elements/Movie.cpp b/src/Backend/Elements/Movie.cpp index e4567c2..07489e9 100644 --- a/src/Backend/Elements/Movie.cpp +++ b/src/Backend/Elements/Movie.cpp @@ -1,40 +1,99 @@ #include "Movie.h" -#include "Date.h" -#include "Media.h" -#include +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" -Movie::Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang) - : Media(t, a, g, rD, id, kb, isAv, im), director(dir), duration(dur), language(lang) {} +// Constructors +Movie::Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + director(director), duration(duration), studio(studio), rating(rating), language(language), country(country), genre(genre) {} -Movie::Movie(const Movie& movie) - : Media(movie), director(movie.director), duration(movie.duration), language(movie.language) {} +Movie::Movie(const Movie& movie) + : Media(movie), director(movie.director), duration(movie.duration), studio(movie.studio), + rating(movie.rating), language(movie.language), country(movie.country), genre(movie.genre) {} -Movie::Movie() : Media(), director(""), duration(0), language("") {} +Movie::Movie() : Media(), director(""), duration(0), studio(""), rating(""), language(Enums::Language::ENGLISH), country(""), genre(Enums::MovieGenre::DRAMA) {} Movie::~Movie() {} -Movie& Movie::setDirector(const std::string& dir) { - this->director = dir; - return *this; +// Virtual method implementations for non-trivial polymorphism +bool Movie::isValid() const { + return !getTitle().empty() && !director.empty() && !studio.empty() && + duration > 0 && !rating.empty() && !country.empty(); } -const std::string& Movie::getDirector() const { + +// Movie-specific getters and setters +std::string Movie::getDirector() const { return director; } -Movie& Movie::setDuration(unsigned int dur) { - this->duration = dur; +Movie& Movie::setDirector(const std::string& dir) { + director = dir; return *this; } + unsigned int Movie::getDuration() const { return duration; } -Movie& Movie::setLanguage(const std::string& lang) { - this->language = lang; +Movie& Movie::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Movie::getStudio() const { + return studio; +} + +Movie& Movie::setStudio(const std::string& stu) { + studio = stu; + return *this; +} + +std::string Movie::getRating() const { + return rating; +} + +Movie& Movie::setRating(const std::string& rat) { + rating = rat; return *this; } -const std::string& Movie::getLanguage() const { + +Enums::Language Movie::getLanguage() const { return language; } +Movie& Movie::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Movie::getLanguageString() const { + return Enums::languageToString(language); +} + +std::string Movie::getCountry() const { + return country; +} + +Movie& Movie::setCountry(const std::string& cou) { + country = cou; + return *this; +} + +// Genre-specific methods +Enums::MovieGenre Movie::getGenre() const { + return genre; +} +Movie& Movie::setGenre(Enums::MovieGenre g) { + genre = g; + return *this; +} + +std::string Movie::getGenreString() const { + return Enums::movieGenreToString(genre); +} diff --git a/src/Backend/Elements/Movie.h b/src/Backend/Elements/Movie.h index 21a8801..8664696 100644 --- a/src/Backend/Elements/Movie.h +++ b/src/Backend/Elements/Movie.h @@ -1,28 +1,53 @@ #ifndef MOVIE_H #define MOVIE_H -#include "Date.h" #include "Media.h" -#include +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" class Movie : public Media { private: std::string director; - unsigned int duration; - std::string language; + unsigned int duration; // in minutes + std::string studio; + std::string rating; // PG, PG-13, R, etc. + Enums::Language language; + std::string country; + Enums::MovieGenre genre; public: - Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang); + // Constructors + Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country); Movie(const Movie& movie); Movie(); - ~Movie(); + virtual ~Movie(); + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Movie-specific getters and setters + std::string getDirector() const; Movie& setDirector(const std::string& dir); - const std::string& getDirector() const; - Movie& setDuration(unsigned int dur); unsigned int getDuration() const; - Movie& setLanguage(const std::string& lang); - const std::string& getLanguage() const; + Movie& setDuration(unsigned int dur); + std::string getStudio() const; + Movie& setStudio(const std::string& stu); + std::string getRating() const; + Movie& setRating(const std::string& rat); + Enums::Language getLanguage() const; + Movie& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + std::string getCountry() const; + Movie& setCountry(const std::string& cou); + + // Genre-specific methods + Enums::MovieGenre getGenre() const; + Movie& setGenre(Enums::MovieGenre genre); + std::string getGenreString() const; }; -#endif // MOVIE_H \ No newline at end of file +#endif // MOVIE_H diff --git a/src/Backend/Elements/Podcast.cpp b/src/Backend/Elements/Podcast.cpp index e69de29..604eee2 100644 --- a/src/Backend/Elements/Podcast.cpp +++ b/src/Backend/Elements/Podcast.cpp @@ -0,0 +1,95 @@ +#include "Podcast.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Podcast::Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + host(host), episodeNumber(episodeNumber), platform(platform), duration(duration), + series(series), description(description), genre(genre) {} + +Podcast::Podcast(const Podcast& podcast) + : Media(podcast), host(podcast.host), episodeNumber(podcast.episodeNumber), platform(podcast.platform), + duration(podcast.duration), series(podcast.series), description(podcast.description), genre(podcast.genre) {} + +Podcast::Podcast() : Media(), host(""), episodeNumber(0), platform(""), duration(0), series(""), description(""), genre(Enums::PodcastGenre::EDUCATION) {} + +Podcast::~Podcast() {} + +// Virtual method implementations for non-trivial polymorphism +bool Podcast::isValid() const { + return !getTitle().empty() && !host.empty() && episodeNumber > 0 && + !platform.empty() && duration > 0 && !series.empty() && !description.empty(); +} + +// Podcast-specific getters and setters +std::string Podcast::getHost() const { + return host; +} + +Podcast& Podcast::setHost(const std::string& h) { + host = h; + return *this; +} + +unsigned int Podcast::getEpisodeNumber() const { + return episodeNumber; +} + +Podcast& Podcast::setEpisodeNumber(unsigned int ep) { + episodeNumber = ep; + return *this; +} + +std::string Podcast::getPlatform() const { + return platform; +} + +Podcast& Podcast::setPlatform(const std::string& plat) { + platform = plat; + return *this; +} + +unsigned int Podcast::getDuration() const { + return duration; +} + +Podcast& Podcast::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Podcast::getSeries() const { + return series; +} + +Podcast& Podcast::setSeries(const std::string& ser) { + series = ser; + return *this; +} + +std::string Podcast::getDescription() const { + return description; +} + +Podcast& Podcast::setDescription(const std::string& desc) { + description = desc; + return *this; +} + +// Genre-specific methods +Enums::PodcastGenre Podcast::getGenre() const { + return genre; +} + +Podcast& Podcast::setGenre(Enums::PodcastGenre g) { + genre = g; + return *this; +} + +std::string Podcast::getGenreString() const { + return Enums::podcastGenreToString(genre); +} diff --git a/src/Backend/Elements/Podcast.h b/src/Backend/Elements/Podcast.h index e69de29..e0f6d96 100644 --- a/src/Backend/Elements/Podcast.h +++ b/src/Backend/Elements/Podcast.h @@ -0,0 +1,51 @@ +#ifndef PODCAST_H +#define PODCAST_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Podcast : public Media { + private: + std::string host; + unsigned int episodeNumber; + std::string platform; // Spotify, Apple Podcasts, etc. + unsigned int duration; // in minutes + std::string series; + std::string description; + Enums::PodcastGenre genre; + + public: + // Constructors + Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description); + Podcast(const Podcast& podcast); + Podcast(); + virtual ~Podcast(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Podcast-specific getters and setters + std::string getHost() const; + Podcast& setHost(const std::string& h); + unsigned int getEpisodeNumber() const; + Podcast& setEpisodeNumber(unsigned int ep); + std::string getPlatform() const; + Podcast& setPlatform(const std::string& plat); + unsigned int getDuration() const; + Podcast& setDuration(unsigned int dur); + std::string getSeries() const; + Podcast& setSeries(const std::string& ser); + std::string getDescription() const; + Podcast& setDescription(const std::string& desc); + + // Genre-specific methods + Enums::PodcastGenre getGenre() const; + Podcast& setGenre(Enums::PodcastGenre genre); + std::string getGenreString() const; +}; + +#endif // PODCAST_H diff --git a/src/Backend/Elements/Song.cpp b/src/Backend/Elements/Song.cpp index e69de29..796c4e9 100644 --- a/src/Backend/Elements/Song.cpp +++ b/src/Backend/Elements/Song.cpp @@ -0,0 +1,94 @@ +#include "Song.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Song::Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + artist(artist), album(album), duration(duration), format(format), label(label), trackNumber(trackNumber), genre(genre) {} + +Song::Song(const Song& song) + : Media(song), artist(song.artist), album(song.album), duration(song.duration), + format(song.format), label(song.label), trackNumber(song.trackNumber), genre(song.genre) {} + +Song::Song() : Media(), artist(""), album(""), duration(0), format(""), label(""), trackNumber(0), genre(Enums::MusicGenre::POP) {} + +Song::~Song() {} + +// Virtual method implementations for non-trivial polymorphism +bool Song::isValid() const { + return !getTitle().empty() && !artist.empty() && !album.empty() && + duration > 0 && !format.empty() && !label.empty() && trackNumber > 0; +} + +// Song-specific getters and setters +std::string Song::getArtist() const { + return artist; +} + +Song& Song::setArtist(const std::string& art) { + artist = art; + return *this; +} + +std::string Song::getAlbum() const { + return album; +} + +Song& Song::setAlbum(const std::string& alb) { + album = alb; + return *this; +} + +unsigned int Song::getDuration() const { + return duration; +} + +Song& Song::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Song::getFormat() const { + return format; +} + +Song& Song::setFormat(const std::string& fmt) { + format = fmt; + return *this; +} + +std::string Song::getLabel() const { + return label; +} + +Song& Song::setLabel(const std::string& lab) { + label = lab; + return *this; +} + +unsigned int Song::getTrackNumber() const { + return trackNumber; +} + +Song& Song::setTrackNumber(unsigned int track) { + trackNumber = track; + return *this; +} + +// Genre-specific methods +Enums::MusicGenre Song::getGenre() const { + return genre; +} + +Song& Song::setGenre(Enums::MusicGenre g) { + genre = g; + return *this; +} + +std::string Song::getGenreString() const { + return Enums::musicGenreToString(genre); +} diff --git a/src/Backend/Elements/Song.h b/src/Backend/Elements/Song.h index e69de29..c620674 100644 --- a/src/Backend/Elements/Song.h +++ b/src/Backend/Elements/Song.h @@ -0,0 +1,51 @@ +#ifndef SONG_H +#define SONG_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Song : public Media { + private: + std::string artist; + std::string album; + unsigned int duration; // in seconds + std::string format; // MP3, FLAC, WAV, etc. + std::string label; + unsigned int trackNumber; + Enums::MusicGenre genre; + + public: + // Constructors + Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber); + Song(const Song& song); + Song(); + virtual ~Song(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Song-specific getters and setters + std::string getArtist() const; + Song& setArtist(const std::string& art); + std::string getAlbum() const; + Song& setAlbum(const std::string& alb); + unsigned int getDuration() const; + Song& setDuration(unsigned int dur); + std::string getFormat() const; + Song& setFormat(const std::string& fmt); + std::string getLabel() const; + Song& setLabel(const std::string& lab); + unsigned int getTrackNumber() const; + Song& setTrackNumber(unsigned int track); + + // Genre-specific methods + Enums::MusicGenre getGenre() const; + Song& setGenre(Enums::MusicGenre genre); + std::string getGenreString() const; +}; + +#endif // SONG_H diff --git a/src/Backend/Enums/Genres.cpp b/src/Backend/Enums/Genres.cpp new file mode 100644 index 0000000..90ae8e3 --- /dev/null +++ b/src/Backend/Enums/Genres.cpp @@ -0,0 +1,310 @@ +#include "Genres.h" +#include + +namespace Enums { + + std::string musicGenreToString(MusicGenre genre) { + static const std::map genreMap = { + {MusicGenre::ROCK, "Rock"}, + {MusicGenre::POP, "Pop"}, + {MusicGenre::JAZZ, "Jazz"}, + {MusicGenre::CLASSICAL, "Classical"}, + {MusicGenre::HIP_HOP, "Hip Hop"}, + {MusicGenre::ELECTRONIC, "Electronic"}, + {MusicGenre::COUNTRY, "Country"}, + {MusicGenre::FOLK, "Folk"}, + {MusicGenre::BLUES, "Blues"}, + {MusicGenre::REGGAE, "Reggae"}, + {MusicGenre::METAL, "Metal"}, + {MusicGenre::PUNK, "Punk"}, + {MusicGenre::INDIE, "Indie"}, + {MusicGenre::RAP, "Rap"}, + {MusicGenre::SOUL, "Soul"}, + {MusicGenre::FUNK, "Funk"}, + {MusicGenre::DISCO, "Disco"}, + {MusicGenre::GOSPEL, "Gospel"}, + {MusicGenre::LATIN, "Latin"}, + {MusicGenre::WORLD_MUSIC, "World Music"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre) { + static const std::map genreMap = { + {"Rock", MusicGenre::ROCK}, + {"Pop", MusicGenre::POP}, + {"Jazz", MusicGenre::JAZZ}, + {"Classical", MusicGenre::CLASSICAL}, + {"Hip Hop", MusicGenre::HIP_HOP}, + {"Electronic", MusicGenre::ELECTRONIC}, + {"Country", MusicGenre::COUNTRY}, + {"Folk", MusicGenre::FOLK}, + {"Blues", MusicGenre::BLUES}, + {"Reggae", MusicGenre::REGGAE}, + {"Metal", MusicGenre::METAL}, + {"Punk", MusicGenre::PUNK}, + {"Indie", MusicGenre::INDIE}, + {"Rap", MusicGenre::RAP}, + {"Soul", MusicGenre::SOUL}, + {"Funk", MusicGenre::FUNK}, + {"Disco", MusicGenre::DISCO}, + {"Gospel", MusicGenre::GOSPEL}, + {"Latin", MusicGenre::LATIN}, + {"World Music", MusicGenre::WORLD_MUSIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MusicGenre::ROCK; + } + + std::string bookGenreToString(BookGenre genre) { + static const std::map genreMap = { + {BookGenre::FICTION, "Fiction"}, + {BookGenre::NON_FICTION, "Non-Fiction"}, + {BookGenre::MYSTERY, "Mystery"}, + {BookGenre::THRILLER, "Thriller"}, + {BookGenre::ROMANCE, "Romance"}, + {BookGenre::SCIENCE_FICTION, "Science Fiction"}, + {BookGenre::FANTASY, "Fantasy"}, + {BookGenre::HORROR, "Horror"}, + {BookGenre::HISTORICAL_FICTION, "Historical Fiction"}, + {BookGenre::BIOGRAPHY, "Biography"}, + {BookGenre::AUTOBIOGRAPHY, "Autobiography"}, + {BookGenre::MEMOIR, "Memoir"}, + {BookGenre::SELF_HELP, "Self-Help"}, + {BookGenre::BUSINESS, "Business"}, + {BookGenre::PHILOSOPHY, "Philosophy"}, + {BookGenre::RELIGION, "Religion"}, + {BookGenre::SCIENCE, "Science"}, + {BookGenre::TECHNOLOGY, "Technology"}, + {BookGenre::COOKING, "Cooking"}, + {BookGenre::TRAVEL, "Travel"}, + {BookGenre::POETRY, "Poetry"}, + {BookGenre::DRAMA, "Drama"}, + {BookGenre::CHILDREN, "Children"}, + {BookGenre::YOUNG_ADULT, "Young Adult"}, + {BookGenre::ACADEMIC, "Academic"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + BookGenre stringToBookGenre(const std::string& genre) { + static const std::map genreMap = { + {"Fiction", BookGenre::FICTION}, + {"Non-Fiction", BookGenre::NON_FICTION}, + {"Mystery", BookGenre::MYSTERY}, + {"Thriller", BookGenre::THRILLER}, + {"Romance", BookGenre::ROMANCE}, + {"Science Fiction", BookGenre::SCIENCE_FICTION}, + {"Fantasy", BookGenre::FANTASY}, + {"Horror", BookGenre::HORROR}, + {"Historical Fiction", BookGenre::HISTORICAL_FICTION}, + {"Biography", BookGenre::BIOGRAPHY}, + {"Autobiography", BookGenre::AUTOBIOGRAPHY}, + {"Memoir", BookGenre::MEMOIR}, + {"Self-Help", BookGenre::SELF_HELP}, + {"Business", BookGenre::BUSINESS}, + {"Philosophy", BookGenre::PHILOSOPHY}, + {"Religion", BookGenre::RELIGION}, + {"Science", BookGenre::SCIENCE}, + {"Technology", BookGenre::TECHNOLOGY}, + {"Cooking", BookGenre::COOKING}, + {"Travel", BookGenre::TRAVEL}, + {"Poetry", BookGenre::POETRY}, + {"Drama", BookGenre::DRAMA}, + {"Children", BookGenre::CHILDREN}, + {"Young Adult", BookGenre::YOUNG_ADULT}, + {"Academic", BookGenre::ACADEMIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : BookGenre::FICTION; + } + + std::string movieGenreToString(MovieGenre genre) { + static const std::map genreMap = { + {MovieGenre::ACTION, "Action"}, + {MovieGenre::ADVENTURE, "Adventure"}, + {MovieGenre::COMEDY, "Comedy"}, + {MovieGenre::DRAMA, "Drama"}, + {MovieGenre::HORROR, "Horror"}, + {MovieGenre::THRILLER, "Thriller"}, + {MovieGenre::SCIENCE_FICTION, "Science Fiction"}, + {MovieGenre::FANTASY, "Fantasy"}, + {MovieGenre::ROMANCE, "Romance"}, + {MovieGenre::MYSTERY, "Mystery"}, + {MovieGenre::CRIME, "Crime"}, + {MovieGenre::WESTERN, "Western"}, + {MovieGenre::WAR, "War"}, + {MovieGenre::HISTORICAL, "Historical"}, + {MovieGenre::DOCUMENTARY, "Documentary"}, + {MovieGenre::ANIMATION, "Animation"}, + {MovieGenre::FAMILY, "Family"}, + {MovieGenre::MUSICAL, "Musical"}, + {MovieGenre::SPORTS, "Sports"}, + {MovieGenre::BIOGRAPHY, "Biography"}, + {MovieGenre::FILM_NOIR, "Film Noir"}, + {MovieGenre::EXPERIMENTAL, "Experimental"}, + {MovieGenre::SHORT_FILM, "Short Film"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MovieGenre stringToMovieGenre(const std::string& genre) { + static const std::map genreMap = { + {"Action", MovieGenre::ACTION}, + {"Adventure", MovieGenre::ADVENTURE}, + {"Comedy", MovieGenre::COMEDY}, + {"Drama", MovieGenre::DRAMA}, + {"Horror", MovieGenre::HORROR}, + {"Thriller", MovieGenre::THRILLER}, + {"Science Fiction", MovieGenre::SCIENCE_FICTION}, + {"Fantasy", MovieGenre::FANTASY}, + {"Romance", MovieGenre::ROMANCE}, + {"Mystery", MovieGenre::MYSTERY}, + {"Crime", MovieGenre::CRIME}, + {"Western", MovieGenre::WESTERN}, + {"War", MovieGenre::WAR}, + {"Historical", MovieGenre::HISTORICAL}, + {"Documentary", MovieGenre::DOCUMENTARY}, + {"Animation", MovieGenre::ANIMATION}, + {"Family", MovieGenre::FAMILY}, + {"Musical", MovieGenre::MUSICAL}, + {"Sports", MovieGenre::SPORTS}, + {"Biography", MovieGenre::BIOGRAPHY}, + {"Film Noir", MovieGenre::FILM_NOIR}, + {"Experimental", MovieGenre::EXPERIMENTAL}, + {"Short Film", MovieGenre::SHORT_FILM} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MovieGenre::DRAMA; + } + + std::string magazineGenreToString(MagazineGenre genre) { + static const std::map genreMap = { + {MagazineGenre::NEWS, "News"}, + {MagazineGenre::POLITICS, "Politics"}, + {MagazineGenre::BUSINESS, "Business"}, + {MagazineGenre::TECHNOLOGY, "Technology"}, + {MagazineGenre::SCIENCE, "Science"}, + {MagazineGenre::HEALTH, "Health"}, + {MagazineGenre::FITNESS, "Fitness"}, + {MagazineGenre::FOOD, "Food"}, + {MagazineGenre::TRAVEL, "Travel"}, + {MagazineGenre::FASHION, "Fashion"}, + {MagazineGenre::BEAUTY, "Beauty"}, + {MagazineGenre::HOME, "Home"}, + {MagazineGenre::GARDEN, "Garden"}, + {MagazineGenre::AUTOMOTIVE, "Automotive"}, + {MagazineGenre::SPORTS, "Sports"}, + {MagazineGenre::ENTERTAINMENT, "Entertainment"}, + {MagazineGenre::ARTS, "Arts"}, + {MagazineGenre::LITERATURE, "Literature"}, + {MagazineGenre::EDUCATION, "Education"}, + {MagazineGenre::ACADEMIC, "Academic"}, + {MagazineGenre::TRADE, "Trade"}, + {MagazineGenre::HOBBIES, "Hobbies"}, + {MagazineGenre::CRAFTS, "Crafts"}, + {MagazineGenre::PHOTOGRAPHY, "Photography"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MagazineGenre stringToMagazineGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", MagazineGenre::NEWS}, + {"Politics", MagazineGenre::POLITICS}, + {"Business", MagazineGenre::BUSINESS}, + {"Technology", MagazineGenre::TECHNOLOGY}, + {"Science", MagazineGenre::SCIENCE}, + {"Health", MagazineGenre::HEALTH}, + {"Fitness", MagazineGenre::FITNESS}, + {"Food", MagazineGenre::FOOD}, + {"Travel", MagazineGenre::TRAVEL}, + {"Fashion", MagazineGenre::FASHION}, + {"Beauty", MagazineGenre::BEAUTY}, + {"Home", MagazineGenre::HOME}, + {"Garden", MagazineGenre::GARDEN}, + {"Automotive", MagazineGenre::AUTOMOTIVE}, + {"Sports", MagazineGenre::SPORTS}, + {"Entertainment", MagazineGenre::ENTERTAINMENT}, + {"Arts", MagazineGenre::ARTS}, + {"Literature", MagazineGenre::LITERATURE}, + {"Education", MagazineGenre::EDUCATION}, + {"Academic", MagazineGenre::ACADEMIC}, + {"Trade", MagazineGenre::TRADE}, + {"Hobbies", MagazineGenre::HOBBIES}, + {"Crafts", MagazineGenre::CRAFTS}, + {"Photography", MagazineGenre::PHOTOGRAPHY} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MagazineGenre::NEWS; + } + + std::string podcastGenreToString(PodcastGenre genre) { + static const std::map genreMap = { + {PodcastGenre::NEWS, "News"}, + {PodcastGenre::POLITICS, "Politics"}, + {PodcastGenre::BUSINESS, "Business"}, + {PodcastGenre::TECHNOLOGY, "Technology"}, + {PodcastGenre::SCIENCE, "Science"}, + {PodcastGenre::HEALTH, "Health"}, + {PodcastGenre::FITNESS, "Fitness"}, + {PodcastGenre::EDUCATION, "Education"}, + {PodcastGenre::HISTORY, "History"}, + {PodcastGenre::TRUE_CRIME, "True Crime"}, + {PodcastGenre::COMEDY, "Comedy"}, + {PodcastGenre::ENTERTAINMENT, "Entertainment"}, + {PodcastGenre::SPORTS, "Sports"}, + {PodcastGenre::ARTS, "Arts"}, + {PodcastGenre::LITERATURE, "Literature"}, + {PodcastGenre::PHILOSOPHY, "Philosophy"}, + {PodcastGenre::RELIGION, "Religion"}, + {PodcastGenre::SELF_HELP, "Self-Help"}, + {PodcastGenre::INTERVIEW, "Interview"}, + {PodcastGenre::STORYTELLING, "Storytelling"}, + {PodcastGenre::MUSIC, "Music"}, + {PodcastGenre::FOOD, "Food"}, + {PodcastGenre::TRAVEL, "Travel"}, + {PodcastGenre::PARENTING, "Parenting"}, + {PodcastGenre::GAMING, "Gaming"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + PodcastGenre stringToPodcastGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", PodcastGenre::NEWS}, + {"Politics", PodcastGenre::POLITICS}, + {"Business", PodcastGenre::BUSINESS}, + {"Technology", PodcastGenre::TECHNOLOGY}, + {"Science", PodcastGenre::SCIENCE}, + {"Health", PodcastGenre::HEALTH}, + {"Fitness", PodcastGenre::FITNESS}, + {"Education", PodcastGenre::EDUCATION}, + {"History", PodcastGenre::HISTORY}, + {"True Crime", PodcastGenre::TRUE_CRIME}, + {"Comedy", PodcastGenre::COMEDY}, + {"Entertainment", PodcastGenre::ENTERTAINMENT}, + {"Sports", PodcastGenre::SPORTS}, + {"Arts", PodcastGenre::ARTS}, + {"Literature", PodcastGenre::LITERATURE}, + {"Philosophy", PodcastGenre::PHILOSOPHY}, + {"Religion", PodcastGenre::RELIGION}, + {"Self-Help", PodcastGenre::SELF_HELP}, + {"Interview", PodcastGenre::INTERVIEW}, + {"Storytelling", PodcastGenre::STORYTELLING}, + {"Music", PodcastGenre::MUSIC}, + {"Food", PodcastGenre::FOOD}, + {"Travel", PodcastGenre::TRAVEL}, + {"Parenting", PodcastGenre::PARENTING}, + {"Gaming", PodcastGenre::GAMING} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : PodcastGenre::EDUCATION; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Genres.h b/src/Backend/Enums/Genres.h new file mode 100644 index 0000000..4f36855 --- /dev/null +++ b/src/Backend/Enums/Genres.h @@ -0,0 +1,159 @@ +#ifndef GENRES_H +#define GENRES_H + +#include + +namespace Enums { + // Music genres + enum class MusicGenre { + ROCK, + POP, + JAZZ, + CLASSICAL, + HIP_HOP, + ELECTRONIC, + COUNTRY, + FOLK, + BLUES, + REGGAE, + METAL, + PUNK, + INDIE, + RAP, + SOUL, + FUNK, + DISCO, + GOSPEL, + LATIN, + WORLD_MUSIC + }; + + // Book genres + enum class BookGenre { + FICTION, + NON_FICTION, + MYSTERY, + THRILLER, + ROMANCE, + SCIENCE_FICTION, + FANTASY, + HORROR, + HISTORICAL_FICTION, + BIOGRAPHY, + AUTOBIOGRAPHY, + MEMOIR, + SELF_HELP, + BUSINESS, + PHILOSOPHY, + RELIGION, + SCIENCE, + TECHNOLOGY, + COOKING, + TRAVEL, + POETRY, + DRAMA, + CHILDREN, + YOUNG_ADULT, + ACADEMIC + }; + + // Movie genres + enum class MovieGenre { + ACTION, + ADVENTURE, + COMEDY, + DRAMA, + HORROR, + THRILLER, + SCIENCE_FICTION, + FANTASY, + ROMANCE, + MYSTERY, + CRIME, + WESTERN, + WAR, + HISTORICAL, + DOCUMENTARY, + ANIMATION, + FAMILY, + MUSICAL, + SPORTS, + BIOGRAPHY, + FILM_NOIR, + EXPERIMENTAL, + SHORT_FILM + }; + + // Magazine genres + enum class MagazineGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + FOOD, + TRAVEL, + FASHION, + BEAUTY, + HOME, + GARDEN, + AUTOMOTIVE, + SPORTS, + ENTERTAINMENT, + ARTS, + LITERATURE, + EDUCATION, + ACADEMIC, + TRADE, + HOBBIES, + CRAFTS, + PHOTOGRAPHY + }; + + // Podcast genres + enum class PodcastGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + EDUCATION, + HISTORY, + TRUE_CRIME, + COMEDY, + ENTERTAINMENT, + SPORTS, + ARTS, + LITERATURE, + PHILOSOPHY, + RELIGION, + SELF_HELP, + INTERVIEW, + STORYTELLING, + MUSIC, + FOOD, + TRAVEL, + PARENTING, + GAMING + }; + + // Helper functions to convert enum to string + std::string musicGenreToString(MusicGenre genre); + std::string bookGenreToString(BookGenre genre); + std::string movieGenreToString(MovieGenre genre); + std::string magazineGenreToString(MagazineGenre genre); + std::string podcastGenreToString(PodcastGenre genre); + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre); + BookGenre stringToBookGenre(const std::string& genre); + MovieGenre stringToMovieGenre(const std::string& genre); + MagazineGenre stringToMagazineGenre(const std::string& genre); + PodcastGenre stringToPodcastGenre(const std::string& genre); +} + +#endif // GENRES_H \ No newline at end of file diff --git a/src/Backend/Enums/Languages.cpp b/src/Backend/Enums/Languages.cpp new file mode 100644 index 0000000..aaf30fb --- /dev/null +++ b/src/Backend/Enums/Languages.cpp @@ -0,0 +1,159 @@ +#include "Languages.h" +#include + +namespace Enums { + + std::string languageToString(Language language) { + static const std::map languageMap = { + {Language::ITALIAN, "Italian"}, + {Language::ENGLISH, "English"}, + {Language::SPANISH, "Spanish"}, + {Language::FRENCH, "French"}, + {Language::GERMAN, "German"}, + {Language::PORTUGUESE, "Portuguese"}, + {Language::RUSSIAN, "Russian"}, + {Language::CHINESE, "Chinese"}, + {Language::JAPANESE, "Japanese"}, + {Language::KOREAN, "Korean"}, + {Language::ARABIC, "Arabic"}, + {Language::HINDI, "Hindi"}, + {Language::DUTCH, "Dutch"}, + {Language::SWEDISH, "Swedish"}, + {Language::NORWEGIAN, "Norwegian"}, + {Language::DANISH, "Danish"}, + {Language::FINNISH, "Finnish"}, + {Language::POLISH, "Polish"}, + {Language::CZECH, "Czech"}, + {Language::HUNGARIAN, "Hungarian"}, + {Language::ROMANIAN, "Romanian"}, + {Language::BULGARIAN, "Bulgarian"}, + {Language::GREEK, "Greek"}, + {Language::TURKISH, "Turkish"}, + {Language::HEBREW, "Hebrew"}, + {Language::PERSIAN, "Persian"}, + {Language::THAI, "Thai"}, + {Language::VIETNAMESE, "Vietnamese"}, + {Language::INDONESIAN, "Indonesian"}, + {Language::MALAY, "Malay"}, + {Language::FILIPINO, "Filipino"}, + {Language::LATIN, "Latin"}, + {Language::ANCIENT_GREEK, "Ancient Greek"}, + {Language::SANSKRIT, "Sanskrit"}, + {Language::OLD_ENGLISH, "Old English"}, + {Language::MIDDLE_ENGLISH, "Middle English"}, + {Language::OLD_FRENCH, "Old French"}, + {Language::OLD_GERMAN, "Old German"}, + {Language::OLD_ITALIAN, "Old Italian"}, + {Language::OLD_SPANISH, "Old Spanish"}, + {Language::OLD_PORTUGUESE, "Old Portuguese"}, + {Language::OLD_RUSSIAN, "Old Russian"}, + {Language::OLD_CHINESE, "Old Chinese"}, + {Language::OLD_JAPANESE, "Old Japanese"}, + {Language::OLD_KOREAN, "Old Korean"}, + {Language::OLD_ARABIC, "Old Arabic"}, + {Language::OLD_HINDI, "Old Hindi"}, + {Language::OLD_DUTCH, "Old Dutch"}, + {Language::OLD_SWEDISH, "Old Swedish"}, + {Language::OLD_NORWEGIAN, "Old Norwegian"}, + {Language::OLD_DANISH, "Old Danish"}, + {Language::OLD_FINNISH, "Old Finnish"}, + {Language::OLD_POLISH, "Old Polish"}, + {Language::OLD_CZECH, "Old Czech"}, + {Language::OLD_HUNGARIAN, "Old Hungarian"}, + {Language::OLD_ROMANIAN, "Old Romanian"}, + {Language::OLD_BULGARIAN, "Old Bulgarian"}, + {Language::OLD_GREEK, "Old Greek"}, + {Language::OLD_TURKISH, "Old Turkish"}, + {Language::OLD_HEBREW, "Old Hebrew"}, + {Language::OLD_PERSIAN, "Old Persian"}, + {Language::OLD_THAI, "Old Thai"}, + {Language::OLD_VIETNAMESE, "Old Vietnamese"}, + {Language::OLD_INDONESIAN, "Old Indonesian"}, + {Language::OLD_MALAY, "Old Malay"}, + {Language::OLD_FILIPINO, "Old Filipino"}, + {Language::OLD_LATIN, "Old Latin"}, + {Language::OLD_ANCIENT_GREEK, "Old Ancient Greek"}, + {Language::OLD_SANSKRIT, "Old Sanskrit"}, + {Language::OTHER, "Other"} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : "Unknown"; + } + + Language stringToLanguage(const std::string& language) { + static const std::map languageMap = { + {"Italian", Language::ITALIAN}, + {"English", Language::ENGLISH}, + {"Spanish", Language::SPANISH}, + {"French", Language::FRENCH}, + {"German", Language::GERMAN}, + {"Portuguese", Language::PORTUGUESE}, + {"Russian", Language::RUSSIAN}, + {"Chinese", Language::CHINESE}, + {"Japanese", Language::JAPANESE}, + {"Korean", Language::KOREAN}, + {"Arabic", Language::ARABIC}, + {"Hindi", Language::HINDI}, + {"Dutch", Language::DUTCH}, + {"Swedish", Language::SWEDISH}, + {"Norwegian", Language::NORWEGIAN}, + {"Danish", Language::DANISH}, + {"Finnish", Language::FINNISH}, + {"Polish", Language::POLISH}, + {"Czech", Language::CZECH}, + {"Hungarian", Language::HUNGARIAN}, + {"Romanian", Language::ROMANIAN}, + {"Bulgarian", Language::BULGARIAN}, + {"Greek", Language::GREEK}, + {"Turkish", Language::TURKISH}, + {"Hebrew", Language::HEBREW}, + {"Persian", Language::PERSIAN}, + {"Thai", Language::THAI}, + {"Vietnamese", Language::VIETNAMESE}, + {"Indonesian", Language::INDONESIAN}, + {"Malay", Language::MALAY}, + {"Filipino", Language::FILIPINO}, + {"Latin", Language::LATIN}, + {"Ancient Greek", Language::ANCIENT_GREEK}, + {"Sanskrit", Language::SANSKRIT}, + {"Old English", Language::OLD_ENGLISH}, + {"Middle English", Language::MIDDLE_ENGLISH}, + {"Old French", Language::OLD_FRENCH}, + {"Old German", Language::OLD_GERMAN}, + {"Old Italian", Language::OLD_ITALIAN}, + {"Old Spanish", Language::OLD_SPANISH}, + {"Old Portuguese", Language::OLD_PORTUGUESE}, + {"Old Russian", Language::OLD_RUSSIAN}, + {"Old Chinese", Language::OLD_CHINESE}, + {"Old Japanese", Language::OLD_JAPANESE}, + {"Old Korean", Language::OLD_KOREAN}, + {"Old Arabic", Language::OLD_ARABIC}, + {"Old Hindi", Language::OLD_HINDI}, + {"Old Dutch", Language::OLD_DUTCH}, + {"Old Swedish", Language::OLD_SWEDISH}, + {"Old Norwegian", Language::OLD_NORWEGIAN}, + {"Old Danish", Language::OLD_DANISH}, + {"Old Finnish", Language::OLD_FINNISH}, + {"Old Polish", Language::OLD_POLISH}, + {"Old Czech", Language::OLD_CZECH}, + {"Old Hungarian", Language::OLD_HUNGARIAN}, + {"Old Romanian", Language::OLD_ROMANIAN}, + {"Old Bulgarian", Language::OLD_BULGARIAN}, + {"Old Greek", Language::OLD_GREEK}, + {"Old Turkish", Language::OLD_TURKISH}, + {"Old Hebrew", Language::OLD_HEBREW}, + {"Old Persian", Language::OLD_PERSIAN}, + {"Old Thai", Language::OLD_THAI}, + {"Old Vietnamese", Language::OLD_VIETNAMESE}, + {"Old Indonesian", Language::OLD_INDONESIAN}, + {"Old Malay", Language::OLD_MALAY}, + {"Old Filipino", Language::OLD_FILIPINO}, + {"Old Latin", Language::OLD_LATIN}, + {"Old Ancient Greek", Language::OLD_ANCIENT_GREEK}, + {"Old Sanskrit", Language::OLD_SANSKRIT}, + {"Other", Language::OTHER} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : Language::ENGLISH; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Languages.h b/src/Backend/Enums/Languages.h new file mode 100644 index 0000000..0840b12 --- /dev/null +++ b/src/Backend/Enums/Languages.h @@ -0,0 +1,88 @@ +#ifndef LANGUAGES_H +#define LANGUAGES_H + +#include + +namespace Enums { + // Language enum + enum class Language { + ITALIAN, + ENGLISH, + SPANISH, + FRENCH, + GERMAN, + PORTUGUESE, + RUSSIAN, + CHINESE, + JAPANESE, + KOREAN, + ARABIC, + HINDI, + DUTCH, + SWEDISH, + NORWEGIAN, + DANISH, + FINNISH, + POLISH, + CZECH, + HUNGARIAN, + ROMANIAN, + BULGARIAN, + GREEK, + TURKISH, + HEBREW, + PERSIAN, + THAI, + VIETNAMESE, + INDONESIAN, + MALAY, + FILIPINO, + LATIN, + ANCIENT_GREEK, + SANSKRIT, + OLD_ENGLISH, + MIDDLE_ENGLISH, + OLD_FRENCH, + OLD_GERMAN, + OLD_ITALIAN, + OLD_SPANISH, + OLD_PORTUGUESE, + OLD_RUSSIAN, + OLD_CHINESE, + OLD_JAPANESE, + OLD_KOREAN, + OLD_ARABIC, + OLD_HINDI, + OLD_DUTCH, + OLD_SWEDISH, + OLD_NORWEGIAN, + OLD_DANISH, + OLD_FINNISH, + OLD_POLISH, + OLD_CZECH, + OLD_HUNGARIAN, + OLD_ROMANIAN, + OLD_BULGARIAN, + OLD_GREEK, + OLD_TURKISH, + OLD_HEBREW, + OLD_PERSIAN, + OLD_THAI, + OLD_VIETNAMESE, + OLD_INDONESIAN, + OLD_MALAY, + OLD_FILIPINO, + OLD_LATIN, + OLD_ANCIENT_GREEK, + OLD_SANSKRIT, + OTHER + }; + + // Helper function to convert enum to string + std::string languageToString(Language language); + + // Helper function to convert string to enum + Language stringToLanguage(const std::string& language); +} + +#endif // LANGUAGES_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e69de29..c5366a2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -0,0 +1,88 @@ +#include +#include "Backend/Elements/Media.h" +#include "Backend/Elements/Book.h" +#include "Backend/Elements/Movie.h" +#include "Backend/Elements/Song.h" +#include "Backend/Elements/Magazine.h" +#include "Backend/Elements/Podcast.h" +#include "Backend/Enums/Genres.h" +#include "Backend/Enums/Languages.h" + +int main() { + std::cout << "=== Test Compilazione Multimedia Library ===" << std::endl; + + try { + // Test Book + std::cout << "\n--- Test Book ---" << std::endl; + Book book("Il Nome della Rosa", "Umberto Eco", + Enums::BookGenre::HISTORICAL_FICTION, + Date(1980, 1, 1), + 1, 2048, true, "book_cover.jpg", + "Bompiani", 512, "978-88-452-1234-5", Enums::Language::ITALIAN); + + std::cout << "Book: " << book.getTitle() << " by " << book.getAuthor() << std::endl; + std::cout << "Genre: " << book.getGenreString() << std::endl; + std::cout << "Language: " << book.getLanguageString() << std::endl; + std::cout << "Valid: " << (book.isValid() ? "Yes" : "No") << std::endl; + + // Test Movie + std::cout << "\n--- Test Movie ---" << std::endl; + Movie movie("The Matrix", "Wachowski Sisters", + Enums::MovieGenre::SCIENCE_FICTION, + Date(1999, 3, 31), + 2, 4096, true, "matrix_cover.jpg", + "Lana Wachowski", 136, "Warner Bros.", "R", + Enums::Language::ENGLISH, "USA"); + + std::cout << "Movie: " << movie.getTitle() << " by " << movie.getDirector() << std::endl; + std::cout << "Genre: " << movie.getGenreString() << std::endl; + std::cout << "Language: " << movie.getLanguageString() << std::endl; + std::cout << "Valid: " << (movie.isValid() ? "Yes" : "No") << std::endl; + + // Test Song + std::cout << "\n--- Test Song ---" << std::endl; + Song song("Bohemian Rhapsody", "Queen", + Enums::MusicGenre::ROCK, + Date(1975, 10, 31), + 3, 1024, true, "queen_cover.jpg", + "Queen", "A Night at the Opera", 355, "MP3", "EMI", 1); + + std::cout << "Song: " << song.getTitle() << " by " << song.getArtist() << std::endl; + std::cout << "Genre: " << song.getGenreString() << std::endl; + std::cout << "Valid: " << (song.isValid() ? "Yes" : "No") << std::endl; + + // Test Magazine + std::cout << "\n--- Test Magazine ---" << std::endl; + Magazine magazine("National Geographic", "Various Authors", + Enums::MagazineGenre::SCIENCE, + Date(2024, 1, 1), + 4, 512, true, "natgeo_cover.jpg", + "National Geographic Society", 1, "0027-9358", "Susan Goldberg", + 80, "Monthly"); + + std::cout << "Magazine: " << magazine.getTitle() << std::endl; + std::cout << "Genre: " << magazine.getGenreString() << std::endl; + std::cout << "Valid: " << (magazine.isValid() ? "Yes" : "No") << std::endl; + + // Test Podcast + std::cout << "\n--- Test Podcast ---" << std::endl; + Podcast podcast("Serial", "Sarah Koenig", + Enums::PodcastGenre::TRUE_CRIME, + Date(2014, 10, 3), + 5, 256, true, "serial_cover.jpg", + "Sarah Koenig", 1, "Spotify", 45, "Serial", + "A true crime podcast about a real murder case."); + + std::cout << "Podcast: " << podcast.getTitle() << " by " << podcast.getHost() << std::endl; + std::cout << "Genre: " << podcast.getGenreString() << std::endl; + std::cout << "Valid: " << (podcast.isValid() ? "Yes" : "No") << std::endl; + + std::cout << "\n=== Compilazione completata con successo! ===" << std::endl; + + } catch (const std::exception& e) { + std::cerr << "Errore: " << e.what() << std::endl; + return 1; + } + + return 0; +} From 76ad4e3a1eab8e4d137193b467eaeecddb87dac7 Mon Sep 17 00:00:00 2001 From: m4hd1-exe Date: Wed, 6 Aug 2025 17:17:36 +0200 Subject: [PATCH 15/17] - Merged --- .idea/.gitignore | 8 + .idea/MultimediaLibrary.iml | 2 + .idea/editor.xml | 580 ++++++++++++++++++++++++++++++ .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + src/Backend/Elements/Book.cpp | 79 ++++ src/Backend/Elements/Book.h | 46 +++ src/Backend/Elements/Date.cpp | 128 +++++-- src/Backend/Elements/Date.h | 61 ++-- src/Backend/Elements/Magazine.cpp | 94 +++++ src/Backend/Elements/Magazine.h | 51 +++ src/Backend/Elements/Media.cpp | 17 +- src/Backend/Elements/Media.h | 15 +- src/Backend/Elements/Movie.cpp | 93 ++++- src/Backend/Elements/Movie.h | 47 ++- src/Backend/Elements/Podcast.cpp | 95 +++++ src/Backend/Elements/Podcast.h | 51 +++ src/Backend/Elements/Song.cpp | 94 +++++ src/Backend/Elements/Song.h | 51 +++ src/main.cpp | 88 +++++ 21 files changed, 1514 insertions(+), 107 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/MultimediaLibrary.iml create mode 100644 .idea/editor.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/MultimediaLibrary.iml b/.idea/MultimediaLibrary.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/MultimediaLibrary.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..95d51a7 --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,580 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0b76fe5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..cdf27a5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Backend/Elements/Book.cpp b/src/Backend/Elements/Book.cpp index e69de29..ab59841 100644 --- a/src/Backend/Elements/Book.cpp +++ b/src/Backend/Elements/Book.cpp @@ -0,0 +1,79 @@ +#include "Book.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +// Constructors +Book::Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), pages(pages), isbn(isbn), language(language), genre(genre) {} + +Book::Book(const Book& book) + : Media(book), publisher(book.publisher), pages(book.pages), isbn(book.isbn), language(book.language), genre(book.genre) {} + +Book::Book() : Media(), publisher(""), pages(0), isbn(""), language(Enums::Language::ITALIAN), genre(Enums::BookGenre::FICTION) {} + +Book::~Book() {} + +// Virtual method implementations for non-trivial polymorphism +bool Book::isValid() const { + return !getTitle().empty() && !getAuthor().empty() && !publisher.empty() && + pages > 0 && !isbn.empty(); +} + +// Book-specific getters and setters +std::string Book::getPublisher() const { + return publisher; +} + +Book& Book::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Book::getPages() const { + return pages; +} + +Book& Book::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Book::getIsbn() const { + return isbn; +} + +Book& Book::setIsbn(const std::string& isbn) { + this->isbn = isbn; + return *this; +} + +Enums::Language Book::getLanguage() const { + return language; +} + +Book& Book::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Book::getLanguageString() const { + return Enums::languageToString(language); +} + +// Genre-specific methods +Enums::BookGenre Book::getGenre() const { + return genre; +} + +Book& Book::setGenre(Enums::BookGenre g) { + genre = g; + return *this; +} + +std::string Book::getGenreString() const { + return Enums::bookGenreToString(genre); +} diff --git a/src/Backend/Elements/Book.h b/src/Backend/Elements/Book.h index e69de29..e20f2a8 100644 --- a/src/Backend/Elements/Book.h +++ b/src/Backend/Elements/Book.h @@ -0,0 +1,46 @@ +#ifndef BOOK_H +#define BOOK_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +class Book : public Media { + private: + std::string publisher; + unsigned int pages; + std::string isbn; + Enums::Language language; + Enums::BookGenre genre; + + public: + // Constructors + Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language); + Book(const Book& book); + Book(); + virtual ~Book(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Book-specific getters and setters + std::string getPublisher() const; + Book& setPublisher(const std::string& pub); + unsigned int getPages() const; + Book& setPages(unsigned int p); + std::string getIsbn() const; + Book& setIsbn(const std::string& isbn); + Enums::Language getLanguage() const; + Book& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + + // Genre-specific methods + Enums::BookGenre getGenre() const; + Book& setGenre(Enums::BookGenre genre); + std::string getGenreString() const; +}; + +#endif // BOOK_H diff --git a/src/Backend/Elements/Date.cpp b/src/Backend/Elements/Date.cpp index 4851e18..ecd9104 100644 --- a/src/Backend/Elements/Date.cpp +++ b/src/Backend/Elements/Date.cpp @@ -1,61 +1,123 @@ #include "Date.h" -#include +#include +#include +#include -Date::Date(int d, int m, int y) : day(d), month(m), year(y) {} -Date::Date(const Date& date) : day(date.day), month(date.month), year(date.year) {} -Date::Date() : day(0), month(0), year(0) {} -Date::~Date() {} - -void Date::setDay(int d) { - day = d; +// Constructors +Date::Date(int y, int m, int d) : year(y), month(m), day(d) { + if (!isValid()) { + throw std::invalid_argument("Invalid date"); + } } -int Date::getDay() const { - return day; +Date::Date(const Date& date) : year(date.year), month(date.month), day(date.day) {} + +Date::Date() : year(1900), month(1), day(1) {} + +// Getters and setters +int Date::getYear() const { + return year; } -void Date::setMonth(int m) { - month = m; +Date& Date::setYear(int y) { + year = y; + if (!isValid()) { + throw std::invalid_argument("Invalid year"); + } + return *this; } int Date::getMonth() const { return month; } -void Date::setYear(int y) { - year = y; +Date& Date::setMonth(int m) { + month = m; + if (!isValid()) { + throw std::invalid_argument("Invalid month"); + } + return *this; } -int Date::getYear() const { - return year; +int Date::getDay() const { + return day; +} + +Date& Date::setDay(int d) { + day = d; + if (!isValid()) { + throw std::invalid_argument("Invalid day"); + } + return *this; +} + +// Utility methods +bool Date::isValid() const { + if (year < 1900 || year > 2100) return false; + if (month < 1 || month > 12) return false; + + int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + // Leap year check + if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) { + daysInMonth[1] = 29; + } + + return day >= 1 && day <= daysInMonth[month - 1]; +} + +std::string Date::toString() const { + return toString("YYYY-MM-DD"); } -bool Date::operator==(const Date& d) const { - return (day == d.day && month == d.month && year == d.year); +std::string Date::toString(const std::string& format) const { + std::string result = format; + + // Replace placeholders with actual values + std::string yearStr = std::to_string(year); + std::string monthStr = std::to_string(month); + std::string dayStr = std::to_string(day); + + // Pad with zeros if needed + if (monthStr.length() == 1) monthStr = "0" + monthStr; + if (dayStr.length() == 1) dayStr = "0" + dayStr; + + // Replace YYYY, MM, DD + size_t pos = result.find("YYYY"); + if (pos != std::string::npos) result.replace(pos, 4, yearStr); + + pos = result.find("MM"); + if (pos != std::string::npos) result.replace(pos, 2, monthStr); + + pos = result.find("DD"); + if (pos != std::string::npos) result.replace(pos, 2, dayStr); + + return result; } -bool Date::operator!=(const Date& d) const { - return !(*this == d); +// Operators +bool Date::operator==(const Date& other) const { + return year == other.year && month == other.month && day == other.day; } -bool Date::operator<(const Date& d) const { - if (year != d.year) return year < d.year; - if (month != d.month) return month < d.month; - return day < d.day; +bool Date::operator!=(const Date& other) const { + return !(*this == other); } -bool Date::operator>(const Date& d) const { - return d < *this; +bool Date::operator<(const Date& other) const { + if (year != other.year) return year < other.year; + if (month != other.month) return month < other.month; + return day < other.day; } -bool Date::operator<=(const Date& d) const { - return !(*this > d); +bool Date::operator>(const Date& other) const { + return other < *this; } -bool Date::operator>=(const Date& d) const { - return !(*this < d); +bool Date::operator<=(const Date& other) const { + return *this < other || *this == other; } -void Date::printDate() const { - std::cout << day << "/" << month << "/" << year << std::endl; -} \ No newline at end of file +bool Date::operator>=(const Date& other) const { + return *this > other || *this == other; +} \ No newline at end of file diff --git a/src/Backend/Elements/Date.h b/src/Backend/Elements/Date.h index 3eec758..d860175 100644 --- a/src/Backend/Elements/Date.h +++ b/src/Backend/Elements/Date.h @@ -1,33 +1,40 @@ #ifndef DATE_H #define DATE_H -#include -class Date { - protected: - int day; - int month; - int year; - - public: - Date(int d, int m, int y); - Date(const Date& date); - Date(); - virtual ~Date(); +#include - void setDay(int d); - int getDay() const; - void setMonth(int m); - int getMonth() const; - void setYear(int y); - int getYear() const; - bool operator==(const Date& d) const; - bool operator!=(const Date& d) const; - bool operator<(const Date& d) const; - bool operator>(const Date& d) const; - bool operator<=(const Date& d) const; - bool operator>=(const Date& d) const; - - void printDate() const; +class Date { +private: + int year; + int month; + int day; + +public: + // Constructors + Date(int y, int m, int d); + Date(const Date& date); + Date(); + + // Getters and setters + int getYear() const; + Date& setYear(int y); + int getMonth() const; + Date& setMonth(int m); + int getDay() const; + Date& setDay(int d); + + // Utility methods + bool isValid() const; + std::string toString() const; + std::string toString(const std::string& format) const; // format: "YYYY-MM-DD", "DD/MM/YYYY", etc. + + // Operators + bool operator==(const Date& other) const; + bool operator!=(const Date& other) const; + bool operator<(const Date& other) const; + bool operator>(const Date& other) const; + bool operator<=(const Date& other) const; + bool operator>=(const Date& other) const; }; -#endif \ No newline at end of file +#endif // DATE_H \ No newline at end of file diff --git a/src/Backend/Elements/Magazine.cpp b/src/Backend/Elements/Magazine.cpp index e69de29..c56d3d4 100644 --- a/src/Backend/Elements/Magazine.cpp +++ b/src/Backend/Elements/Magazine.cpp @@ -0,0 +1,94 @@ +#include "Magazine.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Magazine::Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), issueNumber(issueNumber), issn(issn), editor(editor), pages(pages), frequency(frequency), genre(genre) {} + +Magazine::Magazine(const Magazine& magazine) + : Media(magazine), publisher(magazine.publisher), issueNumber(magazine.issueNumber), issn(magazine.issn), + editor(magazine.editor), pages(magazine.pages), frequency(magazine.frequency), genre(magazine.genre) {} + +Magazine::Magazine() : Media(), publisher(""), issueNumber(0), issn(""), editor(""), pages(0), frequency(""), genre(Enums::MagazineGenre::NEWS) {} + +Magazine::~Magazine() {} + +// Virtual method implementations for non-trivial polymorphism +bool Magazine::isValid() const { + return !getTitle().empty() && !publisher.empty() && issueNumber > 0 && + !issn.empty() && !editor.empty() && pages > 0 && !frequency.empty(); +} + +// Magazine-specific getters and setters +std::string Magazine::getPublisher() const { + return publisher; +} + +Magazine& Magazine::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Magazine::getIssueNumber() const { + return issueNumber; +} + +Magazine& Magazine::setIssueNumber(unsigned int issue) { + issueNumber = issue; + return *this; +} + +std::string Magazine::getIssn() const { + return issn; +} + +Magazine& Magazine::setIssn(const std::string& issn) { + this->issn = issn; + return *this; +} + +std::string Magazine::getEditor() const { + return editor; +} + +Magazine& Magazine::setEditor(const std::string& ed) { + editor = ed; + return *this; +} + +unsigned int Magazine::getPages() const { + return pages; +} + +Magazine& Magazine::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Magazine::getFrequency() const { + return frequency; +} + +Magazine& Magazine::setFrequency(const std::string& freq) { + frequency = freq; + return *this; +} + +// Genre-specific methods +Enums::MagazineGenre Magazine::getGenre() const { + return genre; +} + +Magazine& Magazine::setGenre(Enums::MagazineGenre g) { + genre = g; + return *this; +} + +std::string Magazine::getGenreString() const { + return Enums::magazineGenreToString(genre); +} diff --git a/src/Backend/Elements/Magazine.h b/src/Backend/Elements/Magazine.h index e69de29..db92de2 100644 --- a/src/Backend/Elements/Magazine.h +++ b/src/Backend/Elements/Magazine.h @@ -0,0 +1,51 @@ +#ifndef MAGAZINE_H +#define MAGAZINE_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Magazine : public Media { + private: + std::string publisher; + unsigned int issueNumber; + std::string issn; + std::string editor; + unsigned int pages; + std::string frequency; // Monthly, Weekly, etc. + Enums::MagazineGenre genre; + + public: + // Constructors + Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency); + Magazine(const Magazine& magazine); + Magazine(); + virtual ~Magazine(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Magazine-specific getters and setters + std::string getPublisher() const; + Magazine& setPublisher(const std::string& pub); + unsigned int getIssueNumber() const; + Magazine& setIssueNumber(unsigned int issue); + std::string getIssn() const; + Magazine& setIssn(const std::string& issn); + std::string getEditor() const; + Magazine& setEditor(const std::string& ed); + unsigned int getPages() const; + Magazine& setPages(unsigned int p); + std::string getFrequency() const; + Magazine& setFrequency(const std::string& freq); + + // Genre-specific methods + Enums::MagazineGenre getGenre() const; + Magazine& setGenre(Enums::MagazineGenre genre); + std::string getGenreString() const; +}; + +#endif // MAGAZINE_H diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp index b00a2e0..e21d56e 100644 --- a/src/Backend/Elements/Media.cpp +++ b/src/Backend/Elements/Media.cpp @@ -1,16 +1,15 @@ #include "Media.h" -#include "Date.h" #include #include -Media::Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), genre(g), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} +Media::Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} -Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), genre(media.genre), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} +Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} + +Media::Media() : title(""), id(0), author(""), releaseDate(), kbSize(0), isAvailable(false), imagePath("") {} -Media::Media() : title(""), id(0), author(""), genre(""), releaseDate(Date()), kbSize(0), isAvailable(false), imagePath("") {} -Media::~Media() {} Media& Media::setTitle(const std::string& t) { this->title = t; @@ -28,13 +27,7 @@ const std::string& Media::getAuthor() const { return author; } -Media& Media::setGenre(const std::string& g) { - this->genre = g; - return *this; -} -const std::string& Media::getGenre() const { - return genre; -} + Media& Media::setReleaseDate(const Date& rD) { this->releaseDate = rD; diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h index acf61a5..52e3c9a 100644 --- a/src/Backend/Elements/Media.h +++ b/src/Backend/Elements/Media.h @@ -3,31 +3,32 @@ #include #include "Date.h" +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" class Media{ protected: std::string title; std::string author; - std::string genre; + // Genre will be handled by derived classes with specific enum types Date releaseDate; unsigned int id; unsigned int kbSize; bool isAvailable; std::string imagePath; - //int Rating; - //string Review; public: - Media(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); + Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); Media(const Media& media); Media(); - virtual ~Media() = 0; + virtual ~Media() = default; // Virtual destructor + + // Virtual methods for non-trivial polymorphism + virtual bool isValid() const = 0; // Validates media-specific attributes Media& setTitle(const std::string& t); const std::string& getTitle() const; Media& setAuthor(const std::string& a); const std::string& getAuthor() const; - Media& setGenre(const std::string& g); - const std::string& getGenre() const; Media& setReleaseDate(const Date& rD); const Date& getReleaseDate() const; Media& setID(unsigned int id); diff --git a/src/Backend/Elements/Movie.cpp b/src/Backend/Elements/Movie.cpp index e4567c2..07489e9 100644 --- a/src/Backend/Elements/Movie.cpp +++ b/src/Backend/Elements/Movie.cpp @@ -1,40 +1,99 @@ #include "Movie.h" -#include "Date.h" -#include "Media.h" -#include +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" -Movie::Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang) - : Media(t, a, g, rD, id, kb, isAv, im), director(dir), duration(dur), language(lang) {} +// Constructors +Movie::Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + director(director), duration(duration), studio(studio), rating(rating), language(language), country(country), genre(genre) {} -Movie::Movie(const Movie& movie) - : Media(movie), director(movie.director), duration(movie.duration), language(movie.language) {} +Movie::Movie(const Movie& movie) + : Media(movie), director(movie.director), duration(movie.duration), studio(movie.studio), + rating(movie.rating), language(movie.language), country(movie.country), genre(movie.genre) {} -Movie::Movie() : Media(), director(""), duration(0), language("") {} +Movie::Movie() : Media(), director(""), duration(0), studio(""), rating(""), language(Enums::Language::ENGLISH), country(""), genre(Enums::MovieGenre::DRAMA) {} Movie::~Movie() {} -Movie& Movie::setDirector(const std::string& dir) { - this->director = dir; - return *this; +// Virtual method implementations for non-trivial polymorphism +bool Movie::isValid() const { + return !getTitle().empty() && !director.empty() && !studio.empty() && + duration > 0 && !rating.empty() && !country.empty(); } -const std::string& Movie::getDirector() const { + +// Movie-specific getters and setters +std::string Movie::getDirector() const { return director; } -Movie& Movie::setDuration(unsigned int dur) { - this->duration = dur; +Movie& Movie::setDirector(const std::string& dir) { + director = dir; return *this; } + unsigned int Movie::getDuration() const { return duration; } -Movie& Movie::setLanguage(const std::string& lang) { - this->language = lang; +Movie& Movie::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Movie::getStudio() const { + return studio; +} + +Movie& Movie::setStudio(const std::string& stu) { + studio = stu; + return *this; +} + +std::string Movie::getRating() const { + return rating; +} + +Movie& Movie::setRating(const std::string& rat) { + rating = rat; return *this; } -const std::string& Movie::getLanguage() const { + +Enums::Language Movie::getLanguage() const { return language; } +Movie& Movie::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Movie::getLanguageString() const { + return Enums::languageToString(language); +} + +std::string Movie::getCountry() const { + return country; +} + +Movie& Movie::setCountry(const std::string& cou) { + country = cou; + return *this; +} + +// Genre-specific methods +Enums::MovieGenre Movie::getGenre() const { + return genre; +} +Movie& Movie::setGenre(Enums::MovieGenre g) { + genre = g; + return *this; +} + +std::string Movie::getGenreString() const { + return Enums::movieGenreToString(genre); +} diff --git a/src/Backend/Elements/Movie.h b/src/Backend/Elements/Movie.h index 21a8801..8664696 100644 --- a/src/Backend/Elements/Movie.h +++ b/src/Backend/Elements/Movie.h @@ -1,28 +1,53 @@ #ifndef MOVIE_H #define MOVIE_H -#include "Date.h" #include "Media.h" -#include +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" class Movie : public Media { private: std::string director; - unsigned int duration; - std::string language; + unsigned int duration; // in minutes + std::string studio; + std::string rating; // PG, PG-13, R, etc. + Enums::Language language; + std::string country; + Enums::MovieGenre genre; public: - Movie(std::string t, std::string a, std::string g, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im, std::string dir, unsigned int dur, std::string lang); + // Constructors + Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country); Movie(const Movie& movie); Movie(); - ~Movie(); + virtual ~Movie(); + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Movie-specific getters and setters + std::string getDirector() const; Movie& setDirector(const std::string& dir); - const std::string& getDirector() const; - Movie& setDuration(unsigned int dur); unsigned int getDuration() const; - Movie& setLanguage(const std::string& lang); - const std::string& getLanguage() const; + Movie& setDuration(unsigned int dur); + std::string getStudio() const; + Movie& setStudio(const std::string& stu); + std::string getRating() const; + Movie& setRating(const std::string& rat); + Enums::Language getLanguage() const; + Movie& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + std::string getCountry() const; + Movie& setCountry(const std::string& cou); + + // Genre-specific methods + Enums::MovieGenre getGenre() const; + Movie& setGenre(Enums::MovieGenre genre); + std::string getGenreString() const; }; -#endif // MOVIE_H \ No newline at end of file +#endif // MOVIE_H diff --git a/src/Backend/Elements/Podcast.cpp b/src/Backend/Elements/Podcast.cpp index e69de29..604eee2 100644 --- a/src/Backend/Elements/Podcast.cpp +++ b/src/Backend/Elements/Podcast.cpp @@ -0,0 +1,95 @@ +#include "Podcast.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Podcast::Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + host(host), episodeNumber(episodeNumber), platform(platform), duration(duration), + series(series), description(description), genre(genre) {} + +Podcast::Podcast(const Podcast& podcast) + : Media(podcast), host(podcast.host), episodeNumber(podcast.episodeNumber), platform(podcast.platform), + duration(podcast.duration), series(podcast.series), description(podcast.description), genre(podcast.genre) {} + +Podcast::Podcast() : Media(), host(""), episodeNumber(0), platform(""), duration(0), series(""), description(""), genre(Enums::PodcastGenre::EDUCATION) {} + +Podcast::~Podcast() {} + +// Virtual method implementations for non-trivial polymorphism +bool Podcast::isValid() const { + return !getTitle().empty() && !host.empty() && episodeNumber > 0 && + !platform.empty() && duration > 0 && !series.empty() && !description.empty(); +} + +// Podcast-specific getters and setters +std::string Podcast::getHost() const { + return host; +} + +Podcast& Podcast::setHost(const std::string& h) { + host = h; + return *this; +} + +unsigned int Podcast::getEpisodeNumber() const { + return episodeNumber; +} + +Podcast& Podcast::setEpisodeNumber(unsigned int ep) { + episodeNumber = ep; + return *this; +} + +std::string Podcast::getPlatform() const { + return platform; +} + +Podcast& Podcast::setPlatform(const std::string& plat) { + platform = plat; + return *this; +} + +unsigned int Podcast::getDuration() const { + return duration; +} + +Podcast& Podcast::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Podcast::getSeries() const { + return series; +} + +Podcast& Podcast::setSeries(const std::string& ser) { + series = ser; + return *this; +} + +std::string Podcast::getDescription() const { + return description; +} + +Podcast& Podcast::setDescription(const std::string& desc) { + description = desc; + return *this; +} + +// Genre-specific methods +Enums::PodcastGenre Podcast::getGenre() const { + return genre; +} + +Podcast& Podcast::setGenre(Enums::PodcastGenre g) { + genre = g; + return *this; +} + +std::string Podcast::getGenreString() const { + return Enums::podcastGenreToString(genre); +} diff --git a/src/Backend/Elements/Podcast.h b/src/Backend/Elements/Podcast.h index e69de29..e0f6d96 100644 --- a/src/Backend/Elements/Podcast.h +++ b/src/Backend/Elements/Podcast.h @@ -0,0 +1,51 @@ +#ifndef PODCAST_H +#define PODCAST_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Podcast : public Media { + private: + std::string host; + unsigned int episodeNumber; + std::string platform; // Spotify, Apple Podcasts, etc. + unsigned int duration; // in minutes + std::string series; + std::string description; + Enums::PodcastGenre genre; + + public: + // Constructors + Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description); + Podcast(const Podcast& podcast); + Podcast(); + virtual ~Podcast(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Podcast-specific getters and setters + std::string getHost() const; + Podcast& setHost(const std::string& h); + unsigned int getEpisodeNumber() const; + Podcast& setEpisodeNumber(unsigned int ep); + std::string getPlatform() const; + Podcast& setPlatform(const std::string& plat); + unsigned int getDuration() const; + Podcast& setDuration(unsigned int dur); + std::string getSeries() const; + Podcast& setSeries(const std::string& ser); + std::string getDescription() const; + Podcast& setDescription(const std::string& desc); + + // Genre-specific methods + Enums::PodcastGenre getGenre() const; + Podcast& setGenre(Enums::PodcastGenre genre); + std::string getGenreString() const; +}; + +#endif // PODCAST_H diff --git a/src/Backend/Elements/Song.cpp b/src/Backend/Elements/Song.cpp index e69de29..796c4e9 100644 --- a/src/Backend/Elements/Song.cpp +++ b/src/Backend/Elements/Song.cpp @@ -0,0 +1,94 @@ +#include "Song.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Song::Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + artist(artist), album(album), duration(duration), format(format), label(label), trackNumber(trackNumber), genre(genre) {} + +Song::Song(const Song& song) + : Media(song), artist(song.artist), album(song.album), duration(song.duration), + format(song.format), label(song.label), trackNumber(song.trackNumber), genre(song.genre) {} + +Song::Song() : Media(), artist(""), album(""), duration(0), format(""), label(""), trackNumber(0), genre(Enums::MusicGenre::POP) {} + +Song::~Song() {} + +// Virtual method implementations for non-trivial polymorphism +bool Song::isValid() const { + return !getTitle().empty() && !artist.empty() && !album.empty() && + duration > 0 && !format.empty() && !label.empty() && trackNumber > 0; +} + +// Song-specific getters and setters +std::string Song::getArtist() const { + return artist; +} + +Song& Song::setArtist(const std::string& art) { + artist = art; + return *this; +} + +std::string Song::getAlbum() const { + return album; +} + +Song& Song::setAlbum(const std::string& alb) { + album = alb; + return *this; +} + +unsigned int Song::getDuration() const { + return duration; +} + +Song& Song::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Song::getFormat() const { + return format; +} + +Song& Song::setFormat(const std::string& fmt) { + format = fmt; + return *this; +} + +std::string Song::getLabel() const { + return label; +} + +Song& Song::setLabel(const std::string& lab) { + label = lab; + return *this; +} + +unsigned int Song::getTrackNumber() const { + return trackNumber; +} + +Song& Song::setTrackNumber(unsigned int track) { + trackNumber = track; + return *this; +} + +// Genre-specific methods +Enums::MusicGenre Song::getGenre() const { + return genre; +} + +Song& Song::setGenre(Enums::MusicGenre g) { + genre = g; + return *this; +} + +std::string Song::getGenreString() const { + return Enums::musicGenreToString(genre); +} diff --git a/src/Backend/Elements/Song.h b/src/Backend/Elements/Song.h index e69de29..c620674 100644 --- a/src/Backend/Elements/Song.h +++ b/src/Backend/Elements/Song.h @@ -0,0 +1,51 @@ +#ifndef SONG_H +#define SONG_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Song : public Media { + private: + std::string artist; + std::string album; + unsigned int duration; // in seconds + std::string format; // MP3, FLAC, WAV, etc. + std::string label; + unsigned int trackNumber; + Enums::MusicGenre genre; + + public: + // Constructors + Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber); + Song(const Song& song); + Song(); + virtual ~Song(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Song-specific getters and setters + std::string getArtist() const; + Song& setArtist(const std::string& art); + std::string getAlbum() const; + Song& setAlbum(const std::string& alb); + unsigned int getDuration() const; + Song& setDuration(unsigned int dur); + std::string getFormat() const; + Song& setFormat(const std::string& fmt); + std::string getLabel() const; + Song& setLabel(const std::string& lab); + unsigned int getTrackNumber() const; + Song& setTrackNumber(unsigned int track); + + // Genre-specific methods + Enums::MusicGenre getGenre() const; + Song& setGenre(Enums::MusicGenre genre); + std::string getGenreString() const; +}; + +#endif // SONG_H diff --git a/src/main.cpp b/src/main.cpp index e69de29..c5366a2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -0,0 +1,88 @@ +#include +#include "Backend/Elements/Media.h" +#include "Backend/Elements/Book.h" +#include "Backend/Elements/Movie.h" +#include "Backend/Elements/Song.h" +#include "Backend/Elements/Magazine.h" +#include "Backend/Elements/Podcast.h" +#include "Backend/Enums/Genres.h" +#include "Backend/Enums/Languages.h" + +int main() { + std::cout << "=== Test Compilazione Multimedia Library ===" << std::endl; + + try { + // Test Book + std::cout << "\n--- Test Book ---" << std::endl; + Book book("Il Nome della Rosa", "Umberto Eco", + Enums::BookGenre::HISTORICAL_FICTION, + Date(1980, 1, 1), + 1, 2048, true, "book_cover.jpg", + "Bompiani", 512, "978-88-452-1234-5", Enums::Language::ITALIAN); + + std::cout << "Book: " << book.getTitle() << " by " << book.getAuthor() << std::endl; + std::cout << "Genre: " << book.getGenreString() << std::endl; + std::cout << "Language: " << book.getLanguageString() << std::endl; + std::cout << "Valid: " << (book.isValid() ? "Yes" : "No") << std::endl; + + // Test Movie + std::cout << "\n--- Test Movie ---" << std::endl; + Movie movie("The Matrix", "Wachowski Sisters", + Enums::MovieGenre::SCIENCE_FICTION, + Date(1999, 3, 31), + 2, 4096, true, "matrix_cover.jpg", + "Lana Wachowski", 136, "Warner Bros.", "R", + Enums::Language::ENGLISH, "USA"); + + std::cout << "Movie: " << movie.getTitle() << " by " << movie.getDirector() << std::endl; + std::cout << "Genre: " << movie.getGenreString() << std::endl; + std::cout << "Language: " << movie.getLanguageString() << std::endl; + std::cout << "Valid: " << (movie.isValid() ? "Yes" : "No") << std::endl; + + // Test Song + std::cout << "\n--- Test Song ---" << std::endl; + Song song("Bohemian Rhapsody", "Queen", + Enums::MusicGenre::ROCK, + Date(1975, 10, 31), + 3, 1024, true, "queen_cover.jpg", + "Queen", "A Night at the Opera", 355, "MP3", "EMI", 1); + + std::cout << "Song: " << song.getTitle() << " by " << song.getArtist() << std::endl; + std::cout << "Genre: " << song.getGenreString() << std::endl; + std::cout << "Valid: " << (song.isValid() ? "Yes" : "No") << std::endl; + + // Test Magazine + std::cout << "\n--- Test Magazine ---" << std::endl; + Magazine magazine("National Geographic", "Various Authors", + Enums::MagazineGenre::SCIENCE, + Date(2024, 1, 1), + 4, 512, true, "natgeo_cover.jpg", + "National Geographic Society", 1, "0027-9358", "Susan Goldberg", + 80, "Monthly"); + + std::cout << "Magazine: " << magazine.getTitle() << std::endl; + std::cout << "Genre: " << magazine.getGenreString() << std::endl; + std::cout << "Valid: " << (magazine.isValid() ? "Yes" : "No") << std::endl; + + // Test Podcast + std::cout << "\n--- Test Podcast ---" << std::endl; + Podcast podcast("Serial", "Sarah Koenig", + Enums::PodcastGenre::TRUE_CRIME, + Date(2014, 10, 3), + 5, 256, true, "serial_cover.jpg", + "Sarah Koenig", 1, "Spotify", 45, "Serial", + "A true crime podcast about a real murder case."); + + std::cout << "Podcast: " << podcast.getTitle() << " by " << podcast.getHost() << std::endl; + std::cout << "Genre: " << podcast.getGenreString() << std::endl; + std::cout << "Valid: " << (podcast.isValid() ? "Yes" : "No") << std::endl; + + std::cout << "\n=== Compilazione completata con successo! ===" << std::endl; + + } catch (const std::exception& e) { + std::cerr << "Errore: " << e.what() << std::endl; + return 1; + } + + return 0; +} From 1cd32dca0cf2c1f09beb80e9cfe6c4dbbd6b8cdb Mon Sep 17 00:00:00 2001 From: m4hd1-exe Date: Wed, 6 Aug 2025 17:37:15 +0200 Subject: [PATCH 16/17] Refactor: Implement enum-based genres and languages, add custom Date class, and reorganize project structure --- multimedia_test.exe | Bin 0 -> 1050463 bytes src/Backend/Enums/Genres.cpp | 310 ++++++++++++++++++++++++++++++++ src/Backend/Enums/Genres.h | 159 ++++++++++++++++ src/Backend/Enums/Languages.cpp | 159 ++++++++++++++++ src/Backend/Enums/Languages.h | 88 +++++++++ 5 files changed, 716 insertions(+) create mode 100644 multimedia_test.exe create mode 100644 src/Backend/Enums/Genres.cpp create mode 100644 src/Backend/Enums/Genres.h create mode 100644 src/Backend/Enums/Languages.cpp create mode 100644 src/Backend/Enums/Languages.h diff --git a/multimedia_test.exe b/multimedia_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..e43d6d2cf533b498e75e9821fafd616807c8aeab GIT binary patch literal 1050463 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 literal 0 HcmV?d00001 diff --git a/src/Backend/Enums/Genres.cpp b/src/Backend/Enums/Genres.cpp new file mode 100644 index 0000000..90ae8e3 --- /dev/null +++ b/src/Backend/Enums/Genres.cpp @@ -0,0 +1,310 @@ +#include "Genres.h" +#include + +namespace Enums { + + std::string musicGenreToString(MusicGenre genre) { + static const std::map genreMap = { + {MusicGenre::ROCK, "Rock"}, + {MusicGenre::POP, "Pop"}, + {MusicGenre::JAZZ, "Jazz"}, + {MusicGenre::CLASSICAL, "Classical"}, + {MusicGenre::HIP_HOP, "Hip Hop"}, + {MusicGenre::ELECTRONIC, "Electronic"}, + {MusicGenre::COUNTRY, "Country"}, + {MusicGenre::FOLK, "Folk"}, + {MusicGenre::BLUES, "Blues"}, + {MusicGenre::REGGAE, "Reggae"}, + {MusicGenre::METAL, "Metal"}, + {MusicGenre::PUNK, "Punk"}, + {MusicGenre::INDIE, "Indie"}, + {MusicGenre::RAP, "Rap"}, + {MusicGenre::SOUL, "Soul"}, + {MusicGenre::FUNK, "Funk"}, + {MusicGenre::DISCO, "Disco"}, + {MusicGenre::GOSPEL, "Gospel"}, + {MusicGenre::LATIN, "Latin"}, + {MusicGenre::WORLD_MUSIC, "World Music"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre) { + static const std::map genreMap = { + {"Rock", MusicGenre::ROCK}, + {"Pop", MusicGenre::POP}, + {"Jazz", MusicGenre::JAZZ}, + {"Classical", MusicGenre::CLASSICAL}, + {"Hip Hop", MusicGenre::HIP_HOP}, + {"Electronic", MusicGenre::ELECTRONIC}, + {"Country", MusicGenre::COUNTRY}, + {"Folk", MusicGenre::FOLK}, + {"Blues", MusicGenre::BLUES}, + {"Reggae", MusicGenre::REGGAE}, + {"Metal", MusicGenre::METAL}, + {"Punk", MusicGenre::PUNK}, + {"Indie", MusicGenre::INDIE}, + {"Rap", MusicGenre::RAP}, + {"Soul", MusicGenre::SOUL}, + {"Funk", MusicGenre::FUNK}, + {"Disco", MusicGenre::DISCO}, + {"Gospel", MusicGenre::GOSPEL}, + {"Latin", MusicGenre::LATIN}, + {"World Music", MusicGenre::WORLD_MUSIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MusicGenre::ROCK; + } + + std::string bookGenreToString(BookGenre genre) { + static const std::map genreMap = { + {BookGenre::FICTION, "Fiction"}, + {BookGenre::NON_FICTION, "Non-Fiction"}, + {BookGenre::MYSTERY, "Mystery"}, + {BookGenre::THRILLER, "Thriller"}, + {BookGenre::ROMANCE, "Romance"}, + {BookGenre::SCIENCE_FICTION, "Science Fiction"}, + {BookGenre::FANTASY, "Fantasy"}, + {BookGenre::HORROR, "Horror"}, + {BookGenre::HISTORICAL_FICTION, "Historical Fiction"}, + {BookGenre::BIOGRAPHY, "Biography"}, + {BookGenre::AUTOBIOGRAPHY, "Autobiography"}, + {BookGenre::MEMOIR, "Memoir"}, + {BookGenre::SELF_HELP, "Self-Help"}, + {BookGenre::BUSINESS, "Business"}, + {BookGenre::PHILOSOPHY, "Philosophy"}, + {BookGenre::RELIGION, "Religion"}, + {BookGenre::SCIENCE, "Science"}, + {BookGenre::TECHNOLOGY, "Technology"}, + {BookGenre::COOKING, "Cooking"}, + {BookGenre::TRAVEL, "Travel"}, + {BookGenre::POETRY, "Poetry"}, + {BookGenre::DRAMA, "Drama"}, + {BookGenre::CHILDREN, "Children"}, + {BookGenre::YOUNG_ADULT, "Young Adult"}, + {BookGenre::ACADEMIC, "Academic"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + BookGenre stringToBookGenre(const std::string& genre) { + static const std::map genreMap = { + {"Fiction", BookGenre::FICTION}, + {"Non-Fiction", BookGenre::NON_FICTION}, + {"Mystery", BookGenre::MYSTERY}, + {"Thriller", BookGenre::THRILLER}, + {"Romance", BookGenre::ROMANCE}, + {"Science Fiction", BookGenre::SCIENCE_FICTION}, + {"Fantasy", BookGenre::FANTASY}, + {"Horror", BookGenre::HORROR}, + {"Historical Fiction", BookGenre::HISTORICAL_FICTION}, + {"Biography", BookGenre::BIOGRAPHY}, + {"Autobiography", BookGenre::AUTOBIOGRAPHY}, + {"Memoir", BookGenre::MEMOIR}, + {"Self-Help", BookGenre::SELF_HELP}, + {"Business", BookGenre::BUSINESS}, + {"Philosophy", BookGenre::PHILOSOPHY}, + {"Religion", BookGenre::RELIGION}, + {"Science", BookGenre::SCIENCE}, + {"Technology", BookGenre::TECHNOLOGY}, + {"Cooking", BookGenre::COOKING}, + {"Travel", BookGenre::TRAVEL}, + {"Poetry", BookGenre::POETRY}, + {"Drama", BookGenre::DRAMA}, + {"Children", BookGenre::CHILDREN}, + {"Young Adult", BookGenre::YOUNG_ADULT}, + {"Academic", BookGenre::ACADEMIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : BookGenre::FICTION; + } + + std::string movieGenreToString(MovieGenre genre) { + static const std::map genreMap = { + {MovieGenre::ACTION, "Action"}, + {MovieGenre::ADVENTURE, "Adventure"}, + {MovieGenre::COMEDY, "Comedy"}, + {MovieGenre::DRAMA, "Drama"}, + {MovieGenre::HORROR, "Horror"}, + {MovieGenre::THRILLER, "Thriller"}, + {MovieGenre::SCIENCE_FICTION, "Science Fiction"}, + {MovieGenre::FANTASY, "Fantasy"}, + {MovieGenre::ROMANCE, "Romance"}, + {MovieGenre::MYSTERY, "Mystery"}, + {MovieGenre::CRIME, "Crime"}, + {MovieGenre::WESTERN, "Western"}, + {MovieGenre::WAR, "War"}, + {MovieGenre::HISTORICAL, "Historical"}, + {MovieGenre::DOCUMENTARY, "Documentary"}, + {MovieGenre::ANIMATION, "Animation"}, + {MovieGenre::FAMILY, "Family"}, + {MovieGenre::MUSICAL, "Musical"}, + {MovieGenre::SPORTS, "Sports"}, + {MovieGenre::BIOGRAPHY, "Biography"}, + {MovieGenre::FILM_NOIR, "Film Noir"}, + {MovieGenre::EXPERIMENTAL, "Experimental"}, + {MovieGenre::SHORT_FILM, "Short Film"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MovieGenre stringToMovieGenre(const std::string& genre) { + static const std::map genreMap = { + {"Action", MovieGenre::ACTION}, + {"Adventure", MovieGenre::ADVENTURE}, + {"Comedy", MovieGenre::COMEDY}, + {"Drama", MovieGenre::DRAMA}, + {"Horror", MovieGenre::HORROR}, + {"Thriller", MovieGenre::THRILLER}, + {"Science Fiction", MovieGenre::SCIENCE_FICTION}, + {"Fantasy", MovieGenre::FANTASY}, + {"Romance", MovieGenre::ROMANCE}, + {"Mystery", MovieGenre::MYSTERY}, + {"Crime", MovieGenre::CRIME}, + {"Western", MovieGenre::WESTERN}, + {"War", MovieGenre::WAR}, + {"Historical", MovieGenre::HISTORICAL}, + {"Documentary", MovieGenre::DOCUMENTARY}, + {"Animation", MovieGenre::ANIMATION}, + {"Family", MovieGenre::FAMILY}, + {"Musical", MovieGenre::MUSICAL}, + {"Sports", MovieGenre::SPORTS}, + {"Biography", MovieGenre::BIOGRAPHY}, + {"Film Noir", MovieGenre::FILM_NOIR}, + {"Experimental", MovieGenre::EXPERIMENTAL}, + {"Short Film", MovieGenre::SHORT_FILM} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MovieGenre::DRAMA; + } + + std::string magazineGenreToString(MagazineGenre genre) { + static const std::map genreMap = { + {MagazineGenre::NEWS, "News"}, + {MagazineGenre::POLITICS, "Politics"}, + {MagazineGenre::BUSINESS, "Business"}, + {MagazineGenre::TECHNOLOGY, "Technology"}, + {MagazineGenre::SCIENCE, "Science"}, + {MagazineGenre::HEALTH, "Health"}, + {MagazineGenre::FITNESS, "Fitness"}, + {MagazineGenre::FOOD, "Food"}, + {MagazineGenre::TRAVEL, "Travel"}, + {MagazineGenre::FASHION, "Fashion"}, + {MagazineGenre::BEAUTY, "Beauty"}, + {MagazineGenre::HOME, "Home"}, + {MagazineGenre::GARDEN, "Garden"}, + {MagazineGenre::AUTOMOTIVE, "Automotive"}, + {MagazineGenre::SPORTS, "Sports"}, + {MagazineGenre::ENTERTAINMENT, "Entertainment"}, + {MagazineGenre::ARTS, "Arts"}, + {MagazineGenre::LITERATURE, "Literature"}, + {MagazineGenre::EDUCATION, "Education"}, + {MagazineGenre::ACADEMIC, "Academic"}, + {MagazineGenre::TRADE, "Trade"}, + {MagazineGenre::HOBBIES, "Hobbies"}, + {MagazineGenre::CRAFTS, "Crafts"}, + {MagazineGenre::PHOTOGRAPHY, "Photography"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MagazineGenre stringToMagazineGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", MagazineGenre::NEWS}, + {"Politics", MagazineGenre::POLITICS}, + {"Business", MagazineGenre::BUSINESS}, + {"Technology", MagazineGenre::TECHNOLOGY}, + {"Science", MagazineGenre::SCIENCE}, + {"Health", MagazineGenre::HEALTH}, + {"Fitness", MagazineGenre::FITNESS}, + {"Food", MagazineGenre::FOOD}, + {"Travel", MagazineGenre::TRAVEL}, + {"Fashion", MagazineGenre::FASHION}, + {"Beauty", MagazineGenre::BEAUTY}, + {"Home", MagazineGenre::HOME}, + {"Garden", MagazineGenre::GARDEN}, + {"Automotive", MagazineGenre::AUTOMOTIVE}, + {"Sports", MagazineGenre::SPORTS}, + {"Entertainment", MagazineGenre::ENTERTAINMENT}, + {"Arts", MagazineGenre::ARTS}, + {"Literature", MagazineGenre::LITERATURE}, + {"Education", MagazineGenre::EDUCATION}, + {"Academic", MagazineGenre::ACADEMIC}, + {"Trade", MagazineGenre::TRADE}, + {"Hobbies", MagazineGenre::HOBBIES}, + {"Crafts", MagazineGenre::CRAFTS}, + {"Photography", MagazineGenre::PHOTOGRAPHY} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MagazineGenre::NEWS; + } + + std::string podcastGenreToString(PodcastGenre genre) { + static const std::map genreMap = { + {PodcastGenre::NEWS, "News"}, + {PodcastGenre::POLITICS, "Politics"}, + {PodcastGenre::BUSINESS, "Business"}, + {PodcastGenre::TECHNOLOGY, "Technology"}, + {PodcastGenre::SCIENCE, "Science"}, + {PodcastGenre::HEALTH, "Health"}, + {PodcastGenre::FITNESS, "Fitness"}, + {PodcastGenre::EDUCATION, "Education"}, + {PodcastGenre::HISTORY, "History"}, + {PodcastGenre::TRUE_CRIME, "True Crime"}, + {PodcastGenre::COMEDY, "Comedy"}, + {PodcastGenre::ENTERTAINMENT, "Entertainment"}, + {PodcastGenre::SPORTS, "Sports"}, + {PodcastGenre::ARTS, "Arts"}, + {PodcastGenre::LITERATURE, "Literature"}, + {PodcastGenre::PHILOSOPHY, "Philosophy"}, + {PodcastGenre::RELIGION, "Religion"}, + {PodcastGenre::SELF_HELP, "Self-Help"}, + {PodcastGenre::INTERVIEW, "Interview"}, + {PodcastGenre::STORYTELLING, "Storytelling"}, + {PodcastGenre::MUSIC, "Music"}, + {PodcastGenre::FOOD, "Food"}, + {PodcastGenre::TRAVEL, "Travel"}, + {PodcastGenre::PARENTING, "Parenting"}, + {PodcastGenre::GAMING, "Gaming"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + PodcastGenre stringToPodcastGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", PodcastGenre::NEWS}, + {"Politics", PodcastGenre::POLITICS}, + {"Business", PodcastGenre::BUSINESS}, + {"Technology", PodcastGenre::TECHNOLOGY}, + {"Science", PodcastGenre::SCIENCE}, + {"Health", PodcastGenre::HEALTH}, + {"Fitness", PodcastGenre::FITNESS}, + {"Education", PodcastGenre::EDUCATION}, + {"History", PodcastGenre::HISTORY}, + {"True Crime", PodcastGenre::TRUE_CRIME}, + {"Comedy", PodcastGenre::COMEDY}, + {"Entertainment", PodcastGenre::ENTERTAINMENT}, + {"Sports", PodcastGenre::SPORTS}, + {"Arts", PodcastGenre::ARTS}, + {"Literature", PodcastGenre::LITERATURE}, + {"Philosophy", PodcastGenre::PHILOSOPHY}, + {"Religion", PodcastGenre::RELIGION}, + {"Self-Help", PodcastGenre::SELF_HELP}, + {"Interview", PodcastGenre::INTERVIEW}, + {"Storytelling", PodcastGenre::STORYTELLING}, + {"Music", PodcastGenre::MUSIC}, + {"Food", PodcastGenre::FOOD}, + {"Travel", PodcastGenre::TRAVEL}, + {"Parenting", PodcastGenre::PARENTING}, + {"Gaming", PodcastGenre::GAMING} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : PodcastGenre::EDUCATION; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Genres.h b/src/Backend/Enums/Genres.h new file mode 100644 index 0000000..4f36855 --- /dev/null +++ b/src/Backend/Enums/Genres.h @@ -0,0 +1,159 @@ +#ifndef GENRES_H +#define GENRES_H + +#include + +namespace Enums { + // Music genres + enum class MusicGenre { + ROCK, + POP, + JAZZ, + CLASSICAL, + HIP_HOP, + ELECTRONIC, + COUNTRY, + FOLK, + BLUES, + REGGAE, + METAL, + PUNK, + INDIE, + RAP, + SOUL, + FUNK, + DISCO, + GOSPEL, + LATIN, + WORLD_MUSIC + }; + + // Book genres + enum class BookGenre { + FICTION, + NON_FICTION, + MYSTERY, + THRILLER, + ROMANCE, + SCIENCE_FICTION, + FANTASY, + HORROR, + HISTORICAL_FICTION, + BIOGRAPHY, + AUTOBIOGRAPHY, + MEMOIR, + SELF_HELP, + BUSINESS, + PHILOSOPHY, + RELIGION, + SCIENCE, + TECHNOLOGY, + COOKING, + TRAVEL, + POETRY, + DRAMA, + CHILDREN, + YOUNG_ADULT, + ACADEMIC + }; + + // Movie genres + enum class MovieGenre { + ACTION, + ADVENTURE, + COMEDY, + DRAMA, + HORROR, + THRILLER, + SCIENCE_FICTION, + FANTASY, + ROMANCE, + MYSTERY, + CRIME, + WESTERN, + WAR, + HISTORICAL, + DOCUMENTARY, + ANIMATION, + FAMILY, + MUSICAL, + SPORTS, + BIOGRAPHY, + FILM_NOIR, + EXPERIMENTAL, + SHORT_FILM + }; + + // Magazine genres + enum class MagazineGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + FOOD, + TRAVEL, + FASHION, + BEAUTY, + HOME, + GARDEN, + AUTOMOTIVE, + SPORTS, + ENTERTAINMENT, + ARTS, + LITERATURE, + EDUCATION, + ACADEMIC, + TRADE, + HOBBIES, + CRAFTS, + PHOTOGRAPHY + }; + + // Podcast genres + enum class PodcastGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + EDUCATION, + HISTORY, + TRUE_CRIME, + COMEDY, + ENTERTAINMENT, + SPORTS, + ARTS, + LITERATURE, + PHILOSOPHY, + RELIGION, + SELF_HELP, + INTERVIEW, + STORYTELLING, + MUSIC, + FOOD, + TRAVEL, + PARENTING, + GAMING + }; + + // Helper functions to convert enum to string + std::string musicGenreToString(MusicGenre genre); + std::string bookGenreToString(BookGenre genre); + std::string movieGenreToString(MovieGenre genre); + std::string magazineGenreToString(MagazineGenre genre); + std::string podcastGenreToString(PodcastGenre genre); + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre); + BookGenre stringToBookGenre(const std::string& genre); + MovieGenre stringToMovieGenre(const std::string& genre); + MagazineGenre stringToMagazineGenre(const std::string& genre); + PodcastGenre stringToPodcastGenre(const std::string& genre); +} + +#endif // GENRES_H \ No newline at end of file diff --git a/src/Backend/Enums/Languages.cpp b/src/Backend/Enums/Languages.cpp new file mode 100644 index 0000000..aaf30fb --- /dev/null +++ b/src/Backend/Enums/Languages.cpp @@ -0,0 +1,159 @@ +#include "Languages.h" +#include + +namespace Enums { + + std::string languageToString(Language language) { + static const std::map languageMap = { + {Language::ITALIAN, "Italian"}, + {Language::ENGLISH, "English"}, + {Language::SPANISH, "Spanish"}, + {Language::FRENCH, "French"}, + {Language::GERMAN, "German"}, + {Language::PORTUGUESE, "Portuguese"}, + {Language::RUSSIAN, "Russian"}, + {Language::CHINESE, "Chinese"}, + {Language::JAPANESE, "Japanese"}, + {Language::KOREAN, "Korean"}, + {Language::ARABIC, "Arabic"}, + {Language::HINDI, "Hindi"}, + {Language::DUTCH, "Dutch"}, + {Language::SWEDISH, "Swedish"}, + {Language::NORWEGIAN, "Norwegian"}, + {Language::DANISH, "Danish"}, + {Language::FINNISH, "Finnish"}, + {Language::POLISH, "Polish"}, + {Language::CZECH, "Czech"}, + {Language::HUNGARIAN, "Hungarian"}, + {Language::ROMANIAN, "Romanian"}, + {Language::BULGARIAN, "Bulgarian"}, + {Language::GREEK, "Greek"}, + {Language::TURKISH, "Turkish"}, + {Language::HEBREW, "Hebrew"}, + {Language::PERSIAN, "Persian"}, + {Language::THAI, "Thai"}, + {Language::VIETNAMESE, "Vietnamese"}, + {Language::INDONESIAN, "Indonesian"}, + {Language::MALAY, "Malay"}, + {Language::FILIPINO, "Filipino"}, + {Language::LATIN, "Latin"}, + {Language::ANCIENT_GREEK, "Ancient Greek"}, + {Language::SANSKRIT, "Sanskrit"}, + {Language::OLD_ENGLISH, "Old English"}, + {Language::MIDDLE_ENGLISH, "Middle English"}, + {Language::OLD_FRENCH, "Old French"}, + {Language::OLD_GERMAN, "Old German"}, + {Language::OLD_ITALIAN, "Old Italian"}, + {Language::OLD_SPANISH, "Old Spanish"}, + {Language::OLD_PORTUGUESE, "Old Portuguese"}, + {Language::OLD_RUSSIAN, "Old Russian"}, + {Language::OLD_CHINESE, "Old Chinese"}, + {Language::OLD_JAPANESE, "Old Japanese"}, + {Language::OLD_KOREAN, "Old Korean"}, + {Language::OLD_ARABIC, "Old Arabic"}, + {Language::OLD_HINDI, "Old Hindi"}, + {Language::OLD_DUTCH, "Old Dutch"}, + {Language::OLD_SWEDISH, "Old Swedish"}, + {Language::OLD_NORWEGIAN, "Old Norwegian"}, + {Language::OLD_DANISH, "Old Danish"}, + {Language::OLD_FINNISH, "Old Finnish"}, + {Language::OLD_POLISH, "Old Polish"}, + {Language::OLD_CZECH, "Old Czech"}, + {Language::OLD_HUNGARIAN, "Old Hungarian"}, + {Language::OLD_ROMANIAN, "Old Romanian"}, + {Language::OLD_BULGARIAN, "Old Bulgarian"}, + {Language::OLD_GREEK, "Old Greek"}, + {Language::OLD_TURKISH, "Old Turkish"}, + {Language::OLD_HEBREW, "Old Hebrew"}, + {Language::OLD_PERSIAN, "Old Persian"}, + {Language::OLD_THAI, "Old Thai"}, + {Language::OLD_VIETNAMESE, "Old Vietnamese"}, + {Language::OLD_INDONESIAN, "Old Indonesian"}, + {Language::OLD_MALAY, "Old Malay"}, + {Language::OLD_FILIPINO, "Old Filipino"}, + {Language::OLD_LATIN, "Old Latin"}, + {Language::OLD_ANCIENT_GREEK, "Old Ancient Greek"}, + {Language::OLD_SANSKRIT, "Old Sanskrit"}, + {Language::OTHER, "Other"} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : "Unknown"; + } + + Language stringToLanguage(const std::string& language) { + static const std::map languageMap = { + {"Italian", Language::ITALIAN}, + {"English", Language::ENGLISH}, + {"Spanish", Language::SPANISH}, + {"French", Language::FRENCH}, + {"German", Language::GERMAN}, + {"Portuguese", Language::PORTUGUESE}, + {"Russian", Language::RUSSIAN}, + {"Chinese", Language::CHINESE}, + {"Japanese", Language::JAPANESE}, + {"Korean", Language::KOREAN}, + {"Arabic", Language::ARABIC}, + {"Hindi", Language::HINDI}, + {"Dutch", Language::DUTCH}, + {"Swedish", Language::SWEDISH}, + {"Norwegian", Language::NORWEGIAN}, + {"Danish", Language::DANISH}, + {"Finnish", Language::FINNISH}, + {"Polish", Language::POLISH}, + {"Czech", Language::CZECH}, + {"Hungarian", Language::HUNGARIAN}, + {"Romanian", Language::ROMANIAN}, + {"Bulgarian", Language::BULGARIAN}, + {"Greek", Language::GREEK}, + {"Turkish", Language::TURKISH}, + {"Hebrew", Language::HEBREW}, + {"Persian", Language::PERSIAN}, + {"Thai", Language::THAI}, + {"Vietnamese", Language::VIETNAMESE}, + {"Indonesian", Language::INDONESIAN}, + {"Malay", Language::MALAY}, + {"Filipino", Language::FILIPINO}, + {"Latin", Language::LATIN}, + {"Ancient Greek", Language::ANCIENT_GREEK}, + {"Sanskrit", Language::SANSKRIT}, + {"Old English", Language::OLD_ENGLISH}, + {"Middle English", Language::MIDDLE_ENGLISH}, + {"Old French", Language::OLD_FRENCH}, + {"Old German", Language::OLD_GERMAN}, + {"Old Italian", Language::OLD_ITALIAN}, + {"Old Spanish", Language::OLD_SPANISH}, + {"Old Portuguese", Language::OLD_PORTUGUESE}, + {"Old Russian", Language::OLD_RUSSIAN}, + {"Old Chinese", Language::OLD_CHINESE}, + {"Old Japanese", Language::OLD_JAPANESE}, + {"Old Korean", Language::OLD_KOREAN}, + {"Old Arabic", Language::OLD_ARABIC}, + {"Old Hindi", Language::OLD_HINDI}, + {"Old Dutch", Language::OLD_DUTCH}, + {"Old Swedish", Language::OLD_SWEDISH}, + {"Old Norwegian", Language::OLD_NORWEGIAN}, + {"Old Danish", Language::OLD_DANISH}, + {"Old Finnish", Language::OLD_FINNISH}, + {"Old Polish", Language::OLD_POLISH}, + {"Old Czech", Language::OLD_CZECH}, + {"Old Hungarian", Language::OLD_HUNGARIAN}, + {"Old Romanian", Language::OLD_ROMANIAN}, + {"Old Bulgarian", Language::OLD_BULGARIAN}, + {"Old Greek", Language::OLD_GREEK}, + {"Old Turkish", Language::OLD_TURKISH}, + {"Old Hebrew", Language::OLD_HEBREW}, + {"Old Persian", Language::OLD_PERSIAN}, + {"Old Thai", Language::OLD_THAI}, + {"Old Vietnamese", Language::OLD_VIETNAMESE}, + {"Old Indonesian", Language::OLD_INDONESIAN}, + {"Old Malay", Language::OLD_MALAY}, + {"Old Filipino", Language::OLD_FILIPINO}, + {"Old Latin", Language::OLD_LATIN}, + {"Old Ancient Greek", Language::OLD_ANCIENT_GREEK}, + {"Old Sanskrit", Language::OLD_SANSKRIT}, + {"Other", Language::OTHER} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : Language::ENGLISH; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Languages.h b/src/Backend/Enums/Languages.h new file mode 100644 index 0000000..0840b12 --- /dev/null +++ b/src/Backend/Enums/Languages.h @@ -0,0 +1,88 @@ +#ifndef LANGUAGES_H +#define LANGUAGES_H + +#include + +namespace Enums { + // Language enum + enum class Language { + ITALIAN, + ENGLISH, + SPANISH, + FRENCH, + GERMAN, + PORTUGUESE, + RUSSIAN, + CHINESE, + JAPANESE, + KOREAN, + ARABIC, + HINDI, + DUTCH, + SWEDISH, + NORWEGIAN, + DANISH, + FINNISH, + POLISH, + CZECH, + HUNGARIAN, + ROMANIAN, + BULGARIAN, + GREEK, + TURKISH, + HEBREW, + PERSIAN, + THAI, + VIETNAMESE, + INDONESIAN, + MALAY, + FILIPINO, + LATIN, + ANCIENT_GREEK, + SANSKRIT, + OLD_ENGLISH, + MIDDLE_ENGLISH, + OLD_FRENCH, + OLD_GERMAN, + OLD_ITALIAN, + OLD_SPANISH, + OLD_PORTUGUESE, + OLD_RUSSIAN, + OLD_CHINESE, + OLD_JAPANESE, + OLD_KOREAN, + OLD_ARABIC, + OLD_HINDI, + OLD_DUTCH, + OLD_SWEDISH, + OLD_NORWEGIAN, + OLD_DANISH, + OLD_FINNISH, + OLD_POLISH, + OLD_CZECH, + OLD_HUNGARIAN, + OLD_ROMANIAN, + OLD_BULGARIAN, + OLD_GREEK, + OLD_TURKISH, + OLD_HEBREW, + OLD_PERSIAN, + OLD_THAI, + OLD_VIETNAMESE, + OLD_INDONESIAN, + OLD_MALAY, + OLD_FILIPINO, + OLD_LATIN, + OLD_ANCIENT_GREEK, + OLD_SANSKRIT, + OTHER + }; + + // Helper function to convert enum to string + std::string languageToString(Language language); + + // Helper function to convert string to enum + Language stringToLanguage(const std::string& language); +} + +#endif // LANGUAGES_H \ No newline at end of file From 2f7942d3750c38536556982caf3ce87e7ea7130b Mon Sep 17 00:00:00 2001 From: m4hd1-exe Date: Fri, 8 Aug 2025 10:26:52 +0200 Subject: [PATCH 17/17] feat: implement Library class and Qt GUI integration - Add Library class with CRUD operations, search, and file persistence - Implement Qt MainWindow with menu bar, toolbar, and table widget - Add build system with Makefile and qmake support - Update project structure with proper separation of concerns - Add comprehensive .gitignore for Qt and build files - Update README with detailed documentation and usage instructions The Library class provides: - Media collection management with unique ID assignment - Search and filter operations (by title, author, type, availability) - CSV file persistence (save/load functionality) - Statistics and utility methods - Proper encapsulation and type safety Build system supports both custom Makefile and Qt qmake workflows. --- .gitignore | 32 +- Makefile | 840 ++++++++++++++++++++++++++++ MultimediaLibrary.pro | 48 ++ README.md | 219 +++++++- multimedia_test.exe | Bin 1050463 -> 0 bytes src/Backend/Library/Library.cpp | 342 +++++++++++ src/Backend/Library/Library.h | 60 ++ src/Frontend/Windows/MainWindow.cpp | 244 ++++++++ src/Frontend/Windows/MainWindow.h | 74 +++ src/main.cpp | 85 ++- 10 files changed, 1924 insertions(+), 20 deletions(-) create mode 100644 Makefile create mode 100644 MultimediaLibrary.pro delete mode 100644 multimedia_test.exe create mode 100644 src/Backend/Library/Library.cpp create mode 100644 src/Backend/Library/Library.h create mode 100644 src/Frontend/Windows/MainWindow.cpp create mode 100644 src/Frontend/Windows/MainWindow.h diff --git a/.gitignore b/.gitignore index dbe9c82..8b86780 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,31 @@ -.vscode/ \ No newline at end of file +# IDE files +.vscode/ +.idea/ + +# Qt build files +*.pro.user +*.pro.user.* +.qmake.stash +Makefile.Debug +Makefile.Release +release/ +debug/ +.qtc_clangd/ + +# Build directories +build/ +*.o +*.exe +moc_*.cpp +moc_*.h +ui_*.h +qrc_*.cpp + +# Temporary files +nul +*.tmp +*.log + +# OS files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ac4079f --- /dev/null +++ b/Makefile @@ -0,0 +1,840 @@ +############################################################################# +# Makefile for building: MultimediaLibrary +# Generated by qmake (3.1) (Qt 6.8.3) +# Project: MultimediaLibrary.pro +# Template: app +# Command: D:\qt\6.8.3\mingw_64\bin\qmake.exe -o Makefile MultimediaLibrary.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +first: release +install: release-install +uninstall: release-uninstall +QMAKE = D:\qt\6.8.3\mingw_64\bin\qmake.exe +DEL_FILE = del +CHK_DIR_EXISTS= if not exist +MKDIR = mkdir +COPY = copy /y +COPY_FILE = copy /y +COPY_DIR = xcopy /s /q /y /i +INSTALL_FILE = copy /y +INSTALL_PROGRAM = copy /y +INSTALL_DIR = xcopy /s /q /y /i +QINSTALL = D:\qt\6.8.3\mingw_64\bin\qmake.exe -install qinstall +QINSTALL_PROGRAM = D:\qt\6.8.3\mingw_64\bin\qmake.exe -install qinstall -exe +DEL_FILE = del +SYMLINK = $(QMAKE) -install ln -f -s +DEL_DIR = rmdir +MOVE = move +IDC = idc +IDL = midl +ZIP = zip -r -9 +DEF_FILE = +RES_FILE = +SED = $(QMAKE) -install sed +MOVE = move +SUBTARGETS = \ + release \ + debug + + +release: FORCE + $(MAKE) -f $(MAKEFILE).Release +release-make_first: FORCE + $(MAKE) -f $(MAKEFILE).Release +release-all: FORCE + $(MAKE) -f $(MAKEFILE).Release all +release-clean: FORCE + $(MAKE) -f $(MAKEFILE).Release clean +release-distclean: FORCE + $(MAKE) -f $(MAKEFILE).Release distclean +release-install: FORCE + $(MAKE) -f $(MAKEFILE).Release install +release-uninstall: FORCE + $(MAKE) -f $(MAKEFILE).Release uninstall +debug: FORCE + $(MAKE) -f $(MAKEFILE).Debug +debug-make_first: FORCE + $(MAKE) -f $(MAKEFILE).Debug +debug-all: FORCE + $(MAKE) -f $(MAKEFILE).Debug all +debug-clean: FORCE + $(MAKE) -f $(MAKEFILE).Debug clean +debug-distclean: FORCE + $(MAKE) -f $(MAKEFILE).Debug distclean +debug-install: FORCE + $(MAKE) -f $(MAKEFILE).Debug install +debug-uninstall: FORCE + $(MAKE) -f $(MAKEFILE).Debug uninstall + +Makefile: MultimediaLibrary.pro D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf D:/qt/6.8.3/mingw_64/mkspecs/features/spec_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/device_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/sanitize.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/gcc-base.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/g++-base.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows_vulkan_sdk.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/windows-vulkan.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/g++-win32.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/windows-desktop.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/qconfig.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_freetype.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libjpeg.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libpng.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_openxr_loader.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axbase_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bodymovin_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_entrypoint_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_example_icons_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_fb_support_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_ffmpegmediapluginimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_freetype_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_harfbuzz_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jpeg_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jsonrpc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_languageserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_linguist.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediaquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediatestlibprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_png_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatch_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchconversions_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchgenerators_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompilerplus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldebug_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldom_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlls_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltoolingsettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dglslparser_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickeffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickshapes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimagegenerator_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testinternals_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_tools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uiplugin.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserverquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_zlib_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt_functions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/spec_post.prf \ + .qmake.stash \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/toolchain.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/default_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/default_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resolve_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds_post.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/default_post.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/precompile_header.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/warn_on.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/permissions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resources_functions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resources.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/moc.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/opengl.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/uic.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qmake_use.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/file_copies.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/testcase_targets.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exceptions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/yacc.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/lex.prf \ + MultimediaLibrary.pro \ + D:/qt/6.8.3/mingw_64/lib/Qt6Widgets.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6Gui.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6Core.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6EntryPoint.prl \ + D:/qt/6.8.3/mingw_64/mkspecs/features/build_pass.prf + $(QMAKE) -o Makefile MultimediaLibrary.pro +D:/qt/6.8.3/mingw_64/mkspecs/features/spec_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/device_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/common/sanitize.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/gcc-base.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/g++-base.conf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows_vulkan_sdk.prf: +D:/qt/6.8.3/mingw_64/mkspecs/common/windows-vulkan.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/g++-win32.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/windows-desktop.conf: +D:/qt/6.8.3/mingw_64/mkspecs/qconfig.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_freetype.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libjpeg.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libpng.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_openxr_loader.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axbase_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bodymovin_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designercomponents_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_entrypoint_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_example_icons_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_fb_support_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_ffmpegmediapluginimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_freetype_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_harfbuzz_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jpeg_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jsonrpc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_languageserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_linguist.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediaquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediatestlibprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_packetprotocol_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_png_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatch_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchconversions_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchgenerators_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompilerplus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldebug_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldom_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlls_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltoolingsettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dglslparser_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickeffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickparticles_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickshapes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimagegenerator_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testinternals_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_tools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uiplugin.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserverquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_zlib_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt_functions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf: +D:/qt/6.8.3/mingw_64/mkspecs/features/spec_post.prf: +.qmake.stash: +D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/toolchain.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/default_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/default_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resolve_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds_post.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/default_post.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/precompile_header.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/warn_on.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/permissions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resources_functions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resources.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/moc.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/opengl.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/uic.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qmake_use.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/file_copies.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/testcase_targets.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/exceptions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/yacc.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/lex.prf: +MultimediaLibrary.pro: +D:/qt/6.8.3/mingw_64/lib/Qt6Widgets.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6Gui.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6Core.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6EntryPoint.prl: +D:/qt/6.8.3/mingw_64/mkspecs/features/build_pass.prf: +qmake: FORCE + @$(QMAKE) -o Makefile MultimediaLibrary.pro + +qmake_all: FORCE + +make_first: release-make_first debug-make_first FORCE +all: release-all debug-all FORCE +clean: release-clean debug-clean FORCE +distclean: release-distclean debug-distclean FORCE + -$(DEL_FILE) Makefile + -$(DEL_FILE) .qmake.stash + +release-mocclean: + $(MAKE) -f $(MAKEFILE).Release mocclean +debug-mocclean: + $(MAKE) -f $(MAKEFILE).Debug mocclean +mocclean: release-mocclean debug-mocclean + +release-mocables: + $(MAKE) -f $(MAKEFILE).Release mocables +debug-mocables: + $(MAKE) -f $(MAKEFILE).Debug mocables +mocables: release-mocables debug-mocables + +check: first + +benchmark: first +FORCE: + +.SUFFIXES: + +$(MAKEFILE).Release: Makefile +$(MAKEFILE).Debug: Makefile diff --git a/MultimediaLibrary.pro b/MultimediaLibrary.pro new file mode 100644 index 0000000..09610bd --- /dev/null +++ b/MultimediaLibrary.pro @@ -0,0 +1,48 @@ +QT += core widgets + +CONFIG += c++17 + +TARGET = MultimediaLibrary +TEMPLATE = app + +# Backend sources +SOURCES += \ + src/main.cpp \ + src/Backend/Elements/Date.cpp \ + src/Backend/Elements/Media.cpp \ + src/Backend/Elements/Book.cpp \ + src/Backend/Elements/Movie.cpp \ + src/Backend/Elements/Song.cpp \ + src/Backend/Elements/Magazine.cpp \ + src/Backend/Elements/Podcast.cpp \ + src/Backend/Enums/Genres.cpp \ + src/Backend/Enums/Languages.cpp \ + src/Backend/Library/Library.cpp \ + src/Frontend/Windows/MainWindow.cpp + +# Backend headers +HEADERS += \ + src/Backend/Elements/Date.h \ + src/Backend/Elements/Media.h \ + src/Backend/Elements/Book.h \ + src/Backend/Elements/Movie.h \ + src/Backend/Elements/Song.h \ + src/Backend/Elements/Magazine.h \ + src/Backend/Elements/Podcast.h \ + src/Backend/Enums/Genres.h \ + src/Backend/Enums/Languages.h \ + src/Backend/Library/Library.h \ + src/Frontend/Windows/MainWindow.h + +# Include paths +INCLUDEPATH += \ + src/Backend/Elements \ + src/Backend/Enums \ + src/Backend/Library \ + src/Frontend/Windows + +# Compiler flags +QMAKE_CXXFLAGS += -std=c++17 -Wall -Wextra + +# Output directory +DESTDIR = build/bin diff --git a/README.md b/README.md index 7c1a0ac..6ca3008 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,214 @@ -# 📦 OOP Project – Academic Year 2024/2025 +# Multimedia Library -## 📚 Multimedia Library +Una libreria multimediale completa con backend C++ e frontend Qt. -This repository contains the Object-Oriented Programming (OOP) project developed during the 2024/2025 academic year for the course taught by Professor Francesco Ranzato (SC1167 - Computer Science @UniPD). +## 🚀 **Caratteristiche** -The project demonstrates core OOP principles such as encapsulation, inheritance, polymorphism, and abstraction. It is designed following best practices in software design and aims to provide a clean, modular, and maintainable codebase. +- **Backend C++**: Gestione completa di libri, film, canzoni, riviste e podcast +- **Frontend Qt**: Interfaccia grafica moderna e intuitiva +- **Sistema di Enum**: Generi e lingue tipizzati per ogni tipo di media +- **Classe Date Personalizzata**: Gestione date con validazione +- **Build System Unificato**: Makefile per backend e frontend -## 🛠️ Technologies & Tools +## 📁 **Struttura del Progetto** -- Language: C++, Qt -- IDE: VS Code +``` +MultimediaLibrary/ +├── src/ +│ ├── Backend/ +│ │ ├── Elements/ # Classi base e derivate +│ │ │ ├── Media.h/.cpp # Classe base astratta +│ │ │ ├── Book.h/.cpp # Gestione libri +│ │ │ ├── Movie.h/.cpp # Gestione film +│ │ │ ├── Song.h/.cpp # Gestione canzoni +│ │ │ ├── Magazine.h/.cpp # Gestione riviste +│ │ │ ├── Podcast.h/.cpp # Gestione podcast +│ │ │ └── Date.h/.cpp # Classe data personalizzata +│ │ ├── Enums/ # Enum per generi e lingue +│ │ │ ├── Genres.h/.cpp +│ │ │ └── Languages.h/.cpp +│ │ └── Library/ # Gestione collezione media +│ │ └── Library.h/.cpp +│ ├── Frontend/ +│ │ └── Windows/ +│ │ └── MainWindow.h/.cpp # Interfaccia Qt +│ └── main.cpp # Entry point unificato +├── build/bin/ # Eseguibili compilati +├── Makefile # Build system per backend +├── MultimediaLibrary.pro # Progetto Qt +└── README.md # Questo file +``` -## 📁 Structure +## 🛠️ **Prerequisiti** -- `src/`: Source code of the application -- `test/`: Unit tests -- `docs/`: Documentation and UML diagrams (if applicable) +### Per il Backend (Obbligatorio) +- **MSYS2** con MinGW-w64 +- **Make** (installato tramite MSYS2) +- **g++** (compilatore C++17) -## ✅ Features +### Per il Frontend Qt (Opzionale) +- **Qt 6.8.3** installato in `D:\qt\6.8.3\mingw_64` +- **Qt Creator** per sviluppo -- [List here the main functionalities your project implements] +## 🔧 **Installazione e Setup** -## 🤝 Contributors +### 1. Installare Make (se non presente) +```bash +# Aggiungere al PATH +$env:PATH += ";C:\msys64\usr\bin" +``` -- **Davide** - [GitHub](https://github.com/DavideColabove) -- **Oussama** - [GitHub](https://github.com/m4hd1-exe) +### 2. Configurare Qt (se installato) +```bash +# Aggiungere Qt al PATH +$env:PATH += ";D:\qt\6.8.3\mingw_64\bin" +``` + +## 🏗️ **Compilazione** + +### Opzione 1: Usando il Makefile Personalizzato +```bash +# Compila solo il backend test +make test + +# Compila la GUI Qt (se Qt disponibile) +make gui + +# Compila tutto +make all + +# Pulisci i file di build +make clean + +# Mostra aiuto +make help +``` + +### Opzione 2: Usando Qt/qmake (Raccomandato per GUI) +```bash +# Genera Makefile da progetto Qt +qmake MultimediaLibrary.pro + +# Compila +make + +# Pulisci +make clean +``` + +## 🚀 **Esecuzione** + +### Modalità Test (Backend) +```bash +# Esegue test del backend in console +./build/bin/MultimediaLibraryTest +# oppure +./build/bin/MultimediaLibraryTest --test +``` + +### Modalità GUI +```bash +# Avvia l'interfaccia grafica Qt +./build/bin/MultimediaLibrary.exe +# oppure +./build/bin/MultimediaLibrary.exe --gui +``` + +### Aiuto +```bash +./build/bin/MultimediaLibraryTest --help +./build/bin/MultimediaLibrary.exe --help +``` + +## 📚 **Classi e Funzionalità** + +### Classe Base: `Media` +- **Attributi**: title, author, releaseDate, id, kbSize, isAvailable, imagePath +- **Metodi**: getters/setters, `isValid()` (virtuale puro) + +### Classi Derivate +- **`Book`**: publisher, pages, isbn, language, genre (BookGenre) +- **`Movie`**: director, duration, rating, language, genre (MovieGenre) +- **`Song`**: artist, album, duration, genre (MusicGenre) +- **`Magazine`**: publisher, issue, language, genre (MagazineGenre) +- **`Podcast`**: host, episodes, duration, genre (PodcastGenre) + +### Classe `Library` (Gestione Collezione) +- **CRUD Operations**: `addMedia()`, `removeMedia()`, `findMediaById()`, `getAllMedia()` +- **Search & Filter**: `searchByTitle()`, `searchByAuthor()`, `filterByType()`, `filterByAvailability()` +- **File Operations**: `saveToFile()`, `loadFromFile()` (formato CSV) +- **Statistics**: `getTotalCount()`, `getAvailableCount()`, `getMediaTypeStats()` +- **Utility**: `getNextId()`, `clear()`, `isEmpty()` + +### Sistema Enum +- **Generi**: `BookGenre`, `MovieGenre`, `MusicGenre`, `MagazineGenre`, `PodcastGenre` +- **Lingue**: `Language` +- **Conversioni**: `enumToString()`, `stringToEnum()` + +## 🎨 **Interfaccia Qt** + +### Componenti Principali +- **Menu Bar**: File, Edit, Search, Help +- **Tool Bar**: Azioni rapide (Add, Edit, Delete, Search, Export) +- **Table Widget**: Visualizzazione tabellare dei media +- **Status Bar**: Messaggi di stato + +### Funzionalità (da implementare) +- ✅ **Struttura base** completata +- 🔄 **AddMediaDialog** - Dialog per aggiungere media +- 🔄 **EditMediaDialog** - Dialog per modificare media +- 🔄 **SearchDialog** - Dialog per cercare e filtrare +- 🔄 **Import/Export** - Salvataggio e caricamento dati + +## 🔍 **Debug e Sviluppo** + +### Compilazione con Debug +```bash +make debug +``` + +### Verifica Qt +```bash +qmake --version +``` + +### Verifica Make +```bash +make --version +``` + +## 📝 **Note di Sviluppo** + +### Per Aprire in Qt Creator +1. Apri `MultimediaLibrary.pro` in Qt Creator +2. Configura il kit MinGW +3. Compila ed esegui direttamente da Qt Creator + +### Per Sviluppo da Terminale +1. Usa `make test` per testare il backend +2. Usa `qmake && make` per compilare la GUI +3. Usa `./build/bin/MultimediaLibrary.exe` per eseguire + +## 🎯 **Prossimi Passi** + +1. **Implementare AddMediaDialog** con ComboBox per generi e lingue +2. **Implementare EditMediaDialog** per modificare media esistenti +3. **Implementare SearchDialog** per cercare e filtrare +4. **Aggiungere validazione input** con QValidator +5. **Implementare salvataggio/caricamento** dati +6. **Aggiungere stili CSS** per migliorare l'aspetto + +## ✅ **Stato Attuale** + +- ✅ **Backend**: Completamente funzionante +- ✅ **Classi derivate**: Implementate con enum +- ✅ **Classe Library**: Gestione completa della collezione +- ✅ **Sistema build**: Makefile e qmake funzionanti +- ✅ **GUI base**: MainWindow con menu e toolbar +- ✅ **Qt integration**: Compilazione e linking corretti +- 🔄 **Dialog**: In sviluppo +- 🔄 **Funzionalità avanzate**: Da implementare + +--- + +**Sviluppato con C++17, Qt 6.8.3 e Make** 🚀 diff --git a/multimedia_test.exe b/multimedia_test.exe deleted file mode 100644 index e43d6d2cf533b498e75e9821fafd616807c8aeab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050463 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 diff --git a/src/Backend/Library/Library.cpp b/src/Backend/Library/Library.cpp new file mode 100644 index 0000000..5d1b2ca --- /dev/null +++ b/src/Backend/Library/Library.cpp @@ -0,0 +1,342 @@ +#include "Library.h" +#include "../Elements/Media.h" +#include "../Elements/Book.h" +#include "../Elements/Movie.h" +#include "../Elements/Song.h" +#include "../Elements/Magazine.h" +#include "../Elements/Podcast.h" +#include +#include +#include +#include + +Library::Library() : nextId(1) +{ +} + +void Library::addMedia(std::unique_ptr media) +{ + if (!media) return; + + // Assign the next available ID + media->setID(getNextId()); + mediaCollection.push_back(std::move(media)); +} + +void Library::removeMedia(int id) +{ + auto it = std::find_if(mediaCollection.begin(), mediaCollection.end(), + [id](const std::unique_ptr& media) { + return media->getID() == id; + }); + + if (it != mediaCollection.end()) { + mediaCollection.erase(it); + } +} + +Media* Library::findMediaById(int id) +{ + auto it = std::find_if(mediaCollection.begin(), mediaCollection.end(), + [id](const std::unique_ptr& media) { + return media->getID() == id; + }); + + return (it != mediaCollection.end()) ? it->get() : nullptr; +} + +std::vector Library::getAllMedia() const +{ + std::vector result; + result.reserve(mediaCollection.size()); + + for (const auto& media : mediaCollection) { + result.push_back(media.get()); + } + + return result; +} + +std::vector Library::searchByTitle(const std::string& title) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + std::string mediaTitle = media->getTitle(); + if (mediaTitle.find(title) != std::string::npos) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::searchByAuthor(const std::string& author) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + std::string mediaAuthor = media->getAuthor(); + if (mediaAuthor.find(author) != std::string::npos) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::filterByType(const std::string& type) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + if (getMediaType(media.get()) == type) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::filterByAvailability(bool available) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + if (media->getIsAvailable() == available) { + result.push_back(media.get()); + } + } + + return result; +} + +bool Library::saveToFile(const std::string& filename) const +{ + std::ofstream file(filename); + if (!file.is_open()) { + return false; + } + + // Write header + file << "ID,Type,Title,Author,ReleaseDate,Size,Available"; + + // Write specific fields for each type + file << ",Publisher,Pages,ISBN,Language,Genre"; // Book fields + file << ",Director,Duration,Rating"; // Movie fields + file << ",Artist,Album"; // Song fields + file << ",Issue"; // Magazine fields + file << ",Host,Episodes"; // Podcast fields + file << "\n"; + + for (const auto& media : mediaCollection) { + // Common fields + file << media->getID() << "," + << getMediaType(media.get()) << "," + << media->getTitle() << "," + << media->getAuthor() << "," + << media->getReleaseDate().toString() << "," + << media->getKbSize() << "," + << (media->getIsAvailable() ? "1" : "0"); + + // Type-specific fields + if (auto book = dynamic_cast(media.get())) { + file << "," << book->getPublisher() + << "," << book->getPages() + << "," << book->getIsbn() + << "," << static_cast(book->getLanguage()) + << "," << static_cast(book->getGenre()); + } else { + file << ",,,,,"; // Empty fields for non-books + } + + if (auto movie = dynamic_cast(media.get())) { + file << "," << movie->getDirector() + << "," << movie->getDuration() + << "," << movie->getRating(); + } else { + file << ",,,"; // Empty fields for non-movies + } + + if (auto song = dynamic_cast(media.get())) { + file << "," << song->getArtist() + << "," << song->getAlbum(); + } else { + file << ",,"; // Empty fields for non-songs + } + + if (auto magazine = dynamic_cast(media.get())) { + file << "," << magazine->getIssueNumber(); + } else { + file << ","; // Empty field for non-magazines + } + + if (auto podcast = dynamic_cast(media.get())) { + file << "," << podcast->getHost() + << "," << podcast->getEpisodeNumber(); + } else { + file << ",,"; // Empty fields for non-podcasts + } + + file << "\n"; + } + + file.close(); + return true; +} + +bool Library::loadFromFile(const std::string& filename) +{ + std::ifstream file(filename); + if (!file.is_open()) { + return false; + } + + // Clear existing data + clear(); + + std::string line; + // Skip header + std::getline(file, line); + + while (std::getline(file, line)) { + std::stringstream ss(line); + std::string token; + std::vector tokens; + + while (std::getline(ss, token, ',')) { + tokens.push_back(token); + } + + if (tokens.size() < 7) continue; // Skip invalid lines + + // Parse common fields + int id = std::stoi(tokens[0]); + std::string type = tokens[1]; + std::string title = tokens[2]; + std::string author = tokens[3]; + Date releaseDate; // TODO: Parse date from string + int size = std::stoi(tokens[5]); + bool available = (tokens[6] == "1"); + + // Create media based on type + std::unique_ptr media; + + if (type == "Book" && tokens.size() >= 12) { + auto book = std::make_unique(); + book->setPublisher(tokens[7]); + book->setPages(std::stoi(tokens[8])); + book->setIsbn(tokens[9]); + book->setLanguage(static_cast(std::stoi(tokens[10]))); + book->setGenre(static_cast(std::stoi(tokens[11]))); + media = std::move(book); + } else if (type == "Movie" && tokens.size() >= 15) { + auto movie = std::make_unique(); + movie->setDirector(tokens[12]); + movie->setDuration(std::stoi(tokens[13])); + movie->setRating(tokens[14]); + media = std::move(movie); + } else if (type == "Song" && tokens.size() >= 17) { + auto song = std::make_unique(); + song->setArtist(tokens[15]); + song->setAlbum(tokens[16]); + media = std::move(song); + } else if (type == "Magazine" && tokens.size() >= 18) { + auto magazine = std::make_unique(); + magazine->setIssueNumber(std::stoi(tokens[17])); + media = std::move(magazine); + } else if (type == "Podcast" && tokens.size() >= 20) { + auto podcast = std::make_unique(); + podcast->setHost(tokens[18]); + podcast->setEpisodeNumber(std::stoi(tokens[19])); + media = std::move(podcast); + } + + if (media) { + media->setID(id); + media->setTitle(title); + media->setAuthor(author); + media->setReleaseDate(releaseDate); + media->setKbSize(size); + media->setIsAvailable(available); + + mediaCollection.push_back(std::move(media)); + nextId = std::max(nextId, static_cast(id + 1)); + } + } + + file.close(); + return true; +} + +size_t Library::getTotalCount() const +{ + return mediaCollection.size(); +} + +size_t Library::getAvailableCount() const +{ + return std::count_if(mediaCollection.begin(), mediaCollection.end(), + [](const std::unique_ptr& media) { + return media->getIsAvailable(); + }); +} + +size_t Library::getCountByType(const std::string& type) const +{ + return std::count_if(mediaCollection.begin(), mediaCollection.end(), + [this, &type](const std::unique_ptr& media) { + return getMediaType(media.get()) == type; + }); +} + +std::map Library::getMediaTypeStats() const +{ + std::map stats; + + for (const auto& media : mediaCollection) { + std::string type = getMediaType(media.get()); + stats[type]++; + } + + return stats; +} + +int Library::getNextId() +{ + return nextId++; +} + +void Library::clear() +{ + mediaCollection.clear(); + nextId = 1; +} + +bool Library::isEmpty() const +{ + return mediaCollection.empty(); +} + +std::string Library::getMediaType(const Media* media) const +{ + if (dynamic_cast(media)) return "Book"; + if (dynamic_cast(media)) return "Movie"; + if (dynamic_cast(media)) return "Song"; + if (dynamic_cast(media)) return "Magazine"; + if (dynamic_cast(media)) return "Podcast"; + return "Unknown"; +} + +void Library::generateNextId() +{ + if (mediaCollection.empty()) { + nextId = 1; + } else { + unsigned int maxId = 0; + for (const auto& media : mediaCollection) { + maxId = std::max(maxId, static_cast(media->getID())); + } + nextId = maxId + 1; + } +} diff --git a/src/Backend/Library/Library.h b/src/Backend/Library/Library.h new file mode 100644 index 0000000..8da1698 --- /dev/null +++ b/src/Backend/Library/Library.h @@ -0,0 +1,60 @@ +#ifndef LIBRARY_H +#define LIBRARY_H + +#include +#include +#include +#include +#include + +// Forward declarations +class Media; +class Book; +class Movie; +class Song; +class Magazine; +class Podcast; + +class Library +{ +public: + Library(); + ~Library() = default; + + // CRUD Operations + void addMedia(std::unique_ptr media); + void removeMedia(int id); + Media* findMediaById(int id); + std::vector getAllMedia() const; + + // Search and Filter Operations + std::vector searchByTitle(const std::string& title) const; + std::vector searchByAuthor(const std::string& author) const; + std::vector filterByType(const std::string& type) const; + std::vector filterByAvailability(bool available) const; + + // File Operations + bool saveToFile(const std::string& filename) const; + bool loadFromFile(const std::string& filename); + + // Statistics + size_t getTotalCount() const; + size_t getAvailableCount() const; + size_t getCountByType(const std::string& type) const; + std::map getMediaTypeStats() const; + + // Utility + int getNextId(); + void clear(); + bool isEmpty() const; + std::string getMediaType(const Media* media) const; + +private: + std::vector> mediaCollection; + unsigned int nextId; + + // Helper methods + void generateNextId(); +}; + +#endif // LIBRARY_H diff --git a/src/Frontend/Windows/MainWindow.cpp b/src/Frontend/Windows/MainWindow.cpp new file mode 100644 index 0000000..1b221dc --- /dev/null +++ b/src/Frontend/Windows/MainWindow.cpp @@ -0,0 +1,244 @@ +#include "MainWindow.h" +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) +{ + // Initialize library + library = std::make_unique(); + + setupUI(); + setupMenuBar(); + setupToolBar(); + setupStatusBar(); + setupTable(); + setupConnections(); + + // Set window properties + setWindowTitle("Multimedia Library"); + setMinimumSize(800, 600); + resize(1200, 800); +} + +MainWindow::~MainWindow() +{ +} + +void MainWindow::setupUI() +{ + centralWidget = new QWidget(this); + setCentralWidget(centralWidget); + + QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); + + // Create table + mediaTable = new QTableWidget(this); + mainLayout->addWidget(mediaTable); +} + +void MainWindow::setupMenuBar() +{ + QMenuBar *menuBar = this->menuBar(); + + // File menu + QMenu *fileMenu = menuBar->addMenu("&File"); + importAction = fileMenu->addAction("&Import..."); + exportAction = fileMenu->addAction("&Export..."); + fileMenu->addSeparator(); + fileMenu->addAction("E&xit", this, &QWidget::close); + + // Edit menu + QMenu *editMenu = menuBar->addMenu("&Edit"); + addAction = editMenu->addAction("&Add Media..."); + editAction = editMenu->addAction("&Edit Media..."); + deleteAction = editMenu->addAction("&Delete Media"); + + // Search menu + QMenu *searchMenu = menuBar->addMenu("&Search"); + searchAction = searchMenu->addAction("&Search..."); + + // Help menu + QMenu *helpMenu = menuBar->addMenu("&Help"); + aboutAction = helpMenu->addAction("&About"); +} + +void MainWindow::setupToolBar() +{ + toolBar = addToolBar("Main Toolbar"); + toolBar->setMovable(false); + + toolBar->addAction(addAction); + toolBar->addAction(editAction); + toolBar->addAction(deleteAction); + toolBar->addSeparator(); + toolBar->addAction(searchAction); + toolBar->addSeparator(); + toolBar->addAction(exportAction); +} + +void MainWindow::setupStatusBar() +{ + statusBarWidget = this->statusBar(); + statusBarWidget->showMessage("Ready"); +} + +void MainWindow::setupTable() +{ + // Set table properties + mediaTable->setAlternatingRowColors(true); + mediaTable->setSelectionBehavior(QAbstractItemView::SelectRows); + mediaTable->setSelectionMode(QAbstractItemView::SingleSelection); + mediaTable->setSortingEnabled(true); + + // Set column headers + QStringList headers; + headers << "ID" << "Type" << "Title" << "Author" << "Genre" << "Release Date" << "Size (KB)" << "Available"; + mediaTable->setColumnCount(headers.size()); + mediaTable->setHorizontalHeaderLabels(headers); + + // Set column widths + mediaTable->setColumnWidth(0, 50); // ID + mediaTable->setColumnWidth(1, 80); // Type + mediaTable->setColumnWidth(2, 200); // Title + mediaTable->setColumnWidth(3, 150); // Author + mediaTable->setColumnWidth(4, 120); // Genre + mediaTable->setColumnWidth(5, 100); // Release Date + mediaTable->setColumnWidth(6, 80); // Size + mediaTable->setColumnWidth(7, 80); // Available + + // Make columns stretch + mediaTable->horizontalHeader()->setStretchLastSection(true); +} + +void MainWindow::setupConnections() +{ + // Connect menu actions + connect(addAction, &QAction::triggered, this, &MainWindow::addMedia); + connect(editAction, &QAction::triggered, this, &MainWindow::editMedia); + connect(deleteAction, &QAction::triggered, this, &MainWindow::deleteMedia); + connect(searchAction, &QAction::triggered, this, &MainWindow::searchMedia); + connect(exportAction, &QAction::triggered, this, &MainWindow::exportData); + connect(importAction, &QAction::triggered, this, &MainWindow::importData); + connect(aboutAction, &QAction::triggered, this, &MainWindow::about); +} + +void MainWindow::addMedia() +{ + statusBarWidget->showMessage("Add Media - Not implemented yet"); + // TODO: Implement AddMediaDialog + // Example usage: + // auto book = std::make_unique(); + // book->setTitle("Sample Book"); + // book->setAuthor("Sample Author"); + // library->addMedia(std::move(book)); + // refreshTable(); +} + +void MainWindow::editMedia() +{ + statusBarWidget->showMessage("Edit Media - Not implemented yet"); + // TODO: Implement EditMediaDialog +} + +void MainWindow::deleteMedia() +{ + statusBarWidget->showMessage("Delete Media - Not implemented yet"); + // TODO: Implement delete functionality + // Example usage: + // int selectedRow = mediaTable->currentRow(); + // if (selectedRow >= 0) { + // int id = mediaTable->item(selectedRow, 0)->text().toInt(); + // library->removeMedia(id); + // refreshTable(); + // } +} + +void MainWindow::searchMedia() +{ + statusBarWidget->showMessage("Search Media - Not implemented yet"); + // TODO: Implement SearchDialog +} + +void MainWindow::exportData() +{ + statusBarWidget->showMessage("Export Data - Not implemented yet"); + // TODO: Implement export functionality + // Example usage: + // QString filename = QFileDialog::getSaveFileName(this, "Export Library", "", "CSV Files (*.csv)"); + // if (!filename.isEmpty()) { + // library->saveToFile(filename.toStdString()); + // } +} + +void MainWindow::importData() +{ + statusBarWidget->showMessage("Import Data - Not implemented yet"); + // TODO: Implement import functionality + // Example usage: + // QString filename = QFileDialog::getOpenFileName(this, "Import Library", "", "CSV Files (*.csv)"); + // if (!filename.isEmpty()) { + // library->loadFromFile(filename.toStdString()); + // refreshTable(); + // } +} + +void MainWindow::about() +{ + QMessageBox::about(this, "About Multimedia Library", + "Multimedia Library v1.0.0\n\n" + "A comprehensive media management application.\n\n" + "Features:\n" + "- Book management\n" + "- Movie management\n" + "- Music management\n" + "- Magazine management\n" + "- Podcast management"); +} + +void MainWindow::refreshTable() +{ + clearTable(); + + auto allMedia = library->getAllMedia(); + for (size_t i = 0; i < allMedia.size(); ++i) { + addMediaToTable(allMedia[i], i); + } +} + +void MainWindow::addMediaToTable(const Media* media, int row) +{ + if (!media) return; + + mediaTable->insertRow(row); + + // ID + mediaTable->setItem(row, 0, new QTableWidgetItem(QString::number(media->getID()))); + + // Type (using Library's getMediaType method) + mediaTable->setItem(row, 1, new QTableWidgetItem(QString::fromStdString(library->getMediaType(media)))); + + // Title + mediaTable->setItem(row, 2, new QTableWidgetItem(QString::fromStdString(media->getTitle()))); + + // Author + mediaTable->setItem(row, 3, new QTableWidgetItem(QString::fromStdString(media->getAuthor()))); + + // Genre (to be implemented in derived classes) + mediaTable->setItem(row, 4, new QTableWidgetItem("N/A")); + + // Release Date + mediaTable->setItem(row, 5, new QTableWidgetItem(QString::fromStdString(media->getReleaseDate().toString()))); + + // Size + mediaTable->setItem(row, 6, new QTableWidgetItem(QString::number(media->getKbSize()))); + + // Available + mediaTable->setItem(row, 7, new QTableWidgetItem(media->getIsAvailable() ? "Yes" : "No")); +} + +void MainWindow::clearTable() +{ + mediaTable->setRowCount(0); +} \ No newline at end of file diff --git a/src/Frontend/Windows/MainWindow.h b/src/Frontend/Windows/MainWindow.h new file mode 100644 index 0000000..df1645b --- /dev/null +++ b/src/Frontend/Windows/MainWindow.h @@ -0,0 +1,74 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../Backend/Elements/Media.h" +#include "../../Backend/Elements/Book.h" +#include "../../Backend/Elements/Movie.h" +#include "../../Backend/Elements/Song.h" +#include "../../Backend/Elements/Magazine.h" +#include "../../Backend/Elements/Podcast.h" +#include "../../Backend/Library/Library.h" + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void addMedia(); + void editMedia(); + void deleteMedia(); + void searchMedia(); + void exportData(); + void importData(); + void about(); + +private: + void setupUI(); + void setupMenuBar(); + void setupToolBar(); + void setupStatusBar(); + void setupTable(); + void setupConnections(); + + // UI Components + QWidget *centralWidget; + QTableWidget *mediaTable; + QToolBar *toolBar; + QStatusBar *statusBarWidget; + + // Actions + QAction *addAction; + QAction *editAction; + QAction *deleteAction; + QAction *searchAction; + QAction *exportAction; + QAction *importAction; + QAction *aboutAction; + + // Data + std::unique_ptr library; + + // Helper methods + void refreshTable(); + void addMediaToTable(const Media* media, int row); + void clearTable(); +}; + +#endif // MAINWINDOW_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c5366a2..61d3e31 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,7 @@ #include +#include + +// Backend includes #include "Backend/Elements/Media.h" #include "Backend/Elements/Book.h" #include "Backend/Elements/Movie.h" @@ -8,7 +11,14 @@ #include "Backend/Enums/Genres.h" #include "Backend/Enums/Languages.h" -int main() { +// Qt includes (conditional compilation) +#ifdef USE_QT +#include +#include +#include "Frontend/Windows/MainWindow.h" +#endif + +void testBackend() { std::cout << "=== Test Compilazione Multimedia Library ===" << std::endl; try { @@ -77,12 +87,81 @@ int main() { std::cout << "Genre: " << podcast.getGenreString() << std::endl; std::cout << "Valid: " << (podcast.isValid() ? "Yes" : "No") << std::endl; - std::cout << "\n=== Compilazione completata con successo! ===" << std::endl; + std::cout << "\n=== Test Backend completato con successo! ===" << std::endl; } catch (const std::exception& e) { std::cerr << "Errore: " << e.what() << std::endl; - return 1; + throw; + } +} + +void showUsage(const char* programName) { + std::cout << "Uso: " << programName << " [opzione]" << std::endl; + std::cout << "Opzioni:" << std::endl; + std::cout << " --test Esegui solo il test del backend (console)" << std::endl; +#ifdef USE_QT + std::cout << " --gui Avvia l'interfaccia grafica Qt" << std::endl; +#endif + std::cout << " --help Mostra questo messaggio" << std::endl; + std::cout << std::endl; + std::cout << "Se non viene specificata alcuna opzione, viene eseguito il test del backend." << std::endl; +} + +int main(int argc, char *argv[]) { + // Parse command line arguments + std::string mode = "test"; // Default: test mode + + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg == "--gui" || arg == "-g") { +#ifdef USE_QT + mode = "gui"; +#else + std::cerr << "GUI mode not available - Qt not compiled in" << std::endl; + return 1; +#endif + } else if (arg == "--test" || arg == "-t") { + mode = "test"; + } else if (arg == "--help" || arg == "-h") { + showUsage(argv[0]); + return 0; + } else { + std::cerr << "Opzione sconosciuta: " << arg << std::endl; + showUsage(argv[0]); + return 1; + } + } + + if (mode == "test") { + // Test mode - console only + try { + testBackend(); + return 0; + } catch (const std::exception& e) { + std::cerr << "Errore nel test: " << e.what() << std::endl; + return 1; + } + } +#ifdef USE_QT + else if (mode == "gui") { + // GUI mode - Qt application + QApplication app(argc, argv); + + // Set application properties + app.setApplicationName("Multimedia Library"); + app.setApplicationVersion("1.0.0"); + app.setOrganizationName("MultimediaLibrary"); + + // Set application style + app.setStyle(QStyleFactory::create("Fusion")); + + // Create and show main window + MainWindow mainWindow; + mainWindow.show(); + + return app.exec(); } +#endif return 0; }