Combine a spin box and a slider into a SpinSlider widget. Use it in the brush tool.

This commit is contained in:
David Vierra 2015-01-22 15:05:11 -10:00
parent 07cdd46816
commit 97d94530c1
3 changed files with 154 additions and 125 deletions

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import, division, print_function, unicode_literals
import logging import logging
from PySide import QtGui from PySide import QtGui, QtCore
import numpy import numpy
from mcedit2.editortools import EditorTool from mcedit2.editortools import EditorTool
@ -15,6 +15,7 @@ from mcedit2.util.load_ui import load_ui, registerCustomWidget
from mcedit2.util.settings import Settings from mcedit2.util.settings import Settings
from mcedit2.util.showprogress import showProgress from mcedit2.util.showprogress import showProgress
from mcedit2.util.worldloader import WorldLoader from mcedit2.util.worldloader import WorldLoader
from mcedit2.widgets.layout import Row
from mceditlib.geometry import Vector from mceditlib.geometry import Vector
from mceditlib.selection import ShapedSelection, BoundingBox from mceditlib.selection import ShapedSelection, BoundingBox
from mceditlib.util import exhaust from mceditlib.util import exhaust
@ -246,7 +247,6 @@ class FakeBrushChunk(object):
return section return section
class BrushTool(EditorTool): class BrushTool(EditorTool):
name = "Brush" name = "Brush"
iconName = "brush" iconName = "brush"
@ -259,13 +259,13 @@ class BrushTool(EditorTool):
self.cursorWorldScene = None self.cursorWorldScene = None
self.cursorNode = scenegraph.TranslateNode() self.cursorNode = scenegraph.TranslateNode()
self.toolWidget.xSpinBox.valueChanged.connect(self.setX) self.toolWidget.xSpinSlider.setMinimum(1)
self.toolWidget.ySpinBox.valueChanged.connect(self.setY) self.toolWidget.ySpinSlider.setMinimum(1)
self.toolWidget.zSpinBox.valueChanged.connect(self.setZ) self.toolWidget.zSpinSlider.setMinimum(1)
self.toolWidget.xSlider.valueChanged.connect(self.setX) self.toolWidget.xSpinSlider.valueChanged.connect(self.setX)
self.toolWidget.ySlider.valueChanged.connect(self.setY) self.toolWidget.ySpinSlider.valueChanged.connect(self.setY)
self.toolWidget.zSlider.valueChanged.connect(self.setZ) self.toolWidget.zSpinSlider.valueChanged.connect(self.setZ)
self.toolWidget.blockTypeInput.editorSession = editorSession self.toolWidget.blockTypeInput.editorSession = editorSession
self.toolWidget.blockTypeInput.block = editorSession.worldEditor.blocktypes["minecraft:stone"] self.toolWidget.blockTypeInput.block = editorSession.worldEditor.blocktypes["minecraft:stone"]
@ -277,9 +277,9 @@ class BrushTool(EditorTool):
self.brushSize = BrushSizeSetting.value(QtGui.QVector3D(5, 5, 5)).toTuple() # calls updateCursor self.brushSize = BrushSizeSetting.value(QtGui.QVector3D(5, 5, 5)).toTuple() # calls updateCursor
self.toolWidget.xSpinBox.setValue(self.brushSize[0]) self.toolWidget.xSpinSlider.setValue(self.brushSize[0])
self.toolWidget.ySpinBox.setValue(self.brushSize[1]) self.toolWidget.ySpinSlider.setValue(self.brushSize[1])
self.toolWidget.zSpinBox.setValue(self.brushSize[2]) self.toolWidget.zSpinSlider.setValue(self.brushSize[2])
_brushSize = (0, 0, 0) _brushSize = (0, 0, 0)
@property @property
@ -296,22 +296,16 @@ class BrushTool(EditorTool):
x, y, z = self.brushSize x, y, z = self.brushSize
x = float(val) x = float(val)
self.brushSize = x, y, z self.brushSize = x, y, z
self.toolWidget.xSlider.setValue(val)
self.toolWidget.xSpinBox.setValue(val)
def setY(self, val): def setY(self, val):
x, y, z = self.brushSize x, y, z = self.brushSize
y = float(val) y = float(val)
self.brushSize = x, y, z self.brushSize = x, y, z
self.toolWidget.ySlider.setValue(val)
self.toolWidget.ySpinBox.setValue(val)
def setZ(self, val): def setZ(self, val):
x, y, z = self.brushSize x, y, z = self.brushSize
z = float(val) z = float(val)
self.brushSize = x, y, z self.brushSize = x, y, z
self.toolWidget.zSlider.setValue(val)
self.toolWidget.zSpinBox.setValue(val)
def setBlocktypes(self, types): def setBlocktypes(self, types):
if len(types) == 0: if len(types) == 0:

