Initial commit

This commit is contained in:
Selim Mustafaev 2023-06-12 10:46:46 +03:00
commit fd3ce483f0
9 changed files with 291 additions and 0 deletions

78
.gitignore vendored Normal file
View File

@ -0,0 +1,78 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
CMakeLists.txt.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
# CLion
cmake-build-debug/
.idea/

39
CMakeLists.txt Normal file
View File

@ -0,0 +1,39 @@
cmake_minimum_required(VERSION 3.16)
project(AutoCatQt VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_PREFIX_PATH "/home/selim/qt/6.4.3/gcc_64/lib/cmake")
find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)
find_package(nlohmann_json REQUIRED)
qt_standard_project_setup()
qt_add_executable(appAutoCatQt
main.cpp
services/Settings.cpp services/Settings.h models/User.cpp models/User.h)
qt_add_qml_module(appAutoCatQt
URI AutoCatQt
VERSION 1.0
QML_FILES views/LoginWindow.qml
QML_FILES views/MainWindow.qml
)
set_target_properties(appAutoCatQt PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
target_link_libraries(appAutoCatQt
PRIVATE Qt6::Quick
PRIVATE nlohmann_json::nlohmann_json
)
install(TARGETS appAutoCatQt
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

25
main.cpp Normal file
View File

@ -0,0 +1,25 @@
#include "services/Settings.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
int main(int argc, char *argv[])
{
QQuickWindow::setGraphicsApi(QSGRendererInterface::Software);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
&app, []() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
auto settings = Settings::instance();
if(settings.user().token.empty()) {
engine.load(QUrl(u"qrc:/AutoCatQt/views/LoginWindow.qml"_qs));
} else {
engine.load(QUrl(u"qrc:/AutoCatQt/views/MainWindow.qml"_qs));
}
return app.exec();
}

9
models/User.cpp Normal file
View File

@ -0,0 +1,9 @@
//
// Created by selim on 5/6/23.
//
#include "User.h"
User::User(std::string_view email, std::string_view token): email(email), token(token) {
}

28
models/User.h Normal file
View File

@ -0,0 +1,28 @@
//
// Created by selim on 5/6/23.
//
#ifndef AUTOCATQT_USER_H
#define AUTOCATQT_USER_H
#include <string>
#include <optional>
#include <nlohmann/json.hpp>
class User {
public:
std::string email;
std::string token;
std::optional<std::string> googleIdToken;
std::optional<std::string> googleRefreshToken;
public:
User() = default;
User(const User& user) = default;
User(User&&) = default;
User(std::string_view email, std::string_view token);
NLOHMANN_DEFINE_TYPE_INTRUSIVE(User, email, token)
};
#endif //AUTOCATQT_USER_H

68
services/Settings.cpp Normal file
View File

@ -0,0 +1,68 @@
//
// Created by selim on 5/6/23.
//
#include "Settings.h"
#include <nlohmann/json.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
fs::path Settings::getDataPath() {
auto dataDir = std::getenv("XDG_DATA_HOME");
if(dataDir) {
return fs::path(dataDir) / "autocat";
}
auto home = std::getenv("HOME");
if(home) {
return fs::path(home) / ".local" / "share" / "autocat";
}
throw std::runtime_error("Failed to find data home directory");
}
std::string readString(const fs::path& path) {
std::ifstream stream(path);
stream.seekg(0, std::ios::end);
auto size = stream.tellg();
std::string buffer(size, ' ');
stream.seekg(0);
stream.read(&buffer[0], size);
return buffer;
}
void writeString(const fs::path& path, const std::string& text) {
std::ofstream stream(path);
stream << text;
}
Settings Settings::instance() {
static Settings instance;
return instance;
}
Settings::Settings() {
_dataPath = getDataPath();
if(!fs::exists(_dataPath)) {
fs::create_directories(_dataPath);
}
}
User Settings::user() const {
auto userFile = _dataPath / "user.json";
if(fs::exists(userFile)) {
auto jsonText = readString(userFile);
std::cout << "User json text: " << jsonText << std::endl;
return nlohmann::json::parse(jsonText).get<User>();
} else {
return {};
}
}
void Settings::setUser(const User &user) {
auto userFile = _dataPath / "user.json";
nlohmann::json json = user;
auto userString = json.dump(4);
writeString(userFile, userString);
}

26
services/Settings.h Normal file
View File

@ -0,0 +1,26 @@
//
// Created by selim on 5/6/23.
//
#ifndef AUTOCATQT_SETTINGS_H
#define AUTOCATQT_SETTINGS_H
#include "../models/User.h"
#include <filesystem>
namespace fs = std::filesystem;
class Settings {
private:
fs::path _dataPath;
public:
static Settings instance();
Settings();
static fs::path getDataPath();
[[nodiscard]] User user() const;
void setUser(const User& user);
};
#endif //AUTOCATQT_SETTINGS_H

9
views/LoginWindow.qml Normal file
View File

@ -0,0 +1,9 @@
import QtQuick
import QtQuick.Window
Window {
height: 480
width: 640
title: "Login"
visible: true
}

9
views/MainWindow.qml Normal file
View File

@ -0,0 +1,9 @@
import QtQuick
import QtQuick.Window
Window {
height: 480
title: "Main window"
visible: true
width: 640
}