hydrus/hydrus/client/gui/search/ClientGUIPredicatesOR.py

74 lines
2.3 KiB
Python

import typing
from qtpy import QtWidgets as QW
from hydrus.core import HydrusData
from hydrus.core import HydrusExceptions
from hydrus.client import ClientConstants as CC
from hydrus.client import ClientSearch
from hydrus.client.gui import QtPorting as QP
# ultimately, rewrite acread to be two classes, acread and acreadthatsupportsor
# and then this guy only imports the base class, and only the supportsor will know about this
# otherwise we have jank imports, and also nested OR lmao
# also this should take file and tag domain
class ORPredicateControl( QW.QWidget ):
def __init__( self, parent: QW.QWidget, predicate: ClientSearch.Predicate ):
QW.QWidget.__init__( self, parent )
from hydrus.client.gui.search import ClientGUIACDropdown
if predicate.GetType() != ClientSearch.PREDICATE_TYPE_OR_CONTAINER:
raise Exception( 'Launched an ORPredicateControl without an OR Pred!' )
predicates = predicate.GetValue()
page_key = HydrusData.GenerateKey()
file_search_context = ClientSearch.FileSearchContext( file_service_key = CC.LOCAL_FILE_SERVICE_KEY, predicates = predicates )
self._search_control = ClientGUIACDropdown.AutoCompleteDropdownTagsRead( self, page_key, file_search_context, hide_favourites_edit_actions = True )
vbox = QP.VBoxLayout()
QP.AddToLayout( vbox, self._search_control, CC.FLAGS_EXPAND_BOTH_WAYS )
self.setLayout( vbox )
def CheckValid( self ):
try:
predicates = self.GetPredicates()
except Exception as e:
raise HydrusExceptions.VetoException( str( e ) )
def GetPredicates( self ):
or_sub_predicates = self._search_control.GetPredicates()
if len( or_sub_predicates ) == 0:
return []
elif len( or_sub_predicates ) == 1:
return or_sub_predicates
or_predicate = ClientSearch.Predicate( ClientSearch.PREDICATE_TYPE_OR_CONTAINER, or_sub_predicates )
return [ or_predicate ]