forked from mirror/openmw-tes3mp
Merge remote-tracking branch 'dteviot/Bug2344'
This commit is contained in:
commit
093c577895
9 changed files with 104 additions and 78 deletions
|
@ -239,24 +239,8 @@ void Launcher::MainDialog::changePage(QListWidgetItem *current, QListWidgetItem
|
||||||
current = previous;
|
current = previous;
|
||||||
|
|
||||||
int currentIndex = iconWidget->row(current);
|
int currentIndex = iconWidget->row(current);
|
||||||
// int previousIndex = iconWidget->row(previous);
|
|
||||||
|
|
||||||
pagesWidget->setCurrentIndex(currentIndex);
|
pagesWidget->setCurrentIndex(currentIndex);
|
||||||
|
mSettingsPage->resetProgressBar();
|
||||||
// DataFilesPage *previousPage = dynamic_cast<DataFilesPage *>(pagesWidget->widget(previousIndex));
|
|
||||||
// DataFilesPage *currentPage = dynamic_cast<DataFilesPage *>(pagesWidget->widget(currentIndex));
|
|
||||||
|
|
||||||
// //special call to update/save data files page list view when it's displayed/hidden.
|
|
||||||
// if (previousPage)
|
|
||||||
// {
|
|
||||||
// if (previousPage->objectName() == "DataFilesPage")
|
|
||||||
// previousPage->saveSettings();
|
|
||||||
// }
|
|
||||||
// else if (currentPage)
|
|
||||||
// {
|
|
||||||
// if (currentPage->objectName() == "DataFilesPage")
|
|
||||||
// currentPage->loadSettings();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Launcher::MainDialog::setupLauncherSettings()
|
bool Launcher::MainDialog::setupLauncherSettings()
|
||||||
|
|
|
@ -39,6 +39,7 @@ Launcher::SettingsPage::SettingsPage(Files::ConfigurationManager &cfg,
|
||||||
|
|
||||||
mWizardInvoker = new ProcessInvoker();
|
mWizardInvoker = new ProcessInvoker();
|
||||||
mImporterInvoker = new ProcessInvoker();
|
mImporterInvoker = new ProcessInvoker();
|
||||||
|
resetProgressBar();
|
||||||
|
|
||||||
connect(mWizardInvoker->getProcess(), SIGNAL(started()),
|
connect(mWizardInvoker->getProcess(), SIGNAL(started()),
|
||||||
this, SLOT(wizardStarted()));
|
this, SLOT(wizardStarted()));
|
||||||
|
@ -94,7 +95,7 @@ Launcher::SettingsPage::~SettingsPage()
|
||||||
|
|
||||||
void Launcher::SettingsPage::on_wizardButton_clicked()
|
void Launcher::SettingsPage::on_wizardButton_clicked()
|
||||||
{
|
{
|
||||||
saveSettings();
|
mMain->writeSettings();
|
||||||
|
|
||||||
if (!mWizardInvoker->startProcess(QLatin1String("openmw-wizard"), false))
|
if (!mWizardInvoker->startProcess(QLatin1String("openmw-wizard"), false))
|
||||||
return;
|
return;
|
||||||
|
@ -102,7 +103,7 @@ void Launcher::SettingsPage::on_wizardButton_clicked()
|
||||||
|
|
||||||
void Launcher::SettingsPage::on_importerButton_clicked()
|
void Launcher::SettingsPage::on_importerButton_clicked()
|
||||||
{
|
{
|
||||||
saveSettings();
|
mMain->writeSettings();
|
||||||
|
|
||||||
// Create the file if it doesn't already exist, else the importer will fail
|
// Create the file if it doesn't already exist, else the importer will fail
|
||||||
QString path(QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str()));
|
QString path(QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str()));
|
||||||
|
@ -141,8 +142,13 @@ void Launcher::SettingsPage::on_importerButton_clicked()
|
||||||
|
|
||||||
qDebug() << "arguments " << arguments;
|
qDebug() << "arguments " << arguments;
|
||||||
|
|
||||||
|
// start the progress bar as a "bouncing ball"
|
||||||
|
progressBar->setMaximum(0);
|
||||||
|
progressBar->setValue(0);
|
||||||
if (!mImporterInvoker->startProcess(QLatin1String("openmw-iniimporter"), arguments, false))
|
if (!mImporterInvoker->startProcess(QLatin1String("openmw-iniimporter"), arguments, false))
|
||||||
return;
|
{
|
||||||
|
resetProgressBar();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::SettingsPage::on_browseButton_clicked()
|
void Launcher::SettingsPage::on_browseButton_clicked()
|
||||||
|
@ -197,38 +203,35 @@ void Launcher::SettingsPage::importerStarted()
|
||||||
void Launcher::SettingsPage::importerFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
void Launcher::SettingsPage::importerFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||||
{
|
{
|
||||||
if (exitCode != 0 || exitStatus == QProcess::CrashExit)
|
if (exitCode != 0 || exitStatus == QProcess::CrashExit)
|
||||||
return;
|
|
||||||
|
|
||||||
// Importer may have changed settings, so refresh
|
|
||||||
mMain->reloadSettings();
|
|
||||||
|
|
||||||
// Import selected data files from openmw.cfg
|
|
||||||
if (addonsCheckBox->isChecked())
|
|
||||||
{
|
{
|
||||||
// Because we've reloaded settings, the current content list matches content in OpenMW.cfg
|
resetProgressBar();
|
||||||
QString oldContentListName = mLauncherSettings.getCurrentContentListName();
|
|
||||||
if (mProfileDialog->exec() == QDialog::Accepted)
|
|
||||||
{
|
|
||||||
// remove the current content list to prevent duplication
|
|
||||||
//... except, not allowed to delete the Default content list
|
|
||||||
if (oldContentListName.compare(DataFilesPage::mDefaultContentListName) != 0)
|
|
||||||
{
|
|
||||||
mLauncherSettings.removeContentList(oldContentListName);
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString newContentListName(mProfileDialog->lineEdit()->text());
|
QMessageBox msgBox;
|
||||||
const QStringList files(mGameSettings.getContentList());
|
msgBox.setWindowTitle(tr("Importer finished"));
|
||||||
mLauncherSettings.setCurrentContentListName(newContentListName);
|
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||||
mLauncherSettings.setContentList(newContentListName, files);
|
msgBox.setIcon(QMessageBox::Warning);
|
||||||
|
msgBox.setText(tr("Failed to import settings from INI file."));
|
||||||
|
msgBox.exec();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// indicate progress finished
|
||||||
|
progressBar->setMaximum(1);
|
||||||
|
progressBar->setValue(1);
|
||||||
|
|
||||||
// Make DataFiles Page load the new content list.
|
// Importer may have changed settings, so refresh
|
||||||
mMain->reloadSettings();
|
mMain->reloadSettings();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
importerButton->setEnabled(true);
|
importerButton->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Launcher::SettingsPage::resetProgressBar()
|
||||||
|
{
|
||||||
|
// set progress bar to 0 %
|
||||||
|
progressBar->reset();
|
||||||
|
}
|
||||||
|
|
||||||
void Launcher::SettingsPage::updateOkButton(const QString &text)
|
void Launcher::SettingsPage::updateOkButton(const QString &text)
|
||||||
{
|
{
|
||||||
// We do this here because we need to access the profiles
|
// We do this here because we need to access the profiles
|
||||||
|
|
|
@ -29,6 +29,9 @@ namespace Launcher
|
||||||
|
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
bool loadSettings();
|
bool loadSettings();
|
||||||
|
|
||||||
|
/// set progress bar on page to 0%
|
||||||
|
void resetProgressBar();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
@ -57,7 +60,6 @@ namespace Launcher
|
||||||
MainDialog *mMain;
|
MainDialog *mMain;
|
||||||
TextInputDialog *mProfileDialog;
|
TextInputDialog *mProfileDialog;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,12 @@ void Config::LauncherSettings::setContentList(const GameSettings& gameSettings)
|
||||||
// obtain content list from game settings (if present)
|
// obtain content list from game settings (if present)
|
||||||
const QStringList files(gameSettings.getContentList());
|
const QStringList files(gameSettings.getContentList());
|
||||||
|
|
||||||
|
// if openmw.cfg has no content, exit so we don't create an empty content list.
|
||||||
|
if (files.isEmpty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// if any existing profile in launcher matches the content list, make that profile the default
|
// if any existing profile in launcher matches the content list, make that profile the default
|
||||||
foreach(const QString &listName, getContentLists())
|
foreach(const QString &listName, getContentLists())
|
||||||
{
|
{
|
||||||
|
|
|
@ -110,15 +110,14 @@ Qt::ItemFlags ContentSelectorModel::ContentModel::flags(const QModelIndex &index
|
||||||
if (!file)
|
if (!file)
|
||||||
return Qt::NoItemFlags;
|
return Qt::NoItemFlags;
|
||||||
|
|
||||||
//game files can always be checked
|
//game files are not shown
|
||||||
if (file->isGameFile())
|
if (file->isGameFile())
|
||||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
|
return Qt::NoItemFlags;
|
||||||
|
|
||||||
Qt::ItemFlags returnFlags;
|
Qt::ItemFlags returnFlags;
|
||||||
bool allDependenciesFound = true;
|
|
||||||
bool gamefileChecked = false;
|
bool gamefileChecked = false;
|
||||||
|
|
||||||
//addon can be checked if its gamefile is and all other dependencies exist
|
// addon can be checked if its gamefile is
|
||||||
foreach (const QString &fileName, file->gameFiles())
|
foreach (const QString &fileName, file->gameFiles())
|
||||||
{
|
{
|
||||||
bool depFound = false;
|
bool depFound = false;
|
||||||
|
@ -144,16 +143,11 @@ Qt::ItemFlags ContentSelectorModel::ContentModel::flags(const QModelIndex &index
|
||||||
if (gamefileChecked || !(dependency->isGameFile()))
|
if (gamefileChecked || !(dependency->isGameFile()))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
allDependenciesFound = allDependenciesFound && depFound;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gamefileChecked)
|
if (gamefileChecked)
|
||||||
{
|
{
|
||||||
if (allDependenciesFound)
|
returnFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
|
||||||
returnFlags = returnFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
|
|
||||||
else
|
|
||||||
returnFlags = Qt::ItemIsSelectable;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnFlags;
|
return returnFlags;
|
||||||
|
@ -467,6 +461,14 @@ void ContentSelectorModel::ContentModel::addFiles(const QString &path)
|
||||||
file->setFilePath (info.absoluteFilePath());
|
file->setFilePath (info.absoluteFilePath());
|
||||||
file->setDescription(QString::fromUtf8(fileReader.getDesc().c_str()));
|
file->setDescription(QString::fromUtf8(fileReader.getDesc().c_str()));
|
||||||
|
|
||||||
|
// HACK
|
||||||
|
// Load order constraint of Bloodmoon.esm needing Tribunal.esm is missing
|
||||||
|
// from the file supplied by Bethesda, so we have to add it ourselves
|
||||||
|
if (file->fileName().compare("Bloodmoon.esm", Qt::CaseInsensitive) == 0)
|
||||||
|
{
|
||||||
|
file->addGameFile(QString::fromUtf8("Tribunal.esm"));
|
||||||
|
}
|
||||||
|
|
||||||
// Put the file in the table
|
// Put the file in the table
|
||||||
addFile(file);
|
addFile(file);
|
||||||
|
|
||||||
|
@ -481,6 +483,19 @@ void ContentSelectorModel::ContentModel::addFiles(const QString &path)
|
||||||
sortFiles();
|
sortFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList ContentSelectorModel::ContentModel::gameFiles() const
|
||||||
|
{
|
||||||
|
QStringList gameFiles;
|
||||||
|
foreach(const ContentSelectorModel::EsmFile *file, mFiles)
|
||||||
|
{
|
||||||
|
if (file->isGameFile())
|
||||||
|
{
|
||||||
|
gameFiles.append(file->fileName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gameFiles;
|
||||||
|
}
|
||||||
|
|
||||||
void ContentSelectorModel::ContentModel::sortFiles()
|
void ContentSelectorModel::ContentModel::sortFiles()
|
||||||
{
|
{
|
||||||
//first, sort the model such that all dependencies are ordered upstream (gamefile) first.
|
//first, sort the model such that all dependencies are ordered upstream (gamefile) first.
|
||||||
|
@ -536,13 +551,13 @@ bool ContentSelectorModel::ContentModel::isLoadOrderError(const EsmFile *file) c
|
||||||
return mPluginsWithLoadOrderError.contains(file->filePath());
|
return mPluginsWithLoadOrderError.contains(file->filePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentSelectorModel::ContentModel::setContentList(const QStringList &fileList, bool isChecked)
|
void ContentSelectorModel::ContentModel::setContentList(const QStringList &fileList)
|
||||||
{
|
{
|
||||||
mPluginsWithLoadOrderError.clear();
|
mPluginsWithLoadOrderError.clear();
|
||||||
int previousPosition = -1;
|
int previousPosition = -1;
|
||||||
foreach (const QString &filepath, fileList)
|
foreach (const QString &filepath, fileList)
|
||||||
{
|
{
|
||||||
if (setCheckState(filepath, isChecked))
|
if (setCheckState(filepath, true))
|
||||||
{
|
{
|
||||||
// as necessary, move plug-ins in visible list to match sequence of supplied filelist
|
// as necessary, move plug-ins in visible list to match sequence of supplied filelist
|
||||||
const EsmFile* file = item(filepath);
|
const EsmFile* file = item(filepath);
|
||||||
|
@ -581,7 +596,7 @@ void ContentSelectorModel::ContentModel::checkForLoadOrderErrors()
|
||||||
QList<ContentSelectorModel::LoadOrderError> ContentSelectorModel::ContentModel::checkForLoadOrderErrors(const EsmFile *file, int row) const
|
QList<ContentSelectorModel::LoadOrderError> ContentSelectorModel::ContentModel::checkForLoadOrderErrors(const EsmFile *file, int row) const
|
||||||
{
|
{
|
||||||
QList<LoadOrderError> errors = QList<LoadOrderError>();
|
QList<LoadOrderError> errors = QList<LoadOrderError>();
|
||||||
foreach(QString dependentfileName, file->gameFiles())
|
foreach(const QString &dependentfileName, file->gameFiles())
|
||||||
{
|
{
|
||||||
const EsmFile* dependentFile = item(dependentfileName);
|
const EsmFile* dependentFile = item(dependentfileName);
|
||||||
|
|
||||||
|
|
|
@ -47,11 +47,12 @@ namespace ContentSelectorModel
|
||||||
|
|
||||||
QModelIndex indexFromItem(const EsmFile *item) const;
|
QModelIndex indexFromItem(const EsmFile *item) const;
|
||||||
const EsmFile *item(const QString &name) const;
|
const EsmFile *item(const QString &name) const;
|
||||||
|
QStringList gameFiles() const;
|
||||||
|
|
||||||
bool isEnabled (QModelIndex index) const;
|
bool isEnabled (QModelIndex index) const;
|
||||||
bool isChecked(const QString &filepath) const;
|
bool isChecked(const QString &filepath) const;
|
||||||
bool setCheckState(const QString &filepath, bool isChecked);
|
bool setCheckState(const QString &filepath, bool isChecked);
|
||||||
void setContentList(const QStringList &fileList, bool isChecked);
|
void setContentList(const QStringList &fileList);
|
||||||
ContentFileList checkedItems() const;
|
ContentFileList checkedItems() const;
|
||||||
void uncheckAll();
|
void uncheckAll();
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QModelIndex>
|
#include <QModelIndex>
|
||||||
|
#include <QDir>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
ContentSelectorView::ContentSelector::ContentSelector(QWidget *parent) :
|
ContentSelectorView::ContentSelector::ContentSelector(QWidget *parent) :
|
||||||
|
@ -33,13 +34,7 @@ void ContentSelectorView::ContentSelector::buildGameFileView()
|
||||||
{
|
{
|
||||||
ui.gameFileView->setVisible (true);
|
ui.gameFileView->setVisible (true);
|
||||||
|
|
||||||
mGameFileProxyModel = new QSortFilterProxyModel(this);
|
|
||||||
mGameFileProxyModel->setFilterRegExp(QString::number((int)ContentSelectorModel::ContentType_GameFile));
|
|
||||||
mGameFileProxyModel->setFilterRole (Qt::UserRole);
|
|
||||||
mGameFileProxyModel->setSourceModel (mContentModel);
|
|
||||||
|
|
||||||
ui.gameFileView->setPlaceholderText(QString("Select a game file..."));
|
ui.gameFileView->setPlaceholderText(QString("Select a game file..."));
|
||||||
ui.gameFileView->setModel(mGameFileProxyModel);
|
|
||||||
|
|
||||||
connect (ui.gameFileView, SIGNAL (currentIndexChanged(int)),
|
connect (ui.gameFileView, SIGNAL (currentIndexChanged(int)),
|
||||||
this, SLOT (slotCurrentGameFileIndexChanged(int)));
|
this, SLOT (slotCurrentGameFileIndexChanged(int)));
|
||||||
|
@ -113,7 +108,7 @@ void ContentSelectorView::ContentSelector::setContentList(const QStringList &lis
|
||||||
slotCurrentGameFileIndexChanged (ui.gameFileView->currentIndex());
|
slotCurrentGameFileIndexChanged (ui.gameFileView->currentIndex());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mContentModel->setContentList(list, true);
|
mContentModel->setContentList(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentSelectorModel::ContentFileList
|
ContentSelectorModel::ContentFileList
|
||||||
|
@ -129,6 +124,15 @@ void ContentSelectorView::ContentSelector::addFiles(const QString &path)
|
||||||
{
|
{
|
||||||
mContentModel->addFiles(path);
|
mContentModel->addFiles(path);
|
||||||
|
|
||||||
|
// add any game files to the combo box
|
||||||
|
foreach(const QString gameFileName, mContentModel->gameFiles())
|
||||||
|
{
|
||||||
|
if (ui.gameFileView->findText(gameFileName) == -1)
|
||||||
|
{
|
||||||
|
ui.gameFileView->addItem(gameFileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ui.gameFileView->currentIndex() != -1)
|
if (ui.gameFileView->currentIndex() != -1)
|
||||||
ui.gameFileView->setCurrentIndex(-1);
|
ui.gameFileView->setCurrentIndex(-1);
|
||||||
|
|
||||||
|
@ -150,29 +154,33 @@ void ContentSelectorView::ContentSelector::slotCurrentGameFileIndexChanged(int i
|
||||||
{
|
{
|
||||||
static int oldIndex = -1;
|
static int oldIndex = -1;
|
||||||
|
|
||||||
QAbstractItemModel *const model = ui.gameFileView->model();
|
|
||||||
QSortFilterProxyModel *proxy = dynamic_cast<QSortFilterProxyModel *>(model);
|
|
||||||
|
|
||||||
if (proxy)
|
|
||||||
proxy->setDynamicSortFilter(false);
|
|
||||||
|
|
||||||
if (index != oldIndex)
|
if (index != oldIndex)
|
||||||
{
|
{
|
||||||
if (oldIndex > -1)
|
if (oldIndex > -1)
|
||||||
model->setData(model->index(oldIndex, 0), false, Qt::UserRole + 1);
|
{
|
||||||
|
setGameFileSelected(oldIndex, false);
|
||||||
|
}
|
||||||
|
|
||||||
oldIndex = index;
|
oldIndex = index;
|
||||||
|
|
||||||
model->setData(model->index(index, 0), true, Qt::UserRole + 1);
|
setGameFileSelected(index, true);
|
||||||
mContentModel->checkForLoadOrderErrors();
|
mContentModel->checkForLoadOrderErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proxy)
|
|
||||||
proxy->setDynamicSortFilter(true);
|
|
||||||
|
|
||||||
emit signalCurrentGamefileIndexChanged (index);
|
emit signalCurrentGamefileIndexChanged (index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContentSelectorView::ContentSelector::setGameFileSelected(int index, bool selected)
|
||||||
|
{
|
||||||
|
QString fileName = ui.gameFileView->itemText(index);
|
||||||
|
const ContentSelectorModel::EsmFile* file = mContentModel->item(fileName);
|
||||||
|
if (file != NULL)
|
||||||
|
{
|
||||||
|
QModelIndex index(mContentModel->indexFromItem(file));
|
||||||
|
mContentModel->setData(index, selected, Qt::UserRole + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ContentSelectorView::ContentSelector::slotAddonTableItemActivated(const QModelIndex &index)
|
void ContentSelectorView::ContentSelector::slotAddonTableItemActivated(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
QModelIndex sourceIndex = mAddonProxyModel->mapToSource (index);
|
QModelIndex sourceIndex = mAddonProxyModel->mapToSource (index);
|
||||||
|
|
|
@ -19,7 +19,6 @@ namespace ContentSelectorView
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
ContentSelectorModel::ContentModel *mContentModel;
|
ContentSelectorModel::ContentModel *mContentModel;
|
||||||
QSortFilterProxyModel *mGameFileProxyModel;
|
|
||||||
QSortFilterProxyModel *mAddonProxyModel;
|
QSortFilterProxyModel *mAddonProxyModel;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -52,6 +51,7 @@ namespace ContentSelectorView
|
||||||
void buildContentModel();
|
void buildContentModel();
|
||||||
void buildGameFileView();
|
void buildGameFileView();
|
||||||
void buildAddonView();
|
void buildAddonView();
|
||||||
|
void setGameFileSelected(int index, bool selected);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void signalCurrentGamefileIndexChanged (int);
|
void signalCurrentGamefileIndexChanged (int);
|
||||||
|
|
|
@ -131,6 +131,13 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QProgressBar" name="progressBar">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
Loading…
Reference in a new issue