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