hydrus/include/ClientGUIPages.py

216 lines
7.0 KiB
Python
Executable File

import HydrusConstants as HC
import ClientConstants as CC
import ClientGUICommon
import ClientGUIDialogs
import ClientGUIManagement
import ClientGUIMedia
import ClientGUICanvas
import ClientDownloading
import HydrusData
import HydrusSerialisable
import HydrusThreading
import inspect
import os
import sys
import time
import traceback
import wx
import ClientData
import HydrusGlobals
class Page( wx.SplitterWindow ):
def __init__( self, parent, management_controller, initial_media_results ):
wx.SplitterWindow.__init__( self, parent )
self._page_key = HydrusData.GenerateKey()
self._management_controller = management_controller
self._management_controller.SetKey( 'page', self._page_key )
self._pretty_status = ''
self.SetMinimumPaneSize( 120 )
self.SetSashGravity( 0.0 )
self.Bind( wx.EVT_SPLITTER_DCLICK, self.EventUnsplit )
self._search_preview_split = wx.SplitterWindow( self, style=wx.SP_NOBORDER )
self._search_preview_split.SetMinimumPaneSize( 180 )
self._search_preview_split.SetSashGravity( 1.0 )
self._search_preview_split.Bind( wx.EVT_SPLITTER_DCLICK, self.EventPreviewUnsplit )
self._management_panel = ClientGUIManagement.CreateManagementPanel( self._search_preview_split, self, self._management_controller )
file_service_key = self._management_controller.GetKey( 'file_service' )
self._preview_panel = ClientGUICanvas.CanvasPanel( self._search_preview_split, self._page_key )
self._media_panel = ClientGUIMedia.MediaPanelThumbnails( self, self._page_key, file_service_key, initial_media_results )
self.SplitVertically( self._search_preview_split, self._media_panel, HC.options[ 'hpos' ] )
wx.CallAfter( self._search_preview_split.SplitHorizontally, self._management_panel, self._preview_panel, HC.options[ 'vpos' ] )
HydrusGlobals.controller.sub( self, 'SetPrettyStatus', 'new_page_status' )
HydrusGlobals.controller.sub( self, 'SwapMediaPanel', 'swap_media_panel' )
def CleanBeforeDestroy( self ): self._management_panel.CleanBeforeDestroy()
def EventPreviewUnsplit( self, event ): self._search_preview_split.Unsplit( self._preview_panel )
def EventUnsplit( self, event ): self.Unsplit( self._search_preview_split )
def GetManagementController( self ):
return self._management_controller
# used by autocomplete
def GetMedia( self ):
return self._media_panel.GetSortedMedia()
def GetPrettyStatus( self ):
return self._pretty_status
def GetSashPositions( self ):
if self.IsSplit(): x = self.GetSashPosition()
else: x = HC.options[ 'hpos' ]
if self._search_preview_split.IsSplit(): y = -1 * self._preview_panel.GetSize()[1]
else: y = HC.options[ 'vpos' ]
return ( x, y )
def PageHidden( self ): HydrusGlobals.controller.pub( 'page_hidden', self._page_key )
def PageShown( self ): HydrusGlobals.controller.pub( 'page_shown', self._page_key )
def Pause( self ):
HydrusGlobals.controller.pub( 'pause', self._page_key )
HydrusGlobals.controller.pub( 'set_focus', self._page_key, None )
def RefreshQuery( self ): HydrusGlobals.controller.pub( 'refresh_query', self._page_key )
def Resume( self ):
HydrusGlobals.controller.pub( 'resume', self._page_key )
def ShowHideSplit( self ):
if self.IsSplit():
self.Unsplit( self._search_preview_split )
else:
self.SplitVertically( self._search_preview_split, self._media_panel, HC.options[ 'hpos' ] )
self._search_preview_split.SplitHorizontally( self._management_panel, self._preview_panel, HC.options[ 'vpos' ] )
def SetMediaFocus( self ): self._media_panel.SetFocus()
def SetPrettyStatus( self, page_key, status ):
if page_key == self._page_key:
self._pretty_status = status
HydrusGlobals.controller.pub( 'refresh_status' )
def SetSearchFocus( self ): HydrusGlobals.controller.pub( 'set_search_focus', self._page_key )
def SetSynchronisedWait( self ): HydrusGlobals.controller.pub( 'synchronised_wait_switch', self._page_key )
def SwapMediaPanel( self, page_key, new_panel ):
if page_key == self._page_key:
self._preview_panel.SetMedia( None )
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
def TestAbleToClose( self ): self._management_panel.TestAbleToClose()
class GUISession( HydrusSerialisable.SerialisableBaseNamed ):
SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_GUI_SESSION
SERIALISABLE_VERSION = 1
def __init__( self, name ):
HydrusSerialisable.SerialisableBaseNamed.__init__( self, name )
self._pages = []
def _GetSerialisableInfo( self ):
serialisable_info = []
for ( page_name, management_controller, hashes ) in self._pages:
serialisable_management_controller = HydrusSerialisable.GetSerialisableTuple( management_controller )
serialisable_hashes = [ hash.encode( 'hex' ) for hash in hashes ]
serialisable_info.append( ( page_name, serialisable_management_controller, serialisable_hashes ) )
return serialisable_info
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
for ( page_name, serialisable_management_controller, serialisable_hashes ) in serialisable_info:
management_controller = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_management_controller )
hashes = [ hash.decode( 'hex' ) for hash in serialisable_hashes ]
self._pages.append( ( page_name, management_controller, hashes ) )
def AddPage( self, page_name, management_controller, hashes ):
self._pages.append( ( page_name, management_controller, hashes ) )
def IteratePages( self ):
for page_tuple in self._pages:
yield page_tuple
HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_GUI_SESSION ] = GUISession