diff --git a/.gitignore b/.gitignore
index abae8706..5b58e761 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,8 @@ compile_flags.txt
.cache
.tasks
.vimspector.json
+GPATH
+GRTAGS
+GTAGS
+aqtinstall.log
+tags
diff --git a/scripts/coc_update.cmd b/scripts/coc_update.cmd
deleted file mode 100644
index 7fac21e8..00000000
--- a/scripts/coc_update.cmd
+++ /dev/null
@@ -1,33 +0,0 @@
-@echo off
-rem Update .ccls project file for ccls LPS and compile_flags.txt for clangd
-
-if "%~1"=="" (
- echo missing argument: the location of Qt's include directory
- EXIT /B 0
-)
-
-set qt_inc=%~1
-set qt_inc=%qt_inc:\=\\%
-
-(
- echo clang
- echo -fcxx-exceptions
- echo -std=c++14
- echo -Isrc\\core
- echo -Isrc
- echo -Ilibs\\vtextedit\\src\\editor\\include
- echo -Ilibs\\vtitlebar\\src
- echo -I%qt_inc%
- echo -I%qt_inc%\\QtCore
- echo -I%qt_inc%\\QtWebEngineWidgets
- echo -I%qt_inc%\\QtSvg
- echo -I%qt_inc%\\QtPrintSupport
- echo -I%qt_inc%\\QtWidgets
- echo -I%qt_inc%\\QtWebEngineCore
- echo -I%qt_inc%\\QtGui
- echo -I%qt_inc%\\QtWebChannel
- echo -I%qt_inc%\\QtNetwork
- echo -I%qt_inc%\\QtTest
-) > ".ccls"
-
-copy /Y .ccls compile_flags.txt
diff --git a/scripts/coc_update.sh b/scripts/coc_update.sh
deleted file mode 100755
index e26ba223..00000000
--- a/scripts/coc_update.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-if [ -n "$1" ]; then
- echo Qt include directory: $1
-else
- echo Please specify the Qt include directory.
- exit
-fi
-
-ccls_file=".ccls"
-
-echo clang > $ccls_file
-echo -fcxx-exceptions >> $ccls_file
-echo -std=c++14 >> $ccls_file
-echo -Isrc/core >> $ccls_file
-echo -Isrc >> $ccls_file
-echo -Ilibs/vtextedit/src/editor/include >> $ccls_file
-echo -Ilibs/vtitlebar/src >> $ccls_file
-echo -I$1 >> $ccls_file
-echo -I$1/QtCore >> $ccls_file
-echo -I$1/QtWebEngineWidgets >> $ccls_file
-echo -I$1/QtSvg >> $ccls_file
-echo -I$1/QtPrintSupport >> $ccls_file
-echo -I$1/QtWidgets >> $ccls_file
-echo -I$1/QtWebEngineCore >> $ccls_file
-echo -I$1/QtGui >> $ccls_file
-echo -I$1/QtWebChannel >> $ccls_file
-echo -I$1/QtNetwork >> $ccls_file
-echo -I$1/QtTest >> $ccls_file
-
-cp -f .ccls compile_flags.txt
diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc
index f647633d..704babe5 100644
--- a/src/data/core/core.qrc
+++ b/src/data/core/core.qrc
@@ -10,6 +10,7 @@
icons/notebook_menu.svg
icons/task_menu.svg
icons/united_entry.svg
+ icons/busy.svg
icons/advanced_settings.svg
icons/new_notebook_from_folder.svg
icons/discard_editor.svg
diff --git a/src/data/core/icons/busy.svg b/src/data/core/icons/busy.svg
new file mode 100644
index 00000000..88d70a18
--- /dev/null
+++ b/src/data/core/icons/busy.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/unitedentry/entrypopup.cpp b/src/unitedentry/entrypopup.cpp
index d0d5ae6c..4c8667ba 100644
--- a/src/unitedentry/entrypopup.cpp
+++ b/src/unitedentry/entrypopup.cpp
@@ -12,9 +12,6 @@ EntryPopup::EntryPopup(QWidget *p_parent)
Q_ASSERT(p_parent);
auto layout = new QVBoxLayout(this);
Q_UNUSED(layout);
-
- setWindowFlags(Qt::ToolTip);
- setFocusPolicy(Qt::FocusPolicy::ClickFocus);
}
EntryPopup::~EntryPopup()
@@ -26,8 +23,6 @@ EntryPopup::~EntryPopup()
void EntryPopup::setWidget(const QSharedPointer &p_widget)
{
- Q_ASSERT(p_widget);
-
if (p_widget == m_widget) {
return;
}
@@ -36,11 +31,11 @@ void EntryPopup::setWidget(const QSharedPointer &p_widget)
takeWidget(m_widget.data());
}
- layout()->addWidget(p_widget.data());
m_widget = p_widget;
- m_widget->show();
-
- updateGeometryToContents();
+ if (m_widget) {
+ layout()->addWidget(m_widget.data());
+ m_widget->show();
+ }
}
void EntryPopup::takeWidget(QWidget *p_widget)
@@ -49,38 +44,3 @@ void EntryPopup::takeWidget(QWidget *p_widget)
p_widget->hide();
p_widget->setParent(nullptr);
}
-
-void EntryPopup::showEvent(QShowEvent *p_event)
-{
- QFrame::showEvent(p_event);
-
- updateGeometryToContents();
-}
-
-void EntryPopup::updateGeometryToContents()
-{
- adjustSize();
-
- auto pa = parentWidget();
- auto pos = pa->mapToGlobal(QPoint(0, pa->height()));
- setGeometry(QRect(pos, preferredSize()));
-
- if (m_widget) {
- m_widget->updateGeometry();
- }
-}
-
-QSize EntryPopup::preferredSize() const
-{
- const int minWidth = 400;
- const int minHeight = 300;
-
- auto pa = parentWidget();
- int w = pa->width();
- int h = sizeHint().height();
- if (auto win = pa->window()) {
- w = qMax(w, qMin(win->width() - 500, 900));
- h = qMax(h, qMin(win->height() - 500, 800));
- }
- return QSize(qMax(minWidth, w), qMax(h, minHeight));
-}
diff --git a/src/unitedentry/entrypopup.h b/src/unitedentry/entrypopup.h
index ea044618..0798a52a 100644
--- a/src/unitedentry/entrypopup.h
+++ b/src/unitedentry/entrypopup.h
@@ -16,14 +16,7 @@ namespace vnotex
void setWidget(const QSharedPointer &p_widget);
- void updateGeometryToContents();
-
- protected:
- void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
-
private:
- QSize preferredSize() const;
-
void takeWidget(QWidget *p_widget);
private:
diff --git a/src/unitedentry/findunitedentry.cpp b/src/unitedentry/findunitedentry.cpp
index 639801cf..938d123d 100644
--- a/src/unitedentry/findunitedentry.cpp
+++ b/src/unitedentry/findunitedentry.cpp
@@ -23,7 +23,7 @@
using namespace vnotex;
FindUnitedEntry::FindUnitedEntry(const QSharedPointer &p_provider,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent)
: IUnitedEntry("find",
tr("Search for files in notebooks"),
@@ -343,4 +343,6 @@ void FindUnitedEntry::handleItemActivated(QTreeWidgetItem *p_item, int p_column)
paras->m_searchToken = m_searchTokenOfSession;
emit VNoteX::getInst().openFileRequested(itemPath, paras);
+
+ emit itemActivated(true, false);
}
diff --git a/src/unitedentry/findunitedentry.h b/src/unitedentry/findunitedentry.h
index 076bf78a..6831ead3 100644
--- a/src/unitedentry/findunitedentry.h
+++ b/src/unitedentry/findunitedentry.h
@@ -24,7 +24,7 @@ namespace vnotex
Q_OBJECT
public:
FindUnitedEntry(const QSharedPointer &p_provider,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent = nullptr);
void stop() Q_DECL_OVERRIDE;
diff --git a/src/unitedentry/helpunitedentry.cpp b/src/unitedentry/helpunitedentry.cpp
index 981e8f16..de0357ef 100644
--- a/src/unitedentry/helpunitedentry.cpp
+++ b/src/unitedentry/helpunitedentry.cpp
@@ -6,7 +6,7 @@
using namespace vnotex;
-HelpUnitedEntry::HelpUnitedEntry(const UnitedEntryMgr *p_mgr, QObject *p_parent)
+HelpUnitedEntry::HelpUnitedEntry(UnitedEntryMgr *p_mgr, QObject *p_parent)
: IUnitedEntry("help",
tr("Help information about United Entry"),
p_mgr,
diff --git a/src/unitedentry/helpunitedentry.h b/src/unitedentry/helpunitedentry.h
index 719d2972..dea737e1 100644
--- a/src/unitedentry/helpunitedentry.h
+++ b/src/unitedentry/helpunitedentry.h
@@ -13,7 +13,7 @@ namespace vnotex
{
Q_OBJECT
public:
- HelpUnitedEntry(const UnitedEntryMgr *p_mgr, QObject *p_parent = nullptr);
+ HelpUnitedEntry(UnitedEntryMgr *p_mgr, QObject *p_parent = nullptr);
QSharedPointer currentPopupWidget() const Q_DECL_OVERRIDE;
diff --git a/src/unitedentry/iunitedentry.cpp b/src/unitedentry/iunitedentry.cpp
index 3aa7fdc5..50488199 100644
--- a/src/unitedentry/iunitedentry.cpp
+++ b/src/unitedentry/iunitedentry.cpp
@@ -6,11 +6,13 @@
#include
+#include "unitedentrymgr.h"
+
using namespace vnotex;
IUnitedEntry::IUnitedEntry(const QString &p_name,
const QString &p_description,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent)
: QObject(p_parent),
m_mgr(p_mgr),
@@ -136,3 +138,9 @@ void IUnitedEntry::handleActionCommon(Action p_act, QWidget *p_widget)
break;
}
}
+
+bool IUnitedEntry::isAliasOf(const IUnitedEntry *p_entry) const
+{
+ Q_UNUSED(p_entry);
+ return false;
+}
diff --git a/src/unitedentry/iunitedentry.h b/src/unitedentry/iunitedentry.h
index 02d2287d..99daee33 100644
--- a/src/unitedentry/iunitedentry.h
+++ b/src/unitedentry/iunitedentry.h
@@ -28,7 +28,7 @@ namespace vnotex
IUnitedEntry(const QString &p_name,
const QString &p_description,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent = nullptr);
const QString &name() const;
@@ -46,11 +46,15 @@ namespace vnotex
virtual QSharedPointer currentPopupWidget() const = 0;
+ virtual bool isAliasOf(const IUnitedEntry *p_entry) const;
+
static void handleActionCommon(Action p_act, QWidget *p_widget);
signals:
void finished();
+ void itemActivated(bool p_quit, bool p_restoreFocus);
+
protected:
virtual void initOnFirstProcess() = 0;
@@ -61,7 +65,7 @@ namespace vnotex
virtual void setOngoing(bool p_ongoing);
- const UnitedEntryMgr *m_mgr = nullptr;
+ UnitedEntryMgr *m_mgr = nullptr;
private:
bool m_initialized = false;
diff --git a/src/unitedentry/unitedentry.cpp b/src/unitedentry/unitedentry.cpp
index 3238c5fa..f859cc0d 100644
--- a/src/unitedentry/unitedentry.cpp
+++ b/src/unitedentry/unitedentry.cpp
@@ -1,6 +1,6 @@
#include "unitedentry.h"
-#include
+#include
#include
#include
#include
@@ -13,11 +13,11 @@
#include
#include
#include
+#include
#include
#include
#include
-#include
#include
#include
#include
@@ -34,8 +34,9 @@
using namespace vnotex;
-UnitedEntry::UnitedEntry(QWidget *p_parent)
- : QWidget(p_parent)
+UnitedEntry::UnitedEntry(QMainWindow *p_mainWindow)
+ : QFrame(p_mainWindow),
+ m_mainWindow(p_mainWindow)
{
m_processTimer = new QTimer(this);
m_processTimer->setSingleShot(true);
@@ -45,11 +46,20 @@ UnitedEntry::UnitedEntry(QWidget *p_parent)
setupUI();
+#if defined(Q_OS_MACOS) || defined(Q_OS_MAC)
+ setWindowFlags(Qt::Tool | Qt::NoDropShadowWindowHint);
+ setWindowModality(Qt::ApplicationModal);
+#else
+ setWindowFlags(Qt::ToolTip);
+#endif
+
connect(qApp, &QApplication::focusChanged,
this, &UnitedEntry::handleFocusChanged);
connect(&UnitedEntryMgr::getInst(), &UnitedEntryMgr::entryFinished,
this, &UnitedEntry::handleEntryFinished);
+ connect(&UnitedEntryMgr::getInst(), &UnitedEntryMgr::entryItemActivated,
+ this, &UnitedEntry::handleEntryItemActivated);
}
UnitedEntry::~UnitedEntry()
@@ -58,79 +68,62 @@ UnitedEntry::~UnitedEntry()
void UnitedEntry::setupUI()
{
- auto mainLayout = new QHBoxLayout(this);
- mainLayout->setContentsMargins(0, 0, 0, 0);
-
- setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
-
- // Shortcut.
- const auto shortcut = ConfigMgr::getInst().getCoreConfig().getShortcut(CoreConfig::Shortcut::UnitedEntry);
- const QKeySequence kseq(shortcut);
- const auto shortcutText = kseq.isEmpty() ? QString() : kseq.toString(QKeySequence::NativeText);
- if (!kseq.isEmpty()) {
- auto sc = WidgetUtils::createShortcut(shortcut, this, Qt::ShortcutContext::ApplicationShortcut);
- if (sc) {
- connect(sc, &QShortcut::activated,
- this, [this]() {
- if (m_lineEdit->hasFocus()) {
- return;
- }
-
- bool popupVisible = m_popup->isVisible();
- if (popupVisible) {
- // Make m_lineEdit->setFocus() work.
- m_popup->hide();
- }
- m_lineEdit->setFocus();
- if (popupVisible) {
- m_popup->show();
- }
- });
- }
- }
- setToolTip(shortcutText.isEmpty() ? tr("United Entry") : tr("United Entry (%1)").arg(shortcutText));
+ auto mainLayout = new QVBoxLayout(this);
// Line edit.
m_lineEdit = WidgetsFactory::createLineEditWithSnippet(this);
mainLayout->addWidget(m_lineEdit);
- m_lineEdit->setToolTip(QString());
- m_lineEdit->setPlaceholderText(shortcutText.isEmpty() ? tr("Type to command") : tr("Type to command (%1)").arg(shortcutText));
+ m_lineEdit->setPlaceholderText(tr("Type to command"));
m_lineEdit->setClearButtonEnabled(true);
- m_lineEdit->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
+ m_lineEdit->installEventFilter(this);
connect(m_lineEdit, &QLineEdit::textChanged,
m_processTimer, QOverload<>::of(&QTimer::start));
setFocusProxy(m_lineEdit);
+ setupActions();
+
// Popup.
m_popup = new EntryPopup(this);
+ mainLayout->addWidget(m_popup);
m_popup->installEventFilter(this);
- m_popup->hide();
- setupIcons();
+ hide();
}
-void UnitedEntry::setupIcons()
+QAction *UnitedEntry::getTriggerAction()
{
const auto &themeMgr = VNoteX::getInst().getThemeMgr();
const auto fg = themeMgr.paletteColor("widgets#unitedentry#icon#fg");
- // Use QIcon::Disabled as the busy state.
- const auto busyFg = themeMgr.paletteColor("widgets#unitedentry#icon#busy#fg");
- QVector colors;
- colors.push_back(IconUtils::OverriddenColor(fg, QIcon::Normal));
- colors.push_back(IconUtils::OverriddenColor(busyFg, QIcon::Disabled));
- const auto icon = IconUtils::fetchIcon(themeMgr.getIconFile("united_entry.svg"), colors);
- m_iconAction = m_lineEdit->addAction(icon, QLineEdit::ActionPosition::LeadingPosition);
- m_iconAction->setText(tr("Options"));
+ const auto icon = IconUtils::fetchIcon(themeMgr.getIconFile("united_entry.svg"), fg);
+ auto act = new QAction(icon, tr("United Entry"), this);
+ connect(act, &QAction::triggered,
+ this, &UnitedEntry::activateUnitedEntry);
+
+ const auto shortcut = ConfigMgr::getInst().getCoreConfig().getShortcut(CoreConfig::Shortcut::UnitedEntry);
+ WidgetUtils::addActionShortcut(act, shortcut, Qt::ApplicationShortcut);
+
+ return act;
+}
+
+void UnitedEntry::setupActions()
+{
+ const auto &themeMgr = VNoteX::getInst().getThemeMgr();
+ const auto fg = themeMgr.paletteColor("widgets#unitedentry#icon#fg");
+ const auto busyFg = themeMgr.paletteColor("widgets#unitedentry#icon#busy#fg");
// Menu.
+ const auto menuIcon = IconUtils::fetchIcon(themeMgr.getIconFile("menu.svg"), fg);
+ m_menuIconAction = m_lineEdit->addAction(menuIcon, QLineEdit::ActionPosition::TrailingPosition);
+ m_menuIconAction->setText(tr("Options"));
+
auto menu = WidgetsFactory::createMenu(this);
- m_iconAction->setMenu(menu);
+ m_menuIconAction->setMenu(menu);
{
auto expandAct = menu->addAction(tr("Expand All"),
this,
- [this](bool checked) {
+ [](bool checked) {
ConfigMgr::getInst().getWidgetConfig().setUnitedEntryExpandAllEnabled(checked);
UnitedEntryMgr::getInst().setExpandAllEnabled(checked);
});
@@ -139,12 +132,18 @@ void UnitedEntry::setupIcons()
UnitedEntryMgr::getInst().setExpandAllEnabled(expandAct->isChecked());
}
- connect(m_iconAction, &QAction::triggered,
+ connect(m_menuIconAction, &QAction::triggered,
this, [this]() {
- auto pos = mapToGlobal(QPoint(0, height()));
- auto menu = m_iconAction->menu();
+ const auto pos = QCursor::pos();
+ auto menu = m_menuIconAction->menu();
menu->exec(pos);
});
+
+ // Busy.
+ const auto busyIcon = IconUtils::fetchIcon(themeMgr.getIconFile("busy.svg"), busyFg);
+ m_busyIconAction = m_lineEdit->addAction(busyIcon, QLineEdit::ActionPosition::TrailingPosition);
+ m_busyIconAction->setText(tr("Busy"));
+ m_busyIconAction->setVisible(false);
}
void UnitedEntry::activateUnitedEntry()
@@ -159,12 +158,15 @@ void UnitedEntry::activateUnitedEntry()
m_activated = true;
- setSizePolicy(QSizePolicy::Policy::MinimumExpanding, QSizePolicy::Policy::Fixed);
+ m_previousFocusWidget = QApplication::focusWidget();
+
+ show();
+
+ m_processTimer->stop();
+ processInput();
m_lineEdit->selectAll();
m_lineEdit->setFocus();
-
- m_processTimer->start();
}
void UnitedEntry::deactivateUnitedEntry()
@@ -176,28 +178,7 @@ void UnitedEntry::deactivateUnitedEntry()
m_activated = false;
m_previousFocusWidget = nullptr;
- setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
-
- m_popup->hide();
-}
-
-void UnitedEntry::handleFocusChanged(QWidget *p_old, QWidget *p_now)
-{
- if (p_now == m_lineEdit) {
- activateUnitedEntry();
- if (!m_previousFocusWidget && p_old != this && !WidgetUtils::isOrAncestorOf(this, p_old)) {
- m_previousFocusWidget = p_old;
- }
- return;
- }
-
- if (!m_activated) {
- return;
- }
-
- if (!p_now || (p_now != this && !WidgetUtils::isOrAncestorOf(this, p_now))) {
- deactivateUnitedEntry();
- }
+ hide();
}
void UnitedEntry::keyPressEvent(QKeyEvent *p_event)
@@ -310,13 +291,13 @@ void UnitedEntry::keyPressEvent(QKeyEvent *p_event)
break;
}
- QWidget::keyPressEvent(p_event);
+ QFrame::keyPressEvent(p_event);
}
void UnitedEntry::clear()
{
- m_lineEdit->setFocus();
m_lineEdit->clear();
+ m_lineEdit->setFocus();
}
void UnitedEntry::processInput()
@@ -327,11 +308,6 @@ void UnitedEntry::processInput()
return;
}
- if (m_iconAction->menu()->isVisible()) {
- // Do not display the popup which will hide the menu.
- return;
- }
-
if (m_lastEntry && m_lastEntry->isOngoing()) {
m_hasPending = true;
m_lastEntry->stop();
@@ -375,7 +351,8 @@ void UnitedEntry::processInput()
void UnitedEntry::popupWidget(const QSharedPointer &p_widget)
{
m_popup->setWidget(p_widget);
- m_popup->show();
+
+ m_lineEdit->setFocus();
}
const QSharedPointer &UnitedEntry::getEntryListWidget()
@@ -399,18 +376,6 @@ QSharedPointer UnitedEntry::getInfoWidget(const QString &p_info)
return EntryWidgetFactory::createLabel(p_info);
}
-void UnitedEntry::resizeEvent(QResizeEvent *p_event)
-{
- QWidget::resizeEvent(p_event);
-
- updatePopupGeometry();
-}
-
-void UnitedEntry::updatePopupGeometry()
-{
- m_popup->updateGeometryToContents();
-}
-
bool UnitedEntry::filterEntryListWidgetEntries(const QString &p_name)
{
const auto &entryListWidget = getEntryListWidget();
@@ -445,14 +410,29 @@ void UnitedEntry::handleEntryFinished(IUnitedEntry *p_entry)
}
}
+void UnitedEntry::handleEntryItemActivated(IUnitedEntry *p_entry, bool p_quit, bool p_restoreFocus)
+{
+ if (p_entry != m_lastEntry.data()) {
+ return;
+ }
+
+ if (p_quit) {
+ if (p_restoreFocus) {
+ exitUnitedEntry();
+ } else {
+ deactivateUnitedEntry();
+ }
+ }
+}
+
void UnitedEntry::setBusy(bool p_busy)
{
- m_iconAction->setEnabled(!p_busy);
+ m_busyIconAction->setVisible(p_busy);
}
bool UnitedEntry::eventFilter(QObject *p_watched, QEvent *p_event)
{
- if (p_watched == m_popup) {
+ if (p_watched == m_popup || p_watched == m_lineEdit) {
if (p_event->type() == QEvent::KeyPress) {
auto eve = static_cast(p_event);
switch (eve->key()) {
@@ -463,8 +443,6 @@ bool UnitedEntry::eventFilter(QObject *p_watched, QEvent *p_event)
Q_FALLTHROUGH();
case Qt::Key_Escape:
exitUnitedEntry();
- // Need to call deactivateUnitedEntry() again since focusChanged is not triggered.
- deactivateUnitedEntry();
return true;
default:
@@ -473,7 +451,7 @@ bool UnitedEntry::eventFilter(QObject *p_watched, QEvent *p_event)
}
}
- return QWidget::eventFilter(p_watched, p_event);
+ return QFrame::eventFilter(p_watched, p_event);
}
void UnitedEntry::exitUnitedEntry()
@@ -482,6 +460,52 @@ void UnitedEntry::exitUnitedEntry()
// Deactivate and focus previous widget.
m_previousFocusWidget->setFocus();
} else {
- VNoteX::getInst().getMainWindow()->setFocus();
+ m_mainWindow->setFocus();
+ }
+ deactivateUnitedEntry();
+}
+
+void UnitedEntry::showEvent(QShowEvent *p_event)
+{
+ QFrame::showEvent(p_event);
+
+ // Fix input method issue.
+ activateWindow();
+
+ m_lineEdit->setFocus();
+
+ updateGeometryToContents();
+}
+
+void UnitedEntry::updateGeometryToContents()
+{
+ adjustSize();
+
+ const auto winSize = m_mainWindow->size();
+ const auto sz = preferredSize();
+ auto pos = parentWidget()->mapToGlobal(QPoint((winSize.width() - sz.width()) / 2,
+ (winSize.height() - sz.height()) / 2));
+ setGeometry(QRect(pos, preferredSize()));
+}
+
+QSize UnitedEntry::preferredSize() const
+{
+ const int minWidth = 400;
+ const int minHeight = 300;
+
+ const auto winSize = m_mainWindow->size();
+ int w = minWidth;
+ int h = sizeHint().height();
+ w = qMax(w, qMin(winSize.width() / 2, 900));
+ h = qMax(h, qMin(winSize.height() - 300, 800));
+ return QSize(qMax(minWidth, w), qMax(h, minHeight));
+}
+
+void UnitedEntry::handleFocusChanged(QWidget *p_old, QWidget *p_now)
+{
+ Q_UNUSED(p_old);
+ if (m_activated &&
+ (!p_now || (p_now != this && !WidgetUtils::isOrAncestorOf(this, p_now)))) {
+ deactivateUnitedEntry();
}
}
diff --git a/src/unitedentry/unitedentry.h b/src/unitedentry/unitedentry.h
index fa5c79af..9d7bd27c 100644
--- a/src/unitedentry/unitedentry.h
+++ b/src/unitedentry/unitedentry.h
@@ -1,13 +1,14 @@
#ifndef UNITEDENTRY_H
#define UNITEDENTRY_H
-#include
+#include
#include
class QAction;
class QTimer;
class QTreeWidget;
class QLabel;
+class QMainWindow;
namespace vnotex
{
@@ -15,42 +16,42 @@ namespace vnotex
class EntryPopup;
class IUnitedEntry;
- class UnitedEntry : public QWidget
+ class UnitedEntry : public QFrame
{
Q_OBJECT
public:
- explicit UnitedEntry(QWidget *p_parent = nullptr);
+ explicit UnitedEntry(QMainWindow *p_mainWindow);
~UnitedEntry();
bool eventFilter(QObject *p_watched, QEvent *p_event) Q_DECL_OVERRIDE;
+ QAction *getTriggerAction();
+
protected:
void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
- void resizeEvent(QResizeEvent *p_event) Q_DECL_OVERRIDE;
+ void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
private:
void setupUI();
- void setupIcons();
+ void setupActions();
void activateUnitedEntry();
void deactivateUnitedEntry();
- void handleFocusChanged(QWidget *p_old, QWidget *p_now);
-
void clear();
void processInput();
+ void handleFocusChanged(QWidget *p_old, QWidget *p_now);
+
const QSharedPointer &getEntryListWidget();
QSharedPointer getInfoWidget(const QString &p_info);
- void updatePopupGeometry();
-
void popupWidget(const QSharedPointer &p_widget);
// Return true if there is any entry visible.
@@ -58,15 +59,25 @@ namespace vnotex
void handleEntryFinished(IUnitedEntry *p_entry);
+ void handleEntryItemActivated(IUnitedEntry *p_entry, bool p_quit, bool p_restoreFocus);
+
void setBusy(bool p_busy);
void exitUnitedEntry();
+ void updateGeometryToContents();
+
+ QSize preferredSize() const;
+
+ QMainWindow *m_mainWindow = nullptr;
+
LineEditWithSnippet *m_lineEdit = nullptr;
EntryPopup *m_popup = nullptr;
- QAction *m_iconAction = nullptr;
+ QAction *m_menuIconAction = nullptr;
+
+ QAction *m_busyIconAction = nullptr;
bool m_activated = false;
diff --git a/src/unitedentry/unitedentryalias.cpp b/src/unitedentry/unitedentryalias.cpp
index da368d16..aefe3c5c 100644
--- a/src/unitedentry/unitedentryalias.cpp
+++ b/src/unitedentry/unitedentryalias.cpp
@@ -11,7 +11,7 @@ using namespace vnotex;
UnitedEntryAlias::UnitedEntryAlias(const QString &p_name,
const QString &p_description,
const QString &p_value,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent)
: IUnitedEntry(p_name, p_description, p_mgr, p_parent),
m_value(p_value)
@@ -20,7 +20,7 @@ UnitedEntryAlias::UnitedEntryAlias(const QString &p_name,
}
UnitedEntryAlias::UnitedEntryAlias(const QJsonObject &p_obj,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent)
: UnitedEntryAlias(p_obj[QStringLiteral("name")].toString(),
p_obj[QStringLiteral("description")].toString(),
@@ -52,6 +52,8 @@ void UnitedEntryAlias::initOnFirstProcess()
} else {
connect(m_realEntry, &IUnitedEntry::finished,
this, &IUnitedEntry::finished);
+ connect(m_realEntry, &IUnitedEntry::itemActivated,
+ this, &IUnitedEntry::itemActivated);
}
}
@@ -97,3 +99,8 @@ QSharedPointer UnitedEntryAlias::currentPopupWidget() const
return nullptr;
}
+
+bool UnitedEntryAlias::isAliasOf(const IUnitedEntry *p_entry) const
+{
+ return p_entry == m_realEntry;
+}
diff --git a/src/unitedentry/unitedentryalias.h b/src/unitedentry/unitedentryalias.h
index 9f5c6534..312493a7 100644
--- a/src/unitedentry/unitedentryalias.h
+++ b/src/unitedentry/unitedentryalias.h
@@ -19,11 +19,11 @@ namespace vnotex
UnitedEntryAlias(const QString &p_name,
const QString &p_description,
const QString &p_value,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent = nullptr);
UnitedEntryAlias(const QJsonObject &p_obj,
- const UnitedEntryMgr *p_mgr,
+ UnitedEntryMgr *p_mgr,
QObject *p_parent = nullptr);
QJsonObject toJson() const;
@@ -36,6 +36,8 @@ namespace vnotex
QSharedPointer currentPopupWidget() const Q_DECL_OVERRIDE;
+ bool isAliasOf(const IUnitedEntry *p_entry) const Q_DECL_OVERRIDE;
+
protected:
void initOnFirstProcess() Q_DECL_OVERRIDE;
diff --git a/src/unitedentry/unitedentrymgr.cpp b/src/unitedentry/unitedentrymgr.cpp
index 3edccfd6..2bea9094 100644
--- a/src/unitedentry/unitedentrymgr.cpp
+++ b/src/unitedentry/unitedentrymgr.cpp
@@ -47,6 +47,10 @@ void UnitedEntryMgr::addEntry(const QSharedPointer &p_entry)
this, [this]() {
emit entryFinished(reinterpret_cast(sender()));
});
+ connect(p_entry.data(), &IUnitedEntry::itemActivated,
+ this, [this](bool quit, bool restoreFocus) {
+ emit entryItemActivated(reinterpret_cast(sender()), quit, restoreFocus);
+ });
}
QList> UnitedEntryMgr::getEntries() const
diff --git a/src/unitedentry/unitedentrymgr.h b/src/unitedentry/unitedentrymgr.h
index 44ef49f0..d8812cb9 100644
--- a/src/unitedentry/unitedentrymgr.h
+++ b/src/unitedentry/unitedentrymgr.h
@@ -36,6 +36,8 @@ namespace vnotex
signals:
void entryFinished(IUnitedEntry *p_entry);
+ void entryItemActivated(IUnitedEntry *p_entry, bool p_quit, bool p_restoreFocus);
+
private:
explicit UnitedEntryMgr(QObject *p_parent = nullptr);
diff --git a/src/widgets/toolbarhelper.cpp b/src/widgets/toolbarhelper.cpp
index 8b5e6e99..730527bb 100644
--- a/src/widgets/toolbarhelper.cpp
+++ b/src/widgets/toolbarhelper.cpp
@@ -307,8 +307,9 @@ QToolBar *ToolBarHelper::setupQuickAccessToolBar(MainWindow *p_win, QToolBar *p_
// United Entry.
{
- auto ueEdit = new UnitedEntry(tb);
- tb->addWidget(ueEdit);
+ // Managed by QObject.
+ auto ue = new UnitedEntry(p_win);
+ tb->addAction(ue->getTriggerAction());
}
return tb;