mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
First implementation of Headless (#4392)
* Revert "#4377 Octave : Use RiaLogging for error messages instead of QErrorMessage " This reverts commitf758a8edb2. * Revert "#4380 Preferences : Changing scene font size when geo mech view is open causes crash" This reverts commitdf62a41397. * Revert "#4379 Documentation : Update command line parser for import of summary files" This reverts commitd0b5357ed4. * 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 fixdf62a41397by @magnesj on top of Headless code changes * #4379 Reintroduce kode fromd0b5357ed4by @magnesj * #4377 Restoref758a8edb2in new Headless code
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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); \
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,8 @@ set( PROJECT_FILES
|
||||
cafPdmUiSelection3dEditorVisualizer.cpp
|
||||
cafQShortenedLabel.cpp
|
||||
cafQShortenedLabel.h
|
||||
cafQIconProvider.cpp
|
||||
cafQIconProvider.h
|
||||
|
||||
)
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -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 = "");
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
137
Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.cpp
Normal file
137
Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.cpp
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cvfBase.h"
|
||||
#include "cvfObject.h"
|
||||
#include "cvfFont.h"
|
||||
#include "cvfGlyph.h"
|
||||
|
||||
Reference in New Issue
Block a user