예제 #1
0
def get_widget_by_type(obj):
	if type(obj) == int:
		widget = QSpinBox()
		widget.setRange(INT_RANGE_MIN, INT_RANGE_MAX)
		widget.setSingleStep(INT_RANGE_STEP)
		widget.setValue(obj)
		widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)

	elif type(obj) == float:
		widget = QDoubleSpinBox()
		widget.setRange(FLOAT_RANGE_MIN, FLOAT_RANGE_MAX)
		widget.setSingleStep(FLOAT_RANGE_STEP)
		widget.setValue(obj)
		widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)

	elif type(obj) == str:
		widget = QLineEdit()
		widget.setText(obj)

	elif type(obj) == bool:
		widget = QCheckBox()
		widget.setChecked(obj)

	elif type(obj) == list:
		widget = QComboBox()
		widget.addItems(obj)
		widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)

	elif type(obj) == tuple:
		widget = QFrame()

		if len(obj) <= 3:
			box = QHBoxLayout()
		else:
			box = QVBoxLayout()
		box.setMargin(0)

		for item in obj:
			value_widget = QLabel(f"{item}")
			value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
			value_widget.setObjectName("tuple")

			box.addWidget(value_widget)

		widget.setLayout(box)

	elif type(obj) == dict:
		widget = QFrame()

		# If less than 3 items, lay it out horizontally else vertically
		# if len(obj) <= 3:
		# 	box = QHBoxLayout()
		# else:
		# 	box = QVBoxLayout()
		# box.setMargin(0)

		grid = QGridLayout()
		grid.setMargin(0)

		row = 0
		for key in obj:
			label = QLabel(f"{key.capitalize()}:")
			grid.addWidget(label, row, 0)
			
			value_widget = get_widget_by_type(obj[key])
			value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
			grid.addWidget(value_widget, row, 1)

			try:
				value_widget.setRange(INT_RANGE_MIN, INT_RANGE_MAX)
				value_widget.setSingleStep(INT_RANGE_STEP)
				value_widget.setValue(obj[key])
			except:
				pass

			row += 1

		widget.setLayout(grid)

	# TODO: Lists inside of lists. Should probably use QTreeView
	# elif type(obj) == list:
	# 	widget = []
	# 	for l in obj:
	# 		widget.append(QComboBox())
	# 		widget[-1].addItems(obj)
	# 		widget[-1].setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
	
	return widget