Improvements for linking to events
- Fixes scrolling to an event not being reliable
- Adds new /goto command that can open URLs, go to events, or go to message indexes.
- Refactored ChatPage::handleMatrixUri() to contain the handling originally in Nheko::openLink(), and makes it return a boolean based on whether the URL was handled internally or not.
2 files changed, 32 insertions, 1 deletions
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index ece9db62..a6fbab78 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -630,6 +630,23 @@ InputBar::command(QString command, QString args)
notice(args, false);
} else if (command == "rainbownotice") {
notice(args, true);
+ } else if (command == "goto") {
+ // Goto has three different modes:
+ // 1 - Going directly to a given event ID
+ if (args[0] == '$') {
+ room->showEvent(args);
+ return;
+ }
+ // 2 - Going directly to a given message index
+ if (args[0] >= '0' && args[0] <= '9') {
+ room->showEvent(args);
+ return;
+ }
+ // 3 - Matrix URI handler, as if you clicked the URI
+ if (ChatPage::instance()->handleMatrixUri(args)) {
+ return;
+ }
+ nhlog::net()->error("Could not resolve goto: {}", args.toStdString());
}
}
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index e03c32a7..00f6d9df 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -1534,11 +1534,25 @@ void
TimelineModel::showEvent(QString eventId)
{
using namespace std::chrono_literals;
- if (idToIndex(eventId) != -1) {
+ // Direct to eventId
+ if (eventId[0] == '$') {
+ int idx = idToIndex(eventId);
+ if (idx == -1) {
+ nhlog::ui()->warn("Scrolling to event id {}, failed - no known index",
+ eventId.toStdString());
+ return;
+ }
eventIdToShow = eventId;
emit scrollTargetChanged();
showEventTimer.start(50ms);
+ return;
}
+ // to message index
+ eventId = indexToId(eventId.toInt());
+ eventIdToShow = eventId;
+ emit scrollTargetChanged();
+ showEventTimer.start(50ms);
+ return;
}
void
|