Extract block replacement list to its own widget

This commit is contained in:
David Vierra 2016-02-07 01:20:31 -10:00
parent 14702978f5
commit bfafe53209
7 changed files with 249 additions and 154 deletions

View File

@ -25,6 +25,7 @@ class FindReplaceDialog(QtGui.QDialog, Ui_findReplaceDialog):
self.setupUi(self) self.setupUi(self)
self.findReplaceBlocks = FindReplaceBlocks(editorSession, self) self.findReplaceBlocks = FindReplaceBlocks(editorSession, self)
self.replaceBlocksTab.setLayout(Column(self.findReplaceBlocks.widget, margin=0))
self.findReplaceCommandText = FindReplaceCommandText(editorSession, self) self.findReplaceCommandText = FindReplaceCommandText(editorSession, self)
self.commandBlocksTab.setLayout(Column(self.findReplaceCommandText.widget, margin=0)) self.commandBlocksTab.setLayout(Column(self.findReplaceCommandText.widget, margin=0))

View File

@ -9,6 +9,7 @@ from mcedit2.ui.find_replace_commands import Ui_findCommandsWidget
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class FindReplaceCommandWidget(QtGui.QWidget, Ui_findCommandsWidget): class FindReplaceCommandWidget(QtGui.QWidget, Ui_findCommandsWidget):
def __init__(self): def __init__(self):
super(FindReplaceCommandWidget, self).__init__() super(FindReplaceCommandWidget, self).__init__()

View File

