@@ -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+
332383class _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