summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/loglist.cpp61
-rw-r--r--src/loglist.h14
-rw-r--r--src/mainwindow.cpp35
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/mainwindow.ui10
5 files changed, 74 insertions, 47 deletions
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<MOBase::log::Entry>& 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<int>(m_messages.size());
+ const int row = static_cast<int>(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<int>(m_messages.size());
+ return static_cast<int>(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<std::size_t>(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<LogModel*>(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<MOBase::log::Entry>& 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<MOBase::log::Entry> m_messages;
+ std::deque<MOBase::log::Entry> 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<int>() << 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; }
<number>0</number>
</property>
<item>
- <widget class="QTreeView" name="logList">
+ <widget class="LogList" name="logList">
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
- <property name="selectionMode">
- <enum>QAbstractItemView::ExtendedSelection</enum>
- </property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
@@ -1807,6 +1804,11 @@ p, li { white-space: pre-wrap; }
<extends>QWidget</extends>
<header>sortabletreewidget.h</header>
</customwidget>
+ <customwidget>
+ <class>LogList</class>
+ <extends>QTreeView</extends>
+ <header>loglist.h</header>
+ </customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>