Warning, /maui/mauikit/src/controls.6/CollageItem.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick
0002 import QtQuick.Controls
0003 import QtQuick.Layouts
0004
0005 import Qt5Compat.GraphicalEffects
0006
0007 import org.mauikit.controls 1.3 as Maui
0008
0009 /**
0010 * @inherit GridBrowserDelegate
0011 * @since org.mauikit.controls 1.0
0012 * @brief A custom item to be used as a delegate in the browsing views or as a standalone card. This element presents a group of images in a vignette-form.
0013 *
0014 * This control inherits all properties from the MauiKit GridBrowserDelegate control.
0015 *
0016 * @image html Delegates/collageitem.png "As delegate with a vary number of images"
0017 * @code
0018 * Maui.GridBrowser
0019 * {
0020 * anchors.fill: parent
0021 * model: 30
0022 *
0023 * itemSize: 200
0024 *
0025 * delegate: Item
0026 * {
0027 * width: GridView.view.cellWidth
0028 * height: GridView.view.cellHeight
0029 *
0030 * Maui.CollageItem
0031 * {
0032 * anchors.fill: parent
0033 * anchors.margins: Maui.Style.space.small
0034 *
0035 * label1.text: "Demo"
0036 * label2.text: index
0037 * images: index %2 === 0 ? ['/home/camiloh/Downloads/street-1234360.jpg', '/home/camiloh/Downloads/flat-coated-retriever-1339154.jpg', '/home/camiloh/Downloads/5911329.jpeg'] : ['/home/camiloh/Downloads/street-1234360.jpg', '/home/camiloh/Downloads/flat-coated-retriever-1339154.jpg', '/home/camiloh/Downloads/5911329.jpeg', '/home/camiloh/Pictures/LastLights_by_Mushcube/LastLightsScreenPreview.png']
0038 * }
0039 * }
0040 * }
0041 * @endcode
0042 *
0043 * <a href="https://invent.kde.org/maui/mauikit/-/blob/qt6-2/examples/CollageItem.qml">You can find a more complete example at this link.</a>
0044 *
0045 */
0046 Maui.GridBrowserDelegate
0047 {
0048 id: control
0049
0050 maskRadius: radius
0051
0052 fillMode: Image.PreserveAspectCrop
0053
0054 /**
0055 * @brief A list of images to be used. The maximum value that should be displayed is 4.
0056 */
0057 property var images : []
0058
0059 /**
0060 * @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.
0061 *
0062 * 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.
0063 * @code
0064 * images: ["page1", "page2", "page3"]
0065 * cb : (source) =>
0066 * {
0067 * return mapSourceToImageFile(source) //here the "page1" could be mapped to "file:///some/path/to/image1.jpg" and return this new source to be use.
0068 * }
0069 * @endcode
0070 */
0071 property var cb
0072
0073 label1.font.weight: Font.DemiBold
0074 label1.font.pointSize: Maui.Style.fontSizes.big
0075
0076 template.labelSizeHint: 32
0077 template.alignment: Qt.AlignLeft
0078
0079 template.iconComponent: Item
0080 {
0081 id: _collageLayout
0082
0083 Loader
0084 {
0085 asynchronous: true
0086 anchors.fill: parent
0087
0088 sourceComponent: GridLayout
0089 {
0090 columns: 3
0091 rows: 2
0092 columnSpacing: 2
0093 rowSpacing: 2
0094
0095 Repeater
0096 {
0097 id: _repeater
0098 model: control.images
0099
0100 delegate: Rectangle
0101 {
0102 Layout.fillHeight: true
0103 Layout.fillWidth: true
0104 Layout.maximumHeight: index === 0 ? control.height : control.height * 0.3
0105 Layout.columnSpan: spanColumn(index, _repeater.count)
0106 Layout.rowSpan: 1
0107 color: Qt.rgba(0,0,0,0.3)
0108
0109 Image
0110 {
0111 anchors.fill: parent
0112 sourceSize.width: control.imageWidth >= 0 ? control.imageWidth : width
0113 sourceSize.height: control.imageHeight >= 0 ? control.imageHeight : height
0114 cache: true
0115 asynchronous: true
0116 source: control.cb ? control.cb(modelData) : modelData
0117 fillMode: control.fillMode
0118 }
0119 }
0120 }
0121
0122 layer.enabled: control.maskRadius
0123 layer.effect: OpacityMask
0124 {
0125 maskSource: Rectangle
0126 {
0127 width: _collageLayout.width
0128 height: _collageLayout.height
0129 radius: control.maskRadius
0130 }
0131 }
0132 }
0133 }
0134
0135 function randomHexColor()
0136 {
0137 var color = '#', i = 5;
0138 do{ color += "0123456789abcdef".substr(Math.random() * 16,1); }while(i--);
0139 return color;
0140 }
0141
0142 function spanColumn(index, count)
0143 {
0144 if(index === 0)
0145 {
0146 return 3;
0147 }
0148
0149 if(count === 2 || count === 3)
0150 {
0151 return 3;
0152 }
0153
0154 return 1;
0155 }
0156 }
0157 }