mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-15 15:54:00 -04:00
250 lines
8.6 KiB
QML
250 lines
8.6 KiB
QML
import QtQuick
|
||
import qs.Common
|
||
import qs.Modals.Common
|
||
import qs.Services
|
||
import qs.DCommon.Widgets
|
||
|
||
DModal {
|
||
id: root
|
||
|
||
layerNamespace: "dms:icc-profile-info"
|
||
keepPopoutsOpen: true
|
||
|
||
property string outputName: ""
|
||
readonly property var profile: outputName !== "" ? (ICCService.status[outputName] ?? null) : null
|
||
|
||
function showProfile(output) {
|
||
outputName = output;
|
||
open();
|
||
}
|
||
|
||
function toneCurveText(p) {
|
||
if (!p)
|
||
return "";
|
||
|
||
const kind = p.trcKind;
|
||
if (kind === "gamma")
|
||
return I18n.tr("Gamma", "Gamma") + " " + (p.trcGamma ?? 0).toFixed(2);
|
||
if (kind === "table")
|
||
return I18n.tr("Table", "Tone curve stored as a lookup table") + " · " + p.trcEntries;
|
||
if (kind === "identity")
|
||
return I18n.tr("Identity", "Tone curve that leaves the signal unchanged");
|
||
if (kind === "mixed")
|
||
return I18n.tr("Mixed", "Tone curves that differ between channels");
|
||
return "";
|
||
}
|
||
|
||
function whitePointText(p) {
|
||
if (!p)
|
||
return "";
|
||
if (p.whitePointName && p.whitePointCCT)
|
||
return p.whitePointName + " · " + p.whitePointCCT + "K";
|
||
if (p.whitePointCCT)
|
||
return p.whitePointCCT + "K";
|
||
if (p.whitePointX !== undefined)
|
||
return p.whitePointX.toFixed(4) + ", " + p.whitePointY.toFixed(4);
|
||
return "";
|
||
}
|
||
|
||
function vcgtText(p) {
|
||
if (!p)
|
||
return "";
|
||
return p.hasVCGT ? (p.vcgtChannels + " × " + p.vcgtEntries) : I18n.tr("No", "No");
|
||
}
|
||
|
||
function sizeText(p) {
|
||
if (!p || !p.size)
|
||
return "";
|
||
return p.size < 1024 ? p.size + " B" : (p.size / 1024).toFixed(1) + " KB";
|
||
}
|
||
|
||
function modifiedText(p) {
|
||
if (!p || !p.modified)
|
||
return "";
|
||
return Qt.formatDateTime(new Date(p.modified * 1000), "yyyy-MM-dd HH:mm");
|
||
}
|
||
|
||
readonly property var details: {
|
||
const p = profile;
|
||
if (!p)
|
||
return [];
|
||
|
||
return [
|
||
{
|
||
"label": I18n.tr("Version", "Version"),
|
||
"value": p.version || ""
|
||
},
|
||
{
|
||
"label": I18n.tr("Class", "ICC profile class, e.g. monitor, scanner, printer"),
|
||
"value": p.class || ""
|
||
},
|
||
{
|
||
"label": I18n.tr("Color space", "ICC profile color space"),
|
||
"value": p.colorSpace || ""
|
||
},
|
||
{
|
||
"label": I18n.tr("Tone curve", "How the ICC profile stores its tone reproduction curves"),
|
||
"value": toneCurveText(p)
|
||
},
|
||
{
|
||
"label": I18n.tr("Video card gamma table", "Video card gamma table (vcgt) carried by the profile"),
|
||
"value": vcgtText(p)
|
||
},
|
||
{
|
||
"label": I18n.tr("White point", "White point the ICC profile was produced for"),
|
||
"value": whitePointText(p)
|
||
},
|
||
{
|
||
"label": I18n.tr("Active", "Active"),
|
||
"value": p.active ? I18n.tr("Yes", "Yes") : I18n.tr("No", "No")
|
||
},
|
||
{
|
||
"label": I18n.tr("Size", "Size"),
|
||
"value": sizeText(p)
|
||
},
|
||
{
|
||
"label": I18n.tr("Modified", "Modified"),
|
||
"value": modifiedText(p)
|
||
}
|
||
];
|
||
}
|
||
|
||
modalWidth: 580
|
||
modalHeight: 520
|
||
onBackgroundClicked: close()
|
||
onVisibleChanged: {
|
||
if (!visible)
|
||
outputName = "";
|
||
}
|
||
|
||
content: Component {
|
||
Item {
|
||
anchors.fill: parent
|
||
|
||
Column {
|
||
anchors.fill: parent
|
||
anchors.margins: Theme.spacingL
|
||
spacing: Theme.spacingM
|
||
|
||
Row {
|
||
width: parent.width
|
||
|
||
Column {
|
||
width: parent.width - 40
|
||
spacing: Theme.spacingXS
|
||
|
||
StyledText {
|
||
text: root.profile?.description || I18n.tr("Color Profile", "Display Config output card label for the per-monitor ICC profile row")
|
||
font.pixelSize: Theme.fontSizeLarge
|
||
color: Theme.surfaceText
|
||
font.weight: Font.Medium
|
||
width: parent.width
|
||
elide: Text.ElideRight
|
||
}
|
||
|
||
StyledText {
|
||
text: root.outputName
|
||
font.pixelSize: Theme.fontSizeMedium
|
||
color: Theme.surfaceTextMedium
|
||
width: parent.width
|
||
elide: Text.ElideRight
|
||
}
|
||
}
|
||
|
||
DActionButton {
|
||
iconName: "close"
|
||
iconSize: Theme.iconSize - 4
|
||
iconColor: Theme.surfaceText
|
||
onClicked: root.close()
|
||
}
|
||
}
|
||
|
||
StyledRect {
|
||
width: parent.width
|
||
height: parent.height - 120
|
||
radius: Theme.cornerRadius
|
||
color: Theme.floatingWindowNestedSurface
|
||
border.color: Theme.outlineMedium
|
||
border.width: Theme.layerOutlineWidth
|
||
clip: true
|
||
|
||
DFlickable {
|
||
anchors.fill: parent
|
||
anchors.margins: Theme.spacingM
|
||
contentHeight: detailColumn.implicitHeight
|
||
|
||
Column {
|
||
id: detailColumn
|
||
|
||
width: parent.width
|
||
spacing: Theme.spacingS
|
||
|
||
Repeater {
|
||
model: root.details
|
||
|
||
delegate: Column {
|
||
required property var modelData
|
||
|
||
width: detailColumn.width
|
||
spacing: 2
|
||
|
||
StyledText {
|
||
text: modelData.label
|
||
font.pixelSize: Theme.fontSizeSmall
|
||
color: Theme.surfaceVariantText
|
||
width: parent.width
|
||
elide: Text.ElideRight
|
||
}
|
||
|
||
StyledText {
|
||
text: modelData.value !== "" ? modelData.value : "—"
|
||
font.pixelSize: Theme.fontSizeMedium
|
||
color: Theme.surfaceText
|
||
width: parent.width
|
||
elide: Text.ElideMiddle
|
||
}
|
||
}
|
||
}
|
||
|
||
StyledText {
|
||
visible: root.details.length === 0
|
||
text: I18n.tr("No information available", "No information available")
|
||
font.pixelSize: Theme.fontSizeMedium
|
||
color: Theme.surfaceTextMedium
|
||
}
|
||
|
||
StyledText {
|
||
text: I18n.tr("Path", "Path")
|
||
font.pixelSize: Theme.fontSizeSmall
|
||
color: Theme.surfaceVariantText
|
||
width: parent.width
|
||
topPadding: Theme.spacingS
|
||
}
|
||
|
||
StyledText {
|
||
text: root.profile?.path || "—"
|
||
font.pixelSize: Theme.fontSizeSmall
|
||
color: Theme.surfaceTextMedium
|
||
width: parent.width
|
||
elide: Text.ElideMiddle
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
Item {
|
||
width: parent.width
|
||
height: 40
|
||
|
||
DButton {
|
||
anchors.right: parent.right
|
||
anchors.verticalCenter: parent.verticalCenter
|
||
text: I18n.tr("Close", "Close")
|
||
onClicked: root.close()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|