def ApplyContentApplicationCommandToMedia( parent: QW.QWidget, command: CAC.ApplicationCommand, media: typing.Collection[ ClientMedia.MediaSingleton ] ): if not command.IsContentCommand(): return service_key = command.GetContentServiceKey() action = command.GetContentAction() value = command.GetContentValue() try: service = HG.client_controller.services_manager.GetService( service_key ) except HydrusExceptions.DataMissing: command_processed = False return command_processed service_type = service.GetServiceType() if service_type == HC.LOCAL_FILE_DOMAIN: if value is not None: source_service_key = value else: source_service_key = None MoveOrDuplicateLocalFiles( parent, service_key, action, media, source_service_key = source_service_key ) else: if service_type in HC.REAL_TAG_SERVICES: tag = value content_updates = GetContentUpdatesForAppliedContentApplicationCommandTags( parent, service_key, service_type, action, media, tag ) elif service_type in ( HC.LOCAL_RATING_LIKE, HC.LOCAL_RATING_NUMERICAL ): if action in ( HC.CONTENT_UPDATE_SET, HC.CONTENT_UPDATE_FLIP ): rating = value content_updates = GetContentUpdatesForAppliedContentApplicationCommandRatingsSetFlip( service_key, action, media, rating ) elif action in ( HC.CONTENT_UPDATE_INCREMENT, HC.CONTENT_UPDATE_DECREMENT ) and service_type == HC.LOCAL_RATING_NUMERICAL: one_star_value = service.GetOneStarValue() content_updates = GetContentUpdatesForAppliedContentApplicationCommandRatingsIncDec( service_key, one_star_value, action, media ) else: return True else: return False if len( content_updates ) > 0: HG.client_controller.Write( 'content_updates', { service_key : content_updates } ) return True
def ApplyContentApplicationCommandToMedia( parent: QW.QWidget, command: CAC.ApplicationCommand, media: typing.Collection[ ClientMedia.Media ] ): if not command.IsContentCommand(): return service_key = command.GetContentServiceKey() action = command.GetContentAction() value = command.GetContentValue() try: service = HG.client_controller.services_manager.GetService( service_key ) except HydrusExceptions.DataMissing: command_processed = False return command_processed service_type = service.GetServiceType() hashes = set() for m in media: hashes.add( m.GetHash() ) if service_type in HC.REAL_TAG_SERVICES: tag = value can_add = False can_pend = False can_delete = False can_petition = True can_rescind_pend = False can_rescind_petition = False for m in media: tags_manager = m.GetTagsManager() current = tags_manager.GetCurrent( service_key, ClientTags.TAG_DISPLAY_STORAGE ) pending = tags_manager.GetPending( service_key, ClientTags.TAG_DISPLAY_STORAGE ) petitioned = tags_manager.GetPetitioned( service_key, ClientTags.TAG_DISPLAY_STORAGE ) if tag not in current: can_add = True if tag not in current and tag not in pending: can_pend = True if tag in current and action == HC.CONTENT_UPDATE_FLIP: can_delete = True if tag in current and tag not in petitioned and action == HC.CONTENT_UPDATE_FLIP: can_petition = True if tag in pending and action == HC.CONTENT_UPDATE_FLIP: can_rescind_pend = True if tag in petitioned: can_rescind_petition = True reason = None if service_type == HC.LOCAL_TAG: tags = [ tag ] if can_add: content_update_action = HC.CONTENT_UPDATE_ADD tag_parents_manager = HG.client_controller.tag_parents_manager parents = tag_parents_manager.GetParents( service_key, tag ) tags.extend( parents ) elif can_delete: content_update_action = HC.CONTENT_UPDATE_DELETE else: return True rows = [ ( tag, hashes ) for tag in tags ] else: if can_rescind_petition: content_update_action = HC.CONTENT_UPDATE_RESCIND_PETITION rows = [ ( tag, hashes ) ] elif can_pend: tags = [ tag ] content_update_action = HC.CONTENT_UPDATE_PEND tag_parents_manager = HG.client_controller.tag_parents_manager parents = tag_parents_manager.GetParents( service_key, tag ) tags.extend( parents ) rows = [ ( tag, hashes ) for tag in tags ] elif can_rescind_pend: content_update_action = HC.CONTENT_UPDATE_RESCIND_PEND rows = [ ( tag, hashes ) ] elif can_petition: message = 'Enter a reason for this tag to be removed. A janitor will review your petition.' from hydrus.client.gui import ClientGUIDialogs with ClientGUIDialogs.DialogTextEntry( parent, message ) as dlg: if dlg.exec() == QW.QDialog.Accepted: content_update_action = HC.CONTENT_UPDATE_PETITION reason = dlg.GetValue() rows = [ ( tag, hashes ) ] else: return True else: return True content_updates = [ HydrusData.ContentUpdate( HC.CONTENT_TYPE_MAPPINGS, content_update_action, row, reason = reason ) for row in rows ] elif service_type in ( HC.LOCAL_RATING_LIKE, HC.LOCAL_RATING_NUMERICAL ): if action in ( HC.CONTENT_UPDATE_SET, HC.CONTENT_UPDATE_FLIP ): rating = value can_set = False can_unset = False for m in media: ratings_manager = m.GetRatingsManager() current_rating = ratings_manager.GetRating( service_key ) if current_rating == rating and action == HC.CONTENT_UPDATE_FLIP: can_unset = True else: can_set = True if can_set: row = ( rating, hashes ) elif can_unset: row = ( None, hashes ) else: return True content_updates = [ HydrusData.ContentUpdate( HC.CONTENT_TYPE_RATINGS, HC.CONTENT_UPDATE_ADD, row ) ] elif action in ( HC.CONTENT_UPDATE_INCREMENT, HC.CONTENT_UPDATE_DECREMENT ): if service_type == HC.LOCAL_RATING_NUMERICAL: if action == HC.CONTENT_UPDATE_INCREMENT: direction = 1 initialisation_rating = 0.0 elif action == HC.CONTENT_UPDATE_DECREMENT: direction = -1 initialisation_rating = 1.0 one_star_value = service.GetOneStarValue() ratings_to_hashes = collections.defaultdict( set ) for m in media: ratings_manager = m.GetRatingsManager() current_rating = ratings_manager.GetRating( service_key ) if current_rating is None: new_rating = initialisation_rating else: new_rating = current_rating + ( one_star_value * direction ) new_rating = max( min( new_rating, 1.0 ), 0.0 ) if current_rating != new_rating: ratings_to_hashes[ new_rating ].add( m.GetHash() ) content_updates = [ HydrusData.ContentUpdate( HC.CONTENT_TYPE_RATINGS, HC.CONTENT_UPDATE_ADD, ( rating, hashes ) ) for ( rating, hashes ) in ratings_to_hashes.items() ] else: return True else: return False if len( content_updates ) > 0: HG.client_controller.Write( 'content_updates', { service_key : content_updates } ) return True
def __init__( self, parent: QW.QWidget, command: CAC.ApplicationCommand, shortcuts_name: str ): ClientGUIScrolledPanels.EditPanel.__init__( self, parent ) # is_custom_or_media = shortcuts_name not in ClientGUIShortcuts.SHORTCUTS_RESERVED_NAMES or shortcuts_name == 'media' self._panel_choice = ClientGUICommon.BetterChoice( self ) self._panel_choice.addItem( 'simple command', self.PANEL_SIMPLE ) if is_custom_or_media: self._panel_choice.addItem( 'tag command', self.PANEL_TAG ) self._panel_choice.addItem( 'like/dislike rating command', self.PANEL_RATING_LIKE ) self._panel_choice.addItem( 'numerical rating command', self.PANEL_RATING_NUMERICAL ) self._panel_choice.addItem( 'numerical rating increment/decrement command', self.PANEL_RATING_NUMERICAL_INCDEC ) else: self._panel_choice.hide() self._simple_sub_panel = SimpleSubPanel( self, shortcuts_name ) self._tag_sub_panel = TagSubPanel( self ) self._rating_like_sub_panel = RatingLikeSubPanel( self ) self._rating_numerical_sub_panel = RatingNumericalSubPanel( self ) self._rating_numerical_inc_dec_sub_panel = RatingNumericalIncDecSubPanel( self ) # data = command.GetData() if command.IsSimpleCommand(): action = data self._simple_sub_panel.SetValue( action ) self._panel_choice.SetValue( self.PANEL_SIMPLE ) elif command.IsContentCommand(): service_key = command.GetContentServiceKey() if HG.client_controller.services_manager.ServiceExists( service_key ): service = HG.client_controller.services_manager.GetService( service_key ) action = command.GetContentAction() value = command.GetContentValue() else: QW.QMessageBox.warning( self, 'Warning', 'The service that this command relies upon no longer exists! This command will reset to a default form.' ) local_tag_services = list( HG.client_controller.services_manager.GetServices( ( HC.LOCAL_TAG, ) ) ) service = local_tag_services[0] service_key = service.GetServiceKey() action = HC.CONTENT_UPDATE_SET value = 'tag' service_type = service.GetServiceType() if service_type in HC.REAL_TAG_SERVICES: tag = value self._tag_sub_panel.SetValue( action, service_key, tag ) self._panel_choice.SetValue( self.PANEL_TAG ) elif service_type == HC.LOCAL_RATING_LIKE: rating = value self._rating_like_sub_panel.SetValue( action, service_key, rating ) self._panel_choice.SetValue( self.PANEL_RATING_LIKE ) elif service_type == HC.LOCAL_RATING_NUMERICAL: if action in ( HC.CONTENT_UPDATE_SET, HC.CONTENT_UPDATE_FLIP ): rating = value self._rating_numerical_sub_panel.SetValue( action, service_key, rating ) self._panel_choice.SetValue( self.PANEL_RATING_NUMERICAL ) elif action in ( HC.CONTENT_UPDATE_INCREMENT, HC.CONTENT_UPDATE_DECREMENT ): distance = 1 self._rating_numerical_inc_dec_sub_panel.SetValue( action, service_key, distance ) self._panel_choice.SetValue( self.PANEL_RATING_NUMERICAL_INCDEC ) # vbox = QP.VBoxLayout() QP.AddToLayout( vbox, self._panel_choice, CC.FLAGS_EXPAND_PERPENDICULAR ) QP.AddToLayout( vbox, self._simple_sub_panel, CC.FLAGS_EXPAND_PERPENDICULAR ) QP.AddToLayout( vbox, self._tag_sub_panel, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) QP.AddToLayout( vbox, self._rating_like_sub_panel, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) QP.AddToLayout( vbox, self._rating_numerical_sub_panel, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) QP.AddToLayout( vbox, self._rating_numerical_inc_dec_sub_panel, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) vbox.addStretch( 1 ) self.widget().setLayout( vbox ) self._UpdateVisibleControls() # self._panel_choice.currentIndexChanged.connect( self._UpdateVisibleControls )
def ProcessApplicationCommand(self, command: CAC.ApplicationCommand): command_processed = True data = command.GetData() if command.IsSimpleCommand(): action = data if action == CAC.SIMPLE_EXIT_APPLICATION: HG.client_controller.gui.TryToExit() elif action == CAC.SIMPLE_EXIT_APPLICATION_FORCE_MAINTENANCE: HG.client_controller.gui.TryToExit( force_shutdown_maintenance=True) elif action == CAC.SIMPLE_RESTART_APPLICATION: HG.client_controller.gui.TryToExit(restart=True) elif action == CAC.SIMPLE_HIDE_TO_SYSTEM_TRAY: HG.client_controller.gui.HideToSystemTray() elif action == CAC.SIMPLE_CLOSE_MEDIA_VIEWER: self.close() elif action == CAC.SIMPLE_SWITCH_BETWEEN_FULLSCREEN_BORDERLESS_AND_REGULAR_FRAMED_WINDOW: self.FullscreenSwitch() elif action == CAC.SIMPLE_FLIP_DARKMODE: HG.client_controller.gui.FlipDarkmode() elif action == CAC.SIMPLE_GLOBAL_AUDIO_MUTE: ClientGUIMediaControls.SetMute( ClientGUIMediaControls.AUDIO_GLOBAL, True) elif action == CAC.SIMPLE_GLOBAL_AUDIO_UNMUTE: ClientGUIMediaControls.SetMute( ClientGUIMediaControls.AUDIO_GLOBAL, False) elif action == CAC.SIMPLE_GLOBAL_AUDIO_MUTE_FLIP: ClientGUIMediaControls.FlipMute( ClientGUIMediaControls.AUDIO_GLOBAL) else: command_processed = False else: command_processed = False return command_processed