Source code for guiqwt.widgets.resizedialog
# -*- coding: utf-8 -*-
#
# Copyright © 2009-2012 CEA
# Pierre Raybaut
# Licensed under the terms of the CECILL License
# (see guiqwt/__init__.py for details)
"""
resizedialog
------------
The `resizedialog` module provides a dialog box providing essential GUI
for entering parameters needed to resize an image:
:py:class:`guiqwt.widgets.resizedialog.ResizeDialog`.
Reference
~~~~~~~~~
.. autoclass:: ResizeDialog
:members:
:inherited-members:
"""
from qtpy.QtWidgets import (
QDialog,
QDialogButtonBox,
QVBoxLayout,
QLabel,
QFormLayout,
QLineEdit,
QCheckBox,
)
from qtpy.QtGui import QIntValidator
from qtpy.QtCore import Qt
from guidata.qthelpers import win32_fix_title_bar_background
from guiqwt.config import _
def is_edit_valid(edit):
text = edit.text()
state = edit.validator().validate(text, 0)
if isinstance(state, (tuple, list)):
state = state[0]
return state == QIntValidator.Acceptable
[docs]class ResizeDialog(QDialog):
def __init__(self, parent, new_size, old_size, text="", keep_original_size=False):
QDialog.__init__(self, parent)
win32_fix_title_bar_background(self)
intfunc = lambda tup: [int(val) for val in tup]
if intfunc(new_size) == intfunc(old_size):
self.keep_original_size = True
else:
self.keep_original_size = keep_original_size
self.width, self.height = new_size
self.old_width, self.old_height = old_size
self.ratio = self.width / self.height
layout = QVBoxLayout()
self.setLayout(layout)
formlayout = QFormLayout()
layout.addLayout(formlayout)
if text:
label = QLabel(text)
label.setAlignment(Qt.AlignHCenter)
formlayout.addRow(label)
self.w_edit = w_edit = QLineEdit(self)
w_valid = QIntValidator(w_edit)
w_valid.setBottom(1)
w_edit.setValidator(w_valid)
self.h_edit = h_edit = QLineEdit(self)
h_valid = QIntValidator(h_edit)
h_valid.setBottom(1)
h_edit.setValidator(h_valid)
zbox = QCheckBox(_("Original size"), self)
formlayout.addRow(_("Width (pixels)"), w_edit)
formlayout.addRow(_("Height (pixels)"), h_edit)
formlayout.addRow("", zbox)
formlayout.addRow(_("Original size:"), QLabel("%d x %d" % old_size))
self.z_label = QLabel()
formlayout.addRow(_("Zoom factor:"), self.z_label)
# Button box
self.bbox = bbox = QDialogButtonBox(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel
)
bbox.accepted.connect(self.accept)
bbox.rejected.connect(self.reject)
layout.addWidget(bbox)
self.w_edit.setText(str(self.width))
self.h_edit.setText(str(self.height))
self.update_widgets()
self.setWindowTitle(_("Resize"))
w_edit.textChanged.connect(self.width_changed)
h_edit.textChanged.connect(self.height_changed)
zbox.toggled.connect(self.toggled_no_zoom)
zbox.setChecked(self.keep_original_size)
def update_widgets(self):
valid = True
for edit in (self.w_edit, self.h_edit):
if not is_edit_valid(edit):
valid = False
self.bbox.button(QDialogButtonBox.Ok).setEnabled(valid)
self.z_label.setText("%d %s" % (100 * self.width / self.old_width, "%"))
def width_changed(self, text):
if is_edit_valid(self.sender()):
self.width = int(text)
self.height = int(self.width / self.ratio)
self.h_edit.blockSignals(True)
self.h_edit.setText(str(self.height))
self.h_edit.blockSignals(False)
self.update_widgets()
def height_changed(self, text):
if is_edit_valid(self.sender()):
self.height = int(text)
self.width = int(self.ratio * self.height)
self.w_edit.blockSignals(True)
self.w_edit.setText(str(self.width))
self.w_edit.blockSignals(False)
self.update_widgets()
def toggled_no_zoom(self, state):
self.keep_original_size = state
if state:
self.z_label.setText("100 %")
self.bbox.button(QDialogButtonBox.Ok).setEnabled(True)
else:
self.update_widgets()
for widget in (self.w_edit, self.h_edit):
widget.setDisabled(state)
def get_zoom(self):
if self.keep_original_size:
return 1
elif self.width > self.height:
return self.width / self.old_width
else:
return self.height / self.old_height
if __name__ == "__main__":
import guidata
qapp = guidata.qapplication()
test = ResizeDialog(None, (150, 100), (300, 200), "Enter the new size:")
if test.exec_():
print(test.width)
print(test.get_zoom())