Warning, /maui/mauikit/src/controls.6/GalleryRollTemplate.qml is written in an unsupported language. File is not indexed.

0001 import QtQuick
0002 import QtQuick.Controls
0003 
0004 import org.mauikit.controls 1.3 as Maui
0005 import Qt5Compat.GraphicalEffects
0006 
0007 /**
0008  * @inherit ShadowedRectangle
0009  * @brief A template control to display images in a carousel form. This element is use with the GalleryRollItem to display the images, so consider using that control instead of this one.
0010  * 
0011  * This control inherits all properties from the MauiKit ShadowedRectangle control. Thus, the corners radius can be modified individually, and a drop shadow can be added, using the `corners` and `shadow` properties respectively.
0012  * 
0013  * The transition of the images can be set as vertical or horizontal using the `orientation` property, and the transition time is picked randomly.
0014  * @see orientation 
0015  * 
0016  * @note If not images are set, then the area is filled with a solid color block. This color can be changed using the `color` property. 
0017  */
0018 Maui.ShadowedRectangle
0019 {
0020     id: control
0021     
0022     color: "#333"
0023     
0024     /**
0025      * @brief Whether the images in the carousel can be flicked with touch gestures.
0026      * @property bool GalleryRollTemplate::interactive
0027      */
0028     property alias interactive : _featuredRoll.interactive
0029     
0030     /**
0031      * @brief The orientation of the transition of the images.
0032      * By default this is set to `ListView.Horizontal`.
0033      * The possible values are:
0034      * - ListView.Horizontal
0035      * - ListView.Vertical
0036      * @property enum GalleryRollTemplate::orientation.
0037      */
0038     property alias orientation : _featuredRoll.orientation
0039     
0040     /**
0041      * @brief Whether the images should be saved in cache memory to save loading time.
0042      * By default this is set to `true`.
0043      */
0044     property bool cache : true
0045     
0046     /**
0047      * @brief A callback function to manage what image is positioned. This callback function is called for each image source set in the model `images`, so the final source can be modified. This function should return a - new or modified - image source URL.   
0048      *
0049      * As an example, if the `images` model looks like: `["page1", "page2", "page3"]` - which are not file URLs, this callback function can be use to map each individual source to an actual file URL. 
0050      * @code
0051      * images: ["page1", "page2", "page3"]
0052      * cb : (source) => 
0053      * {
0054      *   return mapSourceToImageFile(source) //here the "page1" could be mapped to "file:///some/path/to/image1.jpg" and return this new source to be use.
0055      * }    
0056      * @endcode
0057      */
0058     property var cb
0059     
0060     /**
0061      * @brief A list of images to be used. This will be use as the model.
0062      */
0063     property var images : []
0064     
0065     /**
0066      * @brief The border radius of the images.
0067      * By default this is set to `0`.
0068      */
0069     radius : 0
0070     
0071     /**
0072      * @brief The fill mode of the images. To see possible values refer to the QQC2 Image documentation form Qt.
0073      * By default this is set to `Image.PreserveAspectCrop`.
0074      */
0075     property int fillMode: Image.PreserveAspectCrop
0076     
0077     /**
0078      * @brief Checks and sets whether the transition animation is running or not.
0079      * @property bool GalleryRollTemplate::running
0080      */
0081     property alias running: _featuredTimer.running
0082     
0083     /**
0084      * @brief Sets the painted width size of the image. 
0085      * @note If the image has a big resolution it will take longer to load, so make it faster set this property to a lower value.
0086      * 
0087      * By default this is set to `-1`, which means that the image will be painted using the full image resolution.
0088      * This is the same as setting the QQC2 Image `sourceSize.width` property.
0089      */
0090     property int imageWidth : -1
0091     
0092     /**
0093      * @brief Sets the painted height size of the image. 
0094      * @note If the image has a big resolution it will take longer to load, so make it faster set this property to a lower value.
0095      * 
0096      * By default this is set to `-1`, which means that the image will be painted using the full image resolution.
0097      * This is the same as setting the QQC2 Image `sourceSize.height` property.
0098      */
0099     property int imageHeight : -1
0100     
0101     corners
0102     {
0103         topLeftRadius: control.radius
0104         topRightRadius: control.radius
0105         bottomLeftRadius: control.radius
0106         bottomRightRadius: control.radius
0107     }
0108     
0109     ListView
0110     {
0111         id: _featuredRoll
0112         anchors.fill: parent
0113         
0114         interactive: false
0115         orientation: Qt.Horizontal
0116         snapMode: ListView.SnapOneItem
0117         clip: true
0118         
0119         boundsBehavior: Flickable.StopAtBounds
0120         boundsMovement: Flickable.StopAtBounds
0121         
0122         model: control.images
0123         
0124         Component.onCompleted: _featuredTimer.start()
0125         
0126         Timer
0127         {
0128             id: _featuredTimer
0129             interval: _featuredRoll.randomInteger(6000, 8000)
0130             repeat: true
0131             onTriggered: _featuredRoll.cycleSlideForward()
0132         }
0133         
0134         function cycleSlideForward()
0135         {
0136             if(_featuredRoll.dragging)
0137             {
0138                 return
0139             }
0140             
0141             if (_featuredRoll.currentIndex === _featuredRoll.count - 1)
0142             {
0143                 _featuredRoll.currentIndex = 0
0144             } else
0145             {
0146                 _featuredRoll.incrementCurrentIndex()
0147             }
0148             _featuredTimer.restart()
0149         }
0150         
0151         function cycleSlideBackward()
0152         {
0153             if(_featuredRoll.dragging)
0154             {
0155                 return
0156             }
0157             
0158             if (_featuredRoll.currentIndex === 0)
0159             {
0160                 _featuredRoll.currentIndex = _featuredRoll.count - 1;
0161             } else
0162             {
0163                 _featuredRoll.decrementCurrentIndex();
0164             }
0165             
0166             _featuredTimer.restart()
0167         }        
0168         
0169         function randomInteger(min, max)
0170         {
0171             return Math.floor(Math.random() * (max - min + 1)) + min;
0172         }
0173         
0174         delegate: Item
0175         {
0176             width: ListView.view.width
0177             height: ListView.view.height
0178             
0179             Image
0180             {
0181                 anchors.fill: parent
0182                 sourceSize.width: (control.imageWidth > -1 ? control.imageWidth : control.width) * 1.5
0183                 sourceSize.height:  (control.imageHeight > -1 ? control.imageHeight : control.height)  * 1.5
0184                 asynchronous: true
0185                 smooth: true
0186                 cache: control.cache
0187                 source: control.cb ? control.cb(modelData) : modelData
0188                 fillMode: control.fillMode
0189             }
0190             
0191             Behavior on height
0192             {
0193                 NumberAnimation
0194                 {
0195                     duration: Maui.Style.units.shortDuration
0196                     easing.type: Easing.InOutQuad
0197                 }
0198             }
0199         }
0200         
0201         layer.enabled: control.radius
0202         layer.effect: OpacityMask
0203         {
0204             maskSource: Maui.ShadowedRectangle
0205             {
0206                 width: control.width
0207                 height: control.height
0208                 
0209                 corners
0210                 {
0211                     topLeftRadius: control.corners.topLeftRadius
0212                     topRightRadius: control.corners.topRightRadius
0213                     bottomLeftRadius: control.corners.bottomLeftRadius
0214                     bottomRightRadius: control.corners.bottomRightRadius
0215                 }
0216             }
0217         }
0218     }
0219 }