[kwin/tabbox] Informative qml uses new Switcher item and PlasmaCore.Dialog

Reference implementation for the adjustments to use a PlasmaCore.Dialog
and the new required switcher item.
This commit is contained in:
Martin Gräßlin 2013-12-10 07:24:34 +01:00
parent d536532f66
commit 4ff2a5ea3e

View file

@ -20,50 +20,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.qtextracomponents 2.0 import org.kde.qtextracomponents 2.0
import org.kde.kwin 2.0 as KWin
Item { KWin.Switcher {
id: tabBox
currentIndex: listView.currentIndex
PlasmaCore.Dialog {
id: informativeTabBox id: informativeTabBox
property int screenWidth : 0
property int screenHeight : 0
property bool allDesktops: true
property string longestCaption: ""
property int optimalWidth: listView.maxRowWidth
property int optimalHeight: listView.rowHeight * listView.count + background.topMargin + background.bottomMargin
property bool canStretchX: true property bool canStretchX: true
property bool canStretchY: false property bool canStretchY: false
property string maskImagePath: background.maskImagePath
property double maskWidth: background.centerWidth
property double maskHeight: background.centerHeight
property int maskTopMargin: background.centerTopMargin
property int maskLeftMargin: background.centerLeftMargin
width: Math.min(Math.max(screenWidth * 0.2, optimalWidth), screenWidth * 0.8)
height: Math.min(Math.max(screenHeight * 0.2, optimalHeight), screenHeight * 0.8)
focus: true
property int textMargin: 2 property int textMargin: 2
onLongestCaptionChanged: { location: PlasmaCore.Types.Floating
listView.maxRowWidth = listView.calculateMaxRowWidth(); visible: tabBox.visible
windowFlags: Qt.X11BypassWindowManagerHint
onVisibleChanged: {
if (visible) {
informativeTabBox.x = tabBox.screenGeometry.x + tabBox.screenGeometry.width * 0.5 - dialogMainItem.width * 0.5;
informativeTabBox.y = tabBox.screenGeometry.y + tabBox.screenGeometry.height * 0.5 - dialogMainItem.height * 0.5;
}
} }
function setModel(model) { mainItem: Item {
listView.model = model; id: dialogMainItem
listView.maxRowWidth = listView.calculateMaxRowWidth(); property int optimalWidth: listView.maxRowWidth
} property int optimalHeight: listView.rowHeight * listView.count
width: Math.min(Math.max(tabBox.screenGeometry.width * 0.2, optimalWidth), tabBox.screenGeometry.width * 0.8)
/** height: Math.min(Math.max(tabBox.screenGeometry.height * 0.2, optimalHeight), tabBox.screenGeometry.height * 0.8)
* Returns the caption with adjustments for minimized items. focus: true
* @param caption the original caption
* @param mimized whether the item is minimized
* @return Caption adjusted for minimized state
**/
function itemCaption(caption, minimized) {
var text = caption;
if (minimized) {
text = "(" + text + ")";
}
return text;
}
// just to get the margin sizes // just to get the margin sizes
PlasmaCore.FrameSvgItem { PlasmaCore.FrameSvgItem {
@ -73,11 +59,6 @@ Item {
visible: false visible: false
} }
ShadowedSvgItem {
id: background
anchors.fill: parent
}
// delegate // delegate
Component { Component {
id: listDelegate id: listDelegate
@ -100,7 +81,7 @@ Item {
Text { Text {
id: captionItem id: captionItem
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
text: itemCaption(caption, minimized) text: listView.itemCaption(caption, minimized)
font.bold: true font.bold: true
font.italic: minimized font.italic: minimized
color: theme.textColor color: theme.textColor
@ -121,7 +102,7 @@ Item {
font.italic: true font.italic: true
color: theme.textColor color: theme.textColor
elide: Text.ElideMiddle elide: Text.ElideMiddle
visible: informativeTabBox.allDesktops visible: tabBox.allDesktops
anchors { anchors {
left: iconItem.right left: iconItem.right
right: parent.right right: parent.right
@ -136,25 +117,37 @@ Item {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
listView.currentIndex = index; listView.currentIndex = index;
listView.currentIndexChanged(listView.currentIndex);
} }
} }
} }
} }
ListView { ListView {
/**
* Returns the caption with adjustments for minimized items.
* @param caption the original caption
* @param mimized whether the item is minimized
* @return Caption adjusted for minimized state
**/
function itemCaption(caption, minimized) {
var text = caption;
if (minimized) {
text = "(" + text + ")";
}
return text;
}
function calculateMaxRowWidth() { function calculateMaxRowWidth() {
var width = 0; var width = 0;
var textElement = Qt.createQmlObject( var textElement = Qt.createQmlObject(
'import QtQuick 2.0;' 'import QtQuick 2.0;'
+ 'Text {\n' + 'Text {\n'
+ ' text: "' + itemCaption(informativeTabBox.longestCaption, true) + '"\n' + ' text: "' + listView.itemCaption(tabBox.model.longestCaption(), true) + '"\n'
+ ' font.bold: true\n' + ' font.bold: true\n'
+ ' visible: false\n' + ' visible: false\n'
+ '}', + '}',
listView, "calculateMaxRowWidth"); listView, "calculateMaxRowWidth");
width = Math.max(textElement.width, width); width = Math.max(textElement.width, width);
textElement.destroy(); textElement.destroy();
return width + 32 + hoverItem.margins.right + hoverItem.margins.left + background.leftMargin + background.rightMargin; return width + 32 + hoverItem.margins.right + hoverItem.margins.left;
} }
/** /**
* Calculates the height of one row based on the text height and icon size. * Calculates the height of one row based on the text height and icon size.
@ -174,18 +167,13 @@ Item {
// icon size or two text elements and margins and hoverItem margins // icon size or two text elements and margins and hoverItem margins
return Math.max(32, height*2 + informativeTabBox.textMargin * 3 + hoverItem.margins.top + hoverItem.margins.bottom); return Math.max(32, height*2 + informativeTabBox.textMargin * 3 + hoverItem.margins.top + hoverItem.margins.bottom);
} }
signal currentIndexChanged(int index)
id: listView id: listView
objectName: "listView" model: tabBox.model
// the maximum text width + icon item width (32 + 4 margin) + margins for hover item + margins for background // the maximum text width + icon item width (32 + 4 margin) + margins for hover item + margins for background
property int maxRowWidth: calculateMaxRowWidth() property int maxRowWidth: calculateMaxRowWidth()
property int rowHeight: calcRowHeight() property int rowHeight: calcRowHeight()
anchors { anchors {
fill: parent fill: parent
topMargin: background.topMargin
leftMargin: background.leftMargin
rightMargin: background.rightMargin
bottomMargin: background.bottomMargin
} }
clip: true clip: true
delegate: listDelegate delegate: listDelegate
@ -197,6 +185,11 @@ Item {
} }
highlightMoveDuration: 250 highlightMoveDuration: 250
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
Connections {
target: tabBox
onCurrentIndexChanged: {listView.currentIndex = tabBox.currentIndex;}
}
}
} }
/* /*
* Key navigation on outer item for two reasons: * Key navigation on outer item for two reasons:
@ -206,10 +199,9 @@ Item {
Keys.onPressed: { Keys.onPressed: {
if (event.key == Qt.Key_Up) { if (event.key == Qt.Key_Up) {
listView.decrementCurrentIndex(); listView.decrementCurrentIndex();
listView.currentIndexChanged(listView.currentIndex);
} else if (event.key == Qt.Key_Down) { } else if (event.key == Qt.Key_Down) {
listView.incrementCurrentIndex(); listView.incrementCurrentIndex();
listView.currentIndexChanged(listView.currentIndex); }
} }
} }
} }