@ -7,6 +7,7 @@ import logging
from PySide import QtCore, QtGui from PySide import QtCore, QtGui
from mcedit2.command import SimpleRevisionCommand from mcedit2.command import SimpleRevisionCommand
from mcedit2.ui.find_replace_blocks import Ui_FindReplaceBlocks
from mcedit2.util.resources import resourcePath from mcedit2.util.resources import resourcePath
from mcedit2.util.showprogress import showProgress from mcedit2.util.showprogress import showProgress
from mcedit2.widgets.blockpicker import BlockTypeButton from mcedit2.widgets.blockpicker import BlockTypeButton
@ -15,104 +16,27 @@ from mcedit2.widgets.layout import Row
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class FindReplaceBlocksWidget(QtGui.QWidget, Ui_FindReplaceBlocks):
def __init__(self):
super(FindReplaceBlocksWidget, self).__init__()
self.setupUi(self)
class FindReplaceBlocks(QtCore.QObject): class FindReplaceBlocks(QtCore.QObject):
def __init__(self, editorSession, dialog, *args, **kwargs): def __init__(self, editorSession, dialog, *args, **kwargs):
super(FindReplaceBlocks, self).__init__(*args, **kwargs) super(FindReplaceBlocks, self).__init__(*args, **kwargs)
self.editorSession = editorSession self.editorSession = editorSession
self.dialog = dialog self.dialog = dialog
header = dialog.findReplaceTable.horizontalHeader() self.widget = FindReplaceBlocksWidget()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.Stretch)
dialog.findReplaceTable.setRowCount(1)
addButton = QtGui.QPushButton("Add...", flat=True, clicked=self.addNewRow)
addButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/add.png")))
addButton.setMinimumHeight(48)
addButton.setIconSize(QtCore.QSize(32, 32))
addItem = QtGui.QTableWidgetItem(text="Add...")
addItem.setSizeHint(addButton.sizeHint())
dialog.findReplaceTable.setItem(0, 0, addItem)
dialog.findReplaceTable.setSpan(0, 0, 1, 2)
dialog.findReplaceTable.setCellWidget(0, 0, addButton)
dialog.findReplaceTable.resizeRowsToContents()
dialog.findReplaceTable.resizeColumnsToContents()
dialog.blocksReplaceButton.clicked.connect(self.doReplace)
@property self.widget.replacementList.editorSession = editorSession
def blocktypes(self): self.widget.blocksReplaceButton.clicked.connect(self.doReplace)
return self.editorSession.worldEditor.blocktypes
def addNewRow(self):
self.addRow([self.blocktypes["air"]], self.blocktypes["air"])
def addRow(self, oldBlocks, newBlock):
row = self.dialog.findReplaceTable.rowCount() - 1
self.dialog.findReplaceTable.insertRow(row)
log.info("Row inserted")
left = QtGui.QTableWidgetItem()
right = QtGui.QTableWidgetItem()
log.info("Items created")
def frameButton(button, withRemove=False):
frame = QtGui.QFrame()
frame.button = button
layout = QtGui.QVBoxLayout()
layout.addStretch(1)
if withRemove:
removeButton = QtGui.QPushButton("", flat=True)
removeButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/remove.png")))
removeButton.setIconSize(QtCore.QSize(24, 24))
def _clicked():
self.removeRow(self.dialog.findReplaceTable.row(left))
removeButton.__clicked = _clicked
removeButton.clicked.connect(_clicked)
layout.addLayout(Row((button, 1), removeButton))
else:
layout.addWidget(button)
layout.addStretch(1)
frame.setLayout(layout)
return frame
leftButton = BlockTypeButton(flat=True, multipleSelect=True)
leftButton.editorSession = self.editorSession
leftButton.blocks = oldBlocks
leftFramedButton = frameButton(leftButton)
left.setSizeHint(leftFramedButton.sizeHint())
log.info("Left button")
rightButton = BlockTypeButton(flat=True)
rightButton.editorSession = self.editorSession
rightButton.block = newBlock
rightFramedButton = frameButton(rightButton, True)
right.setSizeHint(rightFramedButton.sizeHint())
log.info("Right button")
self.dialog.findReplaceTable.setItem(row, 0, left)
self.dialog.findReplaceTable.setItem(row, 1, right)
self.dialog.findReplaceTable.setCellWidget(row, 0, leftFramedButton)
self.dialog.findReplaceTable.setCellWidget(row, 1, rightFramedButton)
self.dialog.findReplaceTable.resizeRowsToContents()
#self.findReplaceTable.resizeColumnsToContents()
log.info("Done")
def removeRow(self, row):
self.dialog.findReplaceTable.removeRow(row)
def getReplacements(self):
def _get():
for row in range(self.dialog.findReplaceTable.rowCount()-1):
left = self.dialog.findReplaceTable.cellWidget(row, 0).button
right = self.dialog.findReplaceTable.cellWidget(row, 1).button
yield left.blocks, right.block
return list(_get())
def doReplace(self): def doReplace(self):
replacements = self.getReplacements() replacements = self.widget.replacementList.getReplacements()
command = SimpleRevisionCommand(self.editorSession, "Replace") command = SimpleRevisionCommand(self.editorSession, "Replace")
if self.dialog.replaceBlocksInSelectionCheckbox.isChecked(): if self.widget.replaceBlocksInSelectionCheckbox.isChecked():
selection = self.editorSession.currentSelection selection = self.editorSession.currentSelection
else: else:
selection = self.editorSession.currentDimension.bounds selection = self.editorSession.currentDimension.bounds

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BlockReplacements</class>
<widget class="QWidget" name="BlockReplacements">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>607</width>
<height>337</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableWidget" name="findReplaceTable">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Old Blocks</string>
</property>
</column>
<column>
<property name="text">
<string>New Blocks</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>768</width> <width>781</width>
<height>369</height> <height>416</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -17,79 +17,17 @@
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>4</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="findBlocksTab"> <widget class="QWidget" name="findBlocksTab">
<attribute name="title"> <attribute name="title">
<string>Find Blocks</string> <string>Find Blocks</string>
</attribute> </attribute>
</widget> </widget>
<widget class="QWidget" name="tab"> <widget class="QWidget" name="replaceBlocksTab">
<attribute name="title"> <attribute name="title">
<string>Replace Blocks</string> <string>Replace Blocks</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTableWidget" name="findReplaceTable">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Old Blocks</string>
</property>
</column>
<column>
<property name="text">
<string>New Blocks</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="replaceBlocksInSelectionCheckbox">
<property name="text">
<string>In Selection</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="blocksReplaceButton">
<property name="text">
<string>Replace</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget> </widget>
<widget class="QWidget" name="itemsTab"> <widget class="QWidget" name="itemsTab">
<attribute name="title"> <attribute name="title">

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FindReplaceBlocks</class>
<widget class="QWidget" name="FindReplaceBlocks">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="BlockReplacementList" name="replacementList" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="replaceBlocksInSelectionCheckbox">
<property name="text">
<string>In Selection</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="blocksReplaceButton">
<property name="text">
<string>Replace</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>BlockReplacementList</class>
<extends>QWidget</extends>
<header>mcedit2/widgets/block_replacement_list.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,111 @@
"""
block_replacements
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
from PySide import QtCore, QtGui
from mcedit2.ui.block_replacements import Ui_BlockReplacements
from mcedit2.util.resources import resourcePath
from mcedit2.widgets.blockpicker import BlockTypeButton
from mcedit2.widgets.layout import Row
log = logging.getLogger(__name__)
class BlockReplacementList(QtGui.QWidget, Ui_BlockReplacements):
def __init__(self, parent):
super(BlockReplacementList, self).__init__(parent)
self.setupUi(self)
header = self.findReplaceTable.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.Stretch)
self.findReplaceTable.setRowCount(1)
addButton = QtGui.QPushButton("Add...", flat=True, clicked=self.addNewRow)
addButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/add.png")))
addButton.setMinimumHeight(48)
addButton.setIconSize(QtCore.QSize(32, 32))
addItem = QtGui.QTableWidgetItem(text="Add...")
addItem.setSizeHint(addButton.sizeHint())
self.findReplaceTable.setItem(0, 0, addItem)
self.findReplaceTable.setSpan(0, 0, 1, 2)
self.findReplaceTable.setCellWidget(0, 0, addButton)
self.findReplaceTable.resizeRowsToContents()
self.findReplaceTable.resizeColumnsToContents()
self.editorSession = None
@property
def blocktypes(self):
return self.editorSession.worldEditor.blocktypes if self.editorSession else None
def addNewRow(self):
self.addRow([self.blocktypes["air"]], self.blocktypes["air"])
def addRow(self, oldBlocks, newBlock):
assert self.editorSession is not None, "Must set BlockReplacementList.editorSession before using"
row = self.findReplaceTable.rowCount() - 1
self.findReplaceTable.insertRow(row)
log.info("Row inserted")
left = QtGui.QTableWidgetItem()
right = QtGui.QTableWidgetItem()
log.info("Items created")
def frameButton(button, withRemove=False):
frame = QtGui.QFrame()
frame.button = button
layout = QtGui.QVBoxLayout()
layout.addStretch(1)
if withRemove:
removeButton = QtGui.QPushButton("", flat=True)
removeButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/remove.png")))
removeButton.setIconSize(QtCore.QSize(24, 24))
def _clicked():
self.removeRow(self.findReplaceTable.row(left))
removeButton.__clicked = _clicked
removeButton.clicked.connect(_clicked)
layout.addLayout(Row((button, 1), removeButton))
else:
layout.addWidget(button)
layout.addStretch(1)
frame.setLayout(layout)
return frame
leftButton = BlockTypeButton(flat=True, multipleSelect=True)
leftButton.editorSession = self.editorSession
leftButton.blocks = oldBlocks
leftFramedButton = frameButton(leftButton)
left.setSizeHint(leftFramedButton.sizeHint())
log.info("Left button")
rightButton = BlockTypeButton(flat=True)
rightButton.editorSession = self.editorSession
rightButton.block = newBlock
rightFramedButton = frameButton(rightButton, True)
right.setSizeHint(rightFramedButton.sizeHint())
log.info("Right button")
self.findReplaceTable.setItem(row, 0, left)
self.findReplaceTable.setItem(row, 1, right)
self.findReplaceTable.setCellWidget(row, 0, leftFramedButton)
self.findReplaceTable.setCellWidget(row, 1, rightFramedButton)
self.findReplaceTable.resizeRowsToContents()
#self.findReplaceTable.resizeColumnsToContents()
log.info("Done")
def removeRow(self, row):
self.findReplaceTable.removeRow(row)
def getReplacements(self):
def _get():
for row in range(self.findReplaceTable.rowCount()-1):
left = self.findReplaceTable.cellWidget(row, 0).button
right = self.findReplaceTable.cellWidget(row, 1).button
yield left.blocks, right.block
return list(_get())