porymap/src/ui/montabwidget.cpp

176 lines
6.7 KiB
C++
Raw Normal View History

#include "montabwidget.h"
#include "noscrollcombobox.h"
#include "editor.h"
2023-01-15 04:10:58 +00:00
#include "encountertablemodel.h"
#include "encountertabledelegates.h"
2023-01-26 20:46:44 +00:00
static WildMonInfo encounterClipboard;
MonTabWidget::MonTabWidget(Editor *editor, QWidget *parent) : QTabWidget(parent) {
this->editor = editor;
populate();
this->tabBar()->installEventFilter(this);
}
2023-01-26 20:46:44 +00:00
MonTabWidget::~MonTabWidget() {
}
2019-08-07 03:10:22 +01:00
bool MonTabWidget::eventFilter(QObject *, QEvent *event) {
2023-01-19 18:06:27 +00:00
if (event->type() == QEvent::Wheel) {
return true;
}
2019-08-07 03:10:22 +01:00
return false;
}
void MonTabWidget::populate() {
EncounterFields fields = editor->project->wildMonFields;
2023-01-19 18:06:27 +00:00
activeTabs.resize(fields.size());
activeTabs.fill(false);
addDeleteTabButtons.resize(fields.size());
addDeleteTabButtons.fill(nullptr);
copyTabButtons.resize(fields.size());
copyTabButtons.fill(nullptr);
2023-01-19 18:06:27 +00:00
int index = 0;
for (EncounterField field : fields) {
2023-01-15 04:10:58 +00:00
QTableView *table = new QTableView(this);
table->setEditTriggers(QAbstractItemView::AllEditTriggers);
table->clearFocus();
addTab(table, field.name);
2023-01-19 18:06:27 +00:00
QPushButton *buttonAddDelete = new QPushButton(QIcon(":/icons/add.ico"), "");
connect(buttonAddDelete, &QPushButton::clicked, [=]() { actionAddDeleteTab(index); });
addDeleteTabButtons[index] = buttonAddDelete;
this->tabBar()->setTabButton(index, QTabBar::RightSide, buttonAddDelete);
QPushButton *buttonCopy = new QPushButton(QIcon(":/icons/clipboard.ico"), "");
connect(buttonCopy, &QPushButton::clicked, [=]() {actionCopyTab(index); });
copyTabButtons[index] = buttonCopy;
this->tabBar()->setTabButton(index, QTabBar::LeftSide, buttonCopy);
index++;
}
}
void MonTabWidget::copy(int index) {
EncounterTableModel *model = static_cast<EncounterTableModel *>(this->tableAt(index)->model());
encounterClipboard = model->encounterData();
}
void MonTabWidget::paste(int index) {
if (!encounterClipboard.active) return;
clearTableAt(index);
WildMonInfo newInfo = getDefaultMonInfo(this->editor->project->wildMonFields.at(index));
combineEncounters(newInfo, encounterClipboard);
populateTab(index, newInfo);
2024-08-27 04:53:08 +01:00
emit editor->wildMonTableEdited();
}
2023-01-19 18:06:27 +00:00
void MonTabWidget::actionCopyTab(int index) {
QMenu contextMenu(this);
2023-01-26 20:46:44 +00:00
QAction *actionCopy = new QAction("Copy", &contextMenu);
connect(actionCopy, &QAction::triggered, [=]() { copy(index); });
2023-01-26 20:46:44 +00:00
contextMenu.addAction(actionCopy);
2023-01-19 18:06:27 +00:00
2023-01-26 20:46:44 +00:00
if (encounterClipboard.active) {
QAction *actionPaste = new QAction("Paste", &contextMenu);
connect(actionPaste, &QAction::triggered, [=]() { paste(index); });
2023-01-26 20:46:44 +00:00
contextMenu.addAction(actionPaste);
2023-01-19 18:06:27 +00:00
}
2023-01-26 20:46:44 +00:00
2023-01-19 18:06:27 +00:00
contextMenu.exec(mapToGlobal(this->copyTabButtons[index]->pos() + QPoint(0, this->copyTabButtons[index]->height())));
}
void MonTabWidget::actionAddDeleteTab(int index) {
2024-08-27 04:53:08 +01:00
clearTableAt(index);
2023-01-19 18:06:27 +00:00
if (activeTabs[index]) {
// delete tab
deactivateTab(index);
editor->saveEncounterTabData();
}
else {
// add tab
populateTab(index, getDefaultMonInfo(editor->project->wildMonFields.at(index)));
editor->saveEncounterTabData();
setCurrentIndex(index);
}
2024-08-27 04:53:08 +01:00
emit editor->wildMonTableEdited();
}
void MonTabWidget::clearTableAt(int tabIndex) {
2023-01-15 04:10:58 +00:00
QTableView *table = tableAt(tabIndex);
if (table) {
table->reset();
table->horizontalHeader()->hide();
}
}
2023-01-19 18:06:27 +00:00
void MonTabWidget::deactivateTab(int tabIndex) {
QTableView *speciesTable = tableAt(tabIndex);
EncounterTableModel *oldModel = static_cast<EncounterTableModel *>(speciesTable->model());
WildMonInfo monInfo = oldModel->encounterData();
monInfo.active = false;
EncounterTableModel *newModel = new EncounterTableModel(monInfo, editor->project->wildMonFields, tabIndex, this);
speciesTable->setModel(newModel);
setTabActive(tabIndex, false);
}
2023-01-15 04:10:58 +00:00
void MonTabWidget::populateTab(int tabIndex, WildMonInfo monInfo) {
QTableView *speciesTable = tableAt(tabIndex);
2023-01-15 04:10:58 +00:00
EncounterTableModel *model = new EncounterTableModel(monInfo, editor->project->wildMonFields, tabIndex, this);
connect(model, &EncounterTableModel::edited, editor, &Editor::saveEncounterTabData);
2024-08-27 04:53:08 +01:00
connect(model, &EncounterTableModel::edited, editor, &Editor::wildMonTableEdited);
2023-01-15 04:10:58 +00:00
speciesTable->setModel(model);
2023-01-15 04:10:58 +00:00
speciesTable->setItemDelegateForColumn(EncounterTableModel::ColumnType::Species, new SpeciesComboDelegate(editor->project, this));
speciesTable->setItemDelegateForColumn(EncounterTableModel::ColumnType::MinLevel, new SpinBoxDelegate(editor->project, this));
speciesTable->setItemDelegateForColumn(EncounterTableModel::ColumnType::MaxLevel, new SpinBoxDelegate(editor->project, this));
speciesTable->setItemDelegateForColumn(EncounterTableModel::ColumnType::EncounterRate, new SpinBoxDelegate(editor->project, this));
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::Slot, QHeaderView::ResizeToContents);
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::Group, QHeaderView::ResizeToContents);
2023-01-15 04:10:58 +00:00
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::Species, QHeaderView::Stretch);
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::MinLevel, QHeaderView::Stretch);
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::MaxLevel, QHeaderView::Stretch);
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::SlotRatio, QHeaderView::ResizeToContents);
2023-01-15 04:10:58 +00:00
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::EncounterChance, QHeaderView::ResizeToContents);
speciesTable->horizontalHeader()->setSectionResizeMode(EncounterTableModel::ColumnType::EncounterRate, QHeaderView::ResizeToContents);
2023-01-15 04:10:58 +00:00
// give enough vertical space for icons + margins
speciesTable->verticalHeader()->setMinimumSectionSize(40);
2023-01-15 04:10:58 +00:00
if (editor->project->wildMonFields[tabIndex].groups.empty()) {
speciesTable->setColumnHidden(1, true);
}
2023-01-15 04:10:58 +00:00
speciesTable->horizontalHeader()->show();
this->setTabActive(tabIndex, true);
}
2023-01-15 04:10:58 +00:00
QTableView *MonTabWidget::tableAt(int tabIndex) {
2024-08-27 04:53:08 +01:00
if (tabIndex < 0)
return nullptr;
2023-01-15 04:10:58 +00:00
return static_cast<QTableView *>(this->widget(tabIndex));
}
void MonTabWidget::setTabActive(int index, bool active) {
activeTabs[index] = active;
setTabEnabled(index, active);
2019-08-06 18:53:54 +01:00
if (!active) {
2023-01-19 18:06:27 +00:00
this->addDeleteTabButtons[index]->setIcon(QIcon(":/icons/add.ico"));
this->copyTabButtons[index]->hide();
2019-08-06 18:53:54 +01:00
} else {
2023-01-19 18:06:27 +00:00
this->addDeleteTabButtons[index]->setIcon(QIcon(":/icons/delete.ico"));
this->copyTabButtons[index]->show();
2019-08-06 18:53:54 +01:00
}
}