From a51cb0982b506e4c3cfdccba3d4e644450a30523 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Fri, 14 Feb 2014 03:02:59 +0100 Subject: [PATCH] Added Mac-specific settings dialog that looks more native --- .gitmodules | 3 + cmake/modules/QtVersionAbstraction.cmake | 8 ++ src/3rdparty/qtmacgoodies | 1 + src/CMakeLists.txt | 18 ++++ src/mirall/accountsettings.cpp | 19 +++- src/mirall/owncloudgui.cpp | 13 ++- src/mirall/owncloudgui.h | 5 + src/mirall/protocolwidget.cpp | 3 + src/mirall/settingsdialogmac.cpp | 113 +++++++++++++++++++++++ src/mirall/settingsdialogmac.h | 45 +++++++++ src/mirall/utility.cpp | 12 ++- 11 files changed, 230 insertions(+), 10 deletions(-) create mode 160000 src/3rdparty/qtmacgoodies create mode 100644 src/mirall/settingsdialogmac.cpp create mode 100644 src/mirall/settingsdialogmac.h diff --git a/.gitmodules b/.gitmodules index 073864fee..ebcd8dbef 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "doc/ocdoc"] path = doc/ocdoc url = https://github.com/owncloud/documentation +[submodule "src/3rdparty/qtmacgoodies"] + path = src/3rdparty/qtmacgoodies + url = git://github.com/shadone/qtmacgoodies.git diff --git a/cmake/modules/QtVersionAbstraction.cmake b/cmake/modules/QtVersionAbstraction.cmake index 1d8403d99..daf53a067 100644 --- a/cmake/modules/QtVersionAbstraction.cmake +++ b/cmake/modules/QtVersionAbstraction.cmake @@ -16,6 +16,9 @@ if( NOT BUILD_WITH_QT4 ) find_package(Qt5Sensors QUIET) find_package(Qt5Xml QUIET) # find_package(Qt5WebKitWidgets QUIET) +if(APPLE) + find_package(Qt5MacExtras QUIET) +endif() message(STATUS "Using Qt 5!") @@ -31,6 +34,11 @@ if( NOT BUILD_WITH_QT4 ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") # set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") +if(APPLE) + include_directories(${Qt5MacExtras_INCLUDE_DIRS}) + add_definitions(${Qt5MacExtras_DEFINITIONS}) + set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5MacExtras_LIBRARIES}) +endif() macro(qt_wrap_ui) qt5_wrap_ui(${ARGN}) diff --git a/src/3rdparty/qtmacgoodies b/src/3rdparty/qtmacgoodies new file mode 160000 index 000000000..ab7ee2915 --- /dev/null +++ b/src/3rdparty/qtmacgoodies @@ -0,0 +1 @@ +Subproject commit ab7ee2915f491bca192ad2879547935d7c784c34 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 81b3ccf37..3a4260e56 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,13 @@ set(3rdparty_SRC 3rdparty/QProgressIndicator/QProgressIndicator.cpp ) +if (APPLE) + list(APPEND 3rdparty_SRC + 3rdparty/qtmacgoodies/src/macpreferenceswindow.mm + 3rdparty/qtmacgoodies/src/macstandardicon.mm + ) +endif() + set(3rdparty_HEADER 3rdparty/qtsingleapplication/qtlocalpeer.h 3rdparty/qtsingleapplication/qtsingleapplication.h @@ -46,6 +53,13 @@ set(3rdparty_HEADER 3rdparty/QProgressIndicator/QProgressIndicator.h ) +if (APPLE) + list(APPEND 3rdparty_HEADER + 3rdparty/qtmacgoodies/src/macpreferenceswindow.h + 3rdparty/qtmacgoodies/src/macstandardicon.h + ) +endif() + qt_wrap_cpp(3rdparty_MOC ${3rdparty_HEADER}) if(NOT WIN32) @@ -60,6 +74,7 @@ set(3rdparty_INC ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/QProgressIndicator ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/fancylineedit ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qjson + ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtmacgoodies/src ) set(libsync_SRCS @@ -314,6 +329,9 @@ IF( APPLE ) list(APPEND mirall_SRCS mirall/cocoainitializer_mac.mm) list(APPEND mirall_HEADERS mirall/cocoainitializer.h) + list(APPEND mirall_SRCS mirall/settingsdialogmac.cpp) + list(APPEND mirall_HEADERS mirall/settingsdialogmac.h) + if(SPARKLE_FOUND) # Define this, we need to check in updater.cpp add_definitions( -DHAVE_SPARKLE ) diff --git a/src/mirall/accountsettings.cpp b/src/mirall/accountsettings.cpp index f320751c3..e8bbcc2be 100644 --- a/src/mirall/accountsettings.cpp +++ b/src/mirall/accountsettings.cpp @@ -67,7 +67,11 @@ AccountSettings::AccountSettings(QWidget *parent) : ui->_folderList->setItemDelegate( delegate ); ui->_folderList->setModel( _model ); +#if defined(Q_OS_MAC) + ui->_folderList->setMinimumWidth( 400 ); +#else ui->_folderList->setMinimumWidth( 300 ); +#endif ui->_folderList->setEditTriggers( QAbstractItemView::NoEditTriggers ); ui->_buttonRemove->setEnabled(false); @@ -424,9 +428,18 @@ void AccountSettings::slotEnableCurrentFolder() if( f && folderEnabled ) { // check if a sync is still running and if so, ask if we should terminate. if( f->isBusy() ) { // its still running - int reply = QMessageBox::question( 0, tr("Sync Running"), - tr("The syncing operation is running.
Do you want to terminate it?"), - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); +#if defined(Q_OS_MAC) + QWidget *parent = this; + Qt::WindowFlags flags = Qt::Sheet; +#else + QWidget *parent = 0; + Qt::WindowFlags flags = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint; // default flags +#endif + QMessageBox msgbox(QMessageBox::Question, tr("Sync Running"), + tr("The syncing operation is running.
Do you want to terminate it?"), + QMessageBox::Yes | QMessageBox::No, parent, flags); + msgbox.setDefaultButton(QMessageBox::Yes); + int reply = msgbox.exec(); if ( reply == QMessageBox::Yes ) terminate = true; else diff --git a/src/mirall/owncloudgui.cpp b/src/mirall/owncloudgui.cpp index 47e07f145..56d535118 100644 --- a/src/mirall/owncloudgui.cpp +++ b/src/mirall/owncloudgui.cpp @@ -19,7 +19,11 @@ #include "mirall/utility.h" #include "mirall/progressdispatcher.h" #include "mirall/owncloudsetupwizard.h" -#include "mirall/settingsdialog.h" +#if defined(Q_OS_MAC) +# include "mirall/settingsdialogmac.h" +#else +# include "mirall/settingsdialog.h" +#endif #include "mirall/logger.h" #include "mirall/logbrowser.h" #include "mirall/account.h" @@ -473,7 +477,12 @@ void ownCloudGui::slotShowGuiMessage(const QString &title, const QString &messag void ownCloudGui::slotShowSettings() { if (_settingsDialog.isNull()) { - _settingsDialog = new SettingsDialog(this); + _settingsDialog = +#if defined(Q_OS_MAC) + new SettingsDialogMac(this); +#else + new SettingsDialog(this); +#endif _settingsDialog->setAttribute( Qt::WA_DeleteOnClose, true ); _settingsDialog->show(); } diff --git a/src/mirall/owncloudgui.h b/src/mirall/owncloudgui.h index 074433a24..c51e1e574 100644 --- a/src/mirall/owncloudgui.h +++ b/src/mirall/owncloudgui.h @@ -28,6 +28,7 @@ namespace Mirall { class SettingsDialog; +class SettingsDialogMac; class Application; class LogBrowser; @@ -77,7 +78,11 @@ private: void setupActions(); QPointer _tray; +#if defined(Q_OS_MAC) + QPointer _settingsDialog; +#else QPointer _settingsDialog; +#endif QPointer_logBrowser; // tray's menu QMenu *_contextMenu; diff --git a/src/mirall/protocolwidget.cpp b/src/mirall/protocolwidget.cpp index 25ef6109b..516445b1c 100644 --- a/src/mirall/protocolwidget.cpp +++ b/src/mirall/protocolwidget.cpp @@ -58,6 +58,9 @@ ProtocolWidget::ProtocolWidget(QWidget *parent) : _ui->_treeWidget->setRootIsDecorated(false); _ui->_treeWidget->setTextElideMode(Qt::ElideMiddle); _ui->_treeWidget->header()->setObjectName("ActivityListHeader"); +#if defined(Q_OS_MAC) + _ui->_treeWidget->setMinimumWidth(400); +#endif connect(this, SIGNAL(guiLog(QString,QString)), Logger::instance(), SIGNAL(guiLog(QString,QString))); diff --git a/src/mirall/settingsdialogmac.cpp b/src/mirall/settingsdialogmac.cpp new file mode 100644 index 000000000..0a3f7a79c --- /dev/null +++ b/src/mirall/settingsdialogmac.cpp @@ -0,0 +1,113 @@ +#include "settingsdialogmac.h" + +#include "macstandardicon.h" + +#include "mirall/folderman.h" +#include "mirall/theme.h" +#include "mirall/generalsettings.h" +#include "mirall/networksettings.h" +#include "mirall/accountsettings.h" +#include "mirall/mirallconfigfile.h" +#include "mirall/progressdispatcher.h" +#include "mirall/owncloudgui.h" +#include "mirall/protocolwidget.h" + +#include +#include +#include +#include +#include + +namespace Mirall { + +SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent) + : MacPreferencesWindow(parent) +{ + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + + setObjectName("SettingsMac"); // required as group for saveGeometry call + + setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI())); + + _accountSettings = new AccountSettings; + QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Undefined, true); + _accountIdx = addPreferencesPanel(icon, tr("Account"), _accountSettings); + + QIcon protocolIcon(QLatin1String(":/mirall/resources/activity.png")); + _protocolWidget = new ProtocolWidget; + _protocolIdx = addPreferencesPanel(protocolIcon, tr("Activity"), _protocolWidget); + + QIcon generalIcon = MacStandardIcon::icon(MacStandardIcon::PreferencesGeneral); + GeneralSettings *generalSettings = new GeneralSettings; + addPreferencesPanel(generalIcon, tr("General"), generalSettings); + + QIcon networkIcon = MacStandardIcon::icon(MacStandardIcon::Network); + NetworkSettings *networkSettings = new NetworkSettings; + addPreferencesPanel(networkIcon, tr("Network"), networkSettings); + + FolderMan *folderMan = FolderMan::instance(); + connect( folderMan, SIGNAL(folderSyncStateChange(QString)), + this, SLOT(slotSyncStateChange(QString))); + + QuotaInfo *quotaInfo = gui->quotaInfo(); + connect( quotaInfo, SIGNAL(quotaUpdated(qint64,qint64)), + _accountSettings, SLOT(slotUpdateQuota(qint64,qint64))); + _accountSettings->slotUpdateQuota(quotaInfo->lastQuotaTotalBytes(), quotaInfo->lastQuotaUsedBytes()); + connect( _accountSettings, SIGNAL(folderChanged()), gui, SLOT(slotFoldersChanged())); + connect( _accountSettings, SIGNAL(openFolderAlias(const QString&)), + gui, SLOT(slotFolderOpenAction(QString))); + + connect( ProgressDispatcher::instance(), SIGNAL(progressInfo(QString, Progress::Info)), + _accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) ); + connect( ProgressDispatcher::instance(), SIGNAL(progressSyncProblem(QString,Progress::SyncProblem)), + _accountSettings, SLOT(slotProgressProblem(QString,Progress::SyncProblem)) ); + + QAction *showLogWindow = new QAction(this); + showLogWindow->setShortcut(QKeySequence("F12")); + connect(showLogWindow, SIGNAL(triggered()), gui, SLOT(slotToggleLogBrowser())); + addAction(showLogWindow); + + MirallConfigFile cfg; + cfg.restoreGeometry(this); +} + +void SettingsDialogMac::slotSyncStateChange(const QString& alias) +{ + FolderMan *folderMan = FolderMan::instance(); + SyncResult state = folderMan->accountStatus(folderMan->map().values()); + QIcon accountIcon = Theme::instance()->syncStateIcon(state.status()); + setPreferencesPanelIcon(_accountIdx, accountIcon); + + Folder *folder = folderMan->folder(alias); + if( folder ) { + _accountSettings->slotUpdateFolderState(folder); + } +} + +void SettingsDialogMac::setGeneralErrors(const QStringList &errors) +{ + if( _accountSettings ) { + _accountSettings->setGeneralErrors(errors); + } +} + +void SettingsDialogMac::closeEvent(QCloseEvent *event) +{ + MirallConfigFile cfg; + cfg.saveGeometry(this); + MacPreferencesWindow::closeEvent(event); +} + +void SettingsDialogMac::slotRefreshResultList() +{ + if( _protocolWidget ) { + _protocolWidget->initializeList(); + } +} + +void SettingsDialogMac::showActivityPage() +{ + setCurrentPanelIndex(_protocolIdx); +} + +} diff --git a/src/mirall/settingsdialogmac.h b/src/mirall/settingsdialogmac.h new file mode 100644 index 000000000..fe8f2b417 --- /dev/null +++ b/src/mirall/settingsdialogmac.h @@ -0,0 +1,45 @@ +#ifndef SETTINGSDIALOGMAC_H +#define SETTINGSDIALOGMAC_H + +#include "mirall/progressdispatcher.h" +#include "macpreferenceswindow.h" + +class QStandardItemModel; +class QListWidgetItem; + +namespace Mirall { + +class AccountSettings; +class ProtocolWidget; +class Application; +class FolderMan; +class ownCloudGui; + +class SettingsDialogMac : public MacPreferencesWindow +{ + Q_OBJECT + +public: + explicit SettingsDialogMac(ownCloudGui *gui, QWidget *parent = 0); + + void setGeneralErrors( const QStringList& errors ); + +public slots: + void slotSyncStateChange(const QString& alias); + void slotRefreshResultList(); + void showActivityPage(); + +private: + void closeEvent(QCloseEvent *event); + + AccountSettings *_accountSettings; + QListWidgetItem *_accountItem; + ProtocolWidget *_protocolWidget; + + int _accountIdx; + int _protocolIdx; +}; + +} + +#endif // SETTINGSDIALOGMAC_H diff --git a/src/mirall/utility.cpp b/src/mirall/utility.cpp index 61942a486..3b8b69b3c 100644 --- a/src/mirall/utility.cpp +++ b/src/mirall/utility.cpp @@ -166,11 +166,13 @@ void Utility::raiseDialog( QWidget *raiseWidget ) if( raiseWidget ) { #if defined(Q_OS_WIN) || defined (Q_OS_MAC) Qt::WindowFlags eFlags = raiseWidget->windowFlags(); - eFlags |= Qt::WindowStaysOnTopHint; - raiseWidget->setWindowFlags(eFlags); - raiseWidget->show(); - eFlags &= ~Qt::WindowStaysOnTopHint; - raiseWidget->setWindowFlags(eFlags); + if (!(eFlags & Qt::WindowStaysOnTopHint)) { + eFlags |= Qt::WindowStaysOnTopHint; + raiseWidget->setWindowFlags(eFlags); + raiseWidget->show(); + eFlags &= ~Qt::WindowStaysOnTopHint; + raiseWidget->setWindowFlags(eFlags); + } #endif raiseWidget->show(); raiseWidget->raise();