diff --git a/widgets/ukui-task-manager/ukui-task-manager.cpp b/widgets/ukui-task-manager/ukui-task-manager.cpp index 5dfa76c..7799c8f 100644 --- a/widgets/ukui-task-manager/ukui-task-manager.cpp +++ b/widgets/ukui-task-manager/ukui-task-manager.cpp @@ -84,6 +84,7 @@ public: QDBusServiceWatcher *m_watcher = nullptr; bool m_connectedToNotificationServer = false; QString m_activeWindow; + TaskManager::Actions m_windowActions; private: UkuiTaskManager *q = nullptr; @@ -96,6 +97,7 @@ UkuiTaskManager::Private::Private(UkuiTaskManager *q) : q(q) UkuiTaskManager::Private::~Private() { qDeleteAll(m_items); + qDeleteAll(m_windowActions); } void UkuiTaskManager::Private::loadSettings() @@ -553,45 +555,56 @@ UkuiTaskManager &UkuiTaskManager::self() TaskManager::Actions UkuiTaskManager::windowActions(const QString &winId) { - TaskManager::Actions actions; - auto action = new Action("Close", tr("Close"), QIcon::fromTheme("window-close-symbolic"), Action::Type::Close, winId); - actions.append(action); - connect(action, &Action::actionTriggered, this, &UkuiTaskManager::closeWindow); - - action = new Action("Restore", tr("Restore"), QIcon::fromTheme("window-restore-symbolic"), Action::Type::Restore, winId); - actions.append(action); - connect(action, &Action::actionTriggered, this, &UkuiTaskManager::restoreWindow); - if(!WindowManager::isMaximized(winId) && !WindowManager::isMinimized(winId)) { - action->setEnabled(false); + if(d->m_windowActions.isEmpty()) { + //关闭 + auto action = new Action("Close", tr("Close"), QIcon::fromTheme("window-close-symbolic"), Action::Type::Close, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::closeWindow); + d->m_windowActions.append(action); + //还原 + action = new Action("Restore", tr("Restore"), QIcon::fromTheme("window-restore-symbolic"), Action::Type::Restore, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::restoreWindow); + d->m_windowActions.append(action); + //最大化 + action = new Action("Maximize", tr("Maximize"), QIcon::fromTheme("window-maximize-symbolic"), Action::Type::Maximize, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::maximizeWindow); + d->m_windowActions.append(action); + //最小化 + action = new Action("Minimize", tr("Minimize"), QIcon::fromTheme("window-minimize-symbolic"), Action::Type::Minimize, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::minimizeWindow); + d->m_windowActions.append(action); + //置顶 + action = new Action("Keep above", tr("Keep above"), QIcon::fromTheme("ukui-fixed-symbolic"), Action::Type::KeepAbove, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::keepAbove); + d->m_windowActions.append(action); + //取消置顶 + action = new Action("Unset keep above", tr("Unset keep above"), QIcon::fromTheme("ukui-unfixed-symbolic"), Action::Type::UnsetKeepAbove, winId); + connect(action, &Action::actionTriggered, this, &UkuiTaskManager::unsetKeepAbove); + d->m_windowActions.append(action); } - - action = new Action("Maximize", tr("Maximize"), QIcon::fromTheme("window-maximize-symbolic"), Action::Type::Maximize, winId); - actions.append(action); - connect(actions.last(), &Action::actionTriggered, this, &UkuiTaskManager::maximizeWindow); - if(WindowManager::isMaximized(winId) && !WindowManager::isMinimized(winId)) { - action->setEnabled(false); + for (auto action : d->m_windowActions) { + switch (action->type()) { + case Action::Close: + break; + case Action::Minimize: + action->setEnabled(!WindowManager::isMinimized(winId)); + break; + case Action::Maximize: + action->setEnabled(!WindowManager::isMaximized(winId) || WindowManager::isMinimized(winId)); + break; + case Action::Restore: + action->setEnabled(WindowManager::isMaximized(winId) || WindowManager::isMinimized(winId)); + break; + case Action::KeepAbove: + action->setEnabled(!WindowManager::isKeepAbove(winId)); + break; + case Action::UnsetKeepAbove: + action->setEnabled(WindowManager::isKeepAbove(winId)); + break; + default: + break; + } } - - action = new Action("Minimize", tr("Minimize"), QIcon::fromTheme("window-minimize-symbolic"), Action::Type::Minimize, winId); - actions.append(action); - connect(action, &Action::actionTriggered, this, &UkuiTaskManager::minimizeWindow); - if(WindowManager::isMinimized(winId)) { - action->setEnabled(false); - } - - action = new Action("Keep above", tr("Keep above"), QIcon::fromTheme("ukui-fixed-symbolic"), Action::Type::KeepAbove, winId); - actions.append(action); - connect(action, &Action::actionTriggered, this, &UkuiTaskManager::keepAbove); - if(WindowManager::isKeepAbove(winId)) { - action->setEnabled(false); - } - action = new Action("Unset keep above", tr("Unset keep above"), QIcon::fromTheme("ukui-unfixed-symbolic"), Action::Type::UnsetKeepAbove, winId); - actions.append(action); - connect(action, &Action::actionTriggered, this, &UkuiTaskManager::unsetKeepAbove); - if(!WindowManager::isKeepAbove(winId)) { - action->setEnabled(false); - } - return actions; + return d->m_windowActions; } bool UkuiTaskManager::windowIsActivated(const QString &winId)