Add discoverable rooms to desktop lobby
This commit is contained in:
@@ -2,7 +2,7 @@ import os
|
||||
import re
|
||||
from PyQt6.QtWidgets import (
|
||||
QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton,
|
||||
QFileDialog, QFrame, QApplication
|
||||
QFileDialog, QFrame, QApplication, QCheckBox, QListWidget, QListWidgetItem
|
||||
)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
|
||||
@@ -25,6 +25,7 @@ class LobbyWidget(QWidget):
|
||||
create_requested = pyqtSignal(str, str, str, object) # username, path, filename, size
|
||||
join_requested = pyqtSignal(str, str) # username, room_code
|
||||
file_selected = pyqtSignal(str)
|
||||
refresh_requested = pyqtSignal()
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
@@ -44,7 +45,8 @@ class LobbyWidget(QWidget):
|
||||
# Container for centering
|
||||
container = QFrame()
|
||||
container.setObjectName("lobbyCard")
|
||||
container.setFixedWidth(500)
|
||||
container.setMinimumWidth(420)
|
||||
container.setMaximumWidth(500)
|
||||
container_layout = QVBoxLayout(container)
|
||||
container_layout.setContentsMargins(30, 30, 30, 30)
|
||||
container_layout.setSpacing(15)
|
||||
@@ -91,7 +93,11 @@ class LobbyWidget(QWidget):
|
||||
self.create_room_btn.clicked.connect(self.create_room)
|
||||
|
||||
create_panel.addWidget(self.create_file_btn)
|
||||
create_panel.addWidget(self.create_file_info)
|
||||
create_panel.addWidget(self.create_file_info)
|
||||
self.listed_checkbox = QCheckBox("List room in active sessions")
|
||||
self.listed_checkbox.setChecked(True)
|
||||
self.listed_checkbox.setToolTip("Unlisted rooms can still be joined using their code.")
|
||||
create_panel.addWidget(self.listed_checkbox)
|
||||
create_panel.addWidget(self.create_room_btn)
|
||||
|
||||
# Join Room Panel
|
||||
@@ -118,7 +124,30 @@ class LobbyWidget(QWidget):
|
||||
actions_layout.addLayout(join_panel)
|
||||
|
||||
container_layout.addLayout(actions_layout)
|
||||
layout.addWidget(container)
|
||||
panels = QHBoxLayout()
|
||||
panels.addWidget(container)
|
||||
sessions = QVBoxLayout()
|
||||
heading = QHBoxLayout()
|
||||
heading.addWidget(QLabel("ALREADY WATCHING"))
|
||||
self.refresh_btn = QPushButton("Refresh")
|
||||
self.refresh_btn.clicked.connect(self.refresh_requested.emit)
|
||||
heading.addWidget(self.refresh_btn)
|
||||
sessions.addLayout(heading)
|
||||
self.sessions_status = QLabel("Checking for active sessions…")
|
||||
self.sessions_status.setWordWrap(True)
|
||||
sessions.addWidget(self.sessions_status)
|
||||
self.sessions_list = QListWidget()
|
||||
self.sessions_list.setWordWrap(True)
|
||||
self.sessions_list.setMinimumWidth(280)
|
||||
sessions.addWidget(self.sessions_list)
|
||||
self.session_join_btn = QPushButton("Choose file & join")
|
||||
self.session_join_btn.setEnabled(False)
|
||||
self.session_join_btn.clicked.connect(self.join_selected_session)
|
||||
self.sessions_list.itemDoubleClicked.connect(lambda _: self.join_selected_session())
|
||||
self.sessions_list.itemSelectionChanged.connect(self.check_inputs)
|
||||
sessions.addWidget(self.session_join_btn)
|
||||
panels.addLayout(sessions)
|
||||
layout.addLayout(panels)
|
||||
|
||||
# Signals to enable/disable buttons
|
||||
self.username_input.textChanged.connect(self.check_inputs)
|
||||
@@ -164,7 +193,33 @@ class LobbyWidget(QWidget):
|
||||
has_code = len(self.room_code_input.text().strip()) >= 4
|
||||
|
||||
self.create_room_btn.setEnabled(has_name and has_file)
|
||||
self.join_room_btn.setEnabled(has_name and has_code)
|
||||
self.join_room_btn.setEnabled(has_name and has_code)
|
||||
self.session_join_btn.setEnabled(has_name and self.sessions_list.currentItem() is not None)
|
||||
|
||||
def update_sessions(self, rooms):
|
||||
selected = self.sessions_list.currentItem()
|
||||
code = selected.data(Qt.ItemDataRole.UserRole) if selected else None
|
||||
self.sessions_list.clear()
|
||||
for room in rooms:
|
||||
seconds = max(0, int(room.get("position", 0)))
|
||||
state = "Playing" if room.get("playing") else "Paused"
|
||||
users = room.get("users", [])
|
||||
item = QListWidgetItem(f"{room['fileInfo']['name']}\n"
|
||||
f"{state} · {seconds // 60}:{seconds % 60:02d} · {len(users)} connected\n"
|
||||
f"{', '.join(users)}")
|
||||
item.setData(Qt.ItemDataRole.UserRole, room['code'])
|
||||
self.sessions_list.addItem(item)
|
||||
if room['code'] == code:
|
||||
self.sessions_list.setCurrentItem(item)
|
||||
self.sessions_status.setText("Select a session to join." if rooms else
|
||||
"No active sessions. Create a room to get started.")
|
||||
self.check_inputs()
|
||||
|
||||
def join_selected_session(self):
|
||||
item = self.sessions_list.currentItem()
|
||||
if item and self.username_input.text().strip():
|
||||
self.room_code_input.setText(item.data(Qt.ItemDataRole.UserRole))
|
||||
self.join_room()
|
||||
|
||||
def create_room(self):
|
||||
username = self.username_input.text().strip()
|
||||
|
||||
Reference in New Issue
Block a user