hydrus/hydrus/client/gui/lists/ClientGUIListStatus.py

185 lines
5.6 KiB
Python

import typing
from hydrus.core import HydrusSerialisable
from hydrus.client.gui.lists import ClientGUIListConstants as CGLC
class ColumnListStatus( HydrusSerialisable.SerialisableBase ):
SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_COLUMN_LIST_STATUS
SERIALISABLE_NAME = 'Column List Status'
SERIALISABLE_VERSION = 1
def __init__( self ):
HydrusSerialisable.SerialisableBase.__init__( self )
self._column_list_type = 0
self._columns = []
self._sort_column_type = 0
self._sort_asc = True
self._column_types_in_order = []
self._columns_to_widths = {}
self._columns_to_shown = {}
def _GetSerialisableInfo( self ):
return ( self._column_list_type, self._columns, self._sort_column_type, self._sort_asc )
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
( self._column_list_type, self._columns, self._sort_column_type, self._sort_asc ) = serialisable_info
self._UpdateColumnCache()
def _UpdateColumnCache( self ):
self._column_types_in_order = []
self._columns_to_widths = {}
self._columns_to_shown = {}
for ( column_type, width, shown ) in self._columns:
self._column_types_in_order.append( column_type )
self._columns_to_widths[ column_type ] = width
self._columns_to_shown[ column_type ] = shown
def AddRemoveForNewColumns( self ):
default = ColumnListStatus.STATICGetDefault( self._column_list_type )
if set( default.GetColumnTypes() ) != set( self._column_types_in_order ):
default_column_types = default.GetColumnTypes()
my_new_column_types = []
for column_type in self._column_types_in_order:
# column is now obselete
if column_type not in default_column_types:
continue
my_new_column_types.append( column_type )
for ( i, column_type ) in enumerate( default_column_types ):
# new column, try to stick it somewhere reasonable
if column_type not in my_new_column_types:
my_new_column_types.insert( i, column_type )
self._columns = []
for column_type in my_new_column_types:
if column_type in self._columns_to_widths:
width = self._columns_to_widths[ column_type ]
shown = self._columns_to_shown[ column_type ]
else:
width = default.GetColumnWidth( column_type )
shown = default.IsColumnShown( column_type )
self._columns.append( ( column_type, width, shown ) )
if self._sort_column_type not in default_column_types:
( self._sort_column_type, self._sort_asc ) = default.GetSort()
self._UpdateColumnCache()
def GetColumnCount( self ) -> int:
return len( self._column_types_in_order )
def GetColumnIndexFromType( self, column_type: int ):
return self._column_types_in_order.index( column_type )
def GetColumnListType( self ) -> int:
return self._column_list_type
def GetColumnTypeFromIndex( self, column_index: int ):
return self._column_types_in_order[ column_index ]
def GetColumnTypes( self ) -> typing.List[ int ]:
return list( self._column_types_in_order )
def GetColumnWidth( self, column_type: int ) -> int:
return self._columns_to_widths[ column_type ]
def GetSort( self ) -> typing.Tuple[ int, bool ]:
return ( self._sort_column_type, self._sort_asc )
def IsColumnShown( self, column_type: int ) -> bool:
return self._columns_to_shown[ column_type ]
def SetColumnListType( self, column_list_type: int ):
self._column_list_type = column_list_type
def SetSort( self, sort_column_type: int, sort_asc: bool ):
self._sort_column_type = sort_column_type
self._sort_asc = sort_asc
def SetColumns( self, columns: typing.List[ typing.Tuple[ int, int, bool ] ] ):
self._columns = columns
self._UpdateColumnCache()
@staticmethod
def STATICGetDefault( column_list_type: int ) -> "ColumnListStatus":
columns = CGLC.default_column_list_columns_lookup[ column_list_type ]
( sort_column_type, sort_asc ) = CGLC.default_column_list_sort_lookup[ column_list_type ]
status = ColumnListStatus()
status.SetColumnListType( column_list_type )
status.SetColumns( columns )
status.SetSort( sort_column_type, sort_asc )
return status
HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_COLUMN_LIST_STATUS ] = ColumnListStatus