hydrus/hydrus/client/gui/ClientGUIOptionsPanels.py

236 lines
7.5 KiB
Python

from . import ClientConstants as CC
from . import ClientGUICommon
from . import ClientGUIFunctions
from . import HydrusConstants as HC
from qtpy import QtCore as QC
from qtpy import QtWidgets as QW
from qtpy import QtGui as QG
from . import QtPorting as QP
class OptionsPanel( QW.QWidget ):
def GetOptions( self ): raise NotImplementedError()
def SetOptions( self, options ): raise NotImplementedError()
def GetValue( self ): raise NotImplementedError()
def SetValue( self, info ): raise NotImplementedError()
class OptionsPanelMimes( OptionsPanel ):
BUTTON_CURRENTLY_HIDDEN = '\u25B6'
BUTTON_CURRENTLY_SHOWING = '\u25BC'
def __init__( self, parent, selectable_mimes ):
OptionsPanel.__init__( self, parent )
self._selectable_mimes = set( selectable_mimes )
self._mimes_to_checkboxes = {}
self._general_mime_types_to_checkboxes = {}
self._general_mime_types_to_buttons = {}
general_mime_types = []
general_mime_types.append( HC.GENERAL_IMAGE )
general_mime_types.append( HC.GENERAL_ANIMATION )
general_mime_types.append( HC.GENERAL_VIDEO )
general_mime_types.append( HC.GENERAL_AUDIO )
general_mime_types.append( HC.GENERAL_APPLICATION )
gridbox = QP.GridLayout( cols = 3 )
gridbox.setColumnStretch( 2, 1 )
for general_mime_type in general_mime_types:
mimes_in_type = self._GetMimesForGeneralMimeType( general_mime_type )
if len( mimes_in_type ) == 0:
continue
general_mime_checkbox = QW.QCheckBox( HC.mime_string_lookup[ general_mime_type ], self )
general_mime_checkbox.clicked.connect( self.EventMimeGroupCheckbox )
self._general_mime_types_to_checkboxes[ general_mime_type ] = general_mime_checkbox
QP.AddToLayout( gridbox, general_mime_checkbox, CC.FLAGS_VCENTER )
show_hide_button = ClientGUICommon.BetterButton( self, self.BUTTON_CURRENTLY_SHOWING, self._ButtonShowHide, general_mime_type )
max_width = ClientGUIFunctions.ConvertTextToPixelWidth( show_hide_button, 5 )
show_hide_button.setMaximumWidth( max_width )
self._general_mime_types_to_buttons[ general_mime_type ] = show_hide_button
QP.AddToLayout( gridbox, show_hide_button, CC.FLAGS_VCENTER )
vbox = QP.VBoxLayout()
for mime in mimes_in_type:
m_checkbox = QW.QCheckBox( HC.mime_string_lookup[ mime ], self )
m_checkbox.clicked.connect( self.EventMimeCheckbox )
self._mimes_to_checkboxes[ mime ] = m_checkbox
QP.AddToLayout( vbox, m_checkbox, CC.FLAGS_EXPAND_PERPENDICULAR )
QP.AddToLayout( gridbox, vbox, CC.FLAGS_EXPAND_SIZER_BOTH_WAYS )
self.setLayout( gridbox )
def _DoInitialHideShow( self ):
for ( general_mime_type, general_mime_checkbox ) in list( self._general_mime_types_to_checkboxes.items() ):
mimes_in_type = self._GetMimesForGeneralMimeType( general_mime_type )
should_show = general_mime_checkbox.checkState() == QC.Qt.PartiallyChecked
if not should_show:
self._ButtonShowHide( general_mime_type )
def _GetMimesForGeneralMimeType( self, general_mime_type ):
mimes_in_type = HC.general_mimetypes_to_mime_groups[ general_mime_type ]
mimes_in_type = [ mime for mime in mimes_in_type if mime in self._selectable_mimes ]
return mimes_in_type
def _ButtonShowHide( self, general_mime_type ):
button = self._general_mime_types_to_buttons[ general_mime_type ]
mimes_in_type = self._GetMimesForGeneralMimeType( general_mime_type )
should_show = button.text() == self.BUTTON_CURRENTLY_HIDDEN
for mime in mimes_in_type:
self._mimes_to_checkboxes[ mime ].setVisible( should_show )
if should_show:
button.setText( self.BUTTON_CURRENTLY_SHOWING )
else:
button.setText( self.BUTTON_CURRENTLY_HIDDEN )
def _UpdateMimeGroupCheckboxes( self ):
for ( general_mime_type, general_mime_checkbox ) in self._general_mime_types_to_checkboxes.items():
mimes_in_type = self._GetMimesForGeneralMimeType( general_mime_type )
all_checkbox_values = { self._mimes_to_checkboxes[ mime ].isChecked() for mime in mimes_in_type }
all_false = True not in all_checkbox_values
all_true = False not in all_checkbox_values
if all_false:
check_state = QC.Qt.Unchecked
elif all_true:
check_state = QC.Qt.Checked
else:
check_state = QC.Qt.PartiallyChecked
if check_state == QC.Qt.PartiallyChecked:
general_mime_checkbox.setTristate( True )
general_mime_checkbox.setCheckState( check_state )
if check_state != QC.Qt.PartiallyChecked:
general_mime_checkbox.setTristate( False )
def EventMimeCheckbox( self ):
self._UpdateMimeGroupCheckboxes()
def EventMimeGroupCheckbox( self ):
for ( general_mime_type, general_mime_checkbox ) in list( self._general_mime_types_to_checkboxes.items() ):
check_state = general_mime_checkbox.checkState()
mime_check_state = None
if check_state == QC.Qt.Unchecked:
mime_check_state = False
elif check_state == QC.Qt.Checked:
mime_check_state = True
if mime_check_state is not None:
mimes_in_type = self._GetMimesForGeneralMimeType( general_mime_type )
for mime in mimes_in_type:
self._mimes_to_checkboxes[ mime ].setChecked( mime_check_state )
def GetValue( self ):
mimes = tuple( [ mime for ( mime, checkbox ) in list( self._mimes_to_checkboxes.items() ) if checkbox.isChecked() ] )
return mimes
def SetValue( self, checked_mimes ):
for ( mime, checkbox ) in self._mimes_to_checkboxes.items():
if mime in checked_mimes:
checkbox.setChecked( True )
else:
checkbox.setChecked( False )
self._UpdateMimeGroupCheckboxes()
self._DoInitialHideShow()