First implementation of Headless (#4392)

* Revert "#4377 Octave : Use RiaLogging for error messages instead of QErrorMessage "

This reverts commit f758a8edb2.

* Revert "#4380 Preferences : Changing scene font size when geo mech view is open causes crash"

This reverts commit df62a41397.

* Revert "#4379 Documentation : Update command line parser for import of summary files"

This reverts commit d0b5357ed4.

* Unfinished WIP

* Builds but crashes

* Refactored code now builds and runs

* ResInsight can now run the unittests headless

* Can run some command files successfully

* Build on Linux

* Extra headless hack header

* Moved PdmUiItem hack to cpp file

* Fix headless crash in RimWellAllocationPlot

* Handle error gracefully if ExportSnapshots command is executed from console

* Add caf::QIconProvider and remove some hacks

* Also made the greying out of disabled icons work for a couple of cases where it didn't.

* Linux build fix

* #4380 Reimplement fix df62a41397 by @magnesj on top of Headless code changes

* #4379 Reintroduce kode from d0b5357ed4 by @magnesj

* #4377 Restore f758a8edb2 in new Headless code
This commit is contained in:
Gaute Lindkvist
2019-05-06 10:36:05 +02:00
committed by GitHub
parent 4c46573fc9
commit 57b33b0d4c
150 changed files with 4001 additions and 2804 deletions

View File

@@ -42,7 +42,7 @@
#include "cafPdmUiModelChangeDetector.h"
#include <QAction>
#include <QApplication>
namespace caf
{
@@ -106,7 +106,10 @@ QAction* CmdFeature::actionWithUserData(const QString& customText, const QVarian
action->setData(userData);
}
this->setupActionLook(action);
if (dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
this->setupActionLook(action);
}
if (!customText.isEmpty())
{
action->setText(customText);

View File

@@ -61,6 +61,7 @@ class QXmlStreamWriter;
#include "cafInternalPdmXmlFieldCapability.h"
#include "cafPdmUiFieldSpecialization.h"
#include "cafQIconProvider.h"
namespace caf
@@ -85,7 +86,7 @@ class PdmObjectCapability;
this->isInheritedFromPdmUiObject(); \
this->isInheritedFromPdmXmlSerializable(); \
\
static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis); \
static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis); \
this->setUiItemInfo(&objDescr); \
}
@@ -106,7 +107,7 @@ class PdmObjectCapability;
AddXmlCapabilityToField(field); \
AddUiCapabilityToField(field); \
\
static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis, keyword); \
static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis, keyword); \
addFieldUi(field, keyword, default, &objDescr); \
}
@@ -124,7 +125,7 @@ class PdmObjectCapability;
AddXmlCapabilityToField(field); \
AddUiCapabilityToField(field); \
\
static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis, keyword); \
static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis, keyword); \
addFieldUiNoDefault(field, keyword, &objDescr); \
}

View File

@@ -76,6 +76,8 @@ set( PROJECT_FILES
cafPdmUiSelection3dEditorVisualizer.cpp
cafQShortenedLabel.cpp
cafQShortenedLabel.h
cafQIconProvider.cpp
cafQIconProvider.h
)

View File

@@ -209,7 +209,7 @@ QList<PdmOptionItemInfo> caf::PdmFieldUiCap<FieldType>::valueOptions(bool* useOp
{
if(!uiBasedQVariant.toString().isEmpty())
{
m_optionEntryCache.push_front(PdmOptionItemInfo(uiBasedQVariant.toString(), uiBasedQVariant, true, QIcon()));
m_optionEntryCache.push_front(PdmOptionItemInfo(uiBasedQVariant.toString(), uiBasedQVariant, true));
}
}
else // The field value is a list of values
@@ -228,7 +228,7 @@ QList<PdmOptionItemInfo> caf::PdmFieldUiCap<FieldType>::valueOptions(bool* useOp
if(!isFound && !valuesSelectedInField[i].toString().isEmpty())
{
m_optionEntryCache.push_front(PdmOptionItemInfo(valuesSelectedInField[i].toString(), valuesSelectedInField[i], true, QIcon()));
m_optionEntryCache.push_front(PdmOptionItemInfo(valuesSelectedInField[i].toString(), valuesSelectedInField[i], true));
}
}
}

