Files
linuxcncAllWasm/lib/python/qtvcp/widgets/dialogMixin.py
2026-08-20 06:17:39 +08:00

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