update plasmoid to support scrolling
parent
32904be361
commit
6710be3ae5
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4
|
||||
import QtGraphicalEffects 1.2
|
||||
|
||||
import org.kde.plasma.plasmoid 2.0
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
|
||||
Item {
|
||||
id: shadowsContainer
|
||||
opacity: 0.4
|
||||
|
||||
readonly property int gradientLength: root.iconSize / 3
|
||||
readonly property int thickness: latteView ? latteView.realPanelSize : root.iconSize + root.thickMargins
|
||||
readonly property color appliedColor: root.appShadowColorSolid
|
||||
|
||||
LinearGradient {
|
||||
id: firstGradient
|
||||
width: !root.vertical ? gradientLength : shadowsContainer.thickness
|
||||
height: !root.vertical ? shadowsContainer.thickness : gradientLength
|
||||
|
||||
start: Qt.point(0, 0)
|
||||
end: !root.vertical ? Qt.point(width, 0) : Qt.point(0,height)
|
||||
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: (scrollableList.currentPos > scrollableList.scrollFirstPos ? appliedColor : "transparent") }
|
||||
GradientStop { position: 1.0; color: "transparent" }
|
||||
}
|
||||
}
|
||||
|
||||
LinearGradient {
|
||||
id: lastGradient
|
||||
width: firstGradient.width
|
||||
height: firstGradient.height
|
||||
start: firstGradient.start
|
||||
end: firstGradient.end
|
||||
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "transparent" }
|
||||
GradientStop { position: 1.0; color: (scrollableList.currentPos < scrollableList.scrollLastPos ? appliedColor : "transparent") }
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
///Left Edge
|
||||
State {
|
||||
name: "bottom"
|
||||
when: plasmoid.location === PlasmaCore.Types.BottomEdge
|
||||
|
||||
AnchorChanges {
|
||||
target: firstGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: lastGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: shadowsContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined;
|
||||
horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "left"
|
||||
when: plasmoid.location === PlasmaCore.Types.LeftEdge
|
||||
|
||||
AnchorChanges {
|
||||
target: firstGradient
|
||||
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: lastGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: shadowsContainer
|
||||
anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4
|
||||
import QtGraphicalEffects 1.2
|
||||
|
||||
import org.kde.plasma.plasmoid 2.0
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
|
||||
Item {
|
||||
|
||||
readonly property int gradientLength: root.iconSize / 3
|
||||
|
||||
LinearGradient {
|
||||
id: firstGradient
|
||||
width: !root.vertical ? gradientLength : scrollableList.thickness
|
||||
height: !root.vertical ? scrollableList.thickness : gradientLength
|
||||
|
||||
start: Qt.point(0, 0)
|
||||
end: !root.vertical ? Qt.point(gradientLength, 0) : Qt.point(0, gradientLength)
|
||||
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: scrollableList.currentPos <= scrollableList.scrollFirstPos ? "white" : "transparent" }
|
||||
GradientStop { position: 1.0; color: "white" }
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: centralRectangle
|
||||
anchors.top: parent.top
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: !root.vertical ? length : firstGradient.width
|
||||
height: !root.vertical ? firstGradient.height : length
|
||||
color: "white"
|
||||
|
||||
property int length: !root.vertical ? parent.width - 2*gradientLength : parent.height - 2*gradientLength
|
||||
}
|
||||
|
||||
LinearGradient {
|
||||
id: lastGradient
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
width: firstGradient.width
|
||||
height: firstGradient.height
|
||||
|
||||
start: firstGradient.start
|
||||
end: firstGradient.end
|
||||
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "white" }
|
||||
GradientStop { position: 1.0; color: (scrollableList.currentPos >= scrollableList.scrollLastPos ? "white" : "transparent") }
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
///Left Edge
|
||||
State {
|
||||
name: "bottom"
|
||||
when: plasmoid.location === PlasmaCore.Types.BottomEdge
|
||||
|
||||
AnchorChanges {
|
||||
target: firstGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: centralRectangle
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined;
|
||||
horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: lastGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "left"
|
||||
when: plasmoid.location === PlasmaCore.Types.LeftEdge
|
||||
|
||||
AnchorChanges {
|
||||
target: firstGradient
|
||||
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: centralRectangle
|
||||
anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
|
||||
}
|
||||
AnchorChanges {
|
||||
target: lastGradient
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined;
|
||||
horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4
|
||||
|
||||
import org.kde.plasma.plasmoid 2.0
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
|
||||
import org.kde.latte 0.2 as Latte
|
||||
|
||||
Flickable{
|
||||
id: flickableContainer
|
||||
clip: false
|
||||
flickableDirection: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? Flickable.HorizontalFlick : Flickable.VerticalFlick
|
||||
interactive: false
|
||||
|
||||
property int alignment: Latte.Types.BottomEdgeCenterAlign
|
||||
property int offset: 0
|
||||
|
||||
readonly property bool contentsExceed: !root.vertical ? Math.floor(contentWidth) > width : Math.floor(contentHeight) > height
|
||||
readonly property int contentsExtraSpace: {
|
||||
if (contentsExceed) {
|
||||
if (!root.vertical) {
|
||||
return contentWidth - width;
|
||||
} else {
|
||||
return contentHeight - height;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
readonly property int scrollFirstPos: 0
|
||||
readonly property int scrollLastPos: contentsExtraSpace
|
||||
readonly property int scrollStep: root.iconSize * 1.5
|
||||
|
||||
readonly property int currentPos: !root.vertical ? contentX : contentY
|
||||
|
||||
function increasePos() {
|
||||
if (!root.vertical) {
|
||||
contentX = Math.min(scrollLastPos, contentX + scrollStep);
|
||||
} else {
|
||||
contentY = Math.min(scrollLastPos, contentY + scrollStep);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function decreasePos() {
|
||||
if (!root.vertical) {
|
||||
contentX = Math.max(scrollFirstPos, contentX - scrollStep);
|
||||
} else {
|
||||
contentY = Math.max(scrollFirstPos, contentY - scrollStep);
|
||||
}
|
||||
}
|
||||
|
||||
onContentsExtraSpaceChanged: {
|
||||
if (!root.vertical) {
|
||||
if (contentX < scrollFirstPos) {
|
||||
contentX = scrollFirstPos;
|
||||
} else if (contentX > scrollLastPos) {
|
||||
contentX = scrollLastPos;
|
||||
}
|
||||
} else {
|
||||
if (contentY < scrollFirstPos) {
|
||||
contentY = scrollFirstPos;
|
||||
} else if (contentY > scrollLastPos) {
|
||||
contentY = scrollLastPos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Behavior on contentX {
|
||||
NumberAnimation {
|
||||
duration: root.durationTime*units.longDuration
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
}
|
||||
|
||||
Behavior on contentY {
|
||||
NumberAnimation {
|
||||
duration: root.durationTime*units.longDuration
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////BEGIN states
|
||||
//user set Panel Positions
|
||||
// 0-Center, 1-Left, 2-Right, 3-Top, 4-Bottom
|
||||
states: [
|
||||
///Left Edge
|
||||
State {
|
||||
name: "leftCenter"
|
||||
when: flickableContainer.alignment === Latte.Types.LeftEdgeCenterAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: flickableContainer.offset;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "leftTop"
|
||||
when: flickableContainer.alignment === Latte.Types.LeftEdgeTopAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:flickableContainer.offset; anchors.bottomMargin:flickableContainer.lastMargin;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "leftBottom"
|
||||
when: flickableContainer.alignment === Latte.Types.LeftEdgeBottomAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:flickableContainer.lastMargin; anchors.bottomMargin:flickableContainer.offset;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
///Right Edge
|
||||
State {
|
||||
name: "rightCenter"
|
||||
when: flickableContainer.alignment === Latte.Types.RightEdgeCenterAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: flickableContainer.offset;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "rightTop"
|
||||
when: flickableContainer.alignment === Latte.Types.RightEdgeTopAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:flickableContainer.offset; anchors.bottomMargin:flickableContainer.lastMargin;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "rightBottom"
|
||||
when: flickableContainer.alignment === Latte.Types.RightEdgeBottomAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:flickableContainer.lastMargin; anchors.bottomMargin:flickableContainer.offset;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
///Bottom Edge
|
||||
State {
|
||||
name: "bottomCenter"
|
||||
when: flickableContainer.alignment === Latte.Types.BottomEdgeCenterAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: flickableContainer.offset; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "bottomLeft"
|
||||
when: flickableContainer.alignment === Latte.Types.BottomEdgeLeftAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: flickableContainer.offset; anchors.rightMargin:flickableContainer.lastMargin; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "bottomRight"
|
||||
when: flickableContainer.alignment === Latte.Types.BottomEdgeRightAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: flickableContainer.lastMargin; anchors.rightMargin:flickableContainer.offset; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
///Top Edge
|
||||
State {
|
||||
name: "topCenter"
|
||||
when: flickableContainer.alignment === Latte.Types.TopEdgeCenterAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:parent.top; bottom:undefined; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: 0; anchors.rightMargin:0; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: flickableContainer.offset; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "topLeft"
|
||||
when: flickableContainer.alignment === Latte.Types.TopEdgeLeftAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: flickableContainer.offset; anchors.rightMargin:flickableContainer.lastMargin; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "topRight"
|
||||
when: flickableContainer.alignment === Latte.Types.TopEdgeRightAlign
|
||||
|
||||
AnchorChanges {
|
||||
target: flickableContainer
|
||||
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
|
||||
}
|
||||
PropertyChanges{
|
||||
target: flickableContainer;
|
||||
anchors.leftMargin: flickableContainer.lastMargin; anchors.rightMargin:flickableContainer.offset; anchors.topMargin:0; anchors.bottomMargin:0;
|
||||
anchors.horizontalCenterOffset: 0; anchors.verticalCenterOffset: 0;
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue