зеркало из https://github.com/nextcloud/desktop.git
first port to C++
This commit is contained in:
Коммит
b7a3fc7ab8
|
@ -0,0 +1,3 @@
|
|||
build
|
||||
*flymake*
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
project(mirall)
|
||||
|
||||
find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtXml REQUIRED )
|
||||
add_subdirectory(src)
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
include_directories(${CMAKE_SOURCE_DIR}/src)
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
include(${QT_USE_FILE})
|
||||
|
||||
set(mirall_SRCS
|
||||
mirall/application.cpp
|
||||
mirall/folder.cpp
|
||||
mirall/gitfolder.cpp
|
||||
mirall/folderwatcher.cpp
|
||||
main.cpp)
|
||||
|
||||
qt4_automoc(${mirall_SRCS})
|
||||
|
||||
add_executable(mirall ${mirall_SRCS})
|
||||
target_link_libraries(mirall ${QT_LIBRARIES})
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include "mirall/application.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Mirall::Application app(argc, argv);
|
||||
return app.exec();
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QIcon>
|
||||
#include <QMenu>
|
||||
#include <QSystemTrayIcon>
|
||||
|
||||
#include "mirall/constants.h"
|
||||
#include "mirall/application.h"
|
||||
#include "mirall/folder.h"
|
||||
#include "mirall/gitfolder.h"
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
Application::Application(int argc, char **argv) :
|
||||
QApplication(argc, argv)
|
||||
{
|
||||
_folder = new GitFolder(QDir::homePath() + "/Mirall", this);
|
||||
setApplicationName("Mirall");
|
||||
setupActions();
|
||||
setupSystemTray();
|
||||
setupContextMenu();
|
||||
}
|
||||
|
||||
Application::~Application()
|
||||
{
|
||||
}
|
||||
|
||||
void Application::setupActions()
|
||||
{
|
||||
_actionAddFolder = new QAction(tr("Add folder"), this);
|
||||
QObject::connect(_actionAddFolder, SIGNAL(triggered(bool)), SLOT(slotAddFolder()));
|
||||
_actionQuit = new QAction(tr("Quit"), this);
|
||||
QObject::connect(_actionQuit, SIGNAL(triggered(bool)), SLOT(quit()));
|
||||
}
|
||||
|
||||
void Application::setupSystemTray()
|
||||
{
|
||||
_tray = new QSystemTrayIcon(this);
|
||||
_tray->setIcon(QIcon(FOLDER_ICON));
|
||||
_tray->show();
|
||||
}
|
||||
|
||||
void Application::setupContextMenu()
|
||||
{
|
||||
QMenu *contextMenu = new QMenu();
|
||||
contextMenu->addAction(_actionAddFolder);
|
||||
contextMenu->addAction(_folder->action());
|
||||
contextMenu->addSeparator();
|
||||
contextMenu->addAction(_actionQuit);
|
||||
_tray->setContextMenu(contextMenu);
|
||||
}
|
||||
|
||||
void Application::slotAddFolder()
|
||||
{
|
||||
qDebug() << "add a folder here...";
|
||||
}
|
||||
|
||||
|
||||
} // namespace Mirall
|
||||
|
||||
#include "application.moc"
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef APPLICATION_H
|
||||
#define APPLICATION_H
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
class QAction;
|
||||
class QSystemTrayIcon;
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
class Folder;
|
||||
|
||||
class Application : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Application(int argc, char **argv);
|
||||
~Application();
|
||||
signals:
|
||||
|
||||
protected slots:
|
||||
|
||||
void slotAddFolder();
|
||||
|
||||
protected:
|
||||
|
||||
void setupActions();
|
||||
void setupSystemTray();
|
||||
void setupContextMenu();
|
||||
|
||||
private:
|
||||
Folder *_folder;
|
||||
QSystemTrayIcon *_tray;
|
||||
QAction *_actionQuit;
|
||||
QAction *_actionAddFolder;
|
||||
};
|
||||
|
||||
} // namespace Mirall
|
||||
|
||||
#endif // APPLICATION_H
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#ifndef MIRALL_CONSTANTS_H
|
||||
#define MIRALL_CONSTANTS_H
|
||||
|
||||
#define FOLDER_ICON "/usr/share/icons/oxygen/48x48/places/folder-favorites.png"
|
||||
#define FOLDER_SYNC_ICON = "/usr/share/icons/oxygen/48x48/actions/folder-sync.png"
|
||||
#define FOLDER_SYNC_ERROR = "/usr/share/icons/oxygen/48x48/places/folder-important.png"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,48 @@
|
|||
#include <QAction>
|
||||
#include <QDebug>
|
||||
#include <QDesktopServices>
|
||||
#include <QIcon>
|
||||
#include <QMutexLocker>
|
||||
#include <QUrl>
|
||||
|
||||
#include "mirall/constants.h"
|
||||
#include "mirall/folder.h"
|
||||
#include "mirall/folderwatcher.h"
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
Folder::Folder(const QString &path, QObject *parent)
|
||||
: QObject(parent),
|
||||
_path(path)
|
||||
{
|
||||
_action = new QAction(QIcon(FOLDER_ICON), path, this);
|
||||
QObject::connect(_action, SIGNAL(triggered(bool)), SLOT(slotOpenFolder()));
|
||||
|
||||
_watcher = new Mirall::FolderWatcher(path, this);
|
||||
QObject::connect(_watcher, SIGNAL(folderChanged(const QString &)),
|
||||
SLOT(slotChanged(const QString &)));
|
||||
}
|
||||
|
||||
QAction * Folder::action() const
|
||||
{
|
||||
return _action;
|
||||
}
|
||||
|
||||
Folder::~Folder()
|
||||
{
|
||||
}
|
||||
|
||||
void Folder::slotChanged(const QString &path)
|
||||
{
|
||||
//qDebug() << "path " << path << " changed";
|
||||
}
|
||||
|
||||
void Folder::slotOpenFolder()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl(_path));
|
||||
}
|
||||
|
||||
|
||||
} // namespace Mirall
|
||||
|
||||
#include "folder.moc"
|
|
@ -0,0 +1,46 @@
|
|||
#ifndef MIRALL_FOLDER_H
|
||||
#define MIRALL_FOLDER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
|
||||
class QAction;
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
class FolderWatcher;
|
||||
|
||||
class Folder : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Folder(const QString &path, QObject *parent = 0L);
|
||||
virtual ~Folder();
|
||||
|
||||
QAction *action() const;
|
||||
|
||||
/**
|
||||
* starts a sync operation
|
||||
* requests are serialized
|
||||
*/
|
||||
virtual void startSync() = 0;
|
||||
|
||||
signals:
|
||||
void syncStarted();
|
||||
void syncFinished();
|
||||
|
||||
protected:
|
||||
|
||||
private:
|
||||
QString _path;
|
||||
FolderWatcher *_watcher;
|
||||
QAction *_action;
|
||||
private slots:
|
||||
void slotChanged(const QString &path);
|
||||
void slotOpenFolder();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,105 @@
|
|||
|
||||
#include <QFileInfo>
|
||||
#include <QFileSystemWatcher>
|
||||
#include <QFlags>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QMutexLocker>
|
||||
#include <QStringList>
|
||||
|
||||
#include "mirall/folderwatcher.h"
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
enum SubFolderListOption {
|
||||
SubFolderNoOptions = 0x0,
|
||||
SubFolderRecursive = 0x1,
|
||||
};
|
||||
Q_DECLARE_FLAGS(SubFolderListOptions, SubFolderListOption)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(SubFolderListOptions)
|
||||
|
||||
// Forgive me using a bool as a flag
|
||||
static QStringList subFoldersList(QString folder,
|
||||
SubFolderListOptions options = SubFolderNoOptions )
|
||||
{
|
||||
QDir dir(folder);
|
||||
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
|
||||
QFileInfoList list = dir.entryInfoList();
|
||||
QStringList dirList;
|
||||
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QFileInfo fileInfo = list.at(i);
|
||||
dirList << fileInfo.absoluteFilePath();
|
||||
if (options & SubFolderRecursive )
|
||||
dirList << subFoldersList(fileInfo.absoluteFilePath(), options);
|
||||
}
|
||||
return dirList;
|
||||
}
|
||||
|
||||
FolderWatcher::FolderWatcher(const QString &path, QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
_watcher = new QFileSystemWatcher(this);
|
||||
|
||||
// watch the path and all subdirectories
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
|
||||
QStringList subfolders(subFoldersList(path, SubFolderRecursive));
|
||||
qDebug() << "adding watchers for " << subfolders;
|
||||
|
||||
QStringListIterator subfoldersIt(subfolders);
|
||||
while (subfoldersIt.hasNext()) {
|
||||
_watcher->addPath(subfoldersIt.next());
|
||||
}
|
||||
|
||||
}
|
||||
QObject::connect(_watcher, SIGNAL(directoryChanged(const QString &)),
|
||||
SLOT(slotDirectoryChanged(const QString &)));
|
||||
}
|
||||
|
||||
FolderWatcher::~FolderWatcher()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void FolderWatcher::slotDirectoryChanged(const QString &path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
|
||||
qDebug() << "changed: " << path;
|
||||
|
||||
qDebug() << "updating subdirectories";
|
||||
|
||||
QStringList watchedFolders(_watcher->directories());
|
||||
QStringListIterator watchedFoldersIt(watchedFolders);
|
||||
|
||||
while (watchedFoldersIt.hasNext()) {
|
||||
QDir folder (watchedFoldersIt.next());
|
||||
if (!folder.exists()){
|
||||
qDebug() << "Removing " << folder.path();
|
||||
_watcher->removePath(folder.path());
|
||||
}
|
||||
}
|
||||
|
||||
QStringListIterator subfoldersIt(subFoldersList(path, SubFolderRecursive));
|
||||
while (subfoldersIt.hasNext()) {
|
||||
QDir folder (subfoldersIt.next());
|
||||
if (folder.exists() && !watchedFolders.contains(folder.path())) {
|
||||
qDebug() << "Adding " << folder.path();
|
||||
_watcher->addPath(folder.path());
|
||||
}
|
||||
|
||||
// Look if some of the subdirectories disappeared
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
emit folderChanged(path);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#include "folderwatcher.moc"
|
|
@ -0,0 +1,30 @@
|
|||
|
||||
#ifndef MIRALL_FOLDERWATCHER_H
|
||||
#define MIRALL_FOLDERWATCHER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QMutex>
|
||||
|
||||
class QFileSystemWatcher;
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
class FolderWatcher : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
FolderWatcher(const QString &path, QObject *parent = 0L);
|
||||
~FolderWatcher();
|
||||
signals:
|
||||
void folderChanged(const QString &path);
|
||||
protected slots:
|
||||
void slotDirectoryChanged(const QString &path);
|
||||
private:
|
||||
QFileSystemWatcher *_watcher;
|
||||
QMutex _mutex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,24 @@
|
|||
#include <QMutexLocker>
|
||||
#include "mirall/gitfolder.h"
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
GitFolder::GitFolder(const QString &path, QObject *parent)
|
||||
: Folder(path, parent)
|
||||
{
|
||||
}
|
||||
|
||||
GitFolder::~GitFolder()
|
||||
{
|
||||
}
|
||||
|
||||
void GitFolder::startSync()
|
||||
{
|
||||
QMutexLocker locker(&_syncMutex);
|
||||
emit syncStarted();
|
||||
emit syncFinished();
|
||||
}
|
||||
|
||||
} // ns
|
||||
|
||||
#include "gitfolder.moc"
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef MIRALL_GITFOLDER_H
|
||||
#define MIRALL_GITFOLDER_H
|
||||
|
||||
#include <QMutex>
|
||||
#include "mirall/folder.h"
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
class GitFolder : public Folder
|
||||
{
|
||||
public:
|
||||
GitFolder(const QString &path, QObject *parent = 0L);
|
||||
virtual ~GitFolder();
|
||||
|
||||
virtual void startSync();
|
||||
private:
|
||||
QMutex _syncMutex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
Загрузка…
Ссылка в новой задаче