Skip to content

Commit bbfbe0b

Browse files
committed
- This is a breaking implementation of the Values System v2
- [Editor] Stub code for the value connect button change in the details panel / deprecation of the old 'global_checkbox' code - [Editor] Input entries now have the 'SetDefaultValue' function which the handler invokes when neither 'value' nor 'default' keys are present in the data. This forces a minimum such as 0 or 'None' - [Editor] Cleaned up working and type annotations in the input entry handler to be clear on which functions are generalized for all item views, and which are explicitly for tree view only
1 parent c230c7c commit bbfbe0b

5 files changed

Lines changed: 165 additions & 31 deletions

File tree

HBEditor/Core/EditorCommon/DetailsPanel/details_panel.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def __init__(self, excluded_properties: list = None):
5151
self.details_tree = QtWidgets.QTreeWidget(self)
5252
self.details_tree.setObjectName("no-top")
5353
self.details_tree.setColumnCount(3)
54-
self.details_tree.setHeaderLabels(['Name', 'Input', 'G'])
54+
self.details_tree.setHeaderLabels(['Name', 'Input', 'C'])
5555
self.details_tree.setAutoScroll(False)
5656
self.details_tree.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
5757
self.details_tree.header().setStretchLastSection(False) # Disable to allow custom sizing
@@ -61,7 +61,7 @@ def __init__(self, excluded_properties: list = None):
6161
self.details_tree.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
6262
self.details_tree.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
6363

64-
# --- Specialized Settings for the 'G' column ---
64+
# --- Specialized Settings for the 'C' column ---
6565
# 1. Allow columns to be significantly smaller than normal
6666
self.details_tree.header().setMinimumSectionSize(round(self.details_tree.header().width() / 4))
6767

@@ -139,9 +139,9 @@ def ConnectSignals(self, tree_item):
139139
input_widget = self.details_tree.itemWidget(tree_item, 1)
140140
input_widget.SIG_USER_UPDATE.connect(self.UserUpdatedInputWidget)
141141

142-
global_checkbox = self.details_tree.itemWidget(tree_item, 2)
143-
if global_checkbox:
144-
global_checkbox.SIG_USER_UPDATE.connect(self.UserClickedGlobalCheckbox)
142+
#global_checkbox = self.details_tree.itemWidget(tree_item, 2)
143+
#if global_checkbox:
144+
# global_checkbox.SIG_USER_UPDATE.connect(self.UserClickedGlobalCheckbox)
145145

146146
def StoreData(self, parent: QtWidgets.QTreeWidgetItem = None) -> dict:
147147
"""
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from PyQt6 import QtWidgets, QtCore
2+
3+
4+
class ConnectButton(QtWidgets.QToolButton):
5+
def __init__(self, parent = None):
6+
super().__init__(parent)
7+
print("Spawned Connect Button")
8+
9+
self.clicked.connect(self.ShowConnectionDialog)
10+
11+
def ShowConnectionDialog(self):
12+
dialog = ConnectionDialog()
13+
dialog.exec()
14+
15+
class ConnectionDialog(QtWidgets.QDialog):
16+
def __init__(self):
17+
super().__init__()
18+
19+
# Hide the OS header to lock its position
20+
self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint)
21+
self.resize(640, 480)
22+
self.main_layout = QtWidgets.QTabBar(self)
23+
24+
self.value_tab = QtWidgets.QTabWidget()
25+
26+
self.project_setting_tab = QtWidgets.QTabWidget()
27+
self.main_layout
28+
29+
30+
31+
# Confirmation Buttons
32+
self.button_box = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok | QtWidgets.QDialogButtonBox.StandardButton.Cancel)
33+
self.button_box.accepted.connect(self.accept)
34+
self.button_box.rejected.connect(self.reject)
35+
self.main_layout.addWidget(self.button_box)

HBEditor/Core/EditorValues/editor_values_ui.py

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"""
1515
from PyQt6 import QtWidgets, QtGui, QtCore
1616
from HBEditor.Core.base_editor_ui import EditorBaseUI
17-
from HBEditor.Core.Primitives.input_entries import InputEntryText
17+
from HBEditor.Core.DataTypes.parameter_types import ParameterType
18+
from HBEditor.Core.Primitives.input_entries import InputEntryText, InputEntryDropdown
1819
from HBEditor.Core.Primitives import input_entry_handler as ieh
1920
from HBEditor.Core import settings
2021

@@ -23,6 +24,25 @@ class EditorValuesUI(EditorBaseUI):
2324
def __init__(self, core_ref):
2425
super().__init__(core_ref)
2526

