add areaList model and filtering, scrolling for all trees

This commit is contained in:
garak 2023-02-06 23:48:37 -05:00
parent 9918159caa
commit e2ff93e5e7
7 changed files with 241 additions and 208 deletions

View file

@ -266,6 +266,8 @@ private slots:
void on_actionTileset_Editor_triggered(); void on_actionTileset_Editor_triggered();
void on_lineEdit_filterBox_textChanged(const QString &arg1); void on_lineEdit_filterBox_textChanged(const QString &arg1);
void on_lineEdit_filterBox_Areas_textChanged(const QString &arg1);
void on_lineEdit_filterBox_Layouts_textChanged(const QString &arg1);
void moveEvent(QMoveEvent *event); void moveEvent(QMoveEvent *event);
void closeEvent(QCloseEvent *); void closeEvent(QCloseEvent *);
@ -318,6 +320,9 @@ private:
FilterChildrenProxyModel *groupListProxyModel; FilterChildrenProxyModel *groupListProxyModel;
MapGroupModel *mapGroupModel; MapGroupModel *mapGroupModel;
FilterChildrenProxyModel *areaListProxyModel;
MapAreaModel *mapAreaModel;
FilterChildrenProxyModel *layoutListProxyModel; FilterChildrenProxyModel *layoutListProxyModel;
LayoutTreeModel *layoutTreeModel; LayoutTreeModel *layoutTreeModel;
@ -348,13 +353,13 @@ private:
bool newMapDefaultsSet = false; bool newMapDefaultsSet = false;
MapSortOrder mapSortOrder; MapSortOrder mapSortOrder;
enum MapListTab { Groups, Areas, Layouts }; enum MapListTab { Groups = 0, Areas, Layouts };
bool tilesetNeedsRedraw = false; bool tilesetNeedsRedraw = false;
bool setLayout(QString layoutId); bool setLayout(QString layoutId);
bool setMap(QString, bool scrollTreeView = false); bool setMap(QString, bool scroll = false);
void unsetMap(); void unsetMap();
void redrawMapScene(); void redrawMapScene();
void refreshMapScene(); void refreshMapScene();
@ -363,11 +368,11 @@ private:
bool populateMapList(); bool populateMapList();
void sortMapList(); void sortMapList();
void openSubWindow(QWidget * window); void openSubWindow(QWidget * window);
void scrollTreeView(QString itemName);
QString getExistingDirectory(QString); QString getExistingDirectory(QString);
bool openProject(QString dir); bool openProject(QString dir);
QString getDefaultMap(); QString getDefaultMap();
void setRecentMap(QString map_name); void setRecentMap(QString map_name);
QStandardItem* createMapItem(QString mapName, int groupNum, int inGroupNum);
void updateMapList(); void updateMapList();

View file

