2022-01-20 18:27:56 +00:00
|
|
|
// This file Copyright © 2007-2022 Mnemosyne LLC.
|
2022-02-07 16:25:02 +00:00
|
|
|
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
2022-01-20 18:27:56 +00:00
|
|
|
// or any future license endorsed by Mnemosyne LLC.
|
|
|
|
// License text can be found in the licenses/ folder.
|
2007-11-27 03:29:51 +00:00
|
|
|
|
2022-01-13 02:13:58 +00:00
|
|
|
#include <memory>
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
#include <glibmm.h>
|
|
|
|
#include <glibmm/i18n.h>
|
|
|
|
|
2022-03-21 14:15:48 +00:00
|
|
|
#include <fmt/core.h>
|
|
|
|
|
2021-11-01 00:11:23 +00:00
|
|
|
#include "HigWorkarea.h"
|
|
|
|
#include "PrefsDialog.h"
|
|
|
|
#include "Session.h"
|
|
|
|
#include "StatsDialog.h"
|
|
|
|
#include "Utils.h"
|
2007-11-27 03:29:51 +00:00
|
|
|
|
2022-02-09 02:25:19 +00:00
|
|
|
static auto constexpr TR_RESPONSE_RESET = int{ 1 };
|
2008-04-22 14:07:42 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
class StatsDialog::Impl
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
public:
|
2021-11-01 00:11:23 +00:00
|
|
|
Impl(StatsDialog& dialog, Glib::RefPtr<Session> const& core);
|
2021-10-18 20:22:31 +00:00
|
|
|
~Impl();
|
|
|
|
|
2021-12-14 08:43:27 +00:00
|
|
|
TR_DISABLE_COPY_MOVE(Impl)
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
private:
|
|
|
|
bool updateStats();
|
|
|
|
void dialogResponse(int response);
|
|
|
|
|
|
|
|
private:
|
|
|
|
StatsDialog& dialog_;
|
2021-11-01 00:11:23 +00:00
|
|
|
Glib::RefPtr<Session> const core_;
|
2021-10-18 20:22:31 +00:00
|
|
|
|
|
|
|
Gtk::Label* one_up_lb_;
|
|
|
|
Gtk::Label* one_down_lb_;
|
|
|
|
Gtk::Label* one_ratio_lb_;
|
|
|
|
Gtk::Label* one_time_lb_;
|
2012-12-13 03:00:57 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
Gtk::Label* all_up_lb_;
|
|
|
|
Gtk::Label* all_down_lb_;
|
|
|
|
Gtk::Label* all_ratio_lb_;
|
|
|
|
Gtk::Label* all_time_lb_;
|
2012-12-13 03:00:57 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
Gtk::Label* all_sessions_lb_;
|
2012-12-13 03:00:57 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
sigc::connection update_stats_tag_;
|
2007-11-27 03:29:51 +00:00
|
|
|
};
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
namespace
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
void setLabel(Gtk::Label* l, Glib::ustring const& str)
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
gtr_label_set_text(*l, str);
|
|
|
|
}
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
void setLabelFromRatio(Gtk::Label* l, double d)
|
|
|
|
{
|
|
|
|
setLabel(l, tr_strlratio(d));
|
2007-11-27 03:29:51 +00:00
|
|
|
}
|
|
|
|
|
2022-03-21 14:15:48 +00:00
|
|
|
auto startedTimesText(uint64_t n)
|
|
|
|
{
|
|
|
|
return fmt::format(ngettext("Started {count:L} time", "Started {count:L} times", n), fmt::arg("count", n));
|
|
|
|
}
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
bool StatsDialog::Impl::updateStats()
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
2022-07-28 23:56:40 +00:00
|
|
|
auto stats = tr_sessionGetStats(core_->get_session());
|
|
|
|
setLabel(one_up_lb_, tr_strlsize(stats.uploadedBytes));
|
|
|
|
setLabel(one_down_lb_, tr_strlsize(stats.downloadedBytes));
|
|
|
|
setLabel(one_time_lb_, tr_format_time(stats.secondsActive));
|
|
|
|
setLabelFromRatio(one_ratio_lb_, stats.ratio);
|
|
|
|
|
|
|
|
stats = tr_sessionGetCumulativeStats(core_->get_session());
|
|
|
|
setLabel(all_sessions_lb_, startedTimesText(stats.sessionCount));
|
|
|
|
setLabel(all_up_lb_, tr_strlsize(stats.uploadedBytes));
|
|
|
|
setLabel(all_down_lb_, tr_strlsize(stats.downloadedBytes));
|
|
|
|
setLabel(all_time_lb_, tr_format_time(stats.secondsActive));
|
|
|
|
setLabelFromRatio(all_ratio_lb_, stats.ratio);
|
2020-08-18 10:36:10 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
return true;
|
2008-06-05 20:41:32 +00:00
|
|
|
}
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
StatsDialog::Impl::~Impl()
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
update_stats_tag_.disconnect();
|
|
|
|
}
|
2008-04-22 14:07:42 +00:00
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
void StatsDialog::Impl::dialogResponse(int response)
|
|
|
|
{
|
2017-04-19 12:04:45 +00:00
|
|
|
if (response == TR_RESPONSE_RESET)
|
2008-04-22 14:07:42 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
Gtk::MessageDialog w(dialog_, _("Reset your statistics?"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, true);
|
|
|
|
w.add_button(_("_Cancel"), Gtk::RESPONSE_CANCEL);
|
|
|
|
w.add_button(_("_Reset"), TR_RESPONSE_RESET);
|
|
|
|
w.set_secondary_text(
|
|
|
|
_("These statistics are for your information only. "
|
|
|
|
"Resetting them doesn't affect the statistics logged by your BitTorrent trackers."));
|
|
|
|
|
|
|
|
if (w.run() == TR_RESPONSE_RESET)
|
2010-01-03 17:58:33 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
tr_sessionClearStats(core_->get_session());
|
|
|
|
updateStats();
|
2010-01-03 17:58:33 +00:00
|
|
|
}
|
2008-04-22 14:07:42 +00:00
|
|
|
}
|
|
|
|
|
2021-10-18 20:22:31 +00:00
|
|
|
if (response == Gtk::RESPONSE_CLOSE)
|
2017-04-19 12:04:45 +00:00
|
|
|
{
|
2021-10-18 20:22:31 +00:00
|
|
|
dialog_.hide();
|
2017-04-19 12:04:45 +00:00
|
|
|
}
|
2007-11-27 03:29:51 +00:00
|
|
|
}
|
|
|
|
|
2021-11-01 00:11:23 +00:00
|
|
|
std::unique_ptr<StatsDialog> StatsDialog::create(Gtk::Window& parent, Glib::RefPtr<Session> const& core)
|
2021-10-18 20:22:31 +00:00
|
|
|
{
|
|
|
|
return std::unique_ptr<StatsDialog>(new StatsDialog(parent, core));
|
|
|
|
}
|
|
|
|
|
2021-11-01 00:11:23 +00:00
|
|
|
StatsDialog::StatsDialog(Gtk::Window& parent, Glib::RefPtr<Session> const& core)
|
2021-10-18 20:22:31 +00:00
|
|
|
: Gtk::Dialog(_("Statistics"), parent)
|
|
|
|
, impl_(std::make_unique<Impl>(*this, core))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
StatsDialog::~StatsDialog() = default;
|
|
|
|
|
2021-11-01 00:11:23 +00:00
|
|
|
StatsDialog::Impl::Impl(StatsDialog& dialog, Glib::RefPtr<Session> const& core)
|
2021-10-18 20:22:31 +00:00
|
|
|
: dialog_(dialog)
|
|
|
|
, core_(core)
|
2007-11-27 03:29:51 +00:00
|
|
|
{
|
2017-04-19 12:04:45 +00:00
|
|
|
guint row = 0;
|
2021-10-18 20:22:31 +00:00
|
|
|
|
|
|
|
dialog_.add_button(_("_Reset"), TR_RESPONSE_RESET);
|
|
|
|
dialog_.add_button(_("_Close"), Gtk::RESPONSE_CLOSE);
|
|
|
|
dialog_.set_default_response(Gtk::RESPONSE_CLOSE);
|
|
|
|
|
|
|
|
auto* t = Gtk::make_managed<HigWorkarea>();
|
|
|
|
t->add_section_title(row, _("Current Session"));
|
|
|
|
|
|
|
|
one_up_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
one_up_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Uploaded:"), *one_up_lb_);
|
|
|
|
one_down_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
one_down_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Downloaded:"), *one_down_lb_);
|
|
|
|
one_ratio_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
one_ratio_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Ratio:"), *one_ratio_lb_);
|
|
|
|
one_time_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
one_time_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Duration:"), *one_time_lb_);
|
|
|
|
|
|
|
|
t->add_section_divider(row);
|
|
|
|
t->add_section_title(row, _("Total"));
|
|
|
|
|
2022-03-21 14:15:48 +00:00
|
|
|
all_sessions_lb_ = Gtk::make_managed<Gtk::Label>(startedTimesText(1));
|
2021-10-18 20:22:31 +00:00
|
|
|
all_sessions_lb_->set_single_line_mode(true);
|
|
|
|
t->add_label_w(row, *all_sessions_lb_);
|
2019-03-17 05:00:15 +00:00
|
|
|
++row;
|
2021-10-18 20:22:31 +00:00
|
|
|
|
|
|
|
all_up_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
all_up_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Uploaded:"), *all_up_lb_);
|
|
|
|
all_down_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
all_down_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Downloaded:"), *all_down_lb_);
|
|
|
|
all_ratio_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
all_ratio_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Ratio:"), *all_ratio_lb_);
|
|
|
|
all_time_lb_ = Gtk::make_managed<Gtk::Label>();
|
|
|
|
all_time_lb_->set_single_line_mode(true);
|
|
|
|
t->add_row(row, _("Duration:"), *all_time_lb_);
|
|
|
|
|
|
|
|
gtr_dialog_set_content(dialog_, *t);
|
|
|
|
|
|
|
|
updateStats();
|
2021-11-12 09:12:50 +00:00
|
|
|
dialog_.signal_response().connect(sigc::mem_fun(*this, &Impl::dialogResponse));
|
2021-10-18 20:22:31 +00:00
|
|
|
update_stats_tag_ = Glib::signal_timeout().connect_seconds(
|
2021-11-12 09:12:50 +00:00
|
|
|
sigc::mem_fun(*this, &Impl::updateStats),
|
2021-10-18 20:22:31 +00:00
|
|
|
SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS);
|
2007-11-27 03:29:51 +00:00
|
|
|
}
|