source: trunk/qt/utils.cc @ 10818

Last change on this file since 10818 was 10818, checked in by charles, 12 years ago

(trunk) add tr_formatter_size() and tr_formatter_speed() so that all the client apps don't have to reinvent the wheel

  • Property svn:keywords set to Date Rev Author Id
File size: 5.5 KB
Line 
1/*
2 * This file Copyright (C) 2009-2010 Mnemosyne LLC
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: utils.cc 10818 2010-06-22 04:34:16Z charles $
11 */
12
13#include <iostream>
14
15#include <QApplication>
16#include <QDataStream>
17#include <QFile>
18#include <QFileDialog>
19#include <QFileInfo>
20#include <QInputDialog>
21#include <QObject>
22#include <QSet>
23#include <QStyle>
24
25#include <libtransmission/transmission.h>
26#include <libtransmission/utils.h> // tr_formatter
27
28#include "qticonloader.h"
29#include "utils.h"
30
31QString
32Utils :: remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local )
33{
34    QString path;
35
36    if( local )
37    {
38        if( dir )
39            path = QFileDialog::getExistingDirectory( parent, title, myPath );
40        else
41            path = QFileDialog::getOpenFileName( parent, title, myPath );
42    }
43    else
44        path = QInputDialog::getText( parent, title, tr( "Enter a location:" ), QLineEdit::Normal, myPath, NULL );
45
46    return path;
47}
48
49QString
50Utils :: sizeToString( double  bytes )
51{
52    if( !bytes )
53        return tr( "None" );
54    else {
55        char buf[128];
56        tr_formatter_size( buf, bytes, sizeof( buf ) );
57        return buf;
58    }
59}
60
61QString
62Utils :: speedToString( const Speed& speed )
63{
64    if( speed.isZero( ) )
65        return tr( "None" );
66    else {
67        char buf[128];
68        tr_formatter_speed( buf, speed.bps( ), sizeof( buf ) );
69        return buf;
70    }
71}
72
73QString
74Utils :: ratioToString( double ratio )
75{
76    QString buf;
77
78    if( (int)ratio == TR_RATIO_NA )
79        buf = tr( "None" );
80    else if( (int)ratio == TR_RATIO_INF )
81        buf = QString::fromUtf8( "\xE2\x88\x9E" );
82    else
83    {
84        QStringList temp;
85
86        temp = QString().sprintf( "%f", ratio ).split( "." );
87        if( ratio < 100.0 )
88        {
89            if( ratio < 10.0 )
90                temp[1].truncate( 2 );
91            else
92                temp[1].truncate( 1 );
93            buf = temp.join( "." );
94        }
95        else
96            buf = QString( temp[0] );
97    }
98
99    return buf;
100
101}
102
103QString
104Utils :: timeToString( int seconds )
105{
106    int days, hours, minutes;
107    QString d, h, m, s;
108    QString str;
109
110    if( seconds < 0 )
111        seconds = 0;
112
113    days = seconds / 86400;
114    hours = ( seconds % 86400 ) / 3600;
115    minutes = ( seconds % 3600 ) / 60;
116    seconds %= 60;
117
118    d = tr( "%Ln day(s)", 0, days );
119    h = tr( "%Ln hour(s)", 0, hours );
120    m = tr( "%Ln minute(s)", 0, minutes );
121    s = tr( "%Ln second(s)", 0, seconds );
122
123    if( days )
124    {
125        if( days >= 4 || !hours )
126            str = d;
127        else
128            str = tr( "%1, %2" ).arg( d ).arg( h );
129    }
130    else if( hours )
131    {
132        if( hours >= 4 || !minutes )
133            str = h;
134        else
135            str = tr( "%1, %2" ).arg( h ).arg( m );
136    }
137    else if( minutes )
138    {
139        if( minutes >= 4 || !seconds )
140            str = m;
141        else
142            str = tr( "%1, %2" ).arg( m ).arg( s );
143    }
144    else
145    {
146        str = s;
147    }
148
149    return str;
150}
151
152void
153Utils :: toStderr( const QString& str )
154{
155    std::cerr << qPrintable(str) << std::endl;
156}
157
158const QIcon&
159Utils :: guessMimeIcon( const QString& filename )
160{
161    enum { DISK, DOCUMENT, PICTURE, VIDEO, ARCHIVE, AUDIO, APP, TYPE_COUNT };
162    static QIcon fallback;
163    static QIcon fileIcons[TYPE_COUNT];
164    static QSet<QString> suffixes[TYPE_COUNT];
165
166    if( fileIcons[0].isNull( ) )
167    {
168        fallback = QApplication::style()->standardIcon( QStyle :: SP_FileIcon );
169
170        fileIcons[DISK]= QtIconLoader :: icon( "media-optical", fallback );
171        suffixes[DISK] << "iso";
172
173        fileIcons[DOCUMENT] = QtIconLoader :: icon( "text-x-generic", fallback );
174        suffixes[DOCUMENT] << "abw" << "csv" << "doc" << "dvi" << "htm" << "html" << "ini" << "log"
175                           << "odp" << "ods" << "odt" << "pdf" << "ppt" << "ps" << "rtf" << "tex"
176                           << "txt" << "xml";
177
178        fileIcons[PICTURE]  = QtIconLoader :: icon( "image-x-generic", fallback );
179        suffixes[PICTURE] << "bmp" << "gif" << "jpg" << "jpeg" << "pcx" << "png" << "psd" << "raw"
180                          << "tga" << "tiff";
181
182        fileIcons[VIDEO] = QtIconLoader :: icon( "video-x-generic", fallback );
183        suffixes[VIDEO] << "3gp" << "asf" << "avi" << "mov" << "mpeg" << "mpg" << "mp4" << "mkv"
184                        << "mov" << "ogm" << "ogv" << "qt" << "rm" << "wmv";
185
186        fileIcons[ARCHIVE]  = QtIconLoader :: icon( "package-x-generic", fallback );
187        suffixes[ARCHIVE] << "7z" << "ace" << "bz2" << "cbz" << "gz" << "gzip" << "lzma" << "rar"
188                          << "sft" << "tar" << "zip";
189
190        fileIcons[AUDIO] = QtIconLoader :: icon( "audio-x-generic", fallback );
191        suffixes[AUDIO] << "aac" << "ac3" << "aiff" << "ape" << "au" << "flac" << "m3u" << "m4a"
192                        << "mid" << "midi" << "mp2" << "mp3" << "mpc" << "nsf" << "oga" << "ogg"
193                        << "ra" << "ram" << "shn" << "voc" << "wav" << "wma";
194
195        fileIcons[APP] = QtIconLoader :: icon( "application-x-executable", fallback );
196        suffixes[APP] << "bat" << "cmd" << "com" << "exe";
197    }
198
199    QString suffix( QFileInfo( filename ).suffix( ).toLower( ) );
200
201    for( int i=0; i<TYPE_COUNT; ++i )
202        if( suffixes[i].contains( suffix ) )
203            return fileIcons[i];
204
205    return fallback;
206}
Note: See TracBrowser for help on using the repository browser.