451f3f177e
This is an import of Kickoff launcher before the redesign in 5.21 Note that this launcher won't be supported, so there won't be any bugfixes Outside of potential backports (Not guaranteed)
779 lines
27 KiB
QML
779 lines
27 KiB
QML
/*
|
|
Copyright (C) 2011 Martin Gräßlin <mgraesslin@kde.org>
|
|
Copyright (C) 2012 Gregor Taetzner <gregor@freenet.de>
|
|
Copyright (C) 2012 Marco Martin <mart@kde.org>
|
|
Copyright (C) 2013 2014 David Edmundson <davidedmundson@kde.org>
|
|
Copyright 2014 Sebastian Kügler <sebas@kde.org>
|
|
|
|
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, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
import QtQuick 2.3
|
|
import org.kde.plasma.plasmoid 2.0
|
|
import QtQuick.Layouts 1.1
|
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
import org.kde.plasma.components 2.0 as PlasmaComponents
|
|
import org.kde.plasma.extras 2.0 as PlasmaExtras
|
|
import org.kde.kquickcontrolsaddons 2.0
|
|
|
|
import org.kde.plasma.private.kicker 0.1 as Kicker
|
|
|
|
Item {
|
|
id: root
|
|
Layout.minimumWidth: PlasmaCore.Units.gridUnit * 26
|
|
Layout.maximumWidth: Layout.minimumWidth
|
|
|
|
Layout.minimumHeight: PlasmaCore.Units.gridUnit * 34
|
|
Layout.maximumHeight: Layout.minimumHeight
|
|
|
|
property string previousState
|
|
property bool switchTabsOnHover: plasmoid.configuration.switchTabsOnHover
|
|
property Item currentView: mainTabGroup.currentTab.decrementCurrentIndex ? mainTabGroup.currentTab : mainTabGroup.currentTab.item
|
|
property KickoffButton firstButton: null
|
|
property var configMenuItems
|
|
|
|
property QtObject globalFavorites: rootModelFavorites
|
|
|
|
state: "Normal"
|
|
|
|
onFocusChanged: {
|
|
header.input.forceActiveFocus();
|
|
}
|
|
|
|
function switchToInitial() {
|
|
if (firstButton != null) {
|
|
root.state = "Normal";
|
|
mainTabGroup.currentTab = firstButton.tab;
|
|
tabBar.currentTab = firstButton;
|
|
header.query = ""
|
|
}
|
|
}
|
|
|
|
Kicker.DragHelper {
|
|
id: dragHelper
|
|
|
|
dragIconSize: PlasmaCore.Units.iconSizes.medium
|
|
onDropped: kickoff.dragSource = null
|
|
}
|
|
|
|
Kicker.AppsModel {
|
|
id: rootModel
|
|
|
|
autoPopulate: false
|
|
|
|
appletInterface: plasmoid
|
|
|
|
appNameFormat: plasmoid.configuration.showAppsByName ? 0 : 1
|
|
flat: false
|
|
sorted: plasmoid.configuration.alphaSort
|
|
showSeparators: false
|
|
showTopLevelItems: true
|
|
|
|
favoritesModel: Kicker.KAStatsFavoritesModel {
|
|
id: rootModelFavorites
|
|
favorites: plasmoid.configuration.favorites
|
|
|
|
onFavoritesChanged: {
|
|
plasmoid.configuration.favorites = favorites;
|
|
}
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
favoritesModel.initForClient("org.kde.plasma.kickoff.favorites.instance-" + plasmoid.id)
|
|
|
|
if (!plasmoid.configuration.favoritesPortedToKAstats) {
|
|
favoritesModel.portOldFavorites(plasmoid.configuration.favorites);
|
|
plasmoid.configuration.favoritesPortedToKAstats = true;
|
|
}
|
|
|
|
rootModel.refresh();
|
|
}
|
|
}
|
|
|
|
PlasmaCore.DataSource {
|
|
id: pmSource
|
|
engine: "powermanagement"
|
|
connectedSources: ["PowerDevil"]
|
|
}
|
|
|
|
PlasmaCore.Svg {
|
|
id: arrowsSvg
|
|
|
|
imagePath: "widgets/arrows"
|
|
size: "16x16"
|
|
}
|
|
|
|
Header {
|
|
id: header
|
|
}
|
|
|
|
Item {
|
|
id: mainArea
|
|
anchors.topMargin: mainTabGroup.state == "top" ? PlasmaCore.Units.smallSpacing : 0
|
|
|
|
PlasmaComponents.TabGroup {
|
|
id: mainTabGroup
|
|
currentTab: favoritesPage
|
|
|
|
anchors {
|
|
fill: parent
|
|
}
|
|
|
|
//pages
|
|
FavoritesView {
|
|
id: favoritesPage
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: applicationsPage
|
|
when: mainTabGroup.currentTab == applicationsPage
|
|
source: Qt.resolvedUrl("ApplicationsView.qml")
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: systemPage
|
|
when: mainTabGroup.currentTab == systemPage
|
|
source: Qt.resolvedUrl("ComputerView.qml")
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: recentlyUsedPage
|
|
when: mainTabGroup.currentTab == recentlyUsedPage
|
|
source: Qt.resolvedUrl("RecentlyUsedView.qml")
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: oftenUsedPage
|
|
when: mainTabGroup.currentTab == oftenUsedPage
|
|
source: Qt.resolvedUrl("OftenUsedView.qml")
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: leavePage
|
|
when: mainTabGroup.currentTab == leavePage
|
|
source: Qt.resolvedUrl("LeaveView.qml")
|
|
}
|
|
PlasmaExtras.ConditionalLoader {
|
|
id: searchPage
|
|
when: root.state == "Search"
|
|
//when: mainTabGroup.currentTab == searchPage || root.state == "Search"
|
|
source: Qt.resolvedUrl("SearchView.qml")
|
|
}
|
|
|
|
state: {
|
|
switch (plasmoid.location) {
|
|
case PlasmaCore.Types.LeftEdge:
|
|
return LayoutMirroring.enabled ? "right" : "left";
|
|
case PlasmaCore.Types.TopEdge:
|
|
return "top";
|
|
case PlasmaCore.Types.RightEdge:
|
|
return LayoutMirroring.enabled ? "left" : "right";
|
|
case PlasmaCore.Types.BottomEdge:
|
|
default:
|
|
return "bottom";
|
|
}
|
|
}
|
|
states: [
|
|
State {
|
|
name: "left"
|
|
AnchorChanges {
|
|
target: header
|
|
anchors {
|
|
left: root.left
|
|
top: undefined
|
|
right: root.right
|
|
bottom: root.bottom
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: header
|
|
width: header.implicitWidth
|
|
location: PlasmaExtras.PlasmoidHeading.Location.Footer
|
|
}
|
|
AnchorChanges {
|
|
target: mainArea
|
|
anchors {
|
|
left: tabBar.right
|
|
top: root.top
|
|
right: root.right
|
|
bottom: header.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
width: (tabBar.opacity == 0) ? 0 : PlasmaCore.Units.gridUnit * 5
|
|
}
|
|
AnchorChanges {
|
|
target: tabBar
|
|
anchors {
|
|
left: root.left
|
|
top: root.top
|
|
right: undefined
|
|
bottom: header.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target:tabBarSeparator
|
|
width: tabBarSeparatorLine.elementSize("vertical-line").width
|
|
elementId: "vertical-line"
|
|
}
|
|
AnchorChanges {
|
|
target: tabBarSeparator
|
|
anchors {
|
|
left: tabBar.right
|
|
top: tabBar.top
|
|
bottom:tabBar.bottom
|
|
}
|
|
}
|
|
},
|
|
State {
|
|
name: "top"
|
|
AnchorChanges {
|
|
target: header
|
|
anchors {
|
|
left: root.left
|
|
top: undefined
|
|
right: root.right
|
|
bottom: root.bottom
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: header
|
|
height: header.implicitHeight
|
|
location: PlasmaExtras.PlasmoidHeading.Location.Footer
|
|
}
|
|
AnchorChanges {
|
|
target: mainArea
|
|
anchors {
|
|
left: root.left
|
|
top: tabBar.bottom
|
|
right: root.right
|
|
bottom: header.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
height: (tabBar.opacity == 0) ? 0 : PlasmaCore.Units.gridUnit * 5
|
|
}
|
|
AnchorChanges {
|
|
target: tabBar
|
|
anchors {
|
|
left: root.left
|
|
top: root.top
|
|
right: root.right
|
|
bottom: undefined
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target:tabBarSeparator
|
|
height: tabBarSeparatorLine.elementSize("horizontal-line").height
|
|
elementId: "horizontal-line"
|
|
}
|
|
AnchorChanges {
|
|
target: tabBarSeparator
|
|
anchors {
|
|
left: tabBar.left
|
|
right: tabBar.right
|
|
top: tabBar.bottom
|
|
}
|
|
}
|
|
},
|
|
State {
|
|
name: "right"
|
|
AnchorChanges {
|
|
target: header
|
|
anchors {
|
|
left: root.left
|
|
top: undefined
|
|
right: root.right
|
|
bottom: root.bottom
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: header
|
|
width: header.implicitWidth
|
|
location: PlasmaExtras.PlasmoidHeading.Location.Footer
|
|
}
|
|
AnchorChanges {
|
|
target: mainArea
|
|
anchors {
|
|
left: root.left
|
|
top: root.top
|
|
right: tabBar.left
|
|
bottom: header.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
width: (tabBar.opacity == 0) ? 0 : PlasmaCore.Units.gridUnit * 5
|
|
}
|
|
AnchorChanges {
|
|
target: tabBar
|
|
anchors {
|
|
left: undefined
|
|
top: root.top
|
|
right: root.right
|
|
bottom: header.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target:tabBarSeparator
|
|
width: tabBarSeparatorLine.elementSize("vertical-line").width
|
|
elementId: "vertical-line"
|
|
}
|
|
AnchorChanges {
|
|
target: tabBarSeparator
|
|
anchors {
|
|
right: tabBar.left
|
|
top: tabBar.top
|
|
bottom: tabBar.bottom
|
|
}
|
|
}
|
|
},
|
|
State {
|
|
name: "bottom"
|
|
AnchorChanges {
|
|
target: header
|
|
anchors {
|
|
left: root.left
|
|
top: root.top
|
|
right: root.right
|
|
bottom: undefined
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: header
|
|
height: header.implicitHeight
|
|
location: PlasmaExtras.PlasmoidHeading.Location.Header
|
|
}
|
|
AnchorChanges {
|
|
target: mainArea
|
|
anchors {
|
|
left: root.left
|
|
top: header.bottom
|
|
right: root.right
|
|
bottom: tabBar.top
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
height: (tabBar.opacity == 0) ? 0 : PlasmaCore.Units.gridUnit * 5
|
|
}
|
|
AnchorChanges {
|
|
target: tabBar
|
|
anchors {
|
|
left: root.left
|
|
top: undefined
|
|
right: root.right
|
|
bottom: root.bottom
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target:tabBarSeparator
|
|
height: tabBarSeparatorLine.elementSize("horizontal-line").height
|
|
elementId: "horizontal-line"
|
|
}
|
|
AnchorChanges {
|
|
target: tabBarSeparator
|
|
anchors {
|
|
bottom: tabBar.top
|
|
left: tabBar.left
|
|
right: tabBar.right
|
|
}
|
|
}
|
|
}
|
|
]
|
|
} // mainTabGroup
|
|
}
|
|
|
|
PlasmaComponents.TabBar {
|
|
id: tabBar
|
|
|
|
property int count: 5 // updated in createButtons()
|
|
|
|
Behavior on width {
|
|
NumberAnimation { duration: PlasmaCore.Units.longDuration; easing.type: Easing.InQuad; }
|
|
enabled: plasmoid.expanded
|
|
}
|
|
Behavior on height {
|
|
NumberAnimation { duration: PlasmaCore.Units.longDuration; easing.type: Easing.InQuad; }
|
|
enabled: plasmoid.expanded
|
|
}
|
|
|
|
tabPosition: {
|
|
switch (plasmoid.location) {
|
|
case PlasmaCore.Types.TopEdge:
|
|
return Qt.TopEdge;
|
|
case PlasmaCore.Types.LeftEdge:
|
|
return Qt.LeftEdge;
|
|
case PlasmaCore.Types.RightEdge:
|
|
return Qt.RightEdge;
|
|
default:
|
|
return Qt.BottomEdge;
|
|
}
|
|
}
|
|
|
|
onCurrentTabChanged: header.input.forceActiveFocus();
|
|
|
|
Connections {
|
|
target: plasmoid
|
|
function onExpandedChanged() {
|
|
if(menuItemsChanged()) {
|
|
createButtons();
|
|
}
|
|
if (!plasmoid.expanded) {
|
|
switchToInitial();
|
|
}
|
|
}
|
|
}
|
|
} // tabBar
|
|
|
|
PlasmaCore.SvgItem {
|
|
id: tabBarSeparator
|
|
svg: PlasmaCore.Svg {
|
|
id: tabBarSeparatorLine
|
|
imagePath: "widgets/line"
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: tabBar
|
|
|
|
property var oldPos: null
|
|
|
|
enabled: root.state !== "Search"
|
|
hoverEnabled: root.switchTabsOnHover
|
|
|
|
onExited: {
|
|
// Reset so we switch immediately when MouseArea is entered
|
|
// freshly, e.g. from the panel.
|
|
oldPos = null;
|
|
|
|
clickTimer.stop();
|
|
}
|
|
|
|
onPositionChanged: {
|
|
// Reject multiple events with the same coordinates that QQuickWindow
|
|
// synthesizes.
|
|
if (oldPos === Qt.point(mouse.x, mouse.y)) {
|
|
return;
|
|
}
|
|
|
|
var button = tabBar.layout.childAt(mouse.x, mouse.y);
|
|
|
|
if (!button || button.objectName !== "KickoffButton") {
|
|
clickTimer.stop();
|
|
|
|
return;
|
|
}
|
|
|
|
// Switch immediately when MouseArea was freshly entered, e.g.
|
|
// from the panel.
|
|
if (oldPos === null) {
|
|
oldPos = Qt.point(mouse.x, mouse.y);
|
|
|
|
clickTimer.stop();
|
|
button.clicked();
|
|
|
|
return;
|
|
}
|
|
|
|
var dx = (mouse.x - oldPos.x);
|
|
var dy = (mouse.y - oldPos.y);
|
|
|
|
// Check Manhattan length against drag distance to get a decent
|
|
// pointer motion vector.
|
|
if ((Math.abs(dx) + Math.abs(dy)) > Qt.styleHints.startDragDistance) {
|
|
if (tabBar.currentTab !== button) {
|
|
var tabBarPos = mapToItem(tabBar, oldPos.x, oldPos.y);
|
|
oldPos = Qt.point(mouse.x, mouse.y);
|
|
|
|
var angleMouseMove = Math.atan2(dy, dx) * 180 / Math.PI;
|
|
var angleToCornerA = 0;
|
|
var angleToCornerB = 0;
|
|
|
|
switch (plasmoid.location) {
|
|
case PlasmaCore.Types.TopEdge: {
|
|
angleToCornerA = Math.atan2(tabBar.height - tabBarPos.y, 0 - tabBarPos.x);
|
|
angleToCornerB = Math.atan2(tabBar.height - tabBarPos.y, tabBar.width - tabBarPos.x);
|
|
|
|
break;
|
|
}
|
|
case PlasmaCore.Types.LeftEdge: {
|
|
angleToCornerA = Math.atan2(0 - tabBarPos.y, tabBar.width - tabBarPos.x);
|
|
angleToCornerB = Math.atan2(tabBar.height - tabBarPos.y, tabBar.width - tabBarPos.x);
|
|
|
|
break;
|
|
}
|
|
case PlasmaCore.Types.RightEdge: {
|
|
angleToCornerA = Math.atan2(0 - tabBarPos.y, 0 - tabBarPos.x);
|
|
angleToCornerB = Math.atan2(tabBar.height - tabBarPos.y, 0 - tabBarPos.x);
|
|
|
|
break;
|
|
}
|
|
// PlasmaCore.Types.BottomEdge
|
|
default: {
|
|
angleToCornerA = Math.atan2(0 - tabBarPos.y, 0 - tabBarPos.x);
|
|
angleToCornerB = Math.atan2(0 - tabBarPos.y, tabBar.width - tabBarPos.x);
|
|
}
|
|
}
|
|
|
|
// Degrees are nicer to debug than radians.
|
|
angleToCornerA = angleToCornerA * 180 / Math.PI;
|
|
angleToCornerB = angleToCornerB * 180 / Math.PI;
|
|
|
|
var lower = Math.min(angleToCornerA, angleToCornerB);
|
|
var upper = Math.max(angleToCornerA, angleToCornerB);
|
|
|
|
// If the motion vector is outside the angle range from oldPos to the
|
|
// relevant tab bar corners, switch immediately. Otherwise start the
|
|
// timer, which gets aborted should the pointer exit the tab bar
|
|
// early.
|
|
var inRange = (lower < angleMouseMove == angleMouseMove < upper);
|
|
|
|
// Mirror-flip.
|
|
if (plasmoid.location === PlasmaCore.Types.RightEdge ? inRange : !inRange) {
|
|
clickTimer.stop();
|
|
button.clicked();
|
|
|
|
return;
|
|
} else {
|
|
clickTimer.pendingButton = button;
|
|
clickTimer.start();
|
|
}
|
|
} else {
|
|
oldPos = Qt.point(mouse.x, mouse.y);
|
|
}
|
|
}
|
|
}
|
|
|
|
onClicked: {
|
|
clickTimer.stop();
|
|
|
|
var button = tabBar.layout.childAt(mouse.x, mouse.y);
|
|
|
|
if (!button || button.objectName !== "KickoffButton") {
|
|
return;
|
|
}
|
|
|
|
button.clicked();
|
|
}
|
|
|
|
Timer {
|
|
id: clickTimer
|
|
|
|
property Item pendingButton: null
|
|
|
|
interval: 250
|
|
|
|
onTriggered: {
|
|
if (pendingButton) {
|
|
pendingButton.clicked();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Keys.forwardTo: [tabBar.layout]
|
|
|
|
Keys.onPressed: {
|
|
|
|
if (mainTabGroup.currentTab == applicationsPage) {
|
|
if (event.key !== Qt.Key_Tab) {
|
|
root.state = "Applications";
|
|
}
|
|
}
|
|
|
|
switch(event.key) {
|
|
case Qt.Key_Up: {
|
|
currentView.decrementCurrentIndex();
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Down: {
|
|
currentView.incrementCurrentIndex();
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Left: {
|
|
if (header.input.focus && header.state == "query") {
|
|
break;
|
|
}
|
|
if (!currentView.deactivateCurrentIndex()) {
|
|
if (root.state == "Applications") {
|
|
mainTabGroup.currentTab = firstButton.tab;
|
|
tabBar.currentTab = firstButton;
|
|
}
|
|
root.state = "Normal"
|
|
}
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Right: {
|
|
if (header.input.focus && header.state == "query") {
|
|
break;
|
|
}
|
|
currentView.activateCurrentIndex();
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Tab: {
|
|
root.state == "Applications" ? root.state = "Normal" : root.state = "Applications";
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Enter:
|
|
case Qt.Key_Return: {
|
|
currentView.activateCurrentIndex(1);
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Escape: {
|
|
if (header.state != "query") {
|
|
plasmoid.expanded = false;
|
|
} else {
|
|
header.query = "";
|
|
}
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
case Qt.Key_Menu: {
|
|
currentView.openContextMenu();
|
|
event.accepted = true;
|
|
break;
|
|
}
|
|
default:
|
|
if (!header.input.focus) {
|
|
header.input.forceActiveFocus();
|
|
}
|
|
}
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
name: "Normal"
|
|
PropertyChanges {
|
|
target: root
|
|
Keys.forwardTo: [tabBar.layout]
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
//Set the opacity and NOT the visibility, as visibility is recursive
|
|
//and this binding would be executed also on popup show/hide
|
|
//as recommended by the docs: https://doc.qt.io/qt-5/qml-qtquick-item.html#visible-prop
|
|
//plus, it triggers https://bugreports.qt.io/browse/QTBUG-66907
|
|
//in which a mousearea may think it's under the mouse while it isn't
|
|
opacity: tabBar.count > 1 ? 1 : 0
|
|
}
|
|
},
|
|
State {
|
|
name: "Applications"
|
|
PropertyChanges {
|
|
target: root
|
|
Keys.forwardTo: [root]
|
|
}
|
|
PropertyChanges {
|
|
target: tabBar
|
|
opacity: tabBar.count > 1 ? 1 : 0
|
|
}
|
|
},
|
|
State {
|
|
name: "Search"
|
|
PropertyChanges {
|
|
target: tabBar
|
|
opacity: 0
|
|
}
|
|
PropertyChanges {
|
|
target: mainTabGroup
|
|
currentTab: searchPage
|
|
}
|
|
PropertyChanges {
|
|
target: root
|
|
Keys.forwardTo: [root]
|
|
}
|
|
}
|
|
] // states
|
|
|
|
function getButtonDefinition(name) {
|
|
switch(name) {
|
|
case "bookmark":
|
|
return {id: "bookmarkButton", tab: favoritesPage, iconSource: "bookmarks", text: i18n("Favorites")};
|
|
case "application":
|
|
return {id: "applicationButton", tab: applicationsPage, iconSource: "applications-other", text: i18n("Applications")};
|
|
case "computer":
|
|
return {id: "computerButton", tab: systemPage, iconSource: pmSource.data["PowerDevil"] && pmSource.data["PowerDevil"]["Is Lid Present"] ? "computer-laptop" : "computer", text: i18n("Computer")};
|
|
case "used":
|
|
return {id: "usedButton", tab: recentlyUsedPage, iconSource: "view-history", text: i18n("History")};
|
|
case "oftenUsed":
|
|
return {id: "usedButton", tab: oftenUsedPage, iconSource: "office-chart-pie", text: i18n("Often Used")};
|
|
case "leave":
|
|
return {id: "leaveButton", tab: leavePage, iconSource: "system-log-out", text: i18n("Leave")};
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: kickoffButton
|
|
KickoffButton {}
|
|
}
|
|
|
|
|
|
Component.onCompleted: {
|
|
createButtons();
|
|
}
|
|
|
|
function getEnabled(configuration) {
|
|
var res = [];
|
|
for(var i = 0; i < configuration.length; i++) {
|
|
var confItemName = configuration[i].substring(0, configuration[i].indexOf(":"));
|
|
var confItemEnabled = configuration[i].substring(configuration[i].length-1) === "t";
|
|
if(confItemEnabled) {
|
|
res.push(confItemName);
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
function createButtons() {
|
|
configMenuItems = plasmoid.configuration.menuItems;
|
|
var menuItems = getEnabled(plasmoid.configuration.menuItems);
|
|
tabBar.count = menuItems.length
|
|
|
|
// remove old menu items
|
|
for(var i = tabBar.layout.children.length -1; i >= 0; i--) {
|
|
if(tabBar.layout.children[i].objectName === "KickoffButton") {
|
|
tabBar.layout.children[i].destroy();
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < menuItems.length; i++) {
|
|
var props = getButtonDefinition(menuItems[i]);
|
|
var button = kickoffButton.createObject(tabBar.layout, props);
|
|
if(i === 0) {
|
|
firstButton = button;
|
|
switchToInitial();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function menuItemsChanged() {
|
|
if(configMenuItems.length !== plasmoid.configuration.menuItems.length) {
|
|
return true;
|
|
}
|
|
|
|
for(var i = 0; i < configMenuItems.length; i++) {
|
|
if(configMenuItems[i] !== plasmoid.configuration.menuItems[i]) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|