27+
# Limit what editing types are usable as some (such as Array or Event) are complex and would require
28+
# additional work to allow user control
29+
self.possible_input_types = [
30+
ParameterType.String,
31+
ParameterType.Bool,
32+
ParameterType.Int,
33+
ParameterType.Float,
34+
ParameterType.Vector2,
35+
ParameterType.Paragraph,
36+
ParameterType.Color,
37+
ParameterType.Asset_Scene,
38+
ParameterType.Asset_Dialogue,
39+
ParameterType.Asset_Data,
40+
ParameterType.Asset_Interface,
41+
ParameterType.Asset_Font,
42+
ParameterType.Asset_Image,
43+
ParameterType.Asset_Sound
44+
]
45+
2646
# Build the core editor layout object
2747
self.main_layout = QtWidgets.QHBoxLayout(self)
2848
self.main_layout.setContentsMargins(0, 0, 0, 0)
@@ -51,17 +71,21 @@ def __init__(self, core_ref):
5171
# Main Table
5272
self.values_table = QtWidgets.QTableWidget(self)
5373
self.values_table.setObjectName('values-table')
54-
self.values_table.setColumnCount(2)
74+
self.values_table.setColumnCount(3)
5575
self.values_table.verticalHeader().hide()
56-
self.values_table.setHorizontalHeaderLabels(['Name', 'Value'])
76+
self.values_table.setHorizontalHeaderLabels(['Type', 'Name', 'Value'])
5777
self.values_table.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeMode.Interactive)
58-
self.values_table.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeMode.Stretch)
78+
self.values_table.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeMode.Interactive)
79+
self.values_table.horizontalHeader().setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeMode.Stretch)
5980
self.values_table.setAlternatingRowColors(True)
6081
self.values_table.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection)
6182
self.values_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) # Disable the selection outline
6283
self.values_table.setSortingEnabled(True)
63-
# TODO: Investigate how to improve the sizing for the first col. It should be a percentage of the available space
84+
85+
# TODO: Investigate how to improve sizing calculations. It should be a percentage of the available space
6486
self.values_table.horizontalHeader().setDefaultSectionSize(self.values_table.horizontalHeader().defaultSectionSize() * 3)
87+
self.values_table.setColumnWidth(0, round(self.values_table.horizontalHeader().defaultSectionSize() / 2))
88+
6589
self.values_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.DoubleClicked | QtWidgets.QAbstractItemView.EditTrigger.SelectedClicked)
6690
values_delegate = ValuesItemDelegate(self)
6791
self.values_table.setItemDelegate(values_delegate)
@@ -70,18 +94,47 @@ def __init__(self, core_ref):
7094

7195
def AddValue(self, data: tuple = None):
7296
self.values_table.insertRow(self.values_table.rowCount())
97+
98+
# Populate the row with items
7399
self.values_table.setItem(self.values_table.rowCount() - 1, 0, QtWidgets.QTableWidgetItem())
74100
self.values_table.setItem(self.values_table.rowCount() - 1, 1, QtWidgets.QTableWidgetItem())
75-
self.values_table.resizeRowsToContents()
101+
self.values_table.setItem(self.values_table.rowCount() - 1, 2, QtWidgets.QTableWidgetItem())
102+
103+
# Add the type dropdown
104+
#type_input = InputEntryDropdown({"options": [param_type.name for param_type in self.possible_input_types]})
105+
type_input = ieh.Create(
106+
owner=self,
107+
name="",
108+
data={"type": "Dropdown", "options": [param_type.name for param_type in self.possible_input_types]},
109+
owning_model_item=self.values_table.item(self.values_table.rowCount() - 1, 2),
110+
owning_view=self.values_table
111+
)[1]
112+
type_input.SIG_USER_UPDATE.connect(self.SwitchInputType)
113+
self.values_table.setCellWidget(self.values_table.rowCount() - 1, 0, type_input)
114+
self.SwitchInputType(self.values_table.item(self.values_table.rowCount() - 1, 0))
76115

77116
# Load data if provided
78117
if data:
79118
row = self.values_table.rowCount() - 1
80119
self.values_table.item(row, 0).setData(0, data[0])
81120
self.values_table.item(row, 1).setData(0, data[1])
121+
self.values_table.item(row, 2).setData(0, data[2])
82122

123+
self.values_table.resizeRowsToContents()
83124
self.SIG_USER_UPDATE.emit()
84125

126+
def SwitchInputType(self, table_item: QtWidgets.QTableWidgetItem):
127+
""" Creates and replaces the input entry type for the provided item s"""
128+
row = self.values_table.row(table_item)
129+
input_entry = ieh.Create(
130+
owner=self,
131+
name="",
132+
data={"type": self.values_table.cellWidget(row, 0).Get()['value']},
133+
owning_model_item=self.values_table.item(row, 2),
134+
owning_view=self.values_table
135+
)[1]
136+
self.values_table.setCellWidget(row, 2, input_entry)
137+
85138
def RemoveValue(self):
86139
selected_rows = self.values_table.selectedIndexes()
87140
if selected_rows:

