BUILDING ON UNIX
- 1. Prerequisites: Qt >= 4.6 and its development packages
+ 1. Prerequisites: Qt >= 5 and its development packages
2. Build Transmission as normal
- 3. In the qt/ directory, type "qmake qtr.pro" or "qmake-qt4 qtr.pro"
+ 3. In the qt/ directory, type "qmake qtr.pro" or "qmake-qt5 qtr.pro"
4. In the qt/ directory, type "make"
5. In the qt/ directory, as root, type "INSTALL_ROOT=/usr make install"
(Feel free to replace /usr with /usr/local or /opt or whatever)
QVBoxLayout * v = new QVBoxLayout (this);
l = new QLabel;
- l->setPixmap (QPixmap (QString::fromAscii (":/icons/transmission-48.png")));
+ l->setPixmap (QPixmap (QString::fromUtf8 (":/icons/transmission-48.png")));
l->setAlignment (Qt::AlignCenter);
v->addWidget (l);
QFont f (font ());
f.setWeight (QFont::Bold);
f.setPointSize (int (f.pointSize () * 1.2));
- l = new QLabel (tr ("<big>Transmission %1</big>").arg (QString::fromAscii (LONG_VERSION_STRING)));
+ l = new QLabel (tr ("<big>Transmission %1</big>").arg (QString::fromUtf8 (LONG_VERSION_STRING)));
l->setAlignment (Qt::AlignCenter);
l->setFont (f);
l->setMargin (8);
v->addWidget (l);
l = new QLabel (tr ("A fast and easy BitTorrent client"));
- l->setStyleSheet (QString::fromAscii ("text-align: center"));
+ l->setStyleSheet (QString::fromUtf8 ("text-align: center"));
l->setAlignment (Qt::AlignCenter);
v->addWidget (l);
l->setAlignment (Qt::AlignCenter);
v->addWidget (l);
- l = new QLabel (QString::fromAscii ("<a href=\"http://www.transmissionbt.com/\">http://www.transmissionbt.com/</a>"));
+ l = new QLabel (QString::fromUtf8 ("<a href=\"http://www.transmissionbt.com/\">http://www.transmissionbt.com/</a>"));
l->setOpenExternalLinks (true);
l->setAlignment (Qt::AlignCenter);
v->addWidget (l);
QMessageBox::about (
this,
tr ("Credits"),
- QString::fromAscii ("Jordan Lee (Backend; Daemon; GTK+; Qt)\n"
+ QString::fromUtf8 ("Jordan Lee (Backend; Daemon; GTK+; Qt)\n"
"Michell Livingston (OS X)\n"));
}
}
else if( Utils::isHexHashcode( key ) )
{
- magnet = QString::fromAscii("magnet:?xt=urn:btih:") + key;
+ magnet = QString::fromUtf8("magnet:?xt=urn:btih:") + key;
type = MAGNET;
}
else
namespace
{
- const QString DBUS_SERVICE = QString::fromAscii ("com.transmissionbt.Transmission" );
- const QString DBUS_OBJECT_PATH = QString::fromAscii ("/com/transmissionbt/Transmission");
- const QString DBUS_INTERFACE = QString::fromAscii ("com.transmissionbt.Transmission" );
+ const QString DBUS_SERVICE = QString::fromUtf8 ("com.transmissionbt.Transmission" );
+ const QString DBUS_OBJECT_PATH = QString::fromUtf8 ("/com/transmissionbt/Transmission");
+ const QString DBUS_INTERFACE = QString::fromUtf8 ("com.transmissionbt.Transmission" );
const char * MY_READABLE_NAME ("transmission-qt");
QApplication (argc, argv),
myLastFullUpdateTime (0)
{
- const QString MY_CONFIG_NAME = QString::fromAscii ("transmission");
+ const QString MY_CONFIG_NAME = QString::fromUtf8 ("transmission");
setApplicationName (MY_CONFIG_NAME);
QList<int> sizes;
sizes << 16 << 22 << 24 << 32 << 48 << 64 << 72 << 96 << 128 << 192 << 256;
foreach (int size, sizes)
- icon.addPixmap (QPixmap (QString::fromAscii (":/icons/transmission-%1.png").arg (size)));
+ icon.addPixmap (QPixmap (QString::fromUtf8 (":/icons/transmission-%1.png").arg (size)));
setWindowIcon (icon);
// parse the command-line arguments
bool
MyApp :: notify (const QString& title, const QString& body) const
{
- const QString dbusServiceName = QString::fromAscii ("org.freedesktop.Notifications");
- const QString dbusInterfaceName = QString::fromAscii ("org.freedesktop.Notifications");
- const QString dbusPath = QString::fromAscii ("/org/freedesktop/Notifications");
+ const QString dbusServiceName = QString::fromUtf8 ("org.freedesktop.Notifications");
+ const QString dbusInterfaceName = QString::fromUtf8 ("org.freedesktop.Notifications");
+ const QString dbusPath = QString::fromUtf8 ("/org/freedesktop/Notifications");
- QDBusMessage m = QDBusMessage::createMethodCall (dbusServiceName, dbusPath, dbusInterfaceName, QString::fromAscii ("Notify"));
+ QDBusMessage m = QDBusMessage::createMethodCall (dbusServiceName, dbusPath, dbusInterfaceName, QString::fromUtf8 ("Notify"));
QList<QVariant> args;
- args.append (QString::fromAscii ("Transmission")); // app_name
+ args.append (QString::fromUtf8 ("Transmission")); // app_name
args.append (0U); // replaces_id
- args.append (QString::fromAscii ("transmission")); // icon
+ args.append (QString::fromUtf8 ("transmission")); // icon
args.append (title); // summary
args.append (body); // body
args.append (QStringList ()); // actions - unused for plain passive popups
QDBusMessage request = QDBusMessage::createMethodCall (DBUS_SERVICE,
DBUS_OBJECT_PATH,
DBUS_INTERFACE,
- QString::fromAscii ("AddMetainfo"));
+ QString::fromUtf8 ("AddMetainfo"));
QList<QVariant> arguments;
AddData a (addme[i]);
switch (a.type)
foreach (QChar ch, code)
{
QString txt;
- switch (ch.toAscii ())
+ switch (ch.unicode ())
{
case 'O': txt = tr ("Optimistic unchoke"); break;
case 'D': txt = tr ("Downloading from this peer"); break;
* $Id$
*/
-#include <QDesktopServices>
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
+#include <QStandardPaths>
#include "favicon.h"
QString
Favicons :: getCacheDir( )
{
- const QString base = QDesktopServices::storageLocation( QDesktopServices::CacheLocation );
+ const QString base = QStandardPaths::writableLocation (QStandardPaths::CacheLocation);
return QDir( base ).absoluteFilePath( "favicons" );
}
if (role == Qt::EditRole)
{
QString oldpath;
- QModelIndex walk = index;
FileTreeItem * item = itemFromIndex (index);
while (item && !item->name().isEmpty())
void
FileTreeModel :: clear ()
{
+ beginResetModel ();
clearSubtree (QModelIndex());
-
- reset ();
+ endResetModel ();
}
FileTreeItem *
{
bool added = false;
FileTreeItem * item;
- QStringList tokens = filename.split (QChar::fromAscii('/'));
+ QStringList tokens = filename.split (QChar::fromLatin1('/'));
item = findItemForFileIndex (fileIndex);
for (int i=0; i<NUM_COLUMNS; ++i)
{
setColumnHidden (i, (i<FIRST_VISIBLE_COLUMN) || (LAST_VISIBLE_COLUMN<i));
- header()->setResizeMode(i, QHeaderView::Interactive);
+ header()->setSectionResizeMode(i, QHeaderView::Interactive);
}
connect (this, SIGNAL(clicked(const QModelIndex&)),
* $Id$
*/
+#include <QAbstractItemView>
+#include <QPushButton>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QLineEdit>
+#include <QStylePainter>
#include <QString>
#include <QtGui>
void
FreespaceLabel :: onSessionExecuted (int64_t tag, const QString& result, struct tr_variant * arguments)
{
+ Q_UNUSED (result);
+
if (tag != myTag)
return;
#include <QString>
#include <QTimer>
-#include <QtGui/QLabel>
+#include <QLabel>
class Session;
#include <iostream>
#include <QtGui>
+#include <QProxyStyle>
+#include <QLabel>
+#include <QFileDialog>
+#include <QMessageBox>
#include <libtransmission/transmission.h>
#include <libtransmission/utils.h>
#include <QLabel>
#include <QLineEdit>
#include <QList>
+#include <QMimeData>
#include <QPlainTextEdit>
#include <QProgressBar>
#include <QPushButton>
const QPixmap folderPixmap = folderIcon.pixmap( iconSize );
QPushButton * b = new QPushButton;
b->setIcon( folderPixmap );
- b->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ b->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
myDestination = QDir::homePath();
b->setText( myDestination );
connect( b, SIGNAL(clicked(bool)),
myFolderButton = new QPushButton;
myFolderButton->setIcon( folderPixmap );
myFolderButton->setText( tr( "(None)" ) );
- myFolderButton->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ myFolderButton->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( myFolderButton, SIGNAL(clicked(bool)),
this, SLOT(onFolderClicked(void)) );
hig->addRow( myFolderRadio, myFolderButton );
myFileButton = new QPushButton;
myFileButton->setText( tr( "(None)" ) );
myFileButton->setIcon( filePixmap );
- myFileButton->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ myFileButton->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( myFileButton, SIGNAL(clicked(bool)),
this, SLOT(onFileClicked(void)) );
hig->addRow( myFileRadio, myFileButton );
hig->addSectionTitle( tr( "Properties" ) );
hig->addWideControl( myTrackerEdit = new ShortPlainTextEdit );
- const int height = fontMetrics().size( 0, QString::fromAscii("\n\n\n\n") ).height( );
+ const int height = fontMetrics().size( 0, QString::fromUtf8("\n\n\n\n") ).height( );
myTrackerEdit->setMinimumHeight( height );
hig->addTallRow( tr( "&Trackers:" ), myTrackerEdit );
QLabel * l = new QLabel( tr( "To add a backup URL, add it on the line after the primary URL.\nTo add another primary URL, add it after a blank line." ) );
{
p = mySourceButton = new QPushButton;
p->setIcon (filePixmap);
- p->setStyleSheet (QString::fromAscii ("text-align: left; padding-left: 5; padding-right: 5"));
+ p->setStyleSheet (QString::fromUtf8 ("text-align: left; padding-left: 5; padding-right: 5"));
p->installEventFilter (this);
w = p;
connect (p, SIGNAL (clicked (bool)), this, SLOT (onFilenameClicked ()));
connect (e, SIGNAL(editingFinished()), this, SLOT(onSourceEditingFinished()));
}
- const int width = fontMetrics.size (0, QString::fromAscii ("This is a pretty long torrent filename indeed.torrent")).width ();
+ const int width = fontMetrics.size (0, QString::fromUtf8 ("This is a pretty long torrent filename indeed.torrent")).width ();
w->setMinimumWidth (width);
layout->addWidget (w, row, 1);
l->setBuddy (w);
#include <QFileIconProvider>
#include <QFileInfo>
#include <QHBoxLayout>
-#include <QHttp>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
{
const int minutes( myPrefs.getInt( key ) );
QTimeEdit * e = new QTimeEdit( );
- e->setDisplayFormat( QString::fromAscii( "hh:mm" ) );
+ e->setDisplayFormat( QString::fromUtf8( "hh:mm" ) );
e->setProperty( PREF_KEY, key );
e->setTime( QTime().addSecs( minutes * 60 ) );
myWidgets.insert( key, e );
QHBoxLayout * h = new QHBoxLayout;
h->setSpacing( HIG :: PAD );
QLabel * label = new QLabel;
- label->setPixmap( QPixmap( QString::fromAscii( ":/icons/alt-limit-off.png" ) ) );
+ label->setPixmap( QPixmap( QString::fromUtf8( ":/icons/alt-limit-off.png" ) ) );
label->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
h->addWidget( label );
label = new QLabel( tr( "Alternative Speed Limits" ) );
- label->setStyleSheet( QString::fromAscii( "font: bold" ) );
+ label->setStyleSheet( QString::fromUtf8( "font: bold" ) );
label->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
h->addWidget( label );
hig->addSectionTitle( h );
l = checkBoxNew( tr( "Automatically add .torrent files &from:" ), Prefs::DIR_WATCH_ENABLED );
b = myWatchButton = new QPushButton;
b->setIcon( folderPixmap );
- b->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ b->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( b, SIGNAL(clicked(bool)), this, SLOT(onWatchClicked(void)) );
hig->addRow( l, b );
enableBuddyWhenChecked( qobject_cast<QCheckBox*>(l), b );
b = myDestinationButton = new QPushButton;
b->setIcon( folderPixmap );
- b->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ b->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( b, SIGNAL(clicked(bool)), this, SLOT(onDestinationClicked(void)) );
hig->addRow( tr( "Save to &Location:" ), b );
l = myIncompleteCheckbox = checkBoxNew( tr( "Keep &incomplete files in:" ), Prefs::INCOMPLETE_DIR_ENABLED );
b = myIncompleteButton = new QPushButton;
b->setIcon( folderPixmap );
- b->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ b->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( b, SIGNAL(clicked(bool)), this, SLOT(onIncompleteClicked(void)) );
hig->addRow( myIncompleteCheckbox, b );
enableBuddyWhenChecked( qobject_cast<QCheckBox*>(l), b );
l = myTorrentDoneScriptCheckbox = checkBoxNew( tr( "Call scrip&t when torrent is completed:" ), Prefs::SCRIPT_TORRENT_DONE_ENABLED );
b = myTorrentDoneScriptButton = new QPushButton;
b->setIcon( filePixmap );
- b->setStyleSheet( QString::fromAscii( "text-align: left; padding-left: 5; padding-right: 5" ) );
+ b->setStyleSheet( QString::fromUtf8( "text-align: left; padding-left: 5; padding-right: 5" ) );
connect( b, SIGNAL(clicked(bool)), this, SLOT(onScriptClicked(void)) );
hig->addRow( myTorrentDoneScriptCheckbox, b );
enableBuddyWhenChecked( qobject_cast<QCheckBox*>(l), b );
TARGET = transmission-qt
NAME = "Transmission"
DESCRIPTION = "Transmission: a fast, easy, and free BitTorrent client"
-VERSION = 2.00
+VERSION = 2.81
LICENSE = "GPL"
target.path = /bin
man.path = /share/man/man1/
man.files = transmission-qt.1
-CONFIG += qt qdbus thread debug link_pkgconfig
-QT += network
+CONFIG += qt thread debug link_pkgconfig
+QT += network dbus widgets
PKGCONFIG = fontconfig libcurl openssl libevent
TRANSMISSION_TOP = ..
{
QNetworkRequest request;
request.setUrl (myUrl);
- request.setRawHeader ("User-Agent", QString (QCoreApplication::instance ()->applicationName () + "/" + LONG_VERSION_STRING).toAscii ());
+ request.setRawHeader ("User-Agent", QString (QCoreApplication::instance ()->applicationName () + "/" + LONG_VERSION_STRING).toUtf8 ());
request.setRawHeader ("Content-Type", "application/json; charset=UTF-8");
if (!mySessionId.isEmpty ())
- request.setRawHeader (TR_RPC_SESSION_ID_HEADER, mySessionId.toAscii ());
+ request.setRawHeader (TR_RPC_SESSION_ID_HEADER, mySessionId.toUtf8 ());
const QByteArray requestData (json);
QNetworkReply * reply = networkAccessManager ()->post (request, requestData);
#ifndef SQUEEZELABEL_H
#define SQUEEZELABEL_H
-#include <QtGui/QLabel>
+#include <QLabel>
class SqueezeLabel : public QLabel
{
void
TorrentModel :: clear( )
{
+ beginResetModel ();
+
myIdToRow.clear( );
myIdToTorrent.clear( );
foreach( Torrent * tor, myTorrents ) delete tor;
myTorrents.clear( );
- reset( );
+
+ endResetModel ();
}
int
/// URLs
///
- static bool isMagnetLink( const QString& s ) { return s.startsWith( QString::fromAscii( "magnet:?" ) ); }
+ static bool isMagnetLink( const QString& s ) { return s.startsWith( QString::fromUtf8( "magnet:?" ) ); }
static bool isHexHashcode( const QString& s )
{
if( s.length() != 40 ) return false;
- foreach( QChar ch, s ) if( !isxdigit( ch.toAscii() ) ) return false;
+ foreach( QChar ch, s ) if( !isxdigit( ch.unicode() ) ) return false;
return true;
}
static bool isUriWithSupportedScheme( const QString& s )
{
- static const QString ftp = QString::fromAscii( "ftp://" );
- static const QString http = QString::fromAscii( "http://" );
- static const QString https = QString::fromAscii( "https://" );
+ static const QString ftp = QString::fromUtf8( "ftp://" );
+ static const QString http = QString::fromUtf8( "http://" );
+ static const QString https = QString::fromUtf8( "https://" );
return s.startsWith(http) || s.startsWith(https) || s.startsWith(ftp);
}
const int err = tr_torrentParse( ctor, &inf );
if( err )
ret = ERROR;
- else if( myModel.hasTorrent( QString::fromAscii( inf.hashString ) ) )
+ else if( myModel.hasTorrent( QString::fromUtf8( inf.hashString ) ) )
ret = DUPLICATE;
else
ret = OK;
// try to add any new files which end in .torrent
const QSet<QString> newFiles( files - myWatchDirFiles );
- const QString torrentSuffix = QString::fromAscii( ".torrent" );
+ const QString torrentSuffix = QString::fromUtf8( ".torrent" );
foreach( QString name, newFiles ) {
if( name.endsWith( torrentSuffix, Qt::CaseInsensitive ) ) {
const QString filename = dir.absoluteFilePath( name );