1 /*
2 * Copyright (C) 2014-2018 Christopho, Solarus - http://www.solarus-games.org
3 *
4 * Solarus Quest Editor is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * Solarus Quest Editor is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include "widgets/border_set_tree_view.h"
18 #include "border_set_model.h"
19 #include "tileset_model.h"
20
21 namespace SolarusEditor {
22
23 /**
24 * @brief Creates an empty border set tree view.
25 * @param parent The parent object or nullptr.
26 */
BorderSetTreeView(QWidget * parent)27 BorderSetTreeView::BorderSetTreeView(QWidget* parent) :
28 QTreeView(parent),
29 tileset(nullptr),
30 model(nullptr) {
31
32 setIconSize(QSize(32, 32));
33 setSelectionBehavior(SelectItems);
34 setHeaderHidden(true);
35
36 setDragDropMode(DragDrop);
37 setDragEnabled(true);
38 setAcceptDrops(true);
39 }
40
41 /**
42 * @brief Sets the tileset to represent in this view.
43 * @param tileset The tileset model.
44 */
set_tileset(TilesetModel & tileset)45 void BorderSetTreeView::set_tileset(TilesetModel& tileset) {
46
47 this->tileset = &tileset;
48
49 model = new BorderSetModel(tileset);
50 setModel(model);
51 if (tileset.get_num_border_sets() > 0) {
52 resizeColumnToContents(0);
53 }
54
55 connect(model, SIGNAL(change_border_set_patterns_requested(QString, QStringList)),
56 this, SIGNAL(change_border_set_patterns_requested(QString, QStringList)));
57
58 connect(&tileset, &TilesetModel::border_set_created,
59 [this](const QString& border_set_id) {
60 QModelIndex index = this->model->get_border_set_index(border_set_id);
61 expand(index);
62 resizeColumnToContents(0);
63 selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
64 scrollTo(index, ScrollHint::PositionAtTop);
65 });
66
67 connect(&tileset, &TilesetModel::border_set_deleted,
68 [this](const QString&) {
69 resizeColumnToContents(0);
70 });
71
72 connect(&tileset, &TilesetModel::border_set_id_changed,
73 [this](const QString&, const QString& new_id) {
74 set_selected_border_set_id(new_id);
75 });
76 }
77
78 /**
79 * @brief Returns the currently selected border set id.
80 * @return The selected border set id or an empty string.
81 */
get_selected_border_set_id() const82 QString BorderSetTreeView::get_selected_border_set_id() const {
83
84 const QModelIndexList& selected_indexes = selectionModel()->selectedIndexes();
85 for (const QModelIndex& index : selected_indexes) {
86 if (model->is_border_set_index(index) ||
87 model->is_pattern_index(index)
88 ) {
89 return model->get_border_set_id(index);
90 }
91 }
92 return QString();
93 }
94
95 /**
96 * @brief Selects a border set id.
97 * @param border_set_id A border set id, or an empty string to select nothing.
98 */
set_selected_border_set_id(const QString & border_set_id)99 void BorderSetTreeView::set_selected_border_set_id(const QString& border_set_id) {
100
101 if (border_set_id.isEmpty()) {
102 selectionModel()->clear();
103 return;
104 }
105
106 const QModelIndex& index = model->get_border_set_index(border_set_id);
107 if (index.isValid()) {
108 selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
109 }
110 }
111
112 /**
113 * @brief Deletes the selected border sets or patterns.
114 */
delete_border_set_selection_requested()115 void BorderSetTreeView::delete_border_set_selection_requested() {
116
117 const QModelIndexList& selected_indexes = selectionModel()->selectedIndexes();
118 QStringList border_sets_to_delete;
119 QList<QPair<QString, BorderKind>> patterns_to_delete;
120 for (const QModelIndex& index : selected_indexes) {
121 const QString& border_set_id = model->get_border_set_id(index);
122 if (model->is_border_set_index(index)) {
123 // Delete a full border set.
124 border_sets_to_delete << border_set_id;
125 }
126 else if (model->is_pattern_index(index)) {
127 // Delete a pattern.
128 if (!border_sets_to_delete.contains(border_set_id)) {
129 patterns_to_delete << qMakePair(border_set_id, model->get_border_kind(index));
130 }
131 }
132 }
133
134 if (!border_sets_to_delete.isEmpty()) {
135 emit delete_border_sets_requested(border_sets_to_delete);
136 }
137
138 if (!patterns_to_delete.isEmpty()) {
139 emit delete_border_set_patterns_requested(patterns_to_delete);
140 }
141 }
142
143 }
144