mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 21:39:41 +00:00
Allow multiselect in the archives tab (#7606)
This commit is contained in:
parent
093d86353f
commit
c90ebcc86b
4 changed files with 261 additions and 164 deletions
|
@ -166,6 +166,7 @@
|
||||||
Feature #7546: Start the game on Fredas
|
Feature #7546: Start the game on Fredas
|
||||||
Feature #7554: Controller binding for tab for menu navigation
|
Feature #7554: Controller binding for tab for menu navigation
|
||||||
Feature #7568: Uninterruptable scripted music
|
Feature #7568: Uninterruptable scripted music
|
||||||
|
Feature #7606: Launcher: allow Shift-select in Archives tab
|
||||||
Feature #7608: Make the missing dependencies warning when loading a savegame more helpful
|
Feature #7608: Make the missing dependencies warning when loading a savegame more helpful
|
||||||
Feature #7618: Show the player character's health in the save details
|
Feature #7618: Show the player character's health in the save details
|
||||||
Feature #7625: Add some missing console error outputs
|
Feature #7625: Add some missing console error outputs
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include <QList>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QPair>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -162,8 +164,8 @@ Launcher::DataFilesPage::DataFilesPage(const Files::ConfigurationManager& cfg, C
|
||||||
connect(ui.directoryUpButton, &QPushButton::released, this, [this]() { this->moveDirectory(-1); });
|
connect(ui.directoryUpButton, &QPushButton::released, this, [this]() { this->moveDirectory(-1); });
|
||||||
connect(ui.directoryDownButton, &QPushButton::released, this, [this]() { this->moveDirectory(1); });
|
connect(ui.directoryDownButton, &QPushButton::released, this, [this]() { this->moveDirectory(1); });
|
||||||
connect(ui.directoryRemoveButton, &QPushButton::released, this, [this]() { this->removeDirectory(); });
|
connect(ui.directoryRemoveButton, &QPushButton::released, this, [this]() { this->removeDirectory(); });
|
||||||
connect(ui.archiveUpButton, &QPushButton::released, this, [this]() { this->moveArchive(-1); });
|
connect(ui.archiveUpButton, &QPushButton::released, this, [this]() { this->moveArchives(-1); });
|
||||||
connect(ui.archiveDownButton, &QPushButton::released, this, [this]() { this->moveArchive(1); });
|
connect(ui.archiveDownButton, &QPushButton::released, this, [this]() { this->moveArchives(1); });
|
||||||
connect(
|
connect(
|
||||||
ui.directoryListWidget->model(), &QAbstractItemModel::rowsMoved, this, [this]() { this->sortDirectories(); });
|
ui.directoryListWidget->model(), &QAbstractItemModel::rowsMoved, this, [this]() { this->sortDirectories(); });
|
||||||
|
|
||||||
|
@ -218,6 +220,18 @@ void Launcher::DataFilesPage::buildView()
|
||||||
&DataFilesPage::readNavMeshToolStderr);
|
&DataFilesPage::readNavMeshToolStderr);
|
||||||
connect(mNavMeshToolInvoker->getProcess(), qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this,
|
connect(mNavMeshToolInvoker->getProcess(), qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this,
|
||||||
&DataFilesPage::navMeshToolFinished);
|
&DataFilesPage::navMeshToolFinished);
|
||||||
|
|
||||||
|
buildArchiveContextMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::DataFilesPage::buildArchiveContextMenu()
|
||||||
|
{
|
||||||
|
connect(ui.archiveListWidget, &QListWidget::customContextMenuRequested, this,
|
||||||
|
&DataFilesPage::slotShowArchiveContextMenu);
|
||||||
|
|
||||||
|
mArchiveContextMenu = new QMenu(ui.archiveListWidget);
|
||||||
|
mArchiveContextMenu->addAction(tr("&Check Selected"), this, SLOT(slotCheckMultiSelectedItems()));
|
||||||
|
mArchiveContextMenu->addAction(tr("&Uncheck Selected"), this, SLOT(slotUncheckMultiSelectedItems()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Launcher::DataFilesPage::loadSettings()
|
bool Launcher::DataFilesPage::loadSettings()
|
||||||
|
@ -707,17 +721,71 @@ void Launcher::DataFilesPage::removeDirectory()
|
||||||
refreshDataFilesView();
|
refreshDataFilesView();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::DataFilesPage::moveArchive(int step)
|
void Launcher::DataFilesPage::slotShowArchiveContextMenu(const QPoint& pos)
|
||||||
{
|
{
|
||||||
int selectedRow = ui.archiveListWidget->currentRow();
|
QPoint globalPos = ui.archiveListWidget->viewport()->mapToGlobal(pos);
|
||||||
|
mArchiveContextMenu->exec(globalPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::DataFilesPage::setCheckStateForMultiSelectedItems(bool checked)
|
||||||
|
{
|
||||||
|
Qt::CheckState checkState = checked ? Qt::Checked : Qt::Unchecked;
|
||||||
|
|
||||||
|
for (QListWidgetItem* selectedItem : ui.archiveListWidget->selectedItems())
|
||||||
|
{
|
||||||
|
selectedItem->setCheckState(checkState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::DataFilesPage::slotUncheckMultiSelectedItems()
|
||||||
|
{
|
||||||
|
setCheckStateForMultiSelectedItems(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::DataFilesPage::slotCheckMultiSelectedItems()
|
||||||
|
{
|
||||||
|
setCheckStateForMultiSelectedItems(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::DataFilesPage::moveArchives(int step)
|
||||||
|
{
|
||||||
|
QList<QListWidgetItem*> selectedItems = ui.archiveListWidget->selectedItems();
|
||||||
|
QList<QPair<int, QListWidgetItem*>> sortedItems;
|
||||||
|
|
||||||
|
for (QListWidgetItem* selectedItem : selectedItems)
|
||||||
|
{
|
||||||
|
int selectedRow = ui.archiveListWidget->row(selectedItem);
|
||||||
|
sortedItems.append(qMakePair(selectedRow, selectedItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (step > 0)
|
||||||
|
{
|
||||||
|
std::sort(sortedItems.begin(), sortedItems.end(), [](auto a, auto b) { return a.first > b.first; });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::sort(sortedItems.begin(), sortedItems.end(), [](auto a, auto b) { return a.first < b.first; });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i : sortedItems)
|
||||||
|
{
|
||||||
|
if (!moveArchive(i.second, step))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Launcher::DataFilesPage::moveArchive(QListWidgetItem* listItem, int step)
|
||||||
|
{
|
||||||
|
int selectedRow = ui.archiveListWidget->row(listItem);
|
||||||
int newRow = selectedRow + step;
|
int newRow = selectedRow + step;
|
||||||
if (selectedRow == -1 || newRow < 0 || newRow > ui.archiveListWidget->count() - 1)
|
if (selectedRow == -1 || newRow < 0 || newRow > ui.archiveListWidget->count() - 1)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
const auto* item = ui.archiveListWidget->takeItem(selectedRow);
|
const QListWidgetItem* item = ui.archiveListWidget->takeItem(selectedRow);
|
||||||
|
|
||||||
addArchive(item->text(), item->checkState(), newRow);
|
addArchive(item->text(), item->checkState(), newRow);
|
||||||
ui.archiveListWidget->setCurrentRow(newRow);
|
ui.archiveListWidget->setCurrentRow(newRow);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::DataFilesPage::addArchive(const QString& name, Qt::CheckState selected, int row)
|
void Launcher::DataFilesPage::addArchive(const QString& name, Qt::CheckState selected, int row)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <components/process/processinvoker.hpp>
|
#include <components/process/processinvoker.hpp>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QMenu>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ namespace Launcher
|
||||||
|
|
||||||
ContentSelectorView::ContentSelector* mSelector;
|
ContentSelectorView::ContentSelector* mSelector;
|
||||||
Ui::DataFilesPage ui;
|
Ui::DataFilesPage ui;
|
||||||
|
QMenu* mArchiveContextMenu;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DataFilesPage(const Files::ConfigurationManager& cfg, Config::GameSettings& gameSettings,
|
explicit DataFilesPage(const Files::ConfigurationManager& cfg, Config::GameSettings& gameSettings,
|
||||||
|
@ -72,9 +74,13 @@ namespace Launcher
|
||||||
void addSubdirectories(bool append);
|
void addSubdirectories(bool append);
|
||||||
void sortDirectories();
|
void sortDirectories();
|
||||||
void removeDirectory();
|
void removeDirectory();
|
||||||
void moveArchive(int step);
|
void moveArchives(int step);
|
||||||
void moveDirectory(int step);
|
void moveDirectory(int step);
|
||||||
|
|
||||||
|
void slotShowArchiveContextMenu(const QPoint& pos);
|
||||||
|
void slotCheckMultiSelectedItems();
|
||||||
|
void slotUncheckMultiSelectedItems();
|
||||||
|
|
||||||
void on_newProfileAction_triggered();
|
void on_newProfileAction_triggered();
|
||||||
void on_cloneProfileAction_triggered();
|
void on_cloneProfileAction_triggered();
|
||||||
void on_deleteProfileAction_triggered();
|
void on_deleteProfileAction_triggered();
|
||||||
|
@ -120,7 +126,10 @@ namespace Launcher
|
||||||
|
|
||||||
void addArchive(const QString& name, Qt::CheckState selected, int row = -1);
|
void addArchive(const QString& name, Qt::CheckState selected, int row = -1);
|
||||||
void addArchivesFromDir(const QString& dir);
|
void addArchivesFromDir(const QString& dir);
|
||||||
|
bool moveArchive(QListWidgetItem* listItem, int step);
|
||||||
void buildView();
|
void buildView();
|
||||||
|
void buildArchiveContextMenu();
|
||||||
|
void setCheckStateForMultiSelectedItems(bool checked);
|
||||||
void setProfile(int index, bool savePrevious);
|
void setProfile(int index, bool savePrevious);
|
||||||
void setProfile(const QString& previous, const QString& current, bool savePrevious);
|
void setProfile(const QString& previous, const QString& current, bool savePrevious);
|
||||||
void removeProfile(const QString& profile);
|
void removeProfile(const QString& profile);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>573</width>
|
<width>573</width>
|
||||||
<height>384</height>
|
<height>557</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy">
|
<property name="contextMenuPolicy">
|
||||||
|
@ -29,6 +29,12 @@
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="dataNoteLabel">
|
<widget class="QLabel" name="dataNoteLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p>note: content files that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
<string><html><head/><body><p>note: content files that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
@ -41,34 +47,17 @@
|
||||||
<string>Data Directories</string>
|
<string>Data Directories</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="dirTabLayout">
|
<layout class="QGridLayout" name="dirTabLayout">
|
||||||
<item row="0" column="0" rowspan="26">
|
<item row="0" column="0">
|
||||||
<widget class="QListWidget" name="directoryListWidget">
|
<widget class="QListWidget" name="directoryListWidget">
|
||||||
<property name="dragDropMode">
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::InternalMove</enum>
|
<enum>QAbstractItemView::InternalMove</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="32" column="0" colspan="2">
|
|
||||||
<widget class="QLabel" name="directoryNoteLabel">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string><html><head/><body><p>note: directories that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
|
<layout class="QVBoxLayout" name="directoryButtons">
|
||||||
|
<item>
|
||||||
<widget class="QPushButton" name="directoryAddSubdirsButton">
|
<widget class="QPushButton" name="directoryAddSubdirsButton">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>33</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
@ -83,14 +72,8 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item>
|
||||||
<widget class="QPushButton" name="directoryInsertButton">
|
<widget class="QPushButton" name="directoryInsertButton">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>33</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
@ -105,14 +88,8 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item>
|
||||||
<widget class="QPushButton" name="directoryUpButton">
|
<widget class="QPushButton" name="directoryUpButton">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>33</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
@ -127,14 +104,8 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="1">
|
<item>
|
||||||
<widget class="QPushButton" name="directoryDownButton">
|
<widget class="QPushButton" name="directoryDownButton">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>33</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
@ -149,14 +120,8 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="1">
|
<item>
|
||||||
<widget class="QPushButton" name="directoryRemoveButton">
|
<widget class="QPushButton" name="directoryRemoveButton">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>33</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
@ -171,6 +136,34 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="directoryButtonsSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="directoryNoteLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string><html><head/><body><p>note: directories that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="archiveTab">
|
<widget class="QWidget" name="archiveTab">
|
||||||
|
@ -178,14 +171,25 @@
|
||||||
<string>Archive Files</string>
|
<string>Archive Files</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="archiveTabLayout">
|
<layout class="QGridLayout" name="archiveTabLayout">
|
||||||
<item row="0" column="0" rowspan="26">
|
<item row="0" column="0">
|
||||||
<widget class="QListWidget" name="archiveListWidget">
|
<widget class="QListWidget" name="archiveListWidget">
|
||||||
|
<property name="contextMenuPolicy">
|
||||||
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
|
</property>
|
||||||
<property name="dragDropMode">
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::InternalMove</enum>
|
<enum>QAbstractItemView::InternalMove</enum>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="defaultDropAction">
|
||||||
|
<enum>Qt::CopyAction</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
|
<layout class="QVBoxLayout" name="archiveButtons">
|
||||||
|
<item>
|
||||||
<widget class="QPushButton" name="archiveUpButton">
|
<widget class="QPushButton" name="archiveUpButton">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
@ -207,14 +211,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="27" column="0" colspan="2">
|
<item>
|
||||||
<widget class="QLabel" name="archiveNoteLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string><html><head/><body><p>note: archives that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QPushButton" name="archiveDownButton">
|
<widget class="QPushButton" name="archiveDownButton">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
@ -236,6 +233,28 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="archiveButtonsSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="archiveNoteLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string><html><head/><body><p>note: archives that are not part of current Content List are <span style=" font-style:italic;font-weight: bold">highlighted</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="navigationMeshCacheTab">
|
<widget class="QWidget" name="navigationMeshCacheTab">
|
||||||
|
|
Loading…
Reference in a new issue