From 1fb6e777a35c20a9f4918958a31b118dcce7a11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B6=9B?= Date: Sat, 29 Aug 2020 11:53:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E4=B8=8E=E6=9B=B4=E6=96=B0git=E5=8A=9F=E8=83=BD=20(#1?= =?UTF-8?q?482)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加git同步功能 * windows下增加图标 * Git操作改为异步 * 优化同步功能 * 更新完成后重新加载当前笔记本 * 上传前关闭所有已打开笔记 * Revert "更新完成后重新加载当前笔记本" This reverts commit 67bf9836b83203093dd71f8df99b903bcaa0adb1. * optimize code * revert VDirectoryTree.h * format code Co-authored-by: musmus9405 <542719479@qq.com> --- src/CMakeLists.txt | 25 ++++ src/resources/icon.rc | 1 + src/translations/vnote_zh_CN.qm | Bin 158568 -> 159385 bytes src/translations/vnote_zh_CN.ts | 68 ++++++++++ src/utils/vSync.cpp | 217 ++++++++++++++++++++++++++++++++ src/utils/vSync.h | 84 +++++++++++++ src/vdirectorytree.cpp | 68 ++++++++++ src/vdirectorytree.h | 1 + src/vmainwindow.cpp | 93 ++++++++++++++ src/vmainwindow.h | 12 ++ 10 files changed, 569 insertions(+) create mode 100644 src/resources/icon.rc create mode 100644 src/utils/vSync.cpp create mode 100644 src/utils/vSync.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3e1e8b4d..7d343030 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,9 +12,34 @@ target_sources(VNote PRIVATE ${DIALOG_SRCS}) target_sources(VNote PRIVATE ${UTILS_SRCS}) target_sources(VNote PRIVATE ${WIDGETS_SRCS}) target_sources(VNote PRIVATE ${QRC_FILES}) +if(WIN32) +target_sources(VNote PRIVATE resources/icon.rc) +endif(WIN32) include_directories(dialog utils widgets) +# Remove the console of gui program +if(WIN32) + if(MSVC) + set_target_properties(VNote PROPERTIES + WIN32_EXECUTABLE YES + LINK_FLAGS "/ENTRY:mainCRTStartup" + ) + elseif(CMAKE_COMPILER_IS_GNUCXX) + # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested + else() + message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)") + endif(MSVC) +elseif(APPLE) + set_target_properties(VNote PROPERTIES + MACOSX_BUNDLE YES + ) +elseif(UNIX) + # Nothing special required +else() + message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)") +endif(WIN32) + # Qt5 libraries target_link_libraries(VNote PRIVATE Qt5::Core Qt5::WebEngine Qt5::WebEngineWidgets Qt5::Network Qt5::PrintSupport Qt5::WebChannel Qt5::Widgets diff --git a/src/resources/icon.rc b/src/resources/icon.rc new file mode 100644 index 00000000..0669e583 --- /dev/null +++ b/src/resources/icon.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "resources/icons/vnote.ico" \ No newline at end of file diff --git a/src/translations/vnote_zh_CN.qm b/src/translations/vnote_zh_CN.qm index 4c5803a787b3a2b274274a378c309c3f128f6d41..8d9e599ed38495c378faf8a7eaef7cd6c5e48f1f 100644 GIT binary patch delta 11688 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 Use system's background color configuration for editor 为编辑器使用系统的背景色设置 + + + &Sync + 同步 + + + + &Upload + 上传 + + + + &Download + 更新 + + + + upload note + 上传当前笔记本 + + + + download note + 更新当前笔记本 + + + + Are you sure to close opened notes + 确认关闭已打开笔记 + + + + VNote will close all the opened notes before upload. + VNote会在上传前关闭所有已打开笔记 + VMarkdownTab @@ -8861,4 +8896,37 @@ Please check the network or image size 字数 + + VSync + + + Sync + 同步 + + + + Sure + 确认 + + + + Downloading + 更新中... + + + + Uploading + 上传中... + + + + Download Success + 更新成功 + + + + Upload Success + 上传成功 + + diff --git a/src/utils/vSync.cpp b/src/utils/vSync.cpp new file mode 100644 index 00000000..abb4d86f --- /dev/null +++ b/src/utils/vSync.cpp @@ -0,0 +1,217 @@ +#include "vSync.h" +#include +#include +#include +#include +#include +#include + +VSync::VSync(QWidget *parent) : QObject(parent) +{ + m_process = new QProcess(this); + connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadOutput())); + connect(m_process, SIGNAL(readyReadStandardError()), this, SLOT(onReadError())); + connect(m_process, SIGNAL(finished(int)), this, SLOT(onProcessFinish(int))); + + m_messageBox = new QMessageBox(parent); + m_messageBox->setModal(true); + m_messageBox->setWindowTitle(tr("Sync")); + m_messageBox->setStandardButtons(QMessageBox::NoButton); + m_messageButton = new QPushButton(m_messageBox); + m_messageButton->setText(tr("Sure")); + connect(m_messageButton, &QPushButton::clicked, this, &VSync::onMessageButtonClick); +} + +VSync::~VSync() +{ + m_process->close(); +} + +void VSync::status() +{ + this->m_type = SyncType::Status; + this->start(getSyncHead("status")); +} + +void VSync::add() +{ + this->m_type = SyncType::Add; + this->start(getSyncHead("add -A")); +} + +void VSync::commit() +{ + this->m_type = SyncType::Commit; + QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"); + this->start(getSyncHead(QString("commit -m %1").arg(time))); +} + +void VSync::push() +{ + this->m_type = SyncType::Push; + this->start(getSyncHead("push")); +} + +void VSync::pull() +{ + this->m_type = SyncType::Pull; + this->start(getSyncHead("pull")); +} + +void VSync::authentication() +{ + this->m_type = SyncType::Authentication; + this->start("git config --global credential.helper store"); +} + +void VSync::download() +{ + showMessageBox(tr("Downloading"), false); + this->m_target = SyncTarget::Download; + this->status(); +} + +void VSync::upload() +{ + showMessageBox(tr("Uploading"), false); + this->m_target = SyncTarget::Upload; + this->status(); +} + +void VSync::onReadOutput() +{ + QString output = m_process->readAllStandardOutput(); + qDebug() << "VSync.onReadOutput: " << output; + m_output.append(output); +} + +void VSync::onReadError() +{ + QString error = m_process->readAllStandardError(); + qDebug() << "VSync.onReadError: " << error; + m_error.append(error); +} + +void VSync::onProcessFinish(int exitCode) +{ + qInfo() << "VSync.onProcessFinish: " << exitCode; + if (exitCode == 0) + { + switch (this->m_target) + { + case SyncTarget::Download: + this->processDownload(); + break; + case SyncTarget::Upload: + this->processUpload(); + break; + default: + break; + } + } + else + { + /* code */ + qCritical() << "sync failed, error: " << m_error << ", info: " << m_output; + QString message = QString("sync failed, exitCode: %1, error: %2, info: %3").arg(exitCode).arg(m_error).arg(m_output); + showMessageBox(message, true); + } + + m_error.clear(); + m_output.clear(); +} + +void VSync::start(const QString &cmd) +{ + m_process->start("cmd", QStringList() << "/c" << cmd); + m_process->waitForStarted(); +} + +void VSync::showMessageBox(const QString &message, bool showButton) +{ + m_messageBox->setText(message); + if (showButton) + { + m_messageBox->addButton(m_messageButton, QMessageBox::ButtonRole::YesRole); + } + else + { + m_messageBox->removeButton(m_messageButton); + } + + if (!m_messageBox->isVisible()) + { + m_messageBox->setVisible(true); + } +} + +void VSync::hideMessageBox() +{ + m_messageBox->removeButton(m_messageButton); + m_messageBox->setVisible(false); +} + +void VSync::onMessageButtonClick() +{ + m_messageBox->hide(); +} + +void VSync::processDownload() +{ + switch (this->m_type) + { + case SyncType::Status: + this->authentication(); + break; + case SyncType::Authentication: + this->pull(); + break; + case SyncType::Pull: + this->downloadFinish(); + break; + default: + break; + } +} + +void VSync::processUpload() +{ + switch (this->m_type) + { + case SyncType::Status: + this->add(); + break; + case SyncType::Add: + this->commit(); + break; + case SyncType::Commit: + this->authentication(); + break; + case SyncType::Authentication: + this->push(); + break; + case SyncType::Push: + this->uploadFinish(); + break; + default: + break; + } +} + +void VSync::downloadFinish() +{ + qInfo() << "download finish"; + showMessageBox(tr("Download Success"), true); + m_type = VSync::SyncType::None; + m_target = VSync::SyncTarget::None; + emit this->downloadSuccess(); +} + +void VSync::uploadFinish() +{ + qInfo() << "upload finish"; + showMessageBox(tr("Upload Success"), true); + m_type = VSync::SyncType::None; + m_target = VSync::SyncTarget::None; + emit this->uploadSuccess(); +} \ No newline at end of file diff --git a/src/utils/vSync.h b/src/utils/vSync.h new file mode 100644 index 00000000..a5149c2f --- /dev/null +++ b/src/utils/vSync.h @@ -0,0 +1,84 @@ +#ifndef _V_SYNC_H_ +#define _V_SYNC_H_ +#include +#include +#include + +class QMessageBox; +class QPushButton; +class VSync : public QObject +{ + Q_OBJECT +private: + enum class SyncType + { + None, + Status, + Add, + Commit, + Push, + Pull, + Authentication + }; + + enum class SyncTarget + { + None, + Upload, + Download, + }; +signals: + void downloadSuccess(); + void uploadSuccess(); +public: + VSync(QWidget *parent = NULL); + ~VSync(); + void setDir(const QString &dir); + void upload(); + void download(); +private slots: + void onReadOutput(); + void onReadError(); + void onProcessFinish(int exitCode); + +private: + void status(); + void add(); + void commit(); + void push(); + void pull(); + void authentication(); + void processDownload(); + void processUpload(); + void downloadFinish(); + void uploadFinish(); + + void start(const QString &cmd); + void showMessageBox(const QString &message, bool showButton); + void hideMessageBox(); + void onMessageButtonClick(); + QString VSync::getSyncHead(const QString &args) const; + +private: + QString m_dir; + + QMessageBox *m_messageBox; + QPushButton *m_messageButton; + QProcess *m_process; + SyncType m_type; + SyncTarget m_target; + QString m_output; + QString m_error; +}; + +inline void VSync::setDir(const QString &dir) +{ + this->m_dir = dir; +}; + +inline QString VSync::getSyncHead(const QString &args) const +{ + return QString("git -C %1 %2").arg(this->m_dir).arg(args); +} + +#endif diff --git a/src/vdirectorytree.cpp b/src/vdirectorytree.cpp index 2a8efacc..4dda57ac 100644 --- a/src/vdirectorytree.cpp +++ b/src/vdirectorytree.cpp @@ -668,6 +668,74 @@ void VDirectoryTree::openDirectoryLocation() const QDesktopServices::openUrl(url); } +void VDirectoryTree::reloadAllFromDisk() +{ + if (!m_notebook) + { + return; + } + + QString info = tr("Are you sure to reload notebook %2?") + .arg(g_config->c_dataTextStyle) + .arg(m_notebook->getName()); + QString msg = tr("Notebook %1 reloaded from disk").arg(m_notebook->getName()); + + if (g_config->getConfirmReloadFolder()) + { + int ret = VUtils::showMessage(QMessageBox::Information, tr("Information"), + info, + tr("VNote will close all the related notes before reload."), + QMessageBox::Ok | QMessageBox::YesToAll | QMessageBox::Cancel, + QMessageBox::Ok, + this); + switch (ret) + { + case QMessageBox::YesToAll: + g_config->setConfirmReloadFolder(false); + // Fall through. + + case QMessageBox::Ok: + break; + + case QMessageBox::Cancel: + return; + + default: + return; + } + } + + m_notebookCurrentDirMap.remove(m_notebook); + + if (!m_editArea->closeFile(m_notebook, false)) + { + return; + } + + m_notebook->close(); + + if (!m_notebook->open()) + { + VUtils::showMessage(QMessageBox::Warning, tr("Warning"), + tr("Fail to open notebook %2.") + .arg(g_config->c_dataTextStyle) + .arg(m_notebook->getName()), + tr("Please check if path %2 exists.") + .arg(g_config->c_dataTextStyle) + .arg(m_notebook->getPath()), + QMessageBox::Ok, QMessageBox::Ok, this); + clear(); + return; + } + + updateDirectoryTree(); + + if (!msg.isEmpty()) + { + g_mainWin->showStatusMessage(msg); + } +} + void VDirectoryTree::reloadFromDisk() { if (!m_notebook) { diff --git a/src/vdirectorytree.h b/src/vdirectorytree.h index 6f42e5ed..911cb492 100644 --- a/src/vdirectorytree.h +++ b/src/vdirectorytree.h @@ -35,6 +35,7 @@ public: // Implementations for VNavigationMode. void showNavigation() Q_DECL_OVERRIDE; bool handleKeyNavigation(int p_key, bool &p_succeed) Q_DECL_OVERRIDE; + void reloadAllFromDisk(); signals: void currentDirectoryChanged(VDirectory *p_directory); diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index 3f93f6a1..e6036d6a 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -52,6 +52,7 @@ #include "vlistue.h" #include "vtagexplorer.h" #include "vmdeditor.h" +#include "vSync.h" extern VConfigManager *g_config; @@ -113,6 +114,8 @@ VMainWindow::VMainWindow(VSingleInstanceGuard *p_guard, QWidget *p_parent) initDockWindows(); + initSync(); + int state = g_config->getPanelViewState(); if (state < 0 || state >= (int)PanelViewState::Invalid) { state = (int)PanelViewState::VerticalMode; @@ -813,6 +816,9 @@ void VMainWindow::initMenuBar() initEditMenu(); initViewMenu(); initMarkdownMenu(); +#if defined(Q_OS_WIN) + initSyncMenu(); +#endif initHelpMenu(); setMenuBarVisible(g_config->getMenuBarChecked()); @@ -990,6 +996,73 @@ void VMainWindow::initMarkdownMenu() previewWidthAct->setChecked(g_config->getEnablePreviewImageConstraint()); } +void VMainWindow::initSyncMenu() +{ + m_syncMenu = menuBar()->addMenu(tr("&Sync")); + m_syncMenu->setToolTipsVisible(true); + QAction* uploadAction = new QAction(tr("&Upload"), this); + uploadAction->setToolTip(tr("upload note")); + connect(uploadAction, &QAction::triggered, this, &VMainWindow::upload); + m_syncMenu->addAction(uploadAction); + + QAction* downloadAction = new QAction(tr("&Download"), this); + downloadAction->setToolTip(tr("download note")); + connect(downloadAction, &QAction::triggered, this, &VMainWindow::download); + m_syncMenu->addAction(downloadAction); +} + +void VMainWindow::upload() +{ + QVector& noteBooks = vnote->getNotebooks(); + for (QVector::iterator i = noteBooks.begin(); i < noteBooks.end(); i++) + { + QString notebookDir = (*i)->getPath(); + QString notebookName = (*i)->getName(); + if ((*i)->isOpened()) + { + qDebug() << "notebook name: " << notebookName << "notebook path: " << notebookDir; + int ret = VUtils::showMessage(QMessageBox::Information, tr("Information"), + tr("Are you sure to close opened notes"), + tr("VNote will close all the opened notes before upload."), + QMessageBox::Ok | QMessageBox::Cancel, + QMessageBox::Ok, + this); + switch (ret) + { + case QMessageBox::Ok: + this->m_editArea->closeAllFiles(true); + break; + + case QMessageBox::Cancel: + return; + + default: + return; + } + m_git->setDir(notebookDir); + m_git->upload(); + break; + } + } +} + +void VMainWindow::download() +{ + QVector ¬eBooks = vnote->getNotebooks(); + for (QVector::iterator i = noteBooks.begin(); i < noteBooks.end(); i++) + { + QString notebookDir = (*i)->getPath(); + QString notebookName = (*i)->getName(); + if ((*i)->isOpened()) + { + qDebug() << "notebook name: " << notebookName << "notebook path: " << notebookDir; + m_git->setDir(notebookDir); + m_git->download(); + break; + } + } +} + void VMainWindow::initViewMenu() { m_viewMenu = menuBar()->addMenu(tr("&View")); @@ -3654,3 +3727,23 @@ void VMainWindow::checkIfNeedToShowWelcomePage() m_editArea->openFile(file, OpenFileMode::Read); } } + +void VMainWindow::initSync() +{ + m_git = new VSync(); + connect(m_git, &VSync::downloadSuccess, this, &VMainWindow::onDownloadSuccess); + connect(m_git, &VSync::uploadSuccess, this, &VMainWindow::onUploadSuccess); +} + +void VMainWindow::onDownloadSuccess() +{ + if (m_dirTree) + { + m_dirTree->reloadAllFromDisk(); + } +} + +void VMainWindow::onUploadSuccess() +{ + +} \ No newline at end of file diff --git a/src/vmainwindow.h b/src/vmainwindow.h index 2da51331..fa0192b0 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -45,6 +45,7 @@ class VUniversalEntry; class VHistoryList; class VExplorer; class VTagExplorer; +class VSync; #define RESTART_EXIT_CODE 1000 @@ -246,6 +247,12 @@ private: void initViewMenu(); void initMarkdownMenu(); void initHelpMenu(); + void initSyncMenu(); + void initSync(); + void upload(); + void download(); + void onDownloadSuccess(); + void onUploadSuccess(); void initDockWindows(); @@ -468,6 +475,9 @@ private: QToolBar *m_noteToolBar; + // sync menu + QMenu *m_syncMenu; + // All the ToolBar. QVector m_toolBars; @@ -512,6 +522,8 @@ private: VTagExplorer *m_tagExplorer; + VSync *m_git; + // Whether sync note list to current tab. bool m_syncNoteListToCurrentTab;