mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
refactor: debug count and popup (#4921)
* Moved implementation of the methods to the `cpp` file. * Added `DebugCount::Flag(s)` and `DebugCount::configure(name, flags)`. * Moved from `QMap` to `std::map` (order is important here). * Used `QStringBuilder` for concatenations. * Used `QLocale` for formatting (adds separators). * Added `DebugCount::Flag::DataSize` for data sizes in bytes (and fixed language to English). * Used `DataSize` for image sizes (maybe this should be moved somewhere else?). * Added copy button to popup. * Fixed Image usage reporting being eight times too large (could be another PR, but honestly it's four characters).
This commit is contained in:
parent
5c0219c245
commit
7ecbfa0cdb
|
@ -43,6 +43,7 @@
|
||||||
- Dev: Replace `boost::optional` with `std::optional`. (#4877)
|
- Dev: Replace `boost::optional` with `std::optional`. (#4877)
|
||||||
- Dev: Improve performance by reducing repaints caused by selections. (#4889)
|
- Dev: Improve performance by reducing repaints caused by selections. (#4889)
|
||||||
- Dev: Removed direct dependency on Qt 5 compatibility module. (#4906)
|
- Dev: Removed direct dependency on Qt 5 compatibility module. (#4906)
|
||||||
|
- Dev: Refactor `DebugCount` and add copy button to debug popup. (#4921)
|
||||||
|
|
||||||
## 2.4.6
|
## 2.4.6
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace detail {
|
||||||
{
|
{
|
||||||
auto sz = frame.image.size();
|
auto sz = frame.image.size();
|
||||||
auto area = sz.width() * sz.height();
|
auto area = sz.width() * sz.height();
|
||||||
auto memory = area * frame.image.depth();
|
auto memory = area * frame.image.depth() / 8;
|
||||||
|
|
||||||
usage += memory;
|
usage += memory;
|
||||||
}
|
}
|
||||||
|
@ -608,6 +608,13 @@ ImageExpirationPool::ImageExpirationPool()
|
||||||
this->freeTimer_->start(
|
this->freeTimer_->start(
|
||||||
std::chrono::duration_cast<std::chrono::milliseconds>(
|
std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
IMAGE_POOL_CLEANUP_INTERVAL));
|
IMAGE_POOL_CLEANUP_INTERVAL));
|
||||||
|
|
||||||
|
// configure all debug counts used by images
|
||||||
|
DebugCount::configure("image bytes", DebugCount::Flag::DataSize);
|
||||||
|
DebugCount::configure("image bytes (ever loaded)",
|
||||||
|
DebugCount::Flag::DataSize);
|
||||||
|
DebugCount::configure("image bytes (ever unloaded)",
|
||||||
|
DebugCount::Flag::DataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageExpirationPool &ImageExpirationPool::instance()
|
ImageExpirationPool &ImageExpirationPool::instance()
|
||||||
|
|
|
@ -1,7 +1,114 @@
|
||||||
#include "DebugCount.hpp"
|
#include "util/DebugCount.hpp"
|
||||||
|
|
||||||
|
#include "common/UniqueAccess.hpp"
|
||||||
|
|
||||||
|
#include <QLocale>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using namespace chatterino;
|
||||||
|
|
||||||
|
struct Count {
|
||||||
|
int64_t value = 0;
|
||||||
|
DebugCount::Flags flags = DebugCount::Flag::None;
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
UniqueAccess<std::map<QString, Count>> COUNTS;
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
UniqueAccess<QMap<QString, int64_t>> DebugCount::counts_;
|
void DebugCount::configure(const QString &name, Flags flags)
|
||||||
|
{
|
||||||
|
auto counts = COUNTS.access();
|
||||||
|
|
||||||
|
auto it = counts->find(name);
|
||||||
|
if (it == counts->end())
|
||||||
|
{
|
||||||
|
counts->emplace(name, Count{.flags = flags});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->second.flags = flags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugCount::set(const QString &name, const int64_t &amount)
|
||||||
|
{
|
||||||
|
auto counts = COUNTS.access();
|
||||||
|
|
||||||
|
auto it = counts->find(name);
|
||||||
|
if (it == counts->end())
|
||||||
|
{
|
||||||
|
counts->emplace(name, Count{amount});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->second.value = amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugCount::increase(const QString &name, const int64_t &amount)
|
||||||
|
{
|
||||||
|
auto counts = COUNTS.access();
|
||||||
|
|
||||||
|
auto it = counts->find(name);
|
||||||
|
if (it == counts->end())
|
||||||
|
{
|
||||||
|
counts->emplace(name, Count{amount});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->second.value += amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugCount::decrease(const QString &name, const int64_t &amount)
|
||||||
|
{
|
||||||
|
auto counts = COUNTS.access();
|
||||||
|
|
||||||
|
auto it = counts->find(name);
|
||||||
|
if (it == counts->end())
|
||||||
|
{
|
||||||
|
counts->emplace(name, Count{-amount});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->second.value -= amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DebugCount::getDebugText()
|
||||||
|
{
|
||||||
|
#if QT_VERSION > QT_VERSION_CHECK(5, 13, 0)
|
||||||
|
static const QLocale locale(QLocale::English);
|
||||||
|
#else
|
||||||
|
static QLocale locale(QLocale::English);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto counts = COUNTS.access();
|
||||||
|
|
||||||
|
QString text;
|
||||||
|
for (const auto &[key, count] : *counts)
|
||||||
|
{
|
||||||
|
QString formatted;
|
||||||
|
if (count.flags.has(Flag::DataSize))
|
||||||
|
{
|
||||||
|
formatted = locale.formattedDataSize(count.value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
formatted = locale.toString(static_cast<qlonglong>(count.value));
|
||||||
|
}
|
||||||
|
|
||||||
|
text += key % ": " % formatted % '\n';
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace chatterino
|
} // namespace chatterino
|
||||||
|
|
|
@ -1,111 +1,38 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/UniqueAccess.hpp"
|
#include "common/FlagsEnum.hpp"
|
||||||
|
|
||||||
#include <QMap>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include <mutex>
|
|
||||||
#include <typeinfo>
|
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
class DebugCount
|
class DebugCount
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum class Flag : uint16_t {
|
||||||
|
None = 0,
|
||||||
|
/// The value is a data size in bytes
|
||||||
|
DataSize = 1 << 0,
|
||||||
|
};
|
||||||
|
using Flags = FlagsEnum<Flag>;
|
||||||
|
|
||||||
|
static void configure(const QString &name, Flags flags);
|
||||||
|
|
||||||
|
static void set(const QString &name, const int64_t &amount);
|
||||||
|
|
||||||
|
static void increase(const QString &name, const int64_t &amount);
|
||||||
static void increase(const QString &name)
|
static void increase(const QString &name)
|
||||||
{
|
{
|
||||||
auto counts = counts_.access();
|
DebugCount::increase(name, 1);
|
||||||
|
|
||||||
auto it = counts->find(name);
|
|
||||||
if (it == counts->end())
|
|
||||||
{
|
|
||||||
counts->insert(name, 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reinterpret_cast<int64_t &>(it.value())++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void set(const QString &name, const int64_t &amount)
|
|
||||||
{
|
|
||||||
auto counts = counts_.access();
|
|
||||||
|
|
||||||
auto it = counts->find(name);
|
|
||||||
if (it == counts->end())
|
|
||||||
{
|
|
||||||
counts->insert(name, amount);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reinterpret_cast<int64_t &>(it.value()) = amount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void increase(const QString &name, const int64_t &amount)
|
|
||||||
{
|
|
||||||
auto counts = counts_.access();
|
|
||||||
|
|
||||||
auto it = counts->find(name);
|
|
||||||
if (it == counts->end())
|
|
||||||
{
|
|
||||||
counts->insert(name, amount);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reinterpret_cast<int64_t &>(it.value()) += amount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void decrease(const QString &name, const int64_t &amount);
|
||||||
static void decrease(const QString &name)
|
static void decrease(const QString &name)
|
||||||
{
|
{
|
||||||
auto counts = counts_.access();
|
DebugCount::decrease(name, 1);
|
||||||
|
|
||||||
auto it = counts->find(name);
|
|
||||||
if (it == counts->end())
|
|
||||||
{
|
|
||||||
counts->insert(name, -1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reinterpret_cast<int64_t &>(it.value())--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void decrease(const QString &name, const int64_t &amount)
|
|
||||||
{
|
|
||||||
auto counts = counts_.access();
|
|
||||||
|
|
||||||
auto it = counts->find(name);
|
|
||||||
if (it == counts->end())
|
|
||||||
{
|
|
||||||
counts->insert(name, -amount);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reinterpret_cast<int64_t &>(it.value()) -= amount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString getDebugText()
|
static QString getDebugText();
|
||||||
{
|
|
||||||
auto counts = counts_.access();
|
|
||||||
|
|
||||||
QString text;
|
|
||||||
for (auto it = counts->begin(); it != counts->end(); it++)
|
|
||||||
{
|
|
||||||
text += it.key() + ": " + QString::number(it.value()) + "\n";
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString toString()
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static UniqueAccess<QMap<QString, int64_t>> counts_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace chatterino
|
} // namespace chatterino
|
||||||
|
|
|
@ -1,29 +1,40 @@
|
||||||
#include "DebugPopup.hpp"
|
#include "widgets/helper/DebugPopup.hpp"
|
||||||
|
|
||||||
|
#include "common/Literals.hpp"
|
||||||
|
#include "util/Clipboard.hpp"
|
||||||
#include "util/DebugCount.hpp"
|
#include "util/DebugCount.hpp"
|
||||||
|
|
||||||
#include <QFontDatabase>
|
#include <QFontDatabase>
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
#include <QPushButton>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
|
using namespace literals;
|
||||||
|
|
||||||
DebugPopup::DebugPopup()
|
DebugPopup::DebugPopup()
|
||||||
{
|
{
|
||||||
auto *layout = new QHBoxLayout(this);
|
auto *layout = new QVBoxLayout(this);
|
||||||
auto *text = new QLabel(this);
|
auto *text = new QLabel(this);
|
||||||
auto *timer = new QTimer(this);
|
auto *timer = new QTimer(this);
|
||||||
|
auto *copyButton = new QPushButton(u"&Copy"_s);
|
||||||
|
|
||||||
timer->setInterval(300);
|
|
||||||
QObject::connect(timer, &QTimer::timeout, [text] {
|
QObject::connect(timer, &QTimer::timeout, [text] {
|
||||||
text->setText(DebugCount::getDebugText());
|
text->setText(DebugCount::getDebugText());
|
||||||
});
|
});
|
||||||
timer->start();
|
timer->start(300);
|
||||||
|
text->setText(DebugCount::getDebugText());
|
||||||
|
|
||||||
text->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
|
text->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
|
||||||
|
|
||||||
layout->addWidget(text);
|
layout->addWidget(text);
|
||||||
|
layout->addWidget(copyButton, 1);
|
||||||
|
|
||||||
|
QObject::connect(copyButton, &QPushButton::clicked, this, [text] {
|
||||||
|
crossPlatformCopy(text->text());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace chatterino
|
} // namespace chatterino
|
||||||
|
|
Loading…
Reference in a new issue