Preset Groups - Drag and Drop Brush Management

Preset Groups - v1.2.0

v1.2.0 Changes:

  • Compatible with any Krita theme (requires restart)
  • Plugin’s colors can be customized in styles.py file
  • You can use ctrl + scroll to resize thumbnails
  • Fixed some visual bugs

Tired of renaming brush presets to simply reorder them in their tag? This plugin aims to fix that issue and make Krita’s brush management more convenient for artists that are used to Photoshop and Clip Studio Paint.

Add brushes to the plugin:

1 add brushes

Organize flexibly:

2 move brushes and groups_compressed

Switch your current brush:

3 switch current brush

Features:

  • Drag to reorder brushes and groups
  • Multi select + drag to move many brushes or groups
  • Slider to adjust brush thumbnail size
  • Displays brush names with adjustable font size
  • Easily renamable groups (double click their name)
  • Cycle through brushes left or right (rebindable)
  • Live brush size slider
  • Option to have only one group be open at a time (Exclusive Uncollapse)

Usage

This plugin is essentially a workaround to krita’s brush management. You add brush presets to Preset Groups and are free to organize them as you wish within the plugin.

Plugin Actions

  • Left-click = Select brush or group
  • Left-click+Drag = Move brushes or groups
  • Right-click = Open menu for brush(es) or group(s)
  • Alt + Right-click = Open group rename menu
  • Hold Ctrl+Click = Multi-select brushes or groups
  • Hold Shift+Click = Range-select brushes or groups
  • Ctrl + Shift + Alt + Right-click = Delete group

Default Shortcuts

  • W - Add brush to group
  • , - Select previous brush
  • . - Select next brush

Check if the plugin’s shortcuts conflict with Krita

Click the plugin’s settings button and rebind there or rebind Krita’s shortcuts: Settings → Configure Krita → Keyboard Shortcuts

Brush size slider not reaching your max brush size?

Hold ] until you reach max brush size or click the plugin’s settings button to define it there. By default Krita’s max brush size is set to 1000px. You can check your set max brush is via Settings → Configure Krita → General → Miscellaneous

Installation

Download the plugin:

Get the latest version v1.2.0 or visit the plugin’s github page

Open Krita and in the top bar click:

Tools > Scripts > Import Python Plugin From File > select the zip file

Restart Krita:

Close and open Krita

Updating

The plugin’s config folder contains the brushes you’ve added to the docker, your groups, and your custom keyboard shortcuts.

Zip update: Backup the config folder, install the new zip file to update the plugin. Paste back in your folder.
Faster: Paste the contents of the new zip file to krita’s plugin directory to update the plugin, exclude the config folder to not overwrite yours.

Plugin directory:

Windows: %userprofile%\AppData\Roaming\Krita\pykrita\preset_groups
Linux: ~/.local/share/krita/pykrita/preset_groups


Acknowledgement

Thank you Toma_Omito for creating Quick Access Manager
Preset Groups is a heavily modified fork of the “Quick Brush Sets” docker from their plugin

35 Likes

That’s interesting, I’ll try it :man_gesturing_ok:t2:, thank you :smiling_face:.

I tried it and noticed something. It doesn’t add the brushes unless you have the group name selected as if you were going to change it.

That sounds extremely convenient. I’ll give it a try. Thank you for sharing.

Sound like a great plugin, I definitely try this one! :hot_beverage::victory_hand:

Thanks for trying it and giving feedback!
What I’m understanding from the feedback is if you only have one group, you want it to always be selected? Since there would be no point in allowing a single group be deselected.

Feel free to let me know if this new release solves your issue: plugin’s zip file or visit the plugin’s release page

Let me show you so it’s clearer :grimacing:. What I mean is that if the group’s dropdown menu is open and you select a brush, it won’t be added (image 1). You’ll have to select the group’s text as if you were going to edit it, and then if you click the icon to add a brush, it will work (image 2).

1 Like

Tested! And I love it, thank you.

It’s very nice to be able to do groups, and drag and drop the brushes to reorder them. :+1: I changed a bit a bunch of setMinimumWidth to make it fit my two thin columns layout (under), I’ll keep it and see if it sticks to my habits.

3 Likes

Glad to hear it! Means a lot to have good feedback from someone who’s been a Krita veteran.

1 Like

This is much clearer, thank you. I’ve added a feature to the plugin that you can turn on which automatically selects the uncollapsed group so you don’t have to click the thin text row.

Here’s the download link and release page for the new v1.0.2 feature

Also if you don’t like having to click the + icon to add a brush, you can use “W” or a different key of your choice to do so.

2 Likes

Hmm im havinga some problems.., so just a Q.. so, when i downloaded and activated this plug, through the “usual plugin procedure.. is it gonna show up in the dockers list?

haha…sorry for being a bit returd.. just asking, so i know if i missed something, or itsijust a bug in my system, that aint really functioning correctly…

Best,

Carl.

You don’t see it in your “Settings > Dockers” list after activating the plugin in Python Plugin Manager? What version of Krita are you using?

1 Like

Thanks for creating this plugin; it looks like it would be great. Unfortunately I’m having very significant delay with everything since installing it, so have had to disable it for now. Everything from opening krita, opening a new canvas, selecting a brush, and painting, is impossible. 8-10 seconds+ of delay for everything. Everything just freezes, and, especially regarding painting, it’s not possible to paint normally, as the juddering/delay is happening each time change brush, and affecting painting overall. Hoping there’s a straightforward answer that won’t take up lots of your time to fix.

Other plugins am running = brush sfx, kanvasbuddy, oughtasave, reference docker, shortcut composer, tf easy colours map, theme creator.

Running a 5.3-alpha appimage from a few months back, on mx linux (debian 12), mate, x11, kernel 6.1, amd pc.

Hi elevate, I’m sorry to hear that the plugin isn’t working well for you; makes me wish I had tested it on linux as well before sharing it. Fortunately, I’m familiar with the behavior you’re describing and while I’m not getting 8-10 delay(I assume due to our pc builds being different), it is noticeably slower in 5.3 than 5.2. I’ve attached recordings showing the difference:


Can you try the plugin in 5.2 and see how it performs there?

Edit: I updated the plugin which has some new optimizations, feel free to try that as well.

3 Likes

Hi tenzindraws and thank you very much for the update … I’ve just run it and the delays have gone! :+1: Just one more pesky thing though, lol, now I have seen the UI … I have to set font size in krita to at least 15, so is it possible to include a slider for font size? The icon size-slider range is so great, and I wouldn’t need the font to match highest icon size, lol, but if adjustable is possible that would be perfect.

1 Like

I’m glad to hear the update fixed it :smiley:
Adjustable font size makes sense, I’ve added the feature in the latest version. Check it out

3 Likes

I can’t thank you enough @tenzindraws … if all devs were as responsive and helpful as you, wow, the tech world would be a very bright place! It’s working perfectly. Wishing you a lovely holidays and 2026! :partying_face: :trophy:

1 Like

Cool, I’ll test the update. Indeed, I had to uninstall the plugin because after a little while, I started to have massive lag on the canvas (eg. video under, visible when a cursor + outline are active).

Some quick check.

1. Aggressive Thumbnail Checking with force_fresh=True (Most Severe)

Location: thumbnail_manager.py:366

In check_thumbnail_changes(), every preset is checked with force_fresh=True:

changed, new_hash = self._has_thumbnail_changed(preset_name, force_fresh=True)

This causes the plugin to:

  • Force-fetch fresh presets from Krita API on every timer tick (every 2 seconds)
  • Bypass ALL caching mechanisms
  • Re-fetch the entire preset dictionary from Krita for EACH preset
  • Compute expensive MD5 hashes with 32x32 grid sampling (1024+ pixel samples per preset)

Impact: For a user with 50 presets, this means 50 API calls + 50 hash computations every 2 seconds = massive CPU overhead.

2. Too Frequent Thumbnail Checking Timer

Location: preset_groups.py:69

_THUMBNAIL_CHECK_INTERVAL = 2000  # Fast interval for immediate thumbnail detection

Combined with the force_fresh issue, this creates a performance storm every 2 seconds.

3. Overly Complex Hash Computation

Location: thumbnail_manager.py:31-73

The _compute_full_image_hash() uses:

  • 32x32 grid sampling (1024 sample points)
  • Edge and corner sampling (8 more points)
  • MD5 hashing of every pixel’s ARGB values

This is extremely expensive to run repeatedly on every preset every 2 seconds.

4. Excessive Retry Mechanism

Location: thumbnail_manager.py:24

_SAVE_RETRY_DELAYS = [50, 150, 300, 500, 800, 1200]  # ms delays for retries

When a preset is saved, it triggers 6 retry attempts with timers at 50ms, 150ms, 300ms, 500ms, 800ms, and 1200ms. Each retry:

  • Force-fetches the preset from Krita
  • Recomputes the expensive hash
  • Updates buttons if changed
3 Likes

Thank you for the notes, indeed I noticed some stuttering every 2 seconds while painting when ~40 brushes were in the plugin. I wish Krita had an API signal for an “Overwrite Brush Preset” event would exist so the plugin simply refreshes thumbnails when they’re overwritten and not every 2 seconds. Since that signal doesn’t exist, the hashing system has been optimized to use less resources and stop stuttering when painting:

v1.0.7 Release

Optimization Before (original) Now (optimized) Impact
Hash grid 32×32 (1024 samples) 16×16 (256 samples) 4x faster hashing
Presets per cycle 50 10 5x fewer API calls per timer tick
Retry delays [50,150,300,500,800,1200]ms [100,400,1000]ms 50% fewer retries

Result: Reduction in CPU workload for hash detection, while still detecting changes accurately

Note: When there’s ~40 presets or more added to the plugin, there may be a delay for overwritten thumbnail changes to be detected. Personally, I think it’s a reasonable compromise for a smoother painting experience since it eliminates stuttering.

1 Like

Hi Deevad, sorry that the plugin was causing massive delay when painting. It was an oversight to not consider that the thumbnail detection system can cause lag when there’s a lot of brushes in the docker. The latest release has been optimized so it doesn’t cause delay even if you have a lot of brushes in the plugin, feel free to try it out

2 Likes