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 }