From bc9f286bce224743d244e540d55f26b55affbd4a Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Fri, 12 Jul 2019 08:30:40 -0400
Subject: moved the log to a dock widget added a menu item in the view menu for
it
---
src/mainwindow.ui | 69 +++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 52 insertions(+), 17 deletions(-)
(limited to 'src/mainwindow.ui')
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 70d1cf39..d83c68ca 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1286,23 +1286,6 @@ p, li { white-space: pre-wrap; }
-
-
- Qt::ActionsContextMenu
-
-
- QAbstractItemView::NoSelection
-
-
- true
-
-
- false
-
-
- true
-
-
@@ -1403,6 +1386,7 @@ p, li { white-space: pre-wrap; }
+
@@ -1417,6 +1401,49 @@ p, li { white-space: pre-wrap; }
+
+
+ Log
+
+
+ 8
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ Qt::ActionsContextMenu
+
+
+ QAbstractItemView::NoSelection
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+
+
+
+
@@ -1736,6 +1763,14 @@ p, li { white-space: pre-wrap; }
Status &bar
+
+
+ true
+
+
+ Log
+
+
--
cgit v1.3.1
From 54d98e291701f2187174a67c186f1ea762c6b959 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Tue, 16 Jul 2019 05:38:32 -0400
Subject: removed unused or redundant stuff in error_report.h renamed log() to
vlog() for now extracted console creation to Console class rewrote LogBuffer
to work with logging from uibase, renamed to LogModel added fmt dependency
---
CMakeLists.txt | 8 +-
src/CMakeLists.txt | 6 +-
src/logbuffer.cpp | 263 +++++++++++++-----------------------------
src/logbuffer.h | 70 +++--------
src/main.cpp | 116 ++++++++++++++++---
src/mainwindow.cpp | 35 ++++--
src/mainwindow.h | 1 +
src/mainwindow.ui | 15 ++-
src/organizercore.cpp | 1 -
src/profile.cpp | 5 +-
src/shared/directoryentry.cpp | 12 +-
src/shared/error_report.cpp | 45 --------
src/shared/error_report.h | 21 +---
13 files changed, 254 insertions(+), 344 deletions(-)
(limited to 'src/mainwindow.ui')
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 94c76373..ac9d8fc7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,10 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
-ADD_COMPILE_OPTIONS($<$:/MP> $<$:$<$:/O2>> $<$:$<$:/O2>>)
+ADD_COMPILE_OPTIONS(
+ $<$:/MP>
+ $<$:/D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING>
+ $<$:$<$:/O2>>
+ $<$:$<$:/O2>>)
PROJECT(organizer)
@@ -11,9 +15,11 @@ set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
set(CMAKE_INSTALL_MESSAGE NEVER)
SET(DEPENDENCIES_DIR CACHE PATH "")
+
# hint to find qt in dependencies path
LIST(APPEND CMAKE_PREFIX_PATH ${QT_ROOT}/lib/cmake)
LIST(APPEND CMAKE_PREFIX_PATH ${LZ4_ROOT}/dll)
+LIST(APPEND CMAKE_PREFIX_PATH ${FMT_ROOT}/build)
ADD_SUBDIRECTORY(src)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f197211a..a359b8a9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -520,6 +520,9 @@ LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
FIND_PACKAGE(zlib REQUIRED)
# TODO FindZlib doesn't find the static zlib library
+# fmt
+find_package(fmt REQUIRED)
+
INCLUDE_DIRECTORIES(${project_path}/uibase/src
${project_path}/bsatk/src
${project_path}/esptk/src
@@ -551,10 +554,11 @@ ELSE()
ENDIF()
ADD_EXECUTABLE(ModOrganizer WIN32 ${organizer_HDRS} ${organizer_SRCS} ${organizer_UIS} ${organizer_RCS} ${organizer_QRCS} ${organizer_translations_qm})
+
TARGET_LINK_LIBRARIES(ModOrganizer
Qt5::Widgets Qt5::WinExtras Qt5::WebEngineWidgets Qt5::Quick
Qt5::Qml Qt5::QuickWidgets Qt5::Network Qt5::WebSockets
- ${Boost_LIBRARIES}
+ ${Boost_LIBRARIES} fmt::fmt
zlibstatic
uibase esptk bsatk githubpp
${usvfs_name}
diff --git a/src/logbuffer.cpp b/src/logbuffer.cpp
index dfe8f943..9e3cd712 100644
--- a/src/logbuffer.cpp
+++ b/src/logbuffer.cpp
@@ -20,239 +20,140 @@ along with Mod Organizer. If not, see .
#include "logbuffer.h"
#include
#include
+#include
#include
#include
#include
#include
#include
-using MOBase::reportError;
+using namespace MOBase;
-QScopedPointer LogBuffer::s_Instance;
-QMutex LogBuffer::s_Mutex;
+static LogModel* g_instance = nullptr;
+const std::size_t MaxLines = 1000;
-LogBuffer::LogBuffer(int messageCount, QtMsgType minMsgType,
- const QString &outputFileName)
- : QAbstractItemModel(nullptr)
- , m_OutFileName(outputFileName)
- , m_ShutDown(false)
- , m_MinMsgType(minMsgType)
- , m_NumMessages(0)
+LogModel::LogModel()
{
- m_Messages.resize(messageCount);
+ connect(this, &LogModel::entryAdded, [&](auto&& e){ onEntryAdded(e); });
}
-LogBuffer::~LogBuffer()
+void LogModel::create()
{
- qInstallMessageHandler(0);
- write();
+ g_instance = new LogModel;
}
-void LogBuffer::logMessage(QtMsgType type, const QString &message)
+LogModel& LogModel::instance()
{
- if (type >= m_MinMsgType) {
- QStringList messagelist = message.split("\n");
- for (auto split_message : messagelist) {
- Message msg = {type, QTime::currentTime(), split_message};
- if (m_NumMessages < m_Messages.size()) {
- beginInsertRows(QModelIndex(), static_cast(m_NumMessages),
- static_cast(m_NumMessages) + 1);
- }
- m_Messages.at(m_NumMessages % m_Messages.size()) = msg;
- if (m_NumMessages < m_Messages.size()) {
- endInsertRows();
- } else {
- emit dataChanged(createIndex(0, 0),
- createIndex(static_cast(m_Messages.size()), 0));
- }
- ++m_NumMessages;
- if (type >= QtCriticalMsg) {
- write();
- }
- }
- }
-}
-
-void LogBuffer::write() const
-{
- if (m_NumMessages == 0) {
- return;
- }
-
- DWORD lastError = ::GetLastError();
-
- QFile file(m_OutFileName);
- if (!file.open(QIODevice::WriteOnly)) {
- reportError(tr("failed to write log to %1: %2")
- .arg(m_OutFileName)
- .arg(file.errorString()));
- return;
- }
-
- unsigned int i
- = (m_NumMessages > m_Messages.size())
- ? static_cast(m_NumMessages - m_Messages.size())
- : 0U;
- for (; i < m_NumMessages; ++i) {
- file.write(m_Messages.at(i % m_Messages.size()).toString().toUtf8());
- file.write("\r\n");
- }
- ::SetLastError(lastError);
+ return *g_instance;
}
-void LogBuffer::init(int messageCount, QtMsgType minMsgType,
- const QString &outputFileName)
+void LogModel::add(MOBase::log::Entry e)
{
- QMutexLocker guard(&s_Mutex);
-
- s_Instance.reset(new LogBuffer(messageCount, minMsgType, outputFileName));
- qInstallMessageHandler(LogBuffer::log);
+ emit entryAdded(std::move(e));
}
-char LogBuffer::msgTypeID(QtMsgType type)
+void LogModel::onEntryAdded(MOBase::log::Entry e)
{
- switch (type) {
- case QtDebugMsg:
- return 'D';
- case QtInfoMsg:
- return 'I';
- case QtWarningMsg:
- return 'W';
- case QtCriticalMsg:
- return 'C';
- case QtFatalMsg:
- return 'F';
- default:
- return '?';
+ bool full = false;
+ if (m_messages.size() > MaxLines) {
+ m_messages.pop_front();
+ full = true;
}
-}
-void LogBuffer::log(QtMsgType type, const QMessageLogContext &context,
- const QString &message)
-{
- // QMutexLocker doesn't support timeout...
- if (!s_Mutex.tryLock(100)) {
- fprintf(stderr, "failed to log: %s", qUtf8Printable(message));
- return;
- }
- ON_BLOCK_EXIT([]() { s_Mutex.unlock(); });
+ const int row = static_cast(m_messages.size());
- if (!s_Instance.isNull()) {
- s_Instance->logMessage(type, message);
+ if (!full) {
+ beginInsertRows(QModelIndex(), row, row + 1);
}
- if (type == QtDebugMsg) {
- fprintf(stdout, "%s [%c] %s\n", qUtf8Printable(QTime::currentTime().toString()),
- msgTypeID(type), qUtf8Printable(message));
+ m_messages.emplace_back(std::move(e));
+
+ if (!full) {
+ endInsertRows();
} else {
- if (context.line != 0) {
- fprintf(stdout, "%s [%c] (%s:%u) %s\n",
- qUtf8Printable(QTime::currentTime().toString()), msgTypeID(type),
- context.file, context.line, qUtf8Printable(message));
- } else {
- fprintf(stdout, "%s [%c] %s\n",
- qUtf8Printable(QTime::currentTime().toString()), msgTypeID(type),
- qUtf8Printable(message));
- }
+ emit dataChanged(
+ createIndex(row, 0),
+ createIndex(row + 1, columnCount({})));
}
- fflush(stdout);
}
-QModelIndex LogBuffer::index(int row, int column, const QModelIndex &) const
+QModelIndex LogModel::index(int row, int column, const QModelIndex&) const
{
return createIndex(row, column, row);
}
-QModelIndex LogBuffer::parent(const QModelIndex &) const
+QModelIndex LogModel::parent(const QModelIndex&) const
{
return QModelIndex();
}
-int LogBuffer::rowCount(const QModelIndex &parent) const
+int LogModel::rowCount(const QModelIndex& parent) const
{
if (parent.isValid())
return 0;
else
- return static_cast(std::min(m_NumMessages, m_Messages.size()));
+ return static_cast(m_messages.size());
}
-int LogBuffer::columnCount(const QModelIndex &) const
+int LogModel::columnCount(const QModelIndex&) const
{
- return 2;
+ return 3;
}
-QVariant LogBuffer::data(const QModelIndex &index, int role) const
+QVariant LogModel::data(const QModelIndex& index, int role) const
{
- unsigned int offset
- = m_NumMessages < m_Messages.size()
- ? 0
- : static_cast(m_NumMessages - m_Messages.size());
- unsigned int msgIndex = (offset + index.row() + 1) % m_Messages.size();
- switch (role) {
- case Qt::DisplayRole: {
- if (index.column() == 0) {
- return m_Messages[msgIndex].time.toString("H: mm: ss");
- } else if (index.column() == 1) {
- const QString &msg = m_Messages[msgIndex].message;
- if (msg.length() < 200) {
- return msg;
- } else {
- return msg.mid(0, 200) + "...";
- }
- }
- } break;
- case Qt::DecorationRole: {
- if (index.column() == 1) {
- switch (m_Messages[msgIndex].type) {
- case QtDebugMsg:
- case QtInfoMsg:
- return QIcon(":/MO/gui/information");
- case QtWarningMsg:
- return QIcon(":/MO/gui/warning");
- case QtCriticalMsg:
- return QIcon(":/MO/gui/important");
- case QtFatalMsg:
- return QIcon(":/MO/gui/problem");
- }
- }
- } break;
- case Qt::UserRole: {
- if (index.column() == 1) {
- switch (m_Messages[msgIndex].type) {
- case QtDebugMsg:
- return "D";
- case QtInfoMsg:
- return "I";
- case QtWarningMsg:
- return "W";
- case QtCriticalMsg:
- return "C";
- case QtFatalMsg:
- return "F";
- }
- }
- } break;
+ using namespace std::chrono;
+
+ const auto row = static_cast(index.row());
+ if (row >= m_messages.size()) {
+ return {};
}
- return QVariant();
-}
-void LogBuffer::writeNow()
-{
- QMutexLocker guard(&s_Mutex);
- if (!s_Instance.isNull()) {
- s_Instance->write();
+ const auto& e = m_messages[row];
+
+ if (role == Qt::DisplayRole) {
+ if (index.column() == 1) {
+ const auto ms = duration_cast(e.time.time_since_epoch());
+ const auto s = duration_cast(ms);
+
+ const std::time_t t = s.count();
+ const std::size_t frac = ms.count() % 1000;
+
+ auto time = QDateTime::fromTime_t(t).time();
+ time = time.addMSecs(frac);
+
+ return time.toString("hh:mm:ss.zzz");
+ } else if (index.column() == 2) {
+ return QString::fromStdString(e.message);
+ }
+ }
+
+ if (role == Qt::DecorationRole) {
+ if (index.column() == 0) {
+ switch (e.level) {
+ case log::Warning:
+ return QIcon(":/MO/gui/warning");
+
+ case log::Error:
+ return QIcon(":/MO/gui/problem");
+
+ case log::Debug: // fall-through
+ case log::Info:
+ default:
+ return {};
+ }
+ }
}
+
+ return QVariant();
}
-void LogBuffer::cleanQuit()
+QVariant LogModel::headerData(int, Qt::Orientation, int) const
{
- QMutexLocker guard(&s_Mutex);
- if (!s_Instance.isNull()) {
- s_Instance->m_ShutDown = true;
- }
+ return {};
}
-void log(const char *format, ...)
+void vlog(const char *format, ...)
{
va_list argList;
va_start(argList, format);
@@ -268,11 +169,3 @@ void log(const char *format, ...)
va_end(argList);
}
-
-QString LogBuffer::Message::toString() const
-{
- return QString("%1 [%2] %3")
- .arg(time.toString())
- .arg(msgTypeID(type))
- .arg(message);
-}
diff --git a/src/logbuffer.h b/src/logbuffer.h
index 0cfecfa2..1bf8901b 100644
--- a/src/logbuffer.h
+++ b/src/logbuffer.h
@@ -26,70 +26,36 @@ along with Mod Organizer. If not, see .
#include
#include
#include
+#include
-
-class LogBuffer : public QAbstractItemModel
+class LogModel : public QAbstractItemModel
{
Q_OBJECT
public:
+ static void create();
+ static LogModel& instance();
- static void init(int messageCount, QtMsgType minMsgType, const QString &outputFileName);
- static void log(QtMsgType type, const QMessageLogContext &context, const QString &message);
-
- static void writeNow();
- static void cleanQuit();
-
- static LogBuffer *instance() { return s_Instance.data(); }
-
-public:
-
- virtual ~LogBuffer();
-
- void logMessage(QtMsgType type, const QString &message);
+ void add(MOBase::log::Entry e);
- // QAbstractItemModel interface
-public:
- QModelIndex index(int row, int column, const QModelIndex &parent) const;
- QModelIndex parent(const QModelIndex &child) const;
- int rowCount(const QModelIndex &parent) const;
- int columnCount(const QModelIndex &parent) const;
- QVariant data(const QModelIndex &index, int role) const;
+protected:
+ QModelIndex index(int row, int column, const QModelIndex& parent) const override;
+ QModelIndex parent(const QModelIndex &child) const override;
+ int rowCount(const QModelIndex &parent) const override;
+ int columnCount(const QModelIndex &parent) const override;
+ QVariant data(const QModelIndex &index, int role) const override;
+
+ QVariant headerData(
+ int section, Qt::Orientation ori, int role=Qt::DisplayRole) const override;
signals:
-
-public slots:
+ void entryAdded(MOBase::log::Entry e);
private:
+ std::deque m_messages;
- explicit LogBuffer(int messageCount, QtMsgType minMsgType, const QString &outputFileName);
- LogBuffer(const LogBuffer &reference); // not implemented
- LogBuffer &operator=(const LogBuffer &reference); // not implemented
-
- void write() const;
-
- static char msgTypeID(QtMsgType type);
-
-private:
-
- struct Message {
- QtMsgType type;
- QTime time;
- QString message;
- QString toString() const;
- };
-
-private:
-
- static QScopedPointer s_Instance;
- static QMutex s_Mutex;
-
- QString m_OutFileName;
- bool m_ShutDown;
- QtMsgType m_MinMsgType;
- size_t m_NumMessages;
- std::vector m_Messages;
-
+ LogModel();
+ void onEntryAdded(MOBase::log::Entry e);
};
#endif // LOGBUFFER_H
diff --git a/src/main.cpp b/src/main.cpp
index db0c8f93..23ea234a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -51,6 +51,7 @@ along with Mod Organizer. If not, see .
#include
#include
#include
+#include
#include
#include
@@ -731,18 +732,46 @@ int runApplication(MOApplication &application, SingleInstance &instance,
}
}
-int doCoreDump(env::CoreDumpTypes type)
+class Console
{
- // open a console
- AllocConsole();
+public:
+ Console()
+ {
+ // open a console
+ AllocConsole();
- // redirect stdin, stdout and stderr to it
- FILE* in=nullptr;
- FILE* out=nullptr;
- FILE* err=nullptr;
- freopen_s(&in, "CONIN$", "r", stdin);
- freopen_s(&out, "CONOUT$", "w", stdout);
- freopen_s(&err, "CONOUT$", "w", stderr);
+ // redirect stdin, stdout and stderr to it
+ freopen_s(&m_in, "CONIN$", "r", stdin);
+ freopen_s(&m_out, "CONOUT$", "w", stdout);
+ freopen_s(&m_err, "CONOUT$", "w", stderr);
+ }
+
+ ~Console()
+ {
+ // close redirected handles
+ std::fclose(m_err);
+ std::fclose(m_out);
+ std::fclose(m_in);
+
+ // close console
+ FreeConsole();
+
+ // redirect stdin, stdout and stderr to NUL, don't bother closing the
+ // handles
+ freopen_s(&m_in, "NUL", "r", stdin);
+ freopen_s(&m_out, "NUL", "w", stdout);
+ freopen_s(&m_err, "NUL", "w", stderr);
+ }
+
+private:
+ FILE* m_in = nullptr;
+ FILE* m_out = nullptr;
+ FILE* m_err = nullptr;
+};
+
+int doCoreDump(env::CoreDumpTypes type)
+{
+ Console c;
// dump
const auto b = env::coredumpOther(type);
@@ -753,15 +782,66 @@ int doCoreDump(env::CoreDumpTypes type)
std::wcerr << L"Press enter to continue...";
std::wcin.get();
- // close redirected handles
- std::fclose(err);
- std::fclose(out);
- std::fclose(in);
+ return (b ? 0 : 1);
+}
+
+log::Levels convertQtLevel(QtMsgType t)
+{
+ switch (t)
+ {
+ case QtDebugMsg:
+ return log::Debug;
- // close console
- FreeConsole();
+ case QtWarningMsg:
+ return log::Warning;
- return (b ? 0 : 1);
+ case QtCriticalMsg: // fall-through
+ case QtFatalMsg:
+ return log::Error;
+
+ case QtInfoMsg: // fall-through
+ default:
+ return log::Info;
+ }
+}
+
+void qtLogCallback(
+ QtMsgType type, const QMessageLogContext& context, const QString& message)
+{
+ std::string_view file = "";
+
+ if (type != QtDebugMsg) {
+ if (context.file) {
+ file = context.file;
+
+ const auto lastSep = file.find_last_of("/\\");
+ if (lastSep != std::string_view::npos) {
+ file = {context.file + lastSep + 1};
+ }
+ }
+ }
+
+ if (file.empty()) {
+ log::log(
+ convertQtLevel(type), "{}",
+ message.toStdString());
+ } else {
+ log::log(
+ convertQtLevel(type), "[{}:{}] {}",
+ file, context.line, message.toStdString());
+ }
+}
+
+void initLogging(const QString& logFile)
+{
+ LogModel::create();
+
+ log::init(
+ true, MOBase::log::File::rotating(logFile.toStdWString(), 5*1024*1024, 5),
+ MOBase::log::Debug, "%^[%m-%d %H:%M:%S.%e %L] %v%$",
+ [](log::Entry e){ LogModel::instance().add(e); });
+
+ qInstallMessageHandler(qtLogCallback);
}
int main(int argc, char *argv[])
@@ -839,7 +919,7 @@ int main(int argc, char *argv[])
// initialize dump collection only after "dataPath" since the crashes are stored under it
prevUnhandledExceptionFilter = SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
- LogBuffer::init(1000000, QtDebugMsg, qApp->property("dataPath").toString() + "/logs/mo_interface.log");
+ initLogging(qApp->property("dataPath").toString() + "/logs/mo_interface.log");
QString splash = dataPath + "/splash.png";
if (!QFile::exists(dataPath + "/splash.png")) {
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 4b5ef9ed..cd224414 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -357,17 +357,10 @@ MainWindow::MainWindow(QSettings &initSettings
m_CategoryFactory.loadCategories();
- ui->logList->setModel(LogBuffer::instance());
- ui->logList->setColumnWidth(0, 100);
- ui->logList->setAutoScroll(true);
- ui->logList->scrollToBottom();
- ui->logList->addAction(ui->actionCopy_Log_to_Clipboard);
+ setupLogList();
+
int splitterSize = this->size().height(); // actually total window size, but the splitter doesn't seem to return the true value
ui->topLevelSplitter->setSizes(QList() << splitterSize - 100 << 100);
- connect(ui->logList->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
- ui->logList, SLOT(scrollToBottom()));
- connect(ui->logList->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
- ui->logList, SLOT(scrollToBottom()));
updateProblemsButton();
@@ -593,6 +586,30 @@ MainWindow::MainWindow(QSettings &initSettings
updateModCount();
}
+void MainWindow::setupLogList()
+{
+ ui->logList->setModel(&LogModel::instance());
+
+ const int timestampWidth =
+ QFontMetrics(ui->logList->font()).width("00:00:00.000");
+
+ ui->logList->header()->setMinimumSectionSize(0);
+ ui->logList->header()->resizeSection(0, 20);
+ ui->logList->header()->resizeSection(1, timestampWidth + 8);
+
+ ui->logList->setAutoScroll(true);
+ ui->logList->scrollToBottom();
+ ui->logList->addAction(ui->actionCopy_Log_to_Clipboard);
+
+ connect(
+ ui->logList->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
+ ui->logList, SLOT(scrollToBottom()));
+
+ connect(
+ ui->logList->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ ui->logList, SLOT(scrollToBottom()));
+}
+
void MainWindow::resetActionIcons()
{
// this is a bit of a hack
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d7dbfd90..9ca3e5c3 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -636,6 +636,7 @@ private slots:
void resetActionIcons();
void updateModCount();
void updatePluginCount();
+ void setupLogList();
private slots: // ui slots
// actions
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index d83c68ca..5a45b3b4 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1402,6 +1402,9 @@ p, li { white-space: pre-wrap; }
+
+ QDockWidget::AllDockWidgetFeatures
+
Log
@@ -1428,17 +1431,17 @@ p, li { white-space: pre-wrap; }
Qt::ActionsContextMenu
- QAbstractItemView::NoSelection
-
-
- true
+ QAbstractItemView::ExtendedSelection
-
+
false
-
+
true
+
+ false
+
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index eeb69e61..5f5c3afe 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -342,7 +342,6 @@ OrganizerCore::~OrganizerCore()
m_CurrentProfile = nullptr;
ModInfo::clear();
- LogBuffer::cleanQuit();
m_ModList.setProfile(nullptr);
// NexusInterface::instance()->cleanup();
diff --git a/src/profile.cpp b/src/profile.cpp
index ef387027..01906903 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -287,8 +287,11 @@ void Profile::createTweakedIniFile()
}
if (error) {
- reportError(tr("failed to create tweaked ini: %1").arg(getCurrentErrorString().c_str()));
+ const auto e = ::GetLastError();
+ reportError(tr("failed to create tweaked ini: %1")
+ .arg(formatSystemMessageQ(e)));
}
+
qDebug("%s saved", qUtf8Printable(QDir::toNativeSeparators(tweakedIni)));
}
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index bde515a9..9d9edd85 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -103,7 +103,7 @@ public:
m_OriginsNameMap.erase(iter);
m_OriginsNameMap[newName] = idx;
} else {
- log("failed to change name lookup from %ls to %ls", oldName.c_str(), newName.c_str());
+ vlog("failed to change name lookup from %ls to %ls", oldName.c_str(), newName.c_str());
}
}
@@ -714,12 +714,12 @@ void DirectoryEntry::removeFile(FileEntry::Index index)
if (iter != m_Files.end()) {
m_Files.erase(iter);
} else {
- log("file \"%ls\" not in directory \"%ls\"",
+ vlog("file \"%ls\" not in directory \"%ls\"",
m_FileRegister->getFile(index)->getName().c_str(),
this->getName().c_str());
}
} else {
- log("file \"%ls\" not in directory \"%ls\", directory empty",
+ vlog("file \"%ls\" not in directory \"%ls\", directory empty",
m_FileRegister->getFile(index)->getName().c_str(),
this->getName().c_str());
}
@@ -844,7 +844,7 @@ const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const
DirectoryEntry *temp = findSubDirectory(pathComponent);
if (temp != nullptr) {
if (len >= path.size()) {
- log("unexpected end of path");
+ vlog("unexpected end of path");
return FileEntry::Ptr();
}
return temp->searchFile(path.substr(len + 1), directory);
@@ -988,7 +988,7 @@ bool FileRegister::removeFile(FileEntry::Index index)
m_Files.erase(index);
return true;
} else {
- log("invalid file index for remove: %lu", index);
+ vlog("invalid file index for remove: %lu", index);
return false;
}
}
@@ -1002,7 +1002,7 @@ void FileRegister::removeOrigin(FileEntry::Index index, int originID)
m_Files.erase(iter);
}
} else {
- log("invalid file index for remove (for origin): %lu", index);
+ vlog("invalid file index for remove (for origin): %lu", index);
}
}
diff --git a/src/shared/error_report.cpp b/src/shared/error_report.cpp
index 6d091630..4185b544 100644
--- a/src/shared/error_report.cpp
+++ b/src/shared/error_report.cpp
@@ -23,7 +23,6 @@ along with Mod Organizer. If not, see .
namespace MOShared {
-
void reportError(LPCSTR format, ...)
{
char buffer[1025];
@@ -52,48 +51,4 @@ void reportError(LPCWSTR format, ...)
MessageBoxW(nullptr, buffer, L"Error", MB_OK | MB_ICONERROR);
}
-
-std::string getCurrentErrorStringA()
-{
- LPSTR buffer = nullptr;
-
- DWORD errorCode = ::GetLastError();
-
- if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, nullptr) == 0) {
- ::SetLastError(errorCode);
- return std::string();
- } else {
- LPSTR lastChar = buffer + strlen(buffer) - 2;
- *lastChar = '\0';
-
- std::string result(buffer);
-
- LocalFree(buffer);
- ::SetLastError(errorCode);
- return result;
- }
-}
-
-std::wstring getCurrentErrorStringW()
-{
- LPWSTR buffer = nullptr;
-
- DWORD errorCode = ::GetLastError();
-
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&buffer, 0, nullptr) == 0) {
- ::SetLastError(errorCode);
- return std::wstring();
- } else {
- LPWSTR lastChar = buffer + wcslen(buffer) - 2;
- *lastChar = '\0';
-
- std::wstring result(buffer);
-
- LocalFree(buffer);
- ::SetLastError(errorCode);
- return result;
- }
-}
} // namespace MOShared
diff --git a/src/shared/error_report.h b/src/shared/error_report.h
index c09ad75b..a003ee09 100644
--- a/src/shared/error_report.h
+++ b/src/shared/error_report.h
@@ -24,28 +24,11 @@ along with Mod Organizer. If not, see .
#include
#include
-namespace std {
-#ifdef UNICODE
-typedef wstring tstring;
-#else
-typedef string tstring;
-#endif
-}
-
-extern void log(const char* format, ...);
-
namespace MOShared {
void reportError(LPCSTR format, ...);
void reportError(LPCWSTR format, ...);
-std::string getCurrentErrorStringA();
-std::wstring getCurrentErrorStringW();
-
-#ifdef UNICODE
-#define getCurrentErrorString getCurrentErrorStringW
-#else
-#define getCurrentErrorString getCurrentErrorStringA
-#endif
-
} // namespace MOShared
+
+void vlog(const char* format, ...);
--
cgit v1.3.1
From d1b4dec8ad1635738ada3dfbde5907e7f0df3448 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Tue, 16 Jul 2019 05:58:51 -0400
Subject: moved setup to new LogList class
---
src/loglist.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++-------
src/loglist.h | 14 +++++++++++--
src/mainwindow.cpp | 35 ++-----------------------------
src/mainwindow.h | 1 -
src/mainwindow.ui | 10 +++++----
5 files changed, 74 insertions(+), 47 deletions(-)
(limited to 'src/mainwindow.ui')
diff --git a/src/loglist.cpp b/src/loglist.cpp
index cb927272..9e876d37 100644
--- a/src/loglist.cpp
+++ b/src/loglist.cpp
@@ -52,21 +52,26 @@ void LogModel::add(MOBase::log::Entry e)
emit entryAdded(std::move(e));
}
+const std::deque& LogModel::entries() const
+{
+ return m_entries;
+}
+
void LogModel::onEntryAdded(MOBase::log::Entry e)
{
bool full = false;
- if (m_messages.size() > MaxLines) {
- m_messages.pop_front();
+ if (m_entries.size() > MaxLines) {
+ m_entries.pop_front();
full = true;
}
- const int row = static_cast(m_messages.size());
+ const int row = static_cast(m_entries.size());
if (!full) {
beginInsertRows(QModelIndex(), row, row + 1);
}
- m_messages.emplace_back(std::move(e));
+ m_entries.emplace_back(std::move(e));
if (!full) {
endInsertRows();
@@ -92,7 +97,7 @@ int LogModel::rowCount(const QModelIndex& parent) const
if (parent.isValid())
return 0;
else
- return static_cast(m_messages.size());
+ return static_cast(m_entries.size());
}
int LogModel::columnCount(const QModelIndex&) const
@@ -105,11 +110,11 @@ QVariant LogModel::data(const QModelIndex& index, int role) const
using namespace std::chrono;
const auto row = static_cast(index.row());
- if (row >= m_messages.size()) {
+ if (row >= m_entries.size()) {
return {};
}
- const auto& e = m_messages[row];
+ const auto& e = m_entries[row];
if (role == Qt::DisplayRole) {
if (index.column() == 1) {
@@ -153,6 +158,48 @@ QVariant LogModel::headerData(int, Qt::Orientation, int) const
return {};
}
+
+LogList::LogList(QWidget* parent)
+ : QTreeView(parent)
+{
+ setModel(&LogModel::instance());
+
+ const int timestampWidth = QFontMetrics(font()).width("00:00:00.000");
+
+ header()->setMinimumSectionSize(0);
+ header()->resizeSection(0, 20);
+ header()->resizeSection(1, timestampWidth + 8);
+
+ setAutoScroll(true);
+ scrollToBottom();
+
+ connect(
+ model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
+ this, SLOT(scrollToBottom()));
+
+ connect(
+ model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this, SLOT(scrollToBottom()));
+}
+
+void LogList::copyToClipboard()
+{
+ std::string s;
+
+ auto* m = static_cast(model());
+ for (const auto& e : m->entries()) {
+ s += e.formattedMessage + "\n";
+ }
+
+ if (!s.empty()) {
+ // last newline
+ s.pop_back();
+ }
+
+ QApplication::clipboard()->setText(QString::fromStdString(s));
+}
+
+
void vlog(const char *format, ...)
{
va_list argList;
diff --git a/src/loglist.h b/src/loglist.h
index 1bf8901b..d1f7a2ad 100644
--- a/src/loglist.h
+++ b/src/loglist.h
@@ -37,6 +37,7 @@ public:
static LogModel& instance();
void add(MOBase::log::Entry e);
+ const std::deque& entries() const;
protected:
QModelIndex index(int row, int column, const QModelIndex& parent) const override;
@@ -44,7 +45,7 @@ protected:
int rowCount(const QModelIndex &parent) const override;
int columnCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
-
+
QVariant headerData(
int section, Qt::Orientation ori, int role=Qt::DisplayRole) const override;
@@ -52,10 +53,19 @@ signals:
void entryAdded(MOBase::log::Entry e);
private:
- std::deque m_messages;
+ std::deque m_entries;
LogModel();
void onEntryAdded(MOBase::log::Entry e);
};
+
+class LogList : public QTreeView
+{
+public:
+ LogList(QWidget* parent=nullptr);
+
+ void copyToClipboard();
+};
+
#endif // LOGBUFFER_H
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 107f3e09..4e91ef9f 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -357,7 +357,7 @@ MainWindow::MainWindow(QSettings &initSettings
m_CategoryFactory.loadCategories();
- setupLogList();
+ ui->logList->addAction(ui->actionCopy_Log_to_Clipboard);
int splitterSize = this->size().height(); // actually total window size, but the splitter doesn't seem to return the true value
ui->topLevelSplitter->setSizes(QList() << splitterSize - 100 << 100);
@@ -586,30 +586,6 @@ MainWindow::MainWindow(QSettings &initSettings
updateModCount();
}
-void MainWindow::setupLogList()
-{
- ui->logList->setModel(&LogModel::instance());
-
- const int timestampWidth =
- QFontMetrics(ui->logList->font()).width("00:00:00.000");
-
- ui->logList->header()->setMinimumSectionSize(0);
- ui->logList->header()->resizeSection(0, 20);
- ui->logList->header()->resizeSection(1, timestampWidth + 8);
-
- ui->logList->setAutoScroll(true);
- ui->logList->scrollToBottom();
- ui->logList->addAction(ui->actionCopy_Log_to_Clipboard);
-
- connect(
- ui->logList->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
- ui->logList, SLOT(scrollToBottom()));
-
- connect(
- ui->logList->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
- ui->logList, SLOT(scrollToBottom()));
-}
-
void MainWindow::resetActionIcons()
{
// this is a bit of a hack
@@ -6837,14 +6813,7 @@ void MainWindow::on_restoreModsButton_clicked()
void MainWindow::on_actionCopy_Log_to_Clipboard_triggered()
{
- QStringList lines;
- QAbstractItemModel *model = ui->logList->model();
- for (int i = 0; i < model->rowCount(); ++i) {
- lines.append(QString("%1 [%2] %3").arg(model->index(i, 0).data().toString())
- .arg(model->index(i, 1).data(Qt::UserRole).toString())
- .arg(model->index(i, 1).data().toString()));
- }
- QApplication::clipboard()->setText(lines.join("\n"));
+ ui->logList->copyToClipboard();
}
void MainWindow::on_categoriesAndBtn_toggled(bool checked)
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 9ca3e5c3..d7dbfd90 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -636,7 +636,6 @@ private slots:
void resetActionIcons();
void updateModCount();
void updatePluginCount();
- void setupLogList();
private slots: // ui slots
// actions
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 5a45b3b4..c694abd4 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1426,13 +1426,10 @@ p, li { white-space: pre-wrap; }
0
-
-
+
Qt::ActionsContextMenu
-
- QAbstractItemView::ExtendedSelection
-
false
@@ -1807,6 +1804,11 @@ p, li { white-space: pre-wrap; }
QWidget
+
+ LogList
+ QTreeView
+
+
--
cgit v1.3.1
From bca6283311cf1dea4c96f8ee5bf192bdb1640cb3 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Wed, 17 Jul 2019 08:56:16 -0400
Subject: use log::Levels instead of ints create log level combobox in code,
set selected index based on value instead added log level to context menu in
log list
---
src/mainwindow.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++---
src/mainwindow.h | 12 +++++++++---
src/mainwindow.ui | 30 +++++++++++++++---------------
src/organizercore.cpp | 4 +++-
src/organizercore.h | 5 ++++-
src/settings.cpp | 30 ++++++++++++++++++++++++++----
src/settings.h | 10 +++++++++-
src/settingsdialog.ui | 20 --------------------
src/usvfsconnector.cpp | 20 +++++++++++---------
src/usvfsconnector.h | 7 ++++++-
10 files changed, 127 insertions(+), 58 deletions(-)
(limited to 'src/mainwindow.ui')
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 4e91ef9f..f65bf4e1 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -357,7 +357,7 @@ MainWindow::MainWindow(QSettings &initSettings
m_CategoryFactory.loadCategories();
- ui->logList->addAction(ui->actionCopy_Log_to_Clipboard);
+ setupLogMenu();
int splitterSize = this->size().height(); // actually total window size, but the splitter doesn't seem to return the true value
ui->topLevelSplitter->setSizes(QList() << splitterSize - 100 << 100);
@@ -812,6 +812,36 @@ void MainWindow::setupActionMenu(QAction* a)
tb->setPopupMode(QToolButton::InstantPopup);
}
+void MainWindow::setupLogMenu()
+{
+ connect(ui->logList, &QWidget::customContextMenuRequested, [&](auto&& pos){
+ auto* menu = new QMenu(ui->logList);
+
+ menu->addAction(tr("Copy& Log"), [&]{ ui->logList->copyToClipboard(); });
+ menu->addSeparator();
+
+ auto* levels = new QMenu(tr("&Level"));
+ menu->addMenu(levels);
+
+ auto* ag = new QActionGroup(menu);
+
+ auto addAction = [&](auto&& text, auto&& level) {
+ auto* a = new QAction(text, ag);
+ a->setCheckable(true);
+ a->setChecked(log::getDefault().level() == level);
+ connect(a, &QAction::triggered, [this, level]{ setLogLevel(level); });
+ levels->addAction(a);
+ };
+
+ addAction(tr("&Errors"), log::Error);
+ addAction(tr("&Warnings"), log::Warning);
+ addAction(tr("&Info"), log::Info);
+ addAction(tr("&Debug"), log::Debug);
+
+ menu->popup(ui->logList->viewport()->mapToGlobal(pos));
+ });
+}
+
void MainWindow::updatePinnedExecutables()
{
for (auto* a : ui->toolBar->actions()) {
@@ -5287,12 +5317,23 @@ void MainWindow::on_actionSettings_triggered()
m_statusBar->checkSettings(m_OrganizerCore.settings());
updateDownloadView();
- m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType(), settings.executablesBlacklist());
+ setLogLevel(settings.logLevel());
m_OrganizerCore.cycleDiagnostics();
toggleMO2EndorseState();
}
+void MainWindow::setLogLevel(log::Levels level)
+{
+ auto& s = m_OrganizerCore.settings();
+
+ s.setLogLevel(level);
+
+ m_OrganizerCore.updateVFSParams(
+ s.logLevel(), s.crashDumpsType(), s.executablesBlacklist());
+
+ log::getDefault().setLevel(s.logLevel());
+}
void MainWindow::on_actionNexus_triggered()
{
@@ -6811,7 +6852,7 @@ void MainWindow::on_restoreModsButton_clicked()
}
}
-void MainWindow::on_actionCopy_Log_to_Clipboard_triggered()
+void MainWindow::on_actionLogCopy_triggered()
{
ui->logList->copyToClipboard();
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d7dbfd90..74993667 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -30,6 +30,9 @@ along with Mod Organizer. If not, see .
#include "modlistsortproxy.h"
#include "savegameinfo.h"
#include "tutorialcontrol.h"
+#include "plugincontainer.h" //class PluginContainer;
+#include "iplugingame.h" //namespace MOBase { class IPluginGame; }
+#include
//Note the commented headers here can be replaced with forward references,
//when I get round to cleaning up main.cpp
@@ -38,10 +41,10 @@ class CategoryFactory;
class LockedDialogBase;
class OrganizerCore;
class StatusBar;
-#include "plugincontainer.h" //class PluginContainer;
+
class PluginListSortProxy;
namespace BSA { class Archive; }
-#include "iplugingame.h" //namespace MOBase { class IPluginGame; }
+
namespace MOBase { class IPluginModPage; }
namespace MOBase { class IPluginTool; }
namespace MOBase { class ISaveGame; }
@@ -633,10 +636,13 @@ private slots:
void search_activated();
void searchClear_activated();
+ void setupLogMenu();
void resetActionIcons();
void updateModCount();
void updatePluginCount();
+ void setLogLevel(MOBase::log::Levels level);
+
private slots: // ui slots
// actions
void on_actionAdd_Profile_triggered();
@@ -690,7 +696,7 @@ private slots: // ui slots
void on_restoreButton_clicked();
void on_restoreModsButton_clicked();
void on_saveModsButton_clicked();
- void on_actionCopy_Log_to_Clipboard_triggered();
+ void on_actionLogCopy_triggered();
void on_categoriesAndBtn_toggled(bool checked);
void on_categoriesOrBtn_toggled(bool checked);
void on_managedArchiveLabel_linkHovered(const QString &link);
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index c694abd4..fc2bcdd3 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1428,7 +1428,7 @@ p, li { white-space: pre-wrap; }
-
- Qt::ActionsContextMenu
+ Qt::CustomContextMenu
false
@@ -1645,20 +1645,6 @@ p, li { white-space: pre-wrap; }
Endorse Mod Organizer
-
-
- Copy &Log
-
-
- Copy &Log
-
-
- Copy log to clipboard
-
-
- Copy log to clipboard
-
-
@@ -1771,6 +1757,20 @@ p, li { white-space: pre-wrap; }
Log
+
+
+ Copy &Log
+
+
+ Copy &Log
+
+
+ Copy log to clipboard
+
+
+ Copy log to clipboard
+
+
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index d3cd54ee..25fbc7cd 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -726,7 +726,9 @@ void OrganizerCore::prepareVFS()
m_USVFS.updateMapping(fileMapping(m_CurrentProfile->name(), QString()));
}
-void OrganizerCore::updateVFSParams(int logLevel, int crashDumpsType, QString executableBlacklist) {
+void OrganizerCore::updateVFSParams(
+ log::Levels logLevel, int crashDumpsType, QString executableBlacklist)
+{
setGlobalCrashDumpsType(crashDumpsType);
m_USVFS.updateParams(logLevel, crashDumpsType, executableBlacklist);
}
diff --git a/src/organizercore.h b/src/organizercore.h
index 99b1c5f2..ef1a4133 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -21,6 +21,7 @@
#include
#include
#include "executableinfo.h"
+#include
class ModListSortProxy;
class PluginListSortProxy;
@@ -191,7 +192,9 @@ public:
void prepareVFS();
- void updateVFSParams(int logLevel, int crashDumpsType, QString executableBlacklist);
+ void updateVFSParams(
+ MOBase::log::Levels logLevel, int crashDumpsType,
+ QString executableBlacklist);
bool cycleDiagnostics();
diff --git a/src/settings.cpp b/src/settings.cpp
index 5cb2524f..e622d632 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -415,9 +415,14 @@ bool Settings::offlineMode() const
return m_Settings.value("Settings/offline_mode", false).toBool();
}
-int Settings::logLevel() const
+log::Levels Settings::logLevel() const
{
- return m_Settings.value("Settings/log_level", static_cast(LogLevel::Info)).toInt();
+ return static_cast(m_Settings.value("Settings/log_level").toInt());
+}
+
+void Settings::setLogLevel(log::Levels level)
+{
+ m_Settings.setValue("Settings/log_level", static_cast(level));
}
int Settings::crashDumpsType() const
@@ -1000,7 +1005,7 @@ Settings::DiagnosticsTab::DiagnosticsTab(Settings *m_parent, SettingsDialog &m_d
, m_dumpsMaxEdit(m_dialog.findChild("dumpsMaxEdit"))
, m_diagnosticsExplainedLabel(m_dialog.findChild("diagnosticsExplainedLabel"))
{
- m_logLevelBox->setCurrentIndex(m_parent->logLevel());
+ setLevelsBox();
m_dumpsTypeBox->setCurrentIndex(m_parent->crashDumpsType());
m_dumpsMaxEdit->setValue(m_parent->crashDumpsMax());
QString logsPath = qApp->property("dataPath").toString()
@@ -1016,11 +1021,28 @@ Settings::DiagnosticsTab::DiagnosticsTab(Settings *m_parent, SettingsDialog &m_d
void Settings::DiagnosticsTab::update()
{
- m_Settings.setValue("Settings/log_level", m_logLevelBox->currentIndex());
+ m_Settings.setValue("Settings/log_level", m_logLevelBox->currentData().toInt());
m_Settings.setValue("Settings/crash_dumps_type", m_dumpsTypeBox->currentIndex());
m_Settings.setValue("Settings/crash_dumps_max", m_dumpsMaxEdit->value());
}
+void Settings::DiagnosticsTab::setLevelsBox()
+{
+ m_logLevelBox->clear();
+
+ m_logLevelBox->addItem(tr("Debug"), log::Debug);
+ m_logLevelBox->addItem(tr("Info (recommended)"), log::Info);
+ m_logLevelBox->addItem(tr("Warning"), log::Warning);
+ m_logLevelBox->addItem(tr("Error"), log::Error);
+
+ for (int i=0; icount(); ++i) {
+ if (m_logLevelBox->itemData(i) == m_parent->logLevel()) {
+ m_logLevelBox->setCurrentIndex(i);
+ break;
+ }
+ }
+}
+
Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog)
: Settings::SettingsTab(parent, dialog)
, m_offlineBox(dialog.findChild("offlineBox"))
diff --git a/src/settings.h b/src/settings.h
index bccd1e81..c66eb94c 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -21,6 +21,7 @@ along with Mod Organizer. If not, see .
#define SETTINGS_H
#include "loadmechanism.h"
+#include
#include
#include
@@ -232,7 +233,12 @@ public:
/**
* @return the configured log level
*/
- int logLevel() const;
+ MOBase::log::Levels logLevel() const;
+
+ /**
+ * sets the log level setting
+ */
+ void setLogLevel(MOBase::log::Levels level);
/**
* @return the configured crash dumps type
@@ -481,6 +487,8 @@ private:
QComboBox *m_dumpsTypeBox;
QSpinBox *m_dumpsMaxEdit;
QLabel *m_diagnosticsExplainedLabel;
+
+ void setLevelsBox();
};
/** Display/store the configuration in the 'nexus' tab of the settings dialogue */
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index fccc8be0..1e94bcde 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -1426,26 +1426,6 @@ programs you are intentionally running.
"Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regular use. On the "Error" level the log file usually remains empty.
-
-
-
- Debug
-
-
- -
-
- Info (recommended)
-
-
- -
-
- Warning
-
-
- -
-
- Error
-
-
diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp
index b752667d..197955b8 100644
--- a/src/usvfsconnector.cpp
+++ b/src/usvfsconnector.cpp
@@ -32,7 +32,7 @@ along with Mod Organizer. If not, see .
#include
static const char SHMID[] = "mod_organizer_instance";
-
+using namespace MOBase;
std::string to_hex(void *bufferIn, size_t bufferSize)
{
@@ -90,15 +90,16 @@ void LogWorker::exit()
m_QuitRequested = true;
}
-LogLevel logLevel(int level)
+LogLevel toUsvfsLogLevel(log::Levels level)
{
- switch (static_cast(level)) {
- case LogLevel::Info:
+ switch (level) {
+ case log::Info:
return LogLevel::Info;
- case LogLevel::Warning:
+ case log::Warning:
return LogLevel::Warning;
- case LogLevel::Error:
+ case log::Error:
return LogLevel::Error;
+ case log::Debug: // fall-through
default:
return LogLevel::Debug;
}
@@ -121,7 +122,7 @@ CrashDumpsType crashDumpsType(int type)
UsvfsConnector::UsvfsConnector()
{
USVFSParameters params;
- LogLevel level = logLevel(Settings::instance().logLevel());
+ LogLevel level = toUsvfsLogLevel(Settings::instance().logLevel());
CrashDumpsType dumpType = crashDumpsType(Settings::instance().crashDumpsType());
std::string dumpPath = MOShared::ToString(OrganizerCore::crashDumpsPath(), true);
@@ -205,9 +206,10 @@ void UsvfsConnector::updateMapping(const MappingType &mapping)
*/
}
-void UsvfsConnector::updateParams(int logLevel, int crashDumpsType, QString executableBlacklist)
+void UsvfsConnector::updateParams(
+ MOBase::log::Levels logLevel, int crashDumpsType, QString executableBlacklist)
{
- USVFSUpdateParams(::logLevel(logLevel), ::crashDumpsType(crashDumpsType));
+ USVFSUpdateParams(toUsvfsLogLevel(logLevel), ::crashDumpsType(crashDumpsType));
ClearExecutableBlacklist();
for (auto exec : executableBlacklist.split(";")) {
std::wstring buf = exec.toStdWString();
diff --git a/src/usvfsconnector.h b/src/usvfsconnector.h
index 8a88bde5..b0bd320c 100644
--- a/src/usvfsconnector.h
+++ b/src/usvfsconnector.h
@@ -29,6 +29,7 @@ along with Mod Organizer. If not, see .
#include
#include
#include
+#include
#include "executableinfo.h"
@@ -84,7 +85,11 @@ public:
~UsvfsConnector();
void updateMapping(const MappingType &mapping);
- void updateParams(int logLevel, int crashDumpsType, QString executableBlacklist);
+
+ void updateParams(
+ MOBase::log::Levels logLevel, int crashDumpsType,
+ QString executableBlacklist);
+
void updateForcedLibraries(const QList &forcedLibraries);
private:
--
cgit v1.3.1
From 3c7712a32dd5079a9543485b6a85d548460faefd Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 05:34:31 -0400
Subject: moved setLogLevel() to OrganizerCore moved context menu to LogList
---
src/loglist.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++--------
src/loglist.h | 16 +++++++++-----
src/mainwindow.cpp | 57 ++---------------------------------------------
src/mainwindow.h | 4 ----
src/mainwindow.ui | 14 ------------
src/organizercore.cpp | 12 ++++++++++
src/organizercore.h | 2 ++
7 files changed, 78 insertions(+), 88 deletions(-)
(limited to 'src/mainwindow.ui')
diff --git a/src/loglist.cpp b/src/loglist.cpp
index c34ac76e..26aea682 100644
--- a/src/loglist.cpp
+++ b/src/loglist.cpp
@@ -18,14 +18,7 @@ along with Mod Organizer. If not, see .
*/
#include "loglist.h"
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include "organizercore.h"
using namespace MOBase;
@@ -158,7 +151,7 @@ QVariant LogModel::headerData(int, Qt::Orientation, int) const
LogList::LogList(QWidget* parent)
- : QTreeView(parent)
+ : QTreeView(parent), m_core(nullptr)
{
setModel(&LogModel::instance());
@@ -171,6 +164,10 @@ LogList::LogList(QWidget* parent)
setAutoScroll(true);
scrollToBottom();
+ connect(
+ this, &QWidget::customContextMenuRequested,
+ [&](auto&& pos){ onContextMenu(pos); });
+
connect(
model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
this, SLOT(scrollToBottom()));
@@ -180,6 +177,11 @@ LogList::LogList(QWidget* parent)
this, SLOT(scrollToBottom()));
}
+void LogList::setCore(OrganizerCore& core)
+{
+ m_core = &core;
+}
+
void LogList::copyToClipboard()
{
std::string s;
@@ -196,3 +198,44 @@ void LogList::copyToClipboard()
QApplication::clipboard()->setText(QString::fromStdString(s));
}
+
+QMenu* LogList::createMenu(QWidget* parent)
+{
+ auto* menu = new QMenu(parent);
+
+ menu->addAction(tr("Copy& Log"), [&]{ copyToClipboard(); });
+ menu->addSeparator();
+
+ auto* levels = new QMenu(tr("&Level"));
+ menu->addMenu(levels);
+
+ auto* ag = new QActionGroup(menu);
+
+ auto addAction = [&](auto&& text, auto&& level) {
+ auto* a = new QAction(text, ag);
+
+ a->setCheckable(true);
+ a->setChecked(log::getDefault().level() == level);
+
+ connect(a, &QAction::triggered, [this, level]{
+ if (m_core) {
+ m_core->setLogLevel(level);
+ }
+ });
+
+ levels->addAction(a);
+ };
+
+ addAction(tr("&Debug"), log::Debug);
+ addAction(tr("&Info"), log::Info);
+ addAction(tr("&Warnings"), log::Warning);
+ addAction(tr("&Errors"), log::Error);
+
+ return menu;
+}
+
+void LogList::onContextMenu(const QPoint& pos)
+{
+ auto* menu = createMenu(this);
+ menu->popup(viewport()->mapToGlobal(pos));
+}
diff --git a/src/loglist.h b/src/loglist.h
index d1f7a2ad..ae827ca7 100644
--- a/src/loglist.h
+++ b/src/loglist.h
@@ -20,14 +20,11 @@ along with Mod Organizer. If not, see .
#ifndef LOGBUFFER_H
#define LOGBUFFER_H
-#include
-#include
-#include
-#include
-#include
-#include
+#include
#include
+class OrganizerCore;
+
class LogModel : public QAbstractItemModel
{
Q_OBJECT
@@ -65,7 +62,14 @@ class LogList : public QTreeView
public:
LogList(QWidget* parent=nullptr);
+ void setCore(OrganizerCore& core);
+
void copyToClipboard();
+ QMenu* createMenu(QWidget* parent=nullptr);
+
+private:
+ OrganizerCore* m_core;
+ void onContextMenu(const QPoint& pos);
};
#endif // LOGBUFFER_H
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 8a8a99ef..761e9843 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -59,7 +59,6 @@ along with Mod Organizer. If not, see .
#include "installationmanager.h"
#include "lockeddialog.h"
#include "waitingonclosedialog.h"
-#include "loglist.h"
#include "downloadlistsortproxy.h"
#include "motddialog.h"
#include "filedialogmemory.h"
@@ -358,7 +357,7 @@ MainWindow::MainWindow(QSettings &initSettings
m_CategoryFactory.loadCategories();
- setupLogMenu();
+ ui->logList->setCore(m_OrganizerCore);
int splitterSize = this->size().height(); // actually total window size, but the splitter doesn't seem to return the true value
ui->topLevelSplitter->setSizes(QList() << splitterSize - 100 << 100);
@@ -813,36 +812,6 @@ void MainWindow::setupActionMenu(QAction* a)
tb->setPopupMode(QToolButton::InstantPopup);
}
-void MainWindow::setupLogMenu()
-{
- connect(ui->logList, &QWidget::customContextMenuRequested, [&](auto&& pos){
- auto* menu = new QMenu(ui->logList);
-
- menu->addAction(tr("Copy& Log"), [&]{ ui->logList->copyToClipboard(); });
- menu->addSeparator();
-
- auto* levels = new QMenu(tr("&Level"));
- menu->addMenu(levels);
-
- auto* ag = new QActionGroup(menu);
-
- auto addAction = [&](auto&& text, auto&& level) {
- auto* a = new QAction(text, ag);
- a->setCheckable(true);
- a->setChecked(log::getDefault().level() == level);
- connect(a, &QAction::triggered, [this, level]{ setLogLevel(level); });
- levels->addAction(a);
- };
-
- addAction(tr("&Debug"), log::Debug);
- addAction(tr("&Info"), log::Info);
- addAction(tr("&Warnings"), log::Warning);
- addAction(tr("&Errors"), log::Error);
-
- menu->popup(ui->logList->viewport()->mapToGlobal(pos));
- });
-}
-
void MainWindow::updatePinnedExecutables()
{
for (auto* a : ui->toolBar->actions()) {
@@ -1432,11 +1401,6 @@ bool MainWindow::confirmExit()
void MainWindow::cleanup()
{
- if (ui->logList->model() != nullptr) {
- disconnect(ui->logList->model(), nullptr, nullptr, nullptr);
- ui->logList->setModel(nullptr);
- }
-
QWebEngineProfile::defaultProfile()->clearAllVisitedLinks();
m_IntegratedBrowser.close();
m_SaveMetaTimer.stop();
@@ -5317,24 +5281,12 @@ void MainWindow::on_actionSettings_triggered()
m_statusBar->checkSettings(m_OrganizerCore.settings());
updateDownloadView();
- setLogLevel(settings.logLevel());
+ m_OrganizerCore.setLogLevel(settings.logLevel());
m_OrganizerCore.cycleDiagnostics();
toggleMO2EndorseState();
}
-void MainWindow::setLogLevel(log::Levels level)
-{
- auto& s = m_OrganizerCore.settings();
-
- s.setLogLevel(level);
-
- m_OrganizerCore.updateVFSParams(
- s.logLevel(), s.crashDumpsType(), s.executablesBlacklist());
-
- log::getDefault().setLevel(s.logLevel());
-}
-
void MainWindow::on_actionNexus_triggered()
{
const IPluginGame *game = m_OrganizerCore.managedGame();
@@ -6858,11 +6810,6 @@ void MainWindow::on_restoreModsButton_clicked()
}
}
-void MainWindow::on_actionLogCopy_triggered()
-{
- ui->logList->copyToClipboard();
-}
-
void MainWindow::on_categoriesAndBtn_toggled(bool checked)
{
if (checked) {
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 74993667..aa49205d 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -636,13 +636,10 @@ private slots:
void search_activated();
void searchClear_activated();
- void setupLogMenu();
void resetActionIcons();
void updateModCount();
void updatePluginCount();
- void setLogLevel(MOBase::log::Levels level);
-
private slots: // ui slots
// actions
void on_actionAdd_Profile_triggered();
@@ -696,7 +693,6 @@ private slots: // ui slots
void on_restoreButton_clicked();
void on_restoreModsButton_clicked();
void on_saveModsButton_clicked();
- void on_actionLogCopy_triggered();
void on_categoriesAndBtn_toggled(bool checked);
void on_categoriesOrBtn_toggled(bool checked);
void on_managedArchiveLabel_linkHovered(const QString &link);
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index fc2bcdd3..6c6d0bca 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1757,20 +1757,6 @@ p, li { white-space: pre-wrap; }
Log
-
-
- Copy &Log
-
-
- Copy &Log
-
-
- Copy log to clipboard
-
-
- Copy log to clipboard
-
-
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 92372d82..1e164525 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -731,6 +731,18 @@ void OrganizerCore::updateVFSParams(
m_USVFS.updateParams(logLevel, crashDumpsType, executableBlacklist);
}
+void OrganizerCore::setLogLevel(log::Levels level)
+{
+ m_Settings.setLogLevel(level);
+
+ updateVFSParams(
+ m_Settings.logLevel(),
+ m_Settings.crashDumpsType(),
+ m_Settings.executablesBlacklist());
+
+ log::getDefault().setLevel(m_Settings.logLevel());
+}
+
bool OrganizerCore::cycleDiagnostics() {
if (int maxDumps = settings().crashDumpsMax())
removeOldFiles(QString::fromStdWString(crashDumpsPath()), "*.dmp", maxDumps, QDir::Time|QDir::Reversed);
diff --git a/src/organizercore.h b/src/organizercore.h
index c368d101..2aa7e707 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -196,6 +196,8 @@ public:
MOBase::log::Levels logLevel, int crashDumpsType,
QString executableBlacklist);
+ void setLogLevel(MOBase::log::Levels level);
+
bool cycleDiagnostics();
static CrashDumpsType getGlobalCrashDumpsType() { return m_globalCrashDumpsType; }
--
cgit v1.3.1