You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktorrent/plugins/infowidget/statustab.cpp

268 lines
6.8 KiB

/***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* joris.guisson@gmail.com *
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <math.h>
#include <float.h>
#include <tqdatetime.h>
#include <tqcheckbox.h>
#include <kglobal.h>
#include <klocale.h>
#include <interfaces/functions.h>
#include <interfaces/torrentinterface.h>
#include "downloadedchunkbar.h"
#include "availabilitychunkbar.h"
#include "floatspinbox.h"
#include "statustab.h"
namespace kt
{
StatusTab::StatusTab(TQWidget* parent, const char* name, WFlags fl)
: StatusTabBase(parent,name,fl),curr_tc(0)
{
TQColorGroup cg = colorGroup();
// do not use hardcoded colors
m_info_caption->setPaletteBackgroundColor(cg.mid());
m_chunks_caption->setPaletteBackgroundColor(cg.mid());
m_sharing_caption->setPaletteBackgroundColor(cg.mid());
maxRatio->setMinValue(0.0f);
maxRatio->setMaxValue(100.0f);
maxRatio->setStep(0.1f);
connect(maxRatio, TQT_SIGNAL(valueHasChanged()), this, TQT_SLOT(maxRatioReturnPressed()));
connect(useLimit, TQT_SIGNAL( toggled(bool) ), this, TQT_SLOT( useLimitToggled(bool) ) );
maxTime->setMinValue(0.0f);
maxTime->setMaxValue(10000000.0f);
maxTime->setStep(0.05f);
maxTime->setSpecialValueText(i18n("No limit"));
connect(useTimeLimit,TQT_SIGNAL(toggled(bool)), this,TQT_SLOT(useTimeLimitToggled(bool)));
connect(maxTime,TQT_SIGNAL(valueHasChanged()), this, TQT_SLOT(timeValueChanged()));
int h = (int)ceil(fontMetrics().height()*1.25);
m_chunk_bar->setFixedHeight(h);
m_av_chunk_bar->setFixedHeight(h);
}
StatusTab::~StatusTab()
{}
void StatusTab::changeTC(kt::TorrentInterface* tc)
{
if (tc == curr_tc)
return;
curr_tc = tc;
m_chunk_bar->setTC(tc);
m_av_chunk_bar->setTC(tc);
setEnabled(tc != 0);
if (curr_tc)
{
float ratio = curr_tc->getMaxShareRatio();
if(ratio > 0)
{
useLimit->setChecked(true);
maxRatio->setValue(ratio);
}
else
{
maxRatio->setValue(0.0);
useLimit->setChecked(false);
maxRatio->setEnabled(false);
}
float hours = curr_tc->getMaxSeedTime();
if (hours > 0)
{
maxTime->setEnabled(true);
useTimeLimit->setChecked(true);
maxTime->setValue(hours);
}
else
{
maxTime->setEnabled(false);
useTimeLimit->setChecked(false);
}
}
else
{
maxRatio->setValue(0.00f);
m_share_ratio->clear();
m_tracker_status->clear();
m_seeders->clear();
m_leechers->clear();
m_tracker_update_time->clear();
m_avg_up->clear();
m_avg_down->clear();
}
update();
}
void StatusTab::update()
{
if (!curr_tc)
return;
const TorrentStats & s = curr_tc->getStats();
m_chunk_bar->updateBar();
m_av_chunk_bar->updateBar();
if (s.running)
{
TQTime t;
t = t.addSecs(curr_tc->getTimeToNextTrackerUpdate());
m_tracker_update_time->setText(t.toString("mm:ss"));
}
else
{
m_tracker_update_time->setText("");
}
m_tracker_status->setText(s.trackerstatus);
m_seeders->setText(TQString("%1 (%2)")
.tqarg(s.seeders_connected_to).tqarg(s.seeders_total));
m_leechers->setText(TQString("%1 (%2)")
.tqarg(s.leechers_connected_to).tqarg(s.leechers_total));
float ratio = kt::ShareRatio(s);
if(!maxRatio->hasFocus() && useLimit->isChecked())
maxRatioUpdate();
m_share_ratio->setText(TQString("<font color=\"%1\">%2</font>").tqarg(ratio <= 0.8 ? "#ff0000" : "#1c9a1c").tqarg(KGlobal::locale()->formatNumber(ratio,2)));
Uint32 secs = curr_tc->getRunningTimeUL();
if (secs == 0)
{
m_avg_up->setText(KBytesPerSecToString(0));
}
else
{
double r = (double)s.bytes_uploaded / 1024.0;
m_avg_up->setText(KBytesPerSecToString(r / secs));
}
secs = curr_tc->getRunningTimeDL();
if (secs == 0)
{
m_avg_down->setText(KBytesPerSecToString(0));
}
else
{
double r = (double)(s.bytes_downloaded - s.imported_bytes)/ 1024.0;
m_avg_down->setText(KBytesPerSecToString(r / secs));
}
}
void StatusTab::maxRatioReturnPressed()
{
if(!curr_tc)
return;
curr_tc->setMaxShareRatio(maxRatio->value());
}
void StatusTab::useLimitToggled(bool state)
{
if(!curr_tc)
return;
maxRatio->setEnabled(state);
if (!state)
{
curr_tc->setMaxShareRatio(0.00f);
maxRatio->setValue(0.00f);
}
else
{
float msr = curr_tc->getMaxShareRatio();
if(msr == 0.00f)
{
curr_tc->setMaxShareRatio(1.00f);
maxRatio->setValue(1.00f);
}
float sr = kt::ShareRatio(curr_tc->getStats());
if(sr >= 1.00f)
{
//always add 1 to max share ratio to prevent stopping if torrent is running.
curr_tc->setMaxShareRatio(sr + 1.00f);
maxRatio->setValue(sr + 1.00f);
}
}
}
void StatusTab::maxRatioUpdate()
{
if(!curr_tc)
return;
float ratio = curr_tc->getMaxShareRatio();
if(ratio > 0.00f)
{
maxRatio->setEnabled(true);
useLimit->setChecked(true);
maxRatio->setValue(ratio);
}
else
{
maxRatio->setEnabled(false);
useLimit->setChecked(false);
maxRatio->setValue(0.00f);
}
}
void StatusTab::useTimeLimitToggled(bool on)
{
if(!curr_tc)
return;
maxTime->setEnabled(on);
if (on)
{
Uint32 dl = curr_tc->getRunningTimeDL();
Uint32 ul = curr_tc->getRunningTimeUL();
float hours = (ul - dl) / 3600.0f + 1.0; // add one hour to current seed time to not stop immediatly
maxTime->setValue(hours);
curr_tc->setMaxSeedTime(hours);
}
else
{
curr_tc->setMaxSeedTime(0.0f);
}
}
void StatusTab::timeValueChanged()
{
if (curr_tc)
curr_tc->setMaxSeedTime(maxTime->value());
}
}
#include "statustab.moc"