Complete GUI overhaul (from Qt Widgets to Qt Quick Controls 2)
Added chaperone profiles Added separate supersampling sliders for applications/compositor Added asynchronous reprojection on/off switch Merged in Microphone Control Overlay Added Push-to-Talk profiles Updated to OpenVR 1.0.3 Requires at least SteamVR beta 1477423729.
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,56 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Window 2.2
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ApplicationWindow {
|
||||
id: window
|
||||
|
||||
color: Material.backgroundColor
|
||||
|
||||
overlay.modal: Rectangle {
|
||||
color: window.Material.backgroundDimColor
|
||||
Behavior on opacity { NumberAnimation { duration: 150 } }
|
||||
}
|
||||
|
||||
overlay.modeless: Rectangle {
|
||||
color: window.Material.backgroundDimColor
|
||||
Behavior on opacity { NumberAnimation { duration: 150 } }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
/*!
|
||||
A implementation of CSS's box-shadow, used by ElevationEffect for a Material Design
|
||||
elevation shadow effect.
|
||||
*/
|
||||
RectangularGlow {
|
||||
// The 4 properties from CSS box-shadow, plus the inherited color property
|
||||
property int offsetX
|
||||
property int offsetY
|
||||
property int blurRadius
|
||||
property int spreadRadius
|
||||
|
||||
// The source item the shadow is being applied to, used for correctly
|
||||
// calculating the corner radious
|
||||
property Item source
|
||||
|
||||
property bool fullWidth
|
||||
property bool fullHeight
|
||||
|
||||
x: (parent.width - width)/2 + offsetX
|
||||
y: (parent.height - height)/2 + offsetY
|
||||
|
||||
implicitWidth: source ? source.width : parent.width
|
||||
implicitHeight: source ? source.height : parent.height
|
||||
|
||||
width: implicitWidth + 2 * spreadRadius + (fullWidth ? 2 * cornerRadius : 0)
|
||||
height: implicitHeight + 2 * spreadRadius + (fullHeight ? 2 * cornerRadius : 0)
|
||||
glowRadius: blurRadius/2
|
||||
spread: 0.05
|
||||
cornerRadius: blurRadius + (source && source.radius || 0)
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.BusyIndicator {
|
||||
id: control
|
||||
|
||||
implicitWidth: contentItem.implicitWidth + leftPadding + rightPadding
|
||||
implicitHeight: contentItem.implicitHeight + topPadding + bottomPadding
|
||||
|
||||
padding: 6
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: ProgressRing {
|
||||
id: ring
|
||||
x: control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
implicitWidth: 48
|
||||
implicitHeight: 48
|
||||
width: size
|
||||
height: size
|
||||
opacity: control.running ? 1 : 0
|
||||
color: control.Material.accentColor
|
||||
|
||||
readonly property real size: Math.min(control.availableWidth, control.availableHeight)
|
||||
|
||||
Behavior on opacity { OpacityAnimator { duration: 250 } }
|
||||
|
||||
RingAnimator {
|
||||
target: ring
|
||||
running: control.visible && control.running
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Button {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
// external vertical padding is 6 (to increase touch area)
|
||||
padding: 12
|
||||
leftPadding: padding - 4
|
||||
rightPadding: padding - 4
|
||||
|
||||
Material.elevation: flat ? control.down || control.hovered ? 2 : 0
|
||||
: control.down ? 8 : 2
|
||||
Material.background: flat ? "transparent" : undefined
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: !control.enabled ? control.Material.hintTextColor :
|
||||
control.flat && control.highlighted ? control.Material.accentColor :
|
||||
control.highlighted ? control.Material.primaryHighlightedTextColor : control.Material.primaryTextColor
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
// TODO: Add a proper ripple/ink effect for mouse/touch input and focus state
|
||||
background: Rectangle {
|
||||
implicitWidth: 64
|
||||
implicitHeight: 48
|
||||
|
||||
// external vertical padding is 6 (to increase touch area)
|
||||
y: 6
|
||||
width: parent.width
|
||||
height: parent.height - 12
|
||||
radius: 2
|
||||
color: !control.enabled
|
||||
? control.Material.buttonDisabledColor
|
||||
: control.down
|
||||
? control.highlighted ? control.Material.highlightedButtonPressColor
|
||||
: control.Material.buttonPressColor
|
||||
: control.visualFocus || control.checked
|
||||
? control.highlighted ? control.Material.highlightedButtonHoverColor
|
||||
: control.Material.buttonHoverColor
|
||||
: control.highlighted ? control.Material.highlightedButtonColor
|
||||
: control.Material.buttonColor
|
||||
|
||||
Behavior on color {
|
||||
ColorAnimation {
|
||||
duration: 400
|
||||
}
|
||||
}
|
||||
|
||||
// The layer is disabled when the button color is transparent so you can do
|
||||
// Material.background: "transparent" and get a proper flat button without needing
|
||||
// to set Material.elevation as well
|
||||
layer.enabled: control.enabled && control.Material.buttonColor.a > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.CheckBox {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
spacing: 8
|
||||
padding: 8
|
||||
topPadding: padding + 7
|
||||
bottomPadding: padding + 7
|
||||
|
||||
//! [indicator]
|
||||
indicator: CheckIndicator {
|
||||
x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.CheckDelegate {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
topPadding: 14
|
||||
bottomPadding: 14
|
||||
spacing: 16
|
||||
|
||||
//! [indicator]
|
||||
indicator: CheckIndicator {
|
||||
x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
|
||||
visible: control.down || control.highlighted
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.listHighlightColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
Rectangle {
|
||||
id: indicatorItem
|
||||
implicitWidth: 18
|
||||
implicitHeight: 18
|
||||
color: "transparent"
|
||||
border.color: control.checked ? control.Material.accentColor : control.Material.secondaryTextColor
|
||||
border.width: control.checked ? width / 2 : 2
|
||||
radius: 2
|
||||
|
||||
property alias control: ripple.control
|
||||
|
||||
Behavior on border.width {
|
||||
NumberAnimation {
|
||||
duration: 100
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
}
|
||||
|
||||
Behavior on border.color {
|
||||
ColorAnimation {
|
||||
duration: 100
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
}
|
||||
|
||||
Ripple {
|
||||
id: ripple
|
||||
width: parent.width
|
||||
height: width
|
||||
control: control
|
||||
colored: control.checked
|
||||
opacity: control.down || control.visualFocus ? 1 : 0
|
||||
}
|
||||
|
||||
// TODO: This needs to be transparent
|
||||
Image {
|
||||
id: checkImage
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
width: 14
|
||||
height: 14
|
||||
source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/images/check.png"
|
||||
fillMode: Image.PreserveAspectFit
|
||||
|
||||
scale: control.checked ? 1 : 0
|
||||
Behavior on scale { NumberAnimation { duration: 100 } }
|
||||
}
|
||||
|
||||
states: State {
|
||||
name: "checked"
|
||||
when: control.checked
|
||||
}
|
||||
|
||||
transitions: Transition {
|
||||
SequentialAnimation {
|
||||
NumberAnimation {
|
||||
target: indicatorItem
|
||||
property: "scale"
|
||||
// Go down 2 pixels in size.
|
||||
to: 1 - 2 / indicatorItem.width
|
||||
duration: 120
|
||||
}
|
||||
NumberAnimation {
|
||||
target: indicatorItem
|
||||
property: "scale"
|
||||
to: 1
|
||||
duration: 120
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Window 2.2
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.ComboBox {
|
||||
id: control
|
||||
|
||||
Material.elevation: control.pressed ? 8 : 2
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
spacing: 6
|
||||
padding: 16
|
||||
|
||||
//! [delegate]
|
||||
delegate: MenuItem {
|
||||
width: control.width
|
||||
text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
|
||||
Material.foreground: control.currentIndex === index ? control.Material.accent : control.Material.foreground
|
||||
highlighted: control.highlightedIndex === index
|
||||
}
|
||||
//! [delegate]
|
||||
|
||||
//! [indicator]
|
||||
indicator: Image {
|
||||
x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
opacity: !control.enabled ? 0.5 : 1.0
|
||||
source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/images/drop-indicator.png"
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.mirrored && control.indicator ? control.indicator.width + control.spacing : 0
|
||||
rightPadding: !control.mirrored && control.indicator ? control.indicator.width + control.spacing : 0
|
||||
|
||||
text: control.displayText
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitWidth: 120
|
||||
implicitHeight: 48
|
||||
|
||||
radius: 2
|
||||
color: control.Material.dialogColor
|
||||
|
||||
Behavior on color {
|
||||
ColorAnimation {
|
||||
duration: 400
|
||||
}
|
||||
}
|
||||
|
||||
layer.enabled: control.enabled && control.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
radius: parent.radius
|
||||
visible: control.visualFocus
|
||||
color: control.Material.checkBoxUncheckedRippleColor
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
|
||||
//! [popup]
|
||||
popup: T.Popup {
|
||||
width: control.width
|
||||
implicitHeight: listview.contentHeight
|
||||
transformOrigin: Item.Top
|
||||
topMargin: 12
|
||||
bottomMargin: 12
|
||||
|
||||
Material.theme: control.Material.theme
|
||||
Material.accent: control.Material.accent
|
||||
Material.primary: control.Material.primary
|
||||
|
||||
enter: Transition {
|
||||
// grow_fade_in
|
||||
NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
// shrink_fade_out
|
||||
NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
contentItem: ListView {
|
||||
id: listview
|
||||
clip: true
|
||||
model: control.popup.visible ? control.delegateModel : null
|
||||
currentIndex: control.highlightedIndex
|
||||
|
||||
T.ScrollIndicator.vertical: ScrollIndicator { }
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
radius: 3
|
||||
color: control.Material.dialogColor
|
||||
|
||||
layer.enabled: control.enabled
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: 8
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [popup]
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.Dial {
|
||||
id: control
|
||||
|
||||
implicitWidth: 100
|
||||
implicitHeight: 100
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
x: control.width / 2 - width / 2
|
||||
y: control.height / 2 - height / 2
|
||||
width: Math.max(64, Math.min(control.width, control.height))
|
||||
height: width
|
||||
color: "transparent"
|
||||
radius: width / 2
|
||||
|
||||
border.color: control.enabled ? control.Material.accentColor : control.Material.hintTextColor
|
||||
}
|
||||
//! [background]
|
||||
|
||||
//! [handle]
|
||||
handle: Rectangle {
|
||||
id: handleItem
|
||||
|
||||
x: background.x + background.width / 2 - handle.width / 2
|
||||
y: background.y + background.height / 2 - handle.height / 2
|
||||
transform: [
|
||||
Translate {
|
||||
y: -background.height * 0.4 + handle.height / 2
|
||||
},
|
||||
Rotation {
|
||||
angle: control.angle
|
||||
origin.x: handle.width / 2
|
||||
origin.y: handle.height / 2
|
||||
}
|
||||
]
|
||||
implicitWidth: 14
|
||||
implicitHeight: 14
|
||||
radius: width / 2
|
||||
color: control.enabled ? control.Material.accentColor : control.Material.hintTextColor
|
||||
}
|
||||
//! [handle]
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Drawer {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
//! [enter]
|
||||
enter: Transition { SmoothedAnimation { velocity: 5 } }
|
||||
//! [enter]
|
||||
|
||||
//! [exit]
|
||||
exit: Transition { SmoothedAnimation { velocity: 5 } }
|
||||
//! [exit]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item { }
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
color: control.Material.dialogColor
|
||||
|
||||
layer.enabled: control.position > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: 16
|
||||
fullHeight: true
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
/*!
|
||||
An effect for standard Material Design elevation shadows. Useful for using as \c layer.effect.
|
||||
*/
|
||||
Item {
|
||||
id: effect
|
||||
|
||||
/*!
|
||||
The source the effect is applied to.
|
||||
*/
|
||||
property var source
|
||||
|
||||
/*!
|
||||
The elevation of the \l source Item.
|
||||
*/
|
||||
property int elevation: 0
|
||||
|
||||
/*!
|
||||
Set to \c true if the \l source Item is the same width as its parent and the shadow
|
||||
should be full width instead of rounding around the corner of the Item.
|
||||
|
||||
\sa fullHeight
|
||||
*/
|
||||
property bool fullWidth: false
|
||||
|
||||
/*!
|
||||
Set to \c true if the \l source Item is the same height as its parent and the shadow
|
||||
should be full height instead of rounding around the corner of the Item.
|
||||
|
||||
\sa fullWidth
|
||||
*/
|
||||
property bool fullHeight: false
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
The actual source Item the effect is applied to.
|
||||
*/
|
||||
readonly property Item sourceItem: source.sourceItem
|
||||
|
||||
/*
|
||||
* The following shadow values are taken from Angular Material
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2014-2016 Google, Inc. http://angularjs.org
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
/*!
|
||||
\internal
|
||||
|
||||
The shadows to use for each possible elevation. There are three shadows that when combined
|
||||
make up the elevation.
|
||||
*/
|
||||
readonly property var _shadows: [
|
||||
[{offset: 0, blur: 0, spread: 0},
|
||||
{offset: 0, blur: 0, spread: 0},
|
||||
{offset: 0, blur: 0, spread: 0}],
|
||||
|
||||
[{offset: 1, blur: 3, spread: 0},
|
||||
{offset: 1, blur: 1, spread: 0},
|
||||
{offset: 2, blur: 1, spread: -1}],
|
||||
|
||||
[{offset: 1, blur: 5, spread: 0},
|
||||
{offset: 2, blur: 2, spread: 0},
|
||||
{offset: 3, blur: 1, spread: -2}],
|
||||
|
||||
[{offset: 1, blur: 8, spread: 0},
|
||||
{offset: 3, blur: 4, spread: 0},
|
||||
{offset: 3, blur: 3, spread: -2}],
|
||||
|
||||
[{offset: 2, blur: 4, spread: -1},
|
||||
{offset: 4, blur: 5, spread: 0},
|
||||
{offset: 1, blur: 10, spread: 0}],
|
||||
|
||||
[{offset: 3, blur: 5, spread: -1},
|
||||
{offset: 5, blur: 8, spread: 0},
|
||||
{offset: 1, blur: 14, spread: 0}],
|
||||
|
||||
[{offset: 3, blur: 5, spread: -1},
|
||||
{offset: 6, blur: 10, spread: 0},
|
||||
{offset: 1, blur: 18, spread: 0}],
|
||||
|
||||
[{offset: 4, blur: 5, spread: -2},
|
||||
{offset: 7, blur: 10, spread: 1},
|
||||
{offset: 2, blur: 16, spread: 1}],
|
||||
|
||||
[{offset: 5, blur: 5, spread: -3},
|
||||
{offset: 8, blur: 10, spread: 1},
|
||||
{offset: 3, blur: 14, spread: 2}],
|
||||
|
||||
[{offset: 5, blur: 6, spread: -3},
|
||||
{offset: 9, blur: 12, spread: 1},
|
||||
{offset: 3, blur: 16, spread: 2}],
|
||||
|
||||
[{offset: 6, blur: 6, spread: -3},
|
||||
{offset: 10, blur: 14, spread: 1},
|
||||
{offset: 4, blur: 18, spread: 3}],
|
||||
|
||||
[{offset: 6, blur: 7, spread: -4},
|
||||
{offset: 11, blur: 15, spread: 1},
|
||||
{offset: 4, blur: 20, spread: 3}],
|
||||
|
||||
[{offset: 7, blur: 8, spread: -4},
|
||||
{offset: 12, blur: 17, spread: 2},
|
||||
{offset: 5, blur: 22, spread: 4}],
|
||||
|
||||
[{offset: 7, blur: 8, spread: -4},
|
||||
{offset: 13, blur: 19, spread: 2},
|
||||
{offset: 5, blur: 24, spread: 4}],
|
||||
|
||||
[{offset: 7, blur: 9, spread: -4},
|
||||
{offset: 14, blur: 21, spread: 2},
|
||||
{offset: 5, blur: 26, spread: 4}],
|
||||
|
||||
[{offset: 8, blur: 9, spread: -5},
|
||||
{offset: 15, blur: 22, spread: 2},
|
||||
{offset: 6, blur: 28, spread: 5}],
|
||||
|
||||
[{offset: 8, blur: 10, spread: -5},
|
||||
{offset: 16, blur: 24, spread: 2},
|
||||
{offset: 6, blur: 30, spread: 5}],
|
||||
|
||||
[{offset: 8, blur: 11, spread: -5},
|
||||
{offset: 17, blur: 26, spread: 2},
|
||||
{offset: 6, blur: 32, spread: 5}],
|
||||
|
||||
[{offset: 9, blur: 11, spread: -5},
|
||||
{offset: 18, blur: 28, spread: 2},
|
||||
{offset: 7, blur: 34, spread: 6}],
|
||||
|
||||
[{offset: 9, blur: 12, spread: -6},
|
||||
{offset: 19, blur: 29, spread: 2},
|
||||
{offset: 7, blur: 36, spread: 6}],
|
||||
|
||||
[{offset: 10, blur: 13, spread: -6},
|
||||
{offset: 20, blur: 31, spread: 3},
|
||||
{offset: 8, blur: 38, spread: 7}],
|
||||
|
||||
[{offset: 10, blur: 13, spread: -6},
|
||||
{offset: 21, blur: 33, spread: 3},
|
||||
{offset: 8, blur: 40, spread: 7}],
|
||||
|
||||
[{offset: 10, blur: 14, spread: -6},
|
||||
{offset: 22, blur: 35, spread: 3},
|
||||
{offset: 8, blur: 42, spread: 7}],
|
||||
|
||||
[{offset: 11, blur: 14, spread: -7},
|
||||
{offset: 23, blur: 36, spread: 3},
|
||||
{offset: 9, blur: 44, spread: 8}],
|
||||
|
||||
[{offset: 11, blur: 15, spread: -7},
|
||||
{offset: 24, blur: 38, spread: 3},
|
||||
{offset: 9, blur: 46, spread: 8}]
|
||||
]
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
The current shadow based on the elevation.
|
||||
*/
|
||||
readonly property var _shadow: _shadows[Math.max(0, Math.min(elevation, _shadows.length - 1))]
|
||||
|
||||
// Nest the shadows and source view in two items rendered as a layer
|
||||
// so the shadow is not clipped by the bounds of the source view
|
||||
Item {
|
||||
property int margin: -100
|
||||
|
||||
x: margin
|
||||
y: margin
|
||||
width: parent.width - 2 * margin
|
||||
height: parent.height - 2 * margin
|
||||
|
||||
// By rendering as a layer, the shadow will never show through the source item,
|
||||
// even when the source item's opacity is less than 1
|
||||
layer.enabled: true
|
||||
|
||||
// The box shadows automatically pick up the size of the source Item and not
|
||||
// the size of the parent, so we don't need to worry about the extra padding
|
||||
// in the parent Item
|
||||
BoxShadow {
|
||||
offsetY: _shadow[0].offset
|
||||
blurRadius: _shadow[0].blur
|
||||
spreadRadius: _shadow[0].spread
|
||||
color: Qt.rgba(0,0,0, 0.2)
|
||||
|
||||
fullWidth: effect.fullWidth
|
||||
fullHeight: effect.fullHeight
|
||||
source: effect.sourceItem
|
||||
}
|
||||
|
||||
BoxShadow {
|
||||
offsetY: _shadow[1].offset
|
||||
blurRadius: _shadow[1].blur
|
||||
spreadRadius: _shadow[1].spread
|
||||
color: Qt.rgba(0,0,0, 0.14)
|
||||
|
||||
fullWidth: effect.fullWidth
|
||||
fullHeight: effect.fullHeight
|
||||
source: effect.sourceItem
|
||||
}
|
||||
|
||||
BoxShadow {
|
||||
offsetY: _shadow[2].offset
|
||||
blurRadius: _shadow[2].blur
|
||||
spreadRadius: _shadow[2].spread
|
||||
color: Qt.rgba(0,0,0, 0.12)
|
||||
|
||||
fullWidth: effect.fullWidth
|
||||
fullHeight: effect.fullHeight
|
||||
source: effect.sourceItem
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
property alias source: effect.source
|
||||
|
||||
x: (parent.width - width)/2
|
||||
y: (parent.height - height)/2
|
||||
width: sourceItem.width
|
||||
height: sourceItem.height
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.Frame {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
padding: 12
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item { }
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
radius: 3
|
||||
color: "transparent"
|
||||
border.color: control.Material.frameColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.GroupBox {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
label ? label.implicitWidth + leftPadding + rightPadding : 0,
|
||||
contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
spacing: 6
|
||||
padding: 12
|
||||
topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0)
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item {}
|
||||
//! [contentItem]
|
||||
|
||||
//! [label]
|
||||
label: Text {
|
||||
x: control.leftPadding
|
||||
width: control.availableWidth
|
||||
|
||||
text: control.title
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [label]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
y: control.topPadding - control.padding
|
||||
width: parent.width
|
||||
height: parent.height - control.topPadding + control.padding
|
||||
|
||||
radius: 3
|
||||
color: "transparent"
|
||||
border.color: control.Material.frameColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ItemDelegate {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
spacing: 16
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.checkable && !control.mirrored ? (control.indicator ? control.indicator.width : 0) + control.spacing : 0
|
||||
rightPadding: control.checkable && control.mirrored ? (control.indicator ? control.indicator.width : 0) + control.spacing : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
|
||||
visible: control.down || control.highlighted
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.listHighlightColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.Label {
|
||||
id: control
|
||||
|
||||
color: enabled ? Material.primaryTextColor : Material.hintTextColor
|
||||
linkColor: Material.accentColor
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Menu {
|
||||
id: control
|
||||
|
||||
Material.elevation: 8
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem ? contentItem.implicitHeight : 0) + topPadding + bottomPadding
|
||||
|
||||
margins: 0
|
||||
topPadding: 8
|
||||
bottomPadding: 8
|
||||
|
||||
transformOrigin: Item.Top
|
||||
|
||||
enter: Transition {
|
||||
// grow_fade_in
|
||||
NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
// shrink_fade_out
|
||||
NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: ListView {
|
||||
implicitHeight: contentHeight
|
||||
|
||||
model: control.contentModel
|
||||
// TODO: improve this?
|
||||
interactive: ApplicationWindow.window ? contentHeight > ApplicationWindow.window.height : false
|
||||
clip: true
|
||||
keyNavigationWraps: false
|
||||
currentIndex: -1
|
||||
|
||||
ScrollIndicator.vertical: ScrollIndicator {}
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitWidth: 200
|
||||
implicitHeight: 48
|
||||
|
||||
radius: 3
|
||||
color: control.Material.dialogColor
|
||||
|
||||
layer.enabled: control.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.MenuItem {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
topPadding: 12
|
||||
bottomPadding: 12
|
||||
spacing: 16
|
||||
|
||||
//! [indicator]
|
||||
indicator: CheckIndicator {
|
||||
x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
visible: control.checkable
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.checkable && !control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
rightPadding: control.checkable && control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitWidth: 200
|
||||
implicitHeight: 48
|
||||
visible: control.down || control.highlighted
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.listHighlightColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.Page {
|
||||
id: control
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item { }
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
color: control.Material.backgroundColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.PageIndicator {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
padding: 6
|
||||
spacing: 6
|
||||
|
||||
//! [delegate]
|
||||
delegate: Rectangle {
|
||||
implicitWidth: 8
|
||||
implicitHeight: 8
|
||||
|
||||
radius: width / 2
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
|
||||
opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45
|
||||
Behavior on opacity { OpacityAnimator { duration: 100 } }
|
||||
}
|
||||
//! [delegate]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Row {
|
||||
spacing: control.spacing
|
||||
|
||||
Repeater {
|
||||
model: control.count
|
||||
delegate: control.delegate
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Pane {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
padding: 12
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item { }
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
color: control.Material.backgroundColor
|
||||
|
||||
layer.enabled: control.enabled && control.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Popup {
|
||||
id: control
|
||||
|
||||
Material.elevation: 24
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentWidth > 0 ? contentWidth + leftPadding + rightPadding : 0)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentWidth > 0 ? contentHeight + topPadding + bottomPadding : 0)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
padding: 12
|
||||
|
||||
enter: Transition {
|
||||
// grow_fade_in
|
||||
NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
// shrink_fade_out
|
||||
NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
|
||||
}
|
||||
|
||||
contentItem: Item { }
|
||||
|
||||
background: Rectangle {
|
||||
radius: 3
|
||||
color: control.Material.dialogColor
|
||||
|
||||
layer.enabled: control.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.ProgressBar {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: ProgressStrip {
|
||||
id: strip
|
||||
implicitHeight: 4
|
||||
|
||||
scale: control.mirrored ? -1 : 1
|
||||
indeterminate: control.indeterminate
|
||||
color: control.Material.accentColor
|
||||
progress: control.position
|
||||
|
||||
StripAnimator {
|
||||
target: strip
|
||||
running: control.visible && control.indeterminate
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitWidth: 200
|
||||
implicitHeight: 4
|
||||
x: control.leftPadding
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
width: control.availableWidth
|
||||
height: 4
|
||||
|
||||
color: Qt.rgba(control.Material.accentColor.r, control.Material.accentColor.g, control.Material.accentColor.b, 0.25)
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.RadioButton {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
spacing: 8
|
||||
padding: 8
|
||||
topPadding: padding + 6
|
||||
bottomPadding: padding + 6
|
||||
|
||||
//! [indicator]
|
||||
indicator: RadioIndicator {
|
||||
x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.RadioDelegate {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
topPadding: 8
|
||||
bottomPadding: 8
|
||||
spacing: 16
|
||||
|
||||
//! [indicator]
|
||||
indicator: RadioIndicator {
|
||||
x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
|
||||
visible: control.down || control.highlighted
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.listHighlightColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
Rectangle {
|
||||
implicitWidth: 20
|
||||
implicitHeight: 20
|
||||
radius: width / 2
|
||||
border.width: 2
|
||||
border.color: control.checked || control.down ? control.Material.accentColor : control.Material.secondaryTextColor
|
||||
color: "transparent"
|
||||
|
||||
property alias control: ripple.control
|
||||
|
||||
Ripple {
|
||||
id: ripple
|
||||
width: parent.width
|
||||
height: width
|
||||
control: control
|
||||
colored: control.checked
|
||||
opacity: control.down || control.visualFocus ? 1 : 0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
width: 10
|
||||
height: 10
|
||||
radius: width / 2
|
||||
color: parent.border.color
|
||||
visible: control.checked || control.down
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.RangeSlider {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
Math.max(background ? background.implicitWidth : 0,
|
||||
first.handle ? first.handle.implicitWidth : 0,
|
||||
second.handle ? second.handle.implicitWidth : 0) + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(background ? background.implicitHeight : 0,
|
||||
first.handle ? first.handle.implicitHeight : 0,
|
||||
second.handle ? second.handle.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
|
||||
padding: 6
|
||||
|
||||
//! [firstHandle]
|
||||
first.handle: SliderHandle {
|
||||
x: control.leftPadding + (horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
|
||||
y: control.topPadding + (horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
|
||||
value: first.value
|
||||
handleHasFocus: activeFocus
|
||||
handlePressed: first.pressed
|
||||
}
|
||||
//! [firstHandle]
|
||||
|
||||
//! [secondHandle]
|
||||
second.handle: SliderHandle {
|
||||
x: control.leftPadding + (horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
|
||||
y: control.topPadding + (horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
|
||||
value: second.value
|
||||
handleHasFocus: activeFocus
|
||||
handlePressed: second.pressed
|
||||
}
|
||||
//! [secondHandle]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
x: control.leftPadding + (horizontal ? 0 : (control.availableWidth - width) / 2)
|
||||
y: control.topPadding + (horizontal ? (control.availableHeight - height) / 2 : 0)
|
||||
implicitWidth: horizontal ? 200 : 1
|
||||
implicitHeight: horizontal ? 1 : 200
|
||||
width: horizontal ? control.availableWidth : implicitWidth
|
||||
height: horizontal ? implicitHeight : control.availableHeight
|
||||
color: control.Material.primaryTextColor
|
||||
scale: horizontal && control.mirrored ? -1 : 1
|
||||
|
||||
readonly property bool horizontal: control.orientation === Qt.Horizontal
|
||||
|
||||
Rectangle {
|
||||
x: parent.horizontal ? control.first.position * parent.width : -1
|
||||
y: parent.horizontal ? -1 : control.second.visualPosition * parent.height + 3
|
||||
width: parent.horizontal ? control.second.position * parent.width - control.first.position * parent.width - 3 : 3
|
||||
height: parent.horizontal ? 3 : control.second.position * parent.height - control.first.position * parent.height - 3
|
||||
|
||||
color: control.Material.accentColor
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
Rectangle {
|
||||
property Item control
|
||||
property bool colored: false
|
||||
|
||||
radius: width / 2
|
||||
scale: 2.5
|
||||
color: colored ? control.Material.checkBoxCheckedRippleColor : control.Material.checkBoxUncheckedRippleColor
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ScrollBar {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
padding: 2
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Rectangle {
|
||||
id: handle
|
||||
|
||||
implicitWidth: 4
|
||||
implicitHeight: 4
|
||||
|
||||
color: control.pressed ? control.Material.scrollBarPressedColor : control.Material.scrollBarColor
|
||||
visible: control.size < 1.0
|
||||
opacity: 0.0
|
||||
|
||||
states: State {
|
||||
name: "active"
|
||||
when: control.active
|
||||
PropertyChanges { target: handle; opacity: 0.75 }
|
||||
}
|
||||
|
||||
transitions: Transition {
|
||||
from: "active"
|
||||
SequentialAnimation {
|
||||
PauseAnimation { duration: 450 }
|
||||
NumberAnimation { target: handle; duration: 200; property: "opacity"; to: 0.0 }
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ScrollIndicator {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
padding: 2
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Rectangle {
|
||||
id: indicator
|
||||
|
||||
implicitWidth: 4
|
||||
implicitHeight: 4
|
||||
|
||||
color: control.Material.scrollBarColor
|
||||
visible: control.size < 1.0
|
||||
opacity: 0.0
|
||||
|
||||
states: State {
|
||||
name: "active"
|
||||
when: control.active
|
||||
PropertyChanges { target: indicator; opacity: 0.75 }
|
||||
}
|
||||
|
||||
transitions: [
|
||||
Transition {
|
||||
from: "active"
|
||||
SequentialAnimation {
|
||||
PauseAnimation { duration: 450 }
|
||||
NumberAnimation { target: indicator; duration: 200; property: "opacity"; to: 0.0 }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.Slider {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
Math.max(background ? background.implicitWidth : 0,
|
||||
handle ? handle.implicitWidth : 0) + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(background ? background.implicitHeight : 0,
|
||||
handle ? handle.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
|
||||
padding: 6
|
||||
|
||||
//! [handle]
|
||||
handle: SliderHandle {
|
||||
x: control.leftPadding + (horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
|
||||
y: control.topPadding + (horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
|
||||
value: control.value
|
||||
handleHasFocus: control.visualFocus
|
||||
handlePressed: control.pressed
|
||||
}
|
||||
//! [handle]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
x: control.leftPadding + (horizontal ? 0 : (control.availableWidth - width) / 2)
|
||||
y: control.topPadding + (horizontal ? (control.availableHeight - height) / 2 : 0)
|
||||
implicitWidth: horizontal ? 200 : 1
|
||||
implicitHeight: horizontal ? 1 : 200
|
||||
width: horizontal ? control.availableWidth : implicitWidth
|
||||
height: horizontal ? implicitHeight : control.availableHeight
|
||||
color: control.Material.primaryTextColor
|
||||
scale: horizontal && control.mirrored ? -1 : 1
|
||||
|
||||
readonly property bool horizontal: control.orientation === Qt.Horizontal
|
||||
|
||||
Rectangle {
|
||||
x: parent.horizontal ? 0 : (parent.width - width) / 2
|
||||
y: parent.horizontal ? (parent.height - height) / 2 : control.visualPosition * parent.height
|
||||
width: parent.horizontal ? control.position * parent.width : 3
|
||||
height: parent.horizontal ? 3 : control.position * parent.height
|
||||
|
||||
color: control.Material.accentColor
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
implicitWidth: initialSize
|
||||
implicitHeight: initialSize
|
||||
|
||||
property real value: 0
|
||||
property bool handleHasFocus: false
|
||||
property bool handlePressed: false
|
||||
readonly property int initialSize: 13
|
||||
readonly property bool horizontal: control.orientation === Qt.Horizontal
|
||||
readonly property var control: parent
|
||||
|
||||
Rectangle {
|
||||
id: handleRect
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
radius: width / 2
|
||||
color: root.control.Material.accentColor
|
||||
scale: root.handlePressed ? 1.5 : 1
|
||||
|
||||
Behavior on scale {
|
||||
NumberAnimation {
|
||||
duration: 250
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ripple {
|
||||
width: parent.width
|
||||
height: width
|
||||
control: root.control
|
||||
colored: true
|
||||
opacity: root.handleHasFocus && !root.handlePressed ? 1 : 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.SpinBox {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth +
|
||||
(up.indicator ? up.indicator.implicitWidth : 0) +
|
||||
(down.indicator ? down.indicator.implicitWidth : 0))
|
||||
implicitHeight: Math.max(contentItem.implicitHeight + topPadding + bottomPadding,
|
||||
background ? background.implicitHeight : 0,
|
||||
up.indicator ? up.indicator.implicitHeight : 0,
|
||||
down.indicator ? down.indicator.implicitHeight : 0)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
spacing: 6
|
||||
topPadding: 8
|
||||
bottomPadding: 16
|
||||
leftPadding: (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
|
||||
rightPadding: (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
|
||||
|
||||
//! [validator]
|
||||
validator: IntValidator {
|
||||
locale: control.locale.name
|
||||
bottom: Math.min(control.from, control.to)
|
||||
top: Math.max(control.from, control.to)
|
||||
}
|
||||
//! [validator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: TextInput {
|
||||
text: control.textFromValue(control.value, control.locale)
|
||||
|
||||
font: control.font
|
||||
color: control.Material.primaryTextColor
|
||||
selectionColor: control.Material.textSelectionColor
|
||||
selectedTextColor: control.Material.primaryTextColor
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
verticalAlignment: Qt.AlignVCenter
|
||||
cursorDelegate: Rectangle {
|
||||
id: cursor
|
||||
color: control.Material.accentColor
|
||||
width: 2
|
||||
visible: control.activeFocus && contentItem.selectionStart === contentItem.selectionEnd
|
||||
|
||||
Connections {
|
||||
target: contentItem
|
||||
onCursorPositionChanged: {
|
||||
// keep a moving cursor visible
|
||||
cursor.opacity = 1
|
||||
timer.restart()
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
running: control.activeFocus
|
||||
repeat: true
|
||||
interval: Qt.styleHints.cursorFlashTime
|
||||
onTriggered: cursor.opacity = !cursor.opacity ? 1 : 0
|
||||
// force the cursor visible when gaining focus
|
||||
onRunningChanged: cursor.opacity = 1
|
||||
}
|
||||
}
|
||||
|
||||
readOnly: !control.editable
|
||||
validator: control.validator
|
||||
inputMethodHints: Qt.ImhFormattedNumbersOnly
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [up.indicator]
|
||||
up.indicator: PaddedRectangle {
|
||||
x: control.mirrored ? 0 : parent.width - width
|
||||
implicitWidth: 48
|
||||
implicitHeight: 48
|
||||
height: parent.height
|
||||
width: height
|
||||
padding: control.spacing
|
||||
radius: 3
|
||||
color: Qt.tint(Qt.tint(control.Material.buttonColor,
|
||||
control.activeFocus ? control.Material.buttonHoverColor : "transparent"),
|
||||
control.up.pressed ? control.Material.buttonPressColor: "transparent")
|
||||
|
||||
Rectangle {
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
width: Math.min(parent.width / 3, parent.width / 3)
|
||||
height: 2
|
||||
color: enabled ? control.Material.primaryTextColor : control.Material.spinBoxDisabledIconColor
|
||||
}
|
||||
Rectangle {
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
width: 2
|
||||
height: Math.min(parent.width / 3, parent.width / 3)
|
||||
color: enabled ? control.Material.primaryTextColor : control.Material.spinBoxDisabledIconColor
|
||||
}
|
||||
}
|
||||
//! [up.indicator]
|
||||
|
||||
//! [down.indicator]
|
||||
down.indicator: PaddedRectangle {
|
||||
x: control.mirrored ? parent.width - width : 0
|
||||
implicitWidth: 48
|
||||
implicitHeight: 48
|
||||
height: parent.height
|
||||
width: height
|
||||
padding: control.spacing
|
||||
radius: 3
|
||||
color: Qt.tint(Qt.tint(control.Material.buttonColor,
|
||||
control.activeFocus ? control.Material.buttonHoverColor : "transparent"),
|
||||
control.down.pressed ? control.Material.buttonPressColor : "transparent")
|
||||
|
||||
Rectangle {
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
width: parent.width / 3
|
||||
height: 2
|
||||
color: enabled ? control.Material.primaryTextColor : control.Material.spinBoxDisabledIconColor
|
||||
}
|
||||
}
|
||||
//! [down.indicator]
|
||||
|
||||
//! [background]
|
||||
background: Item {
|
||||
implicitWidth: 192
|
||||
implicitHeight: 48
|
||||
|
||||
Rectangle {
|
||||
x: parent.width / 2 - width / 2
|
||||
y: parent.y + parent.height - height - control.bottomPadding / 2
|
||||
width: control.availableWidth
|
||||
height: control.activeFocus ? 2 : 1
|
||||
color: control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.4
|
||||
import QtQuick.Templates 2.0 as T
|
||||
|
||||
T.StackView {
|
||||
id: control
|
||||
|
||||
//! [popEnter]
|
||||
popEnter: Transition {
|
||||
// slide_in_left
|
||||
NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * -control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [popEnter]
|
||||
|
||||
//! [popExit]
|
||||
popExit: Transition {
|
||||
// slide_out_right
|
||||
NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * control.width; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [popExit]
|
||||
|
||||
//! [pushEnter]
|
||||
pushEnter: Transition {
|
||||
// slide_in_right
|
||||
NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [pushEnter]
|
||||
|
||||
//! [pushExit]
|
||||
pushExit: Transition {
|
||||
// slide_out_left
|
||||
NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [pushExit]
|
||||
|
||||
//! [replaceEnter]
|
||||
replaceEnter: Transition {
|
||||
// slide_in_right
|
||||
NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [replaceEnter]
|
||||
|
||||
//! [replaceExit]
|
||||
replaceExit: Transition {
|
||||
// slide_out_left
|
||||
NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
//! [replaceExit]
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.SwipeDelegate {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
topPadding: 8
|
||||
bottomPadding: 8
|
||||
spacing: 16
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: !control.mirrored ? (control.indicator ? control.indicator.width + control.spacing : 0) : 0
|
||||
rightPadding: control.mirrored ? (control.indicator ? control.indicator.width + control.spacing : 0) : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
Behavior on x {
|
||||
enabled: !control.down
|
||||
NumberAnimation {
|
||||
easing.type: Easing.InOutCubic
|
||||
duration: 400
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
|
||||
color: control.Material.backgroundColor
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
visible: control.down || control.highlighted || control.visualFocus
|
||||
color: control.down ? control.Material.buttonPressColor :
|
||||
control.visualFocus || control.hovered ? control.Material.swipeDelegateHoverColor :
|
||||
control.Material.listHighlightColor
|
||||
}
|
||||
|
||||
Behavior on x {
|
||||
enabled: !control.down
|
||||
NumberAnimation {
|
||||
easing.type: Easing.InOutCubic
|
||||
duration: 400
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
|
||||
T.SwipeView {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: ListView {
|
||||
model: control.contentModel
|
||||
currentIndex: control.currentIndex
|
||||
|
||||
spacing: control.spacing
|
||||
orientation: Qt.Horizontal
|
||||
snapMode: ListView.SnapOneItem
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
|
||||
highlightRangeMode: ListView.StrictlyEnforceRange
|
||||
preferredHighlightBegin: 0
|
||||
preferredHighlightEnd: 0
|
||||
highlightMoveDuration: 250
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
import QtQuick.Templates 2.0 as T
|
||||
|
||||
T.Switch {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 8
|
||||
spacing: 8
|
||||
|
||||
//! [indicator]
|
||||
indicator: SwitchIndicator {
|
||||
x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.SwitchDelegate {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
Math.max(contentItem.implicitHeight,
|
||||
indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 16
|
||||
topPadding: 8
|
||||
bottomPadding: 8
|
||||
spacing: 16
|
||||
|
||||
//! [indicator]
|
||||
indicator: SwitchIndicator {
|
||||
x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
|
||||
y: control.topPadding + (control.availableHeight - height) / 2
|
||||
control: control
|
||||
}
|
||||
//! [indicator]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
|
||||
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
visible: control.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
|
||||
visible: control.down || control.highlighted
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.listHighlightColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
Item {
|
||||
id: indicator
|
||||
implicitWidth: 38
|
||||
implicitHeight: 32
|
||||
|
||||
property alias control: ripple.control
|
||||
|
||||
Material.elevation: 1
|
||||
|
||||
Ripple {
|
||||
id: ripple
|
||||
x: handle.x + handle.width / 2 - width / 2
|
||||
y: handle.y + handle.height / 2 - height / 2
|
||||
width: handle.width
|
||||
height: width
|
||||
colored: control.checked
|
||||
opacity: control.pressed || control.visualFocus ? 1 : 0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: 14
|
||||
radius: height / 2
|
||||
y: parent.height / 2 - height / 2
|
||||
color: control.enabled ? (control.checked ? control.Material.switchCheckedTrackColor : control.Material.switchUncheckedTrackColor)
|
||||
: control.Material.switchDisabledTrackColor
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: handle
|
||||
x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2)))
|
||||
y: (parent.height - height) / 2
|
||||
width: 20
|
||||
height: 20
|
||||
radius: width / 2
|
||||
color: control.enabled ? (control.checked ? control.Material.switchCheckedHandleColor : control.Material.switchUncheckedHandleColor)
|
||||
: control.Material.switchDisabledHandleColor
|
||||
|
||||
Behavior on x {
|
||||
enabled: !control.pressed
|
||||
SmoothedAnimation {
|
||||
duration: 300
|
||||
}
|
||||
}
|
||||
layer.enabled: indicator.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: indicator.Material.elevation
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.TabBar {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
spacing: 1
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: ListView {
|
||||
implicitWidth: contentWidth
|
||||
implicitHeight: 48
|
||||
|
||||
model: control.contentModel
|
||||
currentIndex: control.currentIndex
|
||||
|
||||
spacing: control.spacing
|
||||
orientation: ListView.Horizontal
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
snapMode: ListView.SnapToItem
|
||||
|
||||
highlightMoveDuration: 250
|
||||
highlightResizeDuration: 0
|
||||
highlightFollowsCurrentItem: true
|
||||
highlight: Item {
|
||||
z: 2
|
||||
Rectangle {
|
||||
height: 2
|
||||
width: parent.width
|
||||
y: control.position === T.TabBar.Footer ? 0 : parent.height - height
|
||||
color: control.Material.accentColor
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
color: control.Material.backgroundColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.TabButton {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.contentHeight + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 12
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
text: control.text
|
||||
font: control.font
|
||||
elide: Text.ElideRight
|
||||
color: !control.enabled ? control.Material.hintTextColor : control.down || control.checked ? control.Material.accentColor : control.Material.primaryTextColor
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Item {
|
||||
implicitHeight: 48
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.TextArea {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
|
||||
background ? background.implicitWidth : 0,
|
||||
placeholder.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(contentHeight + 1 + topPadding + bottomPadding,
|
||||
background ? background.implicitHeight : 0,
|
||||
placeholder.implicitHeight + 1 + topPadding + bottomPadding)
|
||||
|
||||
topPadding: 8
|
||||
bottomPadding: 16
|
||||
|
||||
color: enabled ? Material.primaryTextColor : Material.hintTextColor
|
||||
selectionColor: Material.accentColor
|
||||
selectedTextColor: Material.primaryHighlightedTextColor
|
||||
cursorDelegate: Rectangle {
|
||||
id: cursor
|
||||
clip: true // TODO
|
||||
color: control.Material.accentColor
|
||||
width: 2
|
||||
visible: control.activeFocus && control.selectionStart === control.selectionEnd
|
||||
|
||||
Connections {
|
||||
target: control
|
||||
onCursorPositionChanged: {
|
||||
// keep a moving cursor visible
|
||||
cursor.opacity = 1
|
||||
timer.restart()
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
running: control.activeFocus
|
||||
repeat: true
|
||||
interval: Qt.styleHints.cursorFlashTime
|
||||
onTriggered: cursor.opacity = !cursor.opacity ? 1 : 0
|
||||
// force the cursor visible when gaining focus
|
||||
onRunningChanged: cursor.opacity = 1
|
||||
}
|
||||
}
|
||||
|
||||
//! [placeholder]
|
||||
Text {
|
||||
id: placeholder
|
||||
x: control.leftPadding
|
||||
y: control.topPadding
|
||||
width: control.width - (control.leftPadding + control.rightPadding)
|
||||
height: control.height - (control.topPadding + control.bottomPadding)
|
||||
text: control.placeholderText
|
||||
font: control.font
|
||||
color: control.Material.hintTextColor
|
||||
horizontalAlignment: control.horizontalAlignment
|
||||
verticalAlignment: control.verticalAlignment
|
||||
elide: Text.ElideRight
|
||||
visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
|
||||
}
|
||||
//! [placeholder]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
y: parent.height - height - control.bottomPadding / 2
|
||||
implicitWidth: 120
|
||||
height: control.activeFocus ? 2 : 1
|
||||
color: control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.TextField {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
placeholder.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
placeholder.implicitHeight + 1 + topPadding + bottomPadding)
|
||||
|
||||
topPadding: 8
|
||||
bottomPadding: 16
|
||||
|
||||
color: enabled ? Material.primaryTextColor : Material.hintTextColor
|
||||
selectionColor: Material.accentColor
|
||||
selectedTextColor: Material.primaryHighlightedTextColor
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
cursorDelegate: Rectangle {
|
||||
id: cursor
|
||||
color: control.Material.accentColor
|
||||
width: 2
|
||||
visible: control.activeFocus && control.selectionStart === control.selectionEnd
|
||||
|
||||
Connections {
|
||||
target: control
|
||||
onCursorPositionChanged: {
|
||||
// keep a moving cursor visible
|
||||
cursor.opacity = 1
|
||||
timer.restart()
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
running: control.activeFocus
|
||||
repeat: true
|
||||
interval: Qt.styleHints.cursorFlashTime
|
||||
onTriggered: cursor.opacity = !cursor.opacity ? 1 : 0
|
||||
// force the cursor visible when gaining focus
|
||||
onRunningChanged: cursor.opacity = 1
|
||||
}
|
||||
}
|
||||
|
||||
//! [placeholder]
|
||||
Text {
|
||||
id: placeholder
|
||||
x: control.leftPadding
|
||||
y: control.topPadding
|
||||
width: control.width - (control.leftPadding + control.rightPadding)
|
||||
height: control.height - (control.topPadding + control.bottomPadding)
|
||||
text: control.placeholderText
|
||||
font: control.font
|
||||
color: control.Material.hintTextColor
|
||||
horizontalAlignment: control.horizontalAlignment
|
||||
verticalAlignment: control.verticalAlignment
|
||||
elide: Text.ElideRight
|
||||
visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
|
||||
|
||||
}
|
||||
//! [placeholder]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
y: control.height - height - control.bottomPadding / 2
|
||||
implicitWidth: 120
|
||||
height: control.activeFocus ? 2 : 1
|
||||
color: control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
import QtQuick.Controls.Material.impl 2.0
|
||||
|
||||
T.ToolBar {
|
||||
id: control
|
||||
|
||||
Material.elevation: 4
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
|
||||
|
||||
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
|
||||
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
|
||||
|
||||
Material.foreground: Material.toolTextColor
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Item { }
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 48
|
||||
color: control.Material.primaryColor
|
||||
|
||||
layer.enabled: control.Material.elevation > 0
|
||||
layer.effect: ElevationEffect {
|
||||
elevation: control.Material.elevation
|
||||
fullWidth: true
|
||||
}
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ToolButton {
|
||||
id: control
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
baselineOffset: contentItem.y + contentItem.baselineOffset
|
||||
|
||||
padding: 6
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
text: control.text
|
||||
font: control.font
|
||||
color: control.enabled ? control.Material.primaryTextColor : control.Material.hintTextColor
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitWidth: 48
|
||||
implicitHeight: 48
|
||||
|
||||
color: control.down ? control.Material.buttonPressColor : control.Material.buttonHoverColor
|
||||
visible: control.enabled && (control.down || control.visualFocus || control.checked || control.highlighted)
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.ToolTip {
|
||||
id: control
|
||||
|
||||
x: parent ? (parent.width - implicitWidth) / 2 : 0
|
||||
y: -implicitHeight - 24
|
||||
|
||||
implicitWidth: Math.max(background ? background.implicitWidth : 0,
|
||||
contentItem.implicitWidth + leftPadding + rightPadding)
|
||||
implicitHeight: Math.max(background ? background.implicitHeight : 0,
|
||||
contentItem.implicitHeight + topPadding + bottomPadding)
|
||||
|
||||
margins: 12
|
||||
padding: 8
|
||||
leftPadding: padding + 8
|
||||
rightPadding: padding + 8
|
||||
|
||||
closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
|
||||
|
||||
Material.theme: Material.Dark
|
||||
|
||||
enter: Transition {
|
||||
// toast_enter
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutQuad; duration: 500 }
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
// toast_exit
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.InQuad; duration: 500 }
|
||||
}
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: Text {
|
||||
text: control.text
|
||||
font: control.font
|
||||
// TODO: wrapMode: Label.Wrap
|
||||
color: control.Material.primaryTextColor
|
||||
}
|
||||
//! [contentItem]
|
||||
|
||||
//! [background]
|
||||
background: Rectangle {
|
||||
implicitHeight: 32
|
||||
color: control.Material.tooltipColor
|
||||
opacity: 0.9
|
||||
radius: 2
|
||||
}
|
||||
//! [background]
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL3$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see http://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or later as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.GPL included in
|
||||
** the packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 2.0 requirements will be
|
||||
** met: http://www.gnu.org/licenses/gpl-2.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.6
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Templates 2.0 as T
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
T.Tumbler {
|
||||
id: control
|
||||
implicitWidth: 60
|
||||
implicitHeight: 200
|
||||
|
||||
//! [delegate]
|
||||
delegate: Text {
|
||||
id: label
|
||||
text: modelData
|
||||
color: control.Material.primaryTextColor
|
||||
font: control.font
|
||||
opacity: (1.0 - Math.abs(Tumbler.displacement) / (visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
//! [delegate]
|
||||
|
||||
//! [contentItem]
|
||||
contentItem: PathView {
|
||||
id: pathView
|
||||
model: control.model
|
||||
delegate: control.delegate
|
||||
clip: true
|
||||
pathItemCount: control.visibleItemCount + 1
|
||||
preferredHighlightBegin: 0.5
|
||||
preferredHighlightEnd: 0.5
|
||||
dragMargin: width / 2
|
||||
|
||||
path: Path {
|
||||
startX: pathView.width / 2
|
||||
startY: -pathView.delegateHeight / 2
|
||||
PathLine {
|
||||
x: pathView.width / 2
|
||||
y: pathView.pathItemCount * pathView.delegateHeight - pathView.delegateHeight / 2
|
||||
}
|
||||
}
|
||||
|
||||
property real delegateHeight: control.availableHeight / control.visibleItemCount
|
||||
}
|
||||
//! [contentItem]
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by:
|
||||
// 'qmlplugindump -nonrelocatable QtQuick.Controls.Material 2.0'
|
||||
|
||||
Module {
|
||||
dependencies: []
|
||||
Component {
|
||||
name: "QQuickMaterialStyle"
|
||||
prototype: "QQuickStyle"
|
||||
exports: ["QtQuick.Controls.Material/Material 2.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Theme"
|
||||
values: {
|
||||
"Light": 0,
|
||||
"Dark": 1
|
||||
}
|
||||
}
|
||||
Enum {
|
||||
name: "Color"
|
||||
values: {
|
||||
"Red": 0,
|
||||
"Pink": 1,
|
||||
"Purple": 2,
|
||||
"DeepPurple": 3,
|
||||
"Indigo": 4,
|
||||
"Blue": 5,
|
||||
"LightBlue": 6,
|
||||
"Cyan": 7,
|
||||
"Teal": 8,
|
||||
"Green": 9,
|
||||
"LightGreen": 10,
|
||||
"Lime": 11,
|
||||
"Yellow": 12,
|
||||
"Amber": 13,
|
||||
"Orange": 14,
|
||||
"DeepOrange": 15,
|
||||
"Brown": 16,
|
||||
"Grey": 17,
|
||||
"BlueGrey": 18
|
||||
}
|
||||
}
|
||||
Enum {
|
||||
name: "Shade"
|
||||
values: {
|
||||
"Shade50": 0,
|
||||
"Shade100": 1,
|
||||
"Shade200": 2,
|
||||
"Shade300": 3,
|
||||
"Shade400": 4,
|
||||
"Shade500": 5,
|
||||
"Shade600": 6,
|
||||
"Shade700": 7,
|
||||
"Shade800": 8,
|
||||
"Shade900": 9,
|
||||
"ShadeA100": 10,
|
||||
"ShadeA200": 11,
|
||||
"ShadeA400": 12,
|
||||
"ShadeA700": 13
|
||||
}
|
||||
}
|
||||
Property { name: "theme"; type: "Theme" }
|
||||
Property { name: "primary"; type: "QVariant" }
|
||||
Property { name: "accent"; type: "QVariant" }
|
||||
Property { name: "foreground"; type: "QVariant" }
|
||||
Property { name: "background"; type: "QVariant" }
|
||||
Signal { name: "paletteChanged" }
|
||||
Method {
|
||||
name: "color"
|
||||
type: "QColor"
|
||||
Parameter { name: "color"; type: "Color" }
|
||||
Parameter { name: "shade"; type: "Shade" }
|
||||
}
|
||||
Method {
|
||||
name: "color"
|
||||
type: "QColor"
|
||||
Parameter { name: "color"; type: "Color" }
|
||||
}
|
||||
Method {
|
||||
name: "shade"
|
||||
type: "QColor"
|
||||
Parameter { name: "color"; type: "QColor" }
|
||||
Parameter { name: "shade"; type: "Shade" }
|
||||
}
|
||||
}
|
||||
Component { name: "QQuickStyle"; prototype: "QObject" }
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
module QtQuick.Controls.Material
|
||||
plugin qtquickcontrols2materialstyleplugin
|
||||
classname QtQuickControls2MaterialStylePlugin
|
||||
depends QtQuick.Controls 2.0
|
||||
depends QtGraphicalEffects 1.0
|
||||
Binary file not shown.
@@ -0,0 +1,327 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by:
|
||||
// 'qmlplugindump -nonrelocatable Qt.labs.folderlistmodel 2.1'
|
||||
|
||||
Module {
|
||||
dependencies: []
|
||||
Component {
|
||||
name: "QAbstractItemModel"
|
||||
prototype: "QObject"
|
||||
Enum {
|
||||
name: "LayoutChangeHint"
|
||||
values: {
|
||||
"NoLayoutChangeHint": 0,
|
||||
"VerticalSortHint": 1,
|
||||
"HorizontalSortHint": 2
|
||||
}
|
||||
}
|
||||
Signal {
|
||||
name: "dataChanged"
|
||||
Parameter { name: "topLeft"; type: "QModelIndex" }
|
||||
Parameter { name: "bottomRight"; type: "QModelIndex" }
|
||||
Parameter { name: "roles"; type: "QVector<int>" }
|
||||
}
|
||||
Signal {
|
||||
name: "dataChanged"
|
||||
Parameter { name: "topLeft"; type: "QModelIndex" }
|
||||
Parameter { name: "bottomRight"; type: "QModelIndex" }
|
||||
}
|
||||
Signal {
|
||||
name: "headerDataChanged"
|
||||
Parameter { name: "orientation"; type: "Qt::Orientation" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "layoutChanged"
|
||||
Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
|
||||
Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
|
||||
}
|
||||
Signal {
|
||||
name: "layoutChanged"
|
||||
Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
|
||||
}
|
||||
Signal { name: "layoutChanged" }
|
||||
Signal {
|
||||
name: "layoutAboutToBeChanged"
|
||||
Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
|
||||
Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
|
||||
}
|
||||
Signal {
|
||||
name: "layoutAboutToBeChanged"
|
||||
Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
|
||||
}
|
||||
Signal { name: "layoutAboutToBeChanged" }
|
||||
Signal {
|
||||
name: "rowsAboutToBeInserted"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "rowsInserted"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "rowsAboutToBeRemoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "rowsRemoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsAboutToBeInserted"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsInserted"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsAboutToBeRemoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsRemoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "first"; type: "int" }
|
||||
Parameter { name: "last"; type: "int" }
|
||||
}
|
||||
Signal { name: "modelAboutToBeReset" }
|
||||
Signal { name: "modelReset" }
|
||||
Signal {
|
||||
name: "rowsAboutToBeMoved"
|
||||
Parameter { name: "sourceParent"; type: "QModelIndex" }
|
||||
Parameter { name: "sourceStart"; type: "int" }
|
||||
Parameter { name: "sourceEnd"; type: "int" }
|
||||
Parameter { name: "destinationParent"; type: "QModelIndex" }
|
||||
Parameter { name: "destinationRow"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "rowsMoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "start"; type: "int" }
|
||||
Parameter { name: "end"; type: "int" }
|
||||
Parameter { name: "destination"; type: "QModelIndex" }
|
||||
Parameter { name: "row"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsAboutToBeMoved"
|
||||
Parameter { name: "sourceParent"; type: "QModelIndex" }
|
||||
Parameter { name: "sourceStart"; type: "int" }
|
||||
Parameter { name: "sourceEnd"; type: "int" }
|
||||
Parameter { name: "destinationParent"; type: "QModelIndex" }
|
||||
Parameter { name: "destinationColumn"; type: "int" }
|
||||
}
|
||||
Signal {
|
||||
name: "columnsMoved"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
Parameter { name: "start"; type: "int" }
|
||||
Parameter { name: "end"; type: "int" }
|
||||
Parameter { name: "destination"; type: "QModelIndex" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
}
|
||||
Method { name: "submit"; type: "bool" }
|
||||
Method { name: "revert" }
|
||||
Method {
|
||||
name: "hasIndex"
|
||||
type: "bool"
|
||||
Parameter { name: "row"; type: "int" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "hasIndex"
|
||||
type: "bool"
|
||||
Parameter { name: "row"; type: "int" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "index"
|
||||
type: "QModelIndex"
|
||||
Parameter { name: "row"; type: "int" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "index"
|
||||
type: "QModelIndex"
|
||||
Parameter { name: "row"; type: "int" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "parent"
|
||||
type: "QModelIndex"
|
||||
Parameter { name: "child"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "sibling"
|
||||
type: "QModelIndex"
|
||||
Parameter { name: "row"; type: "int" }
|
||||
Parameter { name: "column"; type: "int" }
|
||||
Parameter { name: "idx"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "rowCount"
|
||||
type: "int"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method { name: "rowCount"; type: "int" }
|
||||
Method {
|
||||
name: "columnCount"
|
||||
type: "int"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method { name: "columnCount"; type: "int" }
|
||||
Method {
|
||||
name: "hasChildren"
|
||||
type: "bool"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method { name: "hasChildren"; type: "bool" }
|
||||
Method {
|
||||
name: "data"
|
||||
type: "QVariant"
|
||||
Parameter { name: "index"; type: "QModelIndex" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "data"
|
||||
type: "QVariant"
|
||||
Parameter { name: "index"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "setData"
|
||||
type: "bool"
|
||||
Parameter { name: "index"; type: "QModelIndex" }
|
||||
Parameter { name: "value"; type: "QVariant" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "setData"
|
||||
type: "bool"
|
||||
Parameter { name: "index"; type: "QModelIndex" }
|
||||
Parameter { name: "value"; type: "QVariant" }
|
||||
}
|
||||
Method {
|
||||
name: "headerData"
|
||||
type: "QVariant"
|
||||
Parameter { name: "section"; type: "int" }
|
||||
Parameter { name: "orientation"; type: "Qt::Orientation" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "headerData"
|
||||
type: "QVariant"
|
||||
Parameter { name: "section"; type: "int" }
|
||||
Parameter { name: "orientation"; type: "Qt::Orientation" }
|
||||
}
|
||||
Method {
|
||||
name: "fetchMore"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "canFetchMore"
|
||||
type: "bool"
|
||||
Parameter { name: "parent"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "flags"
|
||||
type: "Qt::ItemFlags"
|
||||
Parameter { name: "index"; type: "QModelIndex" }
|
||||
}
|
||||
Method {
|
||||
name: "match"
|
||||
type: "QModelIndexList"
|
||||
Parameter { name: "start"; type: "QModelIndex" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
Parameter { name: "value"; type: "QVariant" }
|
||||
Parameter { name: "hits"; type: "int" }
|
||||
Parameter { name: "flags"; type: "Qt::MatchFlags" }
|
||||
}
|
||||
Method {
|
||||
name: "match"
|
||||
type: "QModelIndexList"
|
||||
Parameter { name: "start"; type: "QModelIndex" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
Parameter { name: "value"; type: "QVariant" }
|
||||
Parameter { name: "hits"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "match"
|
||||
type: "QModelIndexList"
|
||||
Parameter { name: "start"; type: "QModelIndex" }
|
||||
Parameter { name: "role"; type: "int" }
|
||||
Parameter { name: "value"; type: "QVariant" }
|
||||
}
|
||||
}
|
||||
Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" }
|
||||
Component {
|
||||
name: "QQuickFolderListModel"
|
||||
prototype: "QAbstractListModel"
|
||||
exports: [
|
||||
"Qt.labs.folderlistmodel/FolderListModel 1.0",
|
||||
"Qt.labs.folderlistmodel/FolderListModel 2.0",
|
||||
"Qt.labs.folderlistmodel/FolderListModel 2.1"
|
||||
]
|
||||
exportMetaObjectRevisions: [0, 0, 1]
|
||||
Enum {
|
||||
name: "SortField"
|
||||
values: {
|
||||
"Unsorted": 0,
|
||||
"Name": 1,
|
||||
"Time": 2,
|
||||
"Size": 3,
|
||||
"Type": 4
|
||||
}
|
||||
}
|
||||
Property { name: "folder"; type: "QUrl" }
|
||||
Property { name: "rootFolder"; type: "QUrl" }
|
||||
Property { name: "parentFolder"; type: "QUrl"; isReadonly: true }
|
||||
Property { name: "nameFilters"; type: "QStringList" }
|
||||
Property { name: "sortField"; type: "SortField" }
|
||||
Property { name: "sortReversed"; type: "bool" }
|
||||
Property { name: "showFiles"; revision: 1; type: "bool" }
|
||||
Property { name: "showDirs"; type: "bool" }
|
||||
Property { name: "showDirsFirst"; type: "bool" }
|
||||
Property { name: "showDotAndDotDot"; type: "bool" }
|
||||
Property { name: "showHidden"; revision: 1; type: "bool" }
|
||||
Property { name: "showOnlyReadable"; type: "bool" }
|
||||
Property { name: "count"; type: "int"; isReadonly: true }
|
||||
Signal { name: "rowCountChanged" }
|
||||
Signal { name: "countChanged"; revision: 1 }
|
||||
Method {
|
||||
name: "isFolder"
|
||||
type: "bool"
|
||||
Parameter { name: "index"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "get"
|
||||
type: "QVariant"
|
||||
Parameter { name: "idx"; type: "int" }
|
||||
Parameter { name: "property"; type: "string" }
|
||||
}
|
||||
Method {
|
||||
name: "indexOf"
|
||||
type: "int"
|
||||
Parameter { name: "file"; type: "QUrl" }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
module Qt.labs.folderlistmodel
|
||||
plugin qmlfolderlistmodelplugin
|
||||
classname QmlFolderListModelPlugin
|
||||
typeinfo plugins.qmltypes
|
||||
Binary file not shown.
@@ -0,0 +1,18 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by:
|
||||
// 'qmlplugindump -nonrelocatable Qt.labs.settings 1.0'
|
||||
|
||||
Module {
|
||||
dependencies: []
|
||||
Component {
|
||||
name: "QQmlSettings"
|
||||
prototype: "QObject"
|
||||
exports: ["Qt.labs.settings/Settings 1.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property { name: "category"; type: "string" }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
module Qt.labs.settings
|
||||
plugin qmlsettingsplugin
|
||||
classname QmlSettingsPlugin
|
||||
typeinfo plugins.qmltypes
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,478 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype Blend
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-blend
|
||||
\brief Merges two source items by using a blend mode.
|
||||
|
||||
Blend mode can be selected with the \l{Blend::mode}{mode} property.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li source
|
||||
\li foregroundSource
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image Original_butterfly.png
|
||||
\li \image Blend_bug_and_butterfly.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet Blend-example.qml example
|
||||
|
||||
*/
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be the base when
|
||||
\l{Blend::foregroundSource}{foregroundSource} is blended over it.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be blended over the
|
||||
\l{Blend::source}{source}.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting foregroundSource to the effect's parent.
|
||||
*/
|
||||
property variant foregroundSource
|
||||
|
||||
/*!
|
||||
This property defines the mode which is used when foregroundSource is
|
||||
blended over source. Values are case insensitive.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li mode
|
||||
\li description
|
||||
\row
|
||||
\li normal
|
||||
\li The pixel component values from foregroundSource are written
|
||||
over source by using alpha blending.
|
||||
\row
|
||||
\li addition
|
||||
\li The pixel component values from source and foregroundSource are
|
||||
added together and written.
|
||||
\row
|
||||
\li average
|
||||
\li The pixel component values from source and foregroundSource are
|
||||
averaged and written.
|
||||
\row
|
||||
\li color
|
||||
\li The lightness value from source is combined with hue and
|
||||
saturation from foregroundSource and written.
|
||||
\row
|
||||
\li colorBurn
|
||||
\li The darker pixels from source are darkened more, if both source
|
||||
and foregroundSource pixels are light the result is light.
|
||||
\row
|
||||
\li colorDodge
|
||||
\li The lighter pixels from source are lightened more, if both
|
||||
source and foregroundSource pixels are dark the result is dark.
|
||||
\row
|
||||
\li darken
|
||||
\li The darker pixel component value from source and
|
||||
foregroundSource is written.
|
||||
\row
|
||||
\li darkerColor
|
||||
\li The lower luminance pixel rgb-value from source and
|
||||
foregroundSource is written.
|
||||
\row
|
||||
\li difference
|
||||
\li The absolute pixel component value difference between source and
|
||||
foregroundSource is written.
|
||||
\row
|
||||
\li divide
|
||||
\li The pixel component values from source is divided by the value
|
||||
from foregroundSource and written.
|
||||
\row
|
||||
\li exclusion
|
||||
\li The pixel component value difference with reduced contrast
|
||||
between source and foregroundSource is written.
|
||||
\row
|
||||
\li hardLight
|
||||
\li The pixel component values from source are lightened or darkened
|
||||
according to foregroundSource values and written.
|
||||
\row
|
||||
\li hue
|
||||
\li The hue value from foregroundSource is combined with saturation
|
||||
and lightness from source and written.
|
||||
\row
|
||||
\li lighten
|
||||
\li The lightest pixel component value from source and
|
||||
foregroundSource is written.
|
||||
\row
|
||||
\li lighterColor
|
||||
\li The higher luminance pixel rgb-value from source and
|
||||
foregroundSource is written.
|
||||
\row
|
||||
\li lightness
|
||||
\li The lightness value from foregroundSource is combined with hue
|
||||
and saturation from source and written.
|
||||
\row
|
||||
\li multiply
|
||||
\li The pixel component values from source and foregroundSource are
|
||||
multiplied together and written.
|
||||
\row
|
||||
\li negation
|
||||
\li The inverted absolute pixel component value difference between
|
||||
source and foregroundSource is written.
|
||||
\row
|
||||
\li saturation
|
||||
\li The saturation value from foregroundSource is combined with hue
|
||||
and lightness from source and written.
|
||||
\row
|
||||
\li screen
|
||||
\li The pixel values from source and foregroundSource are negated,
|
||||
then multiplied, negated again, and written.
|
||||
\row
|
||||
\li subtract
|
||||
\li Pixel value from foregroundSource is subracted from source and
|
||||
written.
|
||||
\row
|
||||
\li softLight
|
||||
\li The pixel component values from source are lightened or darkened
|
||||
slightly according to foregroundSource values and written.
|
||||
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Example source
|
||||
\li Example foregroundSource
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image Original_butterfly.png
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different mode values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Blend_mode1.png
|
||||
\li \image Blend_mode2.png
|
||||
\li \image Blend_mode3.png
|
||||
\row
|
||||
\li \b { mode: normal }
|
||||
\li \b { mode: addition }
|
||||
\li \b { mode: average }
|
||||
\row
|
||||
\li \image Blend_mode4.png
|
||||
\li \image Blend_mode5.png
|
||||
\li \image Blend_mode6.png
|
||||
\row
|
||||
\li \b { mode: color }
|
||||
\li \b { mode: colorBurn }
|
||||
\li \b { mode: colorDodge }
|
||||
\row
|
||||
\li \image Blend_mode7.png
|
||||
\li \image Blend_mode8.png
|
||||
\li \image Blend_mode9.png
|
||||
\row
|
||||
\li \b { mode: darken }
|
||||
\li \b { mode: darkerColor }
|
||||
\li \b { mode: difference }
|
||||
\row
|
||||
\li \image Blend_mode10.png
|
||||
\li \image Blend_mode11.png
|
||||
\li \image Blend_mode12.png
|
||||
\row
|
||||
\li \b { mode: divide }
|
||||
\li \b { mode: exclusion }
|
||||
\li \b { mode: hardlight }
|
||||
\row
|
||||
\li \image Blend_mode13.png
|
||||
\li \image Blend_mode14.png
|
||||
\li \image Blend_mode15.png
|
||||
\row
|
||||
\li \b { mode: hue }
|
||||
\li \b { mode: lighten }
|
||||
\li \b { mode: lighterColor }
|
||||
\row
|
||||
\li \image Blend_mode16.png
|
||||
\li \image Blend_mode17.png
|
||||
\li \image Blend_mode18.png
|
||||
\row
|
||||
\li \b { mode: lightness }
|
||||
\li \b { mode: negation }
|
||||
\li \b { mode: multiply }
|
||||
\row
|
||||
\li \image Blend_mode19.png
|
||||
\li \image Blend_mode20.png
|
||||
\li \image Blend_mode21.png
|
||||
\row
|
||||
\li \b { mode: saturation }
|
||||
\li \b { mode: screen }
|
||||
\li \b { mode: subtract }
|
||||
\row
|
||||
\li \image Blend_mode22.png
|
||||
\row
|
||||
\li \b { mode: softLight }
|
||||
\endtable
|
||||
*/
|
||||
property string mode: "normal"
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in the
|
||||
cache must be updated. Memory consumption is increased, because an extra
|
||||
buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: backgroundSourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: foregroundSourceProxy
|
||||
input: rootItem.foregroundSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant backgroundSource: backgroundSourceProxy.output
|
||||
property variant foregroundSource: foregroundSourceProxy.output
|
||||
property string mode: rootItem.mode
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: fragmentShaderBegin + blendModeNormal + fragmentShaderEnd
|
||||
|
||||
function buildFragmentShader() {
|
||||
var shader = fragmentShaderBegin
|
||||
|
||||
switch (mode.toLowerCase()) {
|
||||
case "addition" : shader += blendModeAddition; break;
|
||||
case "average" : shader += blendModeAverage; break;
|
||||
case "color" : shader += blendModeColor; break;
|
||||
case "colorburn" : shader += blendModeColorBurn; break;
|
||||
case "colordodge" : shader += blendModeColorDodge; break;
|
||||
case "darken" : shader += blendModeDarken; break;
|
||||
case "darkercolor" : shader += blendModeDarkerColor; break;
|
||||
case "difference" : shader += blendModeDifference; break;
|
||||
case "divide" : shader += blendModeDivide; break;
|
||||
case "exclusion" : shader += blendModeExclusion; break;
|
||||
case "hardlight" : shader += blendModeHardLight; break;
|
||||
case "hue" : shader += blendModeHue; break;
|
||||
case "lighten" : shader += blendModeLighten; break;
|
||||
case "lightercolor" : shader += blendModeLighterColor; break;
|
||||
case "lightness" : shader += blendModeLightness; break;
|
||||
case "negation" : shader += blendModeNegation; break;
|
||||
case "normal" : shader += blendModeNormal; break;
|
||||
case "multiply" : shader += blendModeMultiply; break;
|
||||
case "saturation" : shader += blendModeSaturation; break;
|
||||
case "screen" : shader += blendModeScreen; break;
|
||||
case "subtract" : shader += blendModeSubtract; break;
|
||||
case "softlight" : shader += blendModeSoftLight; break;
|
||||
default: shader += "gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"; break;
|
||||
}
|
||||
|
||||
shader += fragmentShaderEnd
|
||||
fragmentShader = shader
|
||||
|
||||
// Workaraound for a bug just to make sure display gets updated when the mode changes.
|
||||
backgroundSourceChanged()
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
buildFragmentShader()
|
||||
}
|
||||
|
||||
onModeChanged: {
|
||||
buildFragmentShader()
|
||||
}
|
||||
|
||||
property string blendModeAddition: "result.rgb = min(rgb1 + rgb2, 1.0);"
|
||||
property string blendModeAverage: "result.rgb = 0.5 * (rgb1 + rgb2);"
|
||||
property string blendModeColor: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb2).xy, RGBtoL(rgb1)));"
|
||||
property string blendModeColorBurn: "result.rgb = clamp(1.0 - ((1.0 - rgb1) / max(vec3(1.0 / 256.0), rgb2)), vec3(0.0), vec3(1.0));"
|
||||
property string blendModeColorDodge: "result.rgb = clamp(rgb1 / max(vec3(1.0 / 256.0), (1.0 - rgb2)), vec3(0.0), vec3(1.0));"
|
||||
property string blendModeDarken: "result.rgb = min(rgb1, rgb2);"
|
||||
property string blendModeDarkerColor: "result.rgb = 0.3 * rgb1.r + 0.59 * rgb1.g + 0.11 * rgb1.b > 0.3 * rgb2.r + 0.59 * rgb2.g + 0.11 * rgb2.b ? rgb2 : rgb1;"
|
||||
property string blendModeDifference: "result.rgb = abs(rgb1 - rgb2);"
|
||||
property string blendModeDivide: "result.rgb = clamp(rgb1 / rgb2, 0.0, 1.0);"
|
||||
property string blendModeExclusion: "result.rgb = rgb1 + rgb2 - 2.0 * rgb1 * rgb2;"
|
||||
property string blendModeHardLight: "result.rgb = vec3(channelBlendHardLight(rgb1.r, rgb2.r), channelBlendHardLight(rgb1.g, rgb2.g), channelBlendHardLight(rgb1.b, rgb2.b));"
|
||||
property string blendModeHue: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb2).x, RGBtoHSL(rgb1).yz));"
|
||||
property string blendModeLighten: "result.rgb = max(rgb1, rgb2);"
|
||||
property string blendModeLighterColor: "result.rgb = 0.3 * rgb1.r + 0.59 * rgb1.g + 0.11 * rgb1.b > 0.3 * rgb2.r + 0.59 * rgb2.g + 0.11 * rgb2.b ? rgb1 : rgb2;"
|
||||
property string blendModeLightness: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb1).xy, RGBtoL(rgb2)));"
|
||||
property string blendModeMultiply: "result.rgb = rgb1 * rgb2;"
|
||||
property string blendModeNegation: "result.rgb = 1.0 - abs(1.0 - rgb1 - rgb2);"
|
||||
property string blendModeNormal: "result.rgb = rgb2; a = max(color1.a, color2.a);"
|
||||
property string blendModeSaturation: "lowp vec3 hsl1 = RGBtoHSL(rgb1); result.rgb = HSLtoRGB(vec3(hsl1.x, RGBtoHSL(rgb2).y, hsl1.z));"
|
||||
property string blendModeScreen: "result.rgb = 1.0 - (vec3(1.0) - rgb1) * (vec3(1.0) - rgb2);"
|
||||
property string blendModeSubtract: "result.rgb = max(rgb1 - rgb2, vec3(0.0));"
|
||||
property string blendModeSoftLight: "result.rgb = rgb1 * ((1.0 - rgb1) * rgb2 + (1.0 - (1.0 - rgb1) * (1.0 - rgb2)));"
|
||||
|
||||
property string fragmentShaderBegin: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D backgroundSource;
|
||||
uniform lowp sampler2D foregroundSource;
|
||||
|
||||
highp float RGBtoL(highp vec3 color) {
|
||||
highp float cmin = min(color.r, min(color.g, color.b));
|
||||
highp float cmax = max(color.r, max(color.g, color.b));
|
||||
highp float l = (cmin + cmax) / 2.0;
|
||||
return l;
|
||||
}
|
||||
|
||||
highp vec3 RGBtoHSL(highp vec3 color) {
|
||||
highp float cmin = min(color.r, min(color.g, color.b));
|
||||
highp float cmax = max(color.r, max(color.g, color.b));
|
||||
highp float h = 0.0;
|
||||
highp float s = 0.0;
|
||||
highp float l = (cmin + cmax) / 2.0;
|
||||
highp float diff = cmax - cmin;
|
||||
|
||||
if (diff > 1.0 / 256.0) {
|
||||
if (l < 0.5)
|
||||
s = diff / (cmin + cmax);
|
||||
else
|
||||
s = diff / (2.0 - (cmin + cmax));
|
||||
|
||||
if (color.r == cmax)
|
||||
h = (color.g - color.b) / diff;
|
||||
else if (color.g == cmax)
|
||||
h = 2.0 + (color.b - color.r) / diff;
|
||||
else
|
||||
h = 4.0 + (color.r - color.g) / diff;
|
||||
|
||||
h /= 6.0;
|
||||
}
|
||||
return vec3(h, s, l);
|
||||
}
|
||||
|
||||
highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
|
||||
h = fract(h);
|
||||
if (h < 1.0 / 6.0)
|
||||
return v1 + (v2 - v1) * 6.0 * h;
|
||||
else if (h < 1.0 / 2.0)
|
||||
return v2;
|
||||
else if (h < 2.0 / 3.0)
|
||||
return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
|
||||
|
||||
return v1;
|
||||
}
|
||||
|
||||
highp vec3 HSLtoRGB(highp vec3 color) {
|
||||
highp float h = color.x;
|
||||
highp float l = color.z;
|
||||
highp float s = color.y;
|
||||
|
||||
if (s < 1.0 / 256.0)
|
||||
return vec3(l, l, l);
|
||||
|
||||
highp float v1;
|
||||
highp float v2;
|
||||
if (l < 0.5)
|
||||
v2 = l * (1.0 + s);
|
||||
else
|
||||
v2 = (l + s) - (s * l);
|
||||
|
||||
v1 = 2.0 * l - v2;
|
||||
|
||||
highp float d = 1.0 / 3.0;
|
||||
highp float r = hueToIntensity(v1, v2, h + d);
|
||||
highp float g = hueToIntensity(v1, v2, h);
|
||||
highp float b = hueToIntensity(v1, v2, h - d);
|
||||
return vec3(r, g, b);
|
||||
}
|
||||
|
||||
lowp float channelBlendHardLight(lowp float c1, lowp float c2) {
|
||||
return c2 > 0.5 ? (1.0 - (1.0 - 2.0 * (c2 - 0.5)) * (1.0 - c1)) : (2.0 * c1 * c2);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 result = vec4(0.0);
|
||||
lowp vec4 color1 = texture2D(backgroundSource, qt_TexCoord0);
|
||||
lowp vec4 color2 = texture2D(foregroundSource, qt_TexCoord0);
|
||||
lowp vec3 rgb1 = color1.rgb / max(1.0/256.0, color1.a);
|
||||
lowp vec3 rgb2 = color2.rgb / max(1.0/256.0, color2.a);
|
||||
highp float a = max(color1.a, color1.a * color2.a);
|
||||
"
|
||||
|
||||
property string fragmentShaderEnd: "
|
||||
gl_FragColor.rgb = mix(rgb1, result.rgb, color2.a);
|
||||
gl_FragColor.rbg *= a;
|
||||
gl_FragColor.a = a;
|
||||
gl_FragColor *= qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype BrightnessContrast
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Adjusts brightness and contrast.
|
||||
|
||||
This effect adjusts the source item colors.
|
||||
Brightness adjustment changes the perceived luminance of the source item.
|
||||
Contrast adjustment increases or decreases the color
|
||||
and brightness variations.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image BrightnessContrast_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet BrightnessContrast-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels
|
||||
for the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines how much the source brightness is increased or
|
||||
decreased.
|
||||
|
||||
The value ranges from -1.0 to 1.0. By default, the property is set to \c
|
||||
0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different brightness values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image BrightnessContrast_brightness1.png
|
||||
\li \image BrightnessContrast_brightness2.png
|
||||
\li \image BrightnessContrast_brightness3.png
|
||||
\row
|
||||
\li \b { brightness: -0.25 }
|
||||
\li \b { brightness: 0 }
|
||||
\li \b { brightness: 0.5 }
|
||||
\row
|
||||
\li \l contrast: 0
|
||||
\li \l contrast: 0
|
||||
\li \l contrast: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real brightness: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how much the source contrast is increased or
|
||||
decreased. The decrease of the contrast is linear, but the increase is
|
||||
applied with a non-linear curve to allow very high contrast adjustment at
|
||||
the high end of the value range.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Contrast adjustment curve
|
||||
\row
|
||||
\li \image BrightnessContrast_contrast_graph.png
|
||||
\endtable
|
||||
|
||||
The value ranges from -1.0 to 1.0. By default, the property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different contrast values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image BrightnessContrast_contrast1.png
|
||||
\li \image BrightnessContrast_contrast2.png
|
||||
\li \image BrightnessContrast_contrast3.png
|
||||
\row
|
||||
\li \b { contrast: -0.5 }
|
||||
\li \b { contrast: 0 }
|
||||
\li \b { contrast: 0.5 }
|
||||
\row
|
||||
\li \l brightness: 0
|
||||
\li \l brightness: 0
|
||||
\li \l brightness: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real contrast: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real brightness: rootItem.brightness
|
||||
property real contrast: rootItem.contrast
|
||||
|
||||
anchors.fill: parent
|
||||
blending: !rootItem.cached
|
||||
|
||||
fragmentShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float brightness;
|
||||
uniform highp float contrast;
|
||||
void main() {
|
||||
highp vec4 pixelColor = texture2D(source, qt_TexCoord0);
|
||||
pixelColor.rgb /= max(1.0/256.0, pixelColor.a);
|
||||
highp float c = 1.0 + contrast;
|
||||
highp float contrastGainFactor = 1.0 + c * c * c * c * step(0.0, contrast);
|
||||
pixelColor.rgb = ((pixelColor.rgb - 0.5) * (contrastGainFactor * contrast + 1.0)) + 0.5;
|
||||
pixelColor.rgb = mix(pixelColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
|
||||
gl_FragColor = vec4(pixelColor.rgb * pixelColor.a, pixelColor.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype ColorOverlay
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Alters the colors of the source item by applying an overlay color.
|
||||
|
||||
The effect is similar to what happens when a colorized glass is put on top
|
||||
of a grayscale image. The color for the overlay is given in the RGBA format.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_butterfly.png
|
||||
\li \image ColorOverlay_butterfly.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet ColorOverlay-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels
|
||||
for the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the RGBA color value which is used to colorize the
|
||||
source.
|
||||
|
||||
By default, the property is set to \c "transparent".
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different color values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ColorOverlay_color1.png
|
||||
\li \image ColorOverlay_color2.png
|
||||
\li \image ColorOverlay_color3.png
|
||||
\row
|
||||
\li \b { color: #80ff0000 }
|
||||
\li \b { color: #8000ff00 }
|
||||
\li \b { color: #800000ff }
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property color color: "transparent"
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property color color: rootItem.color
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp vec4 color;
|
||||
void main() {
|
||||
highp vec4 pixelColor = texture2D(source, qt_TexCoord0);
|
||||
gl_FragColor = vec4(mix(pixelColor.rgb/max(pixelColor.a, 0.00390625), color.rgb/max(color.a, 0.00390625), color.a) * pixelColor.a, pixelColor.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,294 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype Colorize
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Sets the color in the HSL color space.
|
||||
|
||||
The effect is similar to what happens when a colorized glass is put on top
|
||||
of a grayscale image. Colorize uses the hue, saturation, and lightness (HSL)
|
||||
color space. You can specify a desired value for each property. You can
|
||||
shift all HSL values with the
|
||||
\l{QtGraphicalEffects::HueSaturation}{HueSaturation} effect.
|
||||
|
||||
Alternatively, you can use the
|
||||
\l{QtGraphicalEffects::ColorOverlay}{ColorOverlay} effect to colorize the
|
||||
source item in the RGBA color space.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image Colorize_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet Colorize-example.qml example
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels
|
||||
for the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the hue value which is used to colorize the
|
||||
source.
|
||||
|
||||
The value ranges from 0.0 to 1.0. By default, the property is set to \c
|
||||
0.0, which produces a slightly red color.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Allowed hue values
|
||||
\row
|
||||
\li \image Colorize_hue_scale.png
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different hue values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Colorize_hue1.png
|
||||
\li \image Colorize_hue2.png
|
||||
\li \image Colorize_hue3.png
|
||||
\row
|
||||
\li \b { hue: 0.2 }
|
||||
\li \b { hue: 0.5 }
|
||||
\li \b { hue: 0.8 }
|
||||
\row
|
||||
\li \l saturation: 1
|
||||
\li \l saturation: 1
|
||||
\li \l saturation: 1
|
||||
\row
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\endtable
|
||||
*/
|
||||
property real hue: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the saturation value which is used to colorize the
|
||||
source.
|
||||
|
||||
The value ranges from 0.0 (desaturated) to 1.0 (saturated). By default,
|
||||
the property is set to \c 1.0 (saturated).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different saturation values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Colorize_saturation1.png
|
||||
\li \image Colorize_saturation2.png
|
||||
\li \image Colorize_saturation3.png
|
||||
\row
|
||||
\li \b { saturation: 0 }
|
||||
\li \b { saturation: 0.5 }
|
||||
\li \b { saturation: 1 }
|
||||
\row
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\row
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\endtable
|
||||
*/
|
||||
property real saturation: 1.0
|
||||
|
||||
/*!
|
||||
This property defines how much the source lightness value is increased
|
||||
or decreased.
|
||||
|
||||
Unlike hue and saturation properties, lightness does not set the used
|
||||
value, but it shifts the existing source pixel lightness value.
|
||||
|
||||
The value ranges from -1.0 (decreased) to 1.0 (increased). By default,
|
||||
the property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different lightness values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Colorize_lightness1.png
|
||||
\li \image Colorize_lightness2.png
|
||||
\li \image Colorize_lightness3.png
|
||||
\row
|
||||
\li \b { lightness: -0.75 }
|
||||
\li \b { lightness: 0 }
|
||||
\li \b { lightness: 0.75 }
|
||||
\row
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\row
|
||||
\li \l saturation: 1
|
||||
\li \l saturation: 1
|
||||
\li \l saturation: 1
|
||||
\endtable
|
||||
*/
|
||||
property real lightness: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real hue: rootItem.hue
|
||||
property real saturation: rootItem.saturation
|
||||
property real lightness: rootItem.lightness
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float hue;
|
||||
uniform highp float saturation;
|
||||
uniform highp float lightness;
|
||||
|
||||
highp float RGBtoL(highp vec3 color) {
|
||||
highp float cmin = min(color.r, min(color.g, color.b));
|
||||
highp float cmax = max(color.r, max(color.g, color.b));
|
||||
highp float l = (cmin + cmax) / 2.0;
|
||||
return l;
|
||||
}
|
||||
|
||||
highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
|
||||
h = fract(h);
|
||||
if (h < 1.0 / 6.0)
|
||||
return v1 + (v2 - v1) * 6.0 * h;
|
||||
else if (h < 1.0 / 2.0)
|
||||
return v2;
|
||||
else if (h < 2.0 / 3.0)
|
||||
return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
|
||||
|
||||
return v1;
|
||||
}
|
||||
|
||||
highp vec3 HSLtoRGB(highp vec3 color) {
|
||||
highp float h = color.x;
|
||||
highp float l = color.z;
|
||||
highp float s = color.y;
|
||||
|
||||
if (s < 1.0 / 256.0)
|
||||
return vec3(l, l, l);
|
||||
|
||||
highp float v1;
|
||||
highp float v2;
|
||||
if (l < 0.5)
|
||||
v2 = l * (1.0 + s);
|
||||
else
|
||||
v2 = (l + s) - (s * l);
|
||||
|
||||
v1 = 2.0 * l - v2;
|
||||
|
||||
highp float d = 1.0 / 3.0;
|
||||
highp float r = hueToIntensity(v1, v2, h + d);
|
||||
highp float g = hueToIntensity(v1, v2, h);
|
||||
highp float b = hueToIntensity(v1, v2, h - d);
|
||||
return vec3(r, g, b);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 sample = texture2D(source, qt_TexCoord0);
|
||||
sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
|
||||
highp float light = RGBtoL(sample.rgb);
|
||||
highp float c = step(0.0, lightness);
|
||||
sample.rgb = HSLtoRGB(vec3(hue, saturation, mix(light, c, abs(lightness))));
|
||||
gl_FragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,361 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype ConicalGradient
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-gradient
|
||||
\brief Draws a conical gradient.
|
||||
|
||||
A gradient is defined by two or more colors, which are blended seamlessly.
|
||||
The colors start from the specified angle and end at 360 degrees larger
|
||||
angle value.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image ConicalGradient.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet ConicalGradient-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
/*!
|
||||
This property defines the starting angle where the color at the gradient
|
||||
position of 0.0 is rendered. Colors at larger position values are
|
||||
rendered into larger angle values and blended seamlessly. Angle values
|
||||
increase clockwise.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different angle values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ConicalGradient_angle1.png
|
||||
\li \image ConicalGradient_angle2.png
|
||||
\li \image ConicalGradient_angle3.png
|
||||
\row
|
||||
\li \b { angle: 0 }
|
||||
\li \b { angle: 45 }
|
||||
\li \b { angle: 185 }
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real angle: 0.0
|
||||
|
||||
/*!
|
||||
\qmlproperty real QtGraphicalEffects::ConicalGradient::horizontalOffset
|
||||
\qmlproperty real QtGraphicalEffects::ConicalGradient::verticalOffset
|
||||
|
||||
The horizontalOffset and verticalOffset properties define the offset in
|
||||
pixels for the center point of the gradient compared to the item center.
|
||||
|
||||
The value ranges from -inf to inf. By default, the properties are set to \c
|
||||
0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ConicalGradient_horizontalOffset1.png
|
||||
\li \image ConicalGradient_horizontalOffset2.png
|
||||
\li \image ConicalGradient_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: -50 }
|
||||
\li \b { horizontalOffset: 0 }
|
||||
\li \b { horizontalOffset: 50 }
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
*/
|
||||
property real horizontalOffset: 0.0
|
||||
property real verticalOffset: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be filled with gradient.
|
||||
Source item gets rendered into an intermediate pixel buffer and the
|
||||
alpha values from the result are used to determine the gradient's pixels
|
||||
visibility in the display. The default value for source is undefined and
|
||||
in that case whole effect area is filled with gradient.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different source values
|
||||
\li
|
||||
\row
|
||||
\li \image ConicalGradient_maskSource1.png
|
||||
\li \image ConicalGradient_maskSource2.png
|
||||
\row
|
||||
\li \b { source: undefined }
|
||||
\li \b { source: }
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
A gradient is defined by two or more colors, which are blended seamlessly.
|
||||
The colors are specified as a set of GradientStop child items, each of which
|
||||
defines a position on the gradient (from 0.0 to 1.0), and a color.
|
||||
The position of each GradientStop is defined by the position property.
|
||||
The color is defined by the color property.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different gradient values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ConicalGradient_gradient1.png
|
||||
\li \image ConicalGradient_gradient2.png
|
||||
\li \image ConicalGradient_gradient3.png
|
||||
\row
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.167
|
||||
color: Qt.rgba(1, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.333
|
||||
color: Qt.rgba(0, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.500
|
||||
color: Qt.rgba(0, 1, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.667
|
||||
color: Qt.rgba(0, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.833
|
||||
color: Qt.rgba(1, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.5
|
||||
color: "#000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#00000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#FF000000"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property Gradient gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "white" }
|
||||
GradientStop { position: 1.0; color: "black" }
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: gradientRect
|
||||
width: 16
|
||||
height: 256
|
||||
gradient: rootItem.gradient
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
rotation: shaderItem.rotation
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant gradientSource: ShaderEffectSource {
|
||||
sourceItem: gradientRect
|
||||
smooth: true
|
||||
hideSource: true
|
||||
visible: false
|
||||
}
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
property real startAngle: (rootItem.angle - 90) * Math.PI/180
|
||||
property variant center: Qt.point(0.5 + horizontalOffset / width, 0.5 + verticalOffset / height)
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: maskSource == undefined ? noMaskShader : maskShader
|
||||
|
||||
onFragmentShaderChanged: startAngleChanged()
|
||||
|
||||
property string noMaskShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform lowp sampler2D gradientSource;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform highp float startAngle;
|
||||
uniform highp vec2 center;
|
||||
|
||||
void main() {
|
||||
const highp float PI = 3.14159265;
|
||||
const highp float PIx2inv = 0.1591549;
|
||||
highp float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
|
||||
gl_FragColor = texture2D(gradientSource, vec2(0.0, fract(a))) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
property string maskShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform lowp sampler2D gradientSource;
|
||||
uniform lowp sampler2D maskSource;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform highp float startAngle;
|
||||
uniform highp vec2 center;
|
||||
|
||||
void main() {
|
||||
lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
|
||||
const highp float PI = 3.14159265;
|
||||
const highp float PIx2inv = 0.1591549;
|
||||
highp float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
|
||||
gl_FragColor = texture2D(gradientSource, vec2(0.0, fract(a))) * maskAlpha * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype Desaturate
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Reduces the saturation of the colors.
|
||||
|
||||
Desaturated pixel values are calculated as averages of the original RGB
|
||||
component values of the source item.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image Desaturate_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet Desaturate-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels to
|
||||
the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines how much the source colors are desaturated.
|
||||
|
||||
The value ranges from 0.0 (no change) to 1.0 (desaturated). By default,
|
||||
the property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different desaturation values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Desaturate_desaturation1.png
|
||||
\li \image Desaturate_desaturation2.png
|
||||
\li \image Desaturate_desaturation3.png
|
||||
\row
|
||||
\li \b { desaturation: 0.0 }
|
||||
\li \b { desaturation: 0.5 }
|
||||
\li \b { desaturation: 1.0 }
|
||||
\endtable
|
||||
*/
|
||||
property real desaturation: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real desaturation: rootItem.desaturation
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float desaturation;
|
||||
void main(void) {
|
||||
lowp vec4 textureColor = texture2D(source, qt_TexCoord0.st);
|
||||
lowp float grayColor = (textureColor.r + textureColor.g + textureColor.b) / 3.0;
|
||||
gl_FragColor = mix(textureColor, vec4(vec3(grayColor), textureColor.a), desaturation) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype DirectionalBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-motion-blur
|
||||
\brief Applies blur effect to the specified direction.
|
||||
|
||||
Effect creates perceived impression that the source item appears to be
|
||||
moving in the direction of the blur. Blur is applied to both sides of
|
||||
each pixel, therefore setting the direction to 0 and 180 provides the
|
||||
same result.
|
||||
|
||||
Other available motionblur effects are \l{QtGraphicalEffects::ZoomBlur}{ZoomBlur} and
|
||||
\l{QtGraphicalEffects::RadialBlur}{RadialBlur}.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image DirectionalBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet DirectionalBlur-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the percieved amount of movement for each pixel.
|
||||
The movement is divided evenly to both sides of each pixel.
|
||||
|
||||
The quality of the blur depends on \l{DirectionalBlur::samples}{samples}
|
||||
property. If length value is large, more samples are needed to keep the
|
||||
visual quality at high level.
|
||||
|
||||
The value ranges from 0.0 to inf.
|
||||
By default the property is set to \c 0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different length values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DirectionalBlur_length1.png
|
||||
\li \image DirectionalBlur_length2.png
|
||||
\li \image DirectionalBlur_length3.png
|
||||
\row
|
||||
\li \b { length: 0.0 }
|
||||
\li \b { length: 32.0 }
|
||||
\li \b { length: 48.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real length: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when blur
|
||||
calculation is done. Larger value produces better quality, but is slower
|
||||
to render.
|
||||
|
||||
This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
|
||||
Allowed values are between 0 and inf (practical maximum depends on GPU).
|
||||
By default the property is set to \c 0 (no samples).
|
||||
|
||||
*/
|
||||
property int samples: 0
|
||||
|
||||
/*!
|
||||
This property defines the direction for the blur. Blur is applied to
|
||||
both sides of each pixel, therefore setting the direction to 0 and 180
|
||||
produces the same result.
|
||||
|
||||
The value ranges from -180.0 to 180.0.
|
||||
By default the property is set to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different angle values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DirectionalBlur_angle1.png
|
||||
\li \image DirectionalBlur_angle2.png
|
||||
\li \image DirectionalBlur_angle3.png
|
||||
\row
|
||||
\li \b { angle: 0.0 }
|
||||
\li \b { angle: 45.0 }
|
||||
\li \b { angle: 90.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l length: 32
|
||||
\li \l length: 32
|
||||
\li \l length: 32
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real angle: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real len: rootItem.length
|
||||
property bool transparentBorder: rootItem.transparentBorder
|
||||
property real samples: rootItem.samples
|
||||
property real weight: 1.0 / Math.max(1.0, rootItem.samples)
|
||||
property variant expandPixels: transparentBorder ? Qt.size(rootItem.samples, rootItem.samples) : Qt.size(0,0)
|
||||
property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
|
||||
property variant delta: Qt.size(1.0 / rootItem.width * Math.cos((rootItem.angle + 90) * Math.PI/180), 1.0 / rootItem.height * Math.sin((rootItem.angle + 90) * Math.PI/180))
|
||||
|
||||
x: transparentBorder ? -expandPixels.width - 1: 0
|
||||
y: transparentBorder ? -expandPixels.height - 1 : 0
|
||||
width: transparentBorder ? parent.width + 2.0 * expandPixels.width + 2 : parent.width
|
||||
height: transparentBorder ? parent.height + 2.0 * expandPixels.height + 2 : parent.height
|
||||
|
||||
property string fragmentShaderSkeleton: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float len;
|
||||
uniform highp float samples;
|
||||
uniform highp float weight;
|
||||
uniform highp vec2 expand;
|
||||
uniform highp vec2 delta;
|
||||
|
||||
void main(void) {
|
||||
highp vec2 shift = delta * len / max(1.0, samples - 1.0);
|
||||
mediump vec2 texCoord = qt_TexCoord0;
|
||||
gl_FragColor = vec4(0.0);
|
||||
|
||||
PLACEHOLDER_EXPAND_STEPS
|
||||
|
||||
texCoord -= shift * max(0.0, samples - 1.0) * 0.5;
|
||||
|
||||
PLACEHOLDER_UNROLLED_LOOP
|
||||
|
||||
gl_FragColor *= weight * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
function buildFragmentShader() {
|
||||
var shader = fragmentShaderSkeleton
|
||||
var expandSteps = ""
|
||||
|
||||
if (transparentBorder) {
|
||||
expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
|
||||
}
|
||||
|
||||
var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
|
||||
|
||||
if (rootItem.samples > 1) {
|
||||
unrolledLoop = ""
|
||||
for (var i = 0; i < rootItem.samples; i++)
|
||||
unrolledLoop += "gl_FragColor += texture2D(source, texCoord); texCoord += shift;\n"
|
||||
}
|
||||
|
||||
shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
|
||||
fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
|
||||
}
|
||||
|
||||
onFragmentShaderChanged: sourceChanged()
|
||||
onSamplesChanged: buildFragmentShader()
|
||||
onTransparentBorderChanged: buildFragmentShader()
|
||||
Component.onCompleted: buildFragmentShader()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype Displace
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-distortion
|
||||
\brief Moves the pixels of the source item according to the given
|
||||
displacement map.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li DisplacementSource
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image Displace_map.png
|
||||
\li \image Displace_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet Displace-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item for the pixels that are going to
|
||||
be displaced according to the data from
|
||||
\l{Displace::displacementSource}{displacementSource}.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be used as the
|
||||
displacement map. The displacementSource item gets rendered into the
|
||||
intermediate pixel buffer. The red and green component values from the
|
||||
result determine the displacement of the pixels from the source item.
|
||||
|
||||
The format for the displacement map is similar to the tangent space
|
||||
normal maps, which can be created with most 3D-modeling tools. Many
|
||||
image processing tools include the support for generating normal maps.
|
||||
Alternatively, the displacement map for this effect can also be a QML
|
||||
element which is colored appropriately. Like any QML element, it can be
|
||||
animated. It is recommended that the size of the diplacement map matches
|
||||
the size of the \l{Displace::source}{source}.
|
||||
|
||||
The displace data is interpreted in the RGBA format. For every pixel:
|
||||
the red channel stores the x-axis displacement, and the green channel
|
||||
stores the y-axis displacement. Blue and alpha channels are ignored for
|
||||
this effect.
|
||||
|
||||
Assuming that red channel value 1.0 is fully red (0.0 having no red at
|
||||
all), this effect considers pixel component value 0.5 to cause no
|
||||
displacement at all. Values above 0.5 shift pixels to the left, values
|
||||
below 0.5 do the shift to the right. In a similar way, green channel
|
||||
values above 0.5 displace the pixels upwards, and values below 0.5 shift
|
||||
the pixels downwards. The actual amount of displacement in pixels
|
||||
depends on the \l displacement property.
|
||||
|
||||
*/
|
||||
property variant displacementSource
|
||||
|
||||
/*!
|
||||
This property defines the scale for the displacement. The bigger scale,
|
||||
the bigger the displacement of the pixels. The value set to 0.0 causes
|
||||
no displacement.
|
||||
|
||||
The value ranges from -1.0 (inverted maximum shift, according to
|
||||
displacementSource) to 1.0 (maximum shift, according to
|
||||
displacementSource). By default, the property is set to \c 0.0 (no
|
||||
displacement).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different displacement values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Displace_displacement1.png
|
||||
\li \image Displace_displacement2.png
|
||||
\li \image Displace_displacement3.png
|
||||
\row
|
||||
\li \b { displacement: -0.2 }
|
||||
\li \b { displacement: 0.0 }
|
||||
\li \b { displacement: 0.2 }
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real displacement: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: displacementSourceProxy
|
||||
input: rootItem.displacementSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant displacementSource: displacementSourceProxy.output
|
||||
property real displacement: rootItem.displacement
|
||||
property real xPixel: 1.0/width
|
||||
property real yPixel: 1.0/height
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp sampler2D displacementSource;
|
||||
uniform highp float displacement;
|
||||
uniform highp float xPixel;
|
||||
uniform highp float yPixel;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 offset = texture2D(displacementSource, qt_TexCoord0);
|
||||
offset.xy -= vec2(0.5, 0.5);
|
||||
offset.xy = offset.xy * step(vec2(1.0/256.0), abs(offset.xy));
|
||||
highp vec2 tx = qt_TexCoord0 + (vec2(-offset.x, offset.y) * displacement);
|
||||
|
||||
lowp float e1 = linearstep(0.0, xPixel, tx.x);
|
||||
lowp float e2 = linearstep(0.0, yPixel, tx.y);
|
||||
lowp float e3 = 1.0 - linearstep(1.0, 1.0 + xPixel, tx.x);
|
||||
lowp float e4 = 1.0 - linearstep(1.0, 1.0 + yPixel, tx.y);
|
||||
|
||||
lowp vec4 sample = texture2D(source, tx);
|
||||
sample.rgb *= e1 * e2 * e3 * e4;
|
||||
gl_FragColor = sample * qt_Opacity * offset.a;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,361 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Copyright (C) 2015 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype DropShadow
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-drop-shadow
|
||||
|
||||
\brief Generates a soft shadow behind the source item.
|
||||
|
||||
The DropShadow effect blurs the alpha channel of the input, colorizes the
|
||||
result and places it behind the source object to create a soft shadow. The
|
||||
shadow's color can be changed using the \l {DropShadow::color}{color}
|
||||
property. The location of the shadow can be changed with the \l
|
||||
horizontalOffset and \l verticalOffset properties.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_butterfly.png
|
||||
\li \image DropShadow_butterfly.png
|
||||
\endtable
|
||||
|
||||
The soft shadow is created by blurring the image live using a gaussian
|
||||
blur. Performing blur live is a costly operation. Fullscreen gaussian blur
|
||||
with even a moderate number of samples will only run at 60 fps on highend
|
||||
graphics hardware.
|
||||
|
||||
When the source is static, the \l cached property can be set to allocate
|
||||
another buffer to avoid performing the blur every time it is drawn.
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet DropShadow-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: root
|
||||
|
||||
DropShadowBase {
|
||||
id: dbs
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be used as the
|
||||
source for the generated shadow.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property alias source: dbs.source
|
||||
|
||||
/*!
|
||||
\qmlproperty int DropShadow::radius
|
||||
|
||||
Radius defines the softness of the shadow. A larger radius causes the
|
||||
edges of the shadow to appear more blurry.
|
||||
|
||||
The ideal blur is acheived by selecting \c samples and \c radius such
|
||||
that \c {samples = 1 + radius * 2}, such as:
|
||||
|
||||
\table
|
||||
\header \li Radius \li Samples
|
||||
\row \li 0 \e{(no blur)} \li 1
|
||||
\row \li 1 \li 3
|
||||
\row \li 2 \li 5
|
||||
\row \li 3 \li 7
|
||||
\endtable
|
||||
|
||||
By default, the property is set to \c {floor(samples/2)}.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DropShadow_radius1.png
|
||||
\li \image DropShadow_radius2.png
|
||||
\li \image DropShadow_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 6 }
|
||||
\li \b { radius: 12 }
|
||||
\row
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
*/
|
||||
property alias radius: dbs.radius;
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when edge
|
||||
softening blur calculation is done. Larger value produces better
|
||||
quality, but is slower to render.
|
||||
|
||||
Ideally, this value should be twice as large as the highest required
|
||||
radius value plus one, such as:
|
||||
|
||||
\table
|
||||
\header \li Radius \li Samples
|
||||
\row \li 0 \e{(no blur)} \li 1
|
||||
\row \li 1 \li 3
|
||||
\row \li 2 \li 5
|
||||
\row \li 3 \li 7
|
||||
\endtable
|
||||
|
||||
By default, the property is set to \c 9.
|
||||
|
||||
This property is not intended to be animated. Changing this property will
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
*/
|
||||
property alias samples: dbs.samples
|
||||
|
||||
/*!
|
||||
This property defines the RGBA color value which is used for the shadow.
|
||||
|
||||
By default, the property is set to \c "black".
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different color values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DropShadow_color1.png
|
||||
\li \image DropShadow_color2.png
|
||||
\li \image DropShadow_color3.png
|
||||
\row
|
||||
\li \b { color: #000000 }
|
||||
\li \b { color: #0000ff }
|
||||
\li \b { color: #aa000000 }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
*/
|
||||
property alias color: dbs.color
|
||||
|
||||
/*!
|
||||
\qmlproperty real QtGraphicalEffects::DropShadow::horizontalOffset
|
||||
\qmlproperty real QtGraphicalEffects::DropShadow::verticalOffset
|
||||
|
||||
HorizontalOffset and verticalOffset properties define the offset for the
|
||||
rendered shadow compared to the DropShadow item position. Often, the
|
||||
DropShadow item is anchored so that it fills the source element. In this
|
||||
case, if the HorizontalOffset and verticalOffset properties are set to
|
||||
0, the shadow is rendered exactly under the source item. By changing the
|
||||
offset properties, the shadow can be positioned relatively to the source
|
||||
item.
|
||||
|
||||
The values range from -inf to inf. By default, the properties are set to
|
||||
\c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DropShadow_horizontalOffset1.png
|
||||
\li \image DropShadow_horizontalOffset2.png
|
||||
\li \image DropShadow_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: -20 }
|
||||
\li \b { horizontalOffset: 0 }
|
||||
\li \b { horizontalOffset: 20 }
|
||||
\row
|
||||
\li \l radius: 4
|
||||
\li \l radius: 4
|
||||
\li \l radius: 4
|
||||
\row
|
||||
\li \l samples: 9
|
||||
\li \l samples: 9
|
||||
\li \l samples: 9
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
*/
|
||||
property alias horizontalOffset: dbs.horizontalOffset
|
||||
property alias verticalOffset: dbs.verticalOffset
|
||||
|
||||
/*!
|
||||
This property defines how large part of the shadow color is strenghtened
|
||||
near the source edges.
|
||||
|
||||
The value ranges from 0.0 to 1.0. By default, the property is set to \c
|
||||
0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different spread values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image DropShadow_spread1.png
|
||||
\li \image DropShadow_spread2.png
|
||||
\li \image DropShadow_spread3.png
|
||||
\row
|
||||
\li \b { spread: 0.0 }
|
||||
\li \b { spread: 0.5 }
|
||||
\li \b { spread: 1.0 }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\li \l verticalOffset: 20
|
||||
\endtable
|
||||
*/
|
||||
property alias spread: dbs.spread
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Starting Qt 5.6, this property has no effect. It is left here
|
||||
for source compatibility only.
|
||||
|
||||
### Qt 6: remove
|
||||
*/
|
||||
property bool fast: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance. Every time the source or effect
|
||||
properties are changed, the pixels in the cache must be updated. Memory
|
||||
consumption is increased, because an extra buffer of memory is required
|
||||
for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property alias cached: dbs.cached
|
||||
|
||||
/*!
|
||||
This property determines whether or not the effect has a transparent
|
||||
border.
|
||||
|
||||
When set to \c true, the exterior of the item is padded with a 1 pixel
|
||||
wide transparent edge, making sampling outside the source texture use
|
||||
transparency instead of the edge pixels. Without this property, an
|
||||
image which has opaque edges will not get a blurred shadow.
|
||||
|
||||
In the image below, the Rectangle on the left has transparent borders
|
||||
and has blurred edges, whereas the Rectangle on the right does not:
|
||||
|
||||
By default, this property is set to \c true.
|
||||
|
||||
\snippet DropShadow-transparentBorder-example.qml example
|
||||
|
||||
\image DropShadow-transparentBorder.png
|
||||
*/
|
||||
property alias transparentBorder: dbs.transparentBorder
|
||||
}
|
||||
@@ -0,0 +1,496 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype FastBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-blur
|
||||
\brief Applies a fast blur effect to one or more source items.
|
||||
|
||||
FastBlur offers lower blur quality than
|
||||
\l{QtGraphicalEffects::GaussianBlur}{GaussianBlur}, but it is faster to
|
||||
render. The FastBlur effect softens the source content by blurring it with
|
||||
algorithm which uses the source content downscaling and bilinear filtering.
|
||||
Use this effect in situations where the source content is rapidly changing
|
||||
and the highest possible blur quality is not
|
||||
needed.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image FastBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet FastBlur-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the distance of the neighboring pixels which affect
|
||||
the blurring of an individual pixel. A larger radius increases the blur
|
||||
effect. FastBlur algorithm may internally reduce the accuracy of the radius in order to
|
||||
provide good rendering performance.
|
||||
|
||||
The value ranges from 0.0 (no blur) to inf. Visual quality of the blur is reduced when
|
||||
radius exceeds value 64. By default, the property is set to \c 0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different blur values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image FastBlur_radius1.png
|
||||
\li \image FastBlur_radius2.png
|
||||
\li \image FastBlur_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 32 }
|
||||
\li \b { radius: 64 }
|
||||
\endtable
|
||||
*/
|
||||
property real radius: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different transparentBorder values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image FastBlur_transparentBorder1.png
|
||||
\li \image FastBlur_transparentBorder2.png
|
||||
\row
|
||||
\li \b { transparentBorder: false }
|
||||
\li \b { transparentBorder: true }
|
||||
\row
|
||||
\li \l radius: 64
|
||||
\li \l radius: 64
|
||||
\endtable
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
smooth: rootItem.radius > 0
|
||||
}
|
||||
|
||||
/*! \internal */
|
||||
property string __internalBlurVertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp float yStep;
|
||||
uniform highp float xStep;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
|
||||
qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
|
||||
qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
|
||||
qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
/*! \internal */
|
||||
property string __internalBlurFragmentShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
highp vec4 sourceColor = (texture2D(source, qt_TexCoord0) +
|
||||
texture2D(source, qt_TexCoord1) +
|
||||
texture2D(source, qt_TexCoord2) +
|
||||
texture2D(source, qt_TexCoord3)) * 0.25;
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
ShaderEffect {
|
||||
id: level0
|
||||
property variant source: sourceProxy.output
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level1
|
||||
width: Math.ceil(shaderItem.width / 32) * 32
|
||||
height: Math.ceil(shaderItem.height / 32) * 32
|
||||
sourceItem: level0
|
||||
hideSource: rootItem.visible
|
||||
sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
|
||||
visible: false
|
||||
smooth: rootItem.radius > 0
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect1
|
||||
property variant source: level1
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level2
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level2
|
||||
width: level1.width / 2
|
||||
height: level1.height / 2
|
||||
sourceItem: effect1
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect2
|
||||
property variant source: level2
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level3
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level3
|
||||
width: level2.width / 2
|
||||
height: level2.height / 2
|
||||
sourceItem: effect2
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect3
|
||||
property variant source: level3
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level4
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level4
|
||||
width: level3.width / 2
|
||||
height: level3.height / 2
|
||||
sourceItem: effect3
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect4
|
||||
property variant source: level4
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level5
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level5
|
||||
width: level4.width / 2
|
||||
height: level4.height / 2
|
||||
sourceItem: effect4
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect5
|
||||
property variant source: level5
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level6
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level6
|
||||
width: level5.width / 2
|
||||
height: level5.height / 2
|
||||
sourceItem: effect5
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
Item {
|
||||
id: dummysource
|
||||
width: 1
|
||||
height: 1
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: dummy
|
||||
width: 1
|
||||
height: 1
|
||||
sourceItem: dummysource
|
||||
visible: false
|
||||
smooth: false
|
||||
live: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
|
||||
property variant source1: level1
|
||||
property variant source2: level2
|
||||
property variant source3: level3
|
||||
property variant source4: level4
|
||||
property variant source5: level5
|
||||
property variant source6: level6
|
||||
property real lod: Math.sqrt(rootItem.radius / 64.0) * 1.2 - 0.2
|
||||
property real weight1
|
||||
property real weight2
|
||||
property real weight3
|
||||
property real weight4
|
||||
property real weight5
|
||||
property real weight6
|
||||
|
||||
x: transparentBorder ? -64 : 0
|
||||
y: transparentBorder ? -64 : 0
|
||||
width: transparentBorder ? parent.width + 128 : parent.width
|
||||
height: transparentBorder ? parent.height + 128 : parent.height
|
||||
|
||||
function weight(v) {
|
||||
if (v <= 0.0)
|
||||
return 1.0
|
||||
if (v >= 0.5)
|
||||
return 0.0
|
||||
|
||||
return 1.0 - v * 2.0
|
||||
}
|
||||
|
||||
function calculateWeights() {
|
||||
|
||||
var w1 = weight(Math.abs(lod - 0.100))
|
||||
var w2 = weight(Math.abs(lod - 0.300))
|
||||
var w3 = weight(Math.abs(lod - 0.500))
|
||||
var w4 = weight(Math.abs(lod - 0.700))
|
||||
var w5 = weight(Math.abs(lod - 0.900))
|
||||
var w6 = weight(Math.abs(lod - 1.100))
|
||||
|
||||
var sum = w1 + w2 + w3 + w4 + w5 + w6;
|
||||
weight1 = w1 / sum;
|
||||
weight2 = w2 / sum;
|
||||
weight3 = w3 / sum;
|
||||
weight4 = w4 / sum;
|
||||
weight5 = w5 / sum;
|
||||
weight6 = w6 / sum;
|
||||
|
||||
upateSources()
|
||||
}
|
||||
|
||||
function upateSources() {
|
||||
var sources = new Array();
|
||||
var weights = new Array();
|
||||
|
||||
if (weight1 > 0) {
|
||||
sources.push(level1)
|
||||
weights.push(weight1)
|
||||
}
|
||||
|
||||
if (weight2 > 0) {
|
||||
sources.push(level2)
|
||||
weights.push(weight2)
|
||||
}
|
||||
|
||||
if (weight3 > 0) {
|
||||
sources.push(level3)
|
||||
weights.push(weight3)
|
||||
}
|
||||
|
||||
if (weight4 > 0) {
|
||||
sources.push(level4)
|
||||
weights.push(weight4)
|
||||
}
|
||||
|
||||
if (weight5 > 0) {
|
||||
sources.push(level5)
|
||||
weights.push(weight5)
|
||||
}
|
||||
|
||||
if (weight6 > 0) {
|
||||
sources.push(level6)
|
||||
weights.push(weight6)
|
||||
}
|
||||
|
||||
for (var j = sources.length; j < 6; j++) {
|
||||
sources.push(dummy)
|
||||
weights.push(0.0)
|
||||
}
|
||||
|
||||
source1 = sources[0]
|
||||
source2 = sources[1]
|
||||
source3 = sources[2]
|
||||
source4 = sources[3]
|
||||
source5 = sources[4]
|
||||
source6 = sources[5]
|
||||
|
||||
weight1 = weights[0]
|
||||
weight2 = weights[1]
|
||||
weight3 = weights[2]
|
||||
weight4 = weights[3]
|
||||
weight5 = weights[4]
|
||||
weight6 = weights[5]
|
||||
}
|
||||
|
||||
Component.onCompleted: calculateWeights()
|
||||
|
||||
onLodChanged: calculateWeights()
|
||||
|
||||
fragmentShader: "
|
||||
uniform lowp sampler2D source1;
|
||||
uniform lowp sampler2D source2;
|
||||
uniform lowp sampler2D source3;
|
||||
uniform lowp sampler2D source4;
|
||||
uniform lowp sampler2D source5;
|
||||
uniform mediump float weight1;
|
||||
uniform mediump float weight2;
|
||||
uniform mediump float weight3;
|
||||
uniform mediump float weight4;
|
||||
uniform mediump float weight5;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
|
||||
void main() {
|
||||
lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
|
||||
sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
|
||||
sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
|
||||
sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
|
||||
sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype GammaAdjust
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Alters the luminance of the source item.
|
||||
|
||||
GammaAdjust is applied to each pixel according to the curve which is
|
||||
pre-defined as a power-law expression, where the property gamma is used as the
|
||||
reciprocal scaling exponent. Refer to the property documentation of \l{GammaAdjust::gamma}{gamma}
|
||||
for more details.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image GammaAdjust_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet GammaAdjust-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item for which the luminance is going to be
|
||||
adjusted.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the change factor for how the luminance of each pixel
|
||||
is altered according to the equation:
|
||||
|
||||
\code
|
||||
luminance = pow(original_luminance, 1.0 / gamma); // The luminance is assumed to be between 0.0 and 1.0
|
||||
\endcode
|
||||
|
||||
Setting the gamma values under 1.0 makes the image darker, the values
|
||||
above 1.0 lighten it.
|
||||
|
||||
The value ranges from 0.0 (darkest) to inf (lightest). By default, the
|
||||
property is set to \c 1.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different gamma values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image GammaAdjust_gamma1.png
|
||||
\li \image GammaAdjust_gamma2.png
|
||||
\li \image GammaAdjust_gamma3.png
|
||||
\row
|
||||
\li \b { gamma: 0.5 }
|
||||
\li \b { gamma: 1.0 }
|
||||
\li \b { gamma: 2.0 }
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image GammaAdjust_gamma1_graph.png
|
||||
\li \image GammaAdjust_gamma2_graph.png
|
||||
\li \image GammaAdjust_gamma3_graph.png
|
||||
\row
|
||||
\li Red curve: default gamma (1.0)
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Yellow curve: effect applied
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: pixel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real gamma: 1.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real gamma: 1.0 / Math.max(rootItem.gamma, 0.0001)
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float gamma;
|
||||
void main(void) {
|
||||
highp vec4 originalColor = texture2D(source, qt_TexCoord0.st);
|
||||
originalColor.rgb = originalColor.rgb / max(1.0/256.0, originalColor.a);
|
||||
highp vec3 adjustedColor = pow(originalColor.rgb, vec3(gamma));
|
||||
gl_FragColor = vec4(adjustedColor * originalColor.a, originalColor.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,371 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Copyright (C) 2015 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Window 2.1
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype GaussianBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-blur
|
||||
\brief Applies a higher quality blur effect.
|
||||
|
||||
GaussianBlur effect softens the image by blurring it with an algorithm that
|
||||
uses the Gaussian function to calculate the effect. The effect produces
|
||||
higher quality than \l{QtGraphicalEffects::FastBlur}{FastBlur}, but is
|
||||
slower to render.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image GaussianBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet GaussianBlur-example.qml example
|
||||
|
||||
Performing blur live is a costly operation. Fullscreen gaussian blur
|
||||
with even a moderate number of samples will only run at 60 fps on highend
|
||||
graphics hardware.
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: root
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the distance of the neighboring pixels which
|
||||
affect the blurring of an individual pixel. A larger radius increases
|
||||
the blur effect.
|
||||
|
||||
The ideal blur is acheived by selecting \c samples and \c radius such
|
||||
that \c {samples = 1 + radius * 2}, such as:
|
||||
|
||||
\table
|
||||
\header \li Radius \li Samples
|
||||
\row \li 0 \e{(no blur)} \li 1
|
||||
\row \li 1 \li 3
|
||||
\row \li 2 \li 5
|
||||
\row \li 3 \li 7
|
||||
\endtable
|
||||
|
||||
The value ranges from 0.0 (no blur) to inf. By default, the property is
|
||||
set to \c floor(samples / 2.0).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image GaussianBlur_radius1.png
|
||||
\li \image GaussianBlur_radius2.png
|
||||
\li \image GaussianBlur_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 4 }
|
||||
\li \b { radius: 8 }
|
||||
\row
|
||||
\li \l samples: 16
|
||||
\li \l samples: 16
|
||||
\li \l samples: 16
|
||||
\row
|
||||
\li \l deviation: 3
|
||||
\li \l deviation: 3
|
||||
\li \l deviation: 3
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real radius: Math.floor(samples / 2);
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when blur
|
||||
calculation is done. Larger value produces better quality, but is slower
|
||||
to render.
|
||||
|
||||
Ideally, this value should be twice as large as the highest required
|
||||
radius value plus 1, for example, if the radius is animated between 0.0
|
||||
and 4.0, samples should be set to 9.
|
||||
|
||||
By default, the property is set to \c 9.
|
||||
|
||||
\note This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
|
||||
*/
|
||||
property int samples: 9
|
||||
|
||||
/*!
|
||||
This property is a parameter to the gaussian function that is used when
|
||||
calculating neighboring pixel weights for the blurring. A larger
|
||||
deviation causes image to appear more blurry, but it also reduces the
|
||||
quality of the blur. A very large deviation value causes the effect to
|
||||
look a bit similar to what, for exmple, a box blur algorithm produces. A
|
||||
too small deviation values makes the effect insignificant for the pixels
|
||||
near the radius.
|
||||
|
||||
\inlineimage GaussianBlur_deviation_graph.png
|
||||
\caption The image above shows the Gaussian function with two different
|
||||
deviation values, yellow (1) and cyan (2.7). The y-axis shows the
|
||||
weights, the x-axis shows the pixel distance.
|
||||
|
||||
The value ranges from 0.0 (no deviation) to inf (maximum deviation). By
|
||||
default, devaition is binded to radius. When radius increases, deviation
|
||||
is automatically increased linearly. With the radius value of 8, the
|
||||
deviation default value becomes approximately 2.7034. This value
|
||||
produces a compromise between the blur quality and overall blurriness.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different deviation values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image GaussianBlur_deviation1.png
|
||||
\li \image GaussianBlur_deviation2.png
|
||||
\li \image GaussianBlur_deviation3.png
|
||||
\row
|
||||
\li \b { deviation: 1 }
|
||||
\li \b { deviation: 2 }
|
||||
\li \b { deviation: 4 }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 16
|
||||
\li \l samples: 16
|
||||
\li \l samples: 16
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real deviation: (radius + 1) / 3.3333
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different transparentBorder values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image GaussianBlur_transparentBorder1.png
|
||||
\li \image GaussianBlur_transparentBorder2.png
|
||||
\row
|
||||
\li \b { transparentBorder: false }
|
||||
\li \b { transparentBorder: true }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 16
|
||||
\li \l samples: 16
|
||||
\row
|
||||
\li \l deviation: 2.7
|
||||
\li \l deviation: 2.7
|
||||
\endtable
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
|
||||
// private members...
|
||||
/*! \internal */
|
||||
property int _paddedTexWidth: transparentBorder ? width + 2 * radius: width;
|
||||
/*! \internal */
|
||||
property int _paddedTexHeight: transparentBorder ? height + 2 * radius: height;
|
||||
/*! \internal */
|
||||
property int _kernelRadius: Math.max(0, samples / 2);
|
||||
/*! \internal */
|
||||
property int _kernelSize: _kernelRadius * 2 + 1;
|
||||
/*! \internal */
|
||||
property int _dpr: Screen.devicePixelRatio;
|
||||
/*! \internal */
|
||||
property bool _alphaOnly: false;
|
||||
/*! \internal */
|
||||
property var _maskSource: undefined
|
||||
|
||||
/*! \internal */
|
||||
property alias _output: sourceProxy.output;
|
||||
/*! \internal */
|
||||
property alias _outputRect: sourceProxy.sourceRect;
|
||||
/*! \internal */
|
||||
property alias _color: verticalBlur.color;
|
||||
/*! \internal */
|
||||
property real _thickness: 0;
|
||||
|
||||
onSamplesChanged: _rebuildShaders();
|
||||
on_KernelSizeChanged: _rebuildShaders();
|
||||
onDeviationChanged: _rebuildShaders();
|
||||
on_DprChanged: _rebuildShaders();
|
||||
on_MaskSourceChanged: _rebuildShaders();
|
||||
Component.onCompleted: _rebuildShaders();
|
||||
|
||||
/*! \internal */
|
||||
function _rebuildShaders() {
|
||||
var params = {
|
||||
radius: _kernelRadius,
|
||||
// Limit deviation to something very small avoid getting NaN in the shader.
|
||||
deviation: Math.max(0.00001, deviation),
|
||||
alphaOnly: root._alphaOnly,
|
||||
masked: _maskSource != undefined,
|
||||
fallback: root.radius != _kernelRadius
|
||||
}
|
||||
var shaders = ShaderBuilder.gaussianBlur(params);
|
||||
horizontalBlur.fragmentShader = shaders.fragmentShader;
|
||||
horizontalBlur.vertexShader = shaders.vertexShader;
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
interpolation: SourceProxy.LinearInterpolation
|
||||
input: root.source
|
||||
sourceRect: root.transparentBorder
|
||||
? Qt.rect(-root.radius, 0, root._paddedTexWidth, parent.height)
|
||||
: Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: horizontalBlur
|
||||
width: root.transparentBorder ? root._paddedTexWidth : root.width
|
||||
height: root.height;
|
||||
|
||||
// Used by all shaders
|
||||
property Item source: sourceProxy.output;
|
||||
property real spread: root.radius / root._kernelRadius;
|
||||
property var dirstep: Qt.vector2d(1 / (root._paddedTexWidth * root._dpr), 0);
|
||||
|
||||
// Used by fallback shader (sampleCount exceeds number of varyings)
|
||||
property real deviation: root.deviation
|
||||
|
||||
// Only in use for DropShadow and Glow
|
||||
property color color: "white"
|
||||
property real thickness: Math.max(0, Math.min(0.98, 1 - root._thickness * 0.98));
|
||||
|
||||
// Only in use for MaskedBlur
|
||||
property var mask: root._maskSource;
|
||||
|
||||
layer.enabled: true
|
||||
layer.smooth: true
|
||||
layer.sourceRect: root.transparentBorder
|
||||
? Qt.rect(0, -root.radius, width, root._paddedTexHeight)
|
||||
: Qt.rect(0, 0, 0, 0)
|
||||
visible: false
|
||||
blending: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: verticalBlur
|
||||
x: transparentBorder ? -root.radius : 0
|
||||
y: x;
|
||||
width: root.transparentBorder ? root._paddedTexWidth: root.width
|
||||
height: root.transparentBorder ? root._paddedTexHeight : root.height;
|
||||
fragmentShader: horizontalBlur.fragmentShader
|
||||
vertexShader: horizontalBlur.vertexShader
|
||||
|
||||
property Item source: horizontalBlur
|
||||
property real spread: horizontalBlur.spread
|
||||
property var dirstep: Qt.vector2d(0, 1 / (root._paddedTexHeight * root._dpr));
|
||||
|
||||
property real deviation: horizontalBlur.deviation
|
||||
|
||||
property color color: "black"
|
||||
property real thickness: horizontalBlur.thickness;
|
||||
|
||||
property var mask: horizontalBlur.mask;
|
||||
|
||||
visible: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: verticalBlur
|
||||
visible: root.cached
|
||||
smooth: true
|
||||
sourceItem: verticalBlur
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Copyright (C) 2015 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype Glow
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-glow
|
||||
\brief Generates a halo like glow around the source item.
|
||||
|
||||
The Glow effect blurs the alpha channel of the source and colorizes it
|
||||
with \l {Glow::color}{color} and places it behind the source, resulting in a halo or glow
|
||||
around the object. The quality of the blurred edge can be controlled using
|
||||
\l samples and \l radius and the strenght of the glow can be changed using
|
||||
\l spread.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_butterfly_black.png
|
||||
\li \image Glow_butterfly.png
|
||||
\endtable
|
||||
|
||||
The glow is created by blurring the image live using a gaussian blur.
|
||||
Performing blur live is a costly operation. Fullscreen gaussian blur with
|
||||
even a moderate number of samples will only run at 60 fps on highend
|
||||
graphics hardware.
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet Glow-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: root
|
||||
|
||||
DropShadowBase {
|
||||
id: dps
|
||||
anchors.fill: parent
|
||||
color: "white"
|
||||
spread: 0.5
|
||||
horizontalOffset: 0
|
||||
verticalOffset: 0
|
||||
}
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be used as source
|
||||
for the generated glow.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property alias source: dps.source
|
||||
|
||||
/*!
|
||||
Radius defines the softness of the glow. A larger radius causes the
|
||||
edges of the glow to appear more blurry.
|
||||
|
||||
Depending on the radius value, value of the \l{Glow::samples}{samples}
|
||||
should be set to sufficiently large to ensure the visual quality.
|
||||
|
||||
The ideal blur is acheived by selecting \c samples and \c radius such
|
||||
that \c {samples = 1 + radius * 2}, such as:
|
||||
|
||||
\table
|
||||
\header \li Radius \li Samples
|
||||
\row \li 0 \e{(no blur)} \li 1
|
||||
\row \li 1 \li 3
|
||||
\row \li 2 \li 5
|
||||
\row \li 3 \li 7
|
||||
\endtable
|
||||
|
||||
By default, the property is set to \c {floor(samples/2)}.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Glow_radius1.png
|
||||
\li \image Glow_radius2.png
|
||||
\li \image Glow_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 6 }
|
||||
\li \b { radius: 12 }
|
||||
\row
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\row
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
*/
|
||||
property alias radius: dps.radius
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when edge
|
||||
softening blur calculation is done. Larger value produces better
|
||||
quality, but is slower to render.
|
||||
|
||||
Ideally, this value should be twice as large as the highest required
|
||||
radius value plus one, such as:
|
||||
|
||||
\table
|
||||
\header \li Radius \li Samples
|
||||
\row \li 0 \e{(no blur)} \li 1
|
||||
\row \li 1 \li 3
|
||||
\row \li 2 \li 5
|
||||
\row \li 3 \li 7
|
||||
\endtable
|
||||
|
||||
By default, the property is set to \c 9.
|
||||
|
||||
This property is not intended to be animated. Changing this property will
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
*/
|
||||
property alias samples: dps.samples
|
||||
|
||||
/*!
|
||||
This property defines how large part of the glow color is strenghtened
|
||||
near the source edges.
|
||||
|
||||
The values range from 0.0 to 1.0. By default, the property is set to \c
|
||||
0.5.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different spread values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Glow_spread1.png
|
||||
\li \image Glow_spread2.png
|
||||
\li \image Glow_spread3.png
|
||||
\row
|
||||
\li \b { spread: 0.0 }
|
||||
\li \b { spread: 0.5 }
|
||||
\li \b { spread: 1.0 }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\row
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\endtable
|
||||
*/
|
||||
property alias spread: dps.spread
|
||||
|
||||
/*!
|
||||
This property defines the RGBA color value which is used for the glow.
|
||||
|
||||
By default, the property is set to \c "white".
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different color values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image Glow_color1.png
|
||||
\li \image Glow_color2.png
|
||||
\li \image Glow_color3.png
|
||||
\row
|
||||
\li \b { color: #ffffff }
|
||||
\li \b { color: #00ff00 }
|
||||
\li \b { color: #aa00ff00 }
|
||||
\row
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\li \l radius: 8
|
||||
\row
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\li \l samples: 17
|
||||
\row
|
||||
\li \l spread: 0.5
|
||||
\li \l spread: 0.5
|
||||
\li \l spread: 0.5
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property alias color: dps.color
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Starting Qt 5.6, this property has no effect. It is left here
|
||||
for source compatibility only.
|
||||
|
||||
### Qt 6: remove
|
||||
*/
|
||||
property bool fast: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property alias cached: dps.cached
|
||||
|
||||
/*!
|
||||
This property determines whether or not the effect has a transparent
|
||||
border.
|
||||
|
||||
When set to \c true, the exterior of the item is padded with a
|
||||
transparent edge, making sampling outside the source texture use
|
||||
transparency instead of the edge pixels. Without this property, an
|
||||
image which has opaque edges will not get a blurred edge.
|
||||
|
||||
By default, the property is set to \c true. Set it to false if the source
|
||||
already has a transparent edge to make the blurring a tiny bit faster.
|
||||
|
||||
In the snippet below, the Rectangle on the left has transparent borders
|
||||
and has blurred edges, whereas the Rectangle on the right does not.
|
||||
|
||||
\snippet Glow-transparentBorder-example.qml example
|
||||
|
||||
\image Glow-transparentBorder.png
|
||||
*/
|
||||
property alias transparentBorder: dps.transparentBorder
|
||||
}
|
||||
@@ -0,0 +1,300 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype HueSaturation
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Alters the source item colors in the HSL color space.
|
||||
|
||||
HueSaturation is similar to the \l{QtGraphicalEffects::Colorize}{Colorize}
|
||||
effect, but the hue and saturation property values are handled differently.
|
||||
The HueSaturation effect always shifts the hue, saturation, and lightness
|
||||
from the original, instead of setting them.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image HueSaturation_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet HueSaturation-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels
|
||||
for the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source: 0
|
||||
|
||||
/*!
|
||||
This property defines the hue value which is added to the source hue
|
||||
value.
|
||||
|
||||
The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
|
||||
property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different hue values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image HueSaturation_hue1.png
|
||||
\li \image HueSaturation_hue2.png
|
||||
\li \image HueSaturation_hue3.png
|
||||
\row
|
||||
\li \b { hue: -0.3 }
|
||||
\li \b { hue: 0.0 }
|
||||
\li \b { hue: 0.3 }
|
||||
\row
|
||||
\li \l saturation: 0
|
||||
\li \l saturation: 0
|
||||
\li \l saturation: 0
|
||||
\row
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real hue: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the saturation value value which is added to the
|
||||
source saturation value.
|
||||
|
||||
The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
|
||||
property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different saturation values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image HueSaturation_saturation1.png
|
||||
\li \image HueSaturation_saturation2.png
|
||||
\li \image HueSaturation_saturation3.png
|
||||
\row
|
||||
\li \b { saturation: -0.8 }
|
||||
\li \b { saturation: 0.0 }
|
||||
\li \b { saturation: 1.0 }
|
||||
\row
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\row
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\li \l lightness: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real saturation: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the lightness value which is added to the source
|
||||
saturation value.
|
||||
|
||||
The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
|
||||
property is set to \c 0.0 (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different lightness values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image HueSaturation_lightness1.png
|
||||
\li \image HueSaturation_lightness2.png
|
||||
\li \image HueSaturation_lightness3.png
|
||||
\row
|
||||
\li \b { lightness: -0.5 }
|
||||
\li \b { lightness: 0.0 }
|
||||
\li \b { lightness: 0.5 }
|
||||
\row
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\li \l hue: 0
|
||||
\row
|
||||
\li \l saturation: 0
|
||||
\li \l saturation: 0
|
||||
\li \l saturation: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real lightness: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant hsl: Qt.vector3d(rootItem.hue, rootItem.saturation, rootItem.lightness)
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform highp sampler2D source;
|
||||
uniform highp vec3 hsl;
|
||||
|
||||
highp vec3 RGBtoHSL(highp vec3 color) {
|
||||
highp float cmin = min(color.r, min(color.g, color.b));
|
||||
highp float cmax = max(color.r, max(color.g, color.b));
|
||||
highp float h = 0.0;
|
||||
highp float s = 0.0;
|
||||
highp float l = (cmin + cmax) / 2.0;
|
||||
highp float diff = cmax - cmin;
|
||||
|
||||
if (diff > 1.0 / 256.0) {
|
||||
if (l < 0.5)
|
||||
s = diff / (cmin + cmax);
|
||||
else
|
||||
s = diff / (2.0 - (cmin + cmax));
|
||||
|
||||
if (color.r == cmax)
|
||||
h = (color.g - color.b) / diff;
|
||||
else if (color.g == cmax)
|
||||
h = 2.0 + (color.b - color.r) / diff;
|
||||
else
|
||||
h = 4.0 + (color.r - color.g) / diff;
|
||||
|
||||
h /= 6.0;
|
||||
}
|
||||
return vec3(h, s, l);
|
||||
}
|
||||
|
||||
highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
|
||||
h = fract(h);
|
||||
if (h < 1.0 / 6.0)
|
||||
return v1 + (v2 - v1) * 6.0 * h;
|
||||
else if (h < 1.0 / 2.0)
|
||||
return v2;
|
||||
else if (h < 2.0 / 3.0)
|
||||
return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
|
||||
|
||||
return v1;
|
||||
}
|
||||
|
||||
highp vec3 HSLtoRGB(highp vec3 color) {
|
||||
highp float h = color.x;
|
||||
highp float l = color.z;
|
||||
highp float s = color.y;
|
||||
|
||||
if (s < 1.0 / 256.0)
|
||||
return vec3(l);
|
||||
|
||||
highp float v1;
|
||||
highp float v2;
|
||||
if (l < 0.5)
|
||||
v2 = l * (1.0 + s);
|
||||
else
|
||||
v2 = (l + s) - (s * l);
|
||||
|
||||
v1 = 2.0 * l - v2;
|
||||
|
||||
highp float d = 1.0 / 3.0;
|
||||
highp float r = hueToIntensity(v1, v2, h + d);
|
||||
highp float g = hueToIntensity(v1, v2, h);
|
||||
highp float b = hueToIntensity(v1, v2, h - d);
|
||||
return vec3(r, g, b);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 sample = texture2D(source, qt_TexCoord0);
|
||||
sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
|
||||
sample.rgb = mix(vec3(dot(sample.rgb, vec3(0.2125, 0.7154, 0.0721))), sample.rgb, 1.0 + hsl.y);
|
||||
sample.xyz = RGBtoHSL(sample.rgb);
|
||||
sample.rgb = HSLtoRGB(vec3(sample.x + hsl.x, sample.y, sample.z));
|
||||
highp float c = step(0.0, hsl.z);
|
||||
sample.rgb = mix(sample.rgb, vec3(c), abs(hsl.z));
|
||||
gl_FragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,385 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype InnerShadow
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-drop-shadow
|
||||
\brief Generates a colorized and blurred shadow inside the
|
||||
source.
|
||||
|
||||
By default the effect produces a high quality shadow image, thus the
|
||||
rendering speed of the shadow might not be the highest possible. The
|
||||
rendering speed is reduced especially if the shadow edges are heavily
|
||||
softened. For use cases that require faster rendering speed and for which
|
||||
the highest possible visual quality is not necessary, property
|
||||
\l{InnerShadow::fast}{fast} can be set to true.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_butterfly.png
|
||||
\li \image InnerShadow_butterfly.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet InnerShadow-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be used as the
|
||||
source for the generated shadow.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
Radius defines the softness of the shadow. A larger radius causes the
|
||||
edges of the shadow to appear more blurry.
|
||||
|
||||
Depending on the radius value, value of the
|
||||
\l{InnerShadow::samples}{samples} should be set to sufficiently large to
|
||||
ensure the visual quality.
|
||||
|
||||
The value ranges from 0.0 (no blur) to inf. By default, the property is
|
||||
set to \c 0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image InnerShadow_radius1.png
|
||||
\li \image InnerShadow_radius2.png
|
||||
\li \image InnerShadow_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 6 }
|
||||
\li \b { radius: 12 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real radius: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when edge
|
||||
softening blur calculation is done. Larger value produces better
|
||||
quality, but is slower to render.
|
||||
|
||||
Ideally, this value should be twice as large as the highest required
|
||||
radius value, for example, if the radius is animated between 0.0 and
|
||||
4.0, samples should be set to 8.
|
||||
|
||||
The value ranges from 0 to 32. By default, the property is set to \c 0.
|
||||
|
||||
This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
|
||||
When \l{InnerShadow::fast}{fast} property is set to true, this property
|
||||
has no effect.
|
||||
|
||||
*/
|
||||
property int samples: 0
|
||||
|
||||
/*!
|
||||
This property defines how large part of the shadow color is strenghtened
|
||||
near the source edges.
|
||||
|
||||
The value ranges from 0.0 to 1.0. By default, the property is set to \c
|
||||
0.5.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different spread values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image InnerShadow_spread1.png
|
||||
\li \image InnerShadow_spread2.png
|
||||
\li \image InnerShadow_spread3.png
|
||||
\row
|
||||
\li \b { spread: 0.0 }
|
||||
\li \b { spread: 0.3 }
|
||||
\li \b { spread: 0.5 }
|
||||
\row
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real spread: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the RGBA color value which is used for the shadow.
|
||||
|
||||
By default, the property is set to \c "black".
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different color values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image InnerShadow_color1.png
|
||||
\li \image InnerShadow_color2.png
|
||||
\li \image InnerShadow_color3.png
|
||||
\row
|
||||
\li \b { color: #000000 }
|
||||
\li \b { color: #ffffff }
|
||||
\li \b { color: #ff0000 }
|
||||
\row
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l spread: 0.2
|
||||
\li \l spread: 0.2
|
||||
\li \l spread: 0.2
|
||||
\endtable
|
||||
*/
|
||||
property color color: "black"
|
||||
|
||||
/*!
|
||||
\qmlproperty real QtGraphicalEffects::InnerShadow::horizontalOffset
|
||||
\qmlproperty real QtGraphicalEffects::InnerShadow::verticalOffset
|
||||
|
||||
HorizontalOffset and verticalOffset properties define the offset for the
|
||||
rendered shadow compared to the InnerShadow item position. Often, the
|
||||
InnerShadow item is anchored so that it fills the source element. In
|
||||
this case, if the HorizontalOffset and verticalOffset properties are set
|
||||
to 0, the shadow is rendered fully inside the source item. By changing
|
||||
the offset properties, the shadow can be positioned relatively to the
|
||||
source item.
|
||||
|
||||
The values range from -inf to inf. By default, the properties are set to
|
||||
\c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image InnerShadow_horizontalOffset1.png
|
||||
\li \image InnerShadow_horizontalOffset2.png
|
||||
\li \image InnerShadow_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: -20 }
|
||||
\li \b { horizontalOffset: 0 }
|
||||
\li \b { horizontalOffset: 20 }
|
||||
\row
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real horizontalOffset: 0
|
||||
property real verticalOffset: 0
|
||||
|
||||
/*!
|
||||
This property selects the blurring algorithm that is used to produce the
|
||||
softness for the effect. Setting this to true enables fast algorithm,
|
||||
setting value to false produces higher quality result.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different fast values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image InnerShadow_fast1.png
|
||||
\li \image InnerShadow_fast2.png
|
||||
\row
|
||||
\li \b { fast: false }
|
||||
\li \b { fast: true }
|
||||
\row
|
||||
\li \l radius: 16
|
||||
\li \l radius: 16
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l color: #000000
|
||||
\li \l color: #000000
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l spread: 0.2
|
||||
\li \l spread: 0.2
|
||||
\endtable
|
||||
*/
|
||||
property bool fast: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance. Every time the source or effect
|
||||
properties are changed, the pixels in the cache must be updated. Memory
|
||||
consumption is increased, because an extra buffer of memory is required
|
||||
for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
sourceComponent: rootItem.fast ? innerShadow : gaussianInnerShadow
|
||||
}
|
||||
|
||||
Component {
|
||||
id: gaussianInnerShadow
|
||||
GaussianInnerShadow {
|
||||
anchors.fill: parent
|
||||
source: rootItem.source
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.samples * 0.5
|
||||
color: rootItem.color
|
||||
cached: rootItem.cached
|
||||
spread: rootItem.spread
|
||||
horizontalOffset: rootItem.horizontalOffset
|
||||
verticalOffset: rootItem.verticalOffset
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: innerShadow
|
||||
FastInnerShadow {
|
||||
anchors.fill: parent
|
||||
source: rootItem.source
|
||||
blur: Math.pow(rootItem.radius / 64.0, 0.4)
|
||||
color: rootItem.color
|
||||
cached: rootItem.cached
|
||||
spread: rootItem.spread
|
||||
horizontalOffset: rootItem.horizontalOffset
|
||||
verticalOffset: rootItem.verticalOffset
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,472 @@
|
||||
/*****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Add-On Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
*****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype LevelAdjust
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-color
|
||||
\brief Adjusts color levels in the RGBA color space.
|
||||
|
||||
This effect adjusts the source item colors separately for each color
|
||||
channel. Source item contrast can be adjusted and color balance altered.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_butterfly.png
|
||||
\li \image LevelAdjust_butterfly.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet LevelAdjust-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that provides the source pixels
|
||||
for the effect.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the change factor for how the value of each pixel
|
||||
color channel is altered according to the equation:
|
||||
|
||||
\code result.rgb = pow(original.rgb, 1.0 / gamma.rgb); \endcode
|
||||
|
||||
Setting the gamma values under QtVector3d(1.0, 1.0, 1.0) makes the image
|
||||
darker, the values above QtVector3d(1.0, 1.0, 1.0) lighten it.
|
||||
|
||||
The value ranges from QtVector3d(0.0, 0.0, 0.0) (darkest) to inf
|
||||
(lightest). By default, the property is set to \c QtVector3d(1.0, 1.0,
|
||||
1.0) (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different gamma values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_gamma1.png
|
||||
\li \image LevelAdjust_gamma2.png
|
||||
\li \image LevelAdjust_gamma3.png
|
||||
\row
|
||||
\li \b { gamma: Qt.vector3d(1.0, 1.0, 1.0) }
|
||||
\li \b { gamma: Qt.vector3d(1.0, 0.4, 2.0) }
|
||||
\li \b { gamma: Qt.vector3d(1.0, 0.1, 4.0) }
|
||||
\row
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\row
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\row
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\row
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel color channel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_default_curve.png
|
||||
\li \image LevelAdjust_gamma2_curve.png
|
||||
\li \image LevelAdjust_gamma3_curve.png
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: color channel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
*/
|
||||
property variant gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
|
||||
/*!
|
||||
This property defines the minimum input level for each color channel. It
|
||||
sets the black-point, all pixels having lower value than this property
|
||||
are rendered as black (per color channel). Increasing the value darkens
|
||||
the dark areas.
|
||||
|
||||
The value ranges from "#00000000" to "#ffffffff". By default, the
|
||||
property is set to \c "#00000000" (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different minimumInput values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_minimumInput1.png
|
||||
\li \image LevelAdjust_minimumInput2.png
|
||||
\li \image LevelAdjust_minimumInput3.png
|
||||
\row
|
||||
\li \b { minimumInput: #00000000 }
|
||||
\li \b { minimumInput: #00000040 }
|
||||
\li \b { minimumInput: #00000070 }
|
||||
\row
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\row
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\row
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\row
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel color channel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_default_curve.png
|
||||
\li \image LevelAdjust_minimumInput2_curve.png
|
||||
\li \image LevelAdjust_minimumInput3_curve.png
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: color channel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property color minimumInput: Qt.rgba(0.0, 0.0, 0.0, 0.0)
|
||||
|
||||
/*!
|
||||
This property defines the maximum input level for each color channel.
|
||||
It sets the white-point, all pixels having higher value than this
|
||||
property are rendered as white (per color channel).
|
||||
Decreasing the value lightens the light areas.
|
||||
|
||||
The value ranges from "#ffffffff" to "#00000000". By default, the
|
||||
property is set to \c "#ffffffff" (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different maximumInput values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_maximumInput1.png
|
||||
\li \image LevelAdjust_maximumInput2.png
|
||||
\li \image LevelAdjust_maximumInput3.png
|
||||
\row
|
||||
\li \b { maximumInput: #FFFFFFFF }
|
||||
\li \b { maximumInput: #FFFFFF80 }
|
||||
\li \b { maximumInput: #FFFFFF30 }
|
||||
\row
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\row
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\row
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\row
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel color channel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_default_curve.png
|
||||
\li \image LevelAdjust_maximumInput2_curve.png
|
||||
\li \image LevelAdjust_maximumInput3_curve.png
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: color channel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property color maximumInput: Qt.rgba(1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
/*!
|
||||
This property defines the minimum output level for each color channel.
|
||||
Increasing the value lightens the dark areas, reducing the contrast.
|
||||
|
||||
The value ranges from "#00000000" to "#ffffffff". By default, the
|
||||
property is set to \c "#00000000" (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different minimumOutput values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_minimumOutput1.png
|
||||
\li \image LevelAdjust_minimumOutput2.png
|
||||
\li \image LevelAdjust_minimumOutput3.png
|
||||
\row
|
||||
\li \b { minimumOutput: #00000000 }
|
||||
\li \b { minimumOutput: #00000070 }
|
||||
\li \b { minimumOutput: #000000A0 }
|
||||
\row
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\row
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\row
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\li \l maximumOutput: #ffffff
|
||||
\row
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel color channel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_default_curve.png
|
||||
\li \image LevelAdjust_minimumOutput2_curve.png
|
||||
\li \image LevelAdjust_minimumOutput3_curve.png
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: color channel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property color minimumOutput: Qt.rgba(0.0, 0.0, 0.0, 0.0)
|
||||
|
||||
/*!
|
||||
This property defines the maximum output level for each color channel.
|
||||
Decreasing the value darkens the light areas, reducing the contrast.
|
||||
|
||||
The value ranges from "#ffffffff" to "#00000000". By default, the
|
||||
property is set to \c "#ffffffff" (no change).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different maximumOutput values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_maximumOutput1.png
|
||||
\li \image LevelAdjust_maximumOutput2.png
|
||||
\li \image LevelAdjust_maximumOutput3.png
|
||||
\row
|
||||
\li \b { maximumOutput: #FFFFFFFF }
|
||||
\li \b { maximumOutput: #FFFFFF80 }
|
||||
\li \b { maximumOutput: #FFFFFF30 }
|
||||
\row
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\li \l minimumInput: #000000
|
||||
\row
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\li \l maximumInput: #ffffff
|
||||
\row
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\li \l minimumOutput: #000000
|
||||
\row
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
|
||||
\endtable
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Pixel color channel luminance curves of the above images.
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LevelAdjust_default_curve.png
|
||||
\li \image LevelAdjust_maximumOutput2_curve.png
|
||||
\li \image LevelAdjust_maximumOutput3_curve.png
|
||||
\row
|
||||
\li X-axis: pixel original luminance
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li Y-axis: color channel luminance with effect applied
|
||||
\li
|
||||
\li
|
||||
\endtable
|
||||
*/
|
||||
property color maximumOutput: Qt.rgba(1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant minimumInputRGB: Qt.vector3d(rootItem.minimumInput.r, rootItem.minimumInput.g, rootItem.minimumInput.b)
|
||||
property variant maximumInputRGB: Qt.vector3d(rootItem.maximumInput.r, rootItem.maximumInput.g, rootItem.maximumInput.b)
|
||||
property real minimumInputAlpha: rootItem.minimumInput.a
|
||||
property real maximumInputAlpha: rootItem.maximumInput.a
|
||||
property variant minimumOutputRGB: Qt.vector3d(rootItem.minimumOutput.r, rootItem.minimumOutput.g, rootItem.minimumOutput.b)
|
||||
property variant maximumOutputRGB: Qt.vector3d(rootItem.maximumOutput.r, rootItem.maximumOutput.g, rootItem.maximumOutput.b)
|
||||
property real minimumOutputAlpha: rootItem.minimumOutput.a
|
||||
property real maximumOutputAlpha: rootItem.maximumOutput.a
|
||||
property variant gamma: Qt.vector3d(1.0 / Math.max(rootItem.gamma.x, 0.0001), 1.0 / Math.max(rootItem.gamma.y, 0.0001), 1.0 / Math.max(rootItem.gamma.z, 0.0001))
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp vec3 minimumInputRGB;
|
||||
uniform highp vec3 maximumInputRGB;
|
||||
uniform highp float minimumInputAlpha;
|
||||
uniform highp float maximumInputAlpha;
|
||||
uniform highp vec3 minimumOutputRGB;
|
||||
uniform highp vec3 maximumOutputRGB;
|
||||
uniform highp float minimumOutputAlpha;
|
||||
uniform highp float maximumOutputAlpha;
|
||||
uniform highp vec3 gamma;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
highp vec4 textureColor = texture2D(source, qt_TexCoord0.st);
|
||||
highp vec4 color = vec4(textureColor.rgb / max(1.0/256.0, textureColor.a), textureColor.a);
|
||||
|
||||
color.r = linearstep(minimumInputRGB.r, maximumInputRGB.r, color.r);
|
||||
color.g = linearstep(minimumInputRGB.g, maximumInputRGB.g, color.g);
|
||||
color.b = linearstep(minimumInputRGB.b, maximumInputRGB.b, color.b);
|
||||
color.a = linearstep(minimumInputAlpha, maximumInputAlpha, color.a);
|
||||
|
||||
color.rgb = pow(color.rgb, gamma);
|
||||
|
||||
color.r = minimumOutputRGB.r + color.r * (maximumOutputRGB.r - minimumOutputRGB.r);
|
||||
color.g = minimumOutputRGB.g + color.g * (maximumOutputRGB.g - minimumOutputRGB.g);
|
||||
color.b = minimumOutputRGB.b + color.b * (maximumOutputRGB.b - minimumOutputRGB.b);
|
||||
color.a = minimumOutputAlpha + color.a * (maximumOutputAlpha - minimumOutputAlpha);
|
||||
|
||||
gl_FragColor = vec4(color.rgb * color.a, color.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,365 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype LinearGradient
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-gradient
|
||||
\brief Draws a linear gradient.
|
||||
|
||||
A gradient is defined by two or more colors, which are blended seamlessly.
|
||||
The colors start from the given start point and end to the given end point.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image LinearGradient.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet LinearGradient-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the starting point where the color at gradient
|
||||
position of 0.0 is rendered. Colors at larger position values are
|
||||
rendered linearly towards the end point. The point is given in pixels
|
||||
and the default value is Qt.point(0, 0). Setting the default values for
|
||||
the start and \l{LinearGradient::end}{end} results in a full height
|
||||
linear gradient on the y-axis.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different start values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LinearGradient_start1.png
|
||||
\li \image LinearGradient_start2.png
|
||||
\li \image LinearGradient_start3.png
|
||||
\row
|
||||
\li \b { start: QPoint(0, 0) }
|
||||
\li \b { start: QPoint(150, 150) }
|
||||
\li \b { start: QPoint(300, 0) }
|
||||
\row
|
||||
\li \l end: QPoint(300, 300)
|
||||
\li \l end: QPoint(300, 300)
|
||||
\li \l end: QPoint(300, 300)
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property variant start: Qt.point(0, 0)
|
||||
|
||||
/*!
|
||||
This property defines the ending point where the color at gradient
|
||||
position of 1.0 is rendered. Colors at smaller position values are
|
||||
rendered linearly towards the start point. The point is given in pixels
|
||||
and the default value is Qt.point(0, height). Setting the default values
|
||||
for the \l{LinearGradient::start}{start} and end results in a full
|
||||
height linear gradient on the y-axis.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different end values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LinearGradient_end1.png
|
||||
\li \image LinearGradient_end2.png
|
||||
\li \image LinearGradient_end3.png
|
||||
\row
|
||||
\li \b { end: Qt.point(300, 300) }
|
||||
\li \b { end: Qt.point(150, 150) }
|
||||
\li \b { end: Qt.point(300, 0) }
|
||||
\row
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property variant end: Qt.point(0, height)
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be filled with gradient.
|
||||
Source item gets rendered into an intermediate pixel buffer and the
|
||||
alpha values from the result are used to determine the gradient's pixels
|
||||
visibility in the display. The default value for source is undefined and
|
||||
in that case whole effect area is filled with gradient.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different source values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LinearGradient_maskSource1.png
|
||||
\li \image LinearGradient_maskSource2.png
|
||||
\row
|
||||
\li \b { source: undefined }
|
||||
\li \b { source: Image { source: images/butterfly.png } }
|
||||
\row
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\row
|
||||
\li \l end: Qt.point(300, 300)
|
||||
\li \l end: Qt.point(300, 300)
|
||||
\endtable
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
|
||||
/*!
|
||||
A gradient is defined by two or more colors, which are blended
|
||||
seamlessly. The colors are specified as a set of GradientStop child
|
||||
items, each of which defines a position on the gradient from 0.0 to 1.0
|
||||
and a color. The position of each GradientStop is defined by the
|
||||
position property, and the color is definded by the color property.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different gradient values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image LinearGradient_gradient1.png
|
||||
\li \image LinearGradient_gradient2.png
|
||||
\li \image LinearGradient_gradient3.png
|
||||
\row
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.167
|
||||
color: Qt.rgba(1, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.333
|
||||
color: Qt.rgba(0, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.500
|
||||
color: Qt.rgba(0, 1, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.667
|
||||
color: Qt.rgba(0, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.833
|
||||
color: Qt.rgba(1, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.5
|
||||
color: "#000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#00000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#FF000000"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\li \l start: Qt.point(0, 0)
|
||||
\row
|
||||
\li \l end: Qt.point(300, 300)
|
||||
\li \l end: Qt.point(300, 300)
|
||||
\li \l end: Qt.point(300, 300)
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property Gradient gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "white" }
|
||||
GradientStop { position: 1.0; color: "black" }
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: gradientSource
|
||||
sourceItem: Rectangle {
|
||||
width: 16
|
||||
height: 256
|
||||
gradient: rootItem.gradient
|
||||
smooth: true
|
||||
}
|
||||
smooth: true
|
||||
hideSource: true
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
property variant source: gradientSource
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
property variant startPoint: Qt.point(start.x / width, start.y / height)
|
||||
property real dx: end.x - start.x
|
||||
property real dy: end.y - start.y
|
||||
property real l: 1.0 / Math.sqrt(Math.pow(dx / width, 2.0) + Math.pow(dy / height, 2.0))
|
||||
property real angle: Math.atan2(dx, dy)
|
||||
property variant matrixData: Qt.point(Math.sin(angle), Math.cos(angle))
|
||||
|
||||
vertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
uniform highp vec2 startPoint;
|
||||
uniform highp float l;
|
||||
uniform highp vec2 matrixData;
|
||||
|
||||
void main() {
|
||||
highp mat2 rot = mat2(matrixData.y, -matrixData.x,
|
||||
matrixData.x, matrixData.y);
|
||||
|
||||
qt_TexCoord0 = qt_MultiTexCoord0;
|
||||
|
||||
qt_TexCoord1 = qt_MultiTexCoord0 * l;
|
||||
qt_TexCoord1 -= startPoint * l;
|
||||
qt_TexCoord1 *= rot;
|
||||
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
fragmentShader: maskSource == undefined ? noMaskShader : maskShader
|
||||
|
||||
onFragmentShaderChanged: lChanged()
|
||||
|
||||
property string maskShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp sampler2D maskSource;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
|
||||
void main() {
|
||||
lowp vec4 gradientColor = texture2D(source, qt_TexCoord1);
|
||||
lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
|
||||
gl_FragColor = gradientColor * maskAlpha * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
property string noMaskShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = texture2D(source, qt_TexCoord1) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Copyright (C) 2015 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype MaskedBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-blur
|
||||
\brief Applies a blur effect with a varying intesity.
|
||||
|
||||
MaskedBlur effect softens the image by blurring it. The intensity of the
|
||||
blur can be controlled for each pixel using maskSource so that some parts of
|
||||
the source are blurred more than others.
|
||||
|
||||
Performing blur live is a costly operation. Fullscreen gaussian blur
|
||||
with even a moderate number of samples will only run at 60 fps on highend
|
||||
graphics hardware.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li MaskSource
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image MaskedBlur_mask.png
|
||||
\li \image MaskedBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet MaskedBlur-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: root
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property alias source: blur.source
|
||||
|
||||
/*!
|
||||
This property defines the item that is controlling the final intensity
|
||||
of the blur. The pixel alpha channel value from maskSource defines the
|
||||
actual blur radius that is going to be used for blurring the
|
||||
corresponding source pixel.
|
||||
|
||||
Opaque maskSource pixels produce blur with specified
|
||||
\l{MaskedBlur::radius}{radius}, while transparent pixels suppress the
|
||||
blur completely. Semitransparent maskSource pixels produce blur with a
|
||||
radius that is interpolated according to the pixel transparency level.
|
||||
*/
|
||||
property alias maskSource: maskProxy.input
|
||||
|
||||
/*!
|
||||
This property defines the distance of the neighboring pixels which
|
||||
affect the blurring of an individual pixel. A larger radius increases
|
||||
the blur effect.
|
||||
|
||||
Depending on the radius value, value of the
|
||||
\l{MaskedBlur::samples}{samples} should be set to sufficiently large to
|
||||
ensure the visual quality.
|
||||
|
||||
The value ranges from 0.0 (no blur) to inf. By default, the property is
|
||||
set to \c 0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image MaskedBlur_radius1.png
|
||||
\li \image MaskedBlur_radius2.png
|
||||
\li \image MaskedBlur_radius3.png
|
||||
\row
|
||||
\li \b { radius: 0 }
|
||||
\li \b { radius: 8 }
|
||||
\li \b { radius: 16 }
|
||||
\row
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\li \l samples: 25
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property alias radius: blur.radius
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when blur
|
||||
calculation is done. Larger value produces better quality, but is slower
|
||||
to render.
|
||||
|
||||
Ideally, this value should be twice as large as the highest required
|
||||
radius value plus 1, for example, if the radius is animated between 0.0
|
||||
and 4.0, samples should be set to 9.
|
||||
|
||||
By default, the property is set to \c 9.
|
||||
|
||||
This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
*/
|
||||
property alias samples: blur.samples
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance. Every time the source or effect
|
||||
properties are changed, the pixels in the cache must be updated. Memory
|
||||
consumption is increased, because an extra buffer of memory is required
|
||||
for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property alias cached: cacheItem.visible
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Kept for source compatibility only. Removed in Qt 5.6
|
||||
### Qt6: remove
|
||||
*/
|
||||
property bool fast: false
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Kept for source compatibility only. Removed in Qt 5.6
|
||||
|
||||
Doing transparent border on a masked source doesn't make any sense
|
||||
as the padded exterior will have a mask alpha value of 0 which means
|
||||
no blurring and as the padded exterior of the source is a transparent
|
||||
pixel, the result is no pixels at all.
|
||||
|
||||
In Qt 5.6 and before, this worked based on that the mask source
|
||||
was scaled up to fit the padded blur target rect, which would lead
|
||||
to inconsistent and buggy results.
|
||||
|
||||
### Qt6: remove
|
||||
*/
|
||||
property bool transparentBorder;
|
||||
|
||||
GaussianBlur {
|
||||
id: blur
|
||||
|
||||
source: root.source;
|
||||
anchors.fill: parent
|
||||
_maskSource: maskProxy.output;
|
||||
|
||||
SourceProxy {
|
||||
id: maskProxy
|
||||
}
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
x: -blur._kernelRadius
|
||||
y: -blur._kernelRadius
|
||||
width: blur.width + 2 * blur._kernelRadius
|
||||
height: blur.height + 2 * blur._kernelRadius
|
||||
visible: false
|
||||
smooth: true
|
||||
sourceRect: Qt.rect(-blur._kernelRadius, -blur._kernelRadius, width, height);
|
||||
sourceItem: blur
|
||||
hideSource: visible
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype OpacityMask
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-mask
|
||||
\brief Masks the source item with another item.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li MaskSource
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image OpacityMask_mask.png
|
||||
\li \image OpacityMask_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet OpacityMask-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be masked.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be used as the mask. The
|
||||
mask item gets rendered into an intermediate pixel buffer and the alpha
|
||||
values from the result are used to determine the source item's pixels
|
||||
visibility in the display.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Original
|
||||
\li Mask
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image OpacityMask_mask.png
|
||||
\li \image OpacityMask_bug.png
|
||||
\endtable
|
||||
*/
|
||||
property variant maskSource
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting maskSource to the effect's parent.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.maskSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp sampler2D maskSource;
|
||||
void main(void) {
|
||||
gl_FragColor = texture2D(source, qt_TexCoord0.st) * (texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype RadialBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-motion-blur
|
||||
\brief Applies directional blur in a circular direction around the items
|
||||
center point.
|
||||
|
||||
Effect creates perceived impression that the source item appears to be
|
||||
rotating to the direction of the blur.
|
||||
|
||||
Other available motionblur effects are
|
||||
\l{QtGraphicalEffects::ZoomBlur}{ZoomBlur} and
|
||||
\l{QtGraphicalEffects::DirectionalBlur}{DirectionalBlur}.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image RadialBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example Usage
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet RadialBlur-example.qml example
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the direction for the blur and at the same time
|
||||
the level of blurring. The larger the angle, the more the result becomes
|
||||
blurred. The quality of the blur depends on
|
||||
\l{RadialBlur::samples}{samples} property. If angle value is large, more
|
||||
samples are needed to keep the visual quality at high level.
|
||||
|
||||
Allowed values are between 0.0 and 360.0. By default the property is set
|
||||
to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different angle values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialBlur_angle1.png
|
||||
\li \image RadialBlur_angle2.png
|
||||
\li \image RadialBlur_angle3.png
|
||||
\row
|
||||
\li \b { angle: 0.0 }
|
||||
\li \b { angle: 15.0 }
|
||||
\li \b { angle: 30.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
*/
|
||||
property real angle: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when blur
|
||||
calculation is done. Larger value produces better quality, but is slower
|
||||
to render.
|
||||
|
||||
This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
|
||||
Allowed values are between 0 and inf (practical maximum depends on GPU).
|
||||
By default the property is set to \c 0 (no samples).
|
||||
|
||||
*/
|
||||
property int samples: 0
|
||||
|
||||
/*!
|
||||
\qmlproperty real QtGraphicalEffects::RadialBlur::horizontalOffset
|
||||
\qmlproperty real QtGraphicalEffects::RadialBlur::verticalOffset
|
||||
|
||||
These properties define the offset in pixels for the perceived center
|
||||
point of the rotation.
|
||||
|
||||
Allowed values are between -inf and inf.
|
||||
By default these properties are set to \c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialBlur_horizontalOffset1.png
|
||||
\li \image RadialBlur_horizontalOffset2.png
|
||||
\li \image RadialBlur_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: 75.0 }
|
||||
\li \b { horizontalOffset: 0.0 }
|
||||
\li \b { horizontalOffset: -75.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l angle: 20
|
||||
\li \l angle: 20
|
||||
\li \l angle: 20
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
*/
|
||||
property real horizontalOffset: 0.0
|
||||
property real verticalOffset: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: shaderItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant center: Qt.point(0.5 + rootItem.horizontalOffset / parent.width, 0.5 + rootItem.verticalOffset / parent.height)
|
||||
property bool transparentBorder: rootItem.transparentBorder && rootItem.samples > 1
|
||||
property int samples: rootItem.samples
|
||||
property real weight: 1.0 / Math.max(1.0, rootItem.samples)
|
||||
property real angleSin: Math.sin(rootItem.angle/2 * Math.PI/180)
|
||||
property real angleCos: Math.cos(rootItem.angle/2 * Math.PI/180)
|
||||
property real angleSinStep: Math.sin(-rootItem.angle * Math.PI/180 / Math.max(1.0, rootItem.samples - 1))
|
||||
property real angleCosStep: Math.cos(-rootItem.angle * Math.PI/180 / Math.max(1.0, rootItem.samples - 1))
|
||||
property variant expandPixels: transparentBorder ? Qt.size(0.5 * parent.height, 0.5 * parent.width) : Qt.size(0,0)
|
||||
property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
|
||||
property variant delta: Qt.size(1.0 / rootItem.width, 1.0 / rootItem.height)
|
||||
property real w: parent.width
|
||||
property real h: parent.height
|
||||
|
||||
x: transparentBorder ? -expandPixels.width - 1 : 0
|
||||
y: transparentBorder ? -expandPixels.height - 1 : 0
|
||||
width: transparentBorder ? parent.width + expandPixels.width * 2.0 + 2 : parent.width
|
||||
height: transparentBorder ? parent.height + expandPixels.height * 2.0 + 2 : parent.height
|
||||
|
||||
property string fragmentShaderSkeleton: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float angleSin;
|
||||
uniform highp float angleCos;
|
||||
uniform highp float angleSinStep;
|
||||
uniform highp float angleCosStep;
|
||||
uniform highp float weight;
|
||||
uniform highp vec2 expand;
|
||||
uniform highp vec2 center;
|
||||
uniform highp vec2 delta;
|
||||
uniform highp float w;
|
||||
uniform highp float h;
|
||||
|
||||
void main(void) {
|
||||
highp mat2 m;
|
||||
gl_FragColor = vec4(0.0);
|
||||
mediump vec2 texCoord = qt_TexCoord0;
|
||||
|
||||
PLACEHOLDER_EXPAND_STEPS
|
||||
|
||||
highp vec2 dir = vec2(texCoord.s * w - w * center.x, texCoord.t * h - h * center.y);
|
||||
m[0] = vec2(angleCos, -angleSin);
|
||||
m[1] = vec2(angleSin, angleCos);
|
||||
dir *= m;
|
||||
|
||||
m[0] = vec2(angleCosStep, -angleSinStep);
|
||||
m[1] = vec2(angleSinStep, angleCosStep);
|
||||
|
||||
PLACEHOLDER_UNROLLED_LOOP
|
||||
|
||||
gl_FragColor *= weight * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
function buildFragmentShader() {
|
||||
var shader = fragmentShaderSkeleton
|
||||
var expandSteps = ""
|
||||
|
||||
if (transparentBorder) {
|
||||
expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
|
||||
}
|
||||
|
||||
var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
|
||||
|
||||
if (rootItem.samples > 1) {
|
||||
unrolledLoop = ""
|
||||
for (var i = 0; i < rootItem.samples; i++)
|
||||
unrolledLoop += "gl_FragColor += texture2D(source, center + dir * delta); dir *= m;\n"
|
||||
}
|
||||
|
||||
shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
|
||||
fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
|
||||
}
|
||||
|
||||
onFragmentShaderChanged: sourceChanged()
|
||||
onSamplesChanged: buildFragmentShader()
|
||||
onTransparentBorderChanged: buildFragmentShader()
|
||||
Component.onCompleted: buildFragmentShader()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,458 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype RadialGradient
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-gradient
|
||||
\brief Draws a radial gradient.
|
||||
|
||||
A gradient is defined by two or more colors, which are blended seamlessly.
|
||||
The colors start from the middle of the item and end at the borders.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image RadialGradient.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet RadialGradient-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
/*!
|
||||
The HorizontalOffset and verticalOffset properties define the offset in
|
||||
pixels for the center point of the gradient compared to the item center.
|
||||
|
||||
The values range from -inf to inf. By default, these properties are set
|
||||
to \c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialGradient_horizontalOffset1.png
|
||||
\li \image RadialGradient_horizontalOffset2.png
|
||||
\li \image RadialGradient_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: -150 }
|
||||
\li \b { horizontalOffset: 0 }
|
||||
\li \b { horizontalOffset: 150 }
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l horizontalRadius: 300
|
||||
\li \l horizontalRadius: 300
|
||||
\li \l horizontalRadius: 300
|
||||
\row
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real horizontalOffset: 0.0
|
||||
property real verticalOffset: 0.0
|
||||
|
||||
/*!
|
||||
The HorizontalRadius and verticalRadius properties define the shape and
|
||||
size of the radial gradient. If the radiuses are equal, the shape of the
|
||||
gradient is a circle. If the horizontal and vertical radiuses differ,
|
||||
the shape is elliptical. The radiuses are given in pixels.
|
||||
|
||||
The value ranges from -inf to inf. By default, horizontalRadius is bound
|
||||
to width and verticalRadius is bound to height.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalRadius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialGradient_horizontalRadius1.png
|
||||
\li \image RadialGradient_horizontalRadius2.png
|
||||
\row
|
||||
\li \b { horizontalRadius: 300 }
|
||||
\li \b { horizontalRadius: 100 }
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\row
|
||||
\li \l gradient: QQuickGradient(0xa05fb10)
|
||||
\li \l gradient: QQuickGradient(0xa05fb10)
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real horizontalRadius: width
|
||||
property real verticalRadius: height
|
||||
|
||||
/*!
|
||||
This property defines the rotation of the gradient around its center
|
||||
point. The rotation is only visible when the
|
||||
\l{RadialGradient::horizontalRadius}{horizontalRadius} and
|
||||
\l{RadialGradient::verticalRadius}{verticalRadius} properties are not
|
||||
equal. The angle is given in degrees and the default value is \c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different angle values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialGradient_angle1.png
|
||||
\li \image RadialGradient_angle2.png
|
||||
\li \image RadialGradient_angle3.png
|
||||
\row
|
||||
\li \b { angle: 0 }
|
||||
\li \b { angle: 45 }
|
||||
\li \b { angle: 90 }
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l horizontalRadius: 100
|
||||
\li \l horizontalRadius: 100
|
||||
\li \l horizontalRadius: 100
|
||||
\row
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\endtable
|
||||
*/
|
||||
property real angle: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be filled with gradient.
|
||||
Source item gets rendered into an intermediate pixel buffer and the
|
||||
alpha values from the result are used to determine the gradient's pixels
|
||||
visibility in the display. The default value for source is undefined and
|
||||
in that case whole effect area is filled with gradient.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different source values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialGradient_maskSource1.png
|
||||
\li \image RadialGradient_maskSource2.png
|
||||
\row
|
||||
\li \b { source: undefined }
|
||||
\li \b { source: Image { source: images/butterfly.png } }
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l horizontalRadius: 300
|
||||
\li \l horizontalRadius: 300
|
||||
\row
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\endtable
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
A gradient is defined by two or more colors, which are blended
|
||||
seamlessly. The colors are specified as a set of GradientStop child
|
||||
items, each of which defines a position on the gradient from 0.0 to 1.0
|
||||
and a color. The position of each GradientStop is defined by setting the
|
||||
position property. The color is defined by setting the color property.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different gradient values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RadialGradient_gradient1.png
|
||||
\li \image RadialGradient_gradient2.png
|
||||
\li \image RadialGradient_gradient3.png
|
||||
\row
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.167
|
||||
color: Qt.rgba(1, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.333
|
||||
color: Qt.rgba(0, 1, 0, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.500
|
||||
color: Qt.rgba(0, 1, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.667
|
||||
color: Qt.rgba(0, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.833
|
||||
color: Qt.rgba(1, 0, 1, 1)
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.000
|
||||
color: Qt.rgba(1, 0, 0, 1)
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:} \code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
GradientStop {
|
||||
position: 0.5
|
||||
color: "#000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#F0F0F0"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\li \b {gradient:}
|
||||
\code
|
||||
Gradient {
|
||||
GradientStop {
|
||||
position: 0.0
|
||||
color: "#00000000"
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "#FF000000"
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\row
|
||||
\li \l horizontalRadius: 300
|
||||
\li \l horizontalRadius: 300
|
||||
\li \l horizontalRadius: 300
|
||||
\row
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\li \l verticalRadius: 300
|
||||
\row
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\li \l angle: 0
|
||||
\endtable
|
||||
*/
|
||||
property Gradient gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "white" }
|
||||
GradientStop { position: 1.0; color: "black" }
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: gradientSource
|
||||
sourceItem: Rectangle {
|
||||
width: 16
|
||||
height: 256
|
||||
gradient: rootItem.gradient
|
||||
smooth: true
|
||||
}
|
||||
smooth: true
|
||||
hideSource: true
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant gradientImage: gradientSource
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
property variant center: Qt.point(0.5 + rootItem.horizontalOffset / width, 0.5 + rootItem.verticalOffset / height)
|
||||
property real horizontalRatio: rootItem.horizontalRadius > 0 ? width / (2 * rootItem.horizontalRadius) : width * 16384
|
||||
property real verticalRatio: rootItem.verticalRadius > 0 ? height / (2 * rootItem.verticalRadius) : height * 16384
|
||||
property real angle: -rootItem.angle / 360 * 2 * Math.PI
|
||||
property variant matrixData: Qt.point(Math.sin(angle), Math.cos(angle))
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
vertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp vec2 matrixData;
|
||||
uniform highp float horizontalRatio;
|
||||
uniform highp float verticalRatio;
|
||||
uniform highp vec2 center;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 centerPoint;
|
||||
|
||||
void main() {
|
||||
highp vec2 ratio = vec2(horizontalRatio, verticalRatio);
|
||||
|
||||
// Rotation matrix
|
||||
highp mat2 rot = mat2(matrixData.y, -matrixData.x,
|
||||
matrixData.x, matrixData.y);
|
||||
|
||||
qt_TexCoord0 = qt_MultiTexCoord0;
|
||||
|
||||
qt_TexCoord1 = qt_MultiTexCoord0;
|
||||
qt_TexCoord1 -= center;
|
||||
qt_TexCoord1 *= rot;
|
||||
qt_TexCoord1 += center;
|
||||
qt_TexCoord1 *= ratio;
|
||||
|
||||
centerPoint = center * ratio;
|
||||
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
fragmentShader: maskSource == undefined ? noMaskShader : maskShader
|
||||
|
||||
onFragmentShaderChanged: horizontalRatioChanged()
|
||||
|
||||
property string maskShader: "
|
||||
uniform lowp sampler2D gradientImage;
|
||||
uniform lowp sampler2D maskSource;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 centerPoint;
|
||||
|
||||
void main() {
|
||||
lowp vec4 gradientColor = texture2D(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
|
||||
lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
|
||||
gl_FragColor = gradientColor * maskAlpha * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
property string noMaskShader: "
|
||||
uniform lowp sampler2D gradientImage;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 centerPoint;
|
||||
|
||||
void main() {
|
||||
lowp vec4 gradientColor = texture2D(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
|
||||
gl_FragColor = gradientColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,288 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype RectangularGlow
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-glow
|
||||
\brief Generates a blurred and colorized rectangle, which gives
|
||||
the impression that the source is glowing.
|
||||
|
||||
This effect is intended to have good performance. The shape of the glow is
|
||||
limited to a rectangle with a custom corner radius. For situations where
|
||||
custom shapes are required, consider \l {QtGraphicalEffects::Glow} {Glow}
|
||||
effect.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image RectangularGlow_applied.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet RectangularGlow-example.qml example
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines how many pixels outside the item area are reached
|
||||
by the glow.
|
||||
|
||||
The value ranges from 0.0 (no glow) to inf (infinite glow). By default,
|
||||
the property is set to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different glowRadius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RectangularGlow_glowRadius1.png
|
||||
\li \image RectangularGlow_glowRadius2.png
|
||||
\li \image RectangularGlow_glowRadius3.png
|
||||
\row
|
||||
\li \b { glowRadius: 10 }
|
||||
\li \b { glowRadius: 20 }
|
||||
\li \b { glowRadius: 40 }
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\row
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\row
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real glowRadius: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how large part of the glow color is strenghtened
|
||||
near the source edges.
|
||||
|
||||
The value ranges from 0.0 (no strenght increase) to 1.0 (maximum
|
||||
strenght increase). By default, the property is set to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different spread values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RectangularGlow_spread1.png
|
||||
\li \image RectangularGlow_spread2.png
|
||||
\li \image RectangularGlow_spread3.png
|
||||
\row
|
||||
\li \b { spread: 0.0 }
|
||||
\li \b { spread: 0.5 }
|
||||
\li \b { spread: 1.0 }
|
||||
\row
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\row
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\row
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\endtable
|
||||
*/
|
||||
property real spread: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the RGBA color value which is used for the glow.
|
||||
|
||||
By default, the property is set to \c "white".
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different color values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RectangularGlow_color1.png
|
||||
\li \image RectangularGlow_color2.png
|
||||
\li \image RectangularGlow_color3.png
|
||||
\row
|
||||
\li \b { color: #ffffff }
|
||||
\li \b { color: #55ff55 }
|
||||
\li \b { color: #5555ff }
|
||||
\row
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\row
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\li \l cornerRadius: 25
|
||||
\endtable
|
||||
*/
|
||||
property color color: "white"
|
||||
|
||||
/*!
|
||||
This property defines the corner radius that is used to draw a glow with
|
||||
rounded corners.
|
||||
|
||||
The value ranges from 0.0 to half of the effective width or height of
|
||||
the glow, whichever is smaller. This can be calculated with: \c{
|
||||
min(width, height) / 2.0 + glowRadius}
|
||||
|
||||
By default, the property is bound to glowRadius property. The glow
|
||||
behaves as if the rectangle was blurred when adjusting the glowRadius
|
||||
property.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different cornerRadius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RectangularGlow_cornerRadius1.png
|
||||
\li \image RectangularGlow_cornerRadius2.png
|
||||
\li \image RectangularGlow_cornerRadius3.png
|
||||
\row
|
||||
\li \b { cornerRadius: 0 }
|
||||
\li \b { cornerRadius: 25 }
|
||||
\li \b { cornerRadius: 50 }
|
||||
\row
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\li \l glowRadius: 20
|
||||
\row
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\li \l spread: 0
|
||||
\row
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\li \l color: #ffffff
|
||||
\endtable
|
||||
*/
|
||||
property real cornerRadius: glowRadius
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
|
||||
x: (parent.width - width) / 2.0
|
||||
y: (parent.height - height) / 2.0
|
||||
width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2
|
||||
height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2
|
||||
|
||||
function clampedCornerRadius() {
|
||||
var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + glowRadius;
|
||||
return Math.max(0, Math.min(rootItem.cornerRadius, maxCornerRadius))
|
||||
}
|
||||
|
||||
property color color: rootItem.color
|
||||
property real inverseSpread: 1.0 - rootItem.spread
|
||||
property real relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width
|
||||
property real relativeSizeY: relativeSizeX * (width / height)
|
||||
property real spread: rootItem.spread / 2.0
|
||||
property real cornerRadius: clampedCornerRadius()
|
||||
|
||||
fragmentShader: "
|
||||
uniform highp float qt_Opacity;
|
||||
uniform mediump float relativeSizeX;
|
||||
uniform mediump float relativeSizeY;
|
||||
uniform mediump float spread;
|
||||
uniform lowp vec4 color;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp float alpha =
|
||||
smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *
|
||||
smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));
|
||||
|
||||
highp float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);
|
||||
gl_FragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,350 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype RecursiveBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-blur
|
||||
\brief Blurs repeatedly, providing a strong blur effect.
|
||||
|
||||
The RecursiveBlur effect softens the image by blurring it with an algorithm
|
||||
that uses a recursive feedback loop to blur the source multiple times. The
|
||||
effect may give more blurry results than
|
||||
\l{QtGraphicalEffects::GaussianBlur}{GaussianBlur} or
|
||||
\l{QtGraphicalEffects::FastBlur}{FastBlur}, but the result is produced
|
||||
asynchronously and takes more time.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image RecursiveBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet RecursiveBlur-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the distance of neighboring pixels which influence
|
||||
the blurring of individual pixels. A larger radius provides better
|
||||
quality, but is slower to render.
|
||||
|
||||
\b Note: The radius value in this effect is not intended to be changed
|
||||
or animated frequently. The correct way to use it is to set the correct
|
||||
value and keep it unchanged for the whole duration of the iterative blur
|
||||
sequence.
|
||||
|
||||
The value ranges from (no blur) to 16.0 (maximum blur step). By default,
|
||||
the property is set to \c 0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different radius values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RecursiveBlur_radius1.png
|
||||
\li \image RecursiveBlur_radius2.png
|
||||
\li \image RecursiveBlur_radius3.png
|
||||
\row
|
||||
\li \b { radius: 2.5 }
|
||||
\li \b { radius: 4.5 }
|
||||
\li \b { radius: 7.5 }
|
||||
\row
|
||||
\li \l loops: 20
|
||||
\li \l loops: 20
|
||||
\li \l loops: 20
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real radius: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different transparentBorder values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RecursiveBlur_transparentBorder1.png
|
||||
\li \image RecursiveBlur_transparentBorder2.png
|
||||
\row
|
||||
\li \b { transparentBorder: false }
|
||||
\li \b { transparentBorder: true }
|
||||
\row
|
||||
\li \l loops: 20
|
||||
\li \l loops: 20
|
||||
\row
|
||||
\li \l radius: 7.5
|
||||
\li \l radius: 7.5
|
||||
\endtable
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property defines the amount of blur iterations that are going to be
|
||||
performed for the source. When the property changes, the iterative
|
||||
blurring process starts. If the value is decreased or if the value
|
||||
changes from zero to non-zero, a snapshot is taken from the source. The
|
||||
snapshot is used as a starting point for the process.
|
||||
|
||||
The iteration loop tries to run as fast as possible. The speed might be
|
||||
limited by the VSYNC or the time needed for one blur step, or both.
|
||||
Sometimes it may be desirable to perform the blurring with a slower
|
||||
pace. In that case, it may be convenient to control the property with
|
||||
Animation which increases the value.
|
||||
|
||||
The value ranges from 0 to inf. By default, the property is set to \c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different loops values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image RecursiveBlur_loops1.png
|
||||
\li \image RecursiveBlur_loops2.png
|
||||
\li \image RecursiveBlur_loops3.png
|
||||
\row
|
||||
\li \b { loops: 4 }
|
||||
\li \b { loops: 20 }
|
||||
\li \b { loops: 70 }
|
||||
\row
|
||||
\li \l radius: 7.5
|
||||
\li \l radius: 7.5
|
||||
\li \l radius: 7.5
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property int loops: 0
|
||||
|
||||
/*!
|
||||
This property holds the progress of asynchronous source blurring
|
||||
process, from 0.0 (nothing blurred) to 1.0 (finished).
|
||||
*/
|
||||
property real progress: loops > 0.0 ? Math.min(1.0, recursionTimer.counter / loops) : 0.0
|
||||
|
||||
onLoopsChanged: recursiveSource.scheduleUpdate()
|
||||
onSourceChanged: recursionTimer.reset()
|
||||
onRadiusChanged: recursionTimer.reset()
|
||||
onTransparentBorderChanged: recursionTimer.reset()
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2, parent.height + 2) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: verticalBlur
|
||||
smooth: true
|
||||
visible: rootItem.cached
|
||||
hideSource: visible
|
||||
live: true
|
||||
sourceItem: inputItem.visible ? inputItem : verticalBlur
|
||||
}
|
||||
|
||||
Item {
|
||||
id: recursionTimer
|
||||
property int counter: 0
|
||||
|
||||
function reset() {
|
||||
counter = 0
|
||||
recursiveSource.scheduleUpdate()
|
||||
}
|
||||
|
||||
function nextFrame() {
|
||||
if (loops < counter)
|
||||
recursionTimer.counter = 0
|
||||
|
||||
if (counter > 0)
|
||||
recursiveSource.sourceItem = verticalBlur
|
||||
else
|
||||
recursiveSource.sourceItem = inputItem
|
||||
|
||||
if (counter < loops) {
|
||||
recursiveSource.scheduleUpdate()
|
||||
counter++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: inputItem
|
||||
property variant source: sourceProxy.output
|
||||
property real expandX: rootItem.transparentBorder ? (horizontalBlur.maximumRadius) / horizontalBlur.width : 0.0
|
||||
property real expandY: rootItem.transparentBorder ? (horizontalBlur.maximumRadius) / horizontalBlur.height : 0.0
|
||||
|
||||
anchors.fill: verticalBlur
|
||||
visible: !verticalBlur.visible
|
||||
|
||||
vertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp float expandX;
|
||||
uniform highp float expandY;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
|
||||
void main() {
|
||||
mediump vec2 texCoord = qt_MultiTexCoord0;
|
||||
texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
|
||||
texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
|
||||
qt_TexCoord0 = texCoord;
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
fragmentShader: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
void main() {
|
||||
gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: recursiveSource
|
||||
visible: false
|
||||
smooth: true
|
||||
hideSource: false
|
||||
live: false
|
||||
sourceItem: inputItem
|
||||
recursive: true
|
||||
onSourceItemChanged: scheduleUpdate()
|
||||
onScheduledUpdateCompleted: recursionTimer.nextFrame()
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: verticalBlur
|
||||
x: rootItem.transparentBorder ? -horizontalBlur.maximumRadius - 1 : 0
|
||||
y: rootItem.transparentBorder ? -horizontalBlur.maximumRadius - 1 : 0
|
||||
width: horizontalBlur.width + 2
|
||||
height: horizontalBlur.height + 2
|
||||
|
||||
horizontalStep: 0.0
|
||||
verticalStep: 1.0 / parent.height
|
||||
|
||||
source: ShaderEffectSource {
|
||||
sourceItem: horizontalBlur
|
||||
hideSource: true
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
deviation: (radius + 1) / 2.3333
|
||||
radius: rootItem.radius
|
||||
maximumRadius: Math.ceil(rootItem.radius)
|
||||
transparentBorder: false
|
||||
visible: loops > 0
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: horizontalBlur
|
||||
width: rootItem.transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
|
||||
height: rootItem.transparentBorder ? parent.height + 2 * maximumRadius + 2 : parent.height
|
||||
|
||||
horizontalStep: 1.0 / parent.width
|
||||
verticalStep: 0.0
|
||||
|
||||
source: recursiveSource
|
||||
deviation: (radius + 1) / 2.3333
|
||||
radius: rootItem.radius
|
||||
maximumRadius: Math.ceil(rootItem.radius)
|
||||
transparentBorder: false
|
||||
visible: false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype ThresholdMask
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-mask
|
||||
\brief Masks the source item with another item and applies a threshold
|
||||
value.
|
||||
|
||||
The masking behavior can be controlled with the \l threshold value for the
|
||||
mask pixels.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li MaskSource
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image ThresholdMask_mask.png
|
||||
\li \image ThresholdMask_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet ThresholdMask-example.qml example
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be masked.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the item that is going to be used as the mask.
|
||||
Mask item gets rendered into an intermediate pixel buffer and the alpha
|
||||
values from the result are used to determine the source item's pixels
|
||||
visibility in the display.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Original
|
||||
\li Mask
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image ThresholdMask_mask.png
|
||||
\li \image ThresholdMask_bug.png
|
||||
\endtable
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting maskSource to the effect's parent.
|
||||
*/
|
||||
property variant maskSource
|
||||
|
||||
/*!
|
||||
This property defines a threshold value for the mask pixels. The mask
|
||||
pixels that have an alpha value below this property are used to
|
||||
completely mask away the corresponding pixels from the source item. The
|
||||
mask pixels that have a higher alpha value are used to alphablend the
|
||||
source item to the display.
|
||||
|
||||
The value ranges from 0.0 (alpha value 0) to 1.0 (alpha value 255). By
|
||||
default, the property is set to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different threshold values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ThresholdMask_threshold1.png
|
||||
\li \image ThresholdMask_threshold2.png
|
||||
\li \image ThresholdMask_threshold3.png
|
||||
\row
|
||||
\li \b { threshold: 0.0 }
|
||||
\li \b { threshold: 0.5 }
|
||||
\li \b { threshold: 0.7 }
|
||||
\row
|
||||
\li \l spread: 0.2
|
||||
\li \l spread: 0.2
|
||||
\li \l spread: 0.2
|
||||
\endtable
|
||||
*/
|
||||
property real threshold: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the smoothness of the mask edges near the
|
||||
\l{ThresholdMask::threshold}{threshold} alpha value. Setting spread to
|
||||
0.0 uses mask normally with the specified threshold. Setting higher
|
||||
spread values softens the transition from the transparent mask pixels
|
||||
towards opaque mask pixels by adding interpolated values between them.
|
||||
|
||||
The value ranges from 0.0 (sharp mask edge) to 1.0 (smooth mask edge).
|
||||
By default, the property is set to \c 0.0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different spread values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ThresholdMask_spread1.png
|
||||
\li \image ThresholdMask_spread2.png
|
||||
\li \image ThresholdMask_spread3.png
|
||||
\row
|
||||
\li \b { spread: 0.0 }
|
||||
\li \b { spread: 0.2 }
|
||||
\li \b { spread: 0.8 }
|
||||
\row
|
||||
\li \l threshold: 0.4
|
||||
\li \l threshold: 0.4
|
||||
\li \l threshold: 0.4
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real spread: 0.0
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.maskSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: parent
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
property real threshold: rootItem.threshold
|
||||
property real spread: rootItem.spread
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp sampler2D maskSource;
|
||||
uniform highp float threshold;
|
||||
uniform highp float spread;
|
||||
void main(void) {
|
||||
lowp vec4 colorFragment = texture2D(source, qt_TexCoord0.st);
|
||||
lowp vec4 maskFragment = texture2D(maskSource, qt_TexCoord0.st);
|
||||
gl_FragColor = colorFragment * smoothstep(threshold * (1.0 + spread) - spread, threshold * (1.0 + spread), maskFragment.a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,302 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
/*!
|
||||
\qmltype ZoomBlur
|
||||
\inqmlmodule QtGraphicalEffects
|
||||
\since QtGraphicalEffects 1.0
|
||||
\inherits QtQuick2::Item
|
||||
\ingroup qtgraphicaleffects-motion-blur
|
||||
\brief Applies directional blur effect towards source items center point.
|
||||
|
||||
Effect creates perceived impression that the source item appears to be
|
||||
moving towards the center point in Z-direction or that the camera appears
|
||||
to be zooming rapidly. Other available motion blur effects are
|
||||
\l{QtGraphicalEffects::DirectionalBlur}{DirectionalBlur}
|
||||
and \l{QtGraphicalEffects::RadialBlur}{RadialBlur}.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Source
|
||||
\li Effect applied
|
||||
\row
|
||||
\li \image Original_bug.png
|
||||
\li \image ZoomBlur_bug.png
|
||||
\endtable
|
||||
|
||||
\section1 Example
|
||||
|
||||
The following example shows how to apply the effect.
|
||||
\snippet ZoomBlur-example.qml example
|
||||
|
||||
*/
|
||||
Item {
|
||||
id: rootItem
|
||||
|
||||
/*!
|
||||
This property defines the source item that is going to be blurred.
|
||||
|
||||
\note It is not supported to let the effect include itself, for
|
||||
instance by setting source to the effect's parent.
|
||||
*/
|
||||
property variant source
|
||||
|
||||
/*!
|
||||
This property defines the maximum perceived amount of movement for each
|
||||
pixel. The amount is smaller near the center and reaches the specified
|
||||
value at the edges.
|
||||
|
||||
The quality of the blur depends on \l{ZoomBlur::samples}{samples}
|
||||
property. If length value is large, more samples are needed to keep the
|
||||
visual quality at high level.
|
||||
|
||||
The value ranges from 0.0 to inf. By default the property is set to \c
|
||||
0.0 (no blur).
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different length values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ZoomBlur_length1.png
|
||||
\li \image ZoomBlur_length2.png
|
||||
\li \image ZoomBlur_length3.png
|
||||
\row
|
||||
\li \b { length: 0.0 }
|
||||
\li \b { length: 32.0 }
|
||||
\li \b { length: 48.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\li \l horizontalOffset: 0
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
|
||||
*/
|
||||
property real length: 0.0
|
||||
|
||||
/*!
|
||||
This property defines how many samples are taken per pixel when blur
|
||||
calculation is done. Larger value produces better quality, but is slower
|
||||
to render.
|
||||
|
||||
This property is not intended to be animated. Changing this property may
|
||||
cause the underlying OpenGL shaders to be recompiled.
|
||||
|
||||
Allowed values are between 0 and inf (practical maximum depends on GPU).
|
||||
By default the property is set to \c 0 (no samples).
|
||||
|
||||
*/
|
||||
property int samples: 0
|
||||
|
||||
/*!
|
||||
\qmlproperty real QtGraphicalEffects::ZoomBlur::horizontalOffset
|
||||
\qmlproperty real QtGraphicalEffects::ZoomBlur::verticalOffset
|
||||
|
||||
These properties define an offset in pixels for the blur direction
|
||||
center point.
|
||||
|
||||
The values range from -inf to inf. By default these properties are set
|
||||
to \c 0.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Output examples with different horizontalOffset values
|
||||
\li
|
||||
\li
|
||||
\row
|
||||
\li \image ZoomBlur_horizontalOffset1.png
|
||||
\li \image ZoomBlur_horizontalOffset2.png
|
||||
\li \image ZoomBlur_horizontalOffset3.png
|
||||
\row
|
||||
\li \b { horizontalOffset: 100.0 }
|
||||
\li \b { horizontalOffset: 0.0 }
|
||||
\li \b { horizontalOffset: -100.0 }
|
||||
\row
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\li \l samples: 24
|
||||
\row
|
||||
\li \l length: 32
|
||||
\li \l length: 32
|
||||
\li \l length: 32
|
||||
\row
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\li \l verticalOffset: 0
|
||||
\endtable
|
||||
*/
|
||||
property real horizontalOffset: 0.0
|
||||
property real verticalOffset: 0.0
|
||||
|
||||
/*!
|
||||
This property defines the blur behavior near the edges of the item,
|
||||
where the pixel blurring is affected by the pixels outside the source
|
||||
edges.
|
||||
|
||||
If the property is set to \c true, the pixels outside the source are
|
||||
interpreted to be transparent, which is similar to OpenGL
|
||||
clamp-to-border extension. The blur is expanded slightly outside the
|
||||
effect item area.
|
||||
|
||||
If the property is set to \c false, the pixels outside the source are
|
||||
interpreted to contain the same color as the pixels at the edge of the
|
||||
item, which is similar to OpenGL clamp-to-edge behavior. The blur does
|
||||
not expand outside the effect item area.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
|
||||
*/
|
||||
property bool transparentBorder: false
|
||||
|
||||
/*!
|
||||
This property allows the effect output pixels to be cached in order to
|
||||
improve the rendering performance.
|
||||
|
||||
Every time the source or effect properties are changed, the pixels in
|
||||
the cache must be updated. Memory consumption is increased, because an
|
||||
extra buffer of memory is required for storing the effect output.
|
||||
|
||||
It is recommended to disable the cache when the source or the effect
|
||||
properties are animated.
|
||||
|
||||
By default, the property is set to \c false.
|
||||
*/
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property variant center: Qt.point(0.5 + rootItem.horizontalOffset / width, 0.5 + rootItem.verticalOffset / height)
|
||||
property real len: rootItem.length
|
||||
property bool transparentBorder: rootItem.transparentBorder
|
||||
property real samples: rootItem.samples
|
||||
property real weight: 1.0 / Math.max(1.0, rootItem.samples)
|
||||
property variant expandPixels: transparentBorder ? Qt.size(rootItem.samples, rootItem.samples) : Qt.size(0,0)
|
||||
property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
|
||||
property variant delta: Qt.size(1.0 / rootItem.width, 1.0 / rootItem.height)
|
||||
|
||||
x: transparentBorder ? -expandPixels.width - 1 : 0
|
||||
y: transparentBorder ? -expandPixels.height - 1 : 0
|
||||
width: transparentBorder ? parent.width + 2.0 * expandPixels.width + 2 : parent.width
|
||||
height: transparentBorder ? parent.height + 2.0 * expandPixels.height + 2 : parent.height
|
||||
|
||||
property string fragmentShaderSkeleton: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp float len;
|
||||
uniform highp float weight;
|
||||
uniform highp float samples;
|
||||
uniform highp vec2 center;
|
||||
uniform highp vec2 expand;
|
||||
uniform highp vec2 delta;
|
||||
|
||||
void main(void) {
|
||||
mediump vec2 texCoord = qt_TexCoord0;
|
||||
mediump vec2 centerCoord = center;
|
||||
|
||||
PLACEHOLDER_EXPAND_STEPS
|
||||
|
||||
highp vec2 dir = vec2(centerCoord.x - texCoord.s, centerCoord.y - texCoord.t);
|
||||
dir /= max(1.0, length(dir) * 2.0);
|
||||
highp vec2 shift = delta * len * dir * 2.0 / max(1.0, samples - 1.0);
|
||||
gl_FragColor = vec4(0.0);
|
||||
|
||||
PLACEHOLDER_UNROLLED_LOOP
|
||||
|
||||
gl_FragColor *= weight * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
function buildFragmentShader() {
|
||||
var shader = fragmentShaderSkeleton
|
||||
var expandSteps = ""
|
||||
|
||||
if (transparentBorder) {
|
||||
expandSteps += "centerCoord = (centerCoord - expand) / (1.0 - 2.0 * expand);"
|
||||
expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
|
||||
}
|
||||
|
||||
var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
|
||||
|
||||
if (rootItem.samples > 1) {
|
||||
unrolledLoop = ""
|
||||
for (var i = 0; i < rootItem.samples; i++)
|
||||
unrolledLoop += "gl_FragColor += texture2D(source, texCoord); texCoord += shift;\n"
|
||||
}
|
||||
|
||||
shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
|
||||
fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
|
||||
}
|
||||
|
||||
onFragmentShaderChanged: sourceChanged()
|
||||
onSamplesChanged: buildFragmentShader()
|
||||
onTransparentBorderChanged: buildFragmentShader()
|
||||
Component.onCompleted: buildFragmentShader()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
property variant source
|
||||
property real radius: Math.floor(samples / 2)
|
||||
property int samples: 9
|
||||
property color color: "black"
|
||||
property real horizontalOffset: 0
|
||||
property real verticalOffset: 0
|
||||
property real spread: 0.0
|
||||
property bool cached: false
|
||||
property bool transparentBorder: true
|
||||
|
||||
GaussianBlur {
|
||||
id: blur
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
x: Math.round(horizontalOffset)
|
||||
y: Math.round(verticalOffset)
|
||||
source: root.source
|
||||
radius: root.radius
|
||||
samples: root.samples
|
||||
_thickness: root.spread
|
||||
transparentBorder: root.transparentBorder
|
||||
|
||||
|
||||
_color: root.color;
|
||||
_alphaOnly: true
|
||||
// ignoreDevicePixelRatio: root.ignoreDevicePixelRatio
|
||||
|
||||
ShaderEffect {
|
||||
x: blur._outputRect.x - parent.x
|
||||
y: blur._outputRect.y - parent.y
|
||||
width: transparentBorder ? blur._outputRect.width : blur.width
|
||||
height: transparentBorder ? blur._outputRect.height : blur.height
|
||||
property variant source: blur._output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
x: -blur._kernelRadius + horizontalOffset
|
||||
y: -blur._kernelRadius + verticalOffset
|
||||
width: blur.width + 2 * blur._kernelRadius
|
||||
height: blur.height + 2 * blur._kernelRadius
|
||||
visible: root.cached
|
||||
smooth: true
|
||||
sourceRect: Qt.rect(-blur._kernelRadius, -blur._kernelRadius, width, height);
|
||||
sourceItem: blur
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,394 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property real spread: 0.0
|
||||
property real blur: 0.0
|
||||
property color color: "white"
|
||||
property bool transparentBorder: false
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
property string __internalBlurVertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp float yStep;
|
||||
uniform highp float xStep;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
|
||||
qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
|
||||
qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
|
||||
qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
property string __internalBlurFragmentShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
highp vec4 sourceColor = (texture2D(source, qt_TexCoord0) +
|
||||
texture2D(source, qt_TexCoord1) +
|
||||
texture2D(source, qt_TexCoord2) +
|
||||
texture2D(source, qt_TexCoord3)) * 0.25;
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
ShaderEffect {
|
||||
id: level0
|
||||
property variant source: sourceProxy.output
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level1
|
||||
width: Math.ceil(shaderItem.width / 32) * 32
|
||||
height: Math.ceil(shaderItem.height / 32) * 32
|
||||
sourceItem: level0
|
||||
hideSource: rootItem.visible
|
||||
sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0,0,0,0)
|
||||
smooth: true
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect1
|
||||
property variant source: level1
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level2
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level2
|
||||
width: level1.width / 2
|
||||
height: level1.height / 2
|
||||
sourceItem: effect1
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect2
|
||||
property variant source: level2
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level3
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level3
|
||||
width: level2.width / 2
|
||||
height: level2.height / 2
|
||||
sourceItem: effect2
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect3
|
||||
property variant source: level3
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level4
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level4
|
||||
width: level3.width / 2
|
||||
height: level3.height / 2
|
||||
sourceItem: effect3
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect4
|
||||
property variant source: level4
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level5
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level5
|
||||
width: level4.width / 2
|
||||
height: level4.height / 2
|
||||
sourceItem: effect4
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect5
|
||||
property variant source: level5
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level6
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level6
|
||||
width: level5.width / 2
|
||||
height: level5.height / 2
|
||||
sourceItem: effect5
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
Item {
|
||||
id: dummysource
|
||||
width: 1
|
||||
height: 1
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: dummy
|
||||
width: 1
|
||||
height: 1
|
||||
sourceItem: dummysource
|
||||
visible: false
|
||||
smooth: false
|
||||
live: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
x: transparentBorder ? -64 : 0
|
||||
y: transparentBorder ? -64 : 0
|
||||
width: transparentBorder ? parent.width + 128 : parent.width
|
||||
height: transparentBorder ? parent.height + 128 : parent.height
|
||||
|
||||
property variant source1: level1
|
||||
property variant source2: level2
|
||||
property variant source3: level3
|
||||
property variant source4: level4
|
||||
property variant source5: level5
|
||||
property variant source6: level6
|
||||
property real lod: rootItem.blur
|
||||
|
||||
property real weight1;
|
||||
property real weight2;
|
||||
property real weight3;
|
||||
property real weight4;
|
||||
property real weight5;
|
||||
property real weight6;
|
||||
|
||||
property real spread: 1.0 - (rootItem.spread * 0.98)
|
||||
property alias color: rootItem.color
|
||||
|
||||
function weight(v) {
|
||||
if (v <= 0.0)
|
||||
return 1
|
||||
if (v >= 0.5)
|
||||
return 0
|
||||
|
||||
return 1.0 - v / 0.5
|
||||
}
|
||||
|
||||
function calculateWeights() {
|
||||
|
||||
var w1 = weight(Math.abs(lod - 0.100))
|
||||
var w2 = weight(Math.abs(lod - 0.300))
|
||||
var w3 = weight(Math.abs(lod - 0.500))
|
||||
var w4 = weight(Math.abs(lod - 0.700))
|
||||
var w5 = weight(Math.abs(lod - 0.900))
|
||||
var w6 = weight(Math.abs(lod - 1.100))
|
||||
|
||||
var sum = w1 + w2 + w3 + w4 + w5 + w6;
|
||||
weight1 = w1 / sum;
|
||||
weight2 = w2 / sum;
|
||||
weight3 = w3 / sum;
|
||||
weight4 = w4 / sum;
|
||||
weight5 = w5 / sum;
|
||||
weight6 = w6 / sum;
|
||||
|
||||
upateSources()
|
||||
}
|
||||
|
||||
function upateSources() {
|
||||
var sources = new Array();
|
||||
var weights = new Array();
|
||||
|
||||
if (weight1 > 0) {
|
||||
sources.push(level1)
|
||||
weights.push(weight1)
|
||||
}
|
||||
|
||||
if (weight2 > 0) {
|
||||
sources.push(level2)
|
||||
weights.push(weight2)
|
||||
}
|
||||
|
||||
if (weight3 > 0) {
|
||||
sources.push(level3)
|
||||
weights.push(weight3)
|
||||
}
|
||||
|
||||
if (weight4 > 0) {
|
||||
sources.push(level4)
|
||||
weights.push(weight4)
|
||||
}
|
||||
|
||||
if (weight5 > 0) {
|
||||
sources.push(level5)
|
||||
weights.push(weight5)
|
||||
}
|
||||
|
||||
if (weight6 > 0) {
|
||||
sources.push(level6)
|
||||
weights.push(weight6)
|
||||
}
|
||||
|
||||
for (var j = sources.length; j < 6; j++) {
|
||||
sources.push(dummy)
|
||||
weights.push(0.0)
|
||||
}
|
||||
|
||||
source1 = sources[0]
|
||||
source2 = sources[1]
|
||||
source3 = sources[2]
|
||||
source4 = sources[3]
|
||||
source5 = sources[4]
|
||||
source6 = sources[5]
|
||||
|
||||
weight1 = weights[0]
|
||||
weight2 = weights[1]
|
||||
weight3 = weights[2]
|
||||
weight4 = weights[3]
|
||||
weight5 = weights[4]
|
||||
weight6 = weights[5]
|
||||
}
|
||||
|
||||
Component.onCompleted: calculateWeights()
|
||||
|
||||
onLodChanged: calculateWeights()
|
||||
|
||||
fragmentShader: "
|
||||
uniform lowp sampler2D source1;
|
||||
uniform lowp sampler2D source2;
|
||||
uniform lowp sampler2D source3;
|
||||
uniform lowp sampler2D source4;
|
||||
uniform lowp sampler2D source5;
|
||||
uniform mediump float weight1;
|
||||
uniform mediump float weight2;
|
||||
uniform mediump float weight3;
|
||||
uniform mediump float weight4;
|
||||
uniform mediump float weight5;
|
||||
uniform highp vec4 color;
|
||||
uniform highp float spread;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
|
||||
sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
|
||||
sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
|
||||
sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
|
||||
sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
|
||||
sourceColor = mix(vec4(0), color, linearstep(0.0, spread, sourceColor.a));
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,414 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property real blur: 0.0
|
||||
property real horizontalOffset: 0
|
||||
property real verticalOffset: 0
|
||||
property real spread: 0.0
|
||||
property color color: "black"
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
property string __internalBlurVertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp float yStep;
|
||||
uniform highp float xStep;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
|
||||
qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
|
||||
qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
|
||||
qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
property string __internalBlurFragmentShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
highp vec4 sourceColor = (texture2D(source, qt_TexCoord0) +
|
||||
texture2D(source, qt_TexCoord1) +
|
||||
texture2D(source, qt_TexCoord2) +
|
||||
texture2D(source, qt_TexCoord3)) * 0.25;
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
ShaderEffect {
|
||||
id: level0
|
||||
property variant source: sourceProxy.output
|
||||
property real horizontalOffset: rootItem.horizontalOffset / rootItem.width
|
||||
property real verticalOffset: rootItem.verticalOffset / rootItem.width
|
||||
property color color: rootItem.color
|
||||
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
smooth: true
|
||||
fragmentShader: "
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
uniform lowp float qt_Opacity;
|
||||
uniform highp sampler2D source;
|
||||
uniform lowp vec4 color;
|
||||
uniform highp float horizontalOffset;
|
||||
uniform highp float verticalOffset;
|
||||
|
||||
void main(void) {
|
||||
highp vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
|
||||
lowp float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
|
||||
lowp float eb = 1.0 - ea;
|
||||
gl_FragColor = (eb * color + ea * color * (1.0 - texture2D(source, pos).a)) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level1
|
||||
width: Math.ceil(shaderItem.width / 32) * 32
|
||||
height: Math.ceil(shaderItem.height / 32) * 32
|
||||
sourceItem: level0
|
||||
hideSource: rootItem.visible
|
||||
smooth: true
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect1
|
||||
property variant source: level1
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level2
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level2
|
||||
width: level1.width / 2
|
||||
height: level1.height / 2
|
||||
sourceItem: effect1
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect2
|
||||
property variant source: level2
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level3
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level3
|
||||
width: level2.width / 2
|
||||
height: level2.height / 2
|
||||
sourceItem: effect2
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect3
|
||||
property variant source: level3
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level4
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level4
|
||||
width: level3.width / 2
|
||||
height: level3.height / 2
|
||||
sourceItem: effect3
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect4
|
||||
property variant source: level4
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level5
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level5
|
||||
width: level4.width / 2
|
||||
height: level4.height / 2
|
||||
sourceItem: effect4
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect5
|
||||
property variant source: level5
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level6
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level6
|
||||
width: level5.width / 2
|
||||
height: level5.height / 2
|
||||
sourceItem: effect5
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
Item {
|
||||
id: dummysource
|
||||
width: 1
|
||||
height: 1
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: dummy
|
||||
width: 1
|
||||
height: 1
|
||||
sourceItem: dummysource
|
||||
visible: false
|
||||
smooth: false
|
||||
live: false
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
|
||||
property variant original: sourceProxy.output
|
||||
property variant source1: level1
|
||||
property variant source2: level2
|
||||
property variant source3: level3
|
||||
property variant source4: level4
|
||||
property variant source5: level5
|
||||
property variant source6: level6
|
||||
property real lod: rootItem.blur
|
||||
|
||||
property real weight1;
|
||||
property real weight2;
|
||||
property real weight3;
|
||||
property real weight4;
|
||||
property real weight5;
|
||||
property real weight6;
|
||||
|
||||
property real spread: 1.0 - (rootItem.spread * 0.98)
|
||||
property color color: rootItem.color
|
||||
|
||||
function weight(v) {
|
||||
if (v <= 0.0)
|
||||
return 1
|
||||
if (v >= 0.5)
|
||||
return 0
|
||||
|
||||
return 1.0 - v / 0.5
|
||||
}
|
||||
|
||||
function calculateWeights() {
|
||||
|
||||
var w1 = weight(Math.abs(lod - 0.100))
|
||||
var w2 = weight(Math.abs(lod - 0.300))
|
||||
var w3 = weight(Math.abs(lod - 0.500))
|
||||
var w4 = weight(Math.abs(lod - 0.700))
|
||||
var w5 = weight(Math.abs(lod - 0.900))
|
||||
var w6 = weight(Math.abs(lod - 1.100))
|
||||
|
||||
var sum = w1 + w2 + w3 + w4 + w5 + w6;
|
||||
weight1 = w1 / sum;
|
||||
weight2 = w2 / sum;
|
||||
weight3 = w3 / sum;
|
||||
weight4 = w4 / sum;
|
||||
weight5 = w5 / sum;
|
||||
weight6 = w6 / sum;
|
||||
|
||||
upateSources()
|
||||
}
|
||||
|
||||
function upateSources() {
|
||||
var sources = new Array();
|
||||
var weights = new Array();
|
||||
|
||||
if (weight1 > 0) {
|
||||
sources.push(level1)
|
||||
weights.push(weight1)
|
||||
}
|
||||
|
||||
if (weight2 > 0) {
|
||||
sources.push(level2)
|
||||
weights.push(weight2)
|
||||
}
|
||||
|
||||
if (weight3 > 0) {
|
||||
sources.push(level3)
|
||||
weights.push(weight3)
|
||||
}
|
||||
|
||||
if (weight4 > 0) {
|
||||
sources.push(level4)
|
||||
weights.push(weight4)
|
||||
}
|
||||
|
||||
if (weight5 > 0) {
|
||||
sources.push(level5)
|
||||
weights.push(weight5)
|
||||
}
|
||||
|
||||
if (weight6 > 0) {
|
||||
sources.push(level6)
|
||||
weights.push(weight6)
|
||||
}
|
||||
|
||||
for (var j = sources.length; j < 6; j++) {
|
||||
sources.push(dummy)
|
||||
weights.push(0.0)
|
||||
}
|
||||
|
||||
source1 = sources[0]
|
||||
source2 = sources[1]
|
||||
source3 = sources[2]
|
||||
source4 = sources[3]
|
||||
source5 = sources[4]
|
||||
source6 = sources[5]
|
||||
|
||||
weight1 = weights[0]
|
||||
weight2 = weights[1]
|
||||
weight3 = weights[2]
|
||||
weight4 = weights[3]
|
||||
weight5 = weights[4]
|
||||
weight6 = weights[5]
|
||||
}
|
||||
|
||||
Component.onCompleted: calculateWeights()
|
||||
|
||||
onLodChanged: calculateWeights()
|
||||
|
||||
fragmentShader: "
|
||||
uniform lowp sampler2D original;
|
||||
uniform lowp sampler2D source1;
|
||||
uniform lowp sampler2D source2;
|
||||
uniform lowp sampler2D source3;
|
||||
uniform lowp sampler2D source4;
|
||||
uniform lowp sampler2D source5;
|
||||
uniform mediump float weight1;
|
||||
uniform mediump float weight2;
|
||||
uniform mediump float weight3;
|
||||
uniform mediump float weight4;
|
||||
uniform mediump float weight5;
|
||||
uniform highp vec4 color;
|
||||
uniform highp float spread;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
lowp vec4 shadowColor = texture2D(source1, qt_TexCoord0) * weight1;
|
||||
shadowColor += texture2D(source2, qt_TexCoord0) * weight2;
|
||||
shadowColor += texture2D(source3, qt_TexCoord0) * weight3;
|
||||
shadowColor += texture2D(source4, qt_TexCoord0) * weight4;
|
||||
shadowColor += texture2D(source5, qt_TexCoord0) * weight5;
|
||||
lowp vec4 originalColor = texture2D(original, qt_TexCoord0);
|
||||
shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
|
||||
gl_FragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property variant maskSource
|
||||
property real blur: 0.0
|
||||
property bool transparentBorder: false
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.maskSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
smooth: rootItem.blur > 0
|
||||
}
|
||||
|
||||
property string __internalBlurVertexShader: "
|
||||
attribute highp vec4 qt_Vertex;
|
||||
attribute highp vec2 qt_MultiTexCoord0;
|
||||
uniform highp mat4 qt_Matrix;
|
||||
uniform highp float yStep;
|
||||
uniform highp float xStep;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
|
||||
qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
|
||||
qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
|
||||
qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
|
||||
gl_Position = qt_Matrix * qt_Vertex;
|
||||
}
|
||||
"
|
||||
|
||||
property string __internalBlurFragmentShader: "
|
||||
uniform lowp sampler2D source;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
varying highp vec2 qt_TexCoord1;
|
||||
varying highp vec2 qt_TexCoord2;
|
||||
varying highp vec2 qt_TexCoord3;
|
||||
|
||||
void main() {
|
||||
highp vec4 sourceColor = (texture2D(source, qt_TexCoord0) +
|
||||
texture2D(source, qt_TexCoord1) +
|
||||
texture2D(source, qt_TexCoord2) +
|
||||
texture2D(source, qt_TexCoord3)) * 0.25;
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
}
|
||||
"
|
||||
|
||||
ShaderEffect {
|
||||
id: mask0
|
||||
property variant source: maskSourceProxy.output
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: masklevel1
|
||||
width: Math.ceil(shaderItem.width / 32) * 32
|
||||
height: Math.ceil(shaderItem.height / 32) * 32
|
||||
sourceItem: mask0
|
||||
hideSource: rootItem.visible
|
||||
sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
|
||||
visible: false
|
||||
smooth: rootItem.blur > 0
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: level0
|
||||
property variant source: sourceProxy.output
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level1
|
||||
width: Math.ceil(shaderItem.width / 32) * 32
|
||||
height: Math.ceil(shaderItem.height / 32) * 32
|
||||
sourceItem: level0
|
||||
hideSource: rootItem.visible
|
||||
sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
|
||||
visible: false
|
||||
smooth: rootItem.blur > 0
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect1
|
||||
property variant source: level1
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level2
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level2
|
||||
width: level1.width / 2
|
||||
height: level1.height / 2
|
||||
sourceItem: effect1
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect2
|
||||
property variant source: level2
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level3
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level3
|
||||
width: level2.width / 2
|
||||
height: level2.height / 2
|
||||
sourceItem: effect2
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect3
|
||||
property variant source: level3
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level4
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level4
|
||||
width: level3.width / 2
|
||||
height: level3.height / 2
|
||||
sourceItem: effect3
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect4
|
||||
property variant source: level4
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level5
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level5
|
||||
width: level4.width / 2
|
||||
height: level4.height / 2
|
||||
sourceItem: effect4
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: effect5
|
||||
property variant source: level5
|
||||
property real yStep: 1/height
|
||||
property real xStep: 1/width
|
||||
anchors.fill: level6
|
||||
visible: false
|
||||
smooth: true
|
||||
vertexShader: __internalBlurVertexShader
|
||||
fragmentShader: __internalBlurFragmentShader
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: level6
|
||||
width: level5.width / 2
|
||||
height: level5.height / 2
|
||||
sourceItem: effect5
|
||||
hideSource: rootItem.visible
|
||||
visible: false
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant mask: masklevel1
|
||||
property variant source1: level1
|
||||
property variant source2: level2
|
||||
property variant source3: level3
|
||||
property variant source4: level4
|
||||
property variant source5: level5
|
||||
property variant source6: level6
|
||||
property real lod: Math.sqrt(rootItem.blur) * 1.2 - 0.2
|
||||
property real weight1
|
||||
property real weight2
|
||||
property real weight3
|
||||
property real weight4
|
||||
property real weight5
|
||||
property real weight6
|
||||
|
||||
x: transparentBorder ? -64 : 0
|
||||
y: transparentBorder ? -64 : 0
|
||||
width: transparentBorder ? parent.width + 128 : parent.width
|
||||
height: transparentBorder ? parent.height + 128 : parent.height
|
||||
|
||||
fragmentShader: "
|
||||
uniform lowp sampler2D mask;
|
||||
uniform lowp sampler2D source1;
|
||||
uniform lowp sampler2D source2;
|
||||
uniform lowp sampler2D source3;
|
||||
uniform lowp sampler2D source4;
|
||||
uniform lowp sampler2D source5;
|
||||
uniform lowp sampler2D source6;
|
||||
uniform lowp float lod;
|
||||
uniform lowp float qt_Opacity;
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
|
||||
mediump float weight(mediump float v) {
|
||||
if (v <= 0.0)
|
||||
return 1.0;
|
||||
|
||||
if (v >= 0.5)
|
||||
return 0.0;
|
||||
|
||||
return 1.0 - v * 2.0;
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
lowp vec4 maskColor = texture2D(mask, qt_TexCoord0);
|
||||
mediump float l = lod * maskColor.a;
|
||||
|
||||
mediump float w1 = weight(abs(l - 0.100));
|
||||
mediump float w2 = weight(abs(l - 0.300));
|
||||
mediump float w3 = weight(abs(l - 0.500));
|
||||
mediump float w4 = weight(abs(l - 0.700));
|
||||
mediump float w5 = weight(abs(l - 0.900));
|
||||
mediump float w6 = weight(abs(l - 1.100));
|
||||
|
||||
mediump float sum = w1 + w2 + w3 + w4 + w5 + w6;
|
||||
mediump float weight1 = w1 / sum;
|
||||
mediump float weight2 = w2 / sum;
|
||||
mediump float weight3 = w3 / sum;
|
||||
mediump float weight4 = w4 / sum;
|
||||
mediump float weight5 = w5 / sum;
|
||||
mediump float weight6 = w6 / sum;
|
||||
|
||||
lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
|
||||
sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
|
||||
sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
|
||||
sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
|
||||
sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
|
||||
sourceColor += texture2D(source6, qt_TexCoord0) * weight6;
|
||||
|
||||
gl_FragColor = sourceColor * qt_Opacity;
|
||||
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property real deviation: (radius + 1) / 3.3333
|
||||
property real radius: 0.0
|
||||
property int maximumRadius: 0
|
||||
property real horizontalStep: 0.0
|
||||
property real verticalStep: 0.0
|
||||
property bool transparentBorder: false
|
||||
property bool cached: false
|
||||
|
||||
property bool enableColor: false
|
||||
property color color: "white"
|
||||
property real spread: 0.0
|
||||
|
||||
property bool enableMask: false
|
||||
property variant maskSource
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.maskSource
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: rootItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
property variant source: sourceProxy.output
|
||||
property real deviation: Math.max(0.1, rootItem.deviation)
|
||||
property real radius: rootItem.radius
|
||||
property int maxRadius: rootItem.maximumRadius
|
||||
property bool transparentBorder: rootItem.transparentBorder
|
||||
property real gaussianSum: 0.0
|
||||
property real startIndex: 0.0
|
||||
property real deltaFactor: (2 * radius - 1) / (maxRadius * 2 - 1)
|
||||
property real expandX: transparentBorder && rootItem.horizontalStep > 0 ? maxRadius / width : 0.0
|
||||
property real expandY: transparentBorder && rootItem.verticalStep > 0 ? maxRadius / height : 0.0
|
||||
property variant gwts: []
|
||||
property variant delta: Qt.vector3d(rootItem.horizontalStep * deltaFactor, rootItem.verticalStep * deltaFactor, startIndex);
|
||||
property variant factor_0_2: Qt.vector3d(gwts[0], gwts[1], gwts[2]);
|
||||
property variant factor_3_5: Qt.vector3d(gwts[3], gwts[4], gwts[5]);
|
||||
property variant factor_6_8: Qt.vector3d(gwts[6], gwts[7], gwts[8]);
|
||||
property variant factor_9_11: Qt.vector3d(gwts[9], gwts[10], gwts[11]);
|
||||
property variant factor_12_14: Qt.vector3d(gwts[12], gwts[13], gwts[14]);
|
||||
property variant factor_15_17: Qt.vector3d(gwts[15], gwts[16], gwts[17]);
|
||||
property variant factor_18_20: Qt.vector3d(gwts[18], gwts[19], gwts[20]);
|
||||
property variant factor_21_23: Qt.vector3d(gwts[21], gwts[22], gwts[23]);
|
||||
property variant factor_24_26: Qt.vector3d(gwts[24], gwts[25], gwts[26]);
|
||||
property variant factor_27_29: Qt.vector3d(gwts[27], gwts[28], gwts[29]);
|
||||
property variant factor_30_31: Qt.point(gwts[30], gwts[31]);
|
||||
|
||||
property color color: rootItem.color
|
||||
property real spread: 1.0 - (rootItem.spread * 0.98)
|
||||
property variant maskSource: maskSourceProxy.output
|
||||
|
||||
anchors.fill: rootItem
|
||||
|
||||
function gausFunc(x){
|
||||
//Gaussian function = h(x):=(1/sqrt(2*3.14159*(D^2))) * %e^(-(x^2)/(2*(D^2)));
|
||||
return (1.0 / Math.sqrt(2 * Math.PI * (Math.pow(shaderItem.deviation, 2)))) * Math.pow(Math.E, -((Math.pow(x, 2)) / (2 * (Math.pow(shaderItem.deviation, 2)))));
|
||||
}
|
||||
|
||||
function updateGaussianWeights() {
|
||||
gaussianSum = 0.0;
|
||||
startIndex = -maxRadius + 0.5
|
||||
|
||||
var n = new Array(32);
|
||||
for (var j = 0; j < 32; j++)
|
||||
n[j] = 0;
|
||||
|
||||
var max = maxRadius * 2
|
||||
var delta = (2 * radius - 1) / (max - 1);
|
||||
for (var i = 0; i < max; i++) {
|
||||
n[i] = gausFunc(-radius + 0.5 + i * delta);
|
||||
gaussianSum += n[i];
|
||||
}
|
||||
|
||||
gwts = n;
|
||||
}
|
||||
|
||||
function buildFragmentShader() {
|
||||
|
||||
var shaderSteps = [
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_0_2.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_0_2.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_0_2.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_3_5.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_3_5.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_3_5.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_6_8.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_6_8.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_6_8.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_9_11.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_9_11.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_9_11.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_12_14.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_12_14.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_12_14.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_15_17.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_15_17.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_15_17.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_18_20.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_18_20.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_18_20.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_21_23.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_21_23.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_21_23.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_24_26.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_24_26.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_24_26.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_27_29.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_27_29.y; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_27_29.z; texCoord += shift;",
|
||||
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_30_31.x; texCoord += shift;",
|
||||
"gl_FragColor += texture2D(source, texCoord) * factor_30_31.y; texCoord += shift;"
|
||||
]
|
||||
|
||||
var shader = fragmentShaderBegin
|
||||
var samples = maxRadius * 2
|
||||
if (samples > 32) {
|
||||
console.log("DirectionalGaussianBlur.qml WARNING: Maximum of blur radius (16) exceeded!")
|
||||
samples = 32
|
||||
}
|
||||
|
||||
for (var i = 0; i < samples; i++) {
|
||||
shader += shaderSteps[i]
|
||||
}
|
||||
|
||||
shader += fragmentShaderEnd
|
||||
|
||||
var colorizeSteps = ""
|
||||
var colorizeUniforms = ""
|
||||
|
||||
var maskSteps = ""
|
||||
var maskUniforms = ""
|
||||
|
||||
if (enableColor) {
|
||||
colorizeSteps += "gl_FragColor = mix(vec4(0), color, clamp((gl_FragColor.a - 0.0) / (spread - 0.0), 0.0, 1.0));\n"
|
||||
colorizeUniforms += "uniform highp vec4 color;\n"
|
||||
colorizeUniforms += "uniform highp float spread;\n"
|
||||
}
|
||||
|
||||
if (enableMask) {
|
||||
maskSteps += "shift *= texture2D(maskSource, qt_TexCoord0).a;\n"
|
||||
maskUniforms += "uniform sampler2D maskSource;\n"
|
||||
}
|
||||
|
||||
shader = shader.replace("PLACEHOLDER_COLORIZE_STEPS", colorizeSteps)
|
||||
shader = shader.replace("PLACEHOLDER_COLORIZE_UNIFORMS", colorizeUniforms)
|
||||
shader = shader.replace("PLACEHOLDER_MASK_STEPS", maskSteps)
|
||||
shader = shader.replace("PLACEHOLDER_MASK_UNIFORMS", maskUniforms)
|
||||
|
||||
fragmentShader = shader
|
||||
}
|
||||
|
||||
onDeviationChanged: updateGaussianWeights()
|
||||
|
||||
onRadiusChanged: updateGaussianWeights()
|
||||
|
||||
onTransparentBorderChanged: {
|
||||
buildFragmentShader()
|
||||
updateGaussianWeights()
|
||||
}
|
||||
|
||||
onMaxRadiusChanged: {
|
||||
buildFragmentShader()
|
||||
updateGaussianWeights()
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
buildFragmentShader()
|
||||
updateGaussianWeights()
|
||||
}
|
||||
|
||||
property string fragmentShaderBegin: "
|
||||
varying mediump vec2 qt_TexCoord0;
|
||||
uniform highp float qt_Opacity;
|
||||
uniform lowp sampler2D source;
|
||||
uniform highp vec3 delta;
|
||||
uniform highp vec3 factor_0_2;
|
||||
uniform highp vec3 factor_3_5;
|
||||
uniform highp vec3 factor_6_8;
|
||||
uniform highp vec3 factor_9_11;
|
||||
uniform highp vec3 factor_12_14;
|
||||
uniform highp vec3 factor_15_17;
|
||||
uniform highp vec3 factor_18_20;
|
||||
uniform highp vec3 factor_21_23;
|
||||
uniform highp vec3 factor_24_26;
|
||||
uniform highp vec3 factor_27_29;
|
||||
uniform highp vec3 factor_30_31;
|
||||
uniform highp float gaussianSum;
|
||||
uniform highp float expandX;
|
||||
uniform highp float expandY;
|
||||
PLACEHOLDER_MASK_UNIFORMS
|
||||
PLACEHOLDER_COLORIZE_UNIFORMS
|
||||
|
||||
void main() {
|
||||
highp vec2 shift = vec2(delta.x, delta.y);
|
||||
|
||||
PLACEHOLDER_MASK_STEPS
|
||||
|
||||
highp float index = delta.z;
|
||||
mediump vec2 texCoord = qt_TexCoord0;
|
||||
texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
|
||||
texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
|
||||
texCoord += (shift * index);
|
||||
|
||||
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
"
|
||||
|
||||
property string fragmentShaderEnd: "
|
||||
|
||||
gl_FragColor /= gaussianSum;
|
||||
|
||||
PLACEHOLDER_COLORIZE_STEPS
|
||||
|
||||
gl_FragColor *= qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property real radius: 0.0
|
||||
property int maximumRadius: 0
|
||||
property real spread: 0.0
|
||||
property color color: "white"
|
||||
property bool cached: false
|
||||
property bool transparentBorder: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: shaderItem
|
||||
x: transparentBorder ? -maximumRadius - 1 : 0
|
||||
y: transparentBorder ? -maximumRadius - 1 : 0
|
||||
width: horizontalBlur.width
|
||||
height: horizontalBlur.height
|
||||
horizontalStep: 0.0
|
||||
verticalStep: 1.0 / parent.height
|
||||
source: horizontalBlur
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
transparentBorder: rootItem.transparentBorder
|
||||
enableColor: true
|
||||
color: rootItem.color
|
||||
spread: rootItem.spread
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: horizontalBlur
|
||||
width: transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
|
||||
height: transparentBorder ? parent.height + 2 * maximumRadius + 2 : parent.height
|
||||
horizontalStep: 1.0 / parent.width
|
||||
verticalStep: 0.0
|
||||
source: sourceProxy.output
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
transparentBorder: rootItem.transparentBorder
|
||||
visible: false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property real radius: 0.0
|
||||
property int maximumRadius: 0
|
||||
property real horizontalOffset: 0
|
||||
property real verticalOffset: 0
|
||||
property real spread: 0
|
||||
property color color: "black"
|
||||
property bool cached: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: shaderItem
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: shaderItem
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
ShaderEffect{
|
||||
id: shadowItem
|
||||
anchors.fill: parent
|
||||
|
||||
property variant original: sourceProxy.output
|
||||
property color color: rootItem.color
|
||||
property real horizontalOffset: rootItem.horizontalOffset / rootItem.width
|
||||
property real verticalOffset: rootItem.verticalOffset / rootItem.height
|
||||
|
||||
visible: false
|
||||
fragmentShader: "
|
||||
uniform highp sampler2D original;
|
||||
uniform lowp float qt_Opacity;
|
||||
uniform lowp vec4 color;
|
||||
uniform highp float horizontalOffset;
|
||||
uniform highp float verticalOffset;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
|
||||
void main(void) {
|
||||
highp vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
|
||||
lowp float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
|
||||
lowp float eb = 1.0 - ea;
|
||||
gl_FragColor = eb * color + ea * color * (1.0 - texture2D(original, pos).a) * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: blurItem
|
||||
anchors.fill: parent
|
||||
horizontalStep: 0.0
|
||||
verticalStep: 1.0 / parent.height
|
||||
source: horizontalBlur
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
visible: false
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: horizontalBlur
|
||||
width: transparentBorder ? parent.width + 2 * maximumRadius : parent.width
|
||||
height: parent.height
|
||||
horizontalStep: 1.0 / parent.width
|
||||
verticalStep: 0.0
|
||||
source: shadowItem
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
visible: false
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: blurredSource
|
||||
sourceItem: blurItem
|
||||
live: true
|
||||
smooth: true
|
||||
}
|
||||
|
||||
ShaderEffect {
|
||||
id: shaderItem
|
||||
anchors.fill: parent
|
||||
|
||||
property variant original: sourceProxy.output
|
||||
property variant shadow: blurredSource
|
||||
property real spread: 1.0 - (rootItem.spread * 0.98)
|
||||
property color color: rootItem.color
|
||||
|
||||
fragmentShader: "
|
||||
uniform highp sampler2D original;
|
||||
uniform highp sampler2D shadow;
|
||||
uniform lowp float qt_Opacity;
|
||||
uniform highp float spread;
|
||||
uniform lowp vec4 color;
|
||||
varying highp vec2 qt_TexCoord0;
|
||||
|
||||
highp float linearstep(highp float e0, highp float e1, highp float x) {
|
||||
return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
lowp vec4 originalColor = texture2D(original, qt_TexCoord0);
|
||||
lowp vec4 shadowColor = texture2D(shadow, qt_TexCoord0);
|
||||
shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
|
||||
gl_FragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
|
||||
}
|
||||
"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Graphical Effects module.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects.private 1.0
|
||||
|
||||
Item {
|
||||
id: rootItem
|
||||
property variant source
|
||||
property variant maskSource
|
||||
property real radius: 0.0
|
||||
property int maximumRadius: 0
|
||||
property bool cached: false
|
||||
property bool transparentBorder: false
|
||||
|
||||
SourceProxy {
|
||||
id: sourceProxy
|
||||
input: rootItem.source
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
SourceProxy {
|
||||
id: maskSourceProxy
|
||||
input: rootItem.maskSource
|
||||
sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: cacheItem
|
||||
anchors.fill: blur
|
||||
visible: rootItem.cached
|
||||
smooth: true
|
||||
sourceItem: blur
|
||||
live: true
|
||||
hideSource: visible
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: blur
|
||||
x: transparentBorder ? -maximumRadius - 1: 0
|
||||
y: transparentBorder ? -maximumRadius - 1: 0
|
||||
width: horizontalBlur.width
|
||||
height: horizontalBlur.height
|
||||
horizontalStep: 0.0
|
||||
verticalStep: 1.0 / parent.height
|
||||
source: horizontalBlur
|
||||
enableMask: true
|
||||
maskSource: maskSourceProxy.output
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
transparentBorder: rootItem.transparentBorder
|
||||
}
|
||||
|
||||
GaussianDirectionalBlur {
|
||||
id: horizontalBlur
|
||||
width: transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
|
||||
height: transparentBorder ? parent.height + 2 * maximumRadius + 2 : parent.height
|
||||
horizontalStep: 1.0 / parent.width
|
||||
verticalStep: 0.0
|
||||
source: sourceProxy.output
|
||||
enableMask: true
|
||||
maskSource: maskSourceProxy.output
|
||||
radius: rootItem.radius
|
||||
maximumRadius: rootItem.maximumRadius
|
||||
transparentBorder: rootItem.transparentBorder
|
||||
visible: false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
module QtGraphicalEffects.private
|
||||
plugin qtgraphicaleffectsprivate
|
||||
classname QtGraphicalEffectsPrivatePlugin
|
||||
FastGlow 1.0 FastGlow.qml
|
||||
FastInnerShadow 1.0 FastInnerShadow.qml
|
||||
FastMaskedBlur 1.0 FastMaskedBlur.qml
|
||||
GaussianDirectionalBlur 1.0 GaussianDirectionalBlur.qml
|
||||
GaussianGlow 1.0 GaussianGlow.qml
|
||||
GaussianInnerShadow 1.0 GaussianInnerShadow.qml
|
||||
GaussianMaskedBlur 1.0 GaussianMaskedBlur.qml
|
||||
DropShadowBase 1.0 DropShadowBase.qml
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user