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