From b59d08d09885baade5a3924a5f6f51534dfd389a Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Thu, 5 Mar 2026 13:06:50 +1100 Subject: [PATCH] Auto show/hide controls in fullscreen based on activity --- desktop-client/room_widget.py | 49 ++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/desktop-client/room_widget.py b/desktop-client/room_widget.py index 7c0fea3..5d44214 100644 --- a/desktop-client/room_widget.py +++ b/desktop-client/room_widget.py @@ -7,7 +7,8 @@ from PyQt6.QtWidgets import ( QPushButton, QFrame, QSlider, QTextEdit, QTextBrowser, QApplication, QToolTip ) from PyQt6.QtCore import Qt, pyqtSignal, QTimer -from PyQt6.QtGui import QIcon +from PyQt6.QtGui import QIcon, QCursor + import uuid from vlc_player import VLCSyncPlayer @@ -125,10 +126,10 @@ class RoomWidget(QWidget): self.video_frame.setAttribute(Qt.WidgetAttribute.WA_NativeWindow, True) # Controls Bar - controls = QFrame() - controls.setObjectName("controlsBar") - controls.setFixedHeight(60) - controls_layout = QHBoxLayout(controls) + self.controls_bar = QFrame() + self.controls_bar.setObjectName("controlsBar") + self.controls_bar.setFixedHeight(60) + controls_layout = QHBoxLayout(self.controls_bar) self.play_btn = QPushButton("▶") self.play_btn.setFixedSize(40, 40) @@ -172,7 +173,7 @@ class RoomWidget(QWidget): video_layout.addWidget(self.topbar) video_layout.addWidget(self.video_frame) - video_layout.addWidget(controls) + video_layout.addWidget(self.controls_bar) # --- Right Side: Chat --- self.chat_container = QFrame() @@ -276,6 +277,18 @@ class RoomWidget(QWidget): self.play_btn.clicked.connect(self.toggle_playback) + # Fullscreen auto-hide timer + self._fs_hide_timer = QTimer() + self._fs_hide_timer.setSingleShot(True) + self._fs_hide_timer.setInterval(3000) + self._fs_hide_timer.timeout.connect(self._hide_fullscreen_controls) + + # Mouse movement polling (needed because VLC's native window eats mouse events) + self._last_mouse_pos = None + self._mouse_poll_timer = QTimer() + self._mouse_poll_timer.setInterval(200) + self._mouse_poll_timer.timeout.connect(self._check_mouse_movement) + def get_seekbar_tooltip(self, value): length_ms = self.vlc_player.get_length() if length_ms > 0: @@ -320,11 +333,35 @@ class RoomWidget(QWidget): self.fullscreen_btn.setText("⛶") self.chat_container.show() self.topbar.show() + self.controls_bar.show() + self._fs_hide_timer.stop() + self._mouse_poll_timer.stop() + self.setCursor(QCursor(Qt.CursorShape.ArrowCursor)) else: top_window.showFullScreen() self.fullscreen_btn.setText("🗗") self.chat_container.hide() self.topbar.hide() + self._last_mouse_pos = QCursor.pos() + self._fs_hide_timer.start() + self._mouse_poll_timer.start() + + def _hide_fullscreen_controls(self): + if self.window().isFullScreen(): + self.controls_bar.hide() + self.setCursor(QCursor(Qt.CursorShape.BlankCursor)) + + def _show_fullscreen_controls(self): + self.controls_bar.show() + self.setCursor(QCursor(Qt.CursorShape.ArrowCursor)) + self._fs_hide_timer.start() + + def _check_mouse_movement(self): + pos = QCursor.pos() + if pos != self._last_mouse_pos: + self._last_mouse_pos = pos + if not self.controls_bar.isVisible(): + self._show_fullscreen_controls() def toggle_mute(self): current_vol = self.vlc_player.get_volume()