initial commit

main
Herwig Birke 1 year ago
parent 63c00f646e
commit 587484164d

@ -8,7 +8,5 @@ find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
qt_standard_project_setup(REQUIRES 6.8) qt_standard_project_setup(REQUIRES 6.8)
add_compile_definitions(QT_NO_CAST_FROM_ASCII)
add_subdirectory(plugins) add_subdirectory(plugins)
add_subdirectory(app) add_subdirectory(app)

@ -14,15 +14,15 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
set(PROJECT_SOURCES set(PROJECT_SOURCES
main.cpp main.cpp
cmainwindow.cpp cmainwindow.cpp
cmainwindow.h cmainwindow.h
cmainwindow.ui cmainwindow.ui
) )
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(fontManager qt_add_executable(fontManager
MANUAL_FINALIZATION MANUAL_FINALIZATION
${PROJECT_SOURCES} ${PROJECT_SOURCES}
ifontprovider.h ifontprovider.h
cfont.h cfont.cpp 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 # For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else() else()
if(ANDROID) if(ANDROID)
add_library(fontManager SHARED add_library(fontManager SHARED
${PROJECT_SOURCES} ${PROJECT_SOURCES}
) )
# Define properties for Android with Qt 5 after find_package() calls as: # Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else() else()
add_executable(fontManager add_executable(fontManager
${PROJECT_SOURCES} ${PROJECT_SOURCES}
) )
endif() endif()
endif() endif()

@ -1,8 +1,9 @@
#include "cfont.h" #include "cfont.h"
#include <QFile>
cFont::cFont(QObject *parent)
: QObject{parent} cFont::cFont()
{ {
} }
@ -76,7 +77,7 @@ QDate cFont::lastModified() {
return m_lastModified; return m_lastModified;
} }
void cFont::setFiles(const QMap<QString, QFile>& files) { void cFont::setFiles(const QMap<QString, QString>& files) {
for (auto [key, value] : files.asKeyValueRange()) { for (auto [key, value] : files.asKeyValueRange()) {
m_files.insert(key, value); m_files.insert(key, value);
} }
@ -86,19 +87,19 @@ void cFont::clearFiles() {
m_files.clear(); m_files.clear();
} }
void cFont::addFiles(const QMap<QString, QFile>& files) { void cFont::addFiles(const QMap<QString, QString>& files) {
for (auto [key, value] : files.asKeyValueRange()) { for (auto [key, value] : files.asKeyValueRange()) {
if (!m_files.contains(key)) if (!m_files.contains(key))
m_files.insert(key, value); 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)) if (!m_files.contains(variant))
m_files.insert(variant, file); m_files.insert(variant, file);
} }
QMap<QString, QFile> cFont::files() { QMap<QString, QString> cFont::files() {
return m_files; return m_files;
} }

@ -2,18 +2,16 @@
#define CFONT_H #define CFONT_H
#include <QObject> //#include <QObject>
#include <QString> #include <QString>
#include <QDate> #include <QDate>
#include <QMap> #include <QMap>
#include <QFile>
class cFont : public QObject class cFont
{ {
Q_OBJECT
public: public:
explicit cFont(QObject *parent = nullptr); explicit cFont();
void setFamily(const QString& family); void setFamily(const QString& family);
QString family(); QString family();
@ -36,11 +34,11 @@ public:
void setLastModified(const QDate& lastModified); void setLastModified(const QDate& lastModified);
QDate lastModified(); QDate lastModified();
void setFiles(const QMap<QString, QFile>& files); void setFiles(const QMap<QString, QString>& files);
void clearFiles(); void clearFiles();
void addFiles(const QMap<QString, QFile>& files); void addFiles(const QMap<QString, QString>& files);
void addFiles(const QString& variant, const QFile& file); void addFiles(const QString& variant, const QString& file);
QMap<QString, QFile> files(); QMap<QString, QString> files();
void setCategory(const QString& category); void setCategory(const QString& category);
QString category(); QString category();
@ -54,7 +52,7 @@ private:
QStringList m_subsets; QStringList m_subsets;
QString m_version; QString m_version;
QDate m_lastModified; QDate m_lastModified;
QMap<QString, QFile> m_files; QMap<QString, QString> m_files;
QString m_category; QString m_category;
QString m_kind; QString m_kind;

@ -11,10 +11,11 @@
cMainWindow::cMainWindow(QWidget *parent) cMainWindow::cMainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui::cMainWindow) , ui(new Ui::cMainWindow) {
{
ui->setupUi(this); ui->setupUi(this);
QList<cFont> fonts;
QDir pluginsDir = QDir(QApplication::applicationDirPath()); QDir pluginsDir = QDir(QApplication::applicationDirPath());
const auto entryList = pluginsDir.entryList(QDir::Files); const auto entryList = pluginsDir.entryList(QDir::Files);
@ -25,19 +26,24 @@ cMainWindow::cMainWindow(QWidget *parent)
auto *interface = qobject_cast<IFontProvider *>(plugin); auto *interface = qobject_cast<IFontProvider *>(plugin);
if (!interface) if (!interface)
return; return;
qDebug() << "API Version: " << interface->pluginAPIVersion();
qDebug() << "Name: " << interface->name(); qDebug() << "Name: " << interface->name();
qDebug() << "Version: " << interface->version(); qDebug() << "Version: " << interface->version();
fonts = interface->search("");
qDebug() << fonts.count();
fonts.clear();
fonts = interface->search("Roboto");
qDebug() << fonts.count();
} }
#if 0 #if 0
else else
qDebug() << loader.errorString(); qDebug() << loader.errorString();
#endif #endif
} }
} }
cMainWindow::~cMainWindow() cMainWindow::~cMainWindow() {
{
delete ui; delete ui;
} }

