236 lines
7.5 KiB
Python
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()
|
|
|
|
|