2022-03-23 20:57:10 +00:00
from qtpy import QtCore as QC
from qtpy import QtWidgets as QW
from hydrus . core import HydrusConstants as HC
from hydrus . core import HydrusGlobals as HG
from hydrus . client import ClientConstants as CC
from hydrus . client import ClientLocation
from hydrus . client . gui import ClientGUICore as CGC
from hydrus . client . gui import ClientGUIMenus
from hydrus . client . gui import ClientGUIScrolledPanels
from hydrus . client . gui import ClientGUITopLevelWindowsPanels
from hydrus . client . gui import QtPorting as QP
from hydrus . client . gui . widgets import ClientGUICommon
class EditMultipleLocationContextPanel ( ClientGUIScrolledPanels . EditPanel ) :
def __init__ ( self , parent : QW . QWidget , location_context : ClientLocation . LocationContext , all_known_files_allowed : bool , only_local_file_domains_allowed : bool ) :
ClientGUIScrolledPanels . EditPanel . __init__ ( self , parent )
self . _original_location_context = location_context
self . _all_known_files_allowed = all_known_files_allowed
self . _only_local_file_domains_allowed = only_local_file_domains_allowed
self . _location_list = ClientGUICommon . BetterCheckBoxList ( self )
2022-06-29 20:52:53 +00:00
services = ClientLocation . GetPossibleFileDomainServicesInOrder ( all_known_files_allowed , only_local_file_domains_allowed )
2022-03-23 20:57:10 +00:00
for service in services :
name = service . GetName ( )
service_key = service . GetServiceKey ( )
starts_checked = service_key in self . _original_location_context . current_service_keys
self . _location_list . Append ( name , ( HC . CONTENT_STATUS_CURRENT , service_key ) , starts_checked = starts_checked )
advanced_mode = HG . client_controller . new_options . GetBoolean ( ' advanced_mode ' )
if advanced_mode and not only_local_file_domains_allowed :
for service in services :
name = service . GetName ( )
service_key = service . GetServiceKey ( )
if service_key in ( CC . COMBINED_FILE_SERVICE_KEY , CC . TRASH_SERVICE_KEY ) :
continue
starts_checked = service_key in self . _original_location_context . deleted_service_keys
self . _location_list . Append ( ' deleted from {} ' . format ( name ) , ( HC . CONTENT_STATUS_DELETED , service_key ) , starts_checked = starts_checked )
vbox = QP . VBoxLayout ( )
QP . AddToLayout ( vbox , self . _location_list , CC . FLAGS_EXPAND_SIZER_BOTH_WAYS )
self . widget ( ) . setLayout ( vbox )
self . _location_list . checkBoxListChanged . connect ( self . _ClearSurplusServices )
def _ClearSurplusServices ( self ) :
# if user clicks all known files, then all other services will be wiped
# all local files should do other file services too
2022-05-25 21:30:53 +00:00
# and all my files does local file domains
2022-03-23 20:57:10 +00:00
location_context = self . _GetValue ( )
location_context . ClearSurplusLocalFilesServices ( HG . client_controller . services_manager . GetServiceType )
if set ( location_context . GetStatusesAndServiceKeysList ( ) ) != set ( self . _location_list . GetValue ( ) ) :
self . _SetValue ( location_context )
def _GetValue ( self ) :
statuses_and_service_keys = self . _location_list . GetValue ( )
current_service_keys = { service_key for ( status , service_key ) in statuses_and_service_keys if status == HC . CONTENT_STATUS_CURRENT }
deleted_service_keys = { service_key for ( status , service_key ) in statuses_and_service_keys if status == HC . CONTENT_STATUS_DELETED }
location_context = ClientLocation . LocationContext ( current_service_keys = current_service_keys , deleted_service_keys = deleted_service_keys )
return location_context
def _SetValue ( self , location_context : ClientLocation . LocationContext ) :
self . _location_list . blockSignals ( True )
statuses_and_service_keys = location_context . GetStatusesAndServiceKeysList ( )
self . _location_list . SetValue ( statuses_and_service_keys )
self . _location_list . blockSignals ( False )
def GetValue ( self ) - > ClientLocation . LocationContext :
location_context = self . _GetValue ( )
return location_context
def SetValue ( self , location_context : ClientLocation . LocationContext ) :
self . _SetValue ( location_context )
self . _location_list . checkBoxListChanged . emit ( )
2022-10-26 20:43:00 +00:00
2022-03-23 20:57:10 +00:00
class LocationSearchContextButton ( ClientGUICommon . BetterButton ) :
locationChanged = QC . Signal ( ClientLocation . LocationContext )
def __init__ ( self , parent : QW . QWidget , location_context : ClientLocation . LocationContext ) :
2022-07-13 21:35:17 +00:00
self . _location_context = ClientLocation . LocationContext ( )
2022-03-23 20:57:10 +00:00
ClientGUICommon . BetterButton . __init__ ( self , parent , ' initialising ' , self . _EditLocation )
self . _all_known_files_allowed = True
self . _all_known_files_allowed_only_in_advanced_mode = False
self . _only_importable_domains_allowed = False
self . SetValue ( location_context )
def _EditLocation ( self ) :
2022-06-29 20:52:53 +00:00
services = ClientLocation . GetPossibleFileDomainServicesInOrder ( self . _IsAllKnownFilesServiceTypeAllowed ( ) , self . _only_importable_domains_allowed )
2022-03-23 20:57:10 +00:00
menu = QW . QMenu ( )
2023-02-01 21:20:47 +00:00
last_seen_service_type = None
2022-03-23 20:57:10 +00:00
for service in services :
2023-02-01 21:20:47 +00:00
if last_seen_service_type is not None and last_seen_service_type != service . GetServiceType ( ) :
ClientGUIMenus . AppendSeparator ( menu )
2022-03-23 20:57:10 +00:00
location_context = ClientLocation . LocationContext . STATICCreateSimple ( service . GetServiceKey ( ) )
ClientGUIMenus . AppendMenuItem ( menu , service . GetName ( ) , ' Change the current file domain to {} . ' . format ( service . GetName ( ) ) , self . SetValue , location_context )
2023-02-01 21:20:47 +00:00
last_seen_service_type = service . GetServiceType ( )
2022-03-23 20:57:10 +00:00
ClientGUIMenus . AppendSeparator ( menu )
2023-02-01 21:20:47 +00:00
ClientGUIMenus . AppendMenuItem ( menu , ' multiple/deleted locations ' , ' Change the current file domain to something with multiple locations. ' , self . _EditMultipleLocationContext )
2022-03-23 20:57:10 +00:00
CGC . core ( ) . PopupMenu ( self , menu )
def _EditMultipleLocationContext ( self ) :
with ClientGUITopLevelWindowsPanels . DialogEdit ( self , ' edit multiple location ' ) as dlg :
panel = EditMultipleLocationContextPanel ( dlg , self . _location_context , self . _IsAllKnownFilesServiceTypeAllowed ( ) , self . _only_importable_domains_allowed )
dlg . SetPanel ( panel )
if dlg . exec ( ) == QW . QDialog . Accepted :
location_context = panel . GetValue ( )
self . SetValue ( location_context )
def _IsAllKnownFilesServiceTypeAllowed ( self ) - > bool :
if self . _all_known_files_allowed :
if self . _all_known_files_allowed_only_in_advanced_mode and not HG . client_controller . new_options . GetBoolean ( ' advanced_mode ' ) :
return False
else :
return True
else :
return False
def GetValue ( self ) - > ClientLocation . LocationContext :
return self . _location_context
def SetOnlyImportableDomainsAllowed ( self , only_importable_domains_allowed : bool ) :
self . _only_importable_domains_allowed = only_importable_domains_allowed
def SetAllKnownFilesAllowed ( self , all_known_files_allowed : bool , all_known_files_allowed_only_in_advanced_mode : bool ) :
self . _all_known_files_allowed = all_known_files_allowed
self . _all_known_files_allowed_only_in_advanced_mode = all_known_files_allowed_only_in_advanced_mode
def SetValue ( self , location_context : ClientLocation . LocationContext ) :
location_context = location_context . Duplicate ( )
location_context . FixMissingServices ( HG . client_controller . services_manager . FilterValidServiceKeys )
2022-07-13 21:35:17 +00:00
if location_context == self . _location_context :
return
2022-03-23 20:57:10 +00:00
self . _location_context = location_context
self . setText ( self . _location_context . ToString ( HG . client_controller . services_manager . GetName ) )
self . locationChanged . emit ( self . _location_context )
2022-07-20 19:17:03 +00:00