@ -4,14 +4,26 @@
#include <QtPlugin> #include <QtPlugin>
#include <QString> #include <QString>
#include <QList>
#include "cfont.h"
class IFontProvider class IFontProvider
{ {
public: public:
virtual ~IFontProvider() = default; enum Sort {
virtual QString name() = 0; alpha,
virtual QString version() = 0; date,
popularity,
style
};
virtual ~IFontProvider() = default;
virtual QString pluginAPIVersion() = 0;
virtual QString name() = 0;
virtual QString version() = 0;
virtual QList<cFont> search(const QString& family, const QString& subset = QString(), const Sort& sort = Sort::popularity) = 0;
}; };
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE

@ -2,10 +2,10 @@
#include <QApplication> #include <QApplication>
int main(int argc, char *argv[]) int main(int argc, char *argv[]) {
{
QApplication a(argc, argv); QApplication a(argc, argv);
cMainWindow w; cMainWindow w;
w.show(); w.show();
return a.exec(); return a.exec();
} }

@ -3,11 +3,10 @@
qt_add_plugin(googlefonts qt_add_plugin(googlefonts
CLASS_NAME 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 find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network)
OPTIONAL_COMPONENTS PrintSupport)
set_target_properties(googlefonts PROPERTIES set_target_properties(googlefonts PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}" LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
@ -21,6 +20,7 @@ target_link_libraries(googlefonts PRIVATE
Qt6::Core Qt6::Core
Qt6::Gui Qt6::Gui
Qt6::Widgets Qt6::Widgets
Qt6::Network
) )
if(TARGET Qt6::PrintSupport) if(TARGET Qt6::PrintSupport)

@ -4,21 +4,174 @@
#include "cgooglefonts.h" #include "cgooglefonts.h"
#include <QString> #include <QString>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
cGoogleFonts::cGoogleFonts() #include <QUrl>
{ #include <QUrlQuery>
#include <QJsonDocument>
#include <QJsonArray>
QStringList arrayToString(const QJsonArray& array) {
QStringList list;
foreach (const QJsonValue& item, array) {
list.append(item.toString());
}
return list;
}
QMap<QString, QString> objectToMap(const QJsonObject& object) {
QMap<QString, QString> 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"); return tr("Google Fonts");
} }
QString cGoogleFonts::version() QString cGoogleFonts::version() {
{
return tr("0.1"); return tr("0.1");
} }
QList<cFont> 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<cFont>();
}
if(!doc.isObject()) {
qDebug() << "Error: invalid JSON";
return QList<cFont>();
}
QJsonObject root = doc.object();
if(!root.contains("items")) {
qDebug() << "Error: no fonts found";
return QList<cFont>();
}
QJsonValue itemsV = root.value("items");
if(!itemsV.isArray()) {
qDebug() << "Error: no fonts found";
return QList<cFont>();
}
QJsonArray items = itemsV.toArray();
if(!items.count())
return QList<cFont>();
QList<cFont> 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;
}

@ -17,8 +17,13 @@ public:
cGoogleFonts(); cGoogleFonts();
~cGoogleFonts() override; ~cGoogleFonts() override;
QString name() override; QString pluginAPIVersion() override;
QString version() override; QString name() override;
QString version() override;
QList<cFont> search(const QString& family, const QString& subset = QString(), const Sort& sort = Sort::popularity) override;
private:
QString m_key;
}; };
#endif //CGOOGLEFONTS_H #endif //CGOOGLEFONTS_H

Loading…
Cancel
Save