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()