177 lines
7.8 KiB
Python
177 lines
7.8 KiB
Python
from qtpy.QtWidgets import (QApplication, QMessageBox)
|
|
from qtvcp.widgets.widget_baseclass import _HalWidgetBase
|
|
from qtvcp import logger
|
|
|
|
LOG = logger.getLogger(__name__)
|
|
# Force the log level for this module
|
|
#LOG.setLevel(logger.DEBUG) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
|
|
#########################################
|
|
# geometry helper functions
|
|
#########################################
|
|
|
|
# This general function parses the geometry string and places
|
|
# the dialog based on what it finds.
|
|
# there are directive words allowed.
|
|
# If there are no letters in the string, it will check the
|
|
# preference file (if there is one) to see what the last position
|
|
# was. If all else fails it uses it's natural Designer stated
|
|
# geometry
|
|
class GeometryMixin(_HalWidgetBase):
|
|
def __init__(self, ):
|
|
super(GeometryMixin, self).__init__()
|
|
self._geometry_string = 'default'
|
|
self._default_geometry = None
|
|
|
|
def get_default_geometry(self):
|
|
a,b,c,d = self._default_geometry
|
|
return '%s %s %s %s'% (a,b,c,d)
|
|
|
|
def set_default_geometry(self):
|
|
geom = self.frameGeometry()
|
|
geom.moveCenter(QApplication.primaryScreen().availableGeometry().center())
|
|
self.setGeometry(geom)
|
|
x = self.geometry().x()
|
|
y = self.geometry().y()
|
|
w = 300 #w = self.geometry().width()
|
|
h = 150 #h = self.geometry().height()
|
|
self._default_geometry=[x,y,w,h]
|
|
return x,y,w,h
|
|
|
|
# only valid is dialog has been shown
|
|
def get_current_geometry(self):
|
|
x = self.geometry().x()
|
|
y = self.geometry().y()
|
|
w = self.geometry().width()
|
|
h = self.geometry().height()
|
|
return '%s %s %s %s'% (x,y,w,h)
|
|
|
|
def read_preference_geometry(self,name):
|
|
self._geoName = name
|
|
if self.PREFS_:
|
|
self._geometry_string = self.PREFS_.getpref(name,
|
|
self._geometry_string,
|
|
str, 'DIALOG_GEOMETRY')
|
|
|
|
def set_geometry(self):
|
|
#print(self.objectName(),'set geo',self._geometry_string)
|
|
try:
|
|
if self._geometry_string.replace(' ','').isdigit() and self.PREFS_:
|
|
# If there is a preference file object use it to load the geometry
|
|
self._geometry_string = self.PREFS_.getpref(self._geoName, '', str, 'DIALOG_GEOMETRY')
|
|
|
|
# use the previously calculated default.
|
|
if self._geometry_string in('default',''):
|
|
x,y,w,h = self._default_geometry
|
|
self.setGeometry(x,y,w,h)
|
|
if not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
|
|
# center of desktop
|
|
# add 'always' or the user can reset the dialog
|
|
elif 'center' in self._geometry_string.lower():
|
|
geom = self.frameGeometry()
|
|
geom.moveCenter(QApplication.primaryScreen().availableGeometry().center())
|
|
self.setGeometry(geom)
|
|
if not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
|
|
# bottom left of desktop
|
|
# add 'always' or the user can reset the dialog
|
|
elif 'bottomleft' in self._geometry_string.lower():
|
|
# move to bottom left of parent
|
|
ph = QApplication.primaryScreen().geometry().height()
|
|
px = QApplication.primaryScreen().geometry().x()
|
|
py = QApplication.primaryScreen().geometry().y()
|
|
dw = self.geometry().width()
|
|
dh = self.geometry().height()
|
|
self.setGeometry(px, py+ph-dh, dw, dh)
|
|
if not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
|
|
# to be always on (relative to) parent but as assigned size
|
|
# ie: Dialog-geometry = onwindow 100 100 280 118
|
|
# add 'always' or the user can reset the dialog
|
|
elif 'onwindow' in self._geometry_string.lower():
|
|
# move relative to parent position
|
|
px = self.QTVCP_INSTANCE_.geometry().x()
|
|
py = self.QTVCP_INSTANCE_.geometry().y()
|
|
# remove everything except digits and spaces
|
|
temp=''
|
|
for x in self._geometry_string:
|
|
if (x.isdigit() or x == ' '):
|
|
temp = temp+x
|
|
# remove lead and trailing spaces and then split on spaces
|
|
temp = temp.strip(' ').split(' ')
|
|
self.setGeometry(px+int(temp[0]), py+int(temp[1]), int(temp[2]), int(temp[3]))
|
|
if not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
|
|
# half the main window height/width
|
|
# add 'always' or the user can reset the dialog
|
|
elif 'half' in self._geometry_string.lower():
|
|
h = int(self.QTVCP_INSTANCE_.geometry().height() /2)
|
|
w = int(self.QTVCP_INSTANCE_.geometry().width() /2)
|
|
|
|
x = int(self.geometry().x())
|
|
y = int(self.geometry().y())
|
|
self.setGeometry( x,y,w,h)
|
|
|
|
if not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
|
|
else:
|
|
# assuming geometry is actual size/position
|
|
temp = self._geometry_string.split(' ')
|
|
self.setGeometry(int(temp[0]), int(temp[1]), int(temp[2]), int(temp[3]))
|
|
LOG.debug('Setting {} dialog geometry from {} from prefs.'.format( self._geoName,temp))
|
|
except Exception as e:
|
|
print(e)
|
|
try:
|
|
LOG.error('Calculating geometry of {} widget using: {}. Will use default placement.'.format(self.HAL_NAME_, self._geometry_string))
|
|
except AttributeError as f:
|
|
print(f)
|
|
LOG.debug('Dialog geometry python error: {}'.format(e))
|
|
x = self.geometry().x()
|
|
y = self.geometry().y()
|
|
self.setGeometry( x,y,300,150)
|
|
self._geometry_string = 'default'
|
|
|
|
def record_geometry(self):
|
|
# message box are difficult
|
|
if isinstance(self,QMessageBox):
|
|
if self._geometry_string.replace(' ','').isdigit():
|
|
if self.PREFS_ :
|
|
geometry_string = self.PREFS_.getpref(self._geoName, '', str, 'DIALOG_GEOMETRY')
|
|
else:
|
|
geometry_string = ''
|
|
temp = self._geometry_string.split(' ')
|
|
#print('record:',temp,self.geometry())
|
|
x = self.geometry().x()
|
|
y = self.geometry().y()
|
|
w = int(temp[2])
|
|
h = self.geometry().height()
|
|
geo = '%s %s %s %s'% (x,y,w,h)
|
|
if self.PREFS_ :
|
|
self.PREFS_.putpref(self._geoName, geo, str, 'DIALOG_GEOMETRY')
|
|
return
|
|
try:
|
|
if self.PREFS_ :
|
|
temp = self._geometry_string.replace(' ','')
|
|
temp = temp.strip('-')
|
|
if temp in('','default') or temp.isdigit():
|
|
LOG.debug('Saving {} data from widget {} to file.'.format( self._geoName,self.HAL_NAME_))
|
|
x = self.geometry().x()
|
|
y = self.geometry().y()
|
|
w = self.geometry().width()
|
|
h = self.geometry().height()
|
|
geo = '%s %s %s %s'% (x,y,w,h)
|
|
self.PREFS_.putpref(self._geoName, geo, str, 'DIALOG_GEOMETRY')
|
|
elif not 'always' in self._geometry_string.lower():
|
|
self._geometry_string = self.get_current_geometry()
|
|
except Exception as e:
|
|
print(e)
|
|
pass
|
|
|
|
|