Warning, /graphics/krita/libs/libqml/plugins/components/Slider.qml is written in an unsupported language. File is not indexed.
0001 /* This file is part of the KDE project
0002 * SPDX-FileCopyrightText: 2012 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003 *
0004 * SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006
0007 import QtQuick 2.3
0008 import org.krita.sketch 1.0
0009
0010 Item {
0011 id: base;
0012 height: Constants.LargeFontSize;
0013 property double value: 0;
0014 property double exponentialValue: 0;
0015 property bool highPrecision: false;
0016 property bool useExponentialValue: false;
0017 onValueChanged: handle.resetHandle();
0018 onExponentialValueChanged: handle.resetHandle(true);
0019
0020 property alias border: fill.border;
0021 property alias background: fill.color;
0022
0023 Rectangle {
0024 id: fill;
0025 anchors.fill: parent;
0026 border.width: 1;
0027 border.color: Settings.theme.color("components/slider/background/border");
0028 color: Settings.theme.color("components/slider/background/fill");
0029 radius: height / 2;
0030 }
0031 MouseArea {
0032 anchors.fill: parent;
0033 function handlePos(mouse) {
0034 var position = mouse.x - (handle.height / 2);
0035 handle.x = position < 0 ? 0 : position > base.width - handle.width ? base.width - handle.width : position;
0036 handle.resetHandle(useExponentialValue);
0037 }
0038 onClicked: handlePos(mouse);
0039 onPositionChanged: handlePos(mouse);
0040 }
0041 Rectangle {
0042 id: handle;
0043 property bool settingSelf: false;
0044 property bool settingExp: false;
0045 function resetHandle(resetExponential)
0046 {
0047 if (!settingSelf) {
0048 // Yes, this seems very odd. However, one cannot assign something undefined to a bool property, so...
0049 settingExp = resetExponential ? true : false;
0050 // This is required as width is not set if we are not done initialising yet.
0051 if (base.width === 0)
0052 return;
0053 var newX = 0;
0054 if (settingExp) {
0055 var newX = Math.round(Math.log(1 + (base.exponentialValue / 100 * 15)) / 2.77258872 * (handle.maximumX - handle.minimumX) + handle.minimumX);
0056 }
0057 else {
0058 var newX = Math.round(base.value / 100 * (handle.maximumX - handle.minimumX) + handle.minimumX);
0059 }
0060 if (newX !== handle.x)
0061 handle.x = newX;
0062 settingExp = false;
0063 }
0064 }
0065 y: 2
0066 x: 2
0067 function calculateWidth(x)
0068 {
0069 var v = 100 * ((Math.exp(2.77258872 * (x / 100)) - 1) / 15);
0070
0071 // Check boundary conditions as Math.exp may round off too much.
0072 if (x === 0 || x === 100) {
0073 return x;
0074 }
0075
0076 return Math.min(100, Math.max(0, v));
0077 }
0078 onXChanged: {
0079 if (settingExp || settingSelf)
0080 return;
0081 settingSelf = true;
0082 if (highPrecision) {
0083 var newValue = ((handle.x - handle.minimumX) * 100) / (handle.maximumX - handle.minimumX);
0084 if (base.value != newValue) {
0085 base.exponentialValue = calculateWidth(newValue);
0086 base.value = Math.max(0, newValue);
0087 }
0088 }
0089 else {
0090 var newValue = Math.round( ((handle.x - handle.minimumX) * 100) / (handle.maximumX - handle.minimumX) );
0091 if (base.value != newValue) {
0092 base.exponentialValue = calculateWidth(newValue);
0093 base.value = Math.max(0, newValue);
0094 }
0095 }
0096 settingSelf = false;
0097 }
0098 height: parent.height - 4;
0099 width: height;
0100 radius: (height / 2) + 1;
0101 color: Settings.theme.color("components/slider/handle/fill");
0102 border.width: 1;
0103 border.color: Settings.theme.color("components/slider/handle/border");
0104 property int minimumX: 2;
0105 property int maximumX: base.width - handle.width - 2;
0106 }
0107 }