Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:epopov:branches:openSUSE:Factory
spectacle
2000-ui.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2000-ui.patch of Package spectacle
diff --git a/src/Gui/ButtonGrid.qml b/src/Gui/ButtonGrid.qml index bb158446707912d1017b78cc6fa5f7f2a03b59b9..7d49242e92c1ab7852a24f8d43b4f664cc8b2b8d 100644 --- a/src/Gui/ButtonGrid.qml +++ b/src/Gui/ButtonGrid.qml @@ -9,10 +9,10 @@ import org.kde.spectacle.private Grid { id: root - property int displayMode: QQC.AbstractButton.TextBesideIcon + property int displayMode: QQC.AbstractButton.IconOnly property int focusPolicy: Qt.StrongFocus readonly property bool mirrored: effectiveLayoutDirection === Qt.RightToLeft - property bool animationsEnabled: true + property bool animationsEnabled: false clip: childrenRect.width > width || childrenRect.height > height horizontalItemAlignment: Grid.AlignHCenter diff --git a/src/Gui/CaptureOptions.qml b/src/Gui/CaptureOptions.qml index 3cf70e42728124ea0b3a2fb97f5df6e2f8f7ef1d..1aa1d7ec471e35a3bf083fc311bcd3901b37eb22 100644 --- a/src/Gui/CaptureOptions.qml +++ b/src/Gui/CaptureOptions.qml @@ -9,36 +9,10 @@ import org.kde.spectacle.private Column { spacing: Kirigami.Units.mediumSpacing - Kirigami.Heading { - anchors.left: parent.left - width: Math.max(implicitWidth, parent.width) - topPadding: -captureHeadingMetrics.descent - bottomPadding: -captureHeadingMetrics.descent + parent.spacing - text: i18n("Take a new screenshot") - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - level: 3 - // If recording is supported, there would be a tab bar right above this - // label with largely the same text, creating redundancy. - visible: !VideoPlatform.supportedRecordingModes - FontMetrics { - id: captureHeadingMetrics - } - } CaptureModeButtonsColumn { anchors.left: parent.left width: Math.max(implicitWidth, parent.width) } - Kirigami.Heading { - anchors.left: parent.left - width: Math.max(implicitWidth, parent.width) - topPadding: -captureHeadingMetrics.descent + parent.spacing - bottomPadding: -captureHeadingMetrics.descent + parent.spacing - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - text: i18n("Capture Settings") - level: 3 - } CaptureSettingsColumn { anchors.left: parent.left width: Math.max(Layout.minimumWidth, parent.width) diff --git a/src/Gui/ImageCaptureOverlay.qml b/src/Gui/ImageCaptureOverlay.qml index 51110ea3745058e1bb774efc6b1219bc384187c1..9b0cff7c4c079d4b6476e273385c668a26eec675 100644 --- a/src/Gui/ImageCaptureOverlay.qml +++ b/src/Gui/ImageCaptureOverlay.qml @@ -176,8 +176,7 @@ MouseArea { && !contains(mapFromItem(root, root.mouseX, root.mouseY)) && !root.pressed && !annotations.enabled - && !mtbDragHandler.active - && !atbDragHandler.active + && !toolbarsLayoutDragHandler.active && !G.rectIntersects(SelectionEditor.handlesRect, Qt.rect(x, y, width, height)) Behavior on opacity { NumberAnimation { @@ -302,7 +301,7 @@ MouseArea { return Qt.AlignBaseline } } - readonly property bool normallyVisible: !Selection.empty && !(mainToolBar.visible && mainToolBar.valignment === ssToolTip.valignment) + readonly property bool normallyVisible: !Selection.empty && !mainToolBar.visible Binding on x { value: contextWindow.dprRound(Selection.horizontalCenter - ssToolTip.width / 2) when: ssToolTip.normallyVisible @@ -356,229 +355,195 @@ MouseArea { Connections { target: Selection function onEmptyChanged() { - if (!Selection.empty - && (mainToolBar.rememberPosition || atbLoader.rememberPosition)) { - mainToolBar.rememberPosition = false - atbLoader.rememberPosition = false + if (!Selection.empty) { + toolbarsLayout.rememberPosition = false; } } } - // Main ToolBar - FloatingToolBar { - id: mainToolBar + RowLayout { + id: toolbarsLayout + spacing: Kirigami.Units.smallSpacing property bool rememberPosition: false - readonly property int valignment: { + readonly property int alignment: { if (Selection.empty) { - return 0 + return 0; } - if (3 * height + topPadding + Kirigami.Units.mediumSpacing - <= SelectionEditor.screensRect.height - SelectionEditor.handlesRect.bottom - ) { - return Qt.AlignBottom - } else if (3 * height + bottomPadding + Kirigami.Units.mediumSpacing - <= SelectionEditor.handlesRect.top - ) { - return Qt.AlignTop - } else { - // At the bottom of the inside of the selection rect. - return Qt.AlignBaseline + const maxHeight = 2 * height + Kirigami.Units.mediumSpacing; + const [min, max] = [ + SelectionEditor.screensRect.y, + SelectionEditor.screensRect.y + SelectionEditor.screensRect.height, + ]; + if (SelectionEditor.handlesRect.top - maxHeight >= min) { + return Qt.AlignTop; } - } - readonly property bool normallyVisible: { - let emptyHovered = (root.containsMouse || annotations.hovered) && Selection.empty - let menuVisible = ExportMenu.visible - menuVisible |= OptionsMenu.visible - menuVisible |= HelpMenu.visible - let pressed = SelectionEditor.dragLocation || annotations.anyPressed - return (emptyHovered || !Selection.empty || menuVisible) && !pressed + if (SelectionEditor.handlesRect.bottom + maxHeight <= max) { + return Qt.AlignBottom; + } + return Qt.AlignBaseline } Binding on x { value: { - const v = Selection.empty ? - (root.width - mainToolBar.width) / 2 + annotations.viewportRect.x - : Selection.horizontalCenter - mainToolBar.width / 2 - return Math.max(mainToolBar.leftPadding, // min value - Math.min(contextWindow.dprRound(v), - SelectionEditor.screensRect.width - mainToolBar.width - mainToolBar.rightPadding)) // max value + let x; + if (Selection.empty) { + x = SelectionEditor.screensRect.x + (SelectionEditor.screensRect.width - toolbarsLayout.width) / 2; + } else { + x = Math.max( + SelectionEditor.screensRect.x, + Math.min( + Selection.horizontalCenter - toolbarsLayout.width / 2, + SelectionEditor.screensRect.x + SelectionEditor.screensRect.width - toolbarsLayout.width + ) + ); + } + return contextWindow.dprRound(x); } - when: mainToolBar.normallyVisible && !mainToolBar.rememberPosition + when: mainToolBar.normallyVisible && !toolbarsLayout.rememberPosition restoreMode: Binding.RestoreNone } Binding on y { value: { - let v = 0 - // put above selection if not enough room below selection - if (mainToolBar.valignment & Qt.AlignTop) { - v = SelectionEditor.handlesRect.top - - mainToolBar.height - mainToolBar.bottomPadding - } else if (mainToolBar.valignment & Qt.AlignBottom) { - v = SelectionEditor.handlesRect.bottom + mainToolBar.topPadding - } else if (mainToolBar.valignment & Qt.AlignBaseline) { - v = Math.min(Selection.bottom, SelectionEditor.handlesRect.bottom - Kirigami.Units.gridUnit) - - mainToolBar.height - mainToolBar.bottomPadding + let y; + if (toolbarsLayout.alignment & Qt.AlignTop) { + y = SelectionEditor.handlesRect.top - toolbarsLayout.height - Kirigami.Units.mediumSpacing; + } else if (toolbarsLayout.alignment & Qt.AlignBottom) { + y = SelectionEditor.handlesRect.bottom + Kirigami.Units.mediumSpacing; + } else if (toolbarsLayout.alignment & Qt.AlignBaseline) { + y = Math.min(Selection.bottom, SelectionEditor.handlesRect.bottom - Kirigami.Units.gridUnit) + - toolbarsLayout.height - Kirigami.Units.mediumSpacing; } else { - v = (mainToolBar.height / 2) - mainToolBar.parent.y + y = SelectionEditor.screensRect.y + toolbarsLayout.height / 2; } - return contextWindow.dprRound(v) + return contextWindow.dprRound(y); } - when: mainToolBar.normallyVisible && !mainToolBar.rememberPosition + when: mainToolBar.normallyVisible && !toolbarsLayout.rememberPosition restoreMode: Binding.RestoreNone } - visible: opacity > 0 - opacity: normallyVisible && G.rectIntersects(Qt.rect(x,y,width,height), annotations.viewportRect) - Behavior on opacity { - NumberAnimation { - duration: Kirigami.Units.longDuration - easing.type: Easing.OutCubic - } - } - layer.enabled: true // improves the visuals of the opacity animation - focusPolicy: Qt.NoFocus - contentItem: MainToolBarContents { - id: mainToolBarContents - focusPolicy: Qt.NoFocus - displayMode: QQC.AbstractButton.TextBesideIcon - showSizeLabel: mainToolBar.valignment === ssToolTip.valignment - imageSize: G.rawSize(Selection.size, SelectionEditor.devicePixelRatio) - } - - DragHandler { // parent is contentItem and parent is a read-only property - id: mtbDragHandler + DragHandler { + id: toolbarsLayoutDragHandler enabled: Selection.empty - target: mainToolBar acceptedButtons: Qt.LeftButton margin: mainToolBar.padding - xAxis.minimum: annotations.viewportRect.x - xAxis.maximum: annotations.viewportRect.x + root.width - mainToolBar.width - yAxis.minimum: annotations.viewportRect.y - yAxis.maximum: annotations.viewportRect.y + root.height - mainToolBar.height - cursorShape: enabled ? - (active ? Qt.ClosedHandCursor : Qt.OpenHandCursor) - : undefined - onActiveChanged: if (active && !mainToolBar.rememberPosition) { - mainToolBar.rememberPosition = true + xAxis.minimum: SelectionEditor.screensRect.x + xAxis.maximum: SelectionEditor.screensRect.x + SelectionEditor.screensRect.width - toolbarsLayout.width + yAxis.minimum: SelectionEditor.screensRect.y + yAxis.maximum: SelectionEditor.screensRect.y + SelectionEditor.screensRect.height - toolbarsLayout.height + cursorShape: enabled ? (active ? Qt.ClosedHandCursor : Qt.OpenHandCursor) : undefined + onActiveChanged: { + if (active) { + toolbarsLayout.rememberPosition = true; + } } } - } - - AnimatedLoader { - id: atbLoader - property bool rememberPosition: false - readonly property int valignment: mainToolBar.valignment & (Qt.AlignTop | Qt.AlignBaseline) ? - Qt.AlignTop : Qt.AlignBottom - active: visible && mainToolBar.visible - onActiveChanged: if (!active && rememberPosition - && !contextWindow.annotating) { - rememberPosition = false - } - state: mainToolBar.normallyVisible - && contextWindow.annotating ? "active" : "inactive" - - Binding on x { - value: { - const min = mainToolBar.x - const target = contextWindow.dprRound(mainToolBar.x + (mainToolBar.width - atbLoader.width) / 2) - const max = mainToolBar.x + mainToolBar.width - atbLoader.width - return Math.max(min, Math.min(target, max)) + // Main ToolBar + FloatingToolBar { + id: mainToolBar + readonly property bool normallyVisible: { + let emptyHovered = (root.containsMouse || annotations.hovered) && Selection.empty + let menuVisible = ExportMenu.visible + menuVisible |= OptionsMenu.visible + menuVisible |= HelpMenu.visible + let pressed = SelectionEditor.dragLocation || annotations.anyPressed + return (emptyHovered || !Selection.empty || menuVisible) && !pressed } - when: !atbLoader.rememberPosition - restoreMode: Binding.RestoreNone - } - Binding on y { - value: contextWindow.dprRound(atbLoader.valignment & Qt.AlignTop ? - mainToolBar.y - atbLoader.height - Kirigami.Units.mediumSpacing - : mainToolBar.y + mainToolBar.height + Kirigami.Units.mediumSpacing) - when: !atbLoader.rememberPosition - restoreMode: Binding.RestoreNone - } - - DragHandler { // parented to contentItem - id: atbDragHandler - enabled: Selection.empty - acceptedButtons: Qt.LeftButton - xAxis.minimum: annotations.viewportRect.x - xAxis.maximum: annotations.viewportRect.x + root.width - atbLoader.width - yAxis.minimum: annotations.viewportRect.y - yAxis.maximum: annotations.viewportRect.y + root.height - atbLoader.height - cursorShape: enabled ? - (active ? Qt.ClosedHandCursor : Qt.OpenHandCursor) - : undefined - onActiveChanged: if (active && !atbLoader.rememberPosition) { - atbLoader.rememberPosition = true + visible: opacity > 0 + opacity: normallyVisible && G.rectIntersects(Qt.rect(x,y,width,height), annotations.viewportRect) + Behavior on opacity { + NumberAnimation { + duration: Kirigami.Units.longDuration + easing.type: Easing.OutCubic + } } - } - - sourceComponent: FloatingToolBar { - id: annotationsToolBar + layer.enabled: true // improves the visuals of the opacity animation focusPolicy: Qt.NoFocus - contentItem: AnnotationsToolBarContents { - id: annotationsContents - displayMode: QQC.AbstractButton.IconOnly + contentItem: MainToolBarContents { + id: mainToolBarContents focusPolicy: Qt.NoFocus + displayMode: QQC.AbstractButton.IconOnly + showSizeLabel: true + imageSize: G.rawSize(Selection.size, SelectionEditor.devicePixelRatio) } + } - topLeftRadius: optionsToolBar.visible - && optionsToolBar.x === 0 - && atbLoader.valignment & Qt.AlignTop ? 0 : radius - topRightRadius: optionsToolBar.visible - && optionsToolBar.x === width - optionsToolBar.width - && atbLoader.valignment & Qt.AlignTop ? 0 : radius - bottomLeftRadius: optionsToolBar.visible - && optionsToolBar.x === 0 - && atbLoader.valignment & Qt.AlignBottom ? 0 : radius - bottomRightRadius: optionsToolBar.visible - && optionsToolBar.x === width - optionsToolBar.width - && atbLoader.valignment & Qt.AlignBottom ? 0 : radius - - // Exists purely for cosmetic reasons to make the border of - // optionsToolBar that meets annotationsToolBar look better - Rectangle { - id: borderBg - z: -1 - visible: optionsToolBar.visible - opacity: optionsToolBar.opacity - parent: annotationsToolBar - x: optionsToolBar.x + annotationsToolBar.background.border.width - y: atbLoader.valignment & Qt.AlignTop ? - optionsToolBar.y + optionsToolBar.height : optionsToolBar.y - width: optionsToolBar.width - annotationsToolBar.background.border.width * 2 - height: contextWindow.dprRound(1) - color: annotationsToolBar.background.color - } + AnimatedLoader { + id: atbLoader + readonly property int valignment: toolbarsLayout.alignment & (Qt.AlignTop | Qt.AlignBaseline) ? + Qt.AlignTop : Qt.AlignBottom + active: visible && mainToolBar.visible + state: mainToolBar.normallyVisible + && contextWindow.annotating ? "active" : "inactive" - AnimatedLoader { - id: optionsToolBar - parent: annotationsToolBar - x: { - const targetX = annotationsContents.x - + annotationsContents.checkedButton.x - + (annotationsContents.checkedButton.width - width) / 2 - return Math.max(0, // min value - Math.min(contextWindow.dprRound(targetX), - parent.width - width)) // max value + sourceComponent: FloatingToolBar { + id: annotationsToolBar + focusPolicy: Qt.NoFocus + contentItem: AnnotationsToolBarContents { + id: annotationsContents + displayMode: QQC.AbstractButton.IconOnly + focusPolicy: Qt.NoFocus } - y: atbLoader.valignment & Qt.AlignTop ? - -optionsToolBar.height + borderBg.height - : optionsToolBar.height - borderBg.height - state: if (AnnotationDocument.tool.options !== AnnotationTool.NoOptions - || (AnnotationDocument.tool.type === AnnotationDocument.ChangeAction - && AnnotationDocument.selectedAction.options !== AnnotationTool.NoOptions) - ) { - return "active" - } else { - return "inactive" + + topLeftRadius: optionsToolBar.visible + && optionsToolBar.x === 0 + && atbLoader.valignment & Qt.AlignTop ? 0 : radius + topRightRadius: optionsToolBar.visible + && optionsToolBar.x === width - optionsToolBar.width + && atbLoader.valignment & Qt.AlignTop ? 0 : radius + bottomLeftRadius: optionsToolBar.visible + && optionsToolBar.x === 0 + && atbLoader.valignment & Qt.AlignBottom ? 0 : radius + bottomRightRadius: optionsToolBar.visible + && optionsToolBar.x === width - optionsToolBar.width + && atbLoader.valignment & Qt.AlignBottom ? 0 : radius + + // Exists purely for cosmetic reasons to make the border of + // optionsToolBar that meets annotationsToolBar look better + Rectangle { + id: borderBg + z: -1 + visible: optionsToolBar.visible + opacity: optionsToolBar.opacity + parent: annotationsToolBar + x: optionsToolBar.x + annotationsToolBar.background.border.width + y: atbLoader.valignment & Qt.AlignTop ? + optionsToolBar.y + optionsToolBar.height : optionsToolBar.y + width: optionsToolBar.width - annotationsToolBar.background.border.width * 2 + height: contextWindow.dprRound(1) + color: annotationsToolBar.background.color } - sourceComponent: FloatingToolBar { - focusPolicy: Qt.NoFocus - contentItem: AnnotationOptionsToolBarContents { - displayMode: QQC.AbstractButton.IconOnly + + AnimatedLoader { + id: optionsToolBar + parent: annotationsToolBar + x: { + const targetX = annotationsContents.x + + annotationsContents.checkedButton.x + + (annotationsContents.checkedButton.width - width) / 2 + return Math.max(0, // min value + Math.min(contextWindow.dprRound(targetX), + parent.width - width)) // max value + } + y: atbLoader.valignment & Qt.AlignTop ? + -optionsToolBar.height + borderBg.height + : optionsToolBar.height - borderBg.height + state: if (AnnotationDocument.tool.options !== AnnotationTool.NoOptions + || (AnnotationDocument.tool.type === AnnotationDocument.ChangeAction + && AnnotationDocument.selectedAction.options !== AnnotationTool.NoOptions) + ) { + return "active" + } else { + return "inactive" + } + sourceComponent: FloatingToolBar { focusPolicy: Qt.NoFocus + contentItem: AnnotationOptionsToolBarContents { + displayMode: QQC.AbstractButton.IconOnly + focusPolicy: Qt.NoFocus + } + topLeftRadius: atbLoader.valignment & Qt.AlignBottom && x >= 0 ? 0 : radius + topRightRadius: atbLoader.valignment & Qt.AlignBottom && x + width <= annotationsToolBar.width ? 0 : radius + bottomLeftRadius: atbLoader.valignment & Qt.AlignTop && x >= 0 ? 0 : radius + bottomRightRadius: atbLoader.valignment & Qt.AlignTop && x + width <= annotationsToolBar.width ? 0 : radius } - topLeftRadius: atbLoader.valignment & Qt.AlignBottom && x >= 0 ? 0 : radius - topRightRadius: atbLoader.valignment & Qt.AlignBottom && x + width <= annotationsToolBar.width ? 0 : radius - bottomLeftRadius: atbLoader.valignment & Qt.AlignTop && x >= 0 ? 0 : radius - bottomRightRadius: atbLoader.valignment & Qt.AlignTop && x + width <= annotationsToolBar.width ? 0 : radius } } } diff --git a/src/Gui/ImageView.qml b/src/Gui/ImageView.qml index f96bb4deb2c2de7bb2bbd6b2b2bb1d86443d40e9..b86e508a3ed0c72e7e2d0afd2d22925a4d681b6a 100644 --- a/src/Gui/ImageView.qml +++ b/src/Gui/ImageView.qml @@ -6,6 +6,7 @@ import QtQuick import QtQuick.Window import QtQuick.Layouts import QtQuick.Controls as QQC +import org.kde.plasma.components 3.0 as PC3 import org.kde.kirigami as Kirigami import org.kde.spectacle.private @@ -26,7 +27,7 @@ EmptyPage { readonly property real minimumWidth: Math.max( header.implicitWidth, annotationsToolBar.implicitWidth + separator.implicitWidth + footerLoader.implicitWidth, - captureOptionsLoader.implicitWidth + 480 // leave some room for content if necessary + captureOptionsLoader.height + captureOptionsLoader.width ) readonly property real minimumHeight: header.implicitHeight + Math.max(annotationsToolBar.implicitHeight, @@ -52,7 +53,7 @@ EmptyPage { showNewScreenshotButton: false showOptionsMenu: false showUndoRedo: contextWindow.annotating - displayMode: QQC.AbstractButton.TextBesideIcon + displayMode: QQC.AbstractButton.IconOnly } } @@ -138,15 +139,37 @@ EmptyPage { topPadding: Kirigami.Units.mediumSpacing * 2 bottomPadding: Kirigami.Units.mediumSpacing * 2 - header: QQC.TabBar { + header: PC3.TabBar { id: tabBar - visible: VideoPlatform.supportedRecordingModes + visible: VideoPlatform.supportedRecordingModes && !SpectacleCore.isRecording currentIndex: 0 - QQC.TabButton { + background: Rectangle { + Kirigami.Theme.colorSet: Kirigami.Theme.View + color: Kirigami.Theme.alternateBackgroundColor + + Kirigami.Separator { + anchors { + left: parent.left + top: parent.top + bottom: parent.bottom + } + } + + Kirigami.Separator { + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + } + } + + PC3.TabButton { width: tabBar.width / tabBar.count text: i18n("Screenshot") } - QQC.TabButton { + + PC3.TabButton { width: tabBar.width / tabBar.count text: i18n("Recording") } diff --git a/src/Gui/MainToolBarContents.qml b/src/Gui/MainToolBarContents.qml index 402c5cccee16d3578ee9079b9244e524b2bcb4ef..156d9aea0f73d4ec5940cf7c7d725e22ff8f8aa8 100644 --- a/src/Gui/MainToolBarContents.qml +++ b/src/Gui/MainToolBarContents.qml @@ -29,11 +29,20 @@ ButtonGrid { id: sizeLabelLoader state: root.showSizeLabel && root.imageSize.width > 0 && root.imageSize.height > 0 ? "active" : "inactive" - sourceComponent: SizeLabel { - height: QmlUtils.iconTextButtonHeight - size: root.imageSize - leftPadding: Kirigami.Units.mediumSpacing + QmlUtils.fontMetrics.descent - rightPadding: leftPadding + sourceComponent: ButtonGrid { + flow: root.flow + + SizeLabel { + height: QmlUtils.iconTextButtonHeight + size: root.imageSize + leftPadding: Kirigami.Units.mediumSpacing + fontMetrics.descent + rightPadding: leftPadding + } + + QQC.ToolSeparator { + height: parent.flow === Grid.TopToBottom ? implicitWidth : parent.height + width: parent.flow === Grid.TopToBottom ? parent.width : implicitWidth + } } } diff --git a/src/Gui/RecordOptions.qml b/src/Gui/RecordOptions.qml index ebceede6a1ad71e5b0c28f28bbbc81aed100ab75..6d88dccc8fbde13006096e193fc5825abb762c8f 100644 --- a/src/Gui/RecordOptions.qml +++ b/src/Gui/RecordOptions.qml @@ -26,16 +26,6 @@ ColumnLayout { onClicked: SpectacleCore.startRecording(model.recordingMode, Settings.videoIncludePointer) } } - Kirigami.Heading { - Layout.fillWidth: true - topPadding: -recordingSettingsMetrics.descent + parent.spacing - bottomPadding: -recordingSettingsMetrics.descent + parent.spacing - text: i18n("Recording Settings") - level: 3 - FontMetrics { - id: recordingSettingsMetrics - } - } QQC.CheckBox { Layout.fillWidth: true text: i18n("Include mouse pointer")
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor