Add filter to UI
|
@ -26,28 +26,144 @@
|
|||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QTreeView" name="mapList">
|
||||
<widget class="QWidget" name="mapListContainer" native="true">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectItems</enum>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QToolButton" name="toolButton_MapSortOrder">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/sort_alphabet.ico</normaloff>:/icons/sort_alphabet.ico</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="popupMode">
|
||||
<enum>QToolButton::MenuButtonPopup</enum>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
<enum>Qt::ToolButtonIconOnly</enum>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="arrowType">
|
||||
<enum>Qt::NoArrow</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Preferred</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_filterBox">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Filter maps...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeView" name="mapList">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectItems</enum>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="enabled">
|
||||
|
@ -73,7 +189,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<attribute name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/map.ico</normaloff>:/icons/map.ico</iconset>
|
||||
</attribute>
|
||||
<attribute name="title">
|
||||
|
@ -177,7 +293,7 @@
|
|||
<string>Paint</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/pencil.ico</normaloff>:/icons/pencil.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -203,7 +319,7 @@
|
|||
<string>Select</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/cursor.ico</normaloff>:/icons/cursor.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -220,7 +336,7 @@
|
|||
<string>Fill</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/fill_color.ico</normaloff>:/icons/fill_color.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -237,7 +353,7 @@
|
|||
<string>Dropper</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/pipette.ico</normaloff>:/icons/pipette.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -254,7 +370,7 @@
|
|||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/move.ico</normaloff>:/icons/move.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -271,7 +387,7 @@
|
|||
<string>Shift</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/shift.ico</normaloff>:/icons/shift.ico</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -1355,7 +1471,7 @@
|
|||
<string>New Object</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/add.ico</normaloff>:/icons/add.ico</iconset>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
|
@ -1384,7 +1500,7 @@
|
|||
<string>Delete</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="resources/images.qrc">
|
||||
<iconset resource="../resources/images.qrc">
|
||||
<normaloff>:/icons/delete.ico</normaloff>:/icons/delete.ico</iconset>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
|
@ -2295,7 +2411,7 @@
|
|||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="resources/images.qrc"/>
|
||||
<include location="../resources/images.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
17
include/core/filterchildrenproxymodel.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef FILTERCHILDRENPROXYMODEL_H
|
||||
#define FILTERCHILDRENPROXYMODEL_H
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
class FilterChildrenProxyModel : public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FilterChildrenProxyModel(QObject *parent = nullptr);
|
||||
protected:
|
||||
bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const;
|
||||
|
||||
};
|
||||
|
||||
#endif // FILTERCHILDRENPROXYMODEL_H
|
|
@ -130,6 +130,7 @@ private:
|
|||
QMap<QString, QModelIndex> mapListIndexes;
|
||||
Editor *editor = nullptr;
|
||||
QIcon* mapIcon;
|
||||
QIcon* mapEditedIcon;
|
||||
void setMap(QString, bool scrollTreeView = false);
|
||||
void redrawMapScene();
|
||||
void loadDataStructures();
|
||||
|
|
|
@ -17,6 +17,7 @@ ICON = resources/icons/porymap-icon-1.ico
|
|||
SOURCES += src/core/block.cpp \
|
||||
src/core/blockdata.cpp \
|
||||
src/core/event.cpp \
|
||||
src/core/filterchildrenproxymodel.cpp \
|
||||
src/core/heallocation.cpp \
|
||||
src/core/historyitem.cpp \
|
||||
src/core/map.cpp \
|
||||
|
@ -50,6 +51,7 @@ SOURCES += src/core/block.cpp \
|
|||
HEADERS += include/core/block.h \
|
||||
include/core/blockdata.h \
|
||||
include/core/event.h \
|
||||
include/core/filterchildrenproxymodel.h \
|
||||
include/core/heallocation.h \
|
||||
include/core/history.h \
|
||||
include/core/historyitem.h \
|
||||
|
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
BIN
resources/icons/folder_map_opened.ico
Normal file
After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
resources/icons/map_opened.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/icons/sort_alphabet.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/icons/sort_map.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/icons/sort_number.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
|
@ -3,9 +3,7 @@
|
|||
<file>icons/folder.ico</file>
|
||||
<file>icons/folder_closed.ico</file>
|
||||
<file>icons/folder_closed_map.ico</file>
|
||||
<file>icons/folder_image.ico</file>
|
||||
<file>icons/folder_map.ico</file>
|
||||
<file>icons/image.ico</file>
|
||||
<file>icons/map.ico</file>
|
||||
<file>icons/cursor.ico</file>
|
||||
<file>icons/fill_color.ico</file>
|
||||
|
@ -23,5 +21,12 @@
|
|||
<file>icons/shift.ico</file>
|
||||
<file>icons/shift_cursor.ico</file>
|
||||
<file>icons/porymap-icon-1.ico</file>
|
||||
<file>icons/folder_map_edited.ico</file>
|
||||
<file>icons/folder_map_opened.ico</file>
|
||||
<file>icons/map_edited.ico</file>
|
||||
<file>icons/map_opened.ico</file>
|
||||
<file>icons/sort_alphabet.ico</file>
|
||||
<file>icons/sort_map.ico</file>
|
||||
<file>icons/sort_number.ico</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
35
src/core/filterchildrenproxymodel.cpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
#include "filterchildrenproxymodel.h"
|
||||
|
||||
FilterChildrenProxyModel::FilterChildrenProxyModel(QObject *parent) :
|
||||
QSortFilterProxyModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool FilterChildrenProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
|
||||
{
|
||||
// custom behaviour :
|
||||
if(filterRegExp().isEmpty() == false)
|
||||
{
|
||||
// get source-model index for current row
|
||||
QModelIndex source_index = sourceModel()->index(source_row, this->filterKeyColumn(), source_parent) ;
|
||||
if(source_index.isValid())
|
||||
{
|
||||
// if any of children matches the filter, then current index matches the filter as well
|
||||
int i, nb = sourceModel()->rowCount(source_index);
|
||||
for (i = 0; i < nb; ++i)
|
||||
{
|
||||
if (filterAcceptsRow(i, source_index))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// check current index itself
|
||||
QString key = sourceModel()->data(source_index, filterRole()).toString();
|
||||
QString parentKey = sourceModel()->data(source_parent, filterRole()).toString();
|
||||
return key.contains(filterRegExp()) || parentKey.contains(filterRegExp());
|
||||
}
|
||||
}
|
||||
// parent call for initial behaviour
|
||||
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
||||
}
|
|
@ -180,6 +180,10 @@ void MainWindow::setMap(QString map_name, bool scrollTreeView) {
|
|||
if (map_name.isNull()) {
|
||||
return;
|
||||
}
|
||||
if (editor->map != nullptr && !editor->map->name.isNull()) {
|
||||
ui->mapList->setExpanded(mapListIndexes.value(editor->map->name), false);
|
||||
}
|
||||
ui->mapList->setExpanded(mapListIndexes.value(map_name), true);
|
||||
editor->setMap(map_name);
|
||||
redrawMapScene();
|
||||
displayMapProperties();
|
||||
|
@ -418,26 +422,19 @@ void MainWindow::populateMapList() {
|
|||
|
||||
QIcon folderIcon;
|
||||
folderIcon.addFile(QStringLiteral(":/icons/folder_closed.ico"), QSize(), QIcon::Normal, QIcon::Off);
|
||||
folderIcon.addFile(QStringLiteral(":/icons/folder.ico"), QSize(), QIcon::Normal, QIcon::On);
|
||||
|
||||
mapIcon = new QIcon;
|
||||
mapIcon->addFile(QStringLiteral(":/icons/map.ico"), QSize(), QIcon::Normal, QIcon::Off);
|
||||
mapIcon->addFile(QStringLiteral(":/icons/image.ico"), QSize(), QIcon::Normal, QIcon::On);
|
||||
mapIcon->addFile(QStringLiteral(":/icons/map_opened.ico"), QSize(), QIcon::Normal, QIcon::On);
|
||||
|
||||
mapEditedIcon = new QIcon;
|
||||
mapEditedIcon->addFile(QStringLiteral(":/icons/map_edited.ico"), QSize(), QIcon::Normal, QIcon::Off);
|
||||
mapEditedIcon->addFile(QStringLiteral(":/icons/map_opened.ico"), QSize(), QIcon::Normal , QIcon::On);
|
||||
|
||||
mapListModel = new QStandardItemModel;
|
||||
mapGroupsModel = new QList<QStandardItem*>;
|
||||
|
||||
QStandardItem *entry = new QStandardItem;
|
||||
entry->setText(project->getProjectTitle());
|
||||
entry->setIcon(folderIcon);
|
||||
entry->setEditable(false);
|
||||
mapListModel->appendRow(entry);
|
||||
|
||||
QStandardItem *maps = new QStandardItem;
|
||||
maps->setText("maps");
|
||||
maps->setIcon(folderIcon);
|
||||
maps->setEditable(false);
|
||||
entry->appendRow(maps);
|
||||
|
||||
project->readMapGroups();
|
||||
for (int i = 0; i < project->groupNames->length(); i++) {
|
||||
QString group_name = project->groupNames->value(i);
|
||||
|
@ -448,7 +445,7 @@ void MainWindow::populateMapList() {
|
|||
group->setData(group_name, Qt::UserRole);
|
||||
group->setData("map_group", MapListUserRoles::TypeRole);
|
||||
group->setData(i, MapListUserRoles::GroupRole);
|
||||
maps->appendRow(group);
|
||||
mapListModel->appendRow(group);
|
||||
mapGroupsModel->append(group);
|
||||
QStringList names = project->groupedMapNames.value(i);
|
||||
for (int j = 0; j < names.length(); j++) {
|
||||
|
@ -466,7 +463,7 @@ void MainWindow::populateMapList() {
|
|||
|
||||
ui->mapList->setModel(mapListModel);
|
||||
ui->mapList->setUpdatesEnabled(true);
|
||||
ui->mapList->expandToDepth(2);
|
||||
ui->mapList->expandToDepth(0);
|
||||
ui->mapList->repaint();
|
||||
}
|
||||
|
||||
|
@ -563,10 +560,9 @@ void MainWindow::markEdited(QModelIndex index) {
|
|||
QString map_name = data.toString();
|
||||
if (editor->project) {
|
||||
if (editor->project->map_cache->contains(map_name)) {
|
||||
// Just mark anything that's been opened for now.
|
||||
// TODO if (project->getMap()->saved)
|
||||
//ui->mapList->setExpanded(index, true);
|
||||
ui->mapList->setExpanded(index, editor->project->map_cache->value(map_name)->hasUnsavedChanges());
|
||||
if (editor->project->map_cache->value(map_name)->hasUnsavedChanges()) {
|
||||
mapListModel->itemFromIndex(mapListIndexes.value(map_name))->setIcon(*mapEditedIcon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|