Always open the user details dialog in the focused window

This fixes some odd UX where you tap on someone's user in a search or
pinned messages window, but it opens in the NeoChat main window instead.

Fixes #681
This commit is contained in:
Joshua Goins
2025-01-15 16:38:11 -05:00
parent a8f22003cb
commit 590fba7deb
3 changed files with 18 additions and 3 deletions

View File

@@ -325,11 +325,13 @@ Kirigami.ApplicationWindow {
}) })
} }
function showUserDetail(user, room) { function showUserDetail(user, room) {
Qt.createComponent("org.kde.neochat", "UserDetailDialog").createObject(root.QQC2.ApplicationWindow.window, { const dialog = Qt.createComponent("org.kde.neochat", "UserDetailDialog").createObject(root, {
room: room, room: room,
user: user, user: user,
connection: root.connection connection: root.connection,
}).open(); });
dialog.parent = QmlUtils.focusedWindowItem(); // Kirigami Dialogs overwrite the parent, so we need to set it again
dialog.open();
} }
function load() { function load() {

View File

@@ -13,6 +13,7 @@
#include <Quotient/connection.h> #include <Quotient/connection.h>
#include <QJsonDocument> #include <QJsonDocument>
#include <QQuickWindow>
using namespace Quotient; using namespace Quotient;
@@ -37,6 +38,16 @@ QColor QmlUtils::getUserColor(qreal hueF)
return QColor::fromHslF(hueF, 1, -0.7 * lightness + 0.9, 1); return QColor::fromHslF(hueF, 1, -0.7 * lightness + 0.9, 1);
} }
QQuickItem *QmlUtils::focusedWindowItem()
{
const auto window = qobject_cast<QQuickWindow *>(QGuiApplication::focusWindow());
if (window) {
return window->contentItem();
} else {
return nullptr;
}
}
bool Utils::isEmoji(const QString &text) bool Utils::isEmoji(const QString &text)
{ {
#ifdef HAVE_ICU #ifdef HAVE_ICU

View File

@@ -7,6 +7,7 @@
#include <QGuiApplication> #include <QGuiApplication>
#include <QPalette> #include <QPalette>
#include <QQmlEngine> #include <QQmlEngine>
#include <QQuickItem>
#include <QRegularExpression> #include <QRegularExpression>
#include <Quotient/user.h> #include <Quotient/user.h>
@@ -36,6 +37,7 @@ public:
Q_INVOKABLE bool isValidJson(const QByteArray &json); Q_INVOKABLE bool isValidJson(const QByteArray &json);
Q_INVOKABLE QString escapeString(const QString &string); Q_INVOKABLE QString escapeString(const QString &string);
Q_INVOKABLE QColor getUserColor(qreal hueF); Q_INVOKABLE QColor getUserColor(qreal hueF);
Q_INVOKABLE QQuickItem *focusedWindowItem();
private: private:
QmlUtils() = default; QmlUtils() = default;