View File

@ -16,6 +16,16 @@
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0,0"> <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0,0">
<item row="4" column="1" colspan="2">
<widget class="SpinSlider" name="xSpinSlider" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
@ -24,7 +34,14 @@
</widget> </widget>
</item> </item>
<item row="2" column="1" colspan="2"> <item row="2" column="1" colspan="2">
<widget class="BrushModeWidget" name="brushModeInput" native="true"/> <widget class="BrushModeWidget" name="brushModeInput" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
@ -33,38 +50,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1">
<widget class="QSpinBox" name="xSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QSlider" name="xSlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>80</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="invertedControls">
<bool>false</bool>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
</widget>
</item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
@ -72,29 +57,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1">
<widget class="QSpinBox" name="ySpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QSlider" name="ySlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>80</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
@ -102,26 +64,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="1"> <item row="7" column="1" colspan="2">
<widget class="QSpinBox" name="zSpinBox"> <widget class="SpinSlider" name="hoverSpinSlider" native="true">
<property name="minimum"> <property name="sizePolicy">
<number>1</number> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
</property> <horstretch>0</horstretch>
<property name="maximum"> <verstretch>0</verstretch>
<number>1024</number> </sizepolicy>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QSlider" name="zSlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>80</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
@ -132,29 +81,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1">
<widget class="QSpinBox" name="hoverSpinBox">
<property name="minimum">
<number>-1024</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QSlider" name="hoverSlider">
<property name="minimum">
<number>-80</number>
</property>
<property name="maximum">
<number>80</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="8" column="0"> <item row="8" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
@ -165,8 +91,8 @@
<item row="8" column="1" colspan="2"> <item row="8" column="1" colspan="2">
<widget class="BlockTypeButton" name="blockTypeInput" native="true"> <widget class="BlockTypeButton" name="blockTypeInput" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>1</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
@ -181,6 +107,12 @@
</item> </item>
<item row="1" column="0" colspan="3"> <item row="1" column="0" colspan="3">
<widget class="QScrollArea" name="scrollArea"> <widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
@ -208,6 +140,12 @@
</property> </property>
<item> <item>
<widget class="ShapeWidget" name="brushShapeInput" native="true"> <widget class="ShapeWidget" name="brushShapeInput" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>40</width> <width>40</width>
@ -220,17 +158,40 @@
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="5" column="1" colspan="2">
<widget class="SpinSlider" name="ySpinSlider" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2">
<widget class="SpinSlider" name="zSpinSlider" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QWidget" name="widget" native="true"> <spacer name="verticalSpacer">
<property name="sizePolicy"> <property name="orientation">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding"> <enum>Qt::Vertical</enum>
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property> </property>
</widget> <property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -253,6 +214,12 @@
<header>blocktypebutton.h</header> <header>blocktypebutton.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>SpinSlider</class>
<extends>QWidget</extends>
<header>spinslider.h</header>
<container>1</container>
</customwidget>
</customwidgets> </customwidgets>
<resources> <resources>
<include location="../mcedit2.qrc"/> <include location="../mcedit2.qrc"/>

View File

@ -0,0 +1,68 @@
"""
spinslider
"""
from __future__ import absolute_import, division, print_function
import logging
from PySide import QtGui, QtCore
from PySide.QtCore import Qt
from mcedit2.util.load_ui import registerCustomWidget
from mcedit2.widgets.layout import Row
log = logging.getLogger(__name__)
@registerCustomWidget
class SpinSlider(QtGui.QWidget):
def __init__(self, *args, **kwargs):
super(SpinSlider, self).__init__(*args, **kwargs)
self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
self.spinBox = QtGui.QSpinBox()
self.slider = QtGui.QSlider()
self.slider.setOrientation(Qt.Horizontal)
self._value = 0
self._minimum = -(2 << 31)
self._maximum = (2 << 31) - 1
self.spinBox.valueChanged.connect(self.spinBoxChanged)
self.slider.valueChanged.connect(self.sliderChanged)
self.setLayout(Row(self.spinBox, self.slider, margin=0))
def spinBoxChanged(self, value):
self._value = value
self.slider.setValue(value)
self.valueChanged.emit(value)
def sliderChanged(self, value):
self._value = value
self.spinBox.setValue(value)
self.valueChanged.emit(value)
def value(self):
return self._value
def setValue(self, value):
self._value = value
self.spinBox.setValue(value)
self.slider.setValue(value)
def minimum(self):
return self._minimum
def setMinimum(self, value):
self._minimum = value
self.slider.setMinimum(value)
self.spinBox.setMinimum(value)
def maximum(self):
return self._maximum
def setMaximum(self, value):
self._maximum = value
self.slider.setMaximum(value)
self.spinBox.setMaximum(value)
valueChanged = QtCore.Signal(float)