@ -15,7 +15,8 @@ enum MapListRoles {
TypeRole2, // Used for various extra data needed. TypeRole2, // Used for various extra data needed.
}; };
// or QStandardItemModel??
class MapGroupModel : public QStandardItemModel { class MapGroupModel : public QStandardItemModel {
Q_OBJECT Q_OBJECT
@ -52,6 +53,42 @@ signals:
class MapAreaModel : public QStandardItemModel {
Q_OBJECT
public:
MapAreaModel(Project *project, QObject *parent = nullptr);
~MapAreaModel() {}
QVariant data(const QModelIndex &index, int role) const override;
public:
void setMap(QString mapName) { this->openMap = mapName; }
QStandardItem *createAreaItem(QString areaName, int areaIndex);
QStandardItem *createMapItem(QString mapName, int areaIndex, int mapIndex);
QStandardItem *getItem(const QModelIndex &index) const;
QModelIndex indexOfMap(QString mapName);
void initialize();
private:
Project *project;
QStandardItem *root = nullptr;
QMap<QString, QStandardItem *> areaItems;
QMap<QString, QStandardItem *> mapItems;
// TODO: if reordering, will the item be the same?
QString openMap;
signals:
void edited();
};
class LayoutTreeModel : public QStandardItemModel { class LayoutTreeModel : public QStandardItemModel {
Q_OBJECT Q_OBJECT

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -34,6 +34,8 @@
<file>icons/sort_number.ico</file> <file>icons/sort_number.ico</file>
<file>icons/tall_grass.ico</file> <file>icons/tall_grass.ico</file>
<file>icons/viewsprites.ico</file> <file>icons/viewsprites.ico</file>
<file>icons/application_form_edit.ico</file>
<file>icons/connections.ico</file>
<file>icons/ui/dark_checkbox_checked_disabled.png</file> <file>icons/ui/dark_checkbox_checked_disabled.png</file>
<file>icons/ui/dark_checkbox_checked_disabled@2x.png</file> <file>icons/ui/dark_checkbox_checked_disabled@2x.png</file>
<file>icons/ui/dark_checkbox_checked.png</file> <file>icons/ui/dark_checkbox_checked.png</file>

View file

@ -205,8 +205,11 @@ void MainWindow::initCustomUI() {
ui->mainTabBar->addTab("Map"); ui->mainTabBar->addTab("Map");
ui->mainTabBar->setTabIcon(0, QIcon(QStringLiteral(":/icons/map.ico"))); ui->mainTabBar->setTabIcon(0, QIcon(QStringLiteral(":/icons/map.ico")));
ui->mainTabBar->addTab("Events"); ui->mainTabBar->addTab("Events");
ui->mainTabBar->setTabIcon(1, QIcon(QStringLiteral(":/icons/viewsprites.ico")));
ui->mainTabBar->addTab("Header"); ui->mainTabBar->addTab("Header");
ui->mainTabBar->setTabIcon(2, QIcon(QStringLiteral(":/icons/application_form_edit.ico")));
ui->mainTabBar->addTab("Connections"); ui->mainTabBar->addTab("Connections");
ui->mainTabBar->setTabIcon(3, QIcon(QStringLiteral(":/icons/connections.ico")));
ui->mainTabBar->addTab("Wild Pokemon"); ui->mainTabBar->addTab("Wild Pokemon");
ui->mainTabBar->setTabIcon(4, QIcon(QStringLiteral(":/icons/tall_grass.ico"))); ui->mainTabBar->setTabIcon(4, QIcon(QStringLiteral(":/icons/tall_grass.ico")));
} }
@ -340,6 +343,8 @@ void MainWindow::initMapSortOrder() {
// QMenu *mapSortOrderMenu = new QMenu(this); // QMenu *mapSortOrderMenu = new QMenu(this);
// QActionGroup *mapSortOrderActionGroup = new QActionGroup(ui->toolButton_MapSortOrder); // QActionGroup *mapSortOrderActionGroup = new QActionGroup(ui->toolButton_MapSortOrder);
// porymapConfig.setMapSortOrder(mapSortOrder);
// mapSortOrderMenu->addAction(ui->actionSort_by_Group); // mapSortOrderMenu->addAction(ui->actionSort_by_Group);
// mapSortOrderMenu->addAction(ui->actionSort_by_Area); // mapSortOrderMenu->addAction(ui->actionSort_by_Area);
// mapSortOrderMenu->addAction(ui->actionSort_by_Layout); // mapSortOrderMenu->addAction(ui->actionSort_by_Layout);
@ -410,14 +415,40 @@ void MainWindow::on_lineEdit_filterBox_textChanged(const QString &text) {
this->applyMapListFilter(text); this->applyMapListFilter(text);
} }
void MainWindow::on_lineEdit_filterBox_Areas_textChanged(const QString &text) {
this->applyMapListFilter(text);
}
void MainWindow::on_lineEdit_filterBox_Layouts_textChanged(const QString &text) {
this->applyMapListFilter(text);
}
void MainWindow::applyMapListFilter(QString filterText) { void MainWindow::applyMapListFilter(QString filterText) {
/// !TODO FilterChildrenProxyModel *proxy;
groupListProxyModel->setFilterRegularExpression(QRegularExpression(filterText, QRegularExpression::CaseInsensitiveOption)); QTreeView *list;
if (filterText.isEmpty()) { switch (this->mapSortOrder) {
ui->mapList->collapseAll(); case MapSortOrder::SortByGroup:
} else { proxy = this->groupListProxyModel;
ui->mapList->expandToDepth(0); list = this->ui->mapList;
break;
case MapSortOrder::SortByArea:
proxy = this->areaListProxyModel;
list = this->ui->areaList;
break;
case MapSortOrder::SortByLayout:
proxy = this->layoutListProxyModel;
list = this->ui->layoutList;
break;
} }
proxy->setFilterRegularExpression(QRegularExpression(filterText, QRegularExpression::CaseInsensitiveOption));
if (filterText.isEmpty()) {
list->collapseAll();
} else {
list->expandToDepth(0);
}
/// !TODO
// ui->mapList->setExpanded(mapListProxyModel->mapFromSource(mapListIndexes.value(editor->map->name)), true); // ui->mapList->setExpanded(mapListProxyModel->mapFromSource(mapListIndexes.value(editor->map->name)), true);
// ui->mapList->scrollTo(mapListProxyModel->mapFromSource(mapListIndexes.value(editor->map->name)), QAbstractItemView::PositionAtCenter); // ui->mapList->scrollTo(mapListProxyModel->mapFromSource(mapListIndexes.value(editor->map->name)), QAbstractItemView::PositionAtCenter);
} }
@ -432,6 +463,9 @@ void MainWindow::loadUserSettings() {
ui->checkBox_ToggleBorder->setChecked(porymapConfig.getShowBorder()); ui->checkBox_ToggleBorder->setChecked(porymapConfig.getShowBorder());
ui->checkBox_ToggleGrid->setChecked(porymapConfig.getShowGrid()); ui->checkBox_ToggleGrid->setChecked(porymapConfig.getShowGrid());
mapSortOrder = porymapConfig.getMapSortOrder(); mapSortOrder = porymapConfig.getMapSortOrder();
this->ui->mapListContainer->blockSignals(true);
this->ui->mapListContainer->setCurrentIndex(static_cast<int>(this->mapSortOrder));
this->ui->mapListContainer->blockSignals(false);
ui->horizontalSlider_CollisionTransparency->blockSignals(true); ui->horizontalSlider_CollisionTransparency->blockSignals(true);
this->editor->collisionOpacity = static_cast<qreal>(porymapConfig.getCollisionOpacity()) / 100; this->editor->collisionOpacity = static_cast<qreal>(porymapConfig.getCollisionOpacity()) / 100;
ui->horizontalSlider_CollisionTransparency->setValue(porymapConfig.getCollisionOpacity()); ui->horizontalSlider_CollisionTransparency->setValue(porymapConfig.getCollisionOpacity());
@ -643,7 +677,7 @@ void MainWindow::unsetMap() {
this->ui->comboBox_LayoutSelector->setEnabled(false); this->ui->comboBox_LayoutSelector->setEnabled(false);
} }
bool MainWindow::setMap(QString map_name, bool scrollTreeView) { bool MainWindow::setMap(QString map_name, bool scroll) {
// if map name is empty, clear & disable map ui // if map name is empty, clear & disable map ui
if (map_name.isEmpty()) { if (map_name.isEmpty()) {
unsetMap(); unsetMap();
@ -670,12 +704,8 @@ bool MainWindow::setMap(QString map_name, bool scrollTreeView) {
refreshMapScene(); refreshMapScene();
displayMapProperties(); displayMapProperties();
if (scrollTreeView) { if (scroll) {
// Make sure we clear the filter first so we actually have a scroll target scrollTreeView(map_name);
/// !TODO: make this onto a function that scrolls the current view taking a map name or layout name
groupListProxyModel->setFilterRegularExpression(QString());
ui->mapList->setCurrentIndex(groupListProxyModel->mapFromSource(mapGroupModel->indexOfMap(map_name)));
ui->mapList->scrollTo(ui->mapList->currentIndex(), QAbstractItemView::PositionAtCenter);
} }
showWindowTitle(); showWindowTitle();
@ -1042,13 +1072,7 @@ bool MainWindow::loadProjectCombos() {
return true; return true;
} }
/// !TODO
bool MainWindow::populateMapList() { bool MainWindow::populateMapList() {
// bool success = editor->project->readMapGroups();
// if (success) {
// sortMapList();
// }
// return success;
bool success = editor->project->readMapGroups(); bool success = editor->project->readMapGroups();
this->mapGroupModel = new MapGroupModel(editor->project); this->mapGroupModel = new MapGroupModel(editor->project);
@ -1056,21 +1080,43 @@ bool MainWindow::populateMapList() {
groupListProxyModel->setSourceModel(this->mapGroupModel); groupListProxyModel->setSourceModel(this->mapGroupModel);
ui->mapList->setModel(groupListProxyModel); ui->mapList->setModel(groupListProxyModel);
this->mapAreaModel = new MapAreaModel(editor->project);
this->areaListProxyModel = new FilterChildrenProxyModel();
areaListProxyModel->setSourceModel(this->mapAreaModel);
ui->areaList->setModel(areaListProxyModel);
this->layoutTreeModel = new LayoutTreeModel(editor->project); this->layoutTreeModel = new LayoutTreeModel(editor->project);
this->layoutListProxyModel = new FilterChildrenProxyModel(); this->layoutListProxyModel = new FilterChildrenProxyModel();
this->layoutListProxyModel->setSourceModel(this->layoutTreeModel); this->layoutListProxyModel->setSourceModel(this->layoutTreeModel);
ui->layoutList->setModel(layoutListProxyModel); ui->layoutList->setModel(layoutListProxyModel);
//connect(this->ui->layoutList, &QTreeView::doubleClicked, this, &MainWindow::on_layoutList_activated); /// !TODO
// ui->mapList->setSelectionMode(QAbstractItemView::ExtendedSelection); // ui->mapList->setSelectionMode(QAbstractItemView::ExtendedSelection);
// ui->mapList->setDragEnabled(true); // ui->mapList->setDragEnabled(true);
// ui->mapList->setAcceptDrops(true); // ui->mapList->setAcceptDrops(true);
// ui->mapList->setDropIndicatorShown(true); // ui->mapList->setDropIndicatorShown(true);
return success; return success;
}
//MapGroupModel void MainWindow::scrollTreeView(QString itemName) {
switch (ui->mapListContainer->currentIndex()) {
case MapListTab::Groups:
groupListProxyModel->setFilterRegularExpression(QString());
ui->mapList->setCurrentIndex(groupListProxyModel->mapFromSource(mapGroupModel->indexOfMap(itemName)));
ui->mapList->scrollTo(ui->mapList->currentIndex(), QAbstractItemView::PositionAtCenter);
break;
case MapListTab::Areas:
areaListProxyModel->setFilterRegularExpression(QString());
ui->areaList->setCurrentIndex(areaListProxyModel->mapFromSource(mapAreaModel->indexOfMap(itemName)));
ui->areaList->scrollTo(ui->areaList->currentIndex(), QAbstractItemView::PositionAtCenter);
break;
case MapListTab::Layouts:
layoutListProxyModel->setFilterRegularExpression(QString());
ui->layoutList->setCurrentIndex(layoutListProxyModel->mapFromSource(layoutTreeModel->indexOfLayout(itemName)));
ui->layoutList->scrollTo(ui->layoutList->currentIndex(), QAbstractItemView::PositionAtCenter);
break;
}
} }
void MainWindow::sortMapList() { void MainWindow::sortMapList() {
@ -1181,19 +1227,7 @@ void MainWindow::sortMapList() {
// updateMapList(); // updateMapList();
} }
/// !TODO void MainWindow::onOpenMapListContextMenu(const QPoint &point) {
QStandardItem* MainWindow::createMapItem(QString mapName, int groupNum, int inGroupNum) {
// QStandardItem *map = new QStandardItem;
// map->setText(QString("[%1.%2] ").arg(groupNum).arg(inGroupNum, 2, 10, QLatin1Char('0')) + mapName);
// map->setIcon(*mapIcon);
// map->setEditable(false);
// map->setData(mapName, Qt::UserRole);
// map->setData("map_name", MapListUserRoles::TypeRole);
// return map;
}
void MainWindow::onOpenMapListContextMenu(const QPoint &point)
{
/// !TODO /// !TODO
// QModelIndex index = mapListProxyModel->mapToSource(ui->mapList->indexAt(point)); // QModelIndex index = mapListProxyModel->mapToSource(ui->mapList->indexAt(point));
// if (!index.isValid()) { // if (!index.isValid()) {
@ -1462,14 +1496,19 @@ void MainWindow::on_mapListContainer_currentChanged(int index) {
// //
switch (index) { switch (index) {
case MapListTab::Groups: case MapListTab::Groups:
this->mapSortOrder = MapSortOrder::SortByGroup;
if (this->editor && this->editor->map) scrollTreeView(this->editor->map->name);
break; break;
case MapListTab::Areas: case MapListTab::Areas:
this->mapSortOrder = MapSortOrder::SortByArea;
if (this->editor && this->editor->map) scrollTreeView(this->editor->map->name);
break; break;
case MapListTab::Layouts: case MapListTab::Layouts:
//setMap(nullptr); this->mapSortOrder = MapSortOrder::SortByLayout;
//setLayout(nullptr); if (this->editor && this->editor->layout) scrollTreeView(this->editor->layout->id);
break; break;
} }
porymapConfig.setMapSortOrder(this->mapSortOrder);
} }
/// !TODO /// !TODO
@ -1489,7 +1528,7 @@ void MainWindow::on_mapList_activated(const QModelIndex &index) {
} }
void MainWindow::on_areaList_activated(const QModelIndex &index) { void MainWindow::on_areaList_activated(const QModelIndex &index) {
// on_mapList_activated(index);
} }
void MainWindow::on_layoutList_activated(const QModelIndex &index) { void MainWindow::on_layoutList_activated(const QModelIndex &index) {
@ -1520,6 +1559,8 @@ void MainWindow::updateMapList() {
if (this->editor->map) { if (this->editor->map) {
mapGroupModel->setMap(this->editor->map->name); mapGroupModel->setMap(this->editor->map->name);
groupListProxyModel->layoutChanged(); groupListProxyModel->layoutChanged();
mapAreaModel->setMap(this->editor->map->name);
areaListProxyModel->layoutChanged();
} }
if (this->editor->layout) { if (this->editor->layout) {

View file

@ -4,89 +4,10 @@
/*
// QIcon mapFolderIcon;
// mapFolderIcon.addFile(QStringLiteral(":/icons/folder_closed_map.ico"), QSize(), QIcon::Normal, QIcon::Off);
// mapFolderIcon.addFile(QStringLiteral(":/icons/folder_map.ico"), QSize(), QIcon::Normal, QIcon::On);
// 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);
// ui->mapList->setUpdatesEnabled(false);
// mapListModel->clear();
// mapGroupItemsList->clear();
// QStandardItem *root = mapListModel->invisibleRootItem();
// switch (mapSortOrder)
// {
// case MapSortOrder::Group:
// for (int i = 0; i < project->groupNames.length(); i++) {
// QString group_name = project->groupNames.value(i);
// QStandardItem *group = new QStandardItem;
// group->setText(group_name);
// group->setIcon(mapFolderIcon);
// group->setEditable(false);
// group->setData(group_name, Qt::UserRole);
// group->setData("map_group", MapListUserRoles::TypeRole);
// group->setData(i, MapListUserRoles::GroupRole);
// root->appendRow(group);
// mapGroupItemsList->append(group);
// QStringList names = project->groupedMapNames.value(i);
// for (int j = 0; j < names.length(); j++) {
// QString map_name = names.value(j);
// QStandardItem *map = createMapItem(map_name, i, j);
// group->appendRow(map);
// mapListIndexes.insert(map_name, map->index());
// }
// }
// break;
// mapListModel = new QStandardItemModel;
// mapGroupItemsList = new QList<QStandardItem*>;
// mapListProxyModel = new FilterChildrenProxyModel;
// mapListProxyModel->setSourceModel(mapListModel);
// ui->mapList->setModel(mapListProxyModel);
// createMapItem:
// QStandardItem *map = new QStandardItem;
// map->setText(QString("[%1.%2] ").arg(groupNum).arg(inGroupNum, 2, 10, QLatin1Char('0')) + mapName);
// map->setIcon(*mapIcon);
// map->setEditable(false);
// map->setData(mapName, Qt::UserRole);
// map->setData("map_name", MapListUserRoles::TypeRole);
// return map;
// scrolling:
if (scrollTreeView) {
// Make sure we clear the filter first so we actually have a scroll target
/// !TODO
// mapListProxyModel->setFilterRegularExpression(QString());
// ui->mapList->setCurrentIndex(mapListProxyModel->mapFromSource(mapListIndexes.value(map_name)));
// ui->mapList->scrollTo(ui->mapList->currentIndex(), QAbstractItemView::PositionAtCenter);
}
// ui->mapList->setExpanded(mapListProxyModel->mapFromSource(mapListIndexes.value(map_name)), true);
*/
MapGroupModel::MapGroupModel(Project *project, QObject *parent) : QStandardItemModel(parent) { MapGroupModel::MapGroupModel(Project *project, QObject *parent) : QStandardItemModel(parent) {
//
this->project = project; this->project = project;
this->root = this->invisibleRootItem(); this->root = this->invisibleRootItem();
// mapIcon = new QIcon(QStringLiteral(":/icons/map.ico"));
// mapEditedIcon = new QIcon(QStringLiteral(":/icons/map_edited.ico"));
// mapOpenedIcon = new QIcon(QStringLiteral(":/icons/map_opened.ico"));
// mapFolderIcon = new QIcon(QStringLiteral(":/icons/folder_closed_map.ico"));
//mapFolderIcon = new QIcon;
//mapFolderIcon->addFile(QStringLiteral(":/icons/folder_closed_map.ico"), QSize(), QIcon::Normal, QIcon::Off);
//mapFolderIcon->addFile(QStringLiteral(":/icons/folder_map.ico"), QSize(), QIcon::Normal, QIcon::On);
initialize(); initialize();
} }
@ -118,9 +39,6 @@ void MapGroupModel::initialize() {
QString group_name = this->project->groupNames.value(i); QString group_name = this->project->groupNames.value(i);
QStandardItem *group = createGroupItem(group_name, i); QStandardItem *group = createGroupItem(group_name, i);
root->appendRow(group); root->appendRow(group);
QList<QStandardItem *> groupItems;
QMap<QString, QStandardItem *> inGroupItems;
//mapGroupItemsList->append(group);
QStringList names = this->project->groupedMapNames.value(i); QStringList names = this->project->groupedMapNames.value(i);
for (int j = 0; j < names.length(); j++) { for (int j = 0; j < names.length(); j++) {
QString map_name = names.value(j); QString map_name = names.value(j);
@ -146,35 +64,6 @@ QModelIndex MapGroupModel::indexOfMap(QString mapName) {
return QModelIndex(); return QModelIndex();
} }
// projectHasUnsavedChanges = false;
// QList<QModelIndex> list;
// list.append(QModelIndex());
// while (list.length()) {
// QModelIndex parent = list.takeFirst();
// for (int i = 0; i < model->rowCount(parent); i++) {
// QModelIndex index = model->index(i, 0, parent);
// if (model->hasChildren(index)) {
// list.append(index);
// }
// QVariant data = index.data(Qt::UserRole);
// if (!data.isNull()) {
// QString map_name = data.toString();
// if (editor->project && editor->project->mapCache.contains(map_name)) {
// QStandardItem *map = mapListModel->itemFromIndex(mapListIndexes.value(map_name));
// map->setIcon(*mapIcon);
// if (editor->project->mapCache.value(map_name)->hasUnsavedChanges()) {
// map->setIcon(*mapEditedIcon);
// projectHasUnsavedChanges = true;
// }
// if (editor->map->name == map_name) {
// map->setIcon(*mapOpenedIcon);
// }
// }
// }
// }
// }
#include <QDebug>
QVariant MapGroupModel::data(const QModelIndex &index, int role) const { QVariant MapGroupModel::data(const QModelIndex &index, int role) const {
int row = index.row(); int row = index.row();
int col = index.column(); int col = index.column();
@ -213,10 +102,6 @@ QVariant MapGroupModel::data(const QModelIndex &index, int role) const {
} }
return mapGrayIcon; return mapGrayIcon;
} }
// check if map or group
// if map, check if edited or open
//return QIcon(":/icons/porymap-icon-2.ico");
} }
return QStandardItemModel::data(index, role); return QStandardItemModel::data(index, role);
@ -224,52 +109,124 @@ QVariant MapGroupModel::data(const QModelIndex &index, int role) const {
MapAreaModel::MapAreaModel(Project *project, QObject *parent) : QStandardItemModel(parent) {
this->project = project;
this->root = this->invisibleRootItem();
initialize();
}
QStandardItem *MapAreaModel::createAreaItem(QString mapsecName, int areaIndex) {
QStandardItem *area = new QStandardItem;
area->setText(mapsecName);
area->setEditable(false);
area->setData(mapsecName, Qt::UserRole);
area->setData("map_section", MapListRoles::TypeRole);
area->setData(areaIndex, MapListRoles::GroupRole);
// group->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
this->areaItems.insert(mapsecName, area);
return area;
}
QStandardItem *MapAreaModel::createMapItem(QString mapName, int groupIndex, int mapIndex) {
QStandardItem *map = new QStandardItem;
map->setText(QString("[%1.%2] ").arg(groupIndex).arg(mapIndex, 2, 10, QLatin1Char('0')) + mapName);
map->setEditable(false);
map->setData(mapName, Qt::UserRole);
map->setData("map_name", MapListRoles::TypeRole);
// map->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
this->mapItems.insert(mapName, map);
return map;
}
void MapAreaModel::initialize() {
for (int i = 0; i < this->project->mapSectionNameToValue.size(); i++) {
QString mapsecName = project->mapSectionValueToName.value(i);
QStandardItem *areaItem = createAreaItem(mapsecName, i);
this->root->appendRow(areaItem);
}
for (int i = 0; i < this->project->groupNames.length(); i++) {
QStringList names = this->project->groupedMapNames.value(i);
for (int j = 0; j < names.length(); j++) {
QString mapName = names.value(j);
QStandardItem *map = createMapItem(mapName, i, j);
QString mapsecName = this->project->readMapLocation(mapName);
if (this->areaItems.contains(mapsecName)) {
this->areaItems[mapsecName]->appendRow(map);
}
}
}
}
QStandardItem *MapAreaModel::getItem(const QModelIndex &index) const {
if (index.isValid()) {
QStandardItem *item = static_cast<QStandardItem*>(index.internalPointer());
if (item)
return item;
}
return this->root;
}
QModelIndex MapAreaModel::indexOfMap(QString mapName) {
if (this->mapItems.contains(mapName)) {
return this->mapItems[mapName]->index();
}
return QModelIndex();
}
QVariant MapAreaModel::data(const QModelIndex &index, int role) const {
int row = index.row();
int col = index.column();
if (role == Qt::DecorationRole) {
static QIcon mapGrayIcon = QIcon(QStringLiteral(":/icons/map_grayed.ico"));
static QIcon mapIcon = QIcon(QStringLiteral(":/icons/map.ico"));
static QIcon mapEditedIcon = QIcon(QStringLiteral(":/icons/map_edited.ico"));
static QIcon mapOpenedIcon = QIcon(QStringLiteral(":/icons/map_opened.ico"));
static QIcon mapFolderIcon;
static QIcon folderIcon;
static bool loaded = false;
if (!loaded) {
mapFolderIcon.addFile(QStringLiteral(":/icons/folder_closed_map.ico"), QSize(), QIcon::Normal, QIcon::Off);
mapFolderIcon.addFile(QStringLiteral(":/icons/folder_map.ico"), QSize(), QIcon::Normal, QIcon::On);
folderIcon.addFile(QStringLiteral(":/icons/folder_closed.ico"), QSize(), QIcon::Normal, QIcon::Off);
folderIcon.addFile(QStringLiteral(":/icons/folder.ico"), QSize(), QIcon::Normal, QIcon::On);
loaded = true;
}
QStandardItem *item = this->getItem(index)->child(row, col);
QString type = item->data(MapListRoles::TypeRole).toString();
if (type == "map_section") {
if (item->hasChildren()) {
return mapFolderIcon;
}
return folderIcon;
} else if (type == "map_name") {
QString mapName = item->data(Qt::UserRole).toString();
if (mapName == this->openMap) {
return mapOpenedIcon;
}
else if (this->project->mapCache.contains(mapName)) {
if (this->project->mapCache.value(mapName)->hasUnsavedChanges()) {
return mapEditedIcon;
}
else {
return mapIcon;
}
}
return mapGrayIcon;
}
}
return QStandardItemModel::data(index, role);
}
// case MapSortOrder::Layout:
// {
// QMap<QString, int> layoutIndices;
// for (int i = 0; i < project->mapLayoutsTable.length(); i++) {
// QString layoutId = project->mapLayoutsTable.value(i);
// MapLayout *layout = project->mapLayouts.value(layoutId);
// QStandardItem *layoutItem = new QStandardItem;
// layoutItem->setText(layout->name);
// layoutItem->setIcon(folderIcon);
// layoutItem->setEditable(false);
// layoutItem->setData(layout->name, Qt::UserRole);
// layoutItem->setData("map_layout", MapListUserRoles::TypeRole);
// layoutItem->setData(layout->id, MapListUserRoles::TypeRole2);
// layoutItem->setData(i, MapListUserRoles::GroupRole);
// root->appendRow(layoutItem);
// mapGroupItemsList->append(layoutItem);
// layoutIndices[layoutId] = i;
// }
// for (int i = 0; i < project->groupNames.length(); i++) {
// QStringList names = project->groupedMapNames.value(i);
// for (int j = 0; j < names.length(); j++) {
// QString map_name = names.value(j);
// QStandardItem *map = createMapItem(map_name, i, j);
// QString layoutId = project->readMapLayoutId(map_name);
// QStandardItem *layoutItem = mapGroupItemsList->at(layoutIndices.value(layoutId));
// layoutItem->setIcon(mapFolderIcon);
// layoutItem->appendRow(map);
// mapListIndexes.insert(map_name, map->index());
// }
// }
// break;
// }
LayoutTreeModel::LayoutTreeModel(Project *project, QObject *parent) : QStandardItemModel(parent) { LayoutTreeModel::LayoutTreeModel(Project *project, QObject *parent) : QStandardItemModel(parent) {
//
this->project = project; this->project = project;
this->root = this->invisibleRootItem(); this->root = this->invisibleRootItem();
@ -279,7 +236,6 @@ LayoutTreeModel::LayoutTreeModel(Project *project, QObject *parent) : QStandardI
QStandardItem *LayoutTreeModel::createLayoutItem(QString layoutId) { QStandardItem *LayoutTreeModel::createLayoutItem(QString layoutId) {
QStandardItem *layout = new QStandardItem; QStandardItem *layout = new QStandardItem;
layout->setText(this->project->layoutIdsToNames[layoutId]); layout->setText(this->project->layoutIdsToNames[layoutId]);
//layout->setText(layoutId);
layout->setEditable(false); layout->setEditable(false);
layout->setData(layoutId, Qt::UserRole); layout->setData(layoutId, Qt::UserRole);
layout->setData("map_layout", MapListRoles::TypeRole); layout->setData("map_layout", MapListRoles::TypeRole);
@ -301,7 +257,6 @@ QStandardItem *LayoutTreeModel::createMapItem(QString mapName) {
void LayoutTreeModel::initialize() { void LayoutTreeModel::initialize() {
for (int i = 0; i < this->project->mapLayoutsTable.length(); i++) { for (int i = 0; i < this->project->mapLayoutsTable.length(); i++) {
//
QString layoutId = project->mapLayoutsTable.value(i); QString layoutId = project->mapLayoutsTable.value(i);
QStandardItem *layoutItem = createLayoutItem(layoutId); QStandardItem *layoutItem = createLayoutItem(layoutId);
this->root->appendRow(layoutItem); this->root->appendRow(layoutItem);
@ -315,8 +270,6 @@ void LayoutTreeModel::initialize() {
this->layoutItems[layoutId]->appendRow(map); this->layoutItems[layoutId]->appendRow(map);
} }
} }
// // project->readMapLayoutName
} }
QStandardItem *LayoutTreeModel::getItem(const QModelIndex &index) const { QStandardItem *LayoutTreeModel::getItem(const QModelIndex &index) const {
@ -364,12 +317,7 @@ QVariant LayoutTreeModel::data(const QModelIndex &index, int role) const {
} }
return QVariant(); return QVariant();
// check if map or group
// if map, check if edited or open
//return QIcon(":/icons/porymap-icon-2.ico");
} }
return QStandardItemModel::data(index, role); return QStandardItemModel::data(index, role);
} }