diff --git a/CMakeLists.txt b/CMakeLists.txt index 90ae957..7ae4e8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,5 @@ find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) qt_standard_project_setup(REQUIRES 6.8) -add_compile_definitions(QT_NO_CAST_FROM_ASCII) - add_subdirectory(plugins) add_subdirectory(app) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 6584b62..b40663c 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -14,15 +14,15 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) set(PROJECT_SOURCES main.cpp - cmainwindow.cpp - cmainwindow.h - cmainwindow.ui + cmainwindow.cpp + cmainwindow.h + cmainwindow.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(fontManager - MANUAL_FINALIZATION - ${PROJECT_SOURCES} + MANUAL_FINALIZATION + ${PROJECT_SOURCES} ifontprovider.h cfont.h cfont.cpp @@ -33,15 +33,15 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation else() if(ANDROID) - add_library(fontManager SHARED - ${PROJECT_SOURCES} - ) + add_library(fontManager SHARED + ${PROJECT_SOURCES} + ) # Define properties for Android with Qt 5 after find_package() calls as: # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") else() - add_executable(fontManager - ${PROJECT_SOURCES} - ) + add_executable(fontManager + ${PROJECT_SOURCES} + ) endif() endif() diff --git a/app/cfont.cpp b/app/cfont.cpp index 1422c1d..5dac09b 100644 --- a/app/cfont.cpp +++ b/app/cfont.cpp @@ -1,8 +1,9 @@ #include "cfont.h" +#include -cFont::cFont(QObject *parent) - : QObject{parent} + +cFont::cFont() { } @@ -76,7 +77,7 @@ QDate cFont::lastModified() { return m_lastModified; } -void cFont::setFiles(const QMap& files) { +void cFont::setFiles(const QMap& files) { for (auto [key, value] : files.asKeyValueRange()) { m_files.insert(key, value); } @@ -86,19 +87,19 @@ void cFont::clearFiles() { m_files.clear(); } -void cFont::addFiles(const QMap& files) { +void cFont::addFiles(const QMap& files) { for (auto [key, value] : files.asKeyValueRange()) { if (!m_files.contains(key)) m_files.insert(key, value); } } -void cFont::addFiles(const QString& variant, const QFile& file) { +void cFont::addFiles(const QString& variant, const QString& file) { if (!m_files.contains(variant)) m_files.insert(variant, file); } -QMap cFont::files() { +QMap cFont::files() { return m_files; } diff --git a/app/cfont.h b/app/cfont.h index 234d834..6ad8496 100644 --- a/app/cfont.h +++ b/app/cfont.h @@ -2,18 +2,16 @@ #define CFONT_H -#include +//#include #include #include #include -#include -class cFont : public QObject +class cFont { - Q_OBJECT public: - explicit cFont(QObject *parent = nullptr); + explicit cFont(); void setFamily(const QString& family); QString family(); @@ -36,11 +34,11 @@ public: void setLastModified(const QDate& lastModified); QDate lastModified(); - void setFiles(const QMap& files); + void setFiles(const QMap& files); void clearFiles(); - void addFiles(const QMap& files); - void addFiles(const QString& variant, const QFile& file); - QMap files(); + void addFiles(const QMap& files); + void addFiles(const QString& variant, const QString& file); + QMap files(); void setCategory(const QString& category); QString category(); @@ -54,7 +52,7 @@ private: QStringList m_subsets; QString m_version; QDate m_lastModified; - QMap m_files; + QMap m_files; QString m_category; QString m_kind; diff --git a/app/cmainwindow.cpp b/app/cmainwindow.cpp index 76c6eaf..a8e3a54 100644 --- a/app/cmainwindow.cpp +++ b/app/cmainwindow.cpp @@ -11,10 +11,11 @@ cMainWindow::cMainWindow(QWidget *parent) : QMainWindow(parent) - , ui(new Ui::cMainWindow) -{ + , ui(new Ui::cMainWindow) { ui->setupUi(this); + QList fonts; + QDir pluginsDir = QDir(QApplication::applicationDirPath()); const auto entryList = pluginsDir.entryList(QDir::Files); @@ -25,19 +26,24 @@ cMainWindow::cMainWindow(QWidget *parent) auto *interface = qobject_cast(plugin); if (!interface) return; + qDebug() << "API Version: " << interface->pluginAPIVersion(); qDebug() << "Name: " << interface->name(); qDebug() << "Version: " << interface->version(); + + fonts = interface->search(""); + qDebug() << fonts.count(); + + fonts.clear(); + fonts = interface->search("Roboto"); + qDebug() << fonts.count(); } #if 0 else qDebug() << loader.errorString(); #endif } - - } -cMainWindow::~cMainWindow() -{ +cMainWindow::~cMainWindow() { delete ui; } diff --git a/app/ifontprovider.h b/app/ifontprovider.h index 8cd3b9d..b30e041 100644 --- a/app/ifontprovider.h +++ b/app/ifontprovider.h @@ -4,14 +4,26 @@ #include #include +#include + +#include "cfont.h" class IFontProvider { public: - virtual ~IFontProvider() = default; - virtual QString name() = 0; - virtual QString version() = 0; + enum Sort { + alpha, + date, + popularity, + style + }; + + virtual ~IFontProvider() = default; + virtual QString pluginAPIVersion() = 0; + virtual QString name() = 0; + virtual QString version() = 0; + virtual QList search(const QString& family, const QString& subset = QString(), const Sort& sort = Sort::popularity) = 0; }; QT_BEGIN_NAMESPACE diff --git a/app/main.cpp b/app/main.cpp index 025da0a..a82834c 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -2,10 +2,10 @@ #include -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { QApplication a(argc, argv); cMainWindow w; w.show(); + return a.exec(); } diff --git a/plugins/googlefonts/CMakeLists.txt b/plugins/googlefonts/CMakeLists.txt index 64dadf5..7adde2e 100644 --- a/plugins/googlefonts/CMakeLists.txt +++ b/plugins/googlefonts/CMakeLists.txt @@ -3,11 +3,10 @@ qt_add_plugin(googlefonts CLASS_NAME GoogleFonts - cgooglefonts.cpp cgooglefonts.h + cgooglefonts.cpp cgooglefonts.h ../../app/cfont.cpp ../../app/cfont.h ) -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets - OPTIONAL_COMPONENTS PrintSupport) +find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network) set_target_properties(googlefonts PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}" @@ -21,6 +20,7 @@ target_link_libraries(googlefonts PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets + Qt6::Network ) if(TARGET Qt6::PrintSupport) diff --git a/plugins/googlefonts/cgooglefonts.cpp b/plugins/googlefonts/cgooglefonts.cpp index 4c412ba..724bea2 100644 --- a/plugins/googlefonts/cgooglefonts.cpp +++ b/plugins/googlefonts/cgooglefonts.cpp @@ -4,21 +4,174 @@ #include "cgooglefonts.h" #include +#include +#include +#include +#include -cGoogleFonts::cGoogleFonts() -{ +#include +#include + +#include +#include + + +QStringList arrayToString(const QJsonArray& array) { + QStringList list; + + foreach (const QJsonValue& item, array) { + list.append(item.toString()); + } + + return list; +} + +QMap objectToMap(const QJsonObject& object) { + QMap list; + + for (const QString &key : object.keys()) { + QJsonValue value = object.value(key); + list.insert(key, value.toString()); + } + + return list; } -cGoogleFonts::~cGoogleFonts() -{ +cGoogleFonts::cGoogleFonts() { + m_key = tr("AIzaSyCqPgQFvG-k4lbPF7L0oqJLKJxoC1O6R90"); } -QString cGoogleFonts::name() -{ +cGoogleFonts::~cGoogleFonts() { +} + +QString cGoogleFonts::pluginAPIVersion() { + return tr("1.0"); +} + +QString cGoogleFonts::name() { return tr("Google Fonts"); } -QString cGoogleFonts::version() -{ +QString cGoogleFonts::version() { return tr("0.1"); } + +QList cGoogleFonts::search(const QString& family, const QString& subset, const Sort& sort) { + QNetworkAccessManager networkManager; + QString urlString = "https://www.googleapis.com/webfonts/v1/webfonts"; + QUrlQuery query; + + query.addQueryItem("key", m_key); + + if(!family.isEmpty()) + query.addQueryItem("family", family); + + if(!subset.isEmpty()) + query.addQueryItem("subset", subset); + + switch(sort) + { + case Sort::alpha: + query.addQueryItem("sort", "alpha"); + break; + case Sort::date: + query.addQueryItem("sort", "date"); + break; + case Sort::popularity: + query.addQueryItem("sort", "popularity"); + break; + case Sort::style: + query.addQueryItem("sort", "style"); + break; + default: + query.addQueryItem("sort", "alpha"); + break; + } + + QUrl url(urlString); + url.setQuery(query); + + QNetworkRequest request(url); + + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + + QNetworkReply* reply = networkManager.get(request); + QEventLoop loop; + + QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); + + QByteArray data = reply->readAll(); + delete reply; + + QJsonDocument doc = QJsonDocument::fromJson(data); + if(doc.isNull()) { + qDebug() << "Error: JSON return is empty"; + return QList(); + } + + if(!doc.isObject()) { + qDebug() << "Error: invalid JSON"; + return QList(); + } + + QJsonObject root = doc.object(); + + if(!root.contains("items")) { + qDebug() << "Error: no fonts found"; + return QList(); + } + + QJsonValue itemsV = root.value("items"); + if(!itemsV.isArray()) { + qDebug() << "Error: no fonts found"; + return QList(); + } + + QJsonArray items = itemsV.toArray(); + + if(!items.count()) + return QList(); + + QList fontList; + + foreach (const QJsonValue& item, items) { + if (item.isObject()) { + cFont font; + QJsonObject obj = item.toObject(); + + if(obj.contains("family")) + font.setFamily(obj.value("family").toString()); + else + continue; + + if(obj.contains("variants")) + font.setVariants(arrayToString(obj.value("variants").toArray())); + + if(obj.contains("subsets")) + font.setSubsets(arrayToString(obj.value("subsets").toArray())); + + if(obj.contains("version")) + font.setVersion(obj.value("version").toString()); + + if(obj.contains("lastModified")) + font.setLastModified(QDate::fromString(obj.value("lastModified").toString())); + + if(obj.contains("files")) { + QJsonObject filesObj = obj.value("files").toObject(); + + font.setFiles(objectToMap(filesObj)); + } + + if(obj.contains("category")) + font.setCategory(obj.value("category").toString()); + + if(obj.contains("kind")) + font.setKind(obj.value("kind").toString()); + + fontList.append(font); + } + } + + return fontList; +} diff --git a/plugins/googlefonts/cgooglefonts.h b/plugins/googlefonts/cgooglefonts.h index 3f51768..ab25266 100644 --- a/plugins/googlefonts/cgooglefonts.h +++ b/plugins/googlefonts/cgooglefonts.h @@ -17,8 +17,13 @@ public: cGoogleFonts(); ~cGoogleFonts() override; - QString name() override; - QString version() override; + QString pluginAPIVersion() override; + QString name() override; + QString version() override; + + QList search(const QString& family, const QString& subset = QString(), const Sort& sort = Sort::popularity) override; +private: + QString m_key; }; #endif //CGOOGLEFONTS_H