diff --git a/src/citron/util/multiplayer_room_overlay.cpp b/src/citron/util/multiplayer_room_overlay.cpp
index 020fd0766..0d36a0fe5 100644
--- a/src/citron/util/multiplayer_room_overlay.cpp
+++ b/src/citron/util/multiplayer_room_overlay.cpp
@@ -28,7 +28,7 @@ MultiplayerRoomOverlay::MultiplayerRoomOverlay(GMainWindow* parent)
border_color = QColor(60, 60, 60, 120);
main_layout = new QGridLayout(this);
- main_layout->setContentsMargins(padding, padding, 0, 0); // No margins on bottom/right for grip
+ main_layout->setContentsMargins(padding, padding, 0, 0);
main_layout->setSpacing(6);
players_online_label = new QLabel(this);
@@ -71,7 +71,6 @@ MultiplayerRoomOverlay::~MultiplayerRoomOverlay() {
}
void MultiplayerRoomOverlay::OnEmulationStarting() {
- // When emulation starts, resume updates if we are visible.
if (is_visible) {
ConnectToRoom();
update_timer.start(500);
@@ -79,7 +78,6 @@ void MultiplayerRoomOverlay::OnEmulationStarting() {
}
void MultiplayerRoomOverlay::OnEmulationStopping() {
- // CRASH FIX: When emulation stops, immediately disconnect from network objects.
update_timer.stop();
DisconnectFromRoom();
}
@@ -90,7 +88,6 @@ void MultiplayerRoomOverlay::SetVisible(bool visible) {
if (visible) {
show();
- // Only start connecting and updating if emulation is running.
if (main_window && main_window->IsEmulationRunning()) {
ConnectToRoom();
update_timer.start(500);
@@ -116,19 +113,26 @@ void MultiplayerRoomOverlay::paintEvent(QPaintEvent* event) {
void MultiplayerRoomOverlay::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); if (!has_been_moved) UpdatePosition(); }
bool MultiplayerRoomOverlay::eventFilter(QObject* watched, QEvent* event) { if (event->type() == QEvent::MouseButtonPress) { if (chat_room_widget->hasFocus()) { chat_room_widget->clearFocus(); } } return QObject::eventFilter(watched, event); }
+
#if defined(Q_OS_LINUX)
void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton) {
if (size_grip->geometry().contains(event->pos())) {
// Let the size grip handle the event
} else if (!childAt(event->pos()) || childAt(event->pos()) == this) {
- if (windowHandle()) windowHandle()->startSystemMove();
+ if (windowHandle()) {
+ QTimer::singleShot(0, this, [this] { windowHandle()->startSystemMove(); });
+ }
}
}
QWidget::mousePressEvent(event);
}
-void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) { QWidget::mouseMoveEvent(event); }
-#else
+
+void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) {
+ QWidget::mouseMoveEvent(event);
+}
+
+#else // Windows and other platforms
void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton) {
if (size_grip->geometry().contains(event->pos())) {
@@ -142,12 +146,14 @@ void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) {
}
QWidget::mousePressEvent(event);
}
+
void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) {
if (is_dragging) {
QPoint delta = event->globalPosition().toPoint() - drag_start_pos;
move(widget_start_pos + delta);
+ has_been_moved = true;
}
- QWidget::mouseMoveEvent(event); // Corrected typo here
+ QWidget::mouseMoveEvent(event);
}
#endif
@@ -168,7 +174,7 @@ void MultiplayerRoomOverlay::ConnectToRoom() {
if (multiplayer_state->IsClientRoomVisible()) {
chat_room_widget->setEnabled(false);
chat_room_widget->Clear();
- chat_room_widget->AppendStatusMessage(tr("Chat available in main window."));
+ chat_room_widget->AppendStatusMessage(tr("In order to use chat functionality in the Overlay, please close the Multiplayer Room Window."));
return;
}
@@ -177,7 +183,10 @@ void MultiplayerRoomOverlay::ConnectToRoom() {
room_member = room_network.GetRoomMember().lock();
if (room_member) {
- chat_room_widget->Initialize(&room_network);
+ if (!is_chat_initialized) {
+ chat_room_widget->Initialize(&room_network);
+ is_chat_initialized = true;
+ }
} else {
chat_room_widget->Clear();
chat_room_widget->AppendStatusMessage(tr("Not connected to a room."));
@@ -185,10 +194,17 @@ void MultiplayerRoomOverlay::ConnectToRoom() {
}
void MultiplayerRoomOverlay::DisconnectFromRoom() {
- chat_room_widget->Clear();
+ ClearUI();
room_member.reset();
multiplayer_state = nullptr;
+ is_chat_initialized = false;
+}
+
+void MultiplayerRoomOverlay::ClearUI() {
players_online_label->setText(QString::fromUtf8("Players Online: 0"));
+ chat_room_widget->Clear();
+ chat_room_widget->AppendStatusMessage(tr("Not connected to a room."));
+ chat_room_widget->SetPlayerList({});
}
void MultiplayerRoomOverlay::UpdateRoomData() {
@@ -201,28 +217,26 @@ void MultiplayerRoomOverlay::UpdateRoomData() {
if (chat_room_widget->isEnabled()) {
chat_room_widget->setEnabled(false);
chat_room_widget->Clear();
- chat_room_widget->AppendStatusMessage(tr("Chat available in main window."));
- }
- } else {
- if (!chat_room_widget->isEnabled()) {
- ConnectToRoom();
+ chat_room_widget->AppendStatusMessage(tr("In order to use chat functionality in the Overlay, please close the Multiplayer Room Window."));
}
+ return;
+ }
+
+ if (!chat_room_widget->isEnabled()) {
+ ConnectToRoom();
}
if (room_member && room_member->GetState() >= Network::RoomMember::State::Joined) {
const auto& members = room_member->GetMemberInformation();
QString label_text = QString::fromStdString("Players Online: %1").arg(members.size());
players_online_label->setText(label_text);
+
if (chat_room_widget->isEnabled()) {
chat_room_widget->SetPlayerList(members);
}
} else {
- players_online_label->setText(QString::fromUtf8("Players Online: 0"));
- if (!room_member && !multiplayer_state->IsClientRoomVisible()) {
- chat_room_widget->Clear();
- chat_room_widget->AppendStatusMessage(tr("Not connected to a room."));
- ConnectToRoom();
- }
+ ClearUI();
+ room_member.reset();
}
}
@@ -232,4 +246,4 @@ void MultiplayerRoomOverlay::UpdatePosition() {
QPoint main_window_pos = main_window->mapToGlobal(QPoint(0, 0));
move(main_window_pos.x() + main_window->width() - this->width() - 10, main_window_pos.y() + 10);
}
-}
+}
\ No newline at end of file
diff --git a/src/citron/util/multiplayer_room_overlay.h b/src/citron/util/multiplayer_room_overlay.h
index d93580f18..5a5e84233 100644
--- a/src/citron/util/multiplayer_room_overlay.h
+++ b/src/citron/util/multiplayer_room_overlay.h
@@ -8,6 +8,8 @@
#include
#include
#include
+#include
+#include
#include "citron/multiplayer/state.h"
#include "citron/multiplayer/chat_room.h"
@@ -45,6 +47,7 @@ private:
void UpdatePosition();
void ConnectToRoom();
void DisconnectFromRoom();
+ void ClearUI();
GMainWindow* main_window;
QTimer update_timer;
@@ -74,4 +77,7 @@ private:
bool has_been_moved = false;
QPoint drag_start_pos;
QPoint widget_start_pos;
+
+ // State tracking
+ bool is_chat_initialized = false;
};