Skip to content
Snippets Groups Projects
Commit 8f268ade authored by Martyn Gigg's avatar Martyn Gigg
Browse files

Refactor MessageDisplay settings handling.

Saving/loading settings must now be requested by the client of the class.
The previous code forced the settings to be saved and loaded each time
even if that was not desired.
Refs #21251
parent eda80187
No related merge requests found
......@@ -378,6 +378,9 @@ void ApplicationWindow::init(bool factorySettings, const QStringList &args) {
 
ConfigService::Instance(); // Starts logging
resultsLog->attachLoggingChannel(); // Must be done after logging starts
// Read settings early so that the log level is set before the framework
// starts
resultsLog->readSettings(settings);
// Load Mantid core libraries by starting the framework
FrameworkManager::Instance();
#ifdef MAKE_VATES
......@@ -4819,12 +4822,6 @@ void ApplicationWindow::readSettings() {
changeAppStyle(settings.value("/Style", appStyle).toString());
autoSave = settings.value("/AutoSave", false).toBool();
autoSaveTime = settings.value("/AutoSaveTime", 15).toInt();
// set logging level to the last saved level
int lastLoggingLevel =
settings.value("/LastLoggingLevel",
Mantid::Kernel::Logger::Priority::PRIO_NOTICE).toInt();
Mantid::Kernel::Logger::setLevelForAll(lastLoggingLevel);
d_backup_files = settings.value("/BackupProjects", true).toBool();
d_init_window_type =
(WindowType)settings.value("/InitWindow", NoWindow).toInt();
......@@ -5346,9 +5343,11 @@ void ApplicationWindow::saveSettings() {
//"ProIndependent", "MantidPlot");
#endif
 
/* ---------------- group General --------------- */
settings.beginGroup("/General");
// Root level is named "General" by Qt
resultsLog->writeSettings(&settings);
 
// Our named group General, displayed as %General in the file
settings.beginGroup("/General");
settings.beginGroup("/ApplicationGeometry");
d_app_rect = QRect(this->pos(), this->size());
if (this->isMaximized())
......@@ -5368,9 +5367,6 @@ void ApplicationWindow::saveSettings() {
settings.setValue("/Style", appStyle);
settings.setValue("/AutoSave", autoSave);
settings.setValue("/AutoSaveTime", autoSaveTime);
// save current logger level from the root logger ""
int lastLoggingLevel = Mantid::Kernel::Logger("").getLevel();
settings.setValue("/LastLoggingLevel", lastLoggingLevel);
 
settings.setValue("/BackupProjects", d_backup_files);
settings.setValue("/InitWindow", static_cast<int>(d_init_window_type));
......
......@@ -244,8 +244,9 @@ set ( INC_FILES
inc/MantidQtWidgets/Common/AlgorithmInputHistory.h
inc/MantidQtWidgets/Common/AlgorithmRunner.h
inc/MantidQtWidgets/Common/BatchAlgorithmRunner.h
inc/MantidQtWidgets/Common/Configurable.h
inc/MantidQtWidgets/Common/DllOption.h
inc/MantidQtWidgets/Common/DropEventHelper.h
inc/MantidQtWidgets/Common/DropEventHelper.h
inc/MantidQtWidgets/Common/FileDialogHandler.h
inc/MantidQtWidgets/Common/FlowLayout.h
inc/MantidQtWidgets/Common/GraphOptions.h
......
#ifndef MANTIDQT_MANTIDWIDGETS_CONFIGURABLE_H
#define MANTIDQT_MANTIDWIDGETS_CONFIGURABLE_H
/*
Copyright &copy; 2011 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
National Laboratory & European Spallation Source
This file is part of Mantid.
Mantid 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.
Mantid 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 for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
File change history is stored at: <https://github.com/mantidproject/mantid>.
Code Documentation is available at: <http://doxygen.mantidproject.org>
*/
#include "MantidQtWidgets/Common/DllOption.h"
class QSettings;
namespace MantidQt {
namespace MantidWidgets {
/**
* Defines an interface for an object to load and store
* any configuration settings that should persist between objects. A widget
* should inherit from this class and define the loadSettings and saveSettings
* member functions. These functions are expected to be called by the client
* along with a QSettings instance, opened at the correct group, which will
* either give access or receive the values.
*/
class EXPORT_OPT_MANTIDQT_COMMON Configurable {
public:
virtual void readSettings(const QSettings &) = 0;
virtual void writeSettings(QSettings *) = 0;
};
}
}
#endif // MANTIDQT_MANTIDWIDGETS_CONFIGURABLE_H
......@@ -6,6 +6,7 @@
//----------------------------------
#include "DllOption.h"
#include "MantidKernel/FilterChannel.h"
#include "MantidQtWidgets/Common/Configurable.h"
#include "MantidQtWidgets/Common/Message.h"
#include "MantidQtWidgets/Common/QtSignalChannel.h"
......@@ -19,10 +20,11 @@
//----------------------------------------------------------
class QAction;
class QActionGroup;
class QPlainTextEdit;
class QPoint;
class QSettings;
class QShowEvent;
class QSignalMapper;
class QPlainTextEdit;
namespace MantidQt {
namespace MantidWidgets {
......@@ -33,10 +35,16 @@ namespace MantidWidgets {
* a message is a framework Poco message or a simple string.
* It can connect to the Mantid logging framework if required
*/
class EXPORT_OPT_MANTIDQT_COMMON MessageDisplay : public QWidget {
class EXPORT_OPT_MANTIDQT_COMMON MessageDisplay : public QWidget,
public Configurable {
Q_OBJECT
Q_PROPERTY(QString source READ source WRITE setSource)
public:
// Configurable interface
void readSettings(const QSettings &storage) override;
void writeSettings(QSettings *storage) override;
public:
/// Controls whether the display is allowed to set the log levels
enum LogLevelControl { EnableLogLevelControl = 0, DisableLogLevelControl };
......
......@@ -26,26 +26,39 @@ namespace MantidWidgets {
//-------------------------------------------
// Public member functions
//-------------------------------------------
/**
* Load settings from the persistent store. The client is expected to call
* this method with the QSettings object opened at the approriate group
* @param storage A pointer to an existing QSettings instance opened
* at the group containing the values
*/
void MessageDisplay::readSettings(const QSettings &storage) {
Mantid::Kernel::ConfigService::Instance().setFilterChannelLogLevel(
m_filterChannelName,
storage.value("MessageDisplayPriority", Message::Priority::PRIO_NOTICE)
.toInt(),
true);
}
/**
* Load settings from the persistent store. The client is expected to call
* this method with the QSettings object opened at the approriate group
* @param storage A pointer to an existing QSettings instance opened
* at the group where the values should be stored.
*/
void MessageDisplay::writeSettings(QSettings *storage) {
Q_ASSERT(storage);
storage->setValue("MessageDisplayPriority",
static_cast<int>(m_filterChannel->getPriority()));
}
/**
* Constructs a widget that does not allow control over the global log level
* @param parent An optional parent widget
*/
MessageDisplay::MessageDisplay(QWidget *parent)
: QWidget(parent), m_logLevelControl(DisableLogLevelControl),
m_logChannel(new QtSignalChannel),
m_filterChannel(new Poco::FilterChannel),
m_textDisplay(new QPlainTextEdit(this)), m_formats(),
m_loglevels(new QActionGroup(this)),
m_logLevelMapping(new QSignalMapper(this)),
m_error(new QAction(tr("&Error"), this)),
m_warning(new QAction(tr("&Warning"), this)),
m_notice(new QAction(tr("&Notice"), this)),
m_information(new QAction(tr("&Information"), this)),
m_debug(new QAction(tr("&Debug"), this)) {
initActions();
initFormats();
setupTextArea();
}
: MessageDisplay(DisableLogLevelControl, parent) {}
/**
* @param logLevelControl Controls whether this display shows the right-click
......@@ -57,7 +70,7 @@ MessageDisplay::MessageDisplay(LogLevelControl logLevelControl, QWidget *parent)
: QWidget(parent), m_logLevelControl(logLevelControl),
m_logChannel(new QtSignalChannel),
m_filterChannel(new Poco::FilterChannel),
m_textDisplay(new QPlainTextEdit(this)),
m_textDisplay(new QPlainTextEdit(this)), m_formats(),
m_loglevels(new QActionGroup(this)),
m_logLevelMapping(new QSignalMapper(this)),
m_error(new QAction(tr("&Error"), this)),
......@@ -73,9 +86,6 @@ MessageDisplay::MessageDisplay(LogLevelControl logLevelControl, QWidget *parent)
/**
*/
MessageDisplay::~MessageDisplay() {
QSettings settings;
settings.setValue("MessageDisplayPriority",
static_cast<int>(m_filterChannel->getPriority()));
// The Channel class is ref counted and will
// delete itself when required
m_filterChannel->release();
......@@ -99,9 +109,6 @@ void MessageDisplay::attachLoggingChannel() {
}
m_filterChannel->addChannel(m_logChannel);
QSettings settings;
int priority = settings.value(QString::fromStdString(m_FilterChannelName),
Message::Priority::PRIO_NOTICE).toInt();
auto &configService = Mantid::Kernel::ConfigService::Instance();
configService.registerLoggingFilterChannel(m_FilterChannelName,
......@@ -239,9 +246,9 @@ void MessageDisplay::scrollToBottom() {
m_textDisplay->verticalScrollBar()->maximum());
}
//----------------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Protected members
//----------------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Private slot member functions
......@@ -362,10 +369,9 @@ void MessageDisplay::setupTextArea() {
m_textDisplay->setMouseTracking(true);
m_textDisplay->setUndoRedoEnabled(false);
this->setLayout(new QHBoxLayout(this));
QLayout *layout = this->layout();
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(m_textDisplay);
auto layoutBox = new QHBoxLayout(this);
layoutBox->setContentsMargins(0, 0, 0, 0);
layoutBox->addWidget(m_textDisplay);
this->setFocusProxy(m_textDisplay);
m_textDisplay->setContextMenuPolicy(Qt::CustomContextMenu);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment