Warning, /multimedia/haruna/src/qml/Actions.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-FileCopyrightText: 2020 George Florea Bănuș <georgefb899@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 import QtQuick
0008 import QtQuick.Controls
0009 
0010 import org.kde.haruna
0011 import org.kde.haruna.mpvproperties
0012 import org.kde.haruna.settings
0013 
0014 Item {
0015     id: root
0016 
0017     Instantiator {
0018         model: actionsModel
0019         delegate: Action {
0020             objectName: model.name
0021             text: model.text
0022             shortcut: model.shortcut
0023             icon.name: model.icon
0024             onTriggered: {
0025                 if (model.type === "NormalAction") {
0026                     actionsModel.signalEmitter(objectName)
0027                 }
0028                 if (model.type === "CustomAction") {
0029                     mpv.userCommand(model.text)
0030                     osd.message(mpv.expandText(model.description))
0031                 }
0032             }
0033 
0034             Component.onCompleted: appActions[objectName] = this
0035         }
0036     }
0037 
0038     Connections {
0039         target: actionsModel
0040 
0041         function onOpenActionsDialogAction() {
0042             triggerActionPopup.open()
0043         }
0044 
0045         function onAboutHarunaAction() {
0046             settingsLoader.active = true
0047             settingsLoader.item.currentPage = SettingsWindow.Page.About
0048             actionsModel.signalEmitter("configureAction")
0049         }
0050 
0051         function onAudioCycleUpAction() {
0052             const tracks = mpv.getProperty(MpvProperties.TrackList)
0053             let audioTracksCount = 0
0054             tracks.forEach(t => { if(t.type === "audio") ++audioTracksCount })
0055 
0056             if (audioTracksCount > 1) {
0057                 mpv.command(["cycle", "aid", "up"])
0058                 const currentTrackId = mpv.getProperty(MpvProperties.AudioId)
0059 
0060                 if (currentTrackId === false) {
0061                     actionsModel.signalEmitter("audioCycleUpAction")
0062                     return
0063                 }
0064                 const track = tracks.find(t => t.type === "audio" && t.id === currentTrackId)
0065                 osd.message(i18nc("@info:tooltip", "Audio: %1 %2", currentTrackId, track.lang || ""))
0066             }
0067         }
0068 
0069         function onAudioCycleDownAction() {
0070             const tracks = mpv.getProperty(MpvProperties.TrackList)
0071             let audioTracksCount = 0
0072             tracks.forEach(t => { if(t.type === "audio") ++audioTracksCount })
0073 
0074             if (audioTracksCount > 1) {
0075                 mpv.command(["cycle", "aid", "down"])
0076                 const currentTrackId = mpv.getProperty(MpvProperties.AudioId)
0077 
0078                 if (currentTrackId === false) {
0079                     actionsModel.signalEmitter("audioCycleDownAction")
0080                     return
0081                 }
0082                 const track = tracks.find(t => t.type === "audio" && t.id === currentTrackId)
0083                 osd.message(i18nc("@info:tooltip", "Audio: %1 %2", currentTrackId, track.lang || ""))
0084             }
0085         }
0086 
0087         function onConfigureAction() {
0088             settingsLoader.active = true
0089             if (settingsLoader.item.visible) {
0090                 settingsLoader.item.raise()
0091             } else {
0092                 settingsLoader.item.visible = true
0093             }
0094         }
0095 
0096         function onConfigureShortcutsAction() {
0097             settingsLoader.active = true
0098             settingsLoader.item.currentPage = SettingsWindow.Page.Shortcuts
0099             actionsModel.signalEmitter("configureAction")
0100         }
0101 
0102         function onExitFullscreenAction() {
0103             window.exitFullscreen()
0104         }
0105 
0106         function onFrameStepForwardAction() {
0107             mpv.command(["frame-step"])
0108         }
0109 
0110         function onFrameStepBackwardAction() {
0111             mpv.command(["frame-back-step"])
0112         }
0113 
0114         function onLoadLastPlayedFileAction() {
0115             window.openFile(GeneralSettings.lastPlayedFile)
0116         }
0117 
0118         function onMuteAction() {
0119             mpv.mute = !mpv.mute
0120         }
0121 
0122         function onOpenContextMenuAction() {
0123             mpvContextMenuLoader.active = true
0124             mpvContextMenuLoader.item.popup()
0125         }
0126 
0127         function onOpenFileAction() {
0128             fileDialog.open()
0129         }
0130 
0131         function onOpenSubtitlesFileAction() {
0132             subtitlesFileDialog.open()
0133         }
0134 
0135         function onOpenUrlAction() {
0136             if (openUrlPopup.visible) {
0137                 openUrlPopup.close()
0138             } else {
0139                 openUrlPopup.open()
0140             }
0141         }
0142 
0143         function onPlaybackSpeedIncreaseAction() {
0144             const speed = mpv.getProperty(MpvProperties.Speed) + 0.1
0145             mpv.setProperty(MpvProperties.Speed, speed)
0146             osd.message(i18nc("@info:tooltip", "Playback speed: %1", speed.toFixed(2)))
0147         }
0148 
0149         function onPlaybackSpeedDecreaseAction() {
0150             const speed = mpv.getProperty(MpvProperties.Speed) - 0.1
0151             mpv.setProperty(MpvProperties.Speed, speed)
0152             osd.message(i18nc("@info:tooltip", "Playback speed: %1", speed.toFixed(2)))
0153         }
0154 
0155         function onPlaybackSpeedResetAction() {
0156             mpv.setProperty(MpvProperties.Speed, 1.0)
0157             osd.message(i18nc("@info:tooltip", "Playback speed: %1", 1.0))
0158         }
0159 
0160         function onPlayPauseAction() {
0161             mpv.pause = !mpv.pause
0162         }
0163 
0164         function onPlayNextAction() {
0165             mpv.playlistProxyModel.playNext()
0166         }
0167 
0168         function onPlayPreviousAction() {
0169             mpv.playlistProxyModel.playPrevious()
0170         }
0171 
0172         function onQuitApplicationAction() {
0173             Qt.quit()
0174         }
0175 
0176         function onRestartPlaybackAction() {
0177             mpv.command(["seek", 0, "absolute"])
0178         }
0179 
0180         function onSeekForwardSmallAction() {
0181             mpv.command(["seek", PlaybackSettings.seekSmallStep, "exact"])
0182         }
0183 
0184         function onSeekBackwardSmallAction() {
0185             mpv.command(["seek", -PlaybackSettings.seekSmallStep, "exact"])
0186         }
0187 
0188         function onSeekForwardMediumAction() {
0189             mpv.command(["seek", PlaybackSettings.seekMediumStep, "exact"])
0190         }
0191 
0192         function onSeekBackwardMediumAction() {
0193             mpv.command(["seek", -PlaybackSettings.seekMediumStep, "exact"])
0194         }
0195 
0196         function onSeekForwardBigAction() {
0197             mpv.command(["seek", PlaybackSettings.seekBigStep, "exact"])
0198         }
0199 
0200         function onSeekBackwardBigAction() {
0201             mpv.command(["seek", -PlaybackSettings.seekBigStep, "exact"])
0202         }
0203 
0204         function onSeekNextChapterAction() {
0205             const chapters = mpv.getProperty(MpvProperties.ChapterList)
0206             const currentChapter = mpv.getProperty(MpvProperties.Chapter)
0207             const nextChapter = currentChapter + 1
0208             if (nextChapter === chapters.length) {
0209                 actionsModel.signalEmitter("playNextAction")
0210                 return
0211             }
0212             mpv.command(["add", "chapter", "1"])
0213         }
0214 
0215         function onSeekPreviousChapterAction() {
0216             mpv.command(["add", "chapter", "-1"])
0217         }
0218 
0219         function onSeekNextSubtitleAction() {
0220             if (mpv.getProperty(MpvProperties.SubtitleId) !== false) {
0221                 mpv.command(["sub-seek", "1"])
0222             } else {
0223                 actionsModel.signalEmitter("seekForwardSmallAction")
0224             }
0225         }
0226 
0227         function onSeekPreviousSubtitleAction() {
0228             if (mpv.getProperty(MpvProperties.SubtitleId) !== false) {
0229                 mpv.command(["sub-seek", "-1"])
0230             } else {
0231                 actionsModel.signalEmitter("seekBackwardSmallAction")
0232             }
0233         }
0234 
0235         function onSeekToWatchLaterPositionAction() {
0236             if (mpv.watchLaterPosition === 0) {
0237                 return
0238             }
0239             mpv.command(["seek", mpv.watchLaterPosition, "absolute"])
0240         }
0241 
0242         function onSetLoopAction() {
0243             var a = mpv.getProperty(MpvProperties.ABLoopA)
0244             var b = mpv.getProperty(MpvProperties.ABLoopB)
0245 
0246             var aIsSet = a !== "no"
0247             var bIsSet = b !== "no"
0248 
0249             if (!aIsSet && !bIsSet) {
0250                 mpv.setProperty(MpvProperties.ABLoopA, mpv.position)
0251                 footer.progressBar.loopIndicator.startPosition = mpv.position
0252                 osd.message(i18nc("@info:tooltip", "Loop start: %1", app.formatTime(mpv.position)))
0253             } else if (aIsSet && !bIsSet) {
0254                 mpv.setProperty(MpvProperties.ABLoopB, mpv.position)
0255                 footer.progressBar.loopIndicator.endPosition = mpv.position
0256                 osd.message(i18nc("@info:tooltip", "Loop: %1 - %2", app.formatTime(a), app.formatTime(mpv.position)))
0257             } else if (aIsSet && bIsSet) {
0258                 mpv.setProperty(ABLoopA, "no")
0259                 mpv.setProperty(ABLoopB, "no")
0260                 footer.progressBar.loopIndicator.startPosition = -1
0261                 footer.progressBar.loopIndicator.endPosition = -1
0262                 osd.message(i18nc("@info:tooltip", "Loop cleared"))
0263             }
0264         }
0265 
0266         function onScreenshotAction() {
0267             mpv.commandAsync(["screenshot"], MpvItem.Screenshot)
0268         }
0269 
0270         function onSubtitleQuickenAction() {
0271             const delay = mpv.getProperty(MpvProperties.SubtitleDelay) - 0.1
0272             mpv.setProperty(MpvProperties.SubtitleDelay, delay)
0273             osd.message(i18nc("@info:tooltip", "Subtitle timing: %1", delay.toFixed(2)))
0274         }
0275 
0276         function onSubtitleDelayAction() {
0277             const delay = mpv.getProperty(MpvProperties.SubtitleDelay) + 0.1
0278             mpv.setProperty(MpvProperties.SubtitleDelay, delay)
0279             osd.message(i18nc("@info:tooltip", "Subtitle timing: %1", delay.toFixed(2)))
0280         }
0281 
0282         function onSubtitleToggleAction() {
0283             const visible = mpv.getProperty(MpvProperties.SubtitleVisibility)
0284             const message = visible ? i18nc("@info:tooltip", "Subtitles off") : i18nc("@info:tooltip", "Subtitles function on")
0285             mpv.setProperty(MpvProperties.SubtitleVisibility, !visible)
0286             osd.message(message)
0287         }
0288 
0289         function onSubtitleCycleUpAction() {
0290             mpv.command(["cycle", "sid", "up"])
0291             const currentTrackId = mpv.getProperty(MpvProperties.SubtitleId)
0292             if (currentTrackId === false) {
0293                 osd.message(i18nc("@info:tooltip", "Subtitle: None"))
0294             } else {
0295                 const tracks = mpv.getProperty(MpvProperties.TrackList)
0296                 const track = tracks.find(t => t.type === "sub" && t.id === currentTrackId)
0297                 osd.message(i18nc("@info:tooltip", "Subtitle: %1 %2", currentTrackId, track.lang || ""))
0298             }
0299         }
0300 
0301         function onSubtitleCycleDownAction() {
0302             mpv.command(["cycle", "sid", "down"])
0303             const currentTrackId = mpv.getProperty(MpvProperties.SubtitleId)
0304             if (currentTrackId === false) {
0305                 osd.message(i18nc("@info:tooltip", "Subtitle: None"))
0306             } else {
0307                 const tracks = mpv.getProperty(MpvProperties.TrackList)
0308                 const track = tracks.find(t => t.type === "sub" && t.id === currentTrackId)
0309                 osd.message(i18nc("@info:tooltip", "Subtitle: %1 %2", currentTrackId, track.lang || ""))
0310             }
0311         }
0312 
0313         function onSubtitleIncreaseFontSizeAction() {
0314             const subScale = mpv.getProperty(MpvProperties.SubtitleScale) + 0.1
0315             mpv.setProperty(MpvProperties.SubtitleScale, subScale)
0316             osd.message(i18nc("@info:tooltip", "Subtitle scale: %1", subScale.toFixed(1)))
0317         }
0318 
0319         function onSubtitleDecreaseFontSizeAction() {
0320             const subScale = mpv.getProperty(MpvProperties.SubtitleScale) - 0.1
0321             mpv.setProperty(MpvProperties.SubtitleScale, subScale)
0322             osd.message(i18nc("@info:tooltip", "Subtitle scale: %1", subScale.toFixed(1)))
0323         }
0324 
0325         function onSubtitleMoveUpAction() {
0326             mpv.command(["add", "sub-pos", "-1"])
0327         }
0328 
0329         function onSubtitleMoveDownAction() {
0330             mpv.command(["add", "sub-pos", "+1"])
0331         }
0332 
0333         function onToggleDeinterlacingAction() {
0334             const deinterlaced = !mpv.getProperty(MpvProperties.Deinterlace)
0335             mpv.setProperty(MpvProperties.Deinterlace, deinterlaced)
0336             osd.message(i18nc("@info:tooltip", "Deinterlace: %1", deinterlaced))
0337         }
0338 
0339         function onToggleFullscreenAction() {
0340             window.toggleFullScreen()
0341         }
0342 
0343         function onToggleMenuBarAction() {
0344             GeneralSettings.showMenuBar = !GeneralSettings.showMenuBar
0345             GeneralSettings.save()
0346         }
0347 
0348         function onToggleHeaderAction() {
0349             GeneralSettings.showHeader = !GeneralSettings.showHeader
0350             GeneralSettings.save()
0351         }
0352 
0353         function onTogglePlaylistAction() {
0354             if (playlist.state === "visible") {
0355                 playlist.state = "hidden"
0356             } else {
0357                 playlist.state = "visible"
0358             }
0359         }
0360 
0361         function onVideoPanXLeftAction() {
0362             const pan = mpv.getProperty(MpvProperties.VideoPanX) - 0.01
0363             mpv.setProperty(MpvProperties.VideoPanX, pan)
0364         }
0365 
0366         function onVideoPanXRightAction() {
0367             const pan = mpv.getProperty(MpvProperties.VideoPanX) + 0.01
0368             mpv.setProperty(MpvProperties.VideoPanX, pan)
0369         }
0370 
0371         function onVideoPanYUpAction() {
0372             const pan = mpv.getProperty(MpvProperties.VideoPanY) - 0.01
0373             mpv.setProperty(MpvProperties.VideoPanY, pan)
0374         }
0375 
0376         function onVideoPanYDownAction() {
0377             const pan = mpv.getProperty(MpvProperties.VideoPanY) + 0.01
0378             mpv.setProperty(MpvProperties.VideoPanY, pan)
0379         }
0380 
0381         function onVolumeUpAction() {
0382             mpv.command(["add", "volume", AudioSettings.volumeStep])
0383         }
0384 
0385         function onVolumeDownAction() {
0386             mpv.command(["add", "volume", -AudioSettings.volumeStep])
0387         }
0388 
0389         function onZoomInAction() {
0390             const zoom = mpv.getProperty(MpvProperties.VideoZoom) + 0.1
0391             mpv.setProperty(MpvProperties.VideoZoom, zoom)
0392             osd.message(i18nc("@info:tooltip", "Zoom: %1", zoom.toFixed(2)))
0393         }
0394 
0395         function onZoomOutAction() {
0396             const zoom = mpv.getProperty(MpvProperties.VideoZoom) - 0.1
0397             mpv.setProperty(MpvProperties.VideoZoom, zoom)
0398             osd.message(i18nc("@info:tooltip", "Zoom: %1", zoom.toFixed(2)))
0399         }
0400 
0401         function onZoomResetAction() {
0402             mpv.setProperty(MpvProperties.VideoZoom, 0)
0403             osd.message(i18nc("@info:tooltip", "Zoom: 0"))
0404         }
0405 
0406 
0407         function onContrastUpAction() {
0408             const contrast = parseInt(mpv.getProperty(MpvProperties.Contrast)) + 1
0409             mpv.setProperty(MpvProperties.Contrast, `${contrast}`)
0410             osd.message(i18nc("@info:tooltip", "Contrast: %1", contrast))
0411         }
0412 
0413         function onContrastDownAction() {
0414             const contrast = parseInt(mpv.getProperty(MpvProperties.Contrast)) - 1
0415             mpv.setProperty(MpvProperties.Contrast, `${contrast}`)
0416             osd.message(i18nc("@info:tooltip", "Contrast: %1", contrast))
0417         }
0418 
0419         function onContrastResetAction() {
0420             mpv.setProperty(MpvProperties.Contrast, 0)
0421             osd.message(i18nc("@info:tooltip", "Contrast: 0"))
0422         }
0423 
0424         function onBrightnessUpAction() {
0425             const brightness = parseInt(mpv.getProperty(MpvProperties.Brightness)) + 1
0426             mpv.setProperty(MpvProperties.Brightness, `${brightness}`)
0427             osd.message(i18nc("@info:tooltip", "Brightness: %1", brightness))
0428         }
0429 
0430         function onBrightnessDownAction() {
0431             const brightness = parseInt(mpv.getProperty(MpvProperties.Brightness)) - 1
0432             mpv.setProperty(MpvProperties.Brightness, `${brightness}`)
0433             osd.message(i18nc("@info:tooltip", "Brightness: %1", brightness))
0434         }
0435 
0436         function onBrightnessResetAction() {
0437             mpv.setProperty(MpvProperties.Brightness, 0)
0438             osd.message(i18nc("@info:tooltip", "Brightness: 0"))
0439         }
0440 
0441         function onGammaUpAction() {
0442             const gamma = parseInt(mpv.getProperty(MpvProperties.Gamma)) + 1
0443             mpv.setProperty(MpvProperties.Gamma, `${gamma}`)
0444             osd.message(i18nc("@info:tooltip", "Gamma: %1", gamma))
0445         }
0446 
0447         function onGammaDownAction() {
0448             const gamma = parseInt(mpv.getProperty(MpvProperties.Gamma)) - 1
0449             mpv.setProperty(MpvProperties.Gamma, `${gamma}`)
0450             osd.message(i18nc("@info:tooltip", "Gamma: %1", gamma))
0451         }
0452 
0453         function onGammaResetAction() {
0454             mpv.setProperty(MpvProperties.Gamma, 0)
0455             osd.message(i18nc("@info:tooltip", "Gamma: 0"))
0456         }
0457 
0458         function onSaturationUpAction() {
0459             const saturation = parseInt(mpv.getProperty(MpvProperties.Saturation)) + 1
0460             mpv.setProperty(MpvProperties.Saturation, `${saturation}`)
0461             osd.message(i18nc("@info:tooltip", "Saturation: %1", saturation))
0462         }
0463 
0464         function onSaturationDownAction() {
0465             const saturation = parseInt(mpv.getProperty(MpvProperties.Saturation)) - 1
0466             mpv.setProperty(MpvProperties.Saturation, `${saturation}`)
0467             osd.message(i18nc("@info:tooltip", "Saturation: %1", saturation))
0468         }
0469 
0470         function onSaturationResetAction() {
0471             mpv.setProperty(MpvProperties.Saturation, 0)
0472             osd.message(i18nc("@info:tooltip", "Saturation: 0"))
0473         }
0474     }
0475 }