fix(task-manager):修复预览图action内存泄漏

This commit is contained in:
iaom 2024-02-28 15:02:28 +08:00
parent af51dec749
commit 9abab8b9d2
1 changed files with 50 additions and 37 deletions

View File

@ -84,6 +84,7 @@ public:
QDBusServiceWatcher *m_watcher = nullptr; QDBusServiceWatcher *m_watcher = nullptr;
bool m_connectedToNotificationServer = false; bool m_connectedToNotificationServer = false;
QString m_activeWindow; QString m_activeWindow;
TaskManager::Actions m_windowActions;
private: private:
UkuiTaskManager *q = nullptr; UkuiTaskManager *q = nullptr;
@ -96,6 +97,7 @@ UkuiTaskManager::Private::Private(UkuiTaskManager *q) : q(q)
UkuiTaskManager::Private::~Private() UkuiTaskManager::Private::~Private()
{ {
qDeleteAll(m_items); qDeleteAll(m_items);
qDeleteAll(m_windowActions);
} }
void UkuiTaskManager::Private::loadSettings() void UkuiTaskManager::Private::loadSettings()
@ -553,45 +555,56 @@ UkuiTaskManager &UkuiTaskManager::self()
TaskManager::Actions UkuiTaskManager::windowActions(const QString &winId) TaskManager::Actions UkuiTaskManager::windowActions(const QString &winId)
{ {
TaskManager::Actions actions; if(d->m_windowActions.isEmpty()) {
auto action = new Action("Close", tr("Close"), QIcon::fromTheme("window-close-symbolic"), Action::Type::Close, winId); //关闭
actions.append(action); auto action = new Action("Close", tr("Close"), QIcon::fromTheme("window-close-symbolic"), Action::Type::Close, winId);
connect(action, &Action::actionTriggered, this, &UkuiTaskManager::closeWindow); 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); //还原
actions.append(action); action = new Action("Restore", tr("Restore"), QIcon::fromTheme("window-restore-symbolic"), Action::Type::Restore, winId);
connect(action, &Action::actionTriggered, this, &UkuiTaskManager::restoreWindow); connect(action, &Action::actionTriggered, this, &UkuiTaskManager::restoreWindow);
if(!WindowManager::isMaximized(winId) && !WindowManager::isMinimized(winId)) { d->m_windowActions.append(action);
action->setEnabled(false); //最大化
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);
} }
for (auto action : d->m_windowActions) {
action = new Action("Maximize", tr("Maximize"), QIcon::fromTheme("window-maximize-symbolic"), Action::Type::Maximize, winId); switch (action->type()) {
actions.append(action); case Action::Close:
connect(actions.last(), &Action::actionTriggered, this, &UkuiTaskManager::maximizeWindow); break;
if(WindowManager::isMaximized(winId) && !WindowManager::isMinimized(winId)) { case Action::Minimize:
action->setEnabled(false); 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;
}
} }
return d->m_windowActions;
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;
} }
bool UkuiTaskManager::windowIsActivated(const QString &winId) bool UkuiTaskManager::windowIsActivated(const QString &winId)