Files
hyprdots/local/share/plasma/plasmoids/org.kde.windowtitle/contents/ui/TitleLayout.qml
2025-05-04 23:56:04 +02:00

284 lines
12 KiB
QML

/*
* Copyright 2018-2019 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of applet-window-title
*
* Latte-Dock 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.
*
* Latte-Dock 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 QtQml.Models 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
GridLayout{
id: titleLayout
rows: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? 1 : -1
columns: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : 1
columnSpacing: 0
rowSpacing: 0
property bool isUsedForMetrics: false
property bool exceedsAvailableSpace: false
property bool exceedsApplicationText: false
property int applicationTextLength: {
var applicationLength = 0;
var midSpacerLength = midSpacer.visible ?
(plasmoid.formFactor === PlasmaCore.Types.Horizontal ? midSpacer.width : midSpacer.height) : 0;
if (plasmoid.configuration.style === 0 /*Application*/
|| plasmoid.configuration.style === 2) { /*ApplicationTitle*/
applicationLength = firstTxt.implicitWidth;
} else if (plasmoid.configuration.style === 3) { /*TitleApplication*/
applicationLength = lastTxt.implicitWidth + midSpacerLength;
}
var iconLength = mainIcon.visible ?
(plasmoid.formFactor === PlasmaCore.Types.Horizontal ? mainIcon.width : mainIcon.height) : 0;
var subElements = plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
firstSpacer.width + iconLength + midSpacerLength + lastSpacer.width:
firstSpacer.height + iconLength + midSpacerLength + lastSpacer.height;
return subElements + applicationLength;
}
Item{
id: firstSpacer
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? plasmoid.configuration.lengthFirstMargin : -1
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : plasmoid.configuration.lengthFirstMargin
Layout.preferredHeight: Layout.minimumHeight
Layout.maximumHeight: Layout.minimumHeight
}
Item {
id: mainIcon
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
iconItem.iconSize : root.thickness
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
root.thickness : iconItem.iconSize
Layout.maximumHeight: Layout.minimumHeight
visible: plasmoid.configuration.showIcon
QIconItem{
id: iconItem
anchors.fill: parent
anchors.topMargin: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickMargin : 0
anchors.bottomMargin: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickMargin : 0
anchors.leftMargin: plasmoid.formFactor === PlasmaCore.Types.Vertical ? thickMargin : 0
anchors.rightMargin: plasmoid.formFactor === PlasmaCore.Types.Vertical ? thickMargin : 0
icon: existsWindowActive ? activeTaskItem.icon : fullActivityInfo.icon
readonly property int thickMargin: plasmoid.configuration.iconFillThickness ?
0 : (root.thickness - iconSize) / 2
readonly property int iconSize: plasmoid.configuration.iconFillThickness ?
root.thickness : Math.min(root.thickness, plasmoid.configuration.iconSize)
}
}
Item{
id: midSpacer
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? plasmoid.configuration.spacing : -1
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : plasmoid.configuration.spacing
Layout.preferredHeight: Layout.minimumHeight
Layout.maximumHeight: Layout.minimumHeight
visible: mainIcon.visible && plasmoid.configuration.style !== 4 /*NoText*/
}
Item{
id: textsContainer
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : root.thickness
Layout.preferredWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? textRow.availableSpace : root.thickness
Layout.maximumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? textRow.availableSpace : root.thickness
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? root.thickness : -1
Layout.preferredHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? root.thickness : textRow.availableSpace
Layout.maximumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? root.thickness : textRow.availableSpace
visible: plasmoid.configuration.style !== 4 /*NoText*/
RowLayout {
id: textRow
anchors.centerIn: parent
spacing: 0
width: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? parent.width : parent.height
height: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? parent.height : parent.width
readonly property int availableSpace: {
if (!titleLayout.isUsedForMetrics) {
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal) {
var iconL = mainIcon.visible ? mainIcon.width : 0;
var midL = midSpacer.visible ? midSpacer.width : 0;
return titleLayout.width - firstSpacer.width - iconL - midL - lastSpacer.width;
} else {
var iconL = mainIcon.visible ? mainIcon.height : 0;
var midL = midSpacer.visible ? midSpacer.height : 0;
return titleLayout.height - firstSpacer.height - iconL - midL - lastSpacer.height;
}
}
return implicitWidths;
}
readonly property int implicitWidths: {
return Math.ceil(firstTxt.implicitWidth) + Math.ceil(midTxt.implicitWidth) + Math.ceil(lastTxt.implicitWidth);
}
transformOrigin: Item.Center
rotation: {
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal) {
return 0;
} else if (plasmoid.location === PlasmaCore.Types.LeftEdge) {
return -90;
} else if (plasmoid.location === PlasmaCore.Types.RightEdge) {
return 90;
}
}
Label{
id: firstTxt
Layout.fillWidth: elide === Text.ElideNone ? false : true
width: Text.ElideNone ? implicitWidth : -1
verticalAlignment: Text.AlignVCenter
text: existsWindowActive ? root.firstTitleText : root.fallBackText
color: enforceLattePalette ? latteBridge.palette.textColor : theme.textColor
font.capitalization: plasmoid.configuration.capitalFont ? Font.Capitalize : Font.MixedCase
font.bold: plasmoid.configuration.boldFont
font.italic: plasmoid.configuration.italicFont
readonly property bool showsTitleText: plasmoid.configuration.style === 1 /*Title*/
|| plasmoid.configuration.style === 3 /*TitleApplication*/
readonly property bool showsApplicationText: plasmoid.configuration.style === 0 /*Application*/
|| plasmoid.configuration.style === 2 /*ApplicationTitle*/
elide: {
if (plasmoid.configuration.style === 1 && titleLayout.exceedsAvailableSpace){ /*Title*/
return Text.ElideRight;
} else if (plasmoid.configuration.style === 3
&& activeTaskItem
&& activeTaskItem.appName !== activeTaskItem.title
&& titleLayout.exceedsAvailableSpace){ /*TitleApplication*/
return Text.ElideRight;
} else if (showsApplicationText && !isUsedForMetrics && exceedsApplicationText) {
return Text.ElideRight;
}
return Text.ElideNone;
}
visible: {
if (!isUsedForMetrics && showsTitleText && exceedsApplicationText) {
return false;
}
return true;
}
}
Label{
id: midTxt
verticalAlignment: firstTxt.verticalAlignment
width: implicitWidth
visible: !exceedsApplicationText && text !== ""
text: {
if (!existsWindowActive) {
return "";
}
if (plasmoid.configuration.style === 2 || plasmoid.configuration.style === 3){ /*ApplicationTitle*/ /*OR*/ /*TitleApplication*/
if (activeTaskItem.appName !== activeTaskItem.title && activeTaskItem.appName !== "" && activeTaskItem.title !== "") {
return " - ";
}
}
return "";
}
color: firstTxt.color
font.capitalization: firstTxt.font.capitalization
font.bold: firstTxt.font.bold
font.italic: firstTxt.font.italic
}
Label{
id: lastTxt
Layout.fillWidth: elide === Text.ElideNone ? false : true
width: Text.ElideNone ? implicitWidth : -1
verticalAlignment: firstTxt.verticalAlignment
text: existsWindowActive ? root.lastTitleText : ""
color: firstTxt.color
font.capitalization: firstTxt.font.capitalization
font.bold: firstTxt.font.bold
font.italic: firstTxt.font.italic
visible: text !== "" && !(showsTitleText && exceedsApplicationText)
readonly property bool showsTitleText: plasmoid.configuration.style === 2 /*ApplicationTitle*/
elide: {
if (activeTaskItem
&& activeTaskItem.appName !== activeTaskItem.title
&& plasmoid.configuration.style === 2 /*ApplicationTitle*/
&& titleLayout.exceedsAvailableSpace){ /*AND is shown*/
return Text.ElideRight;
} else if(plasmoid.configuration.style === 3 /*TitleApplication*/
&& exceedsApplicationText) {
return Text.ElideRight;
}
return Text.ElideNone;
}
}
}
}
Item{
id: lastSpacer
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? plasmoid.configuration.lengthLastMargin : -1
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : plasmoid.configuration.lengthLastMargin
Layout.preferredHeight: Layout.minimumHeight
Layout.maximumHeight: Layout.minimumHeight
}
}