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
import logging
from PySide import QtGui
from PySide import QtGui, QtCore
import numpy
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.showprogress import showProgress
from mcedit2.util.worldloader import WorldLoader
from mcedit2.widgets.layout import Row
from mceditlib.geometry import Vector
from mceditlib.selection import ShapedSelection, BoundingBox
from mceditlib.util import exhaust
@ -246,7 +247,6 @@ class FakeBrushChunk(object):
return section
class BrushTool(EditorTool):
name = "Brush"
iconName = "brush"
@ -259,13 +259,13 @@ class BrushTool(EditorTool):
self.cursorWorldScene = None
self.cursorNode = scenegraph.TranslateNode()
self.toolWidget.xSpinBox.valueChanged.connect(self.setX)
self.toolWidget.ySpinBox.valueChanged.connect(self.setY)
self.toolWidget.zSpinBox.valueChanged.connect(self.setZ)
self.toolWidget.xSpinSlider.setMinimum(1)
self.toolWidget.ySpinSlider.setMinimum(1)
self.toolWidget.zSpinSlider.setMinimum(1)
self.toolWidget.xSlider.valueChanged.connect(self.setX)
self.toolWidget.ySlider.valueChanged.connect(self.setY)
self.toolWidget.zSlider.valueChanged.connect(self.setZ)
self.toolWidget.xSpinSlider.valueChanged.connect(self.setX)
self.toolWidget.ySpinSlider.valueChanged.connect(self.setY)
self.toolWidget.zSpinSlider.valueChanged.connect(self.setZ)
self.toolWidget.blockTypeInput.editorSession = editorSession
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.toolWidget.xSpinBox.setValue(self.brushSize[0])
self.toolWidget.ySpinBox.setValue(self.brushSize[1])
self.toolWidget.zSpinBox.setValue(self.brushSize[2])
self.toolWidget.xSpinSlider.setValue(self.brushSize[0])
self.toolWidget.ySpinSlider.setValue(self.brushSize[1])
self.toolWidget.zSpinSlider.setValue(self.brushSize[2])
_brushSize = (0, 0, 0)
@property
@ -296,22 +296,16 @@ class BrushTool(EditorTool):
x, y, z = self.brushSize
x = float(val)
self.brushSize = x, y, z
self.toolWidget.xSlider.setValue(val)
self.toolWidget.xSpinBox.setValue(val)
def setY(self, val):
x, y, z = self.brushSize
y = float(val)
self.brushSize = x, y, z
self.toolWidget.ySlider.setValue(val)
self.toolWidget.ySpinBox.setValue(val)
def setZ(self, val):
x, y, z = self.brushSize
z = float(val)
self.brushSize = x, y, z
self.toolWidget.zSlider.setValue(val)
self.toolWidget.zSpinBox.setValue(val)
def setBlocktypes(self, types):
if len(types) == 0:

View File

@ -16,6 +16,16 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<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">
<widget class="QLabel" name="label_5">
<property name="text">
@ -24,7 +34,14 @@
</widget>
</item>
<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 row="4" column="0">
<widget class="QLabel" name="label_2">
@ -33,38 +50,6 @@
</property>
</widget>
</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">
<widget class="QLabel" name="label_3">
<property name="text">
@ -72,29 +57,6 @@
</property>
</widget>
</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">
<widget class="QLabel" name="label_4">
<property name="text">
@ -102,26 +64,13 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="zSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</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>
<item row="7" column="1" colspan="2">
<widget class="SpinSlider" name="hoverSpinSlider" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
@ -132,29 +81,6 @@
</property>
</widget>
</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">
<widget class="QLabel" name="label_6">
<property name="text">
@ -165,8 +91,8 @@
<item row="8" column="1" colspan="2">
<widget class="BlockTypeButton" name="blockTypeInput" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
@ -181,6 +107,12 @@
</item>
<item row="1" column="0" colspan="3">
<widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
@ -208,6 +140,12 @@
</property>
<item>
<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">
<size>
<width>40</width>
@ -220,17 +158,40 @@
</widget>
</widget>
</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>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
@ -253,6 +214,12 @@
<header>blocktypebutton.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>SpinSlider</class>
<extends>QWidget</extends>
<header>spinslider.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<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)