Library panel now shows a list of the current session's maps, for dragging and dropping

This commit is contained in:
David Vierra 2015-07-11 11:34:59 -10:00
parent 844049b0d4
commit 31aec2a932
3 changed files with 159 additions and 12 deletions

View File

@ -152,6 +152,7 @@ class MCEditApp(QtGui.QApplication):
mainWindow.addDockWidget(Qt.RightDockWidgetArea, self.libraryDockWidget)
mainWindow.panelsToolBar.addAction(self.libraryDockWidget.toggleViewAction())
self.libraryDockWidget.close()
self.sessionChanged.connect(self.libraryWidget.sessionDidChange)
self.libraryWidget.doubleClicked.connect(self.libraryItemDoubleClicked)

View File

@ -5,41 +5,87 @@ from __future__ import absolute_import, division, print_function
import logging
import os
from PySide import QtGui, QtCore
from PySide.QtCore import Qt
from mcedit2.panels.map import MapListModel
from mcedit2.util.directories import getUserSchematicsDirectory
from mcedit2.util.load_ui import load_ui
from mcedit2.util.mimeformats import MimeFormats
from mcedit2.widgets.layout import Column
from mceditlib.util.lazyprop import weakrefprop
log = logging.getLogger(__name__)
class LibraryTreeModel(QtGui.QFileSystemModel):
class LibraryMapListModel(MapListModel):
def flags(self, index):
return super(LibraryMapListModel, self).flags(index) | Qt.ItemIsDragEnabled
def mimeData(self, indices):
mimeData = QtCore.QMimeData()
mapItemData = ", ".join(str(index.data(self.MapIDRole)) for index in indices)
mimeData.setData(MimeFormats.MapItem,
mapItemData)
return mimeData
class LibrarySchematicsTreeModel(QtGui.QFileSystemModel):
def columnCount(self, *args, **kwargs):
return 1
def mimeData(self, indices):
mimeData = QtCore.QMimeData()
mimeData.setUrls([QtCore.QUrl.fromLocalFile(self.filePath(index)) for index in indices])
return mimeData
def mimeTypes(self, indices):
return ["text/uri-list"]
class LibraryWidget(QtGui.QWidget):
editorSession = weakrefprop()
def __init__(self):
super(LibraryWidget, self).__init__()
load_ui("library.ui", baseinstance=self)
self.folderPath = getUserSchematicsDirectory()
if not os.path.exists(self.folderPath):
os.makedirs(self.folderPath)
self.treeView = QtGui.QTreeView()
self.model = LibraryTreeModel()
self.model.setRootPath(self.folderPath)
self.treeView.setModel(self.model)
self.treeView.setRootIndex(self.model.index(self.folderPath))
self.schematicsModel = LibrarySchematicsTreeModel()
self.schematicsModel.setRootPath(self.folderPath)
self.schematicsTreeView.setModel(self.schematicsModel)
self.schematicsTreeView.setRootIndex(self.schematicsModel.index(self.folderPath))
self.treeView.doubleClicked.connect(self.itemDoubleClicked)
self.schematicsTreeView.doubleClicked.connect(self.itemDoubleClicked)
openLibraryButton = QtGui.QPushButton("Open Schematics Folder")
openLibraryButton.clicked.connect(self.openFolder)
self.mapListModel = None
self.editorSession = None
self.setLayout(Column(self.treeView, openLibraryButton))
self.openLibraryButton.clicked.connect(self.openFolder)
def openFolder(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(self.folderPath))
def itemDoubleClicked(self, index):
filename = self.model.filePath(index)
filename = self.schematicsModel.filePath(index)
self.doubleClicked.emit(filename)
doubleClicked = QtCore.Signal(str)
doubleClicked = QtCore.Signal(unicode)
def sessionDidChange(self, session):
self.editorSession = session
if session is None:
self.mapListView.setModel(None)
self.mapListModel = None
else:
self.mapListModel = LibraryMapListModel(session)
self.mapListView.setModel(self.mapListModel)
session.revisionChanged.connect(self.revisionDidChange)
def revisionDidChange(self, revisionChanges):
# xxxx inspect revisionChanges! in fact, create AnvilRevisionChanges so
# we don't have to match `data/map_\d+.dat`!!
session = self.editorSession
if session:
self.mapListModel = LibraryMapListModel(session)
self.mapListView.setModel(self.mapListModel)

100
src/mcedit2/ui/library.ui Normal file
View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>617</width>
<height>646</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="schematicsTab">
<attribute name="title">
<string>Schematics</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeView" name="schematicsTreeView">
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<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="QPushButton" name="openLibraryButton">
<property name="text">
<string>Open Schematics Folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="mapsTab">
<attribute name="title">
<string>Maps</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QListView" name="mapListView">
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
<property name="movement">
<enum>QListView::Snap</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="viewMode">
<enum>QListView::IconMode</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="customBlocksTab">
<attribute name="title">
<string>Custom Blocks</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>