plasma-taskmanager-zoom/contents/ui/code/layoutmetrics.js

165 lines
5.9 KiB
JavaScript

/*
SPDX-FileCopyrightText: 2012-2013 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
.import org.kde.kirigami as Kirigami
const iconMargin = Math.round(Kirigami.Units.smallSpacing / 4);
const labelMargin = Kirigami.Units.smallSpacing;
function horizontalMargins() {
const spacingAdjustment = (tasks.plasmoid.pluginName === "org.kde.plasma.icontasks") ? (Kirigami.Settings.tabletMode ? 3 : tasks.plasmoid.configuration.iconSpacing) : 1
return (taskFrame.margins.left + taskFrame.margins.right) * (tasks.vertical ? 1 : spacingAdjustment);
}
function verticalMargins() {
const spacingAdjustment = (tasks.plasmoid.pluginName === "org.kde.plasma.icontasks") ? (Kirigami.Settings.tabletMode ? 3 : tasks.plasmoid.configuration.iconSpacing) : 1
return (taskFrame.margins.top + taskFrame.margins.bottom) * (tasks.vertical ? spacingAdjustment : 1);
}
function adjustMargin(height, margin) {
const available = height - verticalMargins();
if (available < Kirigami.Units.iconSizes.small) {
return Math.floor((margin * (Kirigami.Units.iconSizes.small / available)) / 3);
}
return margin;
}
function maxStripes() {
const length = tasks.vertical ? tasks.width : tasks.height;
const minimum = tasks.vertical ? preferredMinWidth() : preferredMinHeight();
return Math.min(tasks.plasmoid.configuration.maxStripes, Math.max(1, Math.floor(length / minimum)));
}
function optimumCapacity(width, height) {
const length = tasks.vertical ? height : width;
const maximum = tasks.vertical ? preferredMaxHeight() : preferredMaxWidth();
if (!tasks.vertical) {
// Fit more tasks in this case, that is possible to cut text, before combining tasks.
return Math.ceil(length / maximum) * maxStripes() + 1;
}
return Math.floor(length / maximum) * maxStripes();
}
function preferredMinWidth() {
let width = preferredMinLauncherWidth();
if (!tasks.vertical && !tasks.iconsOnly) {
width +=
(Kirigami.Units.smallSpacing * 2) +
(Kirigami.Units.gridUnit * 8);
}
return width;
}
function preferredMaxWidth() {
if (tasks.iconsOnly) {
if (tasks.vertical) {
if (tasks.width === 0) {
return 0
}
return tasks.width + verticalMargins();
} else {
if (tasks.height === 0) {
return 0
}
return tasks.height + horizontalMargins();
}
}
// Avoid doing a bunch of unnecessary work below in vertical mode
if (tasks.vertical) {
return preferredMinWidth();
}
// Visually, a large max item width on a tall panel looks cluttered even
// with just a task or two open. This clutter is less pronounced on panels
// lower in height, as there is generally more horizontal space.
//
// This allows for one default value for max item width where clutter is
// reduced at low task counts for tall panels, while leaving low height
// panels less affected (unaffected at 20px).
const laneHeight = tasks.height / maxStripes(); // correct for multiple rows
let baseFactor = 1; // sane default in case something goes wrong
switch (tasks.plasmoid.configuration.taskMaxWidth) {
case 0: // narrow
baseFactor = 1.2;
break;
case 1: // medium
baseFactor = 1.6;
break;
case 2: // wide
baseFactor = 2;
break;
}
// For every pixel of height above 20, knock the factor down by 0.01. This
// produces nice results for 20~50 pixels. Above 50, it suddenly feels like
// it's shrinking a lot, and above 80 the Medium and Narrow settings would
// end up setting the same width, so don't apply further reduction above 50.
const factorReduction = (Math.min(50, laneHeight) - 20) * 0.01;
// Clamp the minimum factor to 1 to ensure max width is always >= min width.
// and the factor reduction to 0 so we don't ever increase the factor
const factor = Math.max(1, baseFactor - Math.max(0, factorReduction));
return Math.floor(preferredMinWidth() * factor);
}
function preferredMinHeight() {
// TODO FIXME UPSTREAM: Port to proper font metrics for descenders once we have access to them.
return Kirigami.Units.iconSizes.sizeForLabels + 4;
}
function preferredMaxHeight() {
if (tasks.vertical) {
let taskPreferredSize = 0;
if (tasks.iconsOnly) {
taskPreferredSize = tasks.width / maxStripes();
} else {
taskPreferredSize = Math.max(Kirigami.Units.iconSizes.sizeForLabels,
Kirigami.Units.iconSizes.medium);
}
return verticalMargins() +
Math.min(
// Do not allow the preferred icon size to exceed the width of
// the vertical task manager.
tasks.width / maxStripes(),
taskPreferredSize);
} else {
return verticalMargins() +
Math.min(
Kirigami.Units.iconSizes.small * 3,
Kirigami.Units.iconSizes.sizeForLabels * 3);
}
}
function preferredHeightInPopup() {
return verticalMargins() + Math.max(Kirigami.Units.iconSizes.sizeForLabels,
Kirigami.Units.iconSizes.medium);
}
function spaceRequiredToShowText() {
// gridUnit is the height of the default font, but only one isn't enough to
// show anything but the elision character. 2 is too high and results in
// text appearing only at excessively high widths.
return Math.round(Kirigami.Units.gridUnit * 1.5);
}
function preferredMinLauncherWidth() {
const baseWidth = tasks.vertical ? preferredMinHeight() : Math.min(tasks.height, Kirigami.Units.iconSizes.small * 3);
return (baseWidth + horizontalMargins())
- (adjustMargin(baseWidth, taskFrame.margins.top) + adjustMargin(baseWidth, taskFrame.margins.bottom));
}
function maximumContextMenuTextWidth() {
return (Kirigami.Units.iconSizes.sizeForLabels * 28);
}