]> granicus.if.org Git - transmission/commitdiff
(qt) copyediting: whitespace/indentation
authorJordan Lee <jordan@transmissionbt.com>
Sun, 3 Feb 2013 19:13:04 +0000 (19:13 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Sun, 3 Feb 2013 19:13:04 +0000 (19:13 +0000)
qt/details.cc

index 8ef1887f795e80fe15b9445faaabcab4c751b7d8..19f01a5b8737e9e3ffc7d7958ce0fb6892497d1e 100644 (file)
@@ -68,21 +68,21 @@ class Session;
 
 namespace
 {
-    const int REFRESH_INTERVAL_MSEC = 4000;
-
-    const char * PREF_KEY ("pref-key");
-
-    enum // peer columns
-    {
-        COL_LOCK,
-        COL_UP,
-        COL_DOWN,
-        COL_PERCENT,
-        COL_STATUS,
-        COL_ADDRESS,
-        COL_CLIENT,
-        N_COLUMNS
-    };
+  const int REFRESH_INTERVAL_MSEC = 4000;
+
+  const char * PREF_KEY ("pref-key");
+
+  enum // peer columns
+  {
+    COL_LOCK,
+    COL_UP,
+    COL_DOWN,
+    COL_PERCENT,
+    COL_STATUS,
+    COL_ADDRESS,
+    COL_CLIENT,
+    N_COLUMNS
+  };
 }
 
 /***
@@ -91,37 +91,46 @@ namespace
 
 class PeerItem: public QTreeWidgetItem
 {
-        Peer peer;
-        QString collatedAddress;
-        QString status;
-
-    public:
-        virtual ~PeerItem () { }
-        PeerItem (const Peer& p) {
-            peer = p;
-            int q[4];
-            if (sscanf (p.address.toUtf8 ().constData (), "%d.%d.%d.%d", q+0, q+1, q+2, q+3) == 4)
-                collatedAddress.sprintf ("%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3]);
-            else
-                collatedAddress = p.address;
-        }
-    public:
-        void refresh (const Peer& p) { peer = p; }
-        void setStatus (const QString& s) { status = s; }
-        virtual bool operator< (const QTreeWidgetItem & other) const {
-            const PeerItem * i = dynamic_cast<const PeerItem*> (&other);
-            QTreeWidget * tw (treeWidget ());
-            const int column = tw ? tw->sortColumn () : 0;
-            switch (column) {
-                case COL_UP: return peer.rateToPeer < i->peer.rateToPeer;
-                case COL_DOWN: return peer.rateToClient < i->peer.rateToClient;
-                case COL_PERCENT: return peer.progress < i->peer.progress;
-                case COL_STATUS: return status < i->status;
-                case COL_CLIENT: return peer.clientName < i->peer.clientName;
-                case COL_LOCK: return peer.isEncrypted && !i->peer.isEncrypted;
-                default: return collatedAddress < i->collatedAddress;
-            }
+    Peer peer;
+    QString collatedAddress;
+    QString status;
+
+  public:
+
+    virtual ~PeerItem () {}
+
+    PeerItem (const Peer& p)
+    {
+      peer = p;
+      int q[4];
+      if (sscanf (p.address.toUtf8 ().constData (), "%d.%d.%d.%d", q+0, q+1, q+2, q+3) == 4)
+        collatedAddress.sprintf ("%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3]);
+      else
+        collatedAddress = p.address;
+    }
+
+  public:
+
+    void refresh (const Peer& p) { peer = p; }
+
+    void setStatus (const QString& s) { status = s; }
+
+    virtual bool operator< (const QTreeWidgetItem & other) const
+    {
+      const PeerItem * i = dynamic_cast<const PeerItem*> (&other);
+      QTreeWidget * tw (treeWidget ());
+      const int column = tw ? tw->sortColumn () : 0;
+      switch (column)
+        {
+          case COL_UP: return peer.rateToPeer < i->peer.rateToPeer;
+          case COL_DOWN: return peer.rateToClient < i->peer.rateToClient;
+          case COL_PERCENT: return peer.progress < i->peer.progress;
+          case COL_STATUS: return status < i->status;
+          case COL_CLIENT: return peer.clientName < i->peer.clientName;
+          case COL_LOCK: return peer.isEncrypted && !i->peer.isEncrypted;
+          default: return collatedAddress < i->collatedAddress;
         }
+    }
 };
 
 /***
@@ -131,123 +140,129 @@ class PeerItem: public QTreeWidgetItem
 QIcon
 Details :: getStockIcon (const QString& freedesktop_name, int fallback)
 {
-    QIcon icon = QIcon::fromTheme (freedesktop_name);
+  QIcon icon = QIcon::fromTheme (freedesktop_name);
 
-    if (icon.isNull ())
-        icon = style ()->standardIcon (QStyle::StandardPixmap (fallback), 0, this);
+  if (icon.isNull ())
+    icon = style ()->standardIcon (QStyle::StandardPixmap (fallback), 0, this);
 
-    return icon;
+  return icon;
 }
 
-Details :: Details (Session& session, Prefs& prefs, TorrentModel& model, QWidget * parent):
-    QDialog (parent, Qt::Dialog),
-    mySession (session),
-    myPrefs (prefs),
-    myModel (model),
-    myChangedTorrents (false),
-    myHavePendingRefresh (false)
+Details :: Details (Session       & session,
+                    Prefs         & prefs,
+                    TorrentModel  & model,
+                    QWidget       * parent):
+  QDialog (parent, Qt::Dialog),
+  mySession (session),
+  myPrefs (prefs),
+  myModel (model),
+  myChangedTorrents (false),
+  myHavePendingRefresh (false)
 {
-    QVBoxLayout * layout = new QVBoxLayout (this);
-
-    setWindowTitle (tr ("Torrent Properties"));
-
-    QTabWidget * t = new QTabWidget (this);
-    QWidget * w;
-    t->addTab (w = createInfoTab (),      tr ("Information"));
-    myWidgets << w;
-    t->addTab (w = createPeersTab (),     tr ("Peers"));
-    myWidgets << w;
-    t->addTab (w = createTrackerTab (),   tr ("Tracker"));
-    myWidgets << w;
-    t->addTab (w = createFilesTab (),     tr ("Files"));
-    myWidgets << w;
-    t->addTab (w = createOptionsTab (),   tr ("Options"));
-    myWidgets << w;
-    layout->addWidget (t);
-
-    QDialogButtonBox * buttons = new QDialogButtonBox (QDialogButtonBox::Close, Qt::Horizontal, this);
-    connect (buttons, SIGNAL (rejected ()), this, SLOT (close ()));
-    layout->addWidget (buttons);
-    QWidget::setAttribute (Qt::WA_DeleteOnClose, true);
-
-    QList<int> initKeys;
-    initKeys << Prefs :: SHOW_TRACKER_SCRAPES
-             << Prefs :: SHOW_BACKUP_TRACKERS;
-    foreach (int key, initKeys)
-        refreshPref (key);
-
-    connect (&myTimer, SIGNAL (timeout ()), this, SLOT (onTimer ()));
-    connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (int)));
-
-    onTimer ();
-    myTimer.setSingleShot (false);
-    myTimer.start (REFRESH_INTERVAL_MSEC);
+  QVBoxLayout * layout = new QVBoxLayout (this);
+
+  setWindowTitle (tr ("Torrent Properties"));
+
+  QTabWidget * t = new QTabWidget (this);
+  QWidget * w;
+  t->addTab (w = createInfoTab (),      tr ("Information"));
+  myWidgets << w;
+  t->addTab (w = createPeersTab (),     tr ("Peers"));
+  myWidgets << w;
+  t->addTab (w = createTrackerTab (),   tr ("Tracker"));
+  myWidgets << w;
+  t->addTab (w = createFilesTab (),     tr ("Files"));
+  myWidgets << w;
+  t->addTab (w = createOptionsTab (),   tr ("Options"));
+  myWidgets << w;
+  layout->addWidget (t);
+
+  QDialogButtonBox * buttons = new QDialogButtonBox (QDialogButtonBox::Close, Qt::Horizontal, this);
+  connect (buttons, SIGNAL (rejected ()), this, SLOT (close ()));
+  layout->addWidget (buttons);
+  QWidget::setAttribute (Qt::WA_DeleteOnClose, true);
+
+  QList<int> initKeys;
+  initKeys << Prefs :: SHOW_TRACKER_SCRAPES
+           << Prefs :: SHOW_BACKUP_TRACKERS;
+  foreach (int key, initKeys)
+    refreshPref (key);
+
+  connect (&myTimer, SIGNAL (timeout ()), this, SLOT (onTimer ()));
+  connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (int)));
+
+  onTimer ();
+  myTimer.setSingleShot (false);
+  myTimer.start (REFRESH_INTERVAL_MSEC);
 }
 
 Details :: ~Details ()
 {
-    myTrackerDelegate->deleteLater ();
-    myTrackerFilter->deleteLater ();
-    myTrackerModel->deleteLater ();
+  myTrackerDelegate->deleteLater ();
+  myTrackerFilter->deleteLater ();
+  myTrackerModel->deleteLater ();
 }
 
 void
 Details :: setIds (const QSet<int>& ids)
 {
-    if (ids == myIds)
-        return;
+  if (ids == myIds)
+    return;
 
-    myChangedTorrents = true;
+  myChangedTorrents = true;
 
-    // stop listening to the old torrents
-    foreach (int id, myIds) {
-        const Torrent * tor = myModel.getTorrentFromId (id);
-        if (tor)
-            disconnect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ()));
+  // stop listening to the old torrents
+  foreach (int id, myIds)
+    {
+      const Torrent * tor = myModel.getTorrentFromId (id);
+      if (tor)
+        disconnect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ()));
     }
 
-    myFileTreeView->clear ();
-    myIds = ids;
-    myTrackerModel->refresh (myModel, myIds);
-
-    // listen to the new torrents
-    foreach (int id, myIds) {
-        const Torrent * tor = myModel.getTorrentFromId (id);
-        if (tor)
-            connect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ()));
+  myFileTreeView->clear ();
+  myIds = ids;
+  myTrackerModel->refresh (myModel, myIds);
+
+  // listen to the new torrents
+  foreach (int id, myIds)
+    {
+      const Torrent * tor = myModel.getTorrentFromId (id);
+      if (tor)
+        connect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ()));
     }
 
-    foreach (QWidget * w, myWidgets)
-        w->setEnabled (false);
+  foreach (QWidget * w, myWidgets)
+    w->setEnabled (false);
 
-    onTimer ();
+  onTimer ();
 }
 
 void
 Details :: refreshPref (int key)
 {
-    QString str;
+  QString str;
 
-    switch (key)
+  switch (key)
     {
-        case Prefs :: SHOW_TRACKER_SCRAPES: {
-            QItemSelectionModel * selectionModel (myTrackerView->selectionModel ());
-            const QItemSelection selection (selectionModel->selection ());
-            const QModelIndex currentIndex (selectionModel->currentIndex ());
-            myTrackerDelegate->setShowMore (myPrefs.getBool (key));
-            selectionModel->clear ();
-            myTrackerView->reset ();
-            selectionModel->select (selection, QItemSelectionModel::Select);
-            selectionModel->setCurrentIndex (currentIndex, QItemSelectionModel::NoUpdate);
-            break;
+      case Prefs :: SHOW_TRACKER_SCRAPES:
+        {
+          QItemSelectionModel * selectionModel (myTrackerView->selectionModel ());
+          const QItemSelection selection (selectionModel->selection ());
+          const QModelIndex currentIndex (selectionModel->currentIndex ());
+          myTrackerDelegate->setShowMore (myPrefs.getBool (key));
+          selectionModel->clear ();
+          myTrackerView->reset ();
+          selectionModel->select (selection, QItemSelectionModel::Select);
+          selectionModel->setCurrentIndex (currentIndex, QItemSelectionModel::NoUpdate);
+          break;
         }
 
-        case Prefs :: SHOW_BACKUP_TRACKERS:
-            myTrackerFilter->setShowBackupTrackers (myPrefs.getBool (key));
-            break;
+      case Prefs :: SHOW_BACKUP_TRACKERS:
+        myTrackerFilter->setShowBackupTrackers (myPrefs.getBool (key));
+        break;
 
-        default:
-            break;
+      default:
+        break;
     }
 }
 
@@ -259,594 +274,660 @@ Details :: refreshPref (int key)
 QString
 Details :: timeToStringRounded (int seconds)
 {
-    if (seconds > 60) seconds -= (seconds % 60);
-    return Formatter::timeToString (seconds);
+  if (seconds > 60)
+    seconds -= (seconds % 60);
+
+  return Formatter::timeToString (seconds);
 }
 
 void
 Details :: onTimer ()
 {
-    getNewData ();
+  getNewData ();
 }
 
 void
 Details :: getNewData ()
 {
-    if (!myIds.empty ())
+  if (!myIds.empty ())
     {
-        QSet<int> infos;
-        foreach (int id, myIds) {
-            const Torrent * tor = myModel.getTorrentFromId (id);
-            if (tor->isMagnet ())
-                infos.insert (tor->id ());
+      QSet<int> infos;
+      foreach (int id, myIds)
+        {
+          const Torrent * tor = myModel.getTorrentFromId (id);
+          if (tor->isMagnet ())
+            infos.insert (tor->id ());
         }
-        if (!infos.isEmpty ())
-            mySession.initTorrents (infos);
-        mySession.refreshExtraStats (myIds);
+
+      if (!infos.isEmpty ())
+        mySession.initTorrents (infos);
+      mySession.refreshExtraStats (myIds);
     }
 }
 
 void
 Details :: onTorrentChanged ()
 {
-    if (!myHavePendingRefresh) {
-        myHavePendingRefresh = true;
-        QTimer::singleShot (100, this, SLOT (refresh ()));
+  if (!myHavePendingRefresh)
+    {
+      myHavePendingRefresh = true;
+      QTimer::singleShot (100, this, SLOT (refresh ()));
     }
 }
 
 namespace
 {
-    void setIfIdle (QComboBox * box, int i)
+  void setIfIdle (QComboBox * box, int i)
+  {
+    if (!box->hasFocus ())
+      {
+        box->blockSignals (true);
+        box->setCurrentIndex (i);
+        box->blockSignals (false);
+      }
+  }
+
+  void setIfIdle (QDoubleSpinBox * spin, double value)
+  {
+    if (!spin->hasFocus ())
+      {
+        spin->blockSignals (true);
+        spin->setValue (value);
+        spin->blockSignals (false);
+      }
+  }
+
+  void setIfIdle (QSpinBox * spin, int value)
+  {
+    if (!spin->hasFocus ())
+      {
+        spin->blockSignals (true);
+        spin->setValue (value);
+        spin->blockSignals (false);
+      }
+  }
+}
+
+void
+Details :: refresh ()
+{
+  const int n = myIds.size ();
+  const bool single = n == 1;
+  const QString blank;
+  const QFontMetrics fm (fontMetrics ());
+  QList<const Torrent*> torrents;
+  QString string;
+  const QString none = tr ("None");
+  const QString mixed = tr ("Mixed");
+  const QString unknown = tr ("Unknown");
+
+  // build a list of torrents
+  foreach (int id, myIds)
     {
-        if (!box->hasFocus ())
-        {
-            box->blockSignals (true);
-            box->setCurrentIndex (i);
-            box->blockSignals (false);
-        }
+      const Torrent * tor = myModel.getTorrentFromId (id);
+      if (tor)
+        torrents << tor;
     }
 
-    void setIfIdle (QDoubleSpinBox * spin, double value)
+  ///
+  ///  activity tab
+  ///
+
+  // myStateLabel
+  if (torrents.empty ())
     {
-        if (!spin->hasFocus ())
-        {
-            spin->blockSignals (true);
-            spin->setValue (value);
-            spin->blockSignals (false);
-        }
+      string = none;
     }
-
-    void setIfIdle (QSpinBox * spin, int value)
+  else
     {
-        if (!spin->hasFocus ())
+      bool isMixed = false;
+      bool allPaused = true;
+      bool allFinished = true;
+      const tr_torrent_activity baseline = torrents[0]->getActivity ();
+      foreach (const Torrent * t, torrents)
         {
-            spin->blockSignals (true);
-            spin->setValue (value);
-            spin->blockSignals (false);
+          const tr_torrent_activity activity = t->getActivity ();
+          if (activity != baseline)
+            isMixed = true;
+          if (activity != TR_STATUS_STOPPED)
+            allPaused = allFinished = false;
+          if (!t->isFinished ())
+            allFinished = false;
         }
-    }
-}
 
-void
-Details :: refresh ()
-{
-    const int n = myIds.size ();
-    const bool single = n == 1;
-    const QString blank;
-    const QFontMetrics fm (fontMetrics ());
-    QList<const Torrent*> torrents;
-    QString string;
-    const QString none = tr ("None");
-    const QString mixed = tr ("Mixed");
-    const QString unknown = tr ("Unknown");
-
-    // build a list of torrents
-    foreach (int id, myIds) {
-        const Torrent * tor = myModel.getTorrentFromId (id);
-        if (tor)
-            torrents << tor;
+      if (isMixed)
+        string = mixed;
+      else if (allFinished)
+        string = tr ("Finished");
+      else if (allPaused)
+        string = tr ("Paused");
+      else
+        string = torrents[0]->activityString ();
     }
+  myStateLabel->setText (string);
+  const QString stateString = string;
+
+  // myHaveLabel
+  double sizeWhenDone = 0;
+  double leftUntilDone = 0;
+  double available = 0;
+  int64_t haveTotal = 0;
+  int64_t haveVerified = 0;
+  int64_t haveUnverified = 0;
+  int64_t verifiedPieces = 0;
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      foreach (const Torrent * t, torrents)
+        {
+          if (t->hasMetadata ())
+            {
+              haveTotal += t->haveTotal ();
+              haveUnverified += t->haveUnverified ();
+              const uint64_t v = t->haveVerified ();
+              haveVerified += v;
+              if (t->pieceSize ())
+                verifiedPieces += v / t->pieceSize ();
+              sizeWhenDone += t->sizeWhenDone ();
+              leftUntilDone += t->leftUntilDone ();
+              available += t->sizeWhenDone () - t->leftUntilDone () + t->desiredAvailable ();
+            }
+        }
 
-    ///
-    ///  activity tab
-    ///
+      const double d = 100.0 * (sizeWhenDone ? (sizeWhenDone - leftUntilDone) / sizeWhenDone : 1);
+      QString pct = Formatter::percentToString (d);
 
-    // myStateLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        bool isMixed = false;
-        bool allPaused = true;
-        bool allFinished = true;
-        const tr_torrent_activity baseline = torrents[0]->getActivity ();
-        foreach (const Torrent * t, torrents) {
-            const tr_torrent_activity activity = t->getActivity ();
-            if (activity != baseline)
-                isMixed = true;
-            if (activity != TR_STATUS_STOPPED)
-                allPaused = allFinished = false;
-            if (!t->isFinished ())
-                allFinished = false;
+      if (!haveUnverified && !leftUntilDone)
+        {
+          string = tr ("%1 (100%)")
+                     .arg (Formatter::sizeToString (haveVerified));
         }
-        if (isMixed)
-            string = mixed;
-        else if (allFinished)
-            string = tr ("Finished");
-        else if (allPaused)
-            string = tr ("Paused");
-        else
-            string = torrents[0]->activityString ();
-    }
-    myStateLabel->setText (string);
-    const QString stateString = string;
-
-    // myHaveLabel
-    double sizeWhenDone = 0;
-    double leftUntilDone = 0;
-    double available = 0;
-    int64_t haveTotal = 0;
-    int64_t haveVerified = 0;
-    int64_t haveUnverified = 0;
-    int64_t verifiedPieces = 0;
-    if (torrents.empty ())
-        string = none;
-    else {
-        foreach (const Torrent * t, torrents) {
-            if (t->hasMetadata ()) {
-                haveTotal += t->haveTotal ();
-                haveUnverified += t->haveUnverified ();
-                const uint64_t v = t->haveVerified ();
-                haveVerified += v;
-                if (t->pieceSize ())
-                    verifiedPieces += v / t->pieceSize ();
-                sizeWhenDone += t->sizeWhenDone ();
-                leftUntilDone += t->leftUntilDone ();
-                available += t->sizeWhenDone () - t->leftUntilDone () + t->desiredAvailable ();
-            }
+      else if (!haveUnverified)
+        {
+          string = tr ("%1 of %2 (%3%)")
+                     .arg (Formatter::sizeToString (haveVerified))
+                     .arg (Formatter::sizeToString (sizeWhenDone))
+                     .arg (pct);
         }
+      else
         {
-            const double d = 100.0 * (sizeWhenDone ? (sizeWhenDone - leftUntilDone) / sizeWhenDone : 1);
-            QString pct = Formatter::percentToString (d);
-
-            if (!haveUnverified && !leftUntilDone)
-            {
-                string = tr ("%1 (100%)")
-                             .arg (Formatter::sizeToString (haveVerified));
-            }
-            else if (!haveUnverified)
-            {
-                string = tr ("%1 of %2 (%3%)")
-                             .arg (Formatter::sizeToString (haveVerified))
-                             .arg (Formatter::sizeToString (sizeWhenDone))
-                             .arg (pct);
-            }
-            else
-            {
-                string = tr ("%1 of %2 (%3%), %4 Unverified")
-                             .arg (Formatter::sizeToString (haveVerified + haveUnverified))
-                             .arg (Formatter::sizeToString (sizeWhenDone))
-                             .arg (pct)
-                             .arg (Formatter::sizeToString (haveUnverified));
-            }
+          string = tr ("%1 of %2 (%3%), %4 Unverified")
+                     .arg (Formatter::sizeToString (haveVerified + haveUnverified))
+                     .arg (Formatter::sizeToString (sizeWhenDone))
+                     .arg (pct)
+                     .arg (Formatter::sizeToString (haveUnverified));
         }
     }
-    myHaveLabel->setText (string);
+  myHaveLabel->setText (string);
 
-    // myAvailabilityLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        if (sizeWhenDone == 0)
-            string = none;
-        else
-            string = QString ("%1%").arg (Formatter::percentToString ( (100.0 * available) / sizeWhenDone));
-    }
-    myAvailabilityLabel->setText (string);
+  // myAvailabilityLabel
+  if (torrents.empty ())
+    string = none;
+  else if (sizeWhenDone == 0)
+    string = none;
+  else
+    string = QString ("%1%").arg (Formatter::percentToString ( (100.0 * available) / sizeWhenDone));
+  myAvailabilityLabel->setText (string);
 
-    // myDownloadedLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        uint64_t d = 0;
-        uint64_t f = 0;
-        foreach (const Torrent * t, torrents) {
-            d += t->downloadedEver ();
-            f += t->failedEver ();
+  // myDownloadedLabel
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      uint64_t d = 0;
+      uint64_t f = 0;
+      foreach (const Torrent * t, torrents)
+        {
+          d += t->downloadedEver ();
+          f += t->failedEver ();
         }
-        const QString dstr = Formatter::sizeToString (d);
-        const QString fstr = Formatter::sizeToString (f);
-        if (f)
-            string = tr ("%1 (%2 corrupt)").arg (dstr).arg (fstr);
-        else
-            string = dstr;
+      const QString dstr = Formatter::sizeToString (d);
+      const QString fstr = Formatter::sizeToString (f);
+      if (f)
+        string = tr ("%1 (%2 corrupt)").arg (dstr).arg (fstr);
+      else
+        string = dstr;
     }
-    myDownloadedLabel->setText (string);
+  myDownloadedLabel->setText (string);
 
-    if (torrents.empty ())
-        string = none;
-    else {
-        uint64_t u = 0;
-        uint64_t d = 0;
-        foreach (const Torrent * t, torrents) {
-            u += t->uploadedEver ();
-            d += t->downloadedEver ();
+  //  myUploadedLabel
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      uint64_t u = 0;
+      uint64_t d = 0;
+      foreach (const Torrent * t, torrents)
+        {
+          u += t->uploadedEver ();
+          d += t->downloadedEver ();
         }
-        string = tr ("%1 (Ratio: %2)")
-                   .arg (Formatter::sizeToString (u))
-                   .arg (Formatter::ratioToString (tr_getRatio (u, d)));
+      string = tr ("%1 (Ratio: %2)")
+                 .arg (Formatter::sizeToString (u))
+                 .arg (Formatter::ratioToString (tr_getRatio (u, d)));
     }
-    myUploadedLabel->setText (string);
+  myUploadedLabel->setText (string);
 
-    const QDateTime qdt_now = QDateTime::currentDateTime ();
+  const QDateTime qdt_now = QDateTime::currentDateTime ();
 
-    // myRunTimeLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        bool allPaused = true;
-        QDateTime baseline = torrents[0]->lastStarted ();
-        foreach (const Torrent * t, torrents) {
-            if (baseline != t->lastStarted ())
-                baseline = QDateTime ();
-            if (!t->isPaused ())
-                allPaused = false;
+  // myRunTimeLabel
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      bool allPaused = true;
+      QDateTime baseline = torrents[0]->lastStarted ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (baseline != t->lastStarted ())
+            baseline = QDateTime ();
+          if (!t->isPaused ())
+            allPaused = false;
         }
-        if (allPaused)
-            string = stateString; // paused || finished
-        else if (baseline.isNull ())
-            string = mixed;
-        else
-            string = Formatter::timeToString (baseline.secsTo (qdt_now));
+
+      if (allPaused)
+        string = stateString; // paused || finished
+      else if (baseline.isNull ())
+        string = mixed;
+      else
+        string = Formatter::timeToString (baseline.secsTo (qdt_now));
     }
-    myRunTimeLabel->setText (string);
+  myRunTimeLabel->setText (string);
 
 
-    // myETALabel
-    string.clear ();
-    if (torrents.empty ())
-        string = none;
-    else {
-        int baseline = torrents[0]->getETA ();
-        foreach (const Torrent * t, torrents) {
-            if (baseline != t->getETA ()) {
-                string = mixed;
-                break;
+  // myETALabel
+  string.clear ();
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      int baseline = torrents[0]->getETA ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (baseline != t->getETA ())
+            {
+              string = mixed;
+              break;
             }
         }
-        if (string.isEmpty ()) {
-            if (baseline < 0)
-                string = tr ("Unknown");
-            else
-                string = Formatter::timeToString (baseline);
+
+      if (string.isEmpty ())
+        {
+          if (baseline < 0)
+            string = tr ("Unknown");
+          else
+            string = Formatter::timeToString (baseline);
        }
     }
-    myETALabel->setText (string);
+  myETALabel->setText (string);
 
 
-    // myLastActivityLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        QDateTime latest = torrents[0]->lastActivity ();
-        foreach (const Torrent * t, torrents) {
-            const QDateTime dt = t->lastActivity ();
-            if (latest < dt)
-                latest = dt;
+  // myLastActivityLabel
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      QDateTime latest = torrents[0]->lastActivity ();
+      foreach (const Torrent * t, torrents)
+        {
+          const QDateTime dt = t->lastActivity ();
+          if (latest < dt)
+            latest = dt;
         }
-        const int seconds = latest.isValid () ? latest.secsTo (qdt_now) : -1;
-        if (seconds < 0)
-            string = none;
-        else if (seconds < 5)
-            string = tr ("Active now");
-        else
-            string = tr ("%1 ago").arg (Formatter::timeToString (seconds));
+
+      const int seconds = latest.isValid () ? latest.secsTo (qdt_now) : -1;
+      if (seconds < 0)
+        string = none;
+      else if (seconds < 5)
+        string = tr ("Active now");
+      else
+        string = tr ("%1 ago").arg (Formatter::timeToString (seconds));
     }
-    myLastActivityLabel->setText (string);
+  myLastActivityLabel->setText (string);
 
 
-    if (torrents.empty ())
-        string = none;
-    else {
-        string = torrents[0]->getError ();
-        foreach (const Torrent * t, torrents) {
-            if (string != t->getError ()) {
-                string = mixed;
-                break;
+  if (torrents.empty ())
+    {
+      string = none;
+    }
+  else
+    {
+      string = torrents[0]->getError ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (string != t->getError ())
+            {
+              string = mixed;
+              break;
             }
         }
     }
-    if (string.isEmpty ())
-        string = none;
-    myErrorLabel->setText (string);
+  if (string.isEmpty ())
+    string = none;
+  myErrorLabel->setText (string);
 
 
-    ///
-    /// information tab
-    ///
+  ///
+  /// information tab
+  ///
 
-    // mySizeLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        int pieces = 0;
-        uint64_t size = 0;
-        uint32_t pieceSize = torrents[0]->pieceSize ();
-        foreach (const Torrent * t, torrents) {
-            pieces += t->pieceCount ();
-            size += t->totalSize ();
-            if (pieceSize != t->pieceSize ())
-                pieceSize = 0;
-        }
-        if (!size)
-            string = none;
-        else if (pieceSize > 0)
-            string = tr ("%1 (%Ln pieces @ %2)", "", pieces)
-                     .arg (Formatter::sizeToString (size))
-                     .arg (Formatter::memToString (pieceSize));
-        else
-            string = tr ("%1 (%Ln pieces)", "", pieces)
-                     .arg (Formatter::sizeToString (size));
+  // mySizeLabel
+  if (torrents.empty ())
+    {
+      string = none;
     }
-    mySizeLabel->setText (string);
+  else
+    {
+      int pieces = 0;
+      uint64_t size = 0;
+      uint32_t pieceSize = torrents[0]->pieceSize ();
+      foreach (const Torrent * t, torrents)
+        {
+          pieces += t->pieceCount ();
+          size += t->totalSize ();
+          if (pieceSize != t->pieceSize ())
+            pieceSize = 0;
+        }
 
-    // myHashLabel
-    if (torrents.empty ())
+      if (!size)
         string = none;
-    else {
-        string = torrents[0]->hashString ();
-        foreach (const Torrent * t, torrents) {
-            if (string != t->hashString ()) {
-                string = mixed;
-                break;
+      else if (pieceSize > 0)
+        string = tr ("%1 (%Ln pieces @ %2)", "", pieces)
+                   .arg (Formatter::sizeToString (size))
+                   .arg (Formatter::memToString (pieceSize));
+      else
+        string = tr ("%1 (%Ln pieces)", "", pieces)
+                   .arg (Formatter::sizeToString (size));
+    }
+  mySizeLabel->setText (string);
+
+  // myHashLabel
+  string = none;
+  if (!torrents.empty ())
+    {
+      string = torrents[0]->hashString ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (string != t->hashString ())
+            {
+              string = mixed;
+              break;
             }
         }
     }
-    myHashLabel->setText (string);
+  myHashLabel->setText (string);
 
-    // myPrivacyLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        bool b = torrents[0]->isPrivate ();
-        string = b ? tr ("Private to this tracker -- DHT and PEX disabled")
-                   : tr ("Public torrent");
-        foreach (const Torrent * t, torrents) {
-            if (b != t->isPrivate ()) {
-                string = mixed;
-                break;
+  // myPrivacyLabel
+  string = none;
+  if (!torrents.empty ())
+    {
+      bool b = torrents[0]->isPrivate ();
+      string = b ? tr ("Private to this tracker -- DHT and PEX disabled")
+                 : tr ("Public torrent");
+      foreach (const Torrent * t, torrents)
+        {
+          if (b != t->isPrivate ())
+            {
+              string = mixed;
+              break;
             }
         }
     }
-    myPrivacyLabel->setText (string);
+  myPrivacyLabel->setText (string);
 
-    // myCommentBrowser
-    if (torrents.empty ())
-        string = none;
-    else {
-        string = torrents[0]->comment ();
-        foreach (const Torrent * t, torrents) {
-            if (string != t->comment ()) {
-                string = mixed;
-                break;
+  // myCommentBrowser
+  string = none;
+  if (!torrents.empty ())
+    {
+      string = torrents[0]->comment ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (string != t->comment ())
+            {
+              string = mixed;
+              break;
             }
         }
     }
-    if (myCommentBrowser->toPlainText() != string) {
+  if (myCommentBrowser->toPlainText() != string)
+    {
       myCommentBrowser->setText (string);
       myCommentBrowser->setMaximumHeight (QWIDGETSIZE_MAX);
     }
 
-    // myOriginLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        bool mixed_creator=false, mixed_date=false;
-        const QString creator = torrents[0]->creator ();
-        const QString date = torrents[0]->dateCreated ().toString ();
-        foreach (const Torrent * t, torrents) {
-            mixed_creator |= (creator != t->creator ());
-            mixed_date |= (date != t->dateCreated ().toString ());
+  // myOriginLabel
+  string = none;
+  if (!torrents.empty ())
+    {
+      bool mixed_creator=false, mixed_date=false;
+      const QString creator = torrents[0]->creator ();
+      const QString date = torrents[0]->dateCreated ().toString ();
+      foreach (const Torrent * t, torrents)
+        {
+          mixed_creator |= (creator != t->creator ());
+          mixed_date |= (date != t->dateCreated ().toString ());
         }
-        if (mixed_creator && mixed_date)
-            string = mixed;
-        else if (mixed_date && !creator.isEmpty ())
-            string = tr ("Created by %1").arg (creator);
-        else if (mixed_creator && !date.isEmpty ())
-            string = tr ("Created on %1").arg (date);
-        else if (creator.isEmpty () && date.isEmpty ())
-            string = tr ("N/A");
-        else
-            string = tr ("Created by %1 on %2").arg (creator).arg (date);
+
+      if (mixed_creator && mixed_date)
+        string = mixed;
+      else if (mixed_date && !creator.isEmpty ())
+        string = tr ("Created by %1").arg (creator);
+      else if (mixed_creator && !date.isEmpty ())
+        string = tr ("Created on %1").arg (date);
+      else if (creator.isEmpty () && date.isEmpty ())
+        string = tr ("N/A");
+      else
+        string = tr ("Created by %1 on %2").arg (creator).arg (date);
     }
-    myOriginLabel->setText (string);
+  myOriginLabel->setText (string);
 
-    // myLocationLabel
-    if (torrents.empty ())
-        string = none;
-    else {
-        string = torrents[0]->getPath ();
-        foreach (const Torrent * t, torrents) {
-            if (string != t->getPath ()) {
-                string = mixed;
-                break;
+  // myLocationLabel
+  string = none;
+  if (!torrents.empty ())
+    {
+      string = torrents[0]->getPath ();
+      foreach (const Torrent * t, torrents)
+        {
+          if (string != t->getPath ())
+            {
+              string = mixed;
+              break;
             }
         }
     }
-    myLocationLabel->setText (string);
+  myLocationLabel->setText (string);
 
 
-    ///
-    ///  Options Tab
-    ///
+  ///
+  ///  Options Tab
+  ///
 
-    if (myChangedTorrents && !torrents.empty ())
+  if (myChangedTorrents && !torrents.empty ())
     {
-        int i;
-        const Torrent * baseline = *torrents.begin ();
-        const Torrent * tor;
-        bool uniform;
-        bool baselineFlag;
-        int baselineInt;
-
-        // mySessionLimitCheck
-        uniform = true;
-        baselineFlag = baseline->honorsSessionLimits ();
-        foreach (tor, torrents) if (baselineFlag != tor->honorsSessionLimits ()) { uniform = false; break; }
-        mySessionLimitCheck->setChecked (uniform && baselineFlag);
-
-        // mySingleDownCheck
-        uniform = true;
-        baselineFlag = baseline->downloadIsLimited ();
-        foreach (tor, torrents) if (baselineFlag != tor->downloadIsLimited ()) { uniform = false; break; }
-        mySingleDownCheck->setChecked (uniform && baselineFlag);
-
-        // mySingleUpCheck
-        uniform = true;
-        baselineFlag = baseline->uploadIsLimited ();
-        foreach (tor, torrents) if (baselineFlag != tor->uploadIsLimited ()) { uniform = false; break; }
-        mySingleUpCheck->setChecked (uniform && baselineFlag);
-
-        // myBandwidthPriorityCombo
-        uniform = true;
-        baselineInt = baseline->getBandwidthPriority ();
-        foreach (tor, torrents) if (baselineInt != tor->getBandwidthPriority ()) { uniform = false; break; }
-        if (uniform)
-            i = myBandwidthPriorityCombo->findData (baselineInt);
-        else
-            i = -1;
-        setIfIdle (myBandwidthPriorityCombo, i);
-
-        setIfIdle (mySingleDownSpin, int (tor->downloadLimit ().KBps ()));
-        setIfIdle (mySingleUpSpin, int (tor->uploadLimit ().KBps ()));
-        setIfIdle (myPeerLimitSpin, tor->peerLimit ());
+      int i;
+      bool uniform;
+      bool baselineFlag;
+      int baselineInt;
+      const Torrent * tor;
+      const Torrent * baseline = *torrents.begin ();
+
+      // mySessionLimitCheck
+      uniform = true;
+      baselineFlag = baseline->honorsSessionLimits ();
+      foreach (tor, torrents) if (baselineFlag != tor->honorsSessionLimits ()) { uniform = false; break; }
+      mySessionLimitCheck->setChecked (uniform && baselineFlag);
+
+      // mySingleDownCheck
+      uniform = true;
+      baselineFlag = baseline->downloadIsLimited ();
+      foreach (tor, torrents) if (baselineFlag != tor->downloadIsLimited ()) { uniform = false; break; }
+      mySingleDownCheck->setChecked (uniform && baselineFlag);
+
+      // mySingleUpCheck
+      uniform = true;
+      baselineFlag = baseline->uploadIsLimited ();
+      foreach (tor, torrents) if (baselineFlag != tor->uploadIsLimited ()) { uniform = false; break; }
+      mySingleUpCheck->setChecked (uniform && baselineFlag);
+
+      // myBandwidthPriorityCombo
+      uniform = true;
+      baselineInt = baseline->getBandwidthPriority ();
+      foreach (tor, torrents) if (baselineInt != tor->getBandwidthPriority ()) { uniform = false; break; }
+      if (uniform)
+        i = myBandwidthPriorityCombo->findData (baselineInt);
+      else
+        i = -1;
+      setIfIdle (myBandwidthPriorityCombo, i);
+
+      setIfIdle (mySingleDownSpin, int (tor->downloadLimit ().KBps ()));
+      setIfIdle (mySingleUpSpin, int (tor->uploadLimit ().KBps ()));
+      setIfIdle (myPeerLimitSpin, tor->peerLimit ());
     }
 
-    if (!torrents.empty ())
+  if (!torrents.empty ())
     {
-        const Torrent * tor;
+      const Torrent * tor;
 
-        // ratio
-        bool uniform = true;
-        int baselineInt = torrents[0]->seedRatioMode ();
-        foreach (tor, torrents) if (baselineInt != tor->seedRatioMode ()) { uniform = false; break; }
+      // ratio
+      bool uniform = true;
+      int baselineInt = torrents[0]->seedRatioMode ();
+      foreach (tor, torrents) if (baselineInt != tor->seedRatioMode ()) { uniform = false; break; }
 
-        setIfIdle (myRatioCombo, uniform ? myRatioCombo->findData (baselineInt) : -1);
-        myRatioSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE));
+      setIfIdle (myRatioCombo, uniform ? myRatioCombo->findData (baselineInt) : -1);
+      myRatioSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE));
 
-        setIfIdle (myRatioSpin, tor->seedRatioLimit ());
+      setIfIdle (myRatioSpin, tor->seedRatioLimit ());
 
-        // idle
-        uniform = true;
-        baselineInt = torrents[0]->seedIdleMode ();
-        foreach (tor, torrents) if (baselineInt != tor->seedIdleMode ()) { uniform = false; break; }
+      // idle
+      uniform = true;
+      baselineInt = torrents[0]->seedIdleMode ();
+      foreach (tor, torrents) if (baselineInt != tor->seedIdleMode ()) { uniform = false; break; }
 
-        setIfIdle (myIdleCombo, uniform ? myIdleCombo->findData (baselineInt) : -1);
-        myIdleSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE));
+      setIfIdle (myIdleCombo, uniform ? myIdleCombo->findData (baselineInt) : -1);
+      myIdleSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE));
 
-        setIfIdle (myIdleSpin, tor->seedIdleLimit ());
+      setIfIdle (myIdleSpin, tor->seedIdleLimit ());
     }
 
-    ///
-    ///  Tracker tab
-    ///
+  ///
+  ///  Tracker tab
+  ///
 
-    myTrackerModel->refresh (myModel, myIds);
+  myTrackerModel->refresh (myModel, myIds);
 
-    ///
-    ///  Peers tab
-    ///
+  ///
+  ///  Peers tab
+  ///
 
-    QMap<QString,QTreeWidgetItem*> peers2;
-    QList<QTreeWidgetItem*> newItems;
-    foreach (const Torrent * t, torrents)
+  QMap<QString,QTreeWidgetItem*> peers2;
+  QList<QTreeWidgetItem*> newItems;
+  foreach (const Torrent * t, torrents)
     {
-        const QString idStr (QString::number (t->id ()));
-        PeerList peers = t->peers ();
+      const QString idStr (QString::number (t->id ()));
+      PeerList peers = t->peers ();
 
-        foreach (const Peer& peer, peers)
+      foreach (const Peer& peer, peers)
         {
-            const QString key = idStr + ":" + peer.address;
-            PeerItem * item = (PeerItem*) myPeers.value (key, 0);
+          const QString key = idStr + ":" + peer.address;
+          PeerItem * item = (PeerItem*) myPeers.value (key, 0);
 
-            if (item == 0) // new peer has connected
+          if (item == 0) // new peer has connected
             {
-                static const QIcon myEncryptionIcon (":/icons/encrypted.png");
-                static const QIcon myEmptyIcon;
-                item = new PeerItem (peer);
-                item->setTextAlignment (COL_UP, Qt::AlignRight|Qt::AlignVCenter);
-                item->setTextAlignment (COL_DOWN, Qt::AlignRight|Qt::AlignVCenter);
-                item->setTextAlignment (COL_PERCENT, Qt::AlignRight|Qt::AlignVCenter);
-                item->setIcon (COL_LOCK, peer.isEncrypted ? myEncryptionIcon : myEmptyIcon);
-                item->setToolTip (COL_LOCK, peer.isEncrypted ? tr ("Encrypted connection") : "");
-                item->setText (COL_ADDRESS, peer.address);
-                item->setText (COL_CLIENT, peer.clientName);
-                newItems << item;
+              static const QIcon myEncryptionIcon (":/icons/encrypted.png");
+              static const QIcon myEmptyIcon;
+              item = new PeerItem (peer);
+              item->setTextAlignment (COL_UP, Qt::AlignRight|Qt::AlignVCenter);
+              item->setTextAlignment (COL_DOWN, Qt::AlignRight|Qt::AlignVCenter);
+              item->setTextAlignment (COL_PERCENT, Qt::AlignRight|Qt::AlignVCenter);
+              item->setIcon (COL_LOCK, peer.isEncrypted ? myEncryptionIcon : myEmptyIcon);
+              item->setToolTip (COL_LOCK, peer.isEncrypted ? tr ("Encrypted connection") : "");
+              item->setText (COL_ADDRESS, peer.address);
+              item->setText (COL_CLIENT, peer.clientName);
+              newItems << item;
             }
 
-            const QString code = peer.flagStr;
-            item->setStatus (code);
-            item->refresh (peer);
-
-            QString codeTip;
-            foreach (QChar ch, code) {
-                QString txt;
-                switch (ch.toAscii ()) {
-                    case 'O': txt = tr ("Optimistic unchoke"); break;
-                    case 'D': txt = tr ("Downloading from this peer"); break;
-                    case 'd': txt = tr ("We would download from this peer if they would let us"); break;
-                    case 'U': txt = tr ("Uploading to peer"); break;
-                    case 'u': txt = tr ("We would upload to this peer if they asked"); break;
-                    case 'K': txt = tr ("Peer has unchoked us, but we're not interested"); break;
-                    case '?': txt = tr ("We unchoked this peer, but they're not interested"); break;
-                    case 'E': txt = tr ("Encrypted connection"); break;
-                    case 'H': txt = tr ("Peer was discovered through DHT"); break;
-                    case 'X': txt = tr ("Peer was discovered through Peer Exchange (PEX)"); break;
-                    case 'I': txt = tr ("Peer is an incoming connection"); break;
-                    case 'T': txt = tr ("Peer is connected over uTP"); break;
+          const QString code = peer.flagStr;
+          item->setStatus (code);
+          item->refresh (peer);
+
+          QString codeTip;
+          foreach (QChar ch, code)
+            {
+              QString txt;
+              switch (ch.toAscii ())
+                {
+                  case 'O': txt = tr ("Optimistic unchoke"); break;
+                  case 'D': txt = tr ("Downloading from this peer"); break;
+                  case 'd': txt = tr ("We would download from this peer if they would let us"); break;
+                  case 'U': txt = tr ("Uploading to peer"); break;
+                  case 'u': txt = tr ("We would upload to this peer if they asked"); break;
+                  case 'K': txt = tr ("Peer has unchoked us, but we're not interested"); break;
+                  case '?': txt = tr ("We unchoked this peer, but they're not interested"); break;
+                  case 'E': txt = tr ("Encrypted connection"); break;
+                  case 'H': txt = tr ("Peer was discovered through DHT"); break;
+                  case 'X': txt = tr ("Peer was discovered through Peer Exchange (PEX)"); break;
+                  case 'I': txt = tr ("Peer is an incoming connection"); break;
+                  case 'T': txt = tr ("Peer is connected over uTP"); break;
                 }
-                if (!txt.isEmpty ())
-                    codeTip += QString ("%1: %2\n").arg (ch).arg (txt);
+
+              if (!txt.isEmpty ())
+                codeTip += QString ("%1: %2\n").arg (ch).arg (txt);
             }
 
-            if (!codeTip.isEmpty ())
-                codeTip.resize (codeTip.size ()-1); // eat the trailing linefeed
+          if (!codeTip.isEmpty ())
+            codeTip.resize (codeTip.size ()-1); // eat the trailing linefeed
 
-            item->setText (COL_UP, peer.rateToPeer.isZero () ? "" : Formatter::speedToString (peer.rateToPeer));
-            item->setText (COL_DOWN, peer.rateToClient.isZero () ? "" : Formatter::speedToString (peer.rateToClient));
-            item->setText (COL_PERCENT, peer.progress > 0 ? QString ("%1%").arg ( (int) (peer.progress * 100.0)) : "");
-            item->setText (COL_STATUS, code);
-            item->setToolTip (COL_STATUS, codeTip);
+          item->setText (COL_UP, peer.rateToPeer.isZero () ? "" : Formatter::speedToString (peer.rateToPeer));
+          item->setText (COL_DOWN, peer.rateToClient.isZero () ? "" : Formatter::speedToString (peer.rateToClient));
+          item->setText (COL_PERCENT, peer.progress > 0 ? QString ("%1%").arg ( (int) (peer.progress * 100.0)) : "");
+          item->setText (COL_STATUS, code);
+          item->setToolTip (COL_STATUS, codeTip);
 
-            peers2.insert (key, item);
+          peers2.insert (key, item);
         }
     }
-    myPeerTree->addTopLevelItems (newItems);
-    foreach (QString key, myPeers.keys ()) {
-        if (!peers2.contains (key)) { // old peer has disconnected
-            QTreeWidgetItem * item = myPeers.value (key, 0);
-            myPeerTree->takeTopLevelItem (myPeerTree->indexOfTopLevelItem (item));
-            delete item;
+
+  myPeerTree->addTopLevelItems (newItems);
+  foreach (QString key, myPeers.keys ())
+    {
+      if (!peers2.contains (key)) // old peer has disconnected
+        {
+          QTreeWidgetItem * item = myPeers.value (key, 0);
+          myPeerTree->takeTopLevelItem (myPeerTree->indexOfTopLevelItem (item));
+          delete item;
         }
     }
-    myPeers = peers2;
+  myPeers = peers2;
 
-    if (!single)
-        myFileTreeView->clear ();
-    if (single)
-        myFileTreeView->update (torrents[0]->files (), myChangedTorrents);
+  if (!single)
+    myFileTreeView->clear ();
+  if (single)
+    myFileTreeView->update (torrents[0]->files (), myChangedTorrents);
 
-    myChangedTorrents = false;
-    myHavePendingRefresh = false;
-    foreach (QWidget * w, myWidgets)
-        w->setEnabled (true);
+  myChangedTorrents = false;
+  myHavePendingRefresh = false;
+  foreach (QWidget * w, myWidgets)
+    w->setEnabled (true);
 }
 
 void
 Details :: enableWhenChecked (QCheckBox * box, QWidget * w)
 {
-    connect (box, SIGNAL (toggled (bool)), w, SLOT (setEnabled (bool)));
-    w->setEnabled (box->isChecked ());
+  connect (box, SIGNAL (toggled (bool)), w, SLOT (setEnabled (bool)));
+  w->setEnabled (box->isChecked ());
 }
 
 
@@ -857,35 +938,35 @@ Details :: enableWhenChecked (QCheckBox * box, QWidget * w)
 QWidget *
 Details :: createInfoTab ()
 {
-    HIG * hig = new HIG (this);
-
-    hig->addSectionTitle (tr ("Activity"));
-    hig->addRow (tr ("Have:"), myHaveLabel = new SqueezeLabel);
-    hig->addRow (tr ("Availability:"), myAvailabilityLabel = new SqueezeLabel);
-    hig->addRow (tr ("Downloaded:"), myDownloadedLabel = new SqueezeLabel);
-    hig->addRow (tr ("Uploaded:"), myUploadedLabel = new SqueezeLabel);
-    hig->addRow (tr ("State:"), myStateLabel = new SqueezeLabel);
-    hig->addRow (tr ("Running time:"), myRunTimeLabel = new SqueezeLabel);
-    hig->addRow (tr ("Remaining time:"), myETALabel = new SqueezeLabel);
-    hig->addRow (tr ("Last activity:"), myLastActivityLabel = new SqueezeLabel);
-    hig->addRow (tr ("Error:"), myErrorLabel = new SqueezeLabel);
-    hig->addSectionDivider ();
-
-    hig->addSectionDivider ();
-    hig->addSectionTitle (tr ("Details"));
-    hig->addRow (tr ("Size:"), mySizeLabel = new SqueezeLabel);
-    hig->addRow (tr ("Location:"), myLocationLabel = new SqueezeLabel);
-    hig->addRow (tr ("Hash:"), myHashLabel = new SqueezeLabel);
-    hig->addRow (tr ("Privacy:"), myPrivacyLabel = new SqueezeLabel);
-    hig->addRow (tr ("Origin:"), myOriginLabel = new SqueezeLabel);
-    myOriginLabel->setMinimumWidth (325); // stop long origin strings from resizing the widgit
-    hig->addRow (tr ("Comment:"), myCommentBrowser = new QTextBrowser);
-    const int h = QFontMetrics (myCommentBrowser->font ()).lineSpacing () * 4;
-    myCommentBrowser->setFixedHeight (h);
-
-    hig->finish ();
-
-    return hig;
+  HIG * hig = new HIG (this);
+
+  hig->addSectionTitle (tr ("Activity"));
+  hig->addRow (tr ("Have:"), myHaveLabel = new SqueezeLabel);
+  hig->addRow (tr ("Availability:"), myAvailabilityLabel = new SqueezeLabel);
+  hig->addRow (tr ("Downloaded:"), myDownloadedLabel = new SqueezeLabel);
+  hig->addRow (tr ("Uploaded:"), myUploadedLabel = new SqueezeLabel);
+  hig->addRow (tr ("State:"), myStateLabel = new SqueezeLabel);
+  hig->addRow (tr ("Running time:"), myRunTimeLabel = new SqueezeLabel);
+  hig->addRow (tr ("Remaining time:"), myETALabel = new SqueezeLabel);
+  hig->addRow (tr ("Last activity:"), myLastActivityLabel = new SqueezeLabel);
+  hig->addRow (tr ("Error:"), myErrorLabel = new SqueezeLabel);
+  hig->addSectionDivider ();
+
+  hig->addSectionDivider ();
+  hig->addSectionTitle (tr ("Details"));
+  hig->addRow (tr ("Size:"), mySizeLabel = new SqueezeLabel);
+  hig->addRow (tr ("Location:"), myLocationLabel = new SqueezeLabel);
+  hig->addRow (tr ("Hash:"), myHashLabel = new SqueezeLabel);
+  hig->addRow (tr ("Privacy:"), myPrivacyLabel = new SqueezeLabel);
+  hig->addRow (tr ("Origin:"), myOriginLabel = new SqueezeLabel);
+  myOriginLabel->setMinimumWidth (325); // stop long origin strings from resizing the widgit
+  hig->addRow (tr ("Comment:"), myCommentBrowser = new QTextBrowser);
+  const int h = QFontMetrics (myCommentBrowser->font ()).lineSpacing () * 4;
+  myCommentBrowser->setFixedHeight (h);
+
+  hig->finish ();
+
+  return hig;
 }
 
 /***
@@ -895,7 +976,7 @@ Details :: createInfoTab ()
 void
 Details :: onShowTrackerScrapesToggled (bool val)
 {
-    myPrefs.set (Prefs::SHOW_TRACKER_SCRAPES, val);
+  myPrefs.set (Prefs::SHOW_TRACKER_SCRAPES, val);
 }
 
 void
@@ -1047,127 +1128,127 @@ Details :: onEditTrackerClicked ()
 void
 Details :: onRemoveTrackerClicked ()
 {
-    // make a map of torrentIds to announce URLs to remove
-    QItemSelectionModel * selectionModel = myTrackerView->selectionModel ();
-    QModelIndexList selectedRows = selectionModel->selectedRows ();
-    QMap<int,int> torrentId_to_trackerIds;
-    foreach (QModelIndex i, selectedRows)
+  // make a map of torrentIds to announce URLs to remove
+  QItemSelectionModel * selectionModel = myTrackerView->selectionModel ();
+  QModelIndexList selectedRows = selectionModel->selectedRows ();
+  QMap<int,int> torrentId_to_trackerIds;
+  foreach (QModelIndex i, selectedRows)
     {
-        const TrackerInfo inf = myTrackerView->model ()->data (i, TrackerModel::TrackerRole).value<TrackerInfo> ();
-        torrentId_to_trackerIds.insertMulti (inf.torrentId, inf.st.id);
+      const TrackerInfo inf = myTrackerView->model ()->data (i, TrackerModel::TrackerRole).value<TrackerInfo> ();
+      torrentId_to_trackerIds.insertMulti (inf.torrentId, inf.st.id);
     }
 
-    // batch all of a tracker's torrents into one command
-    foreach (int id, torrentId_to_trackerIds.uniqueKeys ())
+  // batch all of a tracker's torrents into one command
+  foreach (int id, torrentId_to_trackerIds.uniqueKeys ())
     {
-        QSet<int> ids;
-        ids << id;
-        mySession.torrentSet (ids, TR_KEY_trackerRemove, torrentId_to_trackerIds.values (id));
+      QSet<int> ids;
+      ids << id;
+      mySession.torrentSet (ids, TR_KEY_trackerRemove, torrentId_to_trackerIds.values (id));
     }
 
-    selectionModel->clearSelection ();
-    getNewData ();
+  selectionModel->clearSelection ();
+  getNewData ();
 }
 
 QWidget *
 Details :: createOptionsTab ()
 {
-    QSpinBox * s;
-    QCheckBox * c;
-    QComboBox * m;
-    QHBoxLayout * h;
-    QDoubleSpinBox * ds;
-    const QString speed_K_str = Formatter::unitStr (Formatter::SPEED, Formatter::KB);
-
-    HIG * hig = new HIG (this);
-    hig->addSectionTitle (tr ("Speed"));
-
-    c = new QCheckBox (tr ("Honor global &limits"));
-    mySessionLimitCheck = c;
-    hig->addWideControl (c);
-    connect (c, SIGNAL (clicked (bool)), this, SLOT (onHonorsSessionLimitsToggled (bool)));
-
-    c = new QCheckBox (tr ("Limit &download speed (%1):").arg (speed_K_str));
-    mySingleDownCheck = c;
-    s = new QSpinBox ();
-    s->setProperty (PREF_KEY, TR_KEY_downloadLimit);
-    s->setSingleStep (5);
-    s->setRange (0, INT_MAX);
-    mySingleDownSpin = s;
-    hig->addRow (c, s);
-    enableWhenChecked (c, s);
-    connect (c, SIGNAL (clicked (bool)), this, SLOT (onDownloadLimitedToggled (bool)));
-    connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
-
-    c = new QCheckBox (tr ("Limit &upload speed (%1):").arg (speed_K_str));
-    mySingleUpCheck = c;
-    s = new QSpinBox ();
-    s->setSingleStep (5);
-    s->setRange (0, INT_MAX);
-    s->setProperty (PREF_KEY, TR_KEY_uploadLimit);
-    mySingleUpSpin = s;
-    hig->addRow (c, s);
-    enableWhenChecked (c, s);
-    connect (c, SIGNAL (clicked (bool)), this, SLOT (onUploadLimitedToggled (bool)));
-    connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
-
-    m = new QComboBox;
-    m->addItem (tr ("High"),   TR_PRI_HIGH);
-    m->addItem (tr ("Normal"), TR_PRI_NORMAL);
-    m->addItem (tr ("Low"),    TR_PRI_LOW);
-    connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onBandwidthPriorityChanged (int)));
-    hig->addRow (tr ("Torrent &priority:"), m);
-    myBandwidthPriorityCombo = m;
-
-    hig->addSectionDivider ();
-    hig->addSectionTitle (tr ("Seeding Limits"));
-
-    h = new QHBoxLayout ();
-    h->setSpacing (HIG :: PAD);
-    m = new QComboBox;
-    m->addItem (tr ("Use Global Settings"),      TR_RATIOLIMIT_GLOBAL);
-    m->addItem (tr ("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED);
-    m->addItem (tr ("Stop seeding at ratio:"),   TR_RATIOLIMIT_SINGLE);
-    connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onRatioModeChanged (int)));
-    h->addWidget (myRatioCombo = m);
-    ds = new QDoubleSpinBox ();
-    ds->setRange (0.5, INT_MAX);
-    ds->setProperty (PREF_KEY, TR_KEY_seedRatioLimit);
-    connect (ds, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
-    h->addWidget (myRatioSpin = ds);
-    hig->addRow (tr ("&Ratio:"), h, m);
-
-    h = new QHBoxLayout ();
-    h->setSpacing (HIG :: PAD);
-    m = new QComboBox;
-    m->addItem (tr ("Use Global Settings"),                 TR_IDLELIMIT_GLOBAL);
-    m->addItem (tr ("Seed regardless of activity"),         TR_IDLELIMIT_UNLIMITED);
-    m->addItem (tr ("Stop seeding if idle for N minutes:"), TR_IDLELIMIT_SINGLE);
-    connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onIdleModeChanged (int)));
-    h->addWidget (myIdleCombo = m);
-    s = new QSpinBox ();
-    s->setSingleStep (5);
-    s->setRange (1, 9999);
-    s->setProperty (PREF_KEY, TR_KEY_seedIdleLimit);
-    connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
-    h->addWidget (myIdleSpin = s);
-    hig->addRow (tr ("&Idle:"), h, m);
-
-
-    hig->addSectionDivider ();
-    hig->addSectionTitle (tr ("Peer Connections"));
-
-    s = new QSpinBox ();
-    s->setSingleStep (5);
-    s->setRange (1, 300);
-    s->setProperty (PREF_KEY, TR_KEY_peer_limit);
-    connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
-    myPeerLimitSpin = s;
-    hig->addRow (tr ("&Maximum peers:"), s);
-
-    hig->finish ();
-
-    return hig;
+  QSpinBox * s;
+  QCheckBox * c;
+  QComboBox * m;
+  QHBoxLayout * h;
+  QDoubleSpinBox * ds;
+  const QString speed_K_str = Formatter::unitStr (Formatter::SPEED, Formatter::KB);
+
+  HIG * hig = new HIG (this);
+  hig->addSectionTitle (tr ("Speed"));
+
+  c = new QCheckBox (tr ("Honor global &limits"));
+  mySessionLimitCheck = c;
+  hig->addWideControl (c);
+  connect (c, SIGNAL (clicked (bool)), this, SLOT (onHonorsSessionLimitsToggled (bool)));
+
+  c = new QCheckBox (tr ("Limit &download speed (%1):").arg (speed_K_str));
+  mySingleDownCheck = c;
+  s = new QSpinBox ();
+  s->setProperty (PREF_KEY, TR_KEY_downloadLimit);
+  s->setSingleStep (5);
+  s->setRange (0, INT_MAX);
+  mySingleDownSpin = s;
+  hig->addRow (c, s);
+  enableWhenChecked (c, s);
+  connect (c, SIGNAL (clicked (bool)), this, SLOT (onDownloadLimitedToggled (bool)));
+  connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
+
+  c = new QCheckBox (tr ("Limit &upload speed (%1):").arg (speed_K_str));
+  mySingleUpCheck = c;
+  s = new QSpinBox ();
+  s->setSingleStep (5);
+  s->setRange (0, INT_MAX);
+  s->setProperty (PREF_KEY, TR_KEY_uploadLimit);
+  mySingleUpSpin = s;
+  hig->addRow (c, s);
+  enableWhenChecked (c, s);
+  connect (c, SIGNAL (clicked (bool)), this, SLOT (onUploadLimitedToggled (bool)));
+  connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
+
+  m = new QComboBox;
+  m->addItem (tr ("High"),   TR_PRI_HIGH);
+  m->addItem (tr ("Normal"), TR_PRI_NORMAL);
+  m->addItem (tr ("Low"),    TR_PRI_LOW);
+  connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onBandwidthPriorityChanged (int)));
+  hig->addRow (tr ("Torrent &priority:"), m);
+  myBandwidthPriorityCombo = m;
+
+  hig->addSectionDivider ();
+  hig->addSectionTitle (tr ("Seeding Limits"));
+
+  h = new QHBoxLayout ();
+  h->setSpacing (HIG :: PAD);
+  m = new QComboBox;
+  m->addItem (tr ("Use Global Settings"),      TR_RATIOLIMIT_GLOBAL);
+  m->addItem (tr ("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED);
+  m->addItem (tr ("Stop seeding at ratio:"),   TR_RATIOLIMIT_SINGLE);
+  connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onRatioModeChanged (int)));
+  h->addWidget (myRatioCombo = m);
+  ds = new QDoubleSpinBox ();
+  ds->setRange (0.5, INT_MAX);
+  ds->setProperty (PREF_KEY, TR_KEY_seedRatioLimit);
+  connect (ds, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
+  h->addWidget (myRatioSpin = ds);
+  hig->addRow (tr ("&Ratio:"), h, m);
+
+  h = new QHBoxLayout ();
+  h->setSpacing (HIG :: PAD);
+  m = new QComboBox;
+  m->addItem (tr ("Use Global Settings"),                 TR_IDLELIMIT_GLOBAL);
+  m->addItem (tr ("Seed regardless of activity"),         TR_IDLELIMIT_UNLIMITED);
+  m->addItem (tr ("Stop seeding if idle for N minutes:"), TR_IDLELIMIT_SINGLE);
+  connect (m, SIGNAL (currentIndexChanged (int)), this, SLOT (onIdleModeChanged (int)));
+  h->addWidget (myIdleCombo = m);
+  s = new QSpinBox ();
+  s->setSingleStep (5);
+  s->setRange (1, 9999);
+  s->setProperty (PREF_KEY, TR_KEY_seedIdleLimit);
+  connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
+  h->addWidget (myIdleSpin = s);
+  hig->addRow (tr ("&Idle:"), h, m);
+
+
+  hig->addSectionDivider ();
+  hig->addSectionTitle (tr ("Peer Connections"));
+
+  s = new QSpinBox ();
+  s->setSingleStep (5);
+  s->setRange (1, 300);
+  s->setProperty (PREF_KEY, TR_KEY_peer_limit);
+  connect (s, SIGNAL (editingFinished ()), this, SLOT (onSpinBoxEditingFinished ()));
+  myPeerLimitSpin = s;
+  hig->addRow (tr ("&Maximum peers:"), s);
+
+  hig->finish ();
+
+  return hig;
 }
 
 /***
@@ -1177,80 +1258,80 @@ Details :: createOptionsTab ()
 QWidget *
 Details :: createTrackerTab ()
 {
-    QCheckBox * c;
-    QPushButton * p;
-    QWidget * top = new QWidget;
-    QVBoxLayout * v = new QVBoxLayout (top);
-    QHBoxLayout * h = new QHBoxLayout ();
-    QVBoxLayout * v2 = new QVBoxLayout ();
-
-    v->setSpacing (HIG::PAD_BIG);
-    v->setContentsMargins (HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG);
-
-    h->setSpacing (HIG::PAD);
-    h->setContentsMargins (HIG::PAD_SMALL, HIG::PAD_SMALL, HIG::PAD_SMALL, HIG::PAD_SMALL);
-
-    v2->setSpacing (HIG::PAD);
-
-    myTrackerModel = new TrackerModel;
-    myTrackerFilter = new TrackerModelFilter;
-    myTrackerFilter->setSourceModel (myTrackerModel);
-    myTrackerView = new QTreeView;
-    myTrackerView->setModel (myTrackerFilter);
-    myTrackerView->setHeaderHidden (true);
-    myTrackerView->setSelectionMode (QTreeWidget::ExtendedSelection);
-    myTrackerView->setRootIsDecorated (false);
-    myTrackerView->setIndentation (2);
-    myTrackerView->setItemsExpandable (false);
-    myTrackerView->setAlternatingRowColors (true);
-    myTrackerView->setItemDelegate (myTrackerDelegate = new TrackerDelegate ());
-    connect (myTrackerView->selectionModel (), SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), this, SLOT (onTrackerSelectionChanged ()));
-    h->addWidget (myTrackerView, 1);
-
-    p = new QPushButton ();
-    p->setIcon (getStockIcon ("list-add", QStyle::SP_DialogOpenButton));
-    p->setToolTip (tr ("Add Tracker"));
-    myAddTrackerButton = p;
-    v2->addWidget (p, 1);
-    connect (p, SIGNAL (clicked (bool)), this, SLOT (onAddTrackerClicked ()));
-
-    p = new QPushButton ();
-    p->setIcon (getStockIcon ("document-properties", QStyle::SP_DesktopIcon));
-    p->setToolTip (tr ("Edit Tracker"));
-    myAddTrackerButton = p;
-    p->setEnabled (false);
-    myEditTrackerButton = p;
-    v2->addWidget (p, 1);
-    connect (p, SIGNAL (clicked (bool)), this, SLOT (onEditTrackerClicked ()));
-
-    p = new QPushButton ();
-    p->setIcon (getStockIcon ("list-remove", QStyle::SP_TrashIcon));
-    p->setToolTip (tr ("Remove Trackers"));
-    p->setEnabled (false);
-    myRemoveTrackerButton = p;
-    v2->addWidget (p, 1);
-    connect (p, SIGNAL (clicked (bool)), this, SLOT (onRemoveTrackerClicked ()));
-
-    v2->addStretch (1);
-
-    h->addLayout (v2, 1);
-    h->setStretch (1, 0);
-
-    v->addLayout (h, 1);
-
-    c = new QCheckBox (tr ("Show &more details"));
-    c->setChecked (myPrefs.getBool (Prefs::SHOW_TRACKER_SCRAPES));
-    myShowTrackerScrapesCheck = c;
-    v->addWidget (c, 1);
-    connect (c, SIGNAL (clicked (bool)), this, SLOT (onShowTrackerScrapesToggled (bool)));
-
-    c = new QCheckBox (tr ("Show &backup trackers"));
-    c->setChecked (myPrefs.getBool (Prefs::SHOW_BACKUP_TRACKERS));
-    myShowBackupTrackersCheck = c;
-    v->addWidget (c, 1);
-    connect (c, SIGNAL (clicked (bool)), this, SLOT (onShowBackupTrackersToggled (bool)));
-
-    return top;
+  QCheckBox * c;
+  QPushButton * p;
+  QWidget * top = new QWidget;
+  QVBoxLayout * v = new QVBoxLayout (top);
+  QHBoxLayout * h = new QHBoxLayout ();
+  QVBoxLayout * v2 = new QVBoxLayout ();
+
+  v->setSpacing (HIG::PAD_BIG);
+  v->setContentsMargins (HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG);
+
+  h->setSpacing (HIG::PAD);
+  h->setContentsMargins (HIG::PAD_SMALL, HIG::PAD_SMALL, HIG::PAD_SMALL, HIG::PAD_SMALL);
+
+  v2->setSpacing (HIG::PAD);
+
+  myTrackerModel = new TrackerModel;
+  myTrackerFilter = new TrackerModelFilter;
+  myTrackerFilter->setSourceModel (myTrackerModel);
+  myTrackerView = new QTreeView;
+  myTrackerView->setModel (myTrackerFilter);
+  myTrackerView->setHeaderHidden (true);
+  myTrackerView->setSelectionMode (QTreeWidget::ExtendedSelection);
+  myTrackerView->setRootIsDecorated (false);
+  myTrackerView->setIndentation (2);
+  myTrackerView->setItemsExpandable (false);
+  myTrackerView->setAlternatingRowColors (true);
+  myTrackerView->setItemDelegate (myTrackerDelegate = new TrackerDelegate ());
+  connect (myTrackerView->selectionModel (), SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), this, SLOT (onTrackerSelectionChanged ()));
+  h->addWidget (myTrackerView, 1);
+
+  p = new QPushButton ();
+  p->setIcon (getStockIcon ("list-add", QStyle::SP_DialogOpenButton));
+  p->setToolTip (tr ("Add Tracker"));
+  myAddTrackerButton = p;
+  v2->addWidget (p, 1);
+  connect (p, SIGNAL (clicked (bool)), this, SLOT (onAddTrackerClicked ()));
+
+  p = new QPushButton ();
+  p->setIcon (getStockIcon ("document-properties", QStyle::SP_DesktopIcon));
+  p->setToolTip (tr ("Edit Tracker"));
+  myAddTrackerButton = p;
+  p->setEnabled (false);
+  myEditTrackerButton = p;
+  v2->addWidget (p, 1);
+  connect (p, SIGNAL (clicked (bool)), this, SLOT (onEditTrackerClicked ()));
+
+  p = new QPushButton ();
+  p->setIcon (getStockIcon ("list-remove", QStyle::SP_TrashIcon));
+  p->setToolTip (tr ("Remove Trackers"));
+  p->setEnabled (false);
+  myRemoveTrackerButton = p;
+  v2->addWidget (p, 1);
+  connect (p, SIGNAL (clicked (bool)), this, SLOT (onRemoveTrackerClicked ()));
+
+  v2->addStretch (1);
+
+  h->addLayout (v2, 1);
+  h->setStretch (1, 0);
+
+  v->addLayout (h, 1);
+
+  c = new QCheckBox (tr ("Show &more details"));
+  c->setChecked (myPrefs.getBool (Prefs::SHOW_TRACKER_SCRAPES));
+  myShowTrackerScrapesCheck = c;
+  v->addWidget (c, 1);
+  connect (c, SIGNAL (clicked (bool)), this, SLOT (onShowTrackerScrapesToggled (bool)));
+
+  c = new QCheckBox (tr ("Show &backup trackers"));
+  c->setChecked (myPrefs.getBool (Prefs::SHOW_BACKUP_TRACKERS));
+  myShowBackupTrackersCheck = c;
+  v->addWidget (c, 1);
+  connect (c, SIGNAL (clicked (bool)), this, SLOT (onShowBackupTrackersToggled (bool)));
+
+  return top;
 }
 
 /***
@@ -1260,38 +1341,38 @@ Details :: createTrackerTab ()
 QWidget *
 Details :: createPeersTab ()
 {
-    QWidget * top = new QWidget;
-    QVBoxLayout * v = new QVBoxLayout (top);
-    v->setSpacing (HIG :: PAD_BIG);
-    v->setContentsMargins (HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG);
-
-    QStringList headers;
-    headers << QString () << tr ("Up") << tr ("Down") << tr ("%") << tr ("Status") << tr ("Address") << tr ("Client");
-    myPeerTree = new QTreeWidget;
-    myPeerTree->setUniformRowHeights (true);
-    myPeerTree->setHeaderLabels (headers);
-    myPeerTree->setColumnWidth (0, 20);
-    myPeerTree->setSortingEnabled (true);
-    myPeerTree->sortByColumn (COL_ADDRESS, Qt::AscendingOrder);
-    myPeerTree->setRootIsDecorated (false);
-    myPeerTree->setTextElideMode (Qt::ElideRight);
-    v->addWidget (myPeerTree, 1);
-
-    const QFontMetrics m (font ());
-    QSize size = m.size (0, "1024 MiB/s");
-    myPeerTree->setColumnWidth (COL_UP, size.width ());
-    myPeerTree->setColumnWidth (COL_DOWN, size.width ());
-    size = m.size (0, " 100% ");
-    myPeerTree->setColumnWidth (COL_PERCENT, size.width ());
-    size = m.size (0, "ODUK?EXI");
-    myPeerTree->setColumnWidth (COL_STATUS, size.width ());
-    size = m.size (0, "888.888.888.888");
-    myPeerTree->setColumnWidth (COL_ADDRESS, size.width ());
-    size = m.size (0, "Some BitTorrent Client");
-    myPeerTree->setColumnWidth (COL_CLIENT, size.width ());
-    myPeerTree->setAlternatingRowColors (true);
-
-    return top;
+  QWidget * top = new QWidget;
+  QVBoxLayout * v = new QVBoxLayout (top);
+  v->setSpacing (HIG :: PAD_BIG);
+  v->setContentsMargins (HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG);
+
+  QStringList headers;
+  headers << QString () << tr ("Up") << tr ("Down") << tr ("%") << tr ("Status") << tr ("Address") << tr ("Client");
+  myPeerTree = new QTreeWidget;
+  myPeerTree->setUniformRowHeights (true);
+  myPeerTree->setHeaderLabels (headers);
+  myPeerTree->setColumnWidth (0, 20);
+  myPeerTree->setSortingEnabled (true);
+  myPeerTree->sortByColumn (COL_ADDRESS, Qt::AscendingOrder);
+  myPeerTree->setRootIsDecorated (false);
+  myPeerTree->setTextElideMode (Qt::ElideRight);
+  v->addWidget (myPeerTree, 1);
+
+  const QFontMetrics m (font ());
+  QSize size = m.size (0, "1024 MiB/s");
+  myPeerTree->setColumnWidth (COL_UP, size.width ());
+  myPeerTree->setColumnWidth (COL_DOWN, size.width ());
+  size = m.size (0, " 100% ");
+  myPeerTree->setColumnWidth (COL_PERCENT, size.width ());
+  size = m.size (0, "ODUK?EXI");
+  myPeerTree->setColumnWidth (COL_STATUS, size.width ());
+  size = m.size (0, "888.888.888.888");
+  myPeerTree->setColumnWidth (COL_ADDRESS, size.width ());
+  size = m.size (0, "Some BitTorrent Client");
+  myPeerTree->setColumnWidth (COL_CLIENT, size.width ());
+  myPeerTree->setAlternatingRowColors (true);
+
+  return top;
 }
 
 /***
@@ -1301,18 +1382,18 @@ Details :: createPeersTab ()
 QWidget *
 Details :: createFilesTab ()
 {
-    myFileTreeView = new FileTreeView ();
+  myFileTreeView = new FileTreeView ();
 
-    connect (myFileTreeView, SIGNAL (     priorityChanged (const QSet<int>&, int)),
-             this,           SLOT ( onFilePriorityChanged (const QSet<int>&, int)));
+  connect (myFileTreeView, SIGNAL (     priorityChanged (const QSet<int>&, int)),
+           this,           SLOT ( onFilePriorityChanged (const QSet<int>&, int)));
 
-    connect (myFileTreeView, SIGNAL (     wantedChanged (const QSet<int>&, bool)),
-             this,           SLOT ( onFileWantedChanged (const QSet<int>&, bool)));
+  connect (myFileTreeView, SIGNAL (     wantedChanged (const QSet<int>&, bool)),
+           this,           SLOT ( onFileWantedChanged (const QSet<int>&, bool)));
 
-    connect (myFileTreeView, SIGNAL (pathEdited (const QString&, const QString&)),
-             this,           SLOT (onPathEdited (const QString&, const QString&)));
+  connect (myFileTreeView, SIGNAL (pathEdited (const QString&, const QString&)),
+           this,           SLOT (onPathEdited (const QString&, const QString&)));
 
-    return myFileTreeView;
+  return myFileTreeView;
 }
 
 void
@@ -1336,7 +1417,7 @@ Details :: onFilePriorityChanged (const QSet<int>& indices, int priority)
     }
 
   mySession.torrentSet (myIds, key, indices.toList ());
-    getNewData ();
+  getNewData ();
 }
 
 void