Fix Bluesky login, bubble overlap, image timestamps, join lag - #3
Merged
Conversation
QImage::flipped() is not available in Qt 6.4 (Ubuntu 24.04). Use mirrored(true, false) so the qt-port builds on common Linux distros. Co-authored-by: nandi <codegod100@users.noreply.github.com>
QDesktopServices::openUrl often fails silently on Linux or hands URLs to an existing Chrome session without opening a visible window. - Add openUrlInBrowser() with google-chrome --new-window and a dedicated user-data-dir under /tmp/comic-chat-chrome - Show a non-modal Bluesky login dialog with Open in browser and Copy URL - Require a real ATProto handle (no IRC nick fallback); reject spaces Co-authored-by: nandi <codegod100@users.noreply.github.com>
Stack balloons by full box height plus separation instead of a third-height step, then resolve cloud-box overlaps against prior balloons and character bodies by shifting upward. If vertical space is exhausted at the panel top, nudge sideways for side-by-side speakers. Co-authored-by: nandi <codegod100@users.noreply.github.com>
Parse IRCv3 server-time from message tags (fallback to local time), reserve layout space under the bitmap, and draw a muted timestamp line between the image and nick/caption on photo cards. Co-authored-by: nandi <codegod100@users.noreply.github.com>
Cap balloon width to each character slot (~90% of panel/crowd), stack only same-speaker repeats vertically, stagger bubbles by body rank left-to-right, and resolve remaining overlaps by shifting up then right/left iteratively. Co-authored-by: nandi <codegod100@users.noreply.github.com>
- Parse IRC server-time with Z suffix; always stamp a display time on images - Lay out and draw timestamp in a dedicated row under the photo bitmap - Batch comic panel relayout during history flush (one repaint vs per line) - Skip balloon msgid scans during history flood; cache msgids only until flush Co-authored-by: nandi <codegod100@users.noreply.github.com>
- Include timestamp row height in image card cloudBox so timestamps are not clipped by the photo frame clip rect - Default timestamp on image balloons when none was passed - Honor fastJoin: skip per-line rpg.actor fetches during history flush - Defer image downloads until panel batch ends; batch react relayouts - Queue chat log lines during IRC history and flush once at batch end Co-authored-by: nandi <codegod100@users.noreply.github.com>
Timestamps were drawn under the image then immediately painted over by the nick/caption at the same Y. Caption now starts below timeBox. Connect freeze came from nested QEventLoop HTTP in rpg.actor sprite fetches during join. requestSpriteAsync uses plain QNetworkReply chains; ensureRpgSpriteAsync and connect/login no longer block the UI thread. Also treat join-window PRIVMSG as history for 8s when BATCH tags are missing, and insert the history log in one pass without per-row scroll. Co-authored-by: nandi <codegod100@users.noreply.github.com>
Portrait photos sized the white card to the bitmap width, which was narrower than "Aug 4, 4:48 AM" — the clip rect cut the timestamp away. Widen the card to fit the timestamp, stop clipping text to the frame, and draw a clear footer band under the photo. Co-authored-by: nandi <codegod100@users.noreply.github.com>
Timestamps were only drawn inside photo cards. Text panels (hrm, lalala, etc.) had no time at all. Pass IRCv3 server-time into all balloons and draw the label centered under each panel border in the strip. Co-authored-by: nandi <codegod100@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR improves the Qt port’s chat UX by making Bluesky login more reliable, reducing join/connect UI lag, improving balloon layout (overlap avoidance), and ensuring message timestamps are rendered consistently (including a new per-panel footer strip).
Changes:
- Add a cross-platform
openUrlInBrowser()helper and wire it into Freeq login with a non-blocking “Bluesky login” dialog. - Convert rpg.actor sprite fetching to a fully async path and batch/queue join-history updates to keep the UI responsive.
- Propagate IRCv3
server-timeinto scene balloons and render timestamps under each panel (plus a photo-card footer), while adding balloon overlap resolution.
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| qt-port/platform/BrowserLaunch.h | Declares a helper for launching URLs via explicit browser binaries (esp. Linux). |
| qt-port/platform/BrowserLaunch.cpp | Implements browser launch attempts (Chrome/Chromium/Firefox/xdg-open) with fallback to QDesktopServices. |
| qt-port/net/RpgActorClient.h | Introduces async sprite request API and in-flight tracking. |
| qt-port/net/RpgActorClient.cpp | Implements async network chain for sprite resolution/download without nested event loops. |
| qt-port/net/IrcClient.h | Adds a short post-JOIN history window to classify messages as history even without BATCH tags. |
| qt-port/net/IrcClient.cpp | Implements join-history timer/window and flush behavior. |
| qt-port/net/FreeqAuth.h | Adds loginUrlReady(url, browserOpened) signal for UI handling. |
| qt-port/net/FreeqAuth.cpp | Uses openUrlInBrowser() and emits loginUrlReady instead of relying solely on QDesktopServices. |
| qt-port/engine/scene.h | Adds per-balloon timestamp storage, updates APIs to accept timestamps, and adds overlap-resolution hooks. |
| qt-port/engine/scene.cpp | Implements timestamp layout/drawing (panel footer + photo footer), overlap resolution, and various layout adjustments. |
| qt-port/engine/pose.cpp | Switches horizontal flip implementation to mirrored(true, false). |
| qt-port/CMakeLists.txt | Adds BrowserLaunch.cpp to the comic_platform static library. |
| qt-port/app/MainWindow.h | Adds login URL handler + queues history log lines for batched flush. |
| qt-port/app/MainWindow.cpp | Implements non-modal login URL dialog; batches history log/comic updates to reduce join lag. |
| qt-port/app/ComicWidget.h | Adds batch-update API, async timestamp formatting, and deferred image fetch during batching. |
| qt-port/app/ComicWidget.cpp | Implements batching/deferred fetches, server-time formatting, and async rpg sprite request path. |
Comment on lines
+67
to
+70
| if (attempt.profileFlag && attempt.profilePath) { | ||
| args << QString::fromUtf8(attempt.profileFlag) | ||
| << QString::fromUtf8(attempt.profilePath); | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Timestamps now appear under every comic panel (the beige strip below each panel border), not only inside photo cards.
What changed
server-timeinto all balloons (text, replies, images)Connect freeze (earlier in this PR)
True async rpg.actor sprite fetches (no nested
QEventLoop); history join deferred/batched.Test plan
Aug 4, 4:48 AM)