diff --git a/img/DisabledFloatButton.svg b/img/disablefloatbutton.svg similarity index 100% rename from img/DisabledFloatButton.svg rename to img/disablefloatbutton.svg diff --git a/img/EnabledFloatButton.svg b/img/enablefloatbutton.svg similarity index 100% rename from img/EnabledFloatButton.svg rename to img/enablefloatbutton.svg diff --git a/img/floatbutton_default.svg b/img/floatbuttondefault.svg similarity index 100% rename from img/floatbutton_default.svg rename to img/floatbuttondefault.svg diff --git a/img/floatbutton_hover.svg b/img/floatbuttonhovered.svg similarity index 100% rename from img/floatbutton_hover.svg rename to img/floatbuttonhovered.svg diff --git a/img/floatbutton_click.svg b/img/floatbuttonpressed.svg similarity index 100% rename from img/floatbutton_click.svg rename to img/floatbuttonpressed.svg diff --git a/kylin-virtual-keyboard.pro b/kylin-virtual-keyboard.pro index d188e52..ee7875d 100644 --- a/kylin-virtual-keyboard.pro +++ b/kylin-virtual-keyboard.pro @@ -25,6 +25,7 @@ SOURCES += \ src/virtualkeyboard/virtualkeyboardview.cpp \ src/virtualkeyboardentry/floatbutton.cpp \ src/virtualkeyboardentry/floatbuttonmanager.cpp \ + src/virtualkeyboardentry/virtualkeyboardentrymanager.cpp \ src/virtualkeyboardentry/virtualkeyboardtrayicon.cpp TRANSLATIONS = translations/translation.ts \ @@ -70,6 +71,7 @@ HEADERS += \ src/virtualkeyboardentry/floatbutton.h \ src/virtualkeyboardentry/floatbuttonmanager.h \ src/virtualkeyboardentry/floatbuttonstrategy.h \ + src/virtualkeyboardentry/virtualkeyboardentrymanager.h \ src/virtualkeyboardentry/virtualkeyboardtrayicon.h DISTFILES += diff --git a/src/main.cpp b/src/main.cpp index 78d036d..ccc07fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,7 @@ #include "ipc/dbusservice.h" #include "ipc/fcitxvirtualkeyboardserviceproxy.h" #include "virtualkeyboard/virtualkeyboardmanager.h" -#include "virtualkeyboardentry/virtualkeyboardtrayicon.h" +#include "virtualkeyboardentry/virtualkeyboardentrymanager.h" int main(int argc, char *argv[]) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); @@ -19,8 +19,8 @@ int main(int argc, char *argv[]) { VirtualKeyboardManager virtualKeyboardManager; FcitxVirtualKeyboardServiceProxy virtualKeyboardService; - VirtualKeyboardTrayIcon trayIcon(virtualKeyboardManager, - virtualKeyboardService); + VirtualKeyboardEntryManager entryManager(virtualKeyboardManager, + virtualKeyboardService); DBusService dbusService(&virtualKeyboardManager); diff --git a/src/virtualkeyboardentry/floatbuttonmanager.cpp b/src/virtualkeyboardentry/floatbuttonmanager.cpp index 98ccf04..5a23a6e 100644 --- a/src/virtualkeyboardentry/floatbuttonmanager.cpp +++ b/src/virtualkeyboardentry/floatbuttonmanager.cpp @@ -131,9 +131,6 @@ void FloatButtonManager::connectFloatButtonSignals() { showFloatButton(); } }); - - connect(floatButtonView_.get(), &QPushButton::clicked, this, - [this]() { fcitxVirtualKeyboardService_.showVirtualKeyboard(); }); } void FloatButtonManager::updateFloatButtonEnabled(bool enabled) { diff --git a/src/virtualkeyboardentry/virtualkeyboardentrymanager.cpp b/src/virtualkeyboardentry/virtualkeyboardentrymanager.cpp new file mode 100644 index 0000000..3c2357d --- /dev/null +++ b/src/virtualkeyboardentry/virtualkeyboardentrymanager.cpp @@ -0,0 +1,87 @@ +#include "virtualkeyboardentry/virtualkeyboardentrymanager.h" + +#include +#include + +#include "geometrymanager/geometrymanager.h" +#include "virtualkeyboardentry/floatbuttonstrategy.h" + +VirtualKeyboardEntryManager::VirtualKeyboardEntryManager( + VirtualKeyboardManager &virtualKeyboardManager, + const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService) + : virtualKeyboardManager_(virtualKeyboardManager), + floatButtonManager_(new FloatButtonManager(virtualKeyboardManager, + fcitxVirtualKeyboardService)) { + initFloatButtonEnabledContextMenu(); + initFloatButtonDisabledContextMenu(); + initTrayIcon(fcitxVirtualKeyboardService); + + connectSignals(); + + floatButtonManager_->loadFloatButtonAvailability(); +} + +VirtualKeyboardEntryManager::~VirtualKeyboardEntryManager() = default; + +void VirtualKeyboardEntryManager::initTrayIcon( + const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService) { + trayIconEntry_.reset(new VirtualKeyboardTrayIcon( + virtualKeyboardManager_, fcitxVirtualKeyboardService)); +} + +void VirtualKeyboardEntryManager::connectSignals() { + connect(floatButtonManager_.get(), &FloatButtonManager::floatButtonEnabled, + this, [this]() { + trayIconEntry_->setContextMenu(floatButtonEnabledContextMenu_); + }); + + connect(floatButtonManager_.get(), &FloatButtonManager::floatButtonDisabled, + this, [this]() { + trayIconEntry_->setContextMenu(floatButtonDisabledContextMenu_); + }); + + connect(&virtualKeyboardManager_, + &VirtualKeyboardManager::virtualKeyboardVisibiltyChanged, this, + [this](bool visible) { + if (!visible) { + return; + } + + trayIconEntry_->hideContextMenu(); + }); +} + +QMenu *VirtualKeyboardEntryManager::createFloatButtonContextMenu( + const QString &icon, const QString &text, MenuTriggeredCallback callback) { + QMenu *menu = new QMenu(); + + QAction *action = new QAction(menu); + action->setIcon(QIcon(icon)); + action->setText(text); + + menu->addAction(action); + + connect(action, &QAction::triggered, this, [callback](bool) { + if (!callback) { + return; + } + + callback(); + }); + + return menu; +} + +void VirtualKeyboardEntryManager::initFloatButtonEnabledContextMenu() { + floatButtonEnabledContextMenu_.reset(createFloatButtonContextMenu( + ":/floatbutton/img/disablefloatbutton.svg", + tr("Disable the float button"), + [this]() { floatButtonManager_->disableFloatButton(); })); +} + +void VirtualKeyboardEntryManager::initFloatButtonDisabledContextMenu() { + floatButtonDisabledContextMenu_.reset(createFloatButtonContextMenu( + ":/floatbutton/img/enablefloatbutton.svg", + tr("Enable the float button"), + [this]() { floatButtonManager_->enableFloatButton(); })); +} diff --git a/src/virtualkeyboardentry/virtualkeyboardentrymanager.h b/src/virtualkeyboardentry/virtualkeyboardentrymanager.h new file mode 100644 index 0000000..3fac77c --- /dev/null +++ b/src/virtualkeyboardentry/virtualkeyboardentrymanager.h @@ -0,0 +1,48 @@ +#ifndef VIRTUALKEYBOARDENTRYMANAGER_H +#define VIRTUALKEYBOARDENTRYMANAGER_H + +#include +#include + +#include +#include + +#include "ipc/fcitxvirtualkeyboardserviceproxy.h" +#include "virtualkeyboard/virtualkeyboardmanager.h" +#include "virtualkeyboardentry/floatbuttonmanager.h" +#include "virtualkeyboardentry/virtualkeyboardtrayicon.h" + +class VirtualKeyboardEntryManager : public QObject { + Q_OBJECT + +public: + VirtualKeyboardEntryManager( + VirtualKeyboardManager &virtualKeyboardManager, + const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService); + ~VirtualKeyboardEntryManager() override; + +private: + using MenuTriggeredCallback = std::function; + +private: + void connectSignals(); + QMenu *createFloatButtonContextMenu(const QString &icon, + const QString &text, + MenuTriggeredCallback callback); + void initFloatButtonEnabledContextMenu(); + void initFloatButtonDisabledContextMenu(); + void initTrayIcon( + const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService); + +private: + VirtualKeyboardManager &virtualKeyboardManager_; + + std::unique_ptr floatButtonManager_ = nullptr; + + std::unique_ptr trayIconEntry_ = nullptr; + + std::shared_ptr floatButtonEnabledContextMenu_ = nullptr; + std::shared_ptr floatButtonDisabledContextMenu_ = nullptr; +}; + +#endif // VIRTUALKEYBOARDENTRYMANAGER_H diff --git a/src/virtualkeyboardentry/virtualkeyboardtrayicon.cpp b/src/virtualkeyboardentry/virtualkeyboardtrayicon.cpp index 4fed732..8ca6357 100644 --- a/src/virtualkeyboardentry/virtualkeyboardtrayicon.cpp +++ b/src/virtualkeyboardentry/virtualkeyboardtrayicon.cpp @@ -1,8 +1,9 @@ -#include - -#include "virtualkeyboard/virtualkeyboardmanager.h" #include "virtualkeyboardentry/virtualkeyboardtrayicon.h" +#include +#include +#include + VirtualKeyboardTrayIcon::VirtualKeyboardTrayIcon( VirtualKeyboardManager &virtualKeyboardManager, const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService) @@ -11,6 +12,13 @@ VirtualKeyboardTrayIcon::VirtualKeyboardTrayIcon( initTrayIcon(); } +void VirtualKeyboardTrayIcon::setContextMenu( + std::shared_ptr contextMenu) { + contextMenu_ = contextMenu; +} + +void VirtualKeyboardTrayIcon::hideContextMenu() { contextMenu_->hide(); } + void VirtualKeyboardTrayIcon::initTrayIcon() { trayIcon_ = new QSystemTrayIcon(this); trayIcon_->setIcon(QIcon::fromTheme("input-keyboard-symbolic")); @@ -20,13 +28,40 @@ void VirtualKeyboardTrayIcon::initTrayIcon() { trayIcon_->setVisible(true); } +void VirtualKeyboardTrayIcon::toggleVirtualKeyboard() { + if (virtualKeyboardManager_.isVirtualKeyboardVisible()) { + fcitxVirtualKeyboardService_.hideVirtualKeyboard(); + } else { + fcitxVirtualKeyboardService_.showVirtualKeyboard(); + } +} + +void VirtualKeyboardTrayIcon::ensuareVirtualKeyboardInvisible() { + if (!virtualKeyboardManager_.isVirtualKeyboardVisible()) { + return; + } + + virtualKeyboardManager_.hideVirtualKeyboard(); +} + +void VirtualKeyboardTrayIcon::showContextMenu() { + QSize menuSize = contextMenu_->sizeHint(); + QPoint point = QCursor::pos(); + QRect deskRect = QApplication::desktop()->availableGeometry(); + contextMenu_->move(point.x(), deskRect.height() - menuSize.height()); + contextMenu_->show(); +} + void VirtualKeyboardTrayIcon::onTrayIconActivated( QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: { - virtualKeyboardManager_.isVirtualKeyboardVisible() - ? fcitxVirtualKeyboardService_.hideVirtualKeyboard() - : fcitxVirtualKeyboardService_.showVirtualKeyboard(); + toggleVirtualKeyboard(); + break; + }; + case QSystemTrayIcon::Context: { + ensuareVirtualKeyboardInvisible(); + showContextMenu(); break; }; default: diff --git a/src/virtualkeyboardentry/virtualkeyboardtrayicon.h b/src/virtualkeyboardentry/virtualkeyboardtrayicon.h index bdacc62..cf89a67 100644 --- a/src/virtualkeyboardentry/virtualkeyboardtrayicon.h +++ b/src/virtualkeyboardentry/virtualkeyboardtrayicon.h @@ -1,6 +1,9 @@ #ifndef VIRTUALKEYBOARDTRAYICON_H #define VIRTUALKEYBOARDTRAYICON_H +#include + +#include #include #include @@ -17,14 +20,24 @@ public: ~VirtualKeyboardTrayIcon() override = default; + void setContextMenu(std::shared_ptr contextMenu); + void hideContextMenu(); + private: void initTrayIcon(); + void toggleVirtualKeyboard(); + + void ensuareVirtualKeyboardInvisible(); + void showContextMenu(); + private slots: void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason); private: QSystemTrayIcon *trayIcon_ = nullptr; + std::shared_ptr contextMenu_ = nullptr; + VirtualKeyboardManager &virtualKeyboardManager_; const FcitxVirtualKeyboardService &fcitxVirtualKeyboardService_; };