2013-02-19 00:11:43 +00:00
|
|
|
import HydrusConstants as HC
|
|
|
|
import ClientConstants as CC
|
|
|
|
import ClientGUICommon
|
|
|
|
import ClientGUIDialogs
|
|
|
|
import ClientGUIManagement
|
|
|
|
import ClientGUIMedia
|
|
|
|
import ClientGUICanvas
|
2015-03-25 22:04:19 +00:00
|
|
|
import ClientDownloading
|
2015-05-20 21:31:40 +00:00
|
|
|
import HydrusData
|
2015-06-24 22:10:14 +00:00
|
|
|
import HydrusSerialisable
|
2015-03-18 21:46:29 +00:00
|
|
|
import HydrusThreading
|
2013-11-27 18:27:11 +00:00
|
|
|
import inspect
|
2013-02-19 00:11:43 +00:00
|
|
|
import os
|
2013-11-27 18:27:11 +00:00
|
|
|
import sys
|
2013-02-19 00:11:43 +00:00
|
|
|
import time
|
|
|
|
import traceback
|
|
|
|
import wx
|
2017-05-10 21:33:58 +00:00
|
|
|
import HydrusGlobals as HG
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
class Page( wx.SplitterWindow ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
def __init__( self, parent, controller, management_controller, initial_hashes ):
|
2015-06-24 22:10:14 +00:00
|
|
|
|
|
|
|
wx.SplitterWindow.__init__( self, parent )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-07-01 22:02:07 +00:00
|
|
|
self._page_key = HydrusData.GenerateKey()
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller = controller
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self._management_controller = management_controller
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
self._initial_hashes = initial_hashes
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self._management_controller.SetKey( 'page', self._page_key )
|
2015-03-04 22:44:32 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
self._pretty_status = ''
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self.SetMinimumPaneSize( 120 )
|
|
|
|
self.SetSashGravity( 0.0 )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self.Bind( wx.EVT_SPLITTER_DCLICK, self.EventUnsplit )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2016-05-25 21:54:03 +00:00
|
|
|
self._search_preview_split = wx.SplitterWindow( self, style = wx.SP_NOBORDER )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self._search_preview_split.SetMinimumPaneSize( 180 )
|
|
|
|
self._search_preview_split.SetSashGravity( 1.0 )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self._search_preview_split.Bind( wx.EVT_SPLITTER_DCLICK, self.EventPreviewUnsplit )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-12-02 22:32:18 +00:00
|
|
|
self._management_panel = ClientGUIManagement.CreateManagementPanel( self._search_preview_split, self, self._controller, self._management_controller )
|
2013-09-11 21:28:19 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
file_service_key = self._management_controller.GetKey( 'file_service' )
|
2013-09-11 21:28:19 +00:00
|
|
|
|
2015-07-15 20:28:26 +00:00
|
|
|
self._preview_panel = ClientGUICanvas.CanvasPanel( self._search_preview_split, self._page_key )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
self._media_panel = ClientGUIMedia.MediaPanelThumbnails( self, self._page_key, file_service_key, [] )
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2016-05-25 21:54:03 +00:00
|
|
|
self._search_preview_split.SplitHorizontally( self._management_panel, self._preview_panel, HC.options[ 'vpos' ] )
|
2015-11-04 22:30:28 +00:00
|
|
|
|
2016-05-25 21:54:03 +00:00
|
|
|
self.SplitVertically( self._search_preview_split, self._media_panel, HC.options[ 'hpos' ] )
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2015-11-04 22:30:28 +00:00
|
|
|
if HC.options[ 'hide_preview' ]:
|
|
|
|
|
|
|
|
wx.CallAfter( self._search_preview_split.Unsplit, self._preview_panel )
|
|
|
|
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller.sub( self, 'SetPrettyStatus', 'new_page_status' )
|
|
|
|
self._controller.sub( self, 'SwapMediaPanel', 'swap_media_panel' )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
if initial_hashes is not None and len( initial_hashes ) > 0:
|
|
|
|
|
|
|
|
self._initialised = False
|
|
|
|
|
|
|
|
self._controller.CallToThread( self.THREADLoadInitialMediaResults )
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
self._initialised = True
|
|
|
|
|
2017-07-19 21:21:41 +00:00
|
|
|
self._management_panel.Start()
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
def _SetPrettyStatus( self, status ):
|
|
|
|
|
|
|
|
self._pretty_status = status
|
|
|
|
|
|
|
|
self._controller.pubimmediate( 'refresh_status' )
|
|
|
|
|
|
|
|
|
|
|
|
def _SwapMediaPanel( self, new_panel ):
|
|
|
|
|
|
|
|
self._preview_panel.SetMedia( None )
|
|
|
|
|
|
|
|
self._media_panel.ClearPageKey()
|
|
|
|
|
|
|
|
self.ReplaceWindow( self._media_panel, new_panel )
|
|
|
|
|
|
|
|
self._media_panel.Hide()
|
|
|
|
|
|
|
|
# If this is a CallAfter, OS X segfaults on refresh jej
|
|
|
|
wx.CallLater( 500, self._media_panel.Destroy )
|
|
|
|
|
|
|
|
self._media_panel = new_panel
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
def CleanBeforeDestroy( self ):
|
|
|
|
|
|
|
|
self._management_panel.CleanBeforeDestroy()
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-04 22:30:28 +00:00
|
|
|
def EventPreviewUnsplit( self, event ):
|
|
|
|
|
|
|
|
self._search_preview_split.Unsplit( self._preview_panel )
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller.pub( 'set_focus', self._page_key, None )
|
2015-11-04 22:30:28 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-04 22:30:28 +00:00
|
|
|
def EventUnsplit( self, event ):
|
|
|
|
|
|
|
|
self.Unsplit( self._search_preview_split )
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller.pub( 'set_focus', self._page_key, None )
|
2015-11-04 22:30:28 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
def GetHashes( self ):
|
|
|
|
|
|
|
|
if self._initialised:
|
|
|
|
|
|
|
|
media = self.GetMedia()
|
|
|
|
|
|
|
|
hashes = []
|
|
|
|
|
|
|
|
for m in media:
|
|
|
|
|
|
|
|
hashes.extend( m.GetHashes() )
|
|
|
|
|
|
|
|
|
|
|
|
return hashes
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return self._initial_hashes
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def GetManagementController( self ):
|
2014-01-22 21:11:22 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
return self._management_controller
|
2014-01-22 21:11:22 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
# used by autocomplete
|
|
|
|
def GetMedia( self ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
return self._media_panel.GetSortedMedia()
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
def GetNumFiles( self ):
|
|
|
|
|
|
|
|
if self._initialised:
|
|
|
|
|
|
|
|
return self._media_panel.GetNumFiles()
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return len( self._initial_hashes )
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-09-16 18:11:00 +00:00
|
|
|
def GetPageKey( self ):
|
|
|
|
|
|
|
|
return self._page_key
|
|
|
|
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def GetPrettyStatus( self ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
return self._pretty_status
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
def GetSashPositions( self ):
|
|
|
|
|
2015-11-04 22:30:28 +00:00
|
|
|
if self.IsSplit():
|
|
|
|
|
|
|
|
x = self.GetSashPosition()
|
|
|
|
|
2016-05-25 21:54:03 +00:00
|
|
|
else:
|
|
|
|
|
|
|
|
x = HC.options[ 'hpos' ]
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-04 22:30:28 +00:00
|
|
|
if self._search_preview_split.IsSplit():
|
|
|
|
|
|
|
|
# I used to do:
|
|
|
|
# y = -1 * self._preview_panel.GetSize()[1]
|
|
|
|
# but that crept 4 pixels smaller every time, I assume due to sash caret height
|
|
|
|
|
|
|
|
( sps_x, sps_y ) = self._search_preview_split.GetClientSize()
|
|
|
|
|
|
|
|
sash_y = self._search_preview_split.GetSashPosition()
|
|
|
|
|
|
|
|
y = -1 * ( sps_y - sash_y )
|
|
|
|
|
2016-05-25 21:54:03 +00:00
|
|
|
else:
|
|
|
|
|
|
|
|
y = HC.options[ 'vpos' ]
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
return ( x, y )
|
|
|
|
|
|
|
|
|
2017-05-17 21:53:02 +00:00
|
|
|
def IsURLImportPage( self ):
|
|
|
|
|
|
|
|
return self._management_controller.GetType() == ClientGUIManagement.MANAGEMENT_TYPE_IMPORT_URLS
|
|
|
|
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
def PageHidden( self ):
|
|
|
|
|
|
|
|
self._controller.pub( 'page_hidden', self._page_key )
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
def PageShown( self ):
|
|
|
|
|
|
|
|
self._controller.pub( 'page_shown', self._page_key )
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-10-07 21:56:22 +00:00
|
|
|
def PrepareToHide( self ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller.pub( 'set_focus', self._page_key, None )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
def RefreshQuery( self ):
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
if self._initialised:
|
|
|
|
|
|
|
|
self._controller.pub( 'refresh_query', self._page_key )
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
def ShowHideSplit( self ):
|
|
|
|
|
|
|
|
if self.IsSplit():
|
|
|
|
|
|
|
|
self.Unsplit( self._search_preview_split )
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
self._controller.pub( 'set_focus', self._page_key, None )
|
2015-11-04 22:30:28 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
else:
|
|
|
|
|
2013-08-14 20:21:49 +00:00
|
|
|
self.SplitVertically( self._search_preview_split, self._media_panel, HC.options[ 'hpos' ] )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2013-08-14 20:21:49 +00:00
|
|
|
self._search_preview_split.SplitHorizontally( self._management_panel, self._preview_panel, HC.options[ 'vpos' ] )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
def SetMediaFocus( self ):
|
|
|
|
|
|
|
|
self._media_panel.SetFocus()
|
|
|
|
|
|
|
|
|
|
|
|
def SetMediaResults( self, media_results ):
|
|
|
|
|
|
|
|
file_service_key = self._management_controller.GetKey( 'file_service' )
|
|
|
|
|
|
|
|
media_panel = ClientGUIMedia.MediaPanelThumbnails( self, self._page_key, file_service_key, media_results )
|
|
|
|
|
|
|
|
self._SwapMediaPanel( media_panel )
|
|
|
|
|
|
|
|
self._initialised = True
|
|
|
|
self._initial_hashes = []
|
|
|
|
|
2017-07-19 21:21:41 +00:00
|
|
|
self._management_panel.Start()
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def SetPrettyStatus( self, page_key, status ):
|
|
|
|
|
|
|
|
if page_key == self._page_key:
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
if self._initialised:
|
|
|
|
|
|
|
|
self._SetPrettyStatus( status )
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
def SetSearchFocus( self ):
|
|
|
|
|
|
|
|
self._controller.pub( 'set_search_focus', self._page_key )
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2015-11-25 22:00:57 +00:00
|
|
|
def SetSynchronisedWait( self ):
|
|
|
|
|
|
|
|
self._controller.pub( 'synchronised_wait_switch', self._page_key )
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
def SwapMediaPanel( self, page_key, new_panel ):
|
|
|
|
|
|
|
|
if page_key == self._page_key:
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
self._SwapMediaPanel( new_panel )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
self._controller.pub( 'refresh_page_name', self._page_key )
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
def TestAbleToClose( self ):
|
|
|
|
|
|
|
|
self._management_panel.TestAbleToClose()
|
|
|
|
|
|
|
|
|
|
|
|
def THREADLoadInitialMediaResults( self ):
|
|
|
|
|
|
|
|
initial_media_results = []
|
|
|
|
|
|
|
|
for group_of_initial_hashes in HydrusData.SplitListIntoChunks( self._initial_hashes, 256 ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
more_media_results = self._controller.Read( 'media_results', group_of_initial_hashes )
|
2015-05-20 21:31:40 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
initial_media_results.extend( more_media_results )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
status = u'Loading initial files\u2026 ' + HydrusData.ConvertValueRangeToPrettyString( len( initial_media_results ), len( self._initial_hashes ) )
|
|
|
|
|
|
|
|
self._SetPrettyStatus( status )
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
hashes_to_media_results = { media_result.GetHash() : media_result for media_result in initial_media_results }
|
2015-09-02 23:16:09 +00:00
|
|
|
|
2017-07-05 21:09:28 +00:00
|
|
|
sorted_initial_media_results = [ hashes_to_media_results[ hash ] for hash in self._initial_hashes ]
|
|
|
|
|
|
|
|
wx.CallAfter( self.SetMediaResults, sorted_initial_media_results )
|
2015-09-02 23:16:09 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-08-09 21:33:51 +00:00
|
|
|
class PagesNotebook( wx.Notebook ):
|
|
|
|
|
|
|
|
def __init__( self, parent, controller ):
|
|
|
|
|
|
|
|
# bring the gui's current _notebook into here and merge all the rename_page, new_page, and other stuff into this
|
|
|
|
|
|
|
|
wx.Notebook.__init__( self, parent )
|
|
|
|
|
|
|
|
self._controller = controller
|
|
|
|
|
|
|
|
|
|
|
|
def _GetMediaPages( self ):
|
|
|
|
|
|
|
|
results = []
|
|
|
|
|
|
|
|
for page in self._GetPages():
|
|
|
|
|
|
|
|
if isinstance( page, wx.Notebook ):
|
|
|
|
|
|
|
|
results.extend( page.GetMediaPages() )
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
results.append( page )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return results
|
|
|
|
|
|
|
|
|
|
|
|
def _GetPages( self ):
|
|
|
|
|
|
|
|
return [ self.GetPage( i ) for i in range( self.GetPageCount() ) ]
|
|
|
|
|
|
|
|
|
|
|
|
def CleanBeforeDestroy( self ):
|
|
|
|
|
|
|
|
for page in self._GetPages():
|
|
|
|
|
|
|
|
page.CleanBeforeDestroy()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def GetNumFiles( self ):
|
|
|
|
|
|
|
|
return sum( page.GetNumFiles() for page in self._GetPages() )
|
|
|
|
|
|
|
|
|
|
|
|
def GetMediaPages( self ):
|
|
|
|
|
|
|
|
return self._GetMediaPages()
|
|
|
|
|
|
|
|
|
|
|
|
def GetPages( self ):
|
|
|
|
|
|
|
|
return self._GetPages()
|
|
|
|
|
|
|
|
|
|
|
|
def GetPrettyStatus( self ):
|
|
|
|
|
|
|
|
current_page = self.GetCurrentPage()
|
|
|
|
|
|
|
|
if current_page is None:
|
|
|
|
|
|
|
|
return ''
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return current_page.GetPrettyStatus()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def HasPage( self, page ):
|
|
|
|
|
|
|
|
return page in self._GetMediaPages()
|
|
|
|
|
|
|
|
|
|
|
|
def PrepareToHide( self ):
|
|
|
|
|
|
|
|
for page in self._GetPages():
|
|
|
|
|
|
|
|
page.PrepareToHide()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ShowPage( self, showee ):
|
|
|
|
|
|
|
|
for ( i, page ) in enumerate( self._GetPages() ):
|
|
|
|
|
|
|
|
if isinstance( page, wx.Notebook ) and page.HasPage( showee ):
|
|
|
|
|
|
|
|
self.SetSelection( i )
|
|
|
|
|
|
|
|
page.ShowPage( showee )
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
elif page == showee:
|
|
|
|
|
|
|
|
self.SetSelection( i )
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def TestAbleToClose( self ):
|
|
|
|
|
|
|
|
for page in self._GetPages():
|
|
|
|
|
|
|
|
page.TestAbleToClose()
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
class GUISession( HydrusSerialisable.SerialisableBaseNamed ):
|
2013-12-04 22:44:16 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_GUI_SESSION
|
2017-08-02 21:32:54 +00:00
|
|
|
SERIALISABLE_VERSION = 2
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def __init__( self, name ):
|
2013-12-11 22:09:25 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
HydrusSerialisable.SerialisableBaseNamed.__init__( self, name )
|
2013-12-11 22:09:25 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
self._pages = []
|
2013-12-11 22:09:25 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def _GetSerialisableInfo( self ):
|
2015-03-25 22:04:19 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
serialisable_info = []
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
for ( management_controller, hashes ) in self._pages:
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2015-10-14 21:02:25 +00:00
|
|
|
serialisable_management_controller = management_controller.GetSerialisableTuple()
|
2015-06-24 22:10:14 +00:00
|
|
|
|
|
|
|
serialisable_hashes = [ hash.encode( 'hex' ) for hash in hashes ]
|
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
serialisable_info.append( ( serialisable_management_controller, serialisable_hashes ) )
|
2015-06-24 22:10:14 +00:00
|
|
|
|
2013-09-04 16:48:44 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
return serialisable_info
|
2013-09-04 16:48:44 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
|
2013-03-27 20:02:51 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
for ( serialisable_management_controller, serialisable_hashes ) in serialisable_info:
|
2014-01-22 21:11:22 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
management_controller = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_management_controller )
|
2014-01-22 21:11:22 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
hashes = [ hash.decode( 'hex' ) for hash in serialisable_hashes ]
|
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
self._pages.append( ( management_controller, hashes ) )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _UpdateSerialisableInfo( self, version, old_serialisable_info ):
|
|
|
|
|
|
|
|
if version == 1:
|
|
|
|
|
|
|
|
new_serialisable_info = []
|
|
|
|
|
|
|
|
for ( page_name, serialisable_management_controller, serialisable_hashes ) in old_serialisable_info:
|
|
|
|
|
|
|
|
management_controller = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_management_controller )
|
|
|
|
|
|
|
|
management_controller.SetPageName( page_name )
|
|
|
|
|
|
|
|
serialisable_management_controller = management_controller.GetSerialisableTuple()
|
|
|
|
|
|
|
|
new_serialisable_info.append( ( serialisable_management_controller, serialisable_hashes ) )
|
|
|
|
|
|
|
|
|
|
|
|
return ( 2, new_serialisable_info )
|
2014-01-22 21:11:22 +00:00
|
|
|
|
2013-04-24 21:23:53 +00:00
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
def AddPage( self, management_controller, hashes ):
|
2013-11-27 18:27:11 +00:00
|
|
|
|
2017-08-02 21:32:54 +00:00
|
|
|
self._pages.append( ( management_controller, hashes ) )
|
2013-11-27 18:27:11 +00:00
|
|
|
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
def IteratePages( self ):
|
2013-02-19 00:11:43 +00:00
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
for page_tuple in self._pages:
|
|
|
|
|
|
|
|
yield page_tuple
|
|
|
|
|
2013-02-19 00:11:43 +00:00
|
|
|
|
|
|
|
|
2015-06-24 22:10:14 +00:00
|
|
|
HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_GUI_SESSION ] = GUISession
|