View File

@@ -41,17 +41,79 @@
namespace caf
{
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText,
const QVariant& aValue,
bool isReadOnly /* = false */,
QIcon anIcon /* = QIcon()*/)
PdmUiItemInfo::PdmUiItemInfo(const QString& uiName,
QIconProvider iconProvider /*= QIconProvider() */,
QString toolTip /*= ""*/,
QString whatsThis /*= ""*/,
QString extraDebugText /*= ""*/)
: m_uiName(uiName)
, m_iconProvider(iconProvider)
, m_toolTip(toolTip)
, m_whatsThis(whatsThis)
, m_extraDebugText(extraDebugText)
, m_editorTypeName("")
, m_isHidden(false)
, m_isTreeChildrenHidden(false)
, m_isReadOnly(false)
, m_labelAlignment(LEFT)
, m_isCustomContextMenuEnabled(false)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmUiItemInfo::PdmUiItemInfo(const QString& uiName,
QString iconResourceLocation /*= ""*/,
QString toolTip /*= ""*/,
QString whatsThis /*= ""*/,
QString extraDebugText /*= ""*/)
: m_uiName(uiName)
, m_iconProvider(iconResourceLocation)
, m_toolTip(toolTip)
, m_whatsThis(whatsThis)
, m_extraDebugText(extraDebugText)
, m_editorTypeName("")
, m_isHidden(false)
, m_isTreeChildrenHidden(false)
, m_isReadOnly(false)
, m_labelAlignment(LEFT)
, m_isCustomContextMenuEnabled(false)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIcon PdmUiItemInfo::icon() const
{
return m_iconProvider.icon();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const QIconProvider& PdmUiItemInfo::iconProvider() const
{
return m_iconProvider;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText,
const QVariant& aValue,
bool isReadOnly /* = false */,
const QIconProvider& anIcon /* = QIconProvider()*/)
: m_optionUiText(anOptionUiText)
, m_value(aValue)
, m_isReadOnly(isReadOnly)
, m_icon(anIcon)
, m_iconProvider(anIcon)
, m_level(0)
{
}
@@ -62,10 +124,10 @@ PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText,
PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText,
caf::PdmObjectHandle* obj,
bool isReadOnly /*= false*/,
QIcon anIcon /*= QIcon()*/)
const QIconProvider& anIcon /*= QIconProvider()*/)
: m_optionUiText(anOptionUiText)
, m_isReadOnly(isReadOnly)
, m_icon(anIcon)
, m_iconProvider(anIcon)
, m_level(0)
{
m_value = QVariant::fromValue(caf::PdmPointer<caf::PdmObjectHandle>(obj));
@@ -75,7 +137,7 @@ PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText,
///
//--------------------------------------------------------------------------------------------------
PdmOptionItemInfo
PdmOptionItemInfo::createHeader(const QString& anOptionUiText, bool isReadOnly /*= false*/, QIcon anIcon /*= QIcon()*/)
PdmOptionItemInfo::createHeader(const QString& anOptionUiText, bool isReadOnly /*= false*/, const QIconProvider& anIcon /*= QIconProvider()*/)
{
PdmOptionItemInfo header(anOptionUiText, QVariant(), isReadOnly, anIcon);
@@ -127,7 +189,7 @@ bool PdmOptionItemInfo::isHeading() const
//--------------------------------------------------------------------------------------------------
const QIcon PdmOptionItemInfo::icon() const
{
return m_icon;
return m_iconProvider.icon();
}
//--------------------------------------------------------------------------------------------------
@@ -188,23 +250,38 @@ void PdmUiItem::setUiName(const QString& uiName, const QString& uiConfigName /*=
//--------------------------------------------------------------------------------------------------
const QIcon PdmUiItem::uiIcon(const QString& uiConfigName) const
{
const PdmUiItemInfo* conInfo = configInfo(uiConfigName);
const PdmUiItemInfo* defInfo = defaultInfo();
const PdmUiItemInfo* sttInfo = m_staticItemInfo;
if (conInfo && !(conInfo->m_icon.isNull())) return conInfo->m_icon;
if (defInfo && !(defInfo->m_icon.isNull())) return defInfo->m_icon;
if (sttInfo && !(sttInfo->m_icon.isNull())) return sttInfo->m_icon;
return QIcon();
return uiIconProvider(uiConfigName).icon();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiItem::setUiIcon(const QIcon& uiIcon, const QString& uiConfigName /*= ""*/)
const QIconProvider PdmUiItem::uiIconProvider(const QString& uiConfigName) const
{
m_configItemInfos[uiConfigName].m_icon = uiIcon;
const PdmUiItemInfo* conInfo = configInfo(uiConfigName);
const PdmUiItemInfo* defInfo = defaultInfo();
const PdmUiItemInfo* sttInfo = m_staticItemInfo;
if (conInfo && !(conInfo->iconProvider().isNull())) return conInfo->iconProvider();
if (defInfo && !(defInfo->iconProvider().isNull())) return defInfo->iconProvider();
if (sttInfo && !(sttInfo->iconProvider().isNull())) return sttInfo->iconProvider();
return QIconProvider();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiItem::setUiIcon(const QIconProvider& uiIconProvider, const QString& uiConfigName /*= ""*/)
{
m_configItemInfos[uiConfigName].m_iconProvider = uiIconProvider;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiItem::setUiIcon(const QString& uiIconResourceName, const QString& uiConfigName /*= ""*/)
{
setUiIcon(caf::QIconProvider(uiIconResourceName), uiConfigName);
}
//--------------------------------------------------------------------------------------------------
@@ -575,32 +652,9 @@ PdmUiItem::PdmUiItem()
//--------------------------------------------------------------------------------------------------
void PdmUiItem::updateUiIconFromState(bool isActive, const QString& uiConfigName)
{
static const QString iconStorageConfigNamePostfix = "_Internally_StoredNormalIcon";
const PdmUiItemInfo* conInfo = configInfo(uiConfigName + iconStorageConfigNamePostfix);
QIcon normalIcon;
if (conInfo)
{
normalIcon = conInfo->m_icon;
}
else
{
normalIcon = this->uiIcon(uiConfigName);
}
this->setUiIcon(normalIcon, uiConfigName + iconStorageConfigNamePostfix);
if (isActive)
{
this->setUiIcon(normalIcon, uiConfigName);
m_configItemInfos.erase(uiConfigName + iconStorageConfigNamePostfix);
}
else
{
QIcon disabledIcon(normalIcon.pixmap(16, 16, QIcon::Disabled));
this->setUiIcon(disabledIcon, uiConfigName);
this->setUiIcon(normalIcon, uiConfigName + iconStorageConfigNamePostfix);
}
QIconProvider normalIconProvider = this->uiIconProvider(uiConfigName);
normalIconProvider.setActive(isActive);
this->setUiIcon(normalIconProvider, uiConfigName);
}
//--------------------------------------------------------------------------------------------------

View File

@@ -38,9 +38,10 @@
#pragma once
#include "cafPdmUiFieldSpecialization.h"
#include "cafQIconProvider.h"
#include <QApplication>
#include <QString>
#include <QIcon>
#include <QVariant>
#include <set>
@@ -55,6 +56,13 @@ namespace caf
class PdmUiItemInfo
{
public:
enum LabelPosType
{
LEFT,
TOP,
HIDDEN
};
PdmUiItemInfo()
: m_editorTypeName("")
, m_isHidden(-1)
@@ -64,26 +72,25 @@ public:
, m_isCustomContextMenuEnabled(-1)
{}
PdmUiItemInfo(const QString& uiName, QIcon icon = QIcon(), QString toolTip = "", QString whatsThis = "", QString extraDebugText = "")
: m_uiName(uiName)
, m_icon(icon)
, m_toolTip(toolTip)
, m_whatsThis(whatsThis)
, m_extraDebugText(extraDebugText)
, m_editorTypeName("")
, m_isHidden(false)
, m_isTreeChildrenHidden(false)
, m_isReadOnly(false)
, m_labelAlignment(LEFT)
, m_isCustomContextMenuEnabled(false)
{ }
PdmUiItemInfo(const QString& uiName,
QString iconResourceLocation = "",
QString toolTip = "",
QString whatsThis = "",
QString extraDebugText = "");
enum LabelPosType { LEFT, TOP, HIDDEN };
PdmUiItemInfo(const QString& uiName,
QIconProvider iconProvider = QIconProvider(),
QString toolTip = "",
QString whatsThis = "",
QString extraDebugText = "");
QIcon icon() const;
const QIconProvider& iconProvider() const;
private:
friend class PdmUiItem;
QString m_uiName;
QIcon m_icon;
QIconProvider m_iconProvider;
QColor m_contentTextColor; ///< Color of a fields value text. Invalid by default. An Invalid color is not used.
QString m_toolTip;
QString m_whatsThis;
@@ -104,10 +111,10 @@ private:
class PdmOptionItemInfo
{
public:
PdmOptionItemInfo(const QString& anOptionUiText, const QVariant& aValue, bool isReadOnly = false, QIcon anIcon = QIcon());
PdmOptionItemInfo(const QString& anOptionUiText, caf::PdmObjectHandle* obj, bool isReadOnly = false, QIcon anIcon = QIcon());
PdmOptionItemInfo(const QString& anOptionUiText, const QVariant& aValue, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider());
PdmOptionItemInfo(const QString& anOptionUiText, caf::PdmObjectHandle* obj, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider());
static PdmOptionItemInfo createHeader(const QString& anOptionUiText, bool isReadOnly = false, QIcon anIcon = QIcon());
static PdmOptionItemInfo createHeader(const QString& anOptionUiText, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider());
void setLevel(int level);
@@ -128,11 +135,11 @@ public:
std::vector<unsigned int>& foundIndexes);
private:
QString m_optionUiText;
QVariant m_value;
bool m_isReadOnly;
QIcon m_icon;
int m_level;
QString m_optionUiText;
QVariant m_value;
bool m_isReadOnly;
QIconProvider m_iconProvider;
int m_level;
};
class PdmUiEditorHandle;
@@ -217,8 +224,10 @@ public:
const QString uiName(const QString& uiConfigName = "") const;
void setUiName(const QString& uiName, const QString& uiConfigName = "");
const QIcon uiIcon(const QString& uiConfigName = "") const;
void setUiIcon(const QIcon& uiIcon, const QString& uiConfigName = "");
const QIcon uiIcon(const QString& uiConfigName = "") const;
const QIconProvider uiIconProvider(const QString& uiConfigName = "") const;
void setUiIcon(const QIconProvider& uiIcon, const QString& uiConfigName = "");
void setUiIcon(const QString& uiIconResourceName, const QString& uiConfigName = "");
const QColor uiContentTextColor(const QString& uiConfigName = "") const;
void setUiContentTextColor(const QColor& uiIcon, const QString& uiConfigName = "");

View File

@@ -179,7 +179,7 @@ PdmUiTreeOrdering::PdmUiTreeOrdering(const QString & title, const QString& iconR
{
m_uiItem = new PdmUiItem();
m_uiItem->setUiName(title);
m_uiItem->setUiIcon(QIcon(iconResourceName));
m_uiItem->setUiIcon(QIconProvider(iconResourceName));
}
//--------------------------------------------------------------------------------------------------

View File

@@ -0,0 +1,137 @@
#include "cafQIconProvider.h"
#include "cafAssert.h"
#include <QApplication>
using namespace caf;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIconProvider::QIconProvider()
: m_active(true)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIconProvider::QIconProvider(const QString& iconResourceString)
: m_active(true)
, m_iconResourceString(iconResourceString)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIconProvider::QIconProvider(const QPixmap& pixmap)
: m_iconPixmap(pixmap)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIconProvider::QIconProvider(const QIconProvider& rhs)
: m_icon(rhs.m_icon)
, m_active(rhs.m_active)
, m_iconResourceString(rhs.m_iconResourceString)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIconProvider& QIconProvider::operator=(const QIconProvider& rhs)
{
m_icon = rhs.m_icon;
m_active = rhs.m_active;
m_iconResourceString = rhs.m_iconResourceString;
return *this;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QIcon QIconProvider::icon() const
{
if (m_icon.isNull())
{
m_icon = generateIcon();
}
if (!m_active)
{
QPixmap disabledPixmap = m_icon.pixmap(16, 16, QIcon::Disabled);
return QIcon(disabledPixmap);
}
return m_icon;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool QIconProvider::isNull() const
{
if (!isGuiApplication()) return true;
if (m_iconPixmap.isNull() && m_iconResourceString.isEmpty()) return true;
return icon().isNull();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void QIconProvider::setActive(bool active)
{
m_active = active;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void QIconProvider::setIconResourceString(const QString& iconResourceString)
{
m_iconResourceString = iconResourceString;
m_icon = QIcon();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void QIconProvider::setPixmap(const QPixmap& pixmap)
{
m_iconPixmap = pixmap;
m_icon = QIcon();
}
//--------------------------------------------------------------------------------------------------
/// Generate the actual icon. Will generate a NULL-icon if a QtGuiApplication isn't running.
/// Override in a sub-class if you want to generate a custom icon procedurally
//--------------------------------------------------------------------------------------------------
QIcon QIconProvider::generateIcon() const
{
if (isGuiApplication())
{
if (!m_iconPixmap.isNull())
{
return QIcon(m_iconPixmap);
}
return QIcon(m_iconResourceString);
}
return QIcon();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool QIconProvider::isGuiApplication()
{
return dynamic_cast<QApplication*>(QCoreApplication::instance()) != nullptr;
}

View File

@@ -0,0 +1,73 @@
//##################################################################################################
//
// Custom Visualization Core library
// Copyright (C) 2019- Ceetron Solutions AS
//
// This library may be used under the terms of either the GNU General Public License or
// the GNU Lesser General Public License as follows:
//
// GNU General Public License Usage
// This library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <<http://www.gnu.org/licenses/gpl.html>>
// for more details.
//
// GNU Lesser General Public License Usage
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
// for more details.
//
//##################################################################################################
#pragma once
#include <QIcon>
#include <QPixmap>
#include <QString>
namespace caf
{
//==================================================================================================
/// Utility class to provide QIcons when required. Qt crashes if a non-empty QIcon is created
/// ... without a GUI Application running. So create the icon on demand instead.
//==================================================================================================
class QIconProvider
{
public:
QIconProvider();
QIconProvider(const QString& iconResourceString);
QIconProvider(const QPixmap& pixmap);
QIconProvider(const QIconProvider& rhs);
QIconProvider& operator=(const QIconProvider& rhs);
QIcon icon() const;
virtual bool isNull() const;
void setActive(bool active);
void setIconResourceString(const QString& iconResourceString);
void setPixmap(const QPixmap& pixmap);
protected:
virtual QIcon generateIcon() const;
static bool isGuiApplication();
protected:
QString m_iconResourceString;
QPixmap m_iconPixmap;
mutable QIcon m_icon;
bool m_active;
};
}

View File

@@ -40,6 +40,7 @@
#include "cafMemoryInspector.h"
#include "cafProgressState.h"
#include <QApplication>
#include <QPointer>
#include <QProgressDialog>
#include <QCoreApplication>
@@ -115,7 +116,7 @@ namespace caf {
{
ProgressInfoStatic::start(maxProgressValue, title, delayShowingProgress);
if (qApp)
if (dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
}
@@ -128,7 +129,7 @@ namespace caf {
{
ProgressInfoStatic::finished();
if (qApp)
if (dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
QApplication::restoreOverrideCursor();
}
@@ -228,7 +229,7 @@ namespace caf {
static QProgressDialog* progressDialog()
{
static QPointer<QProgressDialog> progDialog;
if (progDialog.isNull())
if (progDialog.isNull() && dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
progDialog = new QProgressDialog(nullptr, Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
@@ -467,19 +468,24 @@ namespace caf {
std::vector<size_t>& progressSpanStack_v = progressSpanStack();
std::vector<size_t>& maxProgressStack_v = maxProgressStack();
QProgressDialog* dialog = progressDialog();
if (!maxProgressStack_v.size())
{
//progressDialog()->setWindowModality(Qt::ApplicationModal);
progressDialog()->setMinimum(0);
progressDialog()->setWindowTitle(title);
progressDialog()->setCancelButton(nullptr);
if (delayShowingProgress)
if (dialog)
{
progressDialog()->setMinimumDuration(1000);
}
else
{
progressDialog()->show();
dialog->setMinimum(0);
dialog->setWindowTitle(title);
dialog->setCancelButton(nullptr);
if (delayShowingProgress)
{
dialog->setMinimumDuration(1000);
}
else
{
dialog->show();
}
}
}
@@ -489,10 +495,12 @@ namespace caf {
titleStack().push_back(title);
descriptionStack().push_back("");
progressDialog()->setMaximum(static_cast<int>(currentTotalMaxProgressValue()));
progressDialog()->setValue(static_cast<int>(currentTotalProgress()));
progressDialog()->setLabelText(currentComposedLabel());
if (dialog)
{
dialog->setMaximum(static_cast<int>(currentTotalMaxProgressValue()));
dialog->setValue(static_cast<int>(currentTotalProgress()));
dialog->setLabelText(currentComposedLabel());
}
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
}
@@ -506,7 +514,11 @@ namespace caf {
descriptionStack().back() = description;
progressDialog()->setLabelText(currentComposedLabel());
QProgressDialog* dialog = progressDialog();
if (dialog)
{
dialog->setLabelText(currentComposedLabel());
}
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
@@ -546,8 +558,12 @@ namespace caf {
totalProgress = totalMaxProgress;
}
progressDialog()->setMaximum(totalMaxProgress);
progressDialog()->setValue(totalProgress);
QProgressDialog* dialog = progressDialog();
if (dialog)
{
dialog->setMaximum(totalMaxProgress);
dialog->setValue(totalProgress);
}
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
@@ -623,15 +639,19 @@ namespace caf {
descriptionStack().pop_back();
// Update the text to reflect the "previous level"
progressDialog()->setLabelText(currentComposedLabel());
QProgressDialog* dialog = progressDialog();
if (dialog)
{
dialog->setLabelText(currentComposedLabel());
}
// If we are finishing the last level, clean up
if (maxProgressStack_v.empty())
{
if (progressDialog() != nullptr)
if (dialog)
{
progressDialog()->reset();
progressDialog()->close();
dialog->reset();
dialog->close();
}
}
else
@@ -649,11 +669,15 @@ namespace caf {
{
if (s_disabled) return false;
if (!qApp) return false;
if (!progressDialog()) return false;
return progressDialog()->thread() == QThread::currentThread();
if (dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
QProgressDialog* dialog = progressDialog();
if (dialog)
{
return dialog->thread() == QThread::currentThread();
}
}
return false;
}
} // namespace caf

View File

@@ -37,6 +37,7 @@
#pragma once
#include "cvfBase.h"
#include "cvfObject.h"
#include "cvfFont.h"
#include "cvfGlyph.h"