diff --git a/applets/taskmanager/package/contents/ui/GroupDialog.qml b/applets/taskmanager/package/contents/ui/GroupDialog.qml --- a/applets/taskmanager/package/contents/ui/GroupDialog.qml +++ b/applets/taskmanager/package/contents/ui/GroupDialog.qml @@ -41,6 +41,7 @@ property TextMetrics textMetrics: TextMetrics {} property alias overflowing: scrollArea.overflowing property alias activeTask: focusActiveTaskTimer.targetIndex + property var oldStatus: PlasmaCore.Types.UnknownStatus function selectTask(task) { if (!task) { @@ -51,65 +52,63 @@ scrollArea.ensureItemVisible(task); } - mainItem: PlasmaExtras.ScrollArea { - id: scrollArea + mainItem: MouseHandler { + id: mouseHandler - property bool overflowing: (viewport.height < contentItem.height) + target: taskList + handleWheelEvents: !scrollArea.overflowing - horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff + Timer { + id: focusActiveTaskTimer - function ensureItemVisible(item) { - var itemTop = item.y; - var itemBottom = (item.y + item.height); + property var targetIndex: null - if (itemTop < flickableItem.contentY) { - flickableItem.contentY = itemTop; - } + interval: 0 + repeat: false - if ((itemBottom - flickableItem.contentY) > viewport.height) { - flickableItem.contentY = Math.abs(viewport.height - itemBottom); - } - } + onTriggered: { + // Now we can home in on the previously active task + // collected in groupDialog.onVisibleChanged. - MouseHandler { - id: mouseHandler + if (targetIndex != null) { + for (var i = 0; i < groupRepeater.count; ++i) { + var task = groupRepeater.itemAt(i); - width: parent.width - height: (groupRepeater.count * (LayoutManager.verticalMargins() - + Math.max(theme.mSize(theme.defaultFont).height, units.iconSizes.medium))) + if (task.modelIndex() == targetIndex) { + selectTask(task); + return; + } + } + } + } + } - target: taskList - handleWheelEvents: !scrollArea.overflowing + PlasmaExtras.ScrollArea { + id: scrollArea - Timer { - id: focusActiveTaskTimer + anchors.fill: parent - property var targetIndex: null + property bool overflowing: (viewport.height < contentItem.height) - interval: 0 - repeat: false + horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff - onTriggered: { - // Now we can home in on the previously active task - // collected in groupDialog.onVisibleChanged. + function ensureItemVisible(item) { + var itemTop = item.y; + var itemBottom = (item.y + item.height); - if (targetIndex != null) { - for (var i = 0; i < groupRepeater.count; ++i) { - var task = groupRepeater.itemAt(i); + if (itemTop < flickableItem.contentY) { + flickableItem.contentY = itemTop; + } - if (task.modelIndex() == targetIndex) { - selectTask(task); - return; - } - } - } + if ((itemBottom - flickableItem.contentY) > viewport.height) { + flickableItem.contentY = Math.abs(viewport.height - itemBottom); } } TaskList { id: taskList - anchors.fill: parent + width: parent.width add: Transition { // We trigger a null-interval timer in the first add @@ -189,36 +188,65 @@ ] onVisualParentChanged: { - if (!visualParent) { + if (visible && visualParent) { + attachModel(); + } else { visible = false; } } onVisibleChanged: { if (visible && visualParent) { - groupFilter.model = tasksModel; - groupFilter.rootIndex = groupFilter.modelIndex(visualParent.itemIndex); + oldStatus = plasmoid.status; + plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus; - groupRepeater.aboutToPopulate = true; - groupRepeater.model = groupFilter; + attachModel(); - mainItem.forceActiveFocus(); + groupDialog.requestActivate(); + mouseHandler.forceActiveFocus(); } else { + plasmoid.status = oldStatus; visualParent = null; groupRepeater.model = undefined; groupFilter.model = undefined; groupFilter.rootIndex = undefined; } } + function attachModel() { + if (!visualParent) { + return; + } + + if (!groupFilter.model) { + groupFilter.model = tasksModel; + } + + groupRepeater.aboutToPopulate = true; + + groupFilter.rootIndex = tasksModel.makeModelIndex(visualParent.itemIndex); + + if (!groupRepeater.model) { + groupRepeater.model = groupFilter; + } + } + function updateSize() { - if (!visible || !visualParent) { + if (!visible) { return; } - if (!groupRepeater.count) { + if (!visualParent) { visible = false; - } else { + return; + } + + if (!visualParent.childCount) { + visible = false; + // Setting VisualDataModel.rootIndex drops groupRepeater.count to 0 + // before the actual row count. updateSize is therefore invoked twice; + // only update size once the repeater count matches the model role. + } else if (visualParent.childCount == groupRepeater.count) { var task; var maxWidth = 0; var maxHeight = 0;