[Plugin Release] Docker Under Cursor - make docker display in mouse position

DockerUnderCursor can make any docker float and display in the mouse position with keyboard shotcuts. Support Plugin Panel, E.g Pigment.O.

Preview

More introductions in github.

59 Likes

well it works nice but there seems to be some odd things I am not sure if they are fixable even but:

  • when you send the docker back the mouse take the initial calling position of the docker until you move the mouse again.
  • I had another situation where when the docker was sent back it would shrink a bit and doing a couple of times would shrink the docker more and more but I still don’t know how to trigger this to say where is the cause.

Beyond that, it is a really cool plugin and seems very useful. thank yous.

Indeed, I will try to fix it. I had been using tablet so much that I didn’t notice it

this is a Known issues, it is krita’ bug. solution in README last part on github. you just need manual drag floating docker back mainwindow.

thx for your feedback.

1 Like

I Updated plugin, brush outline now not offset. :grinning:

4 Likes

It is is working all good for what I can notice, now it feel very ergonomic. Thank you.

What I noticed was some of my panels not updating well while others updated good. I will try and fix them so it reacts better to yours.

2 Likes

omg :flushed: This looks super handy! With plugins like these Krita inches ever closer to the speed of light! Thanks for sharing!

5 Likes

One update, add function remember mouse position relative to docker.you can enable it in setting panel.
NewFunction

9 Likes

New function!
docker can auto-hide when mouse leaves the floating docker :kissing_heart:
auto-hide

15 Likes

Thanks a lot, it’s really fun to work with the plug-in.
And it looks like you got joy in programming.
:+1:

Michelist

1 Like

yes,although I’m a beginner in python, it’s fun to implement the functions I want by myself. Hope it can help you too!

7 Likes

A fellow implementer myself.
I started in trying to implement features I wanted in blender. Now I’m kind of hooked and enjoy every moment when I force the computer to do whatever I wanted :).
If you like it…don’t give up when people criticize or just ignore your stuff(like with my addon :face_exhaling: ). But one advice…don’t let it get in the way of your main field of work…this thing is really addictive :stuck_out_tongue: .

5 Likes

Thanks for sharing. I will have a test with it, it looks very handy.

1 Like

Thank you for making this. Its working great so far on macos.

1 Like

I encountered an error

AttributeError
Python 3.8.1: C:\Program Files\Krita (x64)\bin\krita.exe
Thu Oct 27 22:46:31 2022

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\EyeOd\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in finalSetup(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>)
   26         self.widget = Krita.instance().activeWindow().qwindow().findChild(QWidget,self.name)
   27         self.monitor = DockerMonitor(self)
   28         self.setMonitor()
   29 
   30     def setMonitor(self):
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.setMonitor = <bound method DockerToggleManager.setMonitor of ....dockertogglemanager.DockerToggleManager object>>

 C:\Users\EyeOd\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in setMonitor(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>)
   32             self.widget.installEventFilter(self.monitor)
   33         if self.AUTOCONCEAL == "False":
   34             self.widget.removeEventFilter(self.monitor)
   35 
   36     def targetPotion(self,pos):
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.widget = None
self.widget.removeEventFilter undefined
self.monitor = <dockerundercursor.dockermonitor.DockerMonitor object>
AttributeError: 'NoneType' object has no attribute 'removeEventFilter'
    __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 = ("'NoneType' object has no attribute 'removeEventFilter'",)
    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\EyeOd\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 28, in finalSetup
    self.setMonitor()
  File "C:\Users\EyeOd\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 34, in setMonitor
    self.widget.removeEventFilter(self.monitor)
AttributeError: 'NoneType' object has no attribute 'removeEventFilter'

its mean that you used wrong docker name. maybe some docker have disable or renamed. the simplest solution is click save button in settings panel, it will refresh .action file.

At the same time, i uploaded new code that block this error, you can update it.

1 Like

Why can’t I edit my post :thinking:, I think it’s outdated.

@Aqao I think there’s a 30 day limit on editing posts. This has been noticed before.

1 Like

Try now ! I enabled unlimited edit for owner in this particular category.

3 Likes

I’m getting an error with this addon in Krita 5.2:

Error Message
TypeError
Python 3.10.7: C:\Program Files\Krita (x64)\bin\krita.exe
Fri Oct 13 09:47:27 2023

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\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in toggleDockerStatus(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>)
  120     def toggleDockerStatus(self):
  121         if self.widget.isHidden():
  122             self.setToShow()
  123         elif self.widget.isFloating():
  124             self.dockerReturn()
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.setToShow = <bound method DockerToggleManager.setToShow of <....dockertogglemanager.DockerToggleManager object>>

 C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in setToShow(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>)
   59         if not self.widget.isFloating():
   60             self.widget.setFloating(True)
   61         self.moveDocker()
   62         self.widget.show()
   63 
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.moveDocker = <bound method DockerToggleManager.moveDocker of ....dockertogglemanager.DockerToggleManager object>>

 C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in moveDocker(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>)
  111 
  112     def moveDocker(self):
  113         dockerpos = self.targetPotion(QCursor.pos())
  114         if self.CLAMPPOSITION == "True":
  115             self.widget.move(self.checkPosition(dockerpos))
