Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 63 additions & 70 deletions screen-recorder/BarWidget.qml
Original file line number Diff line number Diff line change
Expand Up @@ -16,113 +16,99 @@ NIconButton {
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0

// Bar positioning properties
readonly property string screenName: screen ? screen.name : ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property string screenName: screen?.name ?? ""
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)

readonly property var mainInstance: pluginApi?.mainInstance
readonly property bool hideInactive:
pluginApi?.pluginSettings?.hideInactive ??
pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ??
false
readonly property bool hideInactive: pluginApi?.pluginSettings?.hideInactive ?? pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ?? false
readonly property string buttonAction: pluginApi?.pluginSettings?.buttonAction || pluginApi?.manifest?.metadata?.defaultSettings?.buttonAction || "toggle-recording"
readonly property bool recordingActive: mainInstance?.isRecording ?? false
readonly property bool replayActive: mainInstance?.isReplaying ?? false

property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
readonly property string iconColorKey: cfg.iconColor ?? defaults.iconColor ?? "none"
readonly property color iconColor: Color.resolveColorKey(iconColorKey)
readonly property color iconColor: Color.resolveColorKey(pluginApi?.pluginSettings?.iconColor ?? pluginApi?.manifest?.metadata?.defaultSettings?.iconColor ?? "none")

readonly property bool shouldShow: !hideInactive || (mainInstance?.isRecording ?? false) || (mainInstance?.isPending ?? false) || (mainInstance?.isReplaying ?? false)
readonly property bool shouldShow: !hideInactive || recordingActive || replayActive

visible: true
opacity: shouldShow ? 1.0 : 0.0
implicitWidth: shouldShow ? baseSize : 0
implicitHeight: shouldShow ? baseSize : 0

Behavior on opacity {
NumberAnimation { duration: Style.animationNormal }
NumberAnimation {
duration: Style.animationNormal
}
}

Behavior on implicitWidth {
NumberAnimation { duration: Style.animationNormal }
NumberAnimation {
duration: Style.animationNormal
}
}

Behavior on implicitHeight {
NumberAnimation { duration: Style.animationNormal }
NumberAnimation {
duration: Style.animationNormal
}
}

enabled: mainInstance?.isAvailable ?? false
icon: "camera-video"
tooltipText: mainInstance?.buildTooltip()
tooltipText: pluginApi?.tr("name")
tooltipDirection: BarService.getTooltipDirection()
baseSize: root.capsuleHeight
applyUiScale: false
customRadius: Style.radiusL
colorBg: (mainInstance?.isRecording || mainInstance?.isPending) ? Color.mPrimary : (mainInstance?.isReplaying ? Qt.alpha(Color.mSecondary, 0.25) : Style.capsuleColor)
colorFg: (mainInstance?.isRecording || mainInstance?.isPending) ? Color.mOnPrimary : (mainInstance?.isReplaying ? Color.mSecondary : root.iconColor)
colorBorder: "transparent"
colorBorderHover: "transparent"
colorBg: recordingActive ? Color.mPrimary : (replayActive ? Qt.alpha(Color.mSecondary, 0.25) : Style.capsuleColor)
colorFg: recordingActive ? Color.mOnPrimary : (replayActive ? Color.mSecondary : root.iconColor)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth

onClicked: {
if (!enabled) {
ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc"))
return
}

if (mainInstance) {
mainInstance.toggleRecording()
if (!mainInstance.isRecording && !mainInstance.isPending) {
// Recording was stopped, close control center if open
var controlCenter = PanelService.getPanel("controlCenterPanel", screen)
if (controlCenter) {
controlCenter.close()
}
}
}
if (mainInstance)
mainInstance.handleButtonAction(buttonAction, () => pluginApi.openPanel(screen, root));
}

onRightClicked: {
PanelService.showContextMenu(contextMenu, root, screen);
}


NPopupContextMenu {
id: contextMenu

model: {
var items = [];

// Replay controls (only when replay is enabled)
if (mainInstance?.replayEnabled) {
if (mainInstance?.isReplaying) {
items.push({
"label": pluginApi.tr("messages.save-replay"),
"action": "save-replay",
"icon": "device-floppy"
});
items.push({
"label": pluginApi.tr("messages.stop-replay"),
"action": "stop-replay",
"icon": "stop"
});
} else {
items.push({
"label": pluginApi.tr("messages.start-replay"),
"action": "start-replay",
"icon": "player-play"
});
}
items.push({
"label": recordingActive ? pluginApi.tr("messages.stop-recording") : pluginApi.tr("messages.start-recording"),
"action": recordingActive ? "stop-recording" : "start-recording",
"icon": recordingActive ? "stop" : "player-play",
"enabled": true
});
items.push({
"label": replayActive ? pluginApi.tr("messages.stop-replay") : pluginApi.tr("messages.start-replay"),
"action": replayActive ? "stop-replay" : "start-replay",
"icon": replayActive ? "stop" : "player-play",
"enabled": !recordingActive
});
if (replayActive) {
items.push({
"label": pluginApi.tr("messages.save-replay"),
"action": "save-replay",
"icon": "device-floppy",
"enabled": true
});
}

items.push({
"label": pluginApi.tr("messages.open-panel"),
"action": "open-panel",
"icon": "layout-sidebar-right-expand",
"enabled": true
});
items.push({
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
"icon": "settings",
"enabled": true
});

return items;
Expand All @@ -132,16 +118,23 @@ NIconButton {
contextMenu.close();
PanelService.closeContextMenu(screen);

if (action === "widget-settings") {
if (action === "open-panel") {
pluginApi.openPanel(screen, root);
} else if (action === "widget-settings") {
BarService.openPluginSettings(screen, pluginApi.manifest);
} else if (action === "start-replay" && mainInstance) {
mainInstance.startReplay();
} else if (action === "stop-replay" && mainInstance) {
mainInstance.stopReplay();
} else if (action === "save-replay" && mainInstance) {
mainInstance.saveReplay();
} else if (mainInstance) {
if (action === "start-recording") {
mainInstance.startRecording();
} else if (action === "stop-recording") {
mainInstance.stopRecording();
} else if (action === "start-replay") {
mainInstance.startReplay();
} else if (action === "stop-replay") {
mainInstance.stopReplay();
} else if (action === "save-replay") {
mainInstance.saveReplay();
}
}
}
}

}
13 changes: 7 additions & 6 deletions screen-recorder/ControlCenterWidget.qml
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@

import QtQuick
import Quickshell
import qs.Widgets
import qs.Commons

NIconButton {
id: root

property ShellScreen screen
property var pluginApi: null
readonly property var mainInstance: pluginApi?.mainInstance

enabled: mainInstance?.isAvailable ?? false
readonly property string buttonAction: pluginApi?.pluginSettings?.buttonAction || pluginApi?.manifest?.metadata?.defaultSettings?.buttonAction || "toggle-recording"

icon: "camera-video"
tooltipText: mainInstance?.buildTooltip()
tooltipText: pluginApi?.tr("name")
colorFg: mainInstance?.isRecording ? Color.mOnPrimary : (mainInstance?.isReplaying ? Color.mSecondary : Color.mPrimary)
colorBg: mainInstance?.isRecording ? Color.mPrimary : (mainInstance?.isReplaying ? Qt.alpha(Color.mSecondary, 0.25) : Style.capsuleColor)
onClicked: {
if (pluginApi && pluginApi.mainInstance) {
pluginApi.mainInstance.toggleRecording();
}
if (mainInstance)
mainInstance.handleButtonAction(buttonAction, () => pluginApi.openPanel(screen, root));
}
}
Loading