@@ -22,6 +22,7 @@ import "../Components/IconUtil.js" as IconUtil
23ScopeView {
23ScopeView {
24 id: scopeView
24 id: scopeView
25+ property alias previewShown: previewLoader.onScreen
26 onIsCurrentChanged: {
27 onIsCurrentChanged: {
27 pageHeader.resetSearch();
28 pageHeader.resetSearch();
@@ -47,6 +48,8 @@ ScopeView {
47 id: categoryView
48 id: categoryView
48 anchors.fill: parent
49 anchors.fill: parent
49 model: scopeView.categories
50 model: scopeView.categories
51+ forceNoClip: previewLoader.onScreen
50 onAtYEndChanged: if (atYEnd) endReached()
53 onAtYEndChanged: if (atYEnd) endReached()
51 onMovingChanged: if (moving && atYEnd) endReached()
54 onMovingChanged: if (moving && atYEnd) endReached()
@@ -75,7 +78,32 @@ ScopeView {
75 text: title
78 text: title
76 imageWidth: units.gu(11)
79 imageWidth: units.gu(11)
77 imageHeight: units.gu(16)
80 imageHeight: units.gu(16)
78 source: IconUtil.from_gicon(icon)
82 source: IconUtil.from_gicon(icon)
89+ mouse.accepted = true
90+ effect.positionPx = mapToItem(categoryView, 0, 0).y
91+ scopeView.scope.activate(uri, icon,
98+ mouse.accepted = true
99+ effect.positionPx = mapToItem(categoryView, 0, 0).y
100+ scopeView.scope.preview(uri, icon,
@@ -93,4 +121,95 @@ ScopeView {
93 searchEntryEnabled: true
121 searchEntryEnabled: true
129+ bottomMargin: -bottomOverflow
131+ sourceItem: categoryView
135+ topGapPx: (1 - gap) * positionPx
136+ topOpacity: (1 - gap * 1.2)
137+ bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
138+ bottomOverflow: units.gu(20)
139+ bottomOpacity: 1 - (gap * 0.8)
141+ property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
142+ property real gap: previewLoader.open ? 1.0 : 0.0
147+ easing.type: Easing.InOutQuad
149+ if (!previewLoader.open && !running) {
150+ previewLoader.onScreen = false
158+ target: scopeView.scope
160+ previewLoader.previewData = preview
161+ previewLoader.open = true
165+ PreviewDelegateMapper {
166+ id: previewDelegateMapper
170+ ignoreUnknownSignals: true
171+ target: previewLoader.valid ? previewLoader.item : null
173+ previewLoader.open = false
179+ property var previewData
180+ height: effect.bottomGapPx - effect.topGapPx
183+ topMargin: effect.topGapPx
187+ source: onScreen ? previewDelegateMapper.map(previewLoader.previewData.rendererName) : ""
189+ property bool open: false
190+ property bool onScreen: false
191+ property bool valid: item !== null
200+ item.previewData = previewLoader.previewData
204+ // TODO: Move as InverseMouseArea to DashPreview
206+ enabled: previewLoader.onScreen
209+ topMargin: effect.bottomGapPx
212+ previewLoader.open = false;