# TODO ## Main goals for next version - Redacting messages - Download progress bar for file events, "Save as..." - Make rooms fully manageable within Mirage: settings, permissions, kick, etc - Add AppImage metadata file ## Refactoring - Rewrite the message text selection buggy mess - Put keybindings in the components they belong to instead of shoving them all in one central file - Rewrite account settings using `HTabbedContainer` - Get rid of all `currentSpacing` stuff - Use new default/reset controls system - Display name field text should be colored - Split `HScrollableTextArea` into `HTextArea` and `HScrollView` components - Refactor `Composer` - Make sure we don't store any state in delegates - Drop the `HBox` `buttonModel`/`buttonCallbacks` `HBox` approach, be more declarative ## Issues - Catch server 5xx errors when sending message and retry - Popups and room settings can't be scrolled when not enough height to show all - Handle cases where a known account's access token is invalid - If an account is gone from the user's config, discard UI state last page - First sent message in E2E room is sometimes undecryptable (can be fixed by logging out and in again) (still valid?) - After forgetting a room, it comes back because of the "you left" event - `code` and links in quote ("> http://example.com") aren't properly colored in room "last message" subtitle - `Timer` and `Animation` are bound to framerate - Terrible performance using `QT_QPA_PLATFORM=wayland-egl`, must use `xcb` - Can't use `QQmlApplicationEngine`, problem with QApplication? See https://bugreports.qt.io/browse/QTBUG-50992 - [HTML
` - Replace the rubbish default filepicker on Linux ## Media-related - Add upload keybindings (close failed upload, pause, resume) - Handle errors when setting an avatar - Show confirmation box when picking file to upload or uploading from clipboard - Show proper progress ring for mxc thumbnails loading - Sentinel function to report local file paths for already downloaded media, without having to click and try downloading first - EventFile "Save as..." context menu entry - UI for download progress (using `Transfer` like for uploads) - Show a reason or HTTP error code for thumbnails that fail to load - Support `m.file` thumbnails - Generate video thumbnails - Display GIF static thumbnails while the real GIF is loading - Audio/video player - Can GIFs use it? - `EventLink` for client-side URL previews - Special UI for matrix.to URLs - Prevent using upload keybindings in rooms where user doesn't have permission to upload ## Backend - Saving the room settings - Optimize Model item replacement - Refetch profile after manual profile change, don't wait for a room event - Better config file format - Prevent starting multiple client instances, causes problems with E2E DB - Check if username exists on login screen - [Soft logouts](https://github.com/poljar/matrix-nio/commit/aba10) - Logout previous session when adding an account that's already connected - Startup improvements: - Initial sync filter to get more events on first sync - Lazy loading members - Cache and restore profiles, room events and states - Use AsyncClient `store_sync_tokens` - Make sure to all members are fetched before sending an E2E message - Fetch all members when using the filter members bar - Properly handle direct chats - Live-reloading accounts.json - E2E - Device verification - Edit/delete own devices - Request room keys from own other devices - Auto-trust accounts within the same client - Provide help when undecryptable messages occur, including: - Trigger `nio.AsyncClient.request_room_key` - Option to export-logout-login-import to fix one-time key problems - Read receipts - Status message and presence ## Nio contributions - Streaming download & decrypt - Running blocking DB function calls in executor (WIP) - `AsyncClient.share_group_session`: send device batches concurrently (WIP) - Dedicated error for invalid password on key import - `RoomMessageMedia` and `RoomAvatarEvent` info attributes - Handle `m.room.aliases` events - Support "Empty room (was ...)" after peer left - Left room events after client reboot - Previewing room without joining - Add the `resume()` account "login" method ## Distribution and dependencies - Update to Mistune v2.0 ## Notable changes for future Qt version upgrade ### [Qt 5.13](https://wiki.qt.io/New_Features_in_Qt_5.13) - Added `SplitView` - Added `cache` property to icon ### [Qt 5.14](https://wiki.qt.io/New_Features_in_Qt_5.14) - Applications can now opt-in to use non-integer scale factors. Use `QGuiApplication::highDpiScaleFactorRoundingPolicy`. - Added `qmlRegisterSingletonInstance` function. This allows to expose a QObject as a singleton to QML, without having to create a factory function as required by `qmlRegisterSingletonType`. It is meant as a type safe replacement of `setContextProperty`. - Added `qmlRegisterAnonymousType` as a replacement for `qmlRegisterType`. It allows to specify the URI and major version for better tooling support. - qmllint gained an experimental -U option. If run with it, it warns about about accesses to unqualified identifiers - `Text` and `TextEdit` now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML. Includes the GitHub checklist extension, such that you can click to toggle checkboxes in a `TextEdit`. - `TextEdit` uses an I-beam cursor by default, and a pointing-hand cursor when hovering a checkbox or a link - Added `WheelHandler`, an Event Handler for the mouse wheel, and optionally for emulated mouse wheel events coming from a trackpad. - Added `BoundaryRule` in Qt.labs.animation: a `PropertyValueInterceptor` that restricts the range of values a numeric property can have, applies "resistance" when the value is overshooting, and provides the ability to animate it back within range. It's particularly useful in combination with `WheelHandler`, to provide similar physics as Flickable has. - `Image` and `BorderImage` now have the same `currentFrame` and `frameCount` properties that `AnimatedImage` has; this allows choosing an individual icon from an .ICO file that contains multiple icons, for example. In the future it's intended to support other multi-page formats such as PDF, TIFF and WEBP. - `Binding.restoreMode`: This property can be used to describe if and how the original value should be restored when the binding is disabled. ### [Qt 5.15](https://wiki.qt.io/New_Features_in_Qt_5.15) - Introduced inline components (ability to declare multiple QML components in the same file) - Introduced `required` properties - Added a declarative way of registering types to QML - Added support for the Nullish Coalescing Operator (`??`) - Added `qmlformat` tool which automatically formats any QML file according to the QML Coding Conventions. - Added `cursorShape` property to pointer handlers. Most pointer handlers (e.g. `DragHandler`) will change the cursor when the active state is true. `HoverHandler` will change it when the mouse is hovering over the `Item` that contains the `HoverHandler`.