Skip to content

Commit f8e53e8

Browse files
committed
add new value edit menu
1 parent d52ba54 commit f8e53e8

File tree

2 files changed

+79
-7
lines changed

2 files changed

+79
-7
lines changed

NodeGraphQt/widgets/node_widgets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ def widget(self):
296296
@property
297297
def value(self):
298298
"""
299-
Returns the widgets current text.
299+
Returns the widgets current value.
300300
301301
Returns:
302302
float: current value.

NodeGraphQt/widgets/properties.py

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -329,37 +329,108 @@ def set_value(self, value):
329329
self._on_value_change(_value)
330330

331331

332+
class _valueMenu(QtWidgets.QMenu):
333+
334+
mouseMove = QtCore.Signal(object)
335+
mouseRelease = QtCore.Signal(object)
336+
337+
def __init__(self, parent=None):
338+
super(_valueMenu, self).__init__(parent)
339+
self.step = 1
340+
self.last_action = None
341+
self.steps = []
342+
343+
def set_steps(self,steps):
344+
self.clear()
345+
self.steps = steps
346+
for step in steps:
347+
self._add_action(step)
348+
349+
def _add_action(self,step):
350+
action = QtWidgets.QAction(str(step), self)
351+
action.step = step
352+
self.addAction(action)
353+
354+
def mouseMoveEvent(self, event):
355+
self.mouseMove.emit(event)
356+
super(_valueMenu, self).mouseMoveEvent(event)
357+
358+
action = self.actionAt(event.pos())
359+
if action:
360+
self.last_action = action
361+
self.step = action.step
362+
elif self.last_action:
363+
self.setActiveAction(self.last_action)
364+
365+
def mousePressEvent(self, event):
366+
return
367+
368+
def mouseReleaseEvent(self, event):
369+
self.mouseRelease.emit(event)
370+
super(_valueMenu, self).mouseReleaseEvent(event)
371+
372+
def set_data_type(self,dt):
373+
if dt is int:
374+
new_steps = []
375+
for step in self.steps:
376+
if "." not in str(step):
377+
new_steps.append(step)
378+
self.set_steps(new_steps)
379+
elif dt is float:
380+
self.set_steps(self.steps)
381+
382+
332383
class _valueEdit(QtWidgets.QLineEdit):
333384
valueChanged = QtCore.Signal(object)
334385

335386
def __init__(self, parent=None):
336387
super(_valueEdit, self).__init__(parent)
337388
self.mid_state = False
338-
self.pre_x = 0
339-
self._step = 1
340389
self.setValue(0)
341390
self._data_type = float
342-
self.textChanged.connect(self._on_value_changed)
391+
392+
self.pre_x = 0
393+
self._step = 1
343394
self._last_value = 0
395+
self._tmp_value = 0
396+
self._speed = 0.1
397+
398+
self.textChanged.connect(self._on_value_changed)
399+
400+
self.menu = _valueMenu()
401+
self.menu.mouseMove.connect(self.mouseMoveEvent)
402+
self.menu.mouseRelease.connect(self.mouseReleaseEvent)
403+
steps = [0.001,0.01,0.1,1,10,100,1000]
404+
self.menu.set_steps(steps)
344405

345406
def _on_value_changed(self, text):
346407
self.valueChanged.emit(self.value())
347408
self._last_value = text
348409

349410
def mouseMoveEvent(self, event):
350411
if self.mid_state:
351-
delta = event.x() - self.pre_x
352-
self.setValue(self.value() + delta * self._step)
412+
if self.pre_x is None:
413+
self.pre_x = event.x()
414+
self.set_step(self.menu.step)
415+
delta = (event.x() - self.pre_x)
416+
self._tmp_value += delta * self._speed * self._step
417+
if abs(self._tmp_value) > self._step:
418+
value = self.value() + delta * self._step
419+
self.setValue(value)
420+
self._tmp_value = 0
353421
self.pre_x = event.x()
354422
super(_valueEdit,self).mouseMoveEvent(event)
355423

356424
def mousePressEvent(self, event):
357425
if event.button() == QtCore.Qt.MiddleButton:
358426
self.mid_state = True
359-
self.pre_x = event.x()
427+
self.pre_x = None
428+
self._tmp_value = 0
429+
self.menu.exec_(QtGui.QCursor.pos())
360430
super(_valueEdit,self).mousePressEvent(event)
361431

362432
def mouseReleaseEvent(self, event):
433+
self.menu.close()
363434
self.mid_state = False
364435
super(_valueEdit,self).mouseReleaseEvent(event)
365436

@@ -372,6 +443,7 @@ def set_data_type(self, dt):
372443
elif dt is float:
373444
self.setValidator(QtGui.QDoubleValidator())
374445
self._data_type = dt
446+
self.menu.set_data_type(dt)
375447

376448
def value(self):
377449
if self.text().startswith("."):

0 commit comments

Comments
 (0)