HBEditor/Core/Primitives/input_entries.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ def Disconnect(self):
6969
def SetEditable(self, state: int):
7070
pass
7171

72+
def SetDefaultValue(self):
73+
pass
74+
7275

7376
class InputEntryBool(InputEntryBase):
7477
def __init__(self, data):
@@ -97,10 +100,14 @@ def SetEditable(self, state: int):
97100

98101
self.input_widget.style().polish(self.input_widget)
99102

103+
def SetDefaultValue(self):
104+
self.data['value'] = False
105+
100106

101107
class InputEntryColor(InputEntryBase):
102108
def __init__(self, data):
103109
super().__init__(data)
110+
104111
self.input_widget = QtWidgets.QFrame()
105112
self.input_widget.setFrameStyle(QtWidgets.QFrame.Shape.Panel)
106113
self.input_widget.setStyleSheet("border: 1px solid rgb(122,122,122);background-color: rgb(255,255,255)")
@@ -137,6 +144,9 @@ def SetEditable(self, state: int):
137144

138145
self.input_widget.style().polish(self.input_widget)
139146

147+
def SetDefaultValue(self):
148+
self.data['value'] = [255, 255, 255]
149+
140150
def OpenColorPrompt(self):
141151
color_choice = QtWidgets.QColorDialog().getColor(
142152
QtGui.QColor(self.data['value'][0], self.data['value'][1], self.data['value'][2])
@@ -160,7 +170,7 @@ def __init__(self, data):
160170
self.input_widget = QtWidgets.QComboBox()
161171
self.options = data["options"]
162172

163-
# Pre-load the list of dropdown options
173+
# Preload the list of dropdown options
164174
for option in self.options:
165175
self.input_widget.addItem(str(option))
166176

@@ -187,6 +197,10 @@ def SetEditable(self, state: int):
187197

188198
self.input_widget.style().polish(self.input_widget)
189199

200+
def SetDefaultValue(self):
201+
self.data['value'] = self.options[0]
202+
self.Set(self.data['value'])
203+
190204

191205
class InputEntryAssetSelector(InputEntryBase):
192206
def __init__(self, data: dict, details_panel: object, type_filter: set):
@@ -233,6 +247,10 @@ def SetEditable(self, state: int):
233247

234248
self.input_widget.style().polish(self.input_widget)
235249

250+
def SetDefaultValue(self):
251+
self.data['value'] = 'None'
252+
self.Set(self.data['value'])
253+
236254
def OpenAssetPrompt(self):
237255
"""
238256
Prompts the user with the AssetBrowser, allowing them to select an asset matching the type
@@ -283,6 +301,9 @@ def SetEditable(self, state: int):
283301

284302
self.input_widget.style().polish(self.input_widget)
285303

304+
def SetDefaultValue(self):
305+
self.data['value'] = 0.0
306+
self.Set(self.data['value'])
286307

287308
class InputEntryInt(InputEntryBase):
288309
def __init__(self, data):
@@ -324,6 +345,10 @@ def SetEditable(self, state: int):
324345

325346
self.input_widget.style().polish(self.input_widget)
326347

348+
def SetDefaultValue(self):
349+
self.data['value'] = 0
350+
self.Set(self.data['value'])
351+
327352

328353
class InputEntryParagraph(InputEntryBase):
329354
def __init__(self,data):
@@ -354,6 +379,10 @@ def SetEditable(self, state: int):
354379
elif state == 2:
355380
self.input_widget.setReadOnly(True)
356381

382+
def SetDefaultValue(self):
383+
self.data['value'] = ''
384+
self.Set(self.data['value'])
385+
357386

358387
class InputEntryText(InputEntryBase):
359388
def __init__(self, data):
@@ -381,6 +410,10 @@ def SetEditable(self, state: int):
381410

382411
self.input_widget.style().polish(self.input_widget)
383412

413+
def SetDefaultValue(self):
414+
self.data['value'] = ''
415+
self.Set(self.data['value'])
416+
384417

385418
class InputEntryTuple(InputEntryBase):
386419
def __init__(self, data):
@@ -394,7 +427,7 @@ def __init__(self, data):
394427
self.input_widget_alt = QtWidgets.QLineEdit()
395428

396429
# Limit entered values to int only
397-
validator = QtGui.QDoubleValidator(-2, 2, 8, notation=QtGui.QDoubleValidator.Notation.StandardNotation)
430+
validator = QtGui.QDoubleValidator(notation=QtGui.QDoubleValidator.Notation.StandardNotation)
398431
self.input_widget.setValidator(validator)
399432
self.input_widget_alt.setValidator(validator)
400433
self.input_widget.setText("0")
@@ -448,6 +481,10 @@ def SetEditable(self, state: int):
448481
self.input_widget.style().polish(self.input_widget)
449482
self.input_widget_alt.style().polish(self.input_widget_alt)
450483

484+
def SetDefaultValue(self):
485+
self.data['value'] = (0,0)
486+
self.Set(self.data['value'])
487+
451488

452489
class InputEntryArray(InputEntryBase):
453490
"""

HBEditor/Core/Primitives/input_entry_handler.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from HBEditor.Core.Primitives.simple_checkbox import SimpleCheckbox
1717
from HBEditor.Core.DataTypes.parameter_types import ParameterType
1818
from HBEditor.Core.DataTypes.file_types import FileType
19+
from HBEditor.Core.EditorCommon.connect_button import ConnectButton
1920
from HBEditor.Core.Primitives.input_entries import *
2021

2122

@@ -38,7 +39,7 @@ def Add(owner: QWidget, name: str, data: dict, view: QtWidgets.QTreeView,
3839
else:
3940
view.addTopLevelItem(entry)
4041

41-
name_widget, input_widget, global_checkbox = Create(
42+
name_widget, input_widget, connect_button = Create(
4243
owner, name, data, entry, view, signal_func, excluded_properties
4344
)
4445
view.setItemWidget(entry, 0, name_widget)
@@ -50,14 +51,14 @@ def Add(owner: QWidget, name: str, data: dict, view: QtWidgets.QTreeView,
5051
return entry
5152

5253

53-
def Create(owner: QWidget, name: str, data: dict, owning_model_item: QTreeWidgetItem,
54+
def Create(owner: QWidget, name: str, data: dict, owning_model_item,
5455
owning_view: QtWidgets.QAbstractItemView, signal_func: callable = None,
55-
excluded_properties: dict = None) -> object:
56+
excluded_properties: dict = None) -> tuple:
5657
"""
5758
Creates and returns each element of an InputEntry:
5859
- QLabel (Name)
5960
- InputEntry
60-
- Global Checkbox (SimpleCheckbox)
61+
- ConnectButton (Value / Project Setting Connection Button)
6162
"""
6263
# @TODO: Replace with a switch when the Python version is upgraded to allow it (3.10)
6364
data_type = ParameterType[data["type"]]
@@ -110,34 +111,42 @@ def Create(owner: QWidget, name: str, data: dict, owning_model_item: QTreeWidget
110111
input_widget.owning_model_item = owning_model_item
111112
input_widget.Connect()
112113

113-
# Update the entry with the value key if applicable. Otherwise, use the default value
114+
# Update the entry with the value key if applicable. Otherwise, use the default value. If no default is available,
115+
# let the entry load its own default
114116
if "value" in data:
115117
input_widget.Set(data["value"])
116118
elif "default" in data:
117119
data["value"] = data["default"]
118120
input_widget.Set(data["value"])
121+
else:
122+
input_widget.SetDefaultValue()
119123

120124
name_widget = QLabel(name)
121125

122126
# The global checkbox isn't universally used, so only use it if relevant. If it's enabled, mark
123127
# the input widget as uneditable by the user
124-
global_checkbox = None
128+
connect_button = None
125129
if "global" in data and "flags" in data:
126-
global_checkbox = SimpleCheckbox()
127-
global_checkbox.owner = owning_model_item
128-
global_checkbox.setToolTip("Whether to use the global value specified in the project file for this entry")
129-
owning_view.setItemWidget(owning_model_item, 2, global_checkbox)
130-
if "global_active" in data["flags"]:
131-
global_checkbox.Set(True)
132-
input_widget.SetEditable(2)
133-
else:
134-
global_checkbox.Set(False)
135-
global_checkbox.Connect()
130+
connect_button = ConnectButton()
131+
owning_view.setItemWidget(owning_model_item, 2, connect_button)
132+
133+
134+
# global_checkbox = SimpleCheckbox()
135+
# global_checkbox.owner = owning_model_item
136+
# global_checkbox.setToolTip("Whether to use the global value specified in the project file for this entry")
137+
# owning_view.setItemWidget(owning_model_item, 2, global_checkbox)
138+
# if "global_active" in data["flags"]:
139+
# global_checkbox.Set(True)
140+
# input_widget.SetEditable(2)
141+
# else:
142+
# global_checkbox.Set(False)
143+
# global_checkbox.Connect()
136144

137-
return name_widget, input_widget, global_checkbox
145+
return name_widget, input_widget, connect_button
138146

139147

140-
def Remove(item: QTreeWidgetItem, owning_view: QtWidgets.QAbstractItemView = None):
148+
def Remove(item: QTreeWidgetItem, owning_view: QtWidgets.QTreeView = None):
149+
""" Removes the provided item and all of its children from the provided QTreeView"""
141150
parent = item.parent()
142151
if parent:
143152
parent.removeChild(item)

0 commit comments

Comments
 (0)