1515 NODE_PROP_VECTOR3 ,
1616 NODE_PROP_VECTOR4 ,
1717 NODE_PROP_FLOAT ,
18- NODE_PROP_INT )
18+ NODE_PROP_INT ,
19+ NODE_PROP_BUTTON )
1920from NodeGraphQt .widgets .file_dialog import file_dialog
2021
2122
@@ -333,6 +334,7 @@ class _valueMenu(QtWidgets.QMenu):
333334
334335 mouseMove = QtCore .Signal (object )
335336 mouseRelease = QtCore .Signal (object )
337+ stepChange = QtCore .Signal ()
336338
337339 def __init__ (self , parent = None ):
338340 super (_valueMenu , self ).__init__ (parent )
@@ -357,6 +359,8 @@ def mouseMoveEvent(self, event):
357359
358360 action = self .actionAt (event .pos ())
359361 if action :
362+ if action is not self .last_action :
363+ self .stepChange .emit ()
360364 self .last_action = action
361365 self .step = action .step
362366 elif self .last_action :
@@ -389,16 +393,17 @@ def __init__(self, parent=None):
389393 self ._data_type = float
390394 self .setText ("0" )
391395
392- self .pre_x = 0
396+ self .pre_x = None
397+ self .pre_val = None
393398 self ._step = 1
394- self ._tmp_value = 0
395399 self ._speed = 0.1
396400
397401 self .textChanged .connect (self ._on_text_changed )
398402
399403 self .menu = _valueMenu ()
400404 self .menu .mouseMove .connect (self .mouseMoveEvent )
401405 self .menu .mouseRelease .connect (self .mouseReleaseEvent )
406+ self .menu .stepChange .connect (self ._reset )
402407 steps = [0.001 , 0.01 , 0.1 , 1 , 10 , 100 , 1000 ]
403408 self .menu .set_steps (steps )
404409
@@ -407,25 +412,26 @@ def __init__(self, parent=None):
407412 def _on_text_changed (self , value ):
408413 self .valueChanged .emit (self .value ())
409414
415+ def _reset (self ):
416+ self .pre_x = None
417+
410418 def mouseMoveEvent (self , event ):
411419 if self .mid_state :
412420 if self .pre_x is None :
413421 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
422+ self .pre_val = self .value ( )
423+ else :
424+ self .set_step ( self .menu . step )
425+ delta = event . x () - self .pre_x
426+ value = self .pre_val + int ( delta * self . _speed ) * self ._step
419427 self .setValue (value )
420- self ._tmp_value = 0
421- self .pre_x = event .x ()
428+
422429 super (_valueEdit ,self ).mouseMoveEvent (event )
423430
424431 def mousePressEvent (self , event ):
425432 if event .button () == QtCore .Qt .MiddleButton :
426433 self .mid_state = True
427- self .pre_x = None
428- self ._tmp_value = 0
434+ self ._reset ()
429435 self .menu .exec_ (QtGui .QCursor .pos ())
430436 super (_valueEdit ,self ).mousePressEvent (event )
431437
@@ -448,8 +454,10 @@ def set_data_type(self, dt):
448454 def _convert_text (self ,text ):
449455 # int("1.0") will return error
450456 # so we use int(float("1.0"))
451-
452- value = float (text )
457+ try :
458+ value = float (text )
459+ except :
460+ value = 0.0
453461 if self ._data_type is int :
454462 value = int (value )
455463 return value
@@ -506,14 +514,13 @@ def __init__(self, parent=None):
506514 self ._lock = False
507515
508516 def _on_edit_changed (self ,value ):
509- if self ._lock :
510- return
511- self ._lock = True
512517 self ._set_slider_value (value )
513518 self .valueChanged .emit (self ._edit .value ())
514- self ._lock = False
515519
516520 def _on_slider_changed (self ,value ):
521+ if self ._lock :
522+ self ._lock = False
523+ return
517524 value = value / float (self ._mul )
518525 self ._edit .setValue (value )
519526
@@ -522,7 +529,7 @@ def _set_slider_value(self,value):
522529
523530 if value == self ._slider .value ():
524531 return
525-
532+ self . _lock = True
526533 _min = self ._slider .minimum ()
527534 _max = self ._slider .maximum ()
528535 if _min <= value <= _max :
@@ -532,6 +539,7 @@ def _set_slider_value(self,value):
532539 elif value > _max and self ._slider .value () != _max :
533540 self ._slider .setValue (_max )
534541
542+
535543 def set_min (self , value = 0 ):
536544 self ._slider .setMinimum (int (value * self ._mul ))
537545
@@ -656,6 +664,21 @@ def __init__(self, parent=None):
656664 self .set_data_type (int )
657665
658666
667+ class PropButton (QtWidgets .QPushButton ):
668+ value_changed = QtCore .Signal (str , object )
669+
670+ def __init__ (self , parent = None ):
671+ super (PropButton , self ).__init__ (parent )
672+
673+ def set_value (self , value ):
674+ # value: list of functions
675+ for func in value :
676+ self .clicked .connect (func )
677+
678+ def get_value (self ):
679+ return None
680+
681+
659682WIDGET_MAP = {
660683 NODE_PROP_QLABEL : PropLabel ,
661684 NODE_PROP_QLINEEDIT : PropLineEdit ,
@@ -671,6 +694,7 @@ def __init__(self, parent=None):
671694 NODE_PROP_VECTOR4 : PropVector4 ,
672695 NODE_PROP_FLOAT : PropFloat ,
673696 NODE_PROP_INT : PropInt ,
697+ NODE_PROP_BUTTON : PropButton
674698}
675699
676700
@@ -710,11 +734,14 @@ def add_widget(self, name, widget, value, label=None):
710734 if row > 0 :
711735 row += 1
712736
737+ label = QtWidgets .QLabel (label )
713738 label_flags = QtCore .Qt .AlignCenter | QtCore .Qt .AlignRight
714739 if widget .__class__ .__name__ == 'PropTextEdit' :
715740 label_flags = label_flags | QtCore .Qt .AlignTop
716-
717- self .__layout .addWidget (QtWidgets .QLabel (label ), row , 0 , label_flags )
741+ elif widget .__class__ .__name__ == 'PropButton' :
742+ label .setVisible (False )
743+ widget .setText (name )
744+ self .__layout .addWidget (label , row , 0 , label_flags )
718745 self .__layout .addWidget (widget , row , 1 )
719746
720747 def get_widget (self , name ):
0 commit comments