From 774930c9506690c5c200d172f1240ba19569cb9b Mon Sep 17 00:00:00 2001 From: Le Tan Date: Fri, 1 Jan 2021 17:55:46 -0800 Subject: [PATCH] fix combobox style on macOS (#1638) * fix combobox style on macOS * fix SingleInstanceGuard on *nix * fix style on macos * fix demo --- libs/vtextedit | 2 +- src/core/singleinstanceguard.cpp | 18 ------------- src/utils/widgetutils.cpp | 13 +++++++++ src/utils/widgetutils.h | 3 +++ src/widgets/combobox.cpp | 27 +++++++++++++++++++ src/widgets/combobox.h | 18 +++++++++++++ src/widgets/dialogs/filepropertiesdialog.cpp | 3 ++- .../dialogs/folderfilesfilterwidget.cpp | 2 +- src/widgets/dialogs/linkinsertdialog.cpp | 3 ++- src/widgets/dialogs/nodeinfowidget.cpp | 3 ++- src/widgets/dialogs/notebookinfowidget.cpp | 5 ++-- .../dialogs/settings/appearancepage.cpp | 3 ++- src/widgets/dialogs/settings/editorpage.cpp | 3 ++- src/widgets/dialogs/settings/generalpage.cpp | 3 ++- .../dialogs/settings/markdowneditorpage.cpp | 7 ++--- .../dialogs/settings/texteditorpage.cpp | 3 ++- src/widgets/widgets.pri | 2 ++ src/widgets/widgetsfactory.cpp | 3 ++- 18 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 src/widgets/combobox.cpp create mode 100644 src/widgets/combobox.h diff --git a/libs/vtextedit b/libs/vtextedit index f06b36a4..01fb4118 160000 --- a/libs/vtextedit +++ b/libs/vtextedit @@ -1 +1 @@ -Subproject commit f06b36a457ec89e85c372905e5b388e30610e803 +Subproject commit 01fb4118f566ff7a71db67af72de1d586a0e9ee5 diff --git a/src/core/singleinstanceguard.cpp b/src/core/singleinstanceguard.cpp index b7b9e97b..aa92c976 100644 --- a/src/core/singleinstanceguard.cpp +++ b/src/core/singleinstanceguard.cpp @@ -27,7 +27,6 @@ bool SingleInstanceGuard::tryRun() { Q_ASSERT(!m_online); -#if defined(Q_OS_WIN) // On Windows, multiple servers on the same name are allowed. m_client = tryConnect(); if (m_client) { @@ -43,23 +42,6 @@ bool SingleInstanceGuard::tryRun() // We still allow the guard to run. There maybe a bug need to fix. qWarning() << "failed to connect to an existing instance or establish a new local server"; } -#else - m_server = tryListen(); - if (m_server) { - // We are the lucky one. - qInfo() << "guard succeeds to run"; - } else { - // Here we are sure there is another instance running. But we still use a socket to connect to make sure. - m_client = tryConnect(); - if (m_client) { - // We are sure there is another instance running. - return false; - } - - // We still allow the guard to run. There maybe a bug need to fix. - qWarning() << "failed to connect to an existing instance or establish a new local server"; - } -#endif setupServer(); diff --git a/src/utils/widgetutils.cpp b/src/utils/widgetutils.cpp index 632cf75a..d67bd1f7 100644 --- a/src/utils/widgetutils.cpp +++ b/src/utils/widgetutils.cpp @@ -21,6 +21,7 @@ #include #include #include +#include using namespace vnotex; @@ -353,3 +354,15 @@ void WidgetUtils::insertActionAfter(QMenu *p_menu, QAction *p_after, QAction *p_ p_menu->insertAction(p_action, p_after); } } + +QFormLayout *WidgetUtils::createFormLayout(QWidget *p_parent) +{ + auto layout = new QFormLayout(p_parent); + +#if defined(Q_OS_MACOS) + layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + layout->setFormAlignment(Qt::AlignLeft | Qt::AlignTop); +#endif + + return layout; +} diff --git a/src/utils/widgetutils.h b/src/utils/widgetutils.h index b19b3e8a..0fb44165 100644 --- a/src/utils/widgetutils.h +++ b/src/utils/widgetutils.h @@ -17,6 +17,7 @@ class QScrollArea; class QListView; class QMenu; class QShortcut; +class QFormLayout; namespace vnotex { @@ -77,6 +78,8 @@ namespace vnotex static void insertActionAfter(QMenu *p_menu, QAction *p_after, QAction *p_action); + static QFormLayout *createFormLayout(QWidget *p_parent = nullptr); + private: static void resizeToHideScrollBar(QScrollArea *p_scroll, bool p_vertical, bool p_horizontal); }; diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp new file mode 100644 index 00000000..430de197 --- /dev/null +++ b/src/widgets/combobox.cpp @@ -0,0 +1,27 @@ +#include "combobox.h" + +#include +#include + +using namespace vnotex; + +ComboBox::ComboBox(QWidget *p_parent) + : QComboBox(p_parent) +{ +} + +void ComboBox::showPopup() +{ + QComboBox::showPopup(); + +#if defined(Q_OS_MACOS) || defined(Q_OS_LINUX) + auto vw = view(); + if (count() > 0) { + int cnt = qMin(count(), maxVisibleItems()); + int height = 20 + cnt * vw->visualRect(vw->model()->index(0, 0)).height(); + if (height > vw->height()) { + vw->setMinimumHeight(height); + } + } +#endif +} diff --git a/src/widgets/combobox.h b/src/widgets/combobox.h new file mode 100644 index 00000000..b8334f48 --- /dev/null +++ b/src/widgets/combobox.h @@ -0,0 +1,18 @@ +#ifndef COMBOBOX_H +#define COMBOBOX_H + +#include + +namespace vnotex +{ + class ComboBox : public QComboBox + { + Q_OBJECT + public: + explicit ComboBox(QWidget *p_parent = nullptr); + + void showPopup() Q_DECL_OVERRIDE; + }; +} + +#endif // COMBOBOX_H diff --git a/src/widgets/dialogs/filepropertiesdialog.cpp b/src/widgets/dialogs/filepropertiesdialog.cpp index 0d3150ee..34bf7a92 100644 --- a/src/widgets/dialogs/filepropertiesdialog.cpp +++ b/src/widgets/dialogs/filepropertiesdialog.cpp @@ -8,6 +8,7 @@ #include "../lineedit.h" #include "../widgetsfactory.h" #include +#include using namespace vnotex; @@ -29,7 +30,7 @@ void FilePropertiesDialog::setupUI() auto widget = new QWidget(this); setCentralWidget(widget); - auto mainLayout = new QFormLayout(widget); + auto mainLayout = WidgetUtils::createFormLayout(widget); mainLayout->setContentsMargins(0, 0, 0, 0); const QFileInfo info(m_path); diff --git a/src/widgets/dialogs/folderfilesfilterwidget.cpp b/src/widgets/dialogs/folderfilesfilterwidget.cpp index 642035e0..8832dce0 100644 --- a/src/widgets/dialogs/folderfilesfilterwidget.cpp +++ b/src/widgets/dialogs/folderfilesfilterwidget.cpp @@ -35,7 +35,7 @@ FolderFilesFilterWidget::FolderFilesFilterWidget(QWidget *p_parent) void FolderFilesFilterWidget::setupUI() { - auto mainLayout = new QFormLayout(this); + auto mainLayout = WidgetUtils::createFormLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); { diff --git a/src/widgets/dialogs/linkinsertdialog.cpp b/src/widgets/dialogs/linkinsertdialog.cpp index d2309a21..2e155b80 100644 --- a/src/widgets/dialogs/linkinsertdialog.cpp +++ b/src/widgets/dialogs/linkinsertdialog.cpp @@ -6,6 +6,7 @@ #include #include +#include using namespace vnotex; @@ -29,7 +30,7 @@ void LinkInsertDialog::setupUI(const QString &p_title, auto mainWidget = new QWidget(this); setCentralWidget(mainWidget); - auto mainLayout = new QFormLayout(mainWidget); + auto mainLayout = WidgetUtils::createFormLayout(mainWidget); m_linkTextEdit = WidgetsFactory::createLineEdit(p_linkText, mainWidget); mainLayout->addRow(tr("&Text:"), m_linkTextEdit); diff --git a/src/widgets/dialogs/nodeinfowidget.cpp b/src/widgets/dialogs/nodeinfowidget.cpp index 77d7cfb5..41ef1bc2 100644 --- a/src/widgets/dialogs/nodeinfowidget.cpp +++ b/src/widgets/dialogs/nodeinfowidget.cpp @@ -8,6 +8,7 @@ #include #include "exception.h" #include "nodelabelwithupbutton.h" +#include using namespace vnotex; @@ -35,7 +36,7 @@ NodeInfoWidget::NodeInfoWidget(const Node *p_parentNode, void NodeInfoWidget::setupUI(const Node *p_parentNode) { - m_mainLayout = new QFormLayout(this); + m_mainLayout = WidgetUtils::createFormLayout(this); m_mainLayout->addRow(tr("Notebook:"), new QLabel(p_parentNode->getNotebook()->getName(), this)); diff --git a/src/widgets/dialogs/notebookinfowidget.cpp b/src/widgets/dialogs/notebookinfowidget.cpp index 435fcee9..553b4c69 100644 --- a/src/widgets/dialogs/notebookinfowidget.cpp +++ b/src/widgets/dialogs/notebookinfowidget.cpp @@ -17,6 +17,7 @@ #include "configmgr.h" #include #include "exception.h" +#include using namespace vnotex; @@ -43,7 +44,7 @@ void NotebookInfoWidget::setupUI() QGroupBox *NotebookInfoWidget::setupBasicInfoGroupBox(QWidget *p_parent) { auto box = new QGroupBox(tr("Basic Information"), p_parent); - auto mainLayout = new QFormLayout(box); + auto mainLayout = WidgetUtils::createFormLayout(box); { setupNotebookTypeComboBox(box); @@ -130,7 +131,7 @@ QLayout *NotebookInfoWidget::setupNotebookRootFolderPath(QWidget *p_parent) QGroupBox *NotebookInfoWidget::setupAdvancedInfoGroupBox(QWidget *p_parent) { auto box = new QGroupBox(tr("Advanced Information"), p_parent); - auto mainLayout = new QFormLayout(box); + auto mainLayout = WidgetUtils::createFormLayout(box); { setupConfigMgrComboBox(box); diff --git a/src/widgets/dialogs/settings/appearancepage.cpp b/src/widgets/dialogs/settings/appearancepage.cpp index 3b117173..a538d81e 100644 --- a/src/widgets/dialogs/settings/appearancepage.cpp +++ b/src/widgets/dialogs/settings/appearancepage.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace vnotex; @@ -19,7 +20,7 @@ AppearancePage::AppearancePage(QWidget *p_parent) void AppearancePage::setupUI() { - auto mainLayout = new QFormLayout(this); + auto mainLayout = WidgetUtils::createFormLayout(this); { const QString label(tr("System title bar")); diff --git a/src/widgets/dialogs/settings/editorpage.cpp b/src/widgets/dialogs/settings/editorpage.cpp index 9624f928..40c676e9 100644 --- a/src/widgets/dialogs/settings/editorpage.cpp +++ b/src/widgets/dialogs/settings/editorpage.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace vnotex; @@ -19,7 +20,7 @@ EditorPage::EditorPage(QWidget *p_parent) void EditorPage::setupUI() { - auto mainLayout = new QFormLayout(this); + auto mainLayout = WidgetUtils::createFormLayout(this); { m_autoSavePolicyComboBox = WidgetsFactory::createComboBox(this); diff --git a/src/widgets/dialogs/settings/generalpage.cpp b/src/widgets/dialogs/settings/generalpage.cpp index c4f66675..64519f66 100644 --- a/src/widgets/dialogs/settings/generalpage.cpp +++ b/src/widgets/dialogs/settings/generalpage.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace vnotex; @@ -19,7 +20,7 @@ GeneralPage::GeneralPage(QWidget *p_parent) void GeneralPage::setupUI() { - auto mainLayout = new QFormLayout(this); + auto mainLayout = WidgetUtils::createFormLayout(this); { m_localeComboBox = WidgetsFactory::createComboBox(this); diff --git a/src/widgets/dialogs/settings/markdowneditorpage.cpp b/src/widgets/dialogs/settings/markdowneditorpage.cpp index d3905c1e..3f0f63e7 100644 --- a/src/widgets/dialogs/settings/markdowneditorpage.cpp +++ b/src/widgets/dialogs/settings/markdowneditorpage.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "editorpage.h" @@ -107,7 +108,7 @@ QString MarkdownEditorPage::title() const QGroupBox *MarkdownEditorPage::setupReadGroup() { auto box = new QGroupBox(tr("Read"), this); - auto layout = new QFormLayout(box); + auto layout = WidgetUtils::createFormLayout(box); { const QString label(tr("Constrain image width")); @@ -169,7 +170,7 @@ QGroupBox *MarkdownEditorPage::setupReadGroup() QGroupBox *MarkdownEditorPage::setupEditGroup() { auto box = new QGroupBox(tr("Edit"), this); - auto layout = new QFormLayout(box); + auto layout = WidgetUtils::createFormLayout(box); { const QString label(tr("Insert file name as title")); @@ -207,7 +208,7 @@ QGroupBox *MarkdownEditorPage::setupEditGroup() QGroupBox *MarkdownEditorPage::setupGeneralGroup() { auto box = new QGroupBox(tr("General"), this); - auto layout = new QFormLayout(box); + auto layout = WidgetUtils::createFormLayout(box); { auto sectionLayout = new QHBoxLayout(); diff --git a/src/widgets/dialogs/settings/texteditorpage.cpp b/src/widgets/dialogs/settings/texteditorpage.cpp index 8d257d10..ce6bc28a 100644 --- a/src/widgets/dialogs/settings/texteditorpage.cpp +++ b/src/widgets/dialogs/settings/texteditorpage.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "editorpage.h" @@ -22,7 +23,7 @@ TextEditorPage::TextEditorPage(QWidget *p_parent) void TextEditorPage::setupUI() { - auto mainLayout = new QFormLayout(this); + auto mainLayout = WidgetUtils::createFormLayout(this); { m_lineNumberComboBox = WidgetsFactory::createComboBox(this); diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index f737d644..11d8ef54 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -2,6 +2,7 @@ SOURCES += \ $$PWD/attachmentdragdropareaindicator.cpp \ $$PWD/attachmentpopup.cpp \ $$PWD/biaction.cpp \ + $$PWD/combobox.cpp \ $$PWD/dialogs/dialog.cpp \ $$PWD/dialogs/filepropertiesdialog.cpp \ $$PWD/dialogs/imageinsertdialog.cpp \ @@ -82,6 +83,7 @@ HEADERS += \ $$PWD/attachmentdragdropareaindicator.h \ $$PWD/attachmentpopup.h \ $$PWD/biaction.h \ + $$PWD/combobox.h \ $$PWD/dialogs/dialog.h \ $$PWD/dialogs/importfolderutils.h \ $$PWD/dialogs/filepropertiesdialog.h \ diff --git a/src/widgets/widgetsfactory.cpp b/src/widgets/widgetsfactory.cpp index ccf581ee..72d9d359 100644 --- a/src/widgets/widgetsfactory.cpp +++ b/src/widgets/widgetsfactory.cpp @@ -9,6 +9,7 @@ #include #include "lineedit.h" +#include "combobox.h" using namespace vnotex; @@ -38,7 +39,7 @@ QLineEdit *WidgetsFactory::createLineEdit(const QString &p_contents, QWidget *p_ QComboBox *WidgetsFactory::createComboBox(QWidget *p_parent) { - auto comboBox = new QComboBox(p_parent); + auto comboBox = new ComboBox(p_parent); auto itemDelegate = new QStyledItemDelegate(comboBox); comboBox->setItemDelegate(itemDelegate); return comboBox;