From 322659d210850f6cd004377e5e87d505016731af Mon Sep 17 00:00:00 2001 From: Crylia Date: Wed, 29 May 2024 17:27:33 +0200 Subject: [PATCH] init commit, add filemonitor and controller, add basic mainwindow --- .gitignore | 3 + CMakeLists.txt | 33 +++++++++++ .../FileController/FileController.cpp | 16 ++++++ .../FileController/FileController.hpp | 18 ++++++ src/Core/FileMonitor/FileMonitor.cpp | 55 +++++++++++++++++++ src/Core/FileMonitor/FileMonitor.hpp | 34 ++++++++++++ src/View/MainWidget/MainWidget.cpp | 0 src/View/MainWidget/MainWidget.hpp | 15 +++++ src/View/MainWindow/MainWindow.cpp | 5 ++ src/View/MainWindow/MainWindow.hpp | 12 ++++ src/main.cpp | 14 +++++ 11 files changed, 205 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 src/Controller/FileController/FileController.cpp create mode 100644 src/Controller/FileController/FileController.hpp create mode 100644 src/Core/FileMonitor/FileMonitor.cpp create mode 100644 src/Core/FileMonitor/FileMonitor.hpp create mode 100644 src/View/MainWidget/MainWidget.cpp create mode 100644 src/View/MainWidget/MainWidget.hpp create mode 100644 src/View/MainWindow/MainWindow.cpp create mode 100644 src/View/MainWindow/MainWindow.hpp create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore index 259148f..e60dcfd 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ *.exe *.out *.app + +build/ +.cache/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eee8d8f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.5) + +project(QutieFM VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt6 REQUIRED COMPONENTS Widgets Qml Svg Core Sql) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Qml Svg Core Sql) + +file(GLOB_RECURSE PROJECT_SOURCES src/*.cpp) +file(GLOB_RECURSE PROJECT_HEADERS src/*.hpp) +file(GLOB_RECURSE PROJECT_RESOURCES assets/resources.qrc) + +add_executable(QutieFM + ${PROJECT_SOURCES} + ${PROJECT_HEADERS} + ${PROJECT_RESOURCES} +) + +target_link_libraries(QutieFM PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Qml + Qt${QT_VERSION_MAJOR}::Svg + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Sql + fmt + stdc++fs +) diff --git a/src/Controller/FileController/FileController.cpp b/src/Controller/FileController/FileController.cpp new file mode 100644 index 0000000..f90278a --- /dev/null +++ b/src/Controller/FileController/FileController.cpp @@ -0,0 +1,16 @@ +#include "FileController.hpp" +#include +#include + +FileController::FileController() { + m_fmWorker = std::make_unique(QString("/home/crylia/"), + std::chrono::milliseconds(1000)); + m_fmWorker->moveToThread(&m_fsThread); + + m_fmWorker->start(QString("/home/crylia/")); +} + +FileController::~FileController() { + m_fsThread.quit(); + m_fsThread.wait(); +} diff --git a/src/Controller/FileController/FileController.hpp b/src/Controller/FileController/FileController.hpp new file mode 100644 index 0000000..0908c6c --- /dev/null +++ b/src/Controller/FileController/FileController.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +#include "../../Core/FileMonitor/FileMonitor.hpp" + +class FileController : public QObject { + Q_OBJECT +public: + FileController(); + ~FileController(); + +private: + QThread m_fsThread; + + std::unique_ptr m_fmWorker; +}; diff --git a/src/Core/FileMonitor/FileMonitor.cpp b/src/Core/FileMonitor/FileMonitor.cpp new file mode 100644 index 0000000..6ab5154 --- /dev/null +++ b/src/Core/FileMonitor/FileMonitor.cpp @@ -0,0 +1,55 @@ +#include "FileMonitor.hpp" +#include +#include + +FileMonitor::FileMonitor(QString path, + std::chrono::duration delay) + : m_path(path), m_delay(delay) { + + for (auto &file : + std::filesystem::recursive_directory_iterator(m_path.toStdString())) { + m_paths[QString::fromStdString(file.path().string())] = + std::filesystem::last_write_time(file); + } +} + +void FileMonitor::start(const QString path) { + while (m_running) { + std::this_thread::sleep_for(m_delay); + + auto pbegin = m_paths.begin(); + while (pbegin != m_paths.end()) { + if (!std::filesystem::exists(pbegin->first.toStdString())) { + emit update(pbegin->first, FileEvent::erased); + pbegin = m_paths.erase(pbegin); + } else + pbegin++; + } + + for (auto &file : + std::filesystem::recursive_directory_iterator(m_path.toStdString())) { + auto curr_file_last_write = std::filesystem::last_write_time(file); + + if (!contains(QString::fromStdString(file.path().string()))) { + m_paths[QString::fromStdString(file.path().string())] = + curr_file_last_write; + emit update(QString::fromStdString(file.path().string()), + FileEvent::created); + } else { + if (m_paths[QString::fromStdString(file.path().string())] != + curr_file_last_write) { + m_paths[QString::fromStdString(file.path().string())] = + curr_file_last_write; + emit update(QString::fromStdString(file.path().string()), + FileEvent::modified); + } + } + } + } +} + +void FileMonitor::stop() { m_running = false; } + +bool FileMonitor::contains(const QString &key) { + return m_paths.find(key) != m_paths.end(); +} diff --git a/src/Core/FileMonitor/FileMonitor.hpp b/src/Core/FileMonitor/FileMonitor.hpp new file mode 100644 index 0000000..c047ed5 --- /dev/null +++ b/src/Core/FileMonitor/FileMonitor.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include +#include + +enum class FileEvent { created, modified, erased }; + +class FileMonitor : public QObject { + Q_OBJECT +public: + std::chrono::duration m_delay; + + FileMonitor(QString path, std::chrono::duration delay); + ~FileMonitor() = default; + + void SetPath(QString path) { m_path = path; } + +public slots: + void start(const QString path); + void stop(); + +private: + std::unordered_map m_paths; + bool m_running; + QString m_path; + + bool contains(const QString &key); + +signals: + void update(const QString path, const FileEvent); +}; diff --git a/src/View/MainWidget/MainWidget.cpp b/src/View/MainWidget/MainWidget.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/View/MainWidget/MainWidget.hpp b/src/View/MainWidget/MainWidget.hpp new file mode 100644 index 0000000..9adea02 --- /dev/null +++ b/src/View/MainWidget/MainWidget.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include +#include + +class MainWidget : public QWidget { + Q_OBJECT +public: + MainWidget() = default; + ~MainWidget() = default; + +private: +}; diff --git a/src/View/MainWindow/MainWindow.cpp b/src/View/MainWindow/MainWindow.cpp new file mode 100644 index 0000000..7cdb654 --- /dev/null +++ b/src/View/MainWindow/MainWindow.cpp @@ -0,0 +1,5 @@ +#include "MainWindow.hpp" + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {} + +MainWindow::~MainWindow() {} diff --git a/src/View/MainWindow/MainWindow.hpp b/src/View/MainWindow/MainWindow.hpp new file mode 100644 index 0000000..bce95f4 --- /dev/null +++ b/src/View/MainWindow/MainWindow.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +class MainWindow : public QMainWindow { + Q_OBJECT +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..ccaf990 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,14 @@ +#include "View/MainWindow/MainWindow.hpp" +#include +#include + +int main(int argc, char *argv[]) { + QApplication app(argc, argv); + + auto w = std::make_unique(); + + w->setMinimumHeight(200); + w->show(); + + return app.exec(); +}