hydrus/hydrus/client/gui/ClientGUITopLevelWindowsPan...

272 lines
7.5 KiB
Python

from qtpy import QtWidgets as QW
from hydrus.core import HydrusConstants as HC
from hydrus.core import HydrusExceptions
from hydrus.client import ClientConstants as CC
from hydrus.client.gui import ClientGUIDialogsMessage
from hydrus.client.gui import ClientGUIScrolledPanels
from hydrus.client.gui import ClientGUIShortcuts
from hydrus.client.gui import ClientGUITopLevelWindows
from hydrus.client.gui import QtPorting as QP
class DialogThatTakesScrollablePanel( ClientGUITopLevelWindows.DialogThatResizes ):
def __init__( self, parent, title, frame_key = 'regular_dialog', hide_buttons = False, do_not_activate = False ):
self._panel = None
self._hide_buttons = hide_buttons
ClientGUITopLevelWindows.DialogThatResizes.__init__( self, parent, title, frame_key, do_not_activate = do_not_activate )
self._InitialiseButtons()
def _GetButtonBox( self ):
raise NotImplementedError()
def _InitialiseButtons( self ):
raise NotImplementedError()
def _UserIsOKToClose( self, value ):
if value == QW.QDialog.Accepted:
return self._panel.UserIsOKToOK()
else:
return self._panel.UserIsOKToCancel()
def CleanBeforeDestroy( self ):
ClientGUITopLevelWindows.DialogThatResizes.CleanBeforeDestroy( self )
if hasattr( self._panel, 'CleanBeforeDestroy' ):
self._panel.CleanBeforeDestroy()
def SetPanel( self, panel: ClientGUIScrolledPanels.ResizingScrolledPanel ):
self._panel = panel
if hasattr( self._panel, 'okSignal'): self._panel.okSignal.connect( self.DoOK )
buttonbox = self._GetButtonBox()
vbox = QP.VBoxLayout()
QP.AddToLayout( vbox, self._panel, CC.FLAGS_EXPAND_BOTH_WAYS )
if buttonbox is not None:
QP.AddToLayout( vbox, buttonbox, CC.FLAGS_ON_RIGHT )
self.setLayout( vbox )
ClientGUITopLevelWindows.SetInitialTLWSizeAndPosition( self, self._frame_key )
class DialogNullipotent( DialogThatTakesScrollablePanel ):
def _GetButtonBox( self ):
buttonbox = QP.HBoxLayout()
QP.AddToLayout( buttonbox, self._close )
return buttonbox
def _InitialiseButtons( self ):
self._close = QW.QPushButton( 'close', self )
self._close.clicked.connect( self.DoOK )
if self._hide_buttons:
self._close.setVisible( False )
class DialogApplyCancel( DialogThatTakesScrollablePanel ):
def _GetButtonBox( self ):
buttonbox = QP.HBoxLayout()
QP.AddToLayout( buttonbox, self._apply )
QP.AddToLayout( buttonbox, self._cancel )
return buttonbox
def _InitialiseButtons( self ):
self._apply = QW.QPushButton( 'apply', self )
self._apply.setObjectName( 'HydrusAccept' )
self._apply.clicked.connect( self.EventDialogButtonApply )
self._cancel = QW.QPushButton( 'cancel', self )
self._cancel.setObjectName( 'HydrusCancel' )
self._cancel.clicked.connect( self.EventDialogButtonCancel )
if self._hide_buttons:
self._apply.setVisible( False )
self._cancel.setVisible( False )
def _TestValidityAndPresentVetoMessage( self, value ):
if value != QW.QDialog.Accepted:
return True
try:
value = self._panel.CheckValid()
return True
except HydrusExceptions.VetoException as e:
message = str( e )
if len( message ) > 0:
ClientGUIDialogsMessage.ShowWarning( self, message )
return False
class DialogEdit( DialogApplyCancel ):
def __init__( self, parent, title, frame_key = 'regular_dialog', hide_buttons = False ):
DialogApplyCancel.__init__( self, parent, title, frame_key = frame_key, hide_buttons = hide_buttons )
class DialogManage( DialogApplyCancel ):
def _DoClose( self, value ):
if value == QW.QDialog.Accepted:
try:
self._panel.CommitChanges()
except HydrusExceptions.VetoException as e:
message = str( e )
if len( message ) > 0:
ClientGUIDialogsMessage.ShowWarning( self, message )
class DialogCustomButtonQuestion( DialogThatTakesScrollablePanel ):
def __init__( self, parent, title, frame_key = 'regular_center_dialog' ):
DialogThatTakesScrollablePanel.__init__( self, parent, title, frame_key = frame_key )
def _GetButtonBox( self ):
return None
def _InitialiseButtons( self ):
pass
class FrameThatTakesScrollablePanel( ClientGUITopLevelWindows.FrameThatResizes ):
def __init__( self, parent, title, frame_key = 'regular_dialog' ):
self._panel = None
ClientGUITopLevelWindows.FrameThatResizes.__init__( self, parent, title, frame_key )
self._ok = QW.QPushButton( 'close', self )
self._ok.clicked.connect( self.close )
def CleanBeforeDestroy( self ):
ClientGUITopLevelWindows.FrameThatResizes.CleanBeforeDestroy( self )
if hasattr( self._panel, 'CleanBeforeDestroy' ):
self._panel.CleanBeforeDestroy()
def keyPressEvent( self, event ):
shortcut = ClientGUIShortcuts.ConvertKeyEventToShortcut( event )
escape_shortcut = ClientGUIShortcuts.Shortcut( ClientGUIShortcuts.SHORTCUT_TYPE_KEYBOARD_SPECIAL, ClientGUIShortcuts.SHORTCUT_KEY_SPECIAL_ESCAPE, ClientGUIShortcuts.SHORTCUT_PRESS_TYPE_PRESS, [] )
command_w_shortcut = ClientGUIShortcuts.Shortcut( ClientGUIShortcuts.SHORTCUT_TYPE_KEYBOARD_CHARACTER, ord( 'W' ), ClientGUIShortcuts.SHORTCUT_PRESS_TYPE_PRESS, [ ClientGUIShortcuts.SHORTCUT_MODIFIER_CTRL ] )
if shortcut == escape_shortcut or ( HC.PLATFORM_MACOS and shortcut == command_w_shortcut ):
self.close()
else:
event.ignore()
def GetPanel( self ):
return self._panel
def SetPanel( self, panel ):
self._panel = panel
if hasattr( self._panel, 'okSignal' ):
self._panel.okSignal.connect( self.close )
vbox = QP.VBoxLayout()
QP.AddToLayout( vbox, self._panel, CC.FLAGS_EXPAND_BOTH_WAYS )
QP.AddToLayout( vbox, self._ok, CC.FLAGS_ON_RIGHT )
self.setLayout( vbox )
ClientGUITopLevelWindows.SetInitialTLWSizeAndPosition( self, self._frame_key )
self.show()