/******************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2012 Martin Gräßlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ import QtQuick 1.1 import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.qtextracomponents 0.1 import org.kde.kwin 0.1 as KWin Item { id: presentWindowsTabBox property int screenWidth : 1 property int screenHeight : 1 property int optimalWidth: 0.9*screenWidth property int optimalHeight: 0.9*screenHeight property int imagePathPrefix: (new Date()).getTime() property int standardMargin: 2 width: optimalWidth height: optimalHeight focus: true function setModel(model) { thumbnailListView.model = model; thumbnailListView.imageId++; } function modelChanged() { thumbnailListView.imageId++; } PlasmaCore.FrameSvgItem { id: background anchors.fill: parent imagePath: "dialogs/background" } // just to get the margin sizes PlasmaCore.FrameSvgItem { id: hoverItem imagePath: "widgets/viewitem" prefix: "hover" visible: false } PlasmaCore.Theme { id: theme } GridView { signal currentIndexChanged(int index) // used for image provider URL to trick Qt into reloading icons when the model changes property int imageId: 0 property int rows: Math.round(Math.sqrt(count)) property int columns: (rows*rows < count) ? rows + 1 : rows id: thumbnailListView objectName: "listView" cellWidth: Math.floor(width / columns) cellHeight: Math.floor(height / rows) clip: true anchors { fill: parent leftMargin: background.margins.left rightMargin: background.margins.right topMargin: background.margins.top bottomMargin: background.margins.bottom } delegate: Item { width: thumbnailListView.cellWidth height: thumbnailListView.cellHeight KWin.ThumbnailItem { id: thumbnailItem wId: windowId anchors { top: parent.top left: parent.left right: parent.right bottom: captionItem.top leftMargin: hoverItem.margins.left rightMargin: hoverItem.margins.right topMargin: hoverItem.margins.top bottomMargin: standardMargin } } Item { id: captionItem height: childrenRect.height anchors { left: parent.left right: parent.right bottom: parent.bottom leftMargin: hoverItem.margins.left + standardMargin bottomMargin: hoverItem.margins.bottom rightMargin: hoverItem.margins.right } Image { id: iconItem source: "image://client/" + index + "/" + presentWindowsTabBox.imagePathPrefix + "-" + thumbnailListView.imageId width: 32 height: 32 sourceSize { width: 32 height: 32 } anchors { bottom: parent.bottom right: textItem.left } } Item { id: textItem property int maxWidth: parent.width - iconItem.width - parent.anchors.leftMargin - parent.anchors.rightMargin - anchors.leftMargin - standardMargin * 2 width: (textElementSelected.implicitWidth >= maxWidth) ? maxWidth : textElementSelected.implicitWidth anchors { top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter leftMargin: standardMargin } Text { id: textElementSelected horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: caption font.italic: minimized font.bold: true visible: index == thumbnailListView.currentIndex color: theme.textColor elide: Text.ElideMiddle anchors.fill: parent } Text { id: textElementNormal horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: caption font.italic: minimized visible: index != thumbnailListView.currentIndex color: theme.textColor elide: Text.ElideMiddle anchors.fill: parent } } } MouseArea { anchors.fill: parent onClicked: { thumbnailListView.currentIndex = index; thumbnailListView.currentIndexChanged(thumbnailListView.currentIndex); } } } highlight: PlasmaCore.FrameSvgItem { id: highlightItem imagePath: "widgets/viewitem" prefix: "hover" width: thumbnailListView.cellWidth height: thumbnailListView.cellHeight } boundsBehavior: Flickable.StopAtBounds } /* * Key navigation on outer item for two reasons: * @li we have to emit the change signal * @li on multiple invocation it does not work on the list view. Focus seems to be lost. **/ Keys.onPressed: { if (event.key == Qt.Key_Left) { thumbnailListView.moveCurrentIndexLeft(); thumbnailListView.currentIndexChanged(thumbnailListView.currentIndex); } else if (event.key == Qt.Key_Right) { thumbnailListView.moveCurrentIndexRight(); thumbnailListView.currentIndexChanged(thumbnailListView.currentIndex); } else if (event.key == Qt.Key_Up) { thumbnailListView.moveCurrentIndexUp(); thumbnailListView.currentIndexChanged(thumbnailListView.currentIndex); } else if (event.key == Qt.Key_Down) { thumbnailListView.moveCurrentIndexDown(); thumbnailListView.currentIndexChanged(thumbnailListView.currentIndex); } } }