From 986def10adf225e1169e532d583835b537eab493 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Sat, 8 Apr 2023 17:23:24 +0200 Subject: [PATCH 1/2] text entity can have minimum lines count --- openpype/settings/entities/input_entities.py | 2 ++ openpype/settings/entities/schemas/README.md | 1 + 2 files changed, 3 insertions(+) diff --git a/openpype/settings/entities/input_entities.py b/openpype/settings/entities/input_entities.py index 89f12afd9b..adc600bccb 100644 --- a/openpype/settings/entities/input_entities.py +++ b/openpype/settings/entities/input_entities.py @@ -448,6 +448,8 @@ class TextEntity(InputEntity): self.multiline = self.schema_data.get("multiline", False) self.placeholder_text = self.schema_data.get("placeholder") self.value_hints = self.schema_data.get("value_hints") or [] + self.minimum_lines_count = ( + self.schema_data.get("minimum_lines_count") or 0) def schema_validations(self): if self.multiline and self.value_hints: diff --git a/openpype/settings/entities/schemas/README.md b/openpype/settings/entities/schemas/README.md index cff614a4bb..c333628b25 100644 --- a/openpype/settings/entities/schemas/README.md +++ b/openpype/settings/entities/schemas/README.md @@ -380,6 +380,7 @@ How output of the schema could look like on save: - simple text input - key `"multiline"` allows to enter multiple lines of text (Default: `False`) - key `"placeholder"` allows to show text inside input when is empty (Default: `None`) + - key `"minimum_lines_count"` allows to define minimum size hint for UI. Can be 0-n lines. ``` { From e4e6b8dc9ad4ba70d815268f509998648a58a48d Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Sat, 8 Apr 2023 17:24:07 +0200 Subject: [PATCH 2/2] Use minimum lines to affect minimum size hint --- .../tools/settings/settings/item_widgets.py | 10 +++++---- openpype/tools/settings/settings/widgets.py | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index d51f9b9684..117eca7d6b 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -360,14 +360,16 @@ class TextWidget(InputWidget): def _add_inputs_to_layout(self): multiline = self.entity.multiline if multiline: - self.input_field = SettingsPlainTextEdit(self.content_widget) + input_field = SettingsPlainTextEdit(self.content_widget) + if self.entity.minimum_lines_count: + input_field.set_minimum_lines(self.entity.minimum_lines_count) else: - self.input_field = SettingsLineEdit(self.content_widget) - + input_field = SettingsLineEdit(self.content_widget) placeholder_text = self.entity.placeholder_text if placeholder_text: - self.input_field.setPlaceholderText(placeholder_text) + input_field.setPlaceholderText(placeholder_text) + self.input_field = input_field self.setFocusProxy(self.input_field) layout_kwargs = {} diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index fd04cb0a23..08ffaac0a1 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -300,11 +300,32 @@ class SettingsLineEdit(PlaceholderLineEdit): class SettingsPlainTextEdit(QtWidgets.QPlainTextEdit): focused_in = QtCore.Signal() + _min_lines = 0 def focusInEvent(self, event): super(SettingsPlainTextEdit, self).focusInEvent(event) self.focused_in.emit() + def set_minimum_lines(self, lines): + self._min_lines = lines + self.update() + + def minimumSizeHint(self): + result = super(SettingsPlainTextEdit, self).minimumSizeHint() + if self._min_lines < 1: + return result + document = self.document() + margins = self.contentsMargins() + d_margin = ( + ((document.documentMargin() + self.frameWidth()) * 2) + + margins.top() + margins.bottom() + ) + font = document.defaultFont() + font_metrics = QtGui.QFontMetrics(font) + result.setHeight( + d_margin + (font_metrics.lineSpacing() * self._min_lines)) + return result + class SettingsToolBtn(ImageButton): _mask_pixmap = None