hydrus/hydrus/client/gui/widgets/ClientGUIColourPicker.py

200 lines
5.5 KiB
Python

import re
from qtpy import QtCore as QC
from qtpy import QtWidgets as QW
from qtpy import QtGui as QG
from hydrus.core import HydrusData
from hydrus.core import HydrusGlobals as HG
from hydrus.client import ClientGlobals as CG
from hydrus.client.gui import ClientGUICore as CGC
from hydrus.client.gui import ClientGUIDialogsMessage
from hydrus.client.gui import ClientGUIFunctions
from hydrus.client.gui import ClientGUIMenus
from hydrus.client.gui import ClientGUIStyle
from hydrus.client.gui import QtInit
def EditColour( win: QW.QWidget, colour: QG.QColor ):
return_value = colour
old_stylesheet = ClientGUIStyle.CURRENT_STYLESHEET
# OK, this is a legit bug in Qt6. if QWidget::item:hover is set in the QSS, even as an empty block, the colour-picker gradient square thing will update on normal mouse moves, not just drags, lmao
# so we do this laggy nonsense, but it fixes it
if QtInit.WE_ARE_QT6 and ( 'QWidget::item:hover' in ClientGUIStyle.CURRENT_STYLESHEET or 'QWidget:item:hover' in ClientGUIStyle.CURRENT_STYLESHEET ):
new_stylesheet = old_stylesheet.replace( 'QWidget::item:hover', 'QWidget::fugg:fugg' ).replace( 'QWidget:item:hover', 'QWidget:fugg:fugg' )
ClientGUIStyle.SetStyleSheet( new_stylesheet, prepend_hydrus = False )
# note you can set alpha support here with a flag
dialog = QW.QColorDialog( colour, win )
if dialog.exec_() == QW.QDialog.Accepted:
edited_colour = dialog.selectedColor()
if edited_colour.isValid():
return_value = edited_colour
ClientGUIStyle.SetStyleSheet( old_stylesheet, prepend_hydrus = False )
return return_value
class ColourPickerButton( QW.QPushButton ):
def __init__( self, parent = None ):
QW.QPushButton.__init__( self, parent )
self._colour = QG.QColor( 0, 0, 0, 0 )
self.clicked.connect( self._ChooseColour )
self._highlighted = False
def SetColour( self, colour ):
self._colour = colour
self._UpdatePixmap()
def _UpdatePixmap( self ):
px = QG.QPixmap( self.contentsRect().height(), self.contentsRect().height() )
painter = QG.QPainter( px )
colour = self._colour
if self._highlighted:
colour = self._colour.lighter( 125 ) # 25% lighter
painter.fillRect( px.rect(), QG.QBrush( colour ) )
painter.end()
self.setIcon( QG.QIcon( px ) )
self.setIconSize( px.size() )
self.setFlat( True )
self.setFixedSize( px.size() )
def enterEvent( self, event ):
self._highlighted = True
self._UpdatePixmap()
def leaveEvent( self, event ):
self._highlighted = False
self._UpdatePixmap()
def GetColour( self ):
return self._colour
def _ChooseColour( self ):
new_colour = EditColour( self, self._colour )
self.SetColour( new_colour )
def _ImportHexFromClipboard( self ):
try:
raw_text = CG.client_controller.GetClipboardText()
except Exception as e:
HydrusData.PrintException( e )
ClientGUIDialogsMessage.ShowCritical( self, 'Problem pasting!', str(e) )
return
import_string = raw_text
if import_string.startswith( '#' ):
import_string = import_string[1:]
import_string = '#' + re.sub( '[^0-9a-fA-F]', '', import_string )
if len( import_string ) != 7:
ClientGUIDialogsMessage.ShowCritical( self, 'Problem pasting!', f'"{raw_text}" did not appear to be a hex string!' )
return
try:
colour = QG.QColor( import_string )
except Exception as e:
ClientGUIFunctions.PresentClipboardParseError( self, raw_text, 'A hex colour like #FF0050', e )
return
self.SetColour( colour )
def contextMenuEvent( self, event ):
if event.reason() == QG.QContextMenuEvent.Keyboard:
self.ShowMenu()
def mouseReleaseEvent( self, event ):
if event.button() != QC.Qt.RightButton:
return QW.QPushButton.mouseReleaseEvent( self, event )
self.ShowMenu()
def ShowMenu( self ):
menu = ClientGUIMenus.GenerateMenu( self )
hex_string = self.GetColour().name( QG.QColor.HexRgb )
ClientGUIMenus.AppendMenuItem( menu, 'copy ' + hex_string + ' to the clipboard', 'Copy the current colour to the clipboard.', CG.client_controller.pub, 'clipboard', 'text', hex_string )
ClientGUIMenus.AppendMenuItem( menu, 'import a hex colour from the clipboard', 'Look at the clipboard for a colour in the format #FF0000, and set the colour.', self._ImportHexFromClipboard )
CGC.core().PopupMenu( self, menu )