windows

linux

source

The Qt update is ready for Windows and Linux!

This week’s release is for all users, but please bear in mind it has some small layout and positioning bugs, such as subscription popups sizing a little strangely. If you would rather wait a week or two for these last issues to be cleared (and any others that pop up as more people play with this), that is totally fine.

Qt background

Since hydrus began as an application, it has used wxWidgets to draw all the windows and buttons on screen. wx has served us well, but hydrus has grown to be a complicated program with hundreds of different custom things going on, and it was starting to show. Lots of windows were flickery, modern tech like 4k screens were not excellently supported, and operating systems and window managers were unstable. If I could have moved to a more flexible and more frequently updated UI library by snapping my fingers, I would have, but the total UI code is almost three megabytes, far too much to reasonably convert as I kept at my normal weekly schedule.

A user contacted me I think about a year ago talking about Qt and possibly making some scripts to automatically convert hydrus’s wx code to Qt. I said it sounded like a good idea, and he worked in the background trying to figure it out and add manual tweaks. He was very successful, ultimately getting an essentially functional build going a couple of months ago. He passed the code to me four weeks ago, and I have since crash-learned Qt and fixed the great majority of the bugs that slipped through the automatic conversion process.

I am extremely grateful for this user’s work–this would not have happened otherwise–and I am very happy with the result. Qt is a nicer library than wx for our purposes, runs faster, has much less flicker and related jank, and provides many new options for future extensions and customisation. I also enjoy working with Qt–the library is good.

hydrus Qt

There are no critical differences between the wx and Qt builds. Every label and button is where it was before. Fonts and colours and sizes and margins are all slightly different, but nothing has been taken away. Also, there do not seem to be any dll-style conflicts with a previous installation, so you should just be able to install or extract as you would any other week without any problems.

One particularly nice thing is that Qt is overall faster. Video animations and thumbnail fading should be a little smoother. Another is that compatibility with different Linux distros is much better, so Linux users who have had crashes or drawing problems should now have an easier time.

Also, tag autocomplete dropdown result lists can now float for non-Windows. They can also float on dialogs like manage tags. Options on whether they should float or embed are now under options->gui.

Hydrus is a big program, however. I have done plenty of testing and fixed hundreds of things, and advanced users have tried out some early builds and helped me out more, but there are surely some odd layout and display bugs we have not found. There are also some that we found but I could not fix in time–for instance, sometimes the new page tab drag-and-drop does not do its new ‘live’ page navigation correctly, discord drag-and-drop file export is unreliable again, the duplicate filter’s right-hand hover window sometimes positions incorrectly, and subscription popups will change size too often due to some unusual text handling as they work through their network jobs. If you encounter your own issues, I am interested in all feedback. For now, issues that affect usability are of higher priority than a couple of pixels out of place, but I am open to all reports.

If you use IME text input, let me know how it works for you now!

I regret that I was unable to get a release-ready macOS build out for today. macOS has some important UI differences to Windows and Linux, and there are still some significant things–like maximise/borderless fullscreen support for the media viewer–that were causing stability issues. I will keep at it next week.

Users who run from source will need qtpy and either PySide2 (default) or PyQt5. Check https://hydrusnetwork.github.io/hydrus/help/running_from_source.html for more information.

misc

I also did some normal work, mostly quality-of-life ui stuff:

The 'archive/delete’ menu option now shows up when you have nothing selected, and will do everything.

Some of the system predicate edit panels now show quick-select buttons–for instance, if you hit 'system:duration’, you’ll now have two extra buttons for 'has duration’ and 'no duration’.

I fixed an important CPU inefficiency in the new files maintenance manager that was affecting some users with large file maintenance queues and large gui sessions. It was causing juddery UI, which should be completely fixed now.

Clients with large sessions that include 'collected’ media thumbnails with hundreds or thousands of files should experience less UI judder as they browse the files within those collections.

full list

qt:

hydrus now uses Qt for its client’s user interface, migrating from wx. this is thanks to a huge effort by a user, who delivered converted code for hydrus dev to finish off

a number of hacks and patches remain to compensate for old systems, which hydrus dev will slowly clean up in normal work. ui bug and layout issue reports would be greatly appreciated

shortcut storage had to be converted from fixed wx enums to an independant system. there is a small chance that one of your shortcuts, particularly if it is on the numpad, may have been converted wrong (unusual Enter/Return buttons may be hit here). if one is not working, please check what hydrus thinks it is and try re-entering it

added tentative support for 'Mode_switch’ keyboard modifier, for X11 users (and perhaps some users’ AltGr?)

autocomplete results can now float in a popup window in dialogs like manage tags! they’ll still embed by default, but there are now separate float/embed options for 'main gui’ and 'other frame’ a/cs

autocomplete results can now float in linux and macOS ok!

page drag and drop now navigates as you drag, so dropping into a page of pages works by you hovering over it and then dropping in the tabbar below, inserting exactly where you want the page to be

a couple of text inputs in the program–the watcher and gallery search pages’ text inputs, particularly–now use nicer 'placeholder’ text, which isn’t real and only shows as grey text when the input is empty

for now, moved to icons for thumbnail 'has audio/duration’ indicators, rather than the custom labels

to run the hydrus client from source, qtpy is now needed. either pyside2 (default) or qtpy5 is needed. QtCharts is optional. wx and matplotlib are no longer needed

.

misc:

'archive/delete filter’ now appears even when no file is focused. it also appears when no files are selected–and will apply to everything

the system predicate edit panels now support static buttons for easy one-click select for common predicates. duration, has audio, limit, and num tags now have these

system:duration and system:num tags now render a special label if they are >0 or =0

system:untagged is now removed from the normal list

fixed a critical cpu inefficiency in the file maintenance manager’s new always-on maintenance, which was lagging several users’ browsing sessions while it was working

fixed ctrl+mousewheel tag autocomplete results navigation to skip over multirow parent results

fixed an issue where resetting to default bandwidth rules for a network context would not update the ui properly

fixed a bug when adding a parent/sibling from autocomplete results list

the serialised png export folder now catches when a manually inputted export path’s directory does not exist

reduced metadata update lag of pages with very large media collection groups

the inaccurate 'add tags based on filename’ button is now called 'import with tags’

fixed a database UNIQUE issue when two duplicate gui session save calls happen within one second

the server’s lock_off command now works with the Hydrus-Key header auth (rather than hanging indefinitely wew)

the server now caches hashed access keys in the session manager, in memory, to avoid a db hit on access-key based reauthentication, and in instances where this authentication requires a db hit, now cleanly provides an appropriate 'serverbusy’ error

improved some media object memory management and speedy cleanup

improved boot fail graceful exit

removed a bunch of defunct flash (swf) hacks from media viewer code

bunch of misc non-qt cleanup as I went through the code

fixed a bug with rendering network credentials for human display

cleared out the ancient tag archive sync advanced help and added a stub for the new tag migration window

various help updates around wx->Qt

next week

This took a lot of work, more than I thought. I am really pleased, but also exhausted. I am going to take an easy week of fixing little layout issues and try to add system tray minimisation and css theming (which will eventually lead to 'proper’ nightmode or any other theme users can work out). I’ll also see if I can get the macOS release working better.

Once the Qt-issues rush has eased, I will return to the big tag work and Mr. Bones’ normal schedule. I’ll also test out adding an mpv video player into the media viewer, so we finally have proper video (and audio!) support.

In the longer term, I have probably a hundred Qt-cleanup jobs to catch up on. There are many behind-the-scenes hacks to get wx-specific code to talk to Qt, so I need to clean up that old bad code into something neater. I will spread this work out into my normal schedule.