# BuliCommander

**URL:** <https://krita-artists.org/t/bulicommander/11612>\
**Category:** Plugins and Scripts\
**Created:** [September 5, 2020, 4:16pm UTC](https://krita-artists.org/t/bulicommander/11612 "2020-09-05T16:16:40Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [December 28, 2020, 11:03pm UTC](https://krita-artists.org/t/bulicommander/11612/21 "2020-12-28T23:03:55Z")

</div>

Hi

Release [v0.6.0a](https://github.com/Grum999/BuliCommander/releases/tag/0.6.0a) is available

_[2020-12-29] Version 0.6.0a_

- Implement _Clipboard manager_
- Implement tool _Copy to clipboard_
- Implement function _Open file as reference image_
- Implement context menu for files
- Improve Krita image information - _Reference Images_
- Fix bug - _Active panel not highlighted_

For screenshots and functionalities description, you can read the [full detailed release content](https://github.com/Grum999/BuliCommander/blob/master/releases-notes/RELEASE-0.6.0a.md) directly on github repository.  
And main [BuliCommander](https://github.com/Grum999/BuliCommander) page.

Grum999

---

<div class="post-metadata">

**Author:** ![TheTwo](https://krita-artists.org/user_avatar/krita-artists.org/thetwo/32/32836_2.png) [@TheTwo](https://krita-artists.org/u/TheTwo)\
**Post date:** [August 22, 2021, 9:47am UTC](https://krita-artists.org/t/bulicommander/11612/22 "2021-08-22T09:47:12Z")

</div>

hi. It seems that this plugin has not been updated for a long time. I just used it and I got an error when opening “preference”

> AttributeError  
> Python 3.8.1: C:\GAMES\STEAM\steamapps\common\Krita\krita\bin\krita.exe  
> Sun Aug 22 17:42:40 2021
> 
> A problem occurred in a Python script. Here is the sequence of  
> function calls leading up to the error, in the order they occurred.
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcuicontroller.py in commandSettingsOpen(self=\<bulicommander.bc.bcuicontroller.BCUIController object\>)  
> 2289 def commandSettingsOpen(self):  
> 2290 “”“Open dialog box settings”“”  
> 2291 if BCSettingsDialogBox.open(f’{self.\_\_bcName}::Settings’, self):  
> 2292 self.saveSettings()  
> 2293  
> global BCSettingsDialogBox = \<class ‘bulicommander.bc.bcsettings.BCSettingsDialogBox’\>  
> BCSettingsDialogBox.open =   
> self = \<bulicommander.bc.bcuicontroller.BCUIController object\>
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py in open(title=‘Buli Commander::Settings’, uicontroller=\<bulicommander.bc.bcuicontroller.BCUIController object\>)  
> 1325 @staticmethod  
> 1326 def open(title, uicontroller):  
> 1327 “”“Open dialog box”“”  
> 1328 db = BCSettingsDialogBox(title, uicontroller)  
> 1329 return db.exec()  
> db undefined  
> global BCSettingsDialogBox = \<class ‘bulicommander.bc.bcsettings.BCSettingsDialogBox’\>  
> title = ‘Buli Commander::Settings’  
> uicontroller = \<bulicommander.bc.bcuicontroller.BCUIController object\>
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py in **init** (self=\<bulicommander.bc.bcsettings.BCSettingsDialogBox object\>, title=‘Buli Commander::Settings’, uicontroller=\<bulicommander.bc.bcuicontroller.BCUIController object\>, parent=None)  
> 953 self.bbOkCancel.accepted.connect(self.\_\_applySettings)  
> 954  
> 955 self.\_\_initialise()  
> 956  
> 957  
> self = \<bulicommander.bc.bcsettings.BCSettingsDialogBox object\>  
> self.\_\_initialise undefined
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py in \_\_initialise(self=\<bulicommander.bc.bcsettings.BCSettingsDialogBox object\>)  
> 1010  
> 1011 # — NAV Category -----------------------------------------------------  
> 1012 self.bcpbCNUserDefined.setPath(self.\_\_uiController.settings().option(BCSettingsKey.CONFIG\_FILES\_HOME\_DIR\_UD.id()))  
> 1013 self.bcpbCNUserDefined.setOptions(BCWPathBar.OPTION\_SHOW\_NONE)  
> 1014  
> self = \<bulicommander.bc.bcsettings.BCSettingsDialogBox object\>  
> self.bcpbCNUserDefined = \<bulicommander.bc.bcwpathbar.BCWPathBar object\>  
> self.bcpbCNUserDefined.setPath = \<bound method BCWPathBar.setPath of \<bulicommander.bc.bcwpathbar.BCWPathBar object\>\>  
> self.\_\_uiController undefined  
> global BCSettingsKey = \<enum ‘BCSettingsKey’\>  
> BCSettingsKey.CONFIG\_FILES\_HOME\_DIR\_UD = \<BCSettingsKey.CONFIG\_FILES\_HOME\_DIR\_UD: ‘config.files.homeDir.userDefined’\>  
> BCSettingsKey.CONFIG\_FILES\_HOME\_DIR\_UD.id = \<bound method BCSettingsKey.id of \<BCSettingsKey…HOME\_DIR\_UD: ‘config.files.homeDir.userDefined’\>\>
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcwpathbar.py in setPath(self=\<bulicommander.bc.bcwpathbar.BCWPathBar object\>, path=‘’)  
> 725 def setPath(self, path=None):  
> 726 “”“Set current path”“”  
> 727 self.frameBreacrumbPath.set\_path(path)  
> 728  
> 729 def goToBackPath(self):  
> self = \<bulicommander.bc.bcwpathbar.BCWPathBar object\>  
> self.frameBreacrumbPath = \<bulicommander.libs.breadcrumbsaddressbar.breadcrumbsaddressbar.BreadcrumbsAddressBar object\>  
> self.frameBreacrumbPath.set\_path = \<bound method BreadcrumbsAddressBar.set\_path of …adcrumbsaddressbar.BreadcrumbsAddressBar object\>\>  
> path = ‘’
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\libs\breadcrumbsaddressbar\breadcrumbsaddressbar.py in set\_path(self=\<bulicommander.libs.breadcrumbsaddressbar.breadcrumbsaddressbar.BreadcrumbsAddressBar object\>, path=WindowsPath(‘C:/GAMES/STEAM/steamapps/common/Krita’))  
> 364 emit\_err.emit(path)  
> 365 return False  
> 366 self._clear\_crumbs()  
> 367 self.path_ = path  
> 368 self.line\_address.setText(str(path))  
> self = \<bulicommander.libs.breadcrumbsaddressbar.breadcrumbsaddressbar.BreadcrumbsAddressBar object\>  
> self.\_clear\_crumbs = \>
> 
> C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\libs\breadcrumbsaddressbar\breadcrumbsaddressbar.py in \_clear\_crumbs(self=\<bulicommander.libs.breadcrumbsaddressbar.breadcrumbsaddressbar.BreadcrumbsAddressBar object\>)  
> 243 if child.widget():  
> 244 layout.removeWidget(child.widget())  
> 245 child.widget().deleteLater()  
> 246 child.widget().setParent(None)  
> 247  
> child = \<PyQt5.QtWidgets.QWidgetItem object\>  
> child.widget =   
> ).deleteLater undefined  
> AttributeError: ‘NoneType’ object has no attribute ‘deleteLater’  
> **cause** = None  
> **class** = \<class ‘AttributeError’\>  
> **context** = None  
> **delattr** = \<method-wrapper ‘ **delattr** ’ of AttributeError object\>  
> **dict** = {}  
> **dir** =   
> **doc** = ‘Attribute not found.’  
> **eq** = \<method-wrapper ‘ **eq** ’ of AttributeError object\>  
> **format** =   
> **ge** = \<method-wrapper ‘ **ge** ’ of AttributeError object\>  
> **getattribute** = \<method-wrapper ‘ **getattribute** ’ of AttributeError object\>  
> **gt** = \<method-wrapper ‘ **gt** ’ of AttributeError object\>  
> **hash** = \<method-wrapper ‘ **hash** ’ of AttributeError object\>  
> **init** = \<method-wrapper ‘ **init** ’ of AttributeError object\>  
> **init\_subclass** =   
> **le** = \<method-wrapper ‘ **le** ’ of AttributeError object\>  
> **lt** = \<method-wrapper ‘ **lt** ’ of AttributeError object\>  
> **ne** = \<method-wrapper ‘ **ne** ’ of AttributeError object\>  
> **new** =   
> **reduce** =   
> **reduce\_ex** =   
> **repr** = \<method-wrapper ‘ **repr** ’ of AttributeError object\>  
> **setattr** = \<method-wrapper ‘ **setattr** ’ of AttributeError object\>  
> **setstate** =   
> **sizeof** =   
> **str** = \<method-wrapper ‘ **str** ’ of AttributeError object\>  
> **subclasshook** =   
> **suppress\_context** = False  
> **traceback** =   
> args = (“‘NoneType’ object has no attribute ‘deleteLater’”,)  
> with\_traceback =
> 
> The above is a description of an error in a Python program. Here is  
> the original traceback:
> 
> Traceback (most recent call last):  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcuicontroller.py”, line 2291, in commandSettingsOpen  
> if BCSettingsDialogBox.open(f’{self.\_\_bcName}::Settings’, self):  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py”, line 1328, in open  
> db = BCSettingsDialogBox(title, uicontroller)  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py”, line 955, in **init**  
> self.\_\_initialise()  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcsettings.py”, line 1012, in \_\_initialise  
> self.bcpbCNUserDefined.setPath(self.\_\_uiController.settings().option(BCSettingsKey.CONFIG\_FILES\_HOME\_DIR\_UD.id()))  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\bc\bcwpathbar.py”, line 727, in setPath  
> self.frameBreacrumbPath.set\_path(path)  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\libs\breadcrumbsaddressbar\breadcrumbsaddressbar.py”, line 366, in set\_path  
> self.\_clear\_crumbs()  
> File “C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\libs\breadcrumbsaddressbar\breadcrumbsaddressbar.py”, line 245, in \_clear\_crumbs  
> child.widget().deleteLater()  
> AttributeError: ‘NoneType’ object has no attribute ‘deleteLater’

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [August 22, 2021, 4:25pm UTC](https://krita-artists.org/t/bulicommander/11612/23 "2021-08-22T16:25:04Z")

</div>

Hi

I suppose you’re using the 0.6.0a version  
I don’t make many tests on windows, but I already encountered this error with Krita 5 even under Linux.

I’m currently not very active with this plugin (I’m working on too many things currently at the same time 😥) but this bug has been fixed with 0.7.0a version ([Fix bug · Grum999/BuliCommander@6072dcf · GitHub](https://github.com/Grum999/BuliCommander/commit/6072dcf4abd519e379d06a6b4e2862596146f1ba))

As 0.7.0a is not yet released because I didn’t finished some heavy work I want in this version, there’s no official package yet published.

But branch is available on github repository.

> **[GitHub - Grum999/BuliCommander at v0.7.0a](https://github.com/Grum999/BuliCommander/tree/v0.7.0a)**
>
> v0.7.0a

You can download it and use it: normally I push my commit on github only if it’s stable enough to be let the plugin being usable.

Grum999

---

<div class="post-metadata">

**Author:** ![TheTwo](https://krita-artists.org/user_avatar/krita-artists.org/thetwo/32/32836_2.png) [@TheTwo](https://krita-artists.org/u/TheTwo)\
**Post date:** [September 16, 2021, 9:02am UTC](https://krita-artists.org/t/bulicommander/11612/24 "2021-09-16T09:02:56Z")

</div>

A bug encountered today: I did not perform any operation, it popped up when I closed the gmic filter and ui becomes very big

```auto
AttributeError
Python 3.8.1: C:\GAMES\STEAM\steamapps\common\Krita\krita\bin\krita.exe
Thu Sep 16 16:57:09 2021

A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.

 C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\pktk\modules\uitheme.py in reloadResources(clearPixmapCache=True)
   96 clearPixmapCache=True
   97 for theme in UITheme.__themes:
   98 if UITheme.__themes[theme].autoReload():
   99 # reload
  100 UITheme.__themes[theme].loadResources(clearPixmapCache)
global UITheme = <class 'bulicommander.pktk.modules.uitheme.UITheme'>
UITheme.__themes undefined
theme = r'C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\pktk\resources'
].autoReload undefined
AttributeError: 'UITheme' object has no attribute 'autoReload'
    __cause__ = None
    __class__ = <class 'AttributeError'>
    __context__ = None
    __delattr__ = <method-wrapper ' __delattr__' of AttributeError object>
    __dict__ = {}
    __dir__ = <built-in method __dir__ of AttributeError object>
    __doc__ = 'Attribute not found.'
    __eq__ = <method-wrapper ' __eq__' of AttributeError object>
    __format__ = <built-in method __format__ of AttributeError object>
    __ge__ = <method-wrapper ' __ge__' of AttributeError object>
    __getattribute__ = <method-wrapper ' __getattribute__' of AttributeError object>
    __gt__ = <method-wrapper ' __gt__' of AttributeError object>
    __hash__ = <method-wrapper ' __hash__' of AttributeError object>
    __init__ = <method-wrapper ' __init__' of AttributeError object>
    __init_subclass__ = <built-in method __init_subclass__ of type object>
    __le__ = <method-wrapper ' __le__' of AttributeError object>
    __lt__ = <method-wrapper ' __lt__' of AttributeError object>
    __ne__ = <method-wrapper ' __ne__' of AttributeError object>
    __new__ = <built-in method __new__ of type object>
    __reduce__ = <built-in method __reduce__ of AttributeError object>
    __reduce_ex__ = <built-in method __reduce_ex__ of AttributeError object>
    __repr__ = <method-wrapper ' __repr__' of AttributeError object>
    __setattr__ = <method-wrapper ' __setattr__' of AttributeError object>
    __setstate__ = <built-in method __setstate__ of AttributeError object>
    __sizeof__ = <built-in method __sizeof__ of AttributeError object>
    __str__ = <method-wrapper ' __str__' of AttributeError object>
    __subclasshook__ = <built-in method __subclasshook__ of type object>
    __suppress_context__ = False
    __traceback__ = <traceback object>
    args = ("'UITheme' object has no attribute 'autoReload'",)
    with_traceback = <built-in method with_traceback of AttributeError object>

The above is a description of an error in a Python program. Here is
the original traceback:

Traceback (most recent call last):
  File "C:\Users\123\AppData\Roaming\krita\pykrita\bulicommander\pktk\modules\uitheme.py", line 98, in reloadResources
    if UITheme.__themes[theme].autoReload():
AttributeError: 'UITheme' object has no attribute 'autoReload'

```

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [November 1, 2021, 2:26pm UTC](https://krita-artists.org/t/bulicommander/11612/25 "2021-11-01T14:26:56Z")

</div>

Hi

Sorry to not have answered before 😅

Thanks for the detail of error message, it’s fixed on my side and should be available with release 0.7.0b  
I’m currently working on it, not able to tell when it will be released, but I already fixed many small annoying and/or blocking bugs (most of them are windows specific 😅), and tried to improve a bit the UI for windows too (but do not expect UI being redesigned for windows, this might be for release 0.8.0 or 0.9.0 🙃)

Also, same bug occurs with BuliNote; also fixed on ly side for BuliNote then , but not yet released.

Grum999

---

<div class="post-metadata">

**Author:** ![tom](https://krita-artists.org/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@tom](https://krita-artists.org/u/tom)\
**Post date:** [June 21, 2022, 2:32am UTC](https://krita-artists.org/t/bulicommander/11612/26 "2022-06-21T02:32:27Z")

</div>

Pretty impressive to create a file manager entirely within Krita. Nice for having a “project view”.  
Couple of things:

1. Are there plans to change the strength of mouse scroll in grid view? Currently, scrolling with 256 px thumbnails seems to scroll an entire page, which is pretty strong compared to list view and Dolphin.
2. Is there a reason behind “Open File” on the welcome screen not being able to open Buli Commander? Plugin limitation?

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [June 21, 2022, 9:33am UTC](https://krita-artists.org/t/bulicommander/11612/27 "2022-06-21T09:33:47Z")

</div>

Hi

> [@tom](#):
>
> Pretty impressive to create a file manager entirely within Krita

Thanks 😊  
If at least one person find it useful enough to ask for enhancements 🤗

Your questions/ideas are interesting 🙂

> [@tom](#):
>
> Are there plans to change the strength of mouse scroll in grid view? Currently, scrolling with 256 px thumbnails seems to scroll an entire page, which is pretty strong compared to list view and Dolphin.

I opened a feature request:

> <https://github.com/Grum999/BuliCommander/issues/5>
>
> From https://krita-artists.org/t/bulicommander/11612/26
> 
> \>Are there plans to c…hange the strength of mouse scroll in grid view? Currently, scrolling with 256 px thumbnails seems to scroll an entire page, which is pretty strong compared to list view and Dolphin.
> 
> Need to check documentation of QTreeview/QListview to see if it's possible to change current behavior of scrolling values.

> [@tom](#):
>
> Is there a reason behind “Open File” on the welcome screen not being able to open Buli Commander? Plugin limitation?

I opened an another feature request, you can go here to get detailed explanation about why welcome screen is currently not taken in account:

> <https://github.com/Grum999/BuliCommander/issues/6>
>
> From https://krita-artists.org/t/bulicommander/11612/26
> 
> \> Is there a reason b…ehind “Open File” on the welcome screen not being able to open Buli Commander? Plugin limitation?
> 
> The "Open file" from menu and "Open file" from welcome screen are working differently.
> 
> From menu, an action (\`file\_open\`) is triggered and Buli Commander simply override it
> https://github.com/Grum999/BuliCommander/blob/3faf01887ed7ceecb0c51d899f07a38eb7ded566/bulicommander/bulicommander/bc/bcuicontroller.py#L537-L547
> 
> From welcomme screen, there's a QPushButton on which click seems to not trigger action \`file\_open\`
> 
> \# TODO
> 
> 1. In method \[\`BCUIController.\_\_overrideOpenKrita()\`\](https://github.com/Grum999/BuliCommander/blob/3faf01887ed7ceecb0c51d899f07a38eb7ded566/bulicommander/bulicommander/bc/bcuicontroller.py#L537), need to override action executed when button is clicked
> \`\`\`python
> qwin = Krita.instance().activeWindow().qwindow()
> obj = qwin.findChild(QPushButton,'openFileLink')
> \`\`\`
> 
> 2. Review setting windows, to add a new option to allow to overrides "Open file" from welcome screen (let user decide if only menu or only welcome screen, or both, are overrided)

Both should be available for v0.9.0b (But can’t tell you when this version will be released)

Also note since version [0.7.0b](https://github.com/Grum999/BuliCommander/blob/master/releases-notes/RELEASE-0.7.0b.md) you can [add Buli Commander to Krita _File_ menu](https://github.com/Grum999/BuliCommander/blob/master/releases-notes/RELEASE-0.7.0b.md#buli-commander-in-file-menu), and [configure a dedicated shortcut for it](https://github.com/Grum999/BuliCommander/blob/master/releases-notes/RELEASE-0.7.0b.md#improve-ui) 🙂

Grum999

---

<div class="post-metadata">

**Author:** ![Michelist](https://krita-artists.org/user_avatar/krita-artists.org/michelist/32/65826_2.png) [@Michelist](https://krita-artists.org/u/Michelist)\
**Post date:** [June 21, 2022, 9:47am UTC](https://krita-artists.org/t/bulicommander/11612/28 "2022-06-21T09:47:16Z")

</div>

It feels good to read something from you again and to see your avatar!

Michelist

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [June 22, 2022, 8:35pm UTC](https://krita-artists.org/t/bulicommander/11612/29 "2022-06-22T20:35:35Z")

</div>

Hi

> [@tom](#):
>
> Is there a reason behind “Open File” on the welcome screen not being able to open Buli Commander? Plugin limitation?

Implemented for version 0.9.0b 🙂

> <https://github.com/Grum999/BuliCommander/commit/bd393f3a954648c997c648bad529e2f9c9c79c52>

Grum999

---

<div class="post-metadata">

**Author:** ![lian00](https://krita-artists.org/user_avatar/krita-artists.org/lian00/32/231630_2.png) [@lian00](https://krita-artists.org/u/lian00)\
**Post date:** [June 24, 2022, 1:14pm UTC](https://krita-artists.org/t/bulicommander/11612/30 "2022-06-24T13:14:46Z")

</div>

Hello, the plugin looks very interesting. Do you plan to make a definitive version?

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [June 24, 2022, 3:54pm UTC](https://krita-artists.org/t/bulicommander/11612/31 "2022-06-24T15:54:53Z")

</div>

Hi @lian00

Yes a definitive version is expected, but to do list is so long and time for coding so short that I can’t tell you when the version 1.0.0 will be available

Note since version 0.7.0b I consider the plugin provides all basic files manager functionnalities to consider it as useable

I use it myself now to manage my pictures even if there’s still some bugs or function that need to be improved/implemented

The only recommandation I have is to save your documents before to use BuliCommander, especially the search tool (there’s curently a bug that _sometime_ occurs and crash Krita with a segmentation fault… And for which I have some difficulties to reproduce and understand the origin)

Grum999

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [June 24, 2022, 7:10pm UTC](https://krita-artists.org/t/bulicommander/11612/32 "2022-06-24T19:10:01Z")

</div>

Hi

> [@tom](#):
>
> Are there plans to change the strength of mouse scroll in grid view? Currently, scrolling with 256 px thumbnails seems to scroll an entire page, which is pretty strong compared to list view and Dolphin.

Implemented for version 0.9.0b 🙂

> <https://github.com/Grum999/BuliCommander/commit/d23e4f343540edf7a27c0bf29cae10664376978a>
>
> . bcwfile 
> - fir listview (icon grid mode) define scroll step according to siz…e 
> of thumbnail and viewport height
> 
> \--
> Fix #5

Grum999

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [September 30, 2022, 3:51pm UTC](https://krita-artists.org/t/bulicommander/11612/33 "2022-09-30T15:51:02Z")

</div>

Hi

Release [v0.9.0b](https://github.com/Grum999/BuliCommander/releases/tag/0.9.0b) is available

_[2022-09-30] Version 0.9.0b_

- Improve Search engine - _Reduce search execution time duration_
- Improve Search engine - _Limit results_
- Improve File panels - _Grid view mode - Smooth thumbnail scroll_
- Improve Clipboard panels - _Save item as_
- Improve Clipboard panels - _Remove item_
- Improve User Interface - _Override Krita Welcome Screen “Open file” dialog_
- Improve User Interface - _Implement “Save All”_
- Improve File management - _Improve mass renaming_
- Fix bug - _Search for condition generate python exception_
- Review code to follow PEP8 recommendation
- Migrate to SPDX licenses headers

For screenshots and functionalities description, you can read the [full detailed release content](https://github.com/Grum999/BuliCommander/blob/master/releases-notes/RELEASE-0.9.0b.md) directly on github repository.  
And main [BuliCommander](https://github.com/Grum999/BuliCommander) page.

Grum999

---

<div class="post-metadata">

**Author:** ![tom](https://krita-artists.org/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@tom](https://krita-artists.org/u/tom)\
**Post date:** [October 3, 2022, 6:20pm UTC](https://krita-artists.org/t/bulicommander/11612/34 "2022-10-03T18:20:03Z")

</div>

Thanks.  
Couple more things:

- It seems to me that buttons and icons (and maybe interface texts) could be made a bit bigger.  
 ![1](https://krita-artists.org/uploads/default/original/3X/7/d/7d89c10dfe03771f22e5cedc0a68dd3a169af6ad.png)
- Any low hanging fruit in regards to optimizing the startup time? On my HDD, it takes about 3 seconds for Buli Commander to startup on my typical sketch folder, though it may not be noticeable if you’re using an SSD and/or split things into small folders.

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [October 3, 2022, 7:02pm UTC](https://krita-artists.org/t/bulicommander/11612/35 "2022-10-03T19:02:06Z")

</div>

> [@tom](#):
>
> It seems to me that buttons and icons (and maybe interface texts) could be made a bit bigger

I need to check but normally system font size is used in breadcrumb bar, only font family is forced to monospaced font 🤔

Concerning icons, I already saw on my side, if there’s a display scale factor applied at system level, button/icons are not properly rendered… 😕  
Can you confirm me:

- Your OS
- Scale factor applied in system display settings

> [@tom](#):
>
> Any low hanging fruit in regards to optimizing the startup time?

I need more information about that:

- Your typical sketch folder contains how many files, total files size (in MB or GB) and typical file size (MB / GB)
- Is the problem only occurs at startup and after it’s ok, or it occurs each time you go in this folder
- Concerning other folders (less files, less total size) is performances are “normal”? Did you detected approximately if there’s a number of files and/or file size from which it start to be slow?

Also, how many thread/cpu and memory your computer have?

Grum999

---

<div class="post-metadata">

**Author:** ![tom](https://krita-artists.org/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@tom](https://krita-artists.org/u/tom)\
**Post date:** [October 3, 2022, 7:29pm UTC](https://krita-artists.org/t/bulicommander/11612/36 "2022-10-03T19:29:03Z")

</div>

> [@Grum999](#):
>
> - Your OS
> - Scale factor applied in system display settings

Debian sid, Plasma  
100%

> [@Grum999](#):
>
> - Your typical sketch folder contains how many files, total files size (in MB or GB) and typical file size (MB / GB)
> - Is the problem only occurs at startup and after it’s ok, or it occurs each time you go in this folder
> - Concerning other folders (less files, less total size) is performances are “normal”? Did you detected approximately if there’s a number of files and/or file size from which it start to be slow?
> - Also, how many thread/cpu and memory your computer have?

- My typical sketch folder is currently ~690 .kra files, including backups. Total size: 1.7 GB (1.6 GiB). Average size: 2.5 MB (2.4 MiB)
- Navigation seems to be cached, but actual startup doesn’t seem to be cached.
- Starting BuliCommander on a tiny folder of one 1.4 MB file takes about two seconds.
- I don’t think amount of threads matter as the operation doesn’t seem to be multithreaded. My processor (i3-4170) has a base frequency of 3.7 GHz so the single-thread performance should be decent. I have ~24 GB of RAM.

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [October 3, 2022, 7:59pm UTC](https://krita-artists.org/t/bulicommander/11612/37 "2022-10-03T19:59:30Z")

</div>

> [@tom](#):
>
> Debian sid, Plasma  
> 100%

Similar than me… 🤔

> [@tom](#):
>
> Navigation seems to be cached, but actual startup doesn’t seem to be cached.

So once started, there’s no problem anymore? Load directory content is fast?  
I mean you go on an another directory and came back in this one, and it’s fast?

> [@tom](#):
>
> Navigation seems to be cached, but actual startup doesn’t seem to be cached.

Yes Everything is cached to improve performances, especially thumbnail load and metadata.  
First access to a directory for which content hasn’t been cached could take some time according to directory content, but next access should be fast.

You can see size cache in settings:

 ![image](https://krita-artists.org/uploads/default/original/3X/b/6/b603bb3ec2afe9978d2248529bf7d230197a1291.png)

> [@tom](#):
>
> I don’t think amount of threads matter as the operation doesn’t seem to be multithreaded. My processor (i3-4170) has a base frequency of 3.7 GHz so the single-thread performance should be decent. I have ~24 GB of RAM.

Everything is multi-threaded, especially for reading/writing cache.  
On my side reading a directory of 14000 files / 91GB took 11s (excluding thumbnail load that is made asynchronously once list is loaded)  
Data are loaded from a sqlite cache by 24thread (on my computer) ; the question of memory was because loading metadata from cache means each worker need his own memory allocation (so 24thread will need more memory than 1 thread…)

And read 14000 files properties from 24 thread is faster than just with 1 thread (I already tested it)

I don’t think the problems came from HDD; I have one, I’ll try this week to copy the 14000 files on it to check time difference, it should be slower but now so slower.

Grum999

---

<div class="post-metadata">

**Author:** ![tom](https://krita-artists.org/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@tom](https://krita-artists.org/u/tom)\
**Post date:** [October 3, 2022, 8:07pm UTC](https://krita-artists.org/t/bulicommander/11612/38 "2022-10-03T20:07:50Z")

</div>

> So once started, there’s no problem anymore? Load directory content is fast?  
> I mean you go on an another directory and came back in this one, and it’s fast?

Navigating to the sketch folder while cached takes roughly a second, which isn’t too bad. Navigating to the small folder is basically instant.

Startup on the sketch folder always takes 3 seconds, regardless of whether thumbnail view is enabled and regardless of whether grid view is enabled.

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [October 3, 2022, 8:12pm UTC](https://krita-artists.org/t/bulicommander/11612/39 "2022-10-03T20:12:04Z")

</div>

Ok!

I’ll take a look on it, truying to understand what happen at startup that can take so much time

Thanks for feedback and precisions 🙂

Grum999

---

<div class="post-metadata">

**Author:** ![Grum999](https://krita-artists.org/user_avatar/krita-artists.org/grum999/32/66488_2.png) [@Grum999](https://krita-artists.org/u/Grum999)\
**Post date:** [October 4, 2022, 4:12pm UTC](https://krita-artists.org/t/bulicommander/11612/40 "2022-10-04T16:12:16Z")

</div>

Hi @tom

Something you can do on your side (as you are on Linux):

1. Exit Krita if opened
2. Edit file `~/.local/share/krita/pykrita/bulicommander/bc/bcfile.py`
3. Uncomment the last line of file to have this:

```python
Debug.setEnabled(True)

```

4. Open a terminal and execute from command line (it’s import to get output information!)
5. Open BuliCommander  
You should get something like this in terminal output:

```nohighlight
DEBUG: ===========================================
DEBUG: BCFileList.execute
DEBUG: ...........................................
DEBUG: Search in paths: [<BCFileListPath('/home/grum/Temporaire/TempKrita/testMisc/testmd5', False)>]
DEBUG: Found 500 of 500 files in 0.002569913864135742s
DEBUG: - Files: 500
DEBUG: - Directories: 0
DEBUG: Filter 500 files to 500 files in 0.3373551368713379s
DEBUG: BCFileList.execute.99-global: 0.4158
DEBUG: BCFileList.execute.01-search: 0.0026
DEBUG: BCFileList.execute.02-filter: 0.3374
DEBUG: BCFileList.execute.03-result: 0.0369
DEBUG: BCFileList.execute.04-buildStats: 0.0387
DEBUG: BCFileList.execute.05-sort: 0.0000
DEBUG: ===========================================

DEBUG: ===========================================
DEBUG: BCFileList.execute
DEBUG: ...........................................
DEBUG: Search in paths: [<BCFileListPath('/home/grum/Data/Temp/testmd5', False)>]
DEBUG: Found 500 of 500 files in 0.002535104751586914s
DEBUG: - Files: 500
DEBUG: - Directories: 0
DEBUG: Filter 500 files to 500 files in 0.3148353099822998s
DEBUG: BCFileList.execute.99-global: 0.3918
DEBUG: BCFileList.execute.01-search: 0.0025
DEBUG: BCFileList.execute.02-filter: 0.3148
DEBUG: BCFileList.execute.03-result: 0.0341
DEBUG: BCFileList.execute.04-buildStats: 0.0400
DEBUG: BCFileList.execute.05-sort: 0.0000
DEBUG: ===========================================

```

Go up from directory and go in again, just to got a comparison startup/not startup.

I think problem is not in this part of plugin (searching & analyzing files) but your stats would confirm me this ; I’m trying to determinate where to put stopwatches especially on startup to get a more precise idea of what happen

Also, doing some tests I saw that since I’ve implemented metadata cache, even if it’s quite faster than before cache implementation, if I reduce multithreading it’s now faster than before 🤔 🙃  
I’ll do some more tests for that to determinate when activate/deactivate multithreading…

Grum999

[Previous page](https://krita-artists.org/t/bulicommander/11612.md?page=1)

[Next page](https://krita-artists.org/t/bulicommander/11612.md?page=3)