dockerpos undefined
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.targetPotion = <bound method DockerToggleManager.targetPotion o....dockertogglemanager.DockerToggleManager object>>
global QCursor = <class 'PyQt5.QtGui.QCursor'>
QCursor.pos = <built-in function pos>

 C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py in targetPotion(self=<dockerundercursor.dockertogglemanager.DockerToggleManager object>, pos=PyQt5.QtCore.QPoint(1303, 51))
   37         if self.mousepos:
   38             return QPoint(pos.x()-self.mousepos.x(),pos.y()-self.mousepos.y())
   39         return QPoint(pos.x()-self.widget.width()/2,pos.y()-self.widget.height()/2)
   40 
   41     def setToFloating(self):
global QPoint = <class 'PyQt5.QtCore.QPoint'>
pos = PyQt5.QtCore.QPoint(1303, 51)
pos.x = <built-in method x of QPoint object>
self = <dockerundercursor.dockertogglemanager.DockerToggleManager object>
self.widget = <PyQt5.QtWidgets.QDockWidget object>
self.widget.width = <built-in method width of QDockWidget object>
pos.y = <built-in method y of QPoint object>
self.widget.height = <built-in method height of QDockWidget object>
TypeError: arguments did not match any overloaded call:
  QPoint(): too many arguments
  QPoint(int, int): argument 1 has unexpected type 'float'
  QPoint(QPoint): argument 1 has unexpected type 'float'
    __cause__ = None
    __class__ = <class 'TypeError'>
    __context__ = None
    __delattr__ = <method-wrapper '__delattr__' of TypeError object>
    __dict__ = {}
    __dir__ = <built-in method __dir__ of TypeError object>
    __doc__ = 'Inappropriate argument type.'
    __eq__ = <method-wrapper '__eq__' of TypeError object>
    __format__ = <built-in method __format__ of TypeError object>
    __ge__ = <method-wrapper '__ge__' of TypeError object>
    __getattribute__ = <method-wrapper '__getattribute__' of TypeError object>
    __gt__ = <method-wrapper '__gt__' of TypeError object>
    __hash__ = <method-wrapper '__hash__' of TypeError object>
    __init__ = <method-wrapper '__init__' of TypeError object>
    __init_subclass__ = <built-in method __init_subclass__ of type object>
    __le__ = <method-wrapper '__le__' of TypeError object>
    __lt__ = <method-wrapper '__lt__' of TypeError object>
    __ne__ = <method-wrapper '__ne__' of TypeError object>
    __new__ = <built-in method __new__ of type object>
    __reduce__ = <built-in method __reduce__ of TypeError object>
    __reduce_ex__ = <built-in method __reduce_ex__ of TypeError object>
    __repr__ = <method-wrapper '__repr__' of TypeError object>
    __setattr__ = <method-wrapper '__setattr__' of TypeError object>
    __setstate__ = <built-in method __setstate__ of TypeError object>
    __sizeof__ = <built-in method __sizeof__ of TypeError object>
    __str__ = <method-wrapper '__str__' of TypeError object>
    __subclasshook__ = <built-in method __subclasshook__ of type object>
    __suppress_context__ = False
    __traceback__ = <traceback object>
    args = ("arguments did not match any overloaded call:\n  Q...t(QPoint): argument 1 has unexpected type 'float'",)
    with_traceback = <built-in method with_traceback of TypeError 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\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 122, in toggleDockerStatus
    self.setToShow()
  File "C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 61, in setToShow
    self.moveDocker()
  File "C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 113, in moveDocker
    dockerpos = self.targetPotion(QCursor.pos())
  File "C:\Users\micha\AppData\Roaming\krita\pykrita\dockerundercursor\dockertogglemanager.py", line 39, in targetPotion
    return QPoint(pos.x()-self.widget.width()/2,pos.y()-self.widget.height()/2)
TypeError: arguments did not match any overloaded call:
  QPoint(): too many arguments
  QPoint(int, int): argument 1 has unexpected type 'float'
  QPoint(QPoint): argument 1 has unexpected type 'float'


Here’s what’s displayed above the error message:
image

Looks like your plugin version is a bit old, try updating to the latest version. :smiley:

1 Like