hydrus/include/ClientGUIPredicates.py

1593 lines
50 KiB
Python
Raw Normal View History

2019-01-09 22:59:03 +00:00
from . import ClientConstants as CC
from . import ClientData
from . import ClientGUICommon
from . import ClientGUIControls
2019-08-07 22:59:53 +00:00
from . import ClientGUIFunctions
2019-01-09 22:59:03 +00:00
from . import ClientGUIOptionsPanels
from . import ClientGUIScrolledPanels
from . import ClientGUIShortcuts
from . import ClientGUITime
from . import ClientRatings
from . import ClientSearch
2018-01-31 22:58:15 +00:00
import datetime
2019-01-09 22:59:03 +00:00
from . import HydrusConstants as HC
from . import HydrusData
from . import HydrusGlobals as HG
2019-02-06 22:41:35 +00:00
from . import HydrusText
2018-03-28 21:55:58 +00:00
import re
2015-04-08 18:10:50 +00:00
import string
import wx
2018-01-31 22:58:15 +00:00
import wx.adv
2015-04-08 18:10:50 +00:00
2018-11-21 22:22:36 +00:00
class InputFileSystemPredicate( ClientGUIScrolledPanels.EditPanel ):
def __init__( self, parent, predicate_type ):
ClientGUIScrolledPanels.EditPanel.__init__( self, parent )
self._predicates = []
pred_classes = []
if predicate_type == HC.PREDICATE_TYPE_SYSTEM_AGE:
pred_classes.append( PanelPredicateSystemAgeDelta )
pred_classes.append( PanelPredicateSystemAgeDate )
2019-10-02 23:38:59 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_MODIFIED_TIME:
pred_classes.append( PanelPredicateSystemModifiedDelta )
pred_classes.append( PanelPredicateSystemModifiedDate )
2018-11-21 22:22:36 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_DIMENSIONS:
pred_classes.append( PanelPredicateSystemHeight )
pred_classes.append( PanelPredicateSystemWidth )
pred_classes.append( PanelPredicateSystemRatio )
pred_classes.append( PanelPredicateSystemNumPixels )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_DURATION:
pred_classes.append( PanelPredicateSystemDuration )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_FILE_SERVICE:
pred_classes.append( PanelPredicateSystemFileService )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_KNOWN_URLS:
pred_classes.append( PanelPredicateSystemKnownURLsExactURL )
pred_classes.append( PanelPredicateSystemKnownURLsDomain )
pred_classes.append( PanelPredicateSystemKnownURLsRegex )
2019-05-08 21:06:42 +00:00
pred_classes.append( PanelPredicateSystemKnownURLsURLClass )
2018-11-21 22:22:36 +00:00
2019-08-07 22:59:53 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_HAS_AUDIO:
pred_classes.append( PanelPredicateSystemHasAudio )
2018-11-21 22:22:36 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_HASH:
pred_classes.append( PanelPredicateSystemHash )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_LIMIT:
pred_classes.append( PanelPredicateSystemLimit )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_MIME:
pred_classes.append( PanelPredicateSystemMime )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_NUM_TAGS:
pred_classes.append( PanelPredicateSystemNumTags )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_NUM_WORDS:
pred_classes.append( PanelPredicateSystemNumWords )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_RATING:
services_manager = HG.client_controller.services_manager
ratings_services = services_manager.GetServices( ( HC.LOCAL_RATING_LIKE, HC.LOCAL_RATING_NUMERICAL ) )
if len( ratings_services ) > 0:
pred_classes.append( PanelPredicateSystemRating )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_SIMILAR_TO:
pred_classes.append( PanelPredicateSystemSimilarTo )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_SIZE:
pred_classes.append( PanelPredicateSystemSize )
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_TAG_AS_NUMBER:
pred_classes.append( PanelPredicateSystemTagAsNumber )
2019-07-24 21:39:02 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_FILE_RELATIONSHIPS:
2018-11-21 22:22:36 +00:00
pred_classes.append( PanelPredicateSystemDuplicateRelationships )
2019-07-24 21:39:02 +00:00
pred_classes.append( PanelPredicateSystemDuplicateKing )
2018-11-21 22:22:36 +00:00
2018-12-12 22:15:46 +00:00
elif predicate_type == HC.PREDICATE_TYPE_SYSTEM_FILE_VIEWING_STATS:
pred_classes.append( PanelPredicateSystemFileViewingStatsViews )
pred_classes.append( PanelPredicateSystemFileViewingStatsViewtime )
2018-11-21 22:22:36 +00:00
vbox = wx.BoxSizer( wx.VERTICAL )
for pred_class in pred_classes:
panel = self._Panel( self, pred_class )
vbox.Add( panel, CC.FLAGS_EXPAND_PERPENDICULAR )
self.SetSizer( vbox )
def GetValue( self ):
return self._predicates
def SubPanelOK( self, predicates ):
self._predicates = predicates
self.GetParent().DoOK()
class _Panel( wx.Panel ):
def __init__( self, parent, predicate_class ):
wx.Panel.__init__( self, parent )
self._predicate_panel = predicate_class( self )
self._ok = wx.Button( self, id = wx.ID_OK, label = 'OK' )
self._ok.Bind( wx.EVT_BUTTON, self.EventOK )
self._ok.SetForegroundColour( ( 0, 128, 0 ) )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( self._predicate_panel, CC.FLAGS_EXPAND_SIZER_BOTH_WAYS )
hbox.Add( self._ok, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
self.Bind( wx.EVT_CHAR_HOOK, self.EventCharHook )
def _DoOK( self ):
predicates = self._predicate_panel.GetPredicates()
self.GetParent().SubPanelOK( predicates )
def EventCharHook( self, event ):
( modifier, key ) = ClientGUIShortcuts.ConvertKeyEventToSimpleTuple( event )
if key in ( wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER ):
self._DoOK()
else:
event.Skip()
def EventOK( self, event ):
self._DoOK()
2015-04-08 18:10:50 +00:00
class PanelPredicateSystem( wx.Panel ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = None
2015-04-08 18:10:50 +00:00
def GetInfo( self ):
raise NotImplementedError()
2015-07-01 22:02:07 +00:00
def GetPredicates( self ):
2015-04-08 18:10:50 +00:00
info = self.GetInfo()
2015-12-09 23:16:41 +00:00
predicates = ( ClientSearch.Predicate( self.PREDICATE_TYPE, info ), )
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
return predicates
2015-04-08 18:10:50 +00:00
2018-01-31 22:58:15 +00:00
class PanelPredicateSystemAgeDate( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_AGE
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2018-01-31 22:58:15 +00:00
self._date = wx.adv.CalendarCtrl( self )
wx_dt = wx.DateTime.Today()
wx_dt.Subtract( wx.TimeSpan( 24 * 7 ) )
self._date.SetDate( wx_dt )
self._sign.SetStringSelection( '>' )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-02-07 23:40:33 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:time imported' ), CC.FLAGS_VCENTER )
2018-01-31 22:58:15 +00:00
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._date, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
wx_dt = self._date.GetDate()
year = wx_dt.year
month = wx_dt.month + 1 # month zero indexed, wew
day = wx_dt.day
info = ( self._sign.GetStringSelection(), 'date', ( year, month, day ) )
return info
class PanelPredicateSystemAgeDelta( PanelPredicateSystem ):
2015-04-08 18:10:50 +00:00
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_AGE
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '>' ] )
2015-04-08 18:10:50 +00:00
self._years = wx.SpinCtrl( self, max = 30, size = ( 60, -1 ) )
self._months = wx.SpinCtrl( self, max = 60, size = ( 60, -1 ) )
self._days = wx.SpinCtrl( self, max = 90, size = ( 60, -1 ) )
self._hours = wx.SpinCtrl( self, max = 24, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
2018-02-07 23:40:33 +00:00
try:
( sign, age_type, ( years, months, days, hours ) ) = system_predicates[ 'age' ]
except:
# wew lad. replace this all with proper system pred saving on new_options in future
sign = '<'
years = 0
months = 0
days = 7
hours = 0
2015-04-08 18:10:50 +00:00
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._years.SetValue( years )
self._months.SetValue( months )
self._days.SetValue( days )
2015-04-22 22:57:25 +00:00
self._hours.SetValue( hours )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-02-07 23:40:33 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:time imported' ), CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._years, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'years' ), CC.FLAGS_VCENTER )
hbox.Add( self._months, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'months' ), CC.FLAGS_VCENTER )
hbox.Add( self._days, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'days' ), CC.FLAGS_VCENTER )
hbox.Add( self._hours, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'hours' ), CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._days.SetFocus )
def GetInfo( self ):
2018-01-31 22:58:15 +00:00
info = ( self._sign.GetStringSelection(), 'delta', ( self._years.GetValue(), self._months.GetValue(), self._days.GetValue(), self._hours.GetValue() ) )
2019-10-02 23:38:59 +00:00
return info
class PanelPredicateSystemModifiedDate( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_MODIFIED_TIME
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
self._date = wx.adv.CalendarCtrl( self )
wx_dt = wx.DateTime.Today()
wx_dt.Subtract( wx.TimeSpan( 24 * 7 ) )
self._date.SetDate( wx_dt )
self._sign.SetStringSelection( '>' )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:modified date' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._date, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
wx_dt = self._date.GetDate()
year = wx_dt.year
month = wx_dt.month + 1 # month zero indexed, wew
day = wx_dt.day
info = ( self._sign.GetStringSelection(), 'date', ( year, month, day ) )
return info
class PanelPredicateSystemModifiedDelta( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_MODIFIED_TIME
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '>' ] )
self._years = wx.SpinCtrl( self, max = 30, size = ( 60, -1 ) )
self._months = wx.SpinCtrl( self, max = 60, size = ( 60, -1 ) )
self._days = wx.SpinCtrl( self, max = 90, size = ( 60, -1 ) )
self._hours = wx.SpinCtrl( self, max = 24, size = ( 60, -1 ) )
# wew lad. replace this all with proper system pred saving on new_options in future
sign = '<'
years = 0
months = 0
days = 7
hours = 0
self._sign.SetStringSelection( sign )
self._years.SetValue( years )
self._months.SetValue( months )
self._days.SetValue( days )
self._hours.SetValue( hours )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:modified date' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._years, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'years' ), CC.FLAGS_VCENTER )
hbox.Add( self._months, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'months' ), CC.FLAGS_VCENTER )
hbox.Add( self._days, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'days' ), CC.FLAGS_VCENTER )
hbox.Add( self._hours, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'hours' ), CC.FLAGS_VCENTER )
self.SetSizer( hbox )
wx.CallAfter( self._days.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), 'delta', ( self._years.GetValue(), self._months.GetValue(), self._days.GetValue(), self._hours.GetValue() ) )
2015-04-08 18:10:50 +00:00
return info
2019-07-24 21:39:02 +00:00
class PanelPredicateSystemDuplicateKing( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_FILE_RELATIONSHIPS_KING
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
choices = [ 'is the best quality file of its group', 'is not the best quality file of its group' ]
self._king = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_ROWS )
#
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:' ), CC.FLAGS_VCENTER )
hbox.Add( self._king, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
wx.CallAfter( self._king.SetFocus )
def GetInfo( self ):
king_str = self._king.GetStringSelection()
king = 'is the' in king_str
info = king
return info
2017-05-24 20:28:24 +00:00
class PanelPredicateSystemDuplicateRelationships( PanelPredicateSystem ):
2019-07-24 21:39:02 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_FILE_RELATIONSHIPS_COUNT
2017-05-24 20:28:24 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
choices = [ '<', '\u2248', '=', '>' ]
2017-05-24 20:28:24 +00:00
self._sign = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_COLS )
self._num = wx.SpinCtrl( self, min = 0, max = 65535 )
2019-06-19 22:08:48 +00:00
choices = [ ( HC.duplicate_type_string_lookup[ status ], status ) for status in ( HC.DUPLICATE_MEMBER, HC.DUPLICATE_ALTERNATE, HC.DUPLICATE_FALSE_POSITIVE, HC.DUPLICATE_POTENTIAL ) ]
2017-05-24 20:28:24 +00:00
self._dupe_type = ClientGUICommon.BetterRadioBox( self, choices = choices, style = wx.RA_SPECIFY_ROWS )
#
self._sign.SetStringSelection( '>' )
self._num.SetValue( 0 )
#
hbox = wx.BoxSizer( wx.HORIZONTAL )
2019-07-24 21:39:02 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:num file relationships' ), CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._num, CC.FLAGS_VCENTER )
hbox.Add( self._dupe_type, CC.FLAGS_VCENTER )
2017-05-24 20:28:24 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._num.SetFocus )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
info = ( self._sign.GetStringSelection(), self._num.GetValue(), self._dupe_type.GetValue() )
2017-05-24 20:28:24 +00:00
return info
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemDuration( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_DURATION
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
choices = [ '<', '\u2248', '=', '>' ]
2017-01-04 22:48:23 +00:00
self._sign = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_COLS )
2015-04-08 18:10:50 +00:00
self._duration_s = wx.SpinCtrl( self, max = 3599, size = ( 60, -1 ) )
self._duration_ms = wx.SpinCtrl( self, max = 999, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
2015-04-22 22:57:25 +00:00
( sign, ms ) = system_predicates[ 'duration' ]
2015-04-08 18:10:50 +00:00
2019-01-09 22:59:03 +00:00
s = ms // 1000
2015-04-22 22:57:25 +00:00
ms = ms % 1000
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._duration_s.SetValue( s )
self._duration_ms.SetValue( ms )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:duration' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._duration_s, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 's' ), CC.FLAGS_VCENTER )
hbox.Add( self._duration_ms, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'ms' ), CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._duration_s.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._duration_s.GetValue() * 1000 + self._duration_ms.GetValue() )
return info
class PanelPredicateSystemFileService( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_FILE_SERVICE
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2017-01-04 22:48:23 +00:00
self._sign = ClientGUICommon.BetterRadioBox( self, choices = [ ( 'is', True ), ( 'is not', False ) ], style = wx.RA_SPECIFY_ROWS )
2015-04-08 18:10:50 +00:00
2017-03-02 02:14:56 +00:00
self._current_pending = ClientGUICommon.BetterRadioBox( self, choices = [ ( 'currently in', HC.CONTENT_STATUS_CURRENT ), ( 'pending to', HC.CONTENT_STATUS_PENDING ) ], style = wx.RA_SPECIFY_ROWS )
2015-04-08 18:10:50 +00:00
2017-06-28 20:23:21 +00:00
services = HG.client_controller.services_manager.GetServices( HC.FILE_SERVICES )
2015-04-08 18:10:50 +00:00
2017-01-04 22:48:23 +00:00
choices = [ ( service.GetName(), service.GetServiceKey() ) for service in services ]
self._file_service_key = ClientGUICommon.BetterRadioBox( self, choices = choices, style = wx.RA_SPECIFY_ROWS )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:file service:' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._current_pending, CC.FLAGS_VCENTER )
hbox.Add( self._file_service_key, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._sign.SetFocus )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
info = ( self._sign.GetValue(), self._current_pending.GetValue(), self._file_service_key.GetValue() )
2017-01-04 22:48:23 +00:00
2015-04-08 18:10:50 +00:00
return info
2018-12-12 22:15:46 +00:00
class PanelPredicateSystemFileViewingStatsViews( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_FILE_VIEWING_STATS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._viewing_locations = ClientGUICommon.BetterCheckListBox( self )
self._viewing_locations.Append( 'media views', 'media' )
self._viewing_locations.Append( 'preview views', 'preview' )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2018-12-12 22:15:46 +00:00
self._value = wx.SpinCtrl( self, min = 0, max = 1000000 )
#
self._viewing_locations.Check( 0 )
self._sign.Select( 3 )
self._value.SetValue( 10 )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:' ), CC.FLAGS_VCENTER )
hbox.Add( self._viewing_locations, CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._value, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
viewing_locations = self._viewing_locations.GetChecked()
if len( viewing_locations ) == 0:
viewing_locations = [ 'media' ]
sign = self._sign.GetStringSelection()
value = self._value.GetValue()
info = ( 'views', tuple( viewing_locations ), sign, value )
return info
class PanelPredicateSystemFileViewingStatsViewtime( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_FILE_VIEWING_STATS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._viewing_locations = ClientGUICommon.BetterCheckListBox( self )
self._viewing_locations.Append( 'media viewtime', 'media' )
self._viewing_locations.Append( 'preview viewtime', 'preview' )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2018-12-12 22:15:46 +00:00
self._time_delta = ClientGUITime.TimeDeltaCtrl( self, min = 0, days = True, hours = True, minutes = True, seconds = True )
#
self._viewing_locations.Check( 0 )
self._sign.Select( 3 )
self._time_delta.SetValue( 600 )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:' ), CC.FLAGS_VCENTER )
hbox.Add( self._viewing_locations, CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._time_delta, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
viewing_locations = self._viewing_locations.GetChecked()
if len( viewing_locations ) == 0:
viewing_locations = [ 'media' ]
sign = self._sign.GetStringSelection()
time_delta = self._time_delta.GetValue()
info = ( 'viewtime', tuple( viewing_locations ), sign, time_delta )
return info
2019-08-07 22:59:53 +00:00
class PanelPredicateSystemHasAudio( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_HAS_AUDIO
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
choices = [ 'has audio', 'does not have audio' ]
self._has_audio = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_ROWS )
#
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:' ), CC.FLAGS_VCENTER )
hbox.Add( self._has_audio, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
wx.CallAfter( self._has_audio.SetFocus )
def GetInfo( self ):
has_audio_string = self._has_audio.GetStringSelection()
has_audio = has_audio_string == 'has audio'
info = has_audio
return info
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemHash( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_HASH
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-08-07 22:59:53 +00:00
self._hashes = wx.TextCtrl( self, style = wx.TE_MULTILINE )
2017-01-04 22:48:23 +00:00
2019-08-07 22:59:53 +00:00
init_size = ClientGUIFunctions.ConvertTextToPixels( self._hashes, ( 66, 10 ) )
self._hashes.SetMinSize( init_size )
2015-04-08 18:10:50 +00:00
2017-01-04 22:48:23 +00:00
choices = [ 'sha256', 'md5', 'sha1', 'sha512' ]
2015-12-30 23:44:09 +00:00
2017-01-04 22:48:23 +00:00
self._hash_type = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_COLS )
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
self._hashes.SetValue( 'enter hash (paste newline-separated for multiple hashes)' )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:hash=' ), CC.FLAGS_VCENTER )
2019-08-07 22:59:53 +00:00
hbox.Add( self._hashes, CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._hash_type, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
2019-08-07 22:59:53 +00:00
wx.CallAfter( self._hashes.SetFocus )
2015-04-08 18:10:50 +00:00
def GetInfo( self ):
2019-08-07 22:59:53 +00:00
hex_hashes_raw = self._hashes.GetValue()
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
hex_hashes = HydrusText.DeserialiseNewlinedTexts( hex_hashes_raw )
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
hex_hashes = [ HydrusText.HexFilter( hex_hash ) for hex_hash in hex_hashes ]
hex_hashes = HydrusData.DedupeList( hex_hashes )
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
hashes = tuple( [ bytes.fromhex( hex_hash ) for hex_hash in hex_hashes ] )
2015-04-08 18:10:50 +00:00
2017-01-04 22:48:23 +00:00
hash_type = self._hash_type.GetStringSelection()
2015-12-30 23:44:09 +00:00
2019-08-07 22:59:53 +00:00
return ( hashes, hash_type )
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemHeight( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_HEIGHT
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
self._height = wx.SpinCtrl( self, max = 200000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, height ) = system_predicates[ 'height' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._height.SetValue( height )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:height' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._height, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._height.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._height.GetValue() )
return info
2018-03-28 21:55:58 +00:00
class PanelPredicateSystemKnownURLsExactURL( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_KNOWN_URLS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._operator = ClientGUICommon.BetterChoice( self )
self._operator.Append( 'has', True )
self._operator.Append( 'does not have', False )
self._exact_url = wx.TextCtrl( self, size = ( 250, -1 ) )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:known url' ), CC.FLAGS_VCENTER )
hbox.Add( self._operator, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'exact url:' ), CC.FLAGS_VCENTER )
hbox.Add( self._exact_url, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
operator = self._operator.GetValue()
2018-03-28 21:55:58 +00:00
if operator:
operator_description = 'has this url: '
else:
operator_description = 'does not have this url: '
rule_type = 'regex'
exact_url = self._exact_url.GetValue()
rule = re.escape( exact_url )
description = operator_description + exact_url
return ( operator, rule_type, rule, description )
class PanelPredicateSystemKnownURLsDomain( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_KNOWN_URLS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._operator = ClientGUICommon.BetterChoice( self )
self._operator.Append( 'has', True )
self._operator.Append( 'does not have', False )
self._domain = wx.TextCtrl( self, size = ( 250, -1 ) )
self._domain.SetValue( 'example.com' )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:known url' ), CC.FLAGS_VCENTER )
hbox.Add( self._operator, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'a url with domain:' ), CC.FLAGS_VCENTER )
hbox.Add( self._domain, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
operator = self._operator.GetValue()
2018-03-28 21:55:58 +00:00
if operator:
operator_description = 'has a url with domain: '
else:
operator_description = 'does not have a url with domain: '
rule_type = 'regex'
domain = self._domain.GetValue()
2018-04-25 22:07:52 +00:00
rule = r'^https?\:\/\/(www[^\.]*\.)?' + re.escape( domain ) + r'\/.*'
2018-03-28 21:55:58 +00:00
description = operator_description + domain
return ( operator, rule_type, rule, description )
class PanelPredicateSystemKnownURLsRegex( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_KNOWN_URLS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._operator = ClientGUICommon.BetterChoice( self )
self._operator.Append( 'has', True )
self._operator.Append( 'does not have', False )
self._regex = wx.TextCtrl( self, size = ( 250, -1 ) )
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:known url' ), CC.FLAGS_VCENTER )
hbox.Add( self._operator, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'a url that matches this regex:' ), CC.FLAGS_VCENTER )
hbox.Add( self._regex, CC.FLAGS_VCENTER )
self.SetSizer( hbox )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
operator = self._operator.GetValue()
2018-03-28 21:55:58 +00:00
if operator:
operator_description = 'has a url matching regex: '
else:
operator_description = 'does not have a url matching regex: '
rule_type = 'regex'
regex = self._regex.GetValue()
rule = regex
description = operator_description + regex
return ( operator, rule_type, rule, description )
2019-05-08 21:06:42 +00:00
class PanelPredicateSystemKnownURLsURLClass( PanelPredicateSystem ):
2018-03-28 21:55:58 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_KNOWN_URLS
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._operator = ClientGUICommon.BetterChoice( self )
self._operator.Append( 'has', True )
self._operator.Append( 'does not have', False )
2019-05-08 21:06:42 +00:00
self._url_classes = ClientGUICommon.BetterChoice( self )
2018-03-28 21:55:58 +00:00
2019-05-08 21:06:42 +00:00
for url_class in HG.client_controller.network_engine.domain_manager.GetURLClasses():
2018-03-28 21:55:58 +00:00
2019-05-08 21:06:42 +00:00
if url_class.ShouldAssociateWithFiles():
2018-03-28 21:55:58 +00:00
2019-05-08 21:06:42 +00:00
self._url_classes.Append( url_class.GetName(), url_class )
2018-03-28 21:55:58 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:known url' ), CC.FLAGS_VCENTER )
hbox.Add( self._operator, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, 'url matching this class:' ), CC.FLAGS_VCENTER )
2019-05-08 21:06:42 +00:00
hbox.Add( self._url_classes, CC.FLAGS_VCENTER )
2018-03-28 21:55:58 +00:00
self.SetSizer( hbox )
def GetInfo( self ):
2019-07-24 21:39:02 +00:00
operator = self._operator.GetValue()
2018-03-28 21:55:58 +00:00
if operator:
operator_description = 'has '
else:
operator_description = 'does not have '
2019-05-08 21:06:42 +00:00
rule_type = 'url_class'
2018-03-28 21:55:58 +00:00
2019-07-24 21:39:02 +00:00
url_class = self._url_classes.GetValue()
2018-03-28 21:55:58 +00:00
2019-05-08 21:06:42 +00:00
rule = url_class
2018-03-28 21:55:58 +00:00
2019-05-08 21:06:42 +00:00
description = operator_description + url_class.GetName() + ' url'
2018-03-28 21:55:58 +00:00
return ( operator, rule_type, rule, description )
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemLimit( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_LIMIT
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._limit = wx.SpinCtrl( self, max = 1000000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
limit = system_predicates[ 'limit' ]
self._limit.SetValue( limit )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:limit=' ), CC.FLAGS_VCENTER )
hbox.Add( self._limit, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._limit.SetFocus )
def GetInfo( self ):
info = self._limit.GetValue()
return info
class PanelPredicateSystemMime( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_MIME
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2015-09-09 22:04:39 +00:00
self._mimes = ClientGUIOptionsPanels.OptionsPanelMimes( self, HC.SEARCHABLE_MIMES )
2015-04-08 18:10:50 +00:00
system_predicates = HC.options[ 'file_system_predicates' ]
2015-09-09 22:04:39 +00:00
mimes = system_predicates[ 'mime' ]
2015-04-08 18:10:50 +00:00
2016-01-13 22:08:19 +00:00
if isinstance( mimes, int ):
2015-09-09 22:04:39 +00:00
mimes = ( mimes, )
2017-02-01 21:11:17 +00:00
self._mimes.SetValue( mimes )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2019-05-15 20:35:00 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:filetype' ), CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._mimes, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
def GetInfo( self ):
2017-02-01 21:11:17 +00:00
mimes = self._mimes.GetValue()
2015-04-22 22:57:25 +00:00
2015-09-09 22:04:39 +00:00
return mimes
2015-04-22 22:57:25 +00:00
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemNumPixels( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_NUM_PIXELS
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
self._num_pixels = wx.SpinCtrl( self, max = 1048576, size = ( 60, -1 ) )
2017-01-04 22:48:23 +00:00
self._unit = wx.RadioBox( self, choices = [ 'pixels', 'kilopixels', 'megapixels' ] )
2015-04-08 18:10:50 +00:00
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, num_pixels, unit ) = system_predicates[ 'num_pixels' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._num_pixels.SetValue( num_pixels )
2015-04-22 22:57:25 +00:00
self._unit.SetStringSelection( HydrusData.ConvertIntToPixels( unit ) )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:num_pixels' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._num_pixels, CC.FLAGS_VCENTER )
hbox.Add( self._unit, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._num_pixels.SetFocus )
def GetInfo( self ):
2015-04-22 22:57:25 +00:00
info = ( self._sign.GetStringSelection(), self._num_pixels.GetValue(), HydrusData.ConvertPixelsToInt( self._unit.GetStringSelection() ) )
2015-04-08 18:10:50 +00:00
return info
class PanelPredicateSystemNumTags( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_NUM_TAGS
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
self._num_tags = wx.SpinCtrl( self, max = 2000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, num_tags ) = system_predicates[ 'num_tags' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._num_tags.SetValue( num_tags )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:num_tags' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._num_tags, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._num_tags.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._num_tags.GetValue() )
return info
class PanelPredicateSystemNumWords( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_NUM_WORDS
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
self._num_words = wx.SpinCtrl( self, max = 1000000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, num_words ) = system_predicates[ 'num_words' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._num_words.SetValue( num_words )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:num_words' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._num_words, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._num_words.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._num_words.GetValue() )
return info
2015-07-08 21:45:38 +00:00
class PanelPredicateSystemRating( PanelPredicateSystem ):
2015-04-08 18:10:50 +00:00
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_RATING
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2015-07-08 21:45:38 +00:00
#
2017-06-28 20:23:21 +00:00
local_like_services = HG.client_controller.services_manager.GetServices( ( HC.LOCAL_RATING_LIKE, ), randomised = False )
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
self._like_checkboxes_to_info = {}
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
self._like_rating_ctrls = []
2015-04-08 18:10:50 +00:00
2018-01-03 22:37:30 +00:00
gridbox = wx.FlexGridSizer( 5 )
2015-04-08 18:10:50 +00:00
2017-01-04 22:48:23 +00:00
gridbox.AddGrowableCol( 0, 1 )
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
for service in local_like_services:
name = service.GetName()
service_key = service.GetServiceKey()
rated_checkbox = wx.CheckBox( self, label = 'rated' )
not_rated_checkbox = wx.CheckBox( self, label = 'not rated' )
rating_ctrl = ClientGUICommon.RatingLikeDialog( self, service_key )
2015-07-08 21:45:38 +00:00
self._like_checkboxes_to_info[ rated_checkbox ] = ( service_key, ClientRatings.SET )
self._like_checkboxes_to_info[ not_rated_checkbox ] = ( service_key, ClientRatings.NULL )
self._like_rating_ctrls.append( rating_ctrl )
2015-07-01 22:02:07 +00:00
2018-01-03 22:37:30 +00:00
gridbox.Add( ClientGUICommon.BetterStaticText( self, name ), CC.FLAGS_VCENTER )
gridbox.Add( rated_checkbox, CC.FLAGS_VCENTER )
gridbox.Add( not_rated_checkbox, CC.FLAGS_VCENTER )
gridbox.Add( ( 20, 20 ), CC.FLAGS_EXPAND_SIZER_BOTH_WAYS )
gridbox.Add( rating_ctrl, CC.FLAGS_VCENTER )
2015-07-01 22:02:07 +00:00
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
#
2017-06-28 20:23:21 +00:00
local_numerical_services = HG.client_controller.services_manager.GetServices( ( HC.LOCAL_RATING_NUMERICAL, ), randomised = False )
2015-07-08 21:45:38 +00:00
self._numerical_checkboxes_to_info = {}
self._numerical_rating_ctrls_to_info = {}
for service in local_numerical_services:
name = service.GetName()
service_key = service.GetServiceKey()
rated_checkbox = wx.CheckBox( self, label = 'rated' )
not_rated_checkbox = wx.CheckBox( self, label = 'not rated' )
2019-01-09 22:59:03 +00:00
choice = wx.RadioBox( self, choices = [ '>', '<', '=', '\u2248' ] )
2015-07-08 21:45:38 +00:00
rating_ctrl = ClientGUICommon.RatingNumericalDialog( self, service_key )
2017-01-04 22:48:23 +00:00
choice.SetSelection( 2 )
2015-07-08 21:45:38 +00:00
self._numerical_checkboxes_to_info[ rated_checkbox ] = ( service_key, ClientRatings.SET )
self._numerical_checkboxes_to_info[ not_rated_checkbox ] = ( service_key, ClientRatings.NULL )
self._numerical_rating_ctrls_to_info[ rating_ctrl ] = choice
2018-01-03 22:37:30 +00:00
gridbox.Add( ClientGUICommon.BetterStaticText( self, name ), CC.FLAGS_VCENTER )
gridbox.Add( rated_checkbox, CC.FLAGS_VCENTER )
gridbox.Add( not_rated_checkbox, CC.FLAGS_VCENTER )
gridbox.Add( choice, CC.FLAGS_VCENTER )
gridbox.Add( rating_ctrl, CC.FLAGS_VCENTER )
2015-07-08 21:45:38 +00:00
#
vbox = wx.BoxSizer( wx.VERTICAL )
2018-01-03 22:37:30 +00:00
vbox.Add( gridbox, CC.FLAGS_EXPAND_SIZER_BOTH_WAYS )
2015-07-08 21:45:38 +00:00
self.SetSizer( vbox )
2015-04-08 18:10:50 +00:00
def GetInfo( self ):
2015-07-01 22:02:07 +00:00
infos = []
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
#
2019-01-09 22:59:03 +00:00
for ( checkbox, ( service_key, rating_state ) ) in list(self._like_checkboxes_to_info.items()):
2015-07-01 22:02:07 +00:00
if checkbox.GetValue() == True:
if rating_state == ClientRatings.SET:
value = 'rated'
elif rating_state == ClientRatings.NULL:
value = 'not rated'
infos.append( ( '=', value, service_key ) )
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
for ctrl in self._like_rating_ctrls:
2015-07-01 22:02:07 +00:00
rating_state = ctrl.GetRatingState()
if rating_state in ( ClientRatings.LIKE, ClientRatings.DISLIKE ):
if rating_state == ClientRatings.LIKE:
2017-04-05 21:16:40 +00:00
value = 1
2015-07-01 22:02:07 +00:00
elif rating_state == ClientRatings.DISLIKE:
2017-04-05 21:16:40 +00:00
value = 0
2015-07-01 22:02:07 +00:00
service_key = ctrl.GetServiceKey()
infos.append( ( '=', value, service_key ) )
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
#
2015-04-08 18:10:50 +00:00
2019-01-09 22:59:03 +00:00
for ( checkbox, ( service_key, rating_state ) ) in list(self._numerical_checkboxes_to_info.items()):
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
if checkbox.GetValue() == True:
if rating_state == ClientRatings.SET:
value = 'rated'
elif rating_state == ClientRatings.NULL:
value = 'not rated'
infos.append( ( '=', value, service_key ) )
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
2019-01-09 22:59:03 +00:00
for ( ctrl, choice ) in list(self._numerical_rating_ctrls_to_info.items()):
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
rating_state = ctrl.GetRatingState()
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
if rating_state == ClientRatings.SET:
operator = choice.GetStringSelection()
value = ctrl.GetRating()
service_key = ctrl.GetServiceKey()
infos.append( ( operator, value, service_key ) )
2015-04-08 18:10:50 +00:00
2015-07-08 21:45:38 +00:00
#
2015-07-01 22:02:07 +00:00
return infos
2015-06-03 21:05:13 +00:00
2015-07-01 22:02:07 +00:00
def GetPredicates( self ):
2015-04-08 18:10:50 +00:00
2015-07-01 22:02:07 +00:00
infos = self.GetInfo()
2015-12-09 23:16:41 +00:00
predicates = [ ClientSearch.Predicate( self.PREDICATE_TYPE, info ) for info in infos ]
2015-07-01 22:02:07 +00:00
return predicates
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemRatio( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_RATIO
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '=', 'wider than', 'taller than', '\u2248' ] )
2015-04-08 18:10:50 +00:00
self._width = wx.SpinCtrl( self, max = 50000, size = ( 60, -1 ) )
self._height = wx.SpinCtrl( self, max = 50000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, width, height ) = system_predicates[ 'ratio' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._width.SetValue( width )
self._height.SetValue( height )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:ratio' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._width, CC.FLAGS_VCENTER )
hbox.Add( ClientGUICommon.BetterStaticText( self, ':' ), CC.FLAGS_VCENTER )
hbox.Add( self._height, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._sign.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._width.GetValue(), self._height.GetValue() )
return info
class PanelPredicateSystemSimilarTo( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_SIMILAR_TO
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-08-07 22:59:53 +00:00
self._hashes = wx.TextCtrl( self, style = wx.TE_MULTILINE )
init_size = ClientGUIFunctions.ConvertTextToPixels( self._hashes, ( 66, 10 ) )
self._hashes.SetMinSize( init_size )
2015-04-08 18:10:50 +00:00
self._max_hamming = wx.SpinCtrl( self, max = 256, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
2019-08-07 22:59:53 +00:00
self._hashes.SetValue( 'enter hash (paste newline-separated for multiple hashes)' )
2015-04-08 18:10:50 +00:00
hamming_distance = system_predicates[ 'hamming_distance' ]
self._max_hamming.SetValue( hamming_distance )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:similar_to' ), CC.FLAGS_VCENTER )
2019-08-07 22:59:53 +00:00
hbox.Add( self._hashes, CC.FLAGS_VCENTER )
2019-01-09 22:59:03 +00:00
hbox.Add( wx.StaticText( self, label='\u2248' ), CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._max_hamming, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
2019-08-07 22:59:53 +00:00
wx.CallAfter( self._hashes.SetFocus )
2015-04-08 18:10:50 +00:00
def GetInfo( self ):
2019-08-07 22:59:53 +00:00
hex_hashes_raw = self._hashes.GetValue()
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
hex_hashes = HydrusText.DeserialiseNewlinedTexts( hex_hashes_raw )
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
hex_hashes = [ HydrusText.HexFilter( hex_hash ) for hex_hash in hex_hashes ]
hex_hashes = HydrusData.DedupeList( hex_hashes )
hashes = tuple( [ bytes.fromhex( hex_hash ) for hex_hash in hex_hashes ] )
2015-04-08 18:10:50 +00:00
2019-08-07 22:59:53 +00:00
info = ( hashes, self._max_hamming.GetValue() )
2015-04-08 18:10:50 +00:00
return info
class PanelPredicateSystemSize( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_SIZE
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
2018-03-14 21:01:02 +00:00
self._bytes = ClientGUIControls.BytesControl( self )
2015-04-08 18:10:50 +00:00
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, size, unit ) = system_predicates[ 'size' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
2018-03-14 21:01:02 +00:00
self._bytes.SetSeparatedValue( size, unit )
2015-04-08 18:10:50 +00:00
hbox = wx.BoxSizer( wx.HORIZONTAL )
2019-07-24 21:39:02 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:filesize' ), CC.FLAGS_VCENTER )
2018-01-03 22:37:30 +00:00
hbox.Add( self._sign, CC.FLAGS_VCENTER )
2018-03-14 21:01:02 +00:00
hbox.Add( self._bytes, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
2018-03-14 21:01:02 +00:00
wx.CallAfter( self._bytes.SetFocus )
2015-04-08 18:10:50 +00:00
def GetInfo( self ):
2018-03-14 21:01:02 +00:00
( size, unit ) = self._bytes.GetSeparatedValue()
info = ( self._sign.GetStringSelection(), size, unit )
2015-04-08 18:10:50 +00:00
return info
2017-06-21 21:15:59 +00:00
class PanelPredicateSystemTagAsNumber( PanelPredicateSystem ):
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_TAG_AS_NUMBER
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
self._namespace = wx.TextCtrl( self )
2019-01-09 22:59:03 +00:00
choices = [ '<', '\u2248', '>' ]
2017-06-21 21:15:59 +00:00
self._sign = wx.RadioBox( self, choices = choices, style = wx.RA_SPECIFY_COLS )
self._num = wx.SpinCtrl( self, min = -99999999, max = 99999999 )
#
self._namespace.SetValue( 'page' )
self._sign.SetStringSelection( '>' )
self._num.SetValue( 0 )
#
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:tag as number' ), CC.FLAGS_VCENTER )
hbox.Add( self._namespace, CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._num, CC.FLAGS_VCENTER )
2017-06-21 21:15:59 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._num.SetFocus )
def GetInfo( self ):
info = ( self._namespace.GetValue(), self._sign.GetStringSelection(), self._num.GetValue() )
return info
2015-04-08 18:10:50 +00:00
class PanelPredicateSystemWidth( PanelPredicateSystem ):
2015-06-24 22:10:14 +00:00
PREDICATE_TYPE = HC.PREDICATE_TYPE_SYSTEM_WIDTH
2015-04-08 18:10:50 +00:00
def __init__( self, parent ):
PanelPredicateSystem.__init__( self, parent )
2019-01-09 22:59:03 +00:00
self._sign = wx.RadioBox( self, choices = [ '<', '\u2248', '=', '>' ] )
2015-04-08 18:10:50 +00:00
self._width = wx.SpinCtrl( self, max = 200000, size = ( 60, -1 ) )
system_predicates = HC.options[ 'file_system_predicates' ]
( sign, width ) = system_predicates[ 'width' ]
2015-04-22 22:57:25 +00:00
self._sign.SetStringSelection( sign )
2015-04-08 18:10:50 +00:00
self._width.SetValue( width )
hbox = wx.BoxSizer( wx.HORIZONTAL )
2018-01-03 22:37:30 +00:00
hbox.Add( ClientGUICommon.BetterStaticText( self, 'system:width' ), CC.FLAGS_VCENTER )
hbox.Add( self._sign, CC.FLAGS_VCENTER )
hbox.Add( self._width, CC.FLAGS_VCENTER )
2015-04-08 18:10:50 +00:00
self.SetSizer( hbox )
wx.CallAfter( self._width.SetFocus )
def GetInfo( self ):
info = ( self._sign.GetStringSelection(), self._width.GetValue() )
return info
2016-12-21 22:30:54 +00:00