Compare commits
	
		
			46 Commits
		
	
	
		
			release-3.
			...
			release-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d5b790d240 | ||
| 
						 | 
					940a8b28e4 | ||
| 
						 | 
					9ee9c7d362 | ||
| 
						 | 
					2899494ef3 | ||
| 
						 | 
					624e2b287a | ||
| 
						 | 
					681d538163 | ||
| 
						 | 
					60f1a1989c | ||
| 
						 | 
					050dc9de44 | ||
| 
						 | 
					d80f94643f | ||
| 
						 | 
					1b4bb7655f | ||
| 
						 | 
					e8ffaa2f87 | ||
| 
						 | 
					a89188acc3 | ||
| 
						 | 
					993002a151 | ||
| 
						 | 
					8bcaf55439 | ||
| 
						 | 
					48aac758c9 | ||
| 
						 | 
					4ba2c3d385 | ||
| 
						 | 
					d96e21c07f | ||
| 
						 | 
					1204cebaa1 | ||
| 
						 | 
					1695e85bdf | ||
| 
						 | 
					33305cca9f | ||
| 
						 | 
					04b683c38c | ||
| 
						 | 
					d55cd9aec8 | ||
| 
						 | 
					0b5652bd72 | ||
| 
						 | 
					878787e965 | ||
| 
						 | 
					3536577af6 | ||
| 
						 | 
					9f2d9e4d3f | ||
| 
						 | 
					efe0dbabaa | ||
| 
						 | 
					b1d8fb0f11 | ||
| 
						 | 
					78fc5d4865 | ||
| 
						 | 
					19996736d6 | ||
| 
						 | 
					6f9d22af03 | ||
| 
						 | 
					6b6d05a380 | ||
| 
						 | 
					df92e3e5e9 | ||
| 
						 | 
					26b6c26ea8 | ||
| 
						 | 
					1b6183bfa3 | ||
| 
						 | 
					7edbaa3847 | ||
| 
						 | 
					2ee152a374 | ||
| 
						 | 
					bc8ac43a54 | ||
| 
						 | 
					5f48a51070 | ||
| 
						 | 
					c3a6b24ed1 | ||
| 
						 | 
					c3b22c9a01 | ||
| 
						 | 
					5d09ace7eb | ||
| 
						 | 
					fe37724338 | ||
| 
						 | 
					8aaacbe38d | ||
| 
						 | 
					edc625c9c9 | ||
| 
						 | 
					6ae21c2919 | 
							
								
								
									
										2
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,5 @@
 | 
			
		||||
Author:
 | 
			
		||||
* Christophe Dumez <chris@qbittorrent.org>
 | 
			
		||||
 | 
			
		||||
Other developers:
 | 
			
		||||
Contributors:
 | 
			
		||||
* Arnaud Demaizière <arnaud@qbittorrent.org>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						@@ -5,6 +5,8 @@
 | 
			
		||||
    - FEATURE: Bittorrent FAST extension support
 | 
			
		||||
    - FEATURE: Added RSS support
 | 
			
		||||
    - FEATURE: Support files prioritizing in a torrent
 | 
			
		||||
    - FEATURE: Brand new search engine plugins system
 | 
			
		||||
    - FEATURE: Filtered files don't appear on hard disk anymore
 | 
			
		||||
    - FEATURE: Finished torrents are now moved to another tab for seeding
 | 
			
		||||
    - FEATURE: Display more infos about the torrent in its properties
 | 
			
		||||
    - FEATURE: Allow the user to edit torrents' trackers
 | 
			
		||||
@@ -30,11 +32,22 @@
 | 
			
		||||
    - FEATURE: User is now warned when fast resume data was rejected
 | 
			
		||||
    - FEATURE: Url seeds are now displayed in torrent properties and are editable
 | 
			
		||||
    - FEATURE: Allow to drag 'n drop urls on the main window
 | 
			
		||||
    - FEATURE: Improved search engine (multipage support in all plugins)
 | 
			
		||||
    - FEATURE: Added BTJunkie search engine plugin
 | 
			
		||||
    - FEATURE: Added an option to force full disk allocation for all torrents
 | 
			
		||||
    - FEATURE: Added an option to add torrents in paused state
 | 
			
		||||
    - FEATURE: Added an option to set the max number of connections per torrent
 | 
			
		||||
    - FEATURE: Added an option to set the max number of uploads per torrent
 | 
			
		||||
    - FEATURE: Added an option to automatically delete torrents when they reach a given ratio (>= 1.0)
 | 
			
		||||
    - FEATURE: Added an option to display current transfer speeds in title bar
 | 
			
		||||
    - FEATURE: Torrent content is now displayed as a tree
 | 
			
		||||
    - FEATURE: Better media file preview (player detected automatically)
 | 
			
		||||
    - FEATURE: Greatly improved ETA calculation algorithm (use GASA)
 | 
			
		||||
    - I18N: Added Hungarian translation
 | 
			
		||||
    - I18N: Added Brazilian translation
 | 
			
		||||
    - BUGFIX: Progress of paused torrents is now correct on restart
 | 
			
		||||
    - BUGFIX: clear the results of a search stops searching
 | 
			
		||||
    - BUGFIX: Progress column gets sorted on restart it is was during last execution
 | 
			
		||||
    - BUGFIX: Made ETA more reliable using stats instead of instant values
 | 
			
		||||
    - BUGFIX: Remove torrent from hard drive used to delete parent folder if empty
 | 
			
		||||
    - BUGFIX: Fixed a crash when filtering all the files in a torrent
 | 
			
		||||
    - BUGFIX: Reload torrent only when necessary (properties)
 | 
			
		||||
@@ -52,11 +65,18 @@
 | 
			
		||||
    - BUGFIX: Made torrent deletion from hard-drive safer
 | 
			
		||||
    - BUGFIX: Prevent downloadFromUrl flooding
 | 
			
		||||
    - BUGFIX: ETA was wrong for torrents with filtered files
 | 
			
		||||
    - BUGFIX: Fixed drag'n drop on non-KDE systems
 | 
			
		||||
    - BUGFIX: Removed build dependency on Python
 | 
			
		||||
    - BUGFIX: Catching DHT exception in case there is a problem
 | 
			
		||||
    - BUGFIX: Remember properties window size and position
 | 
			
		||||
    - BUGFIX: Improved proxy support in search engine (HTTP only)
 | 
			
		||||
    - COSMETIC: Redesigned torrent properties a little
 | 
			
		||||
    - COSMETIC: Redesigned options a little
 | 
			
		||||
    - COSMETIC: Totally redesigned program preferences
 | 
			
		||||
    - COSMETIC: Display more logs messages concerning features
 | 
			
		||||
    - COSMETIC: Improved lists renderers
 | 
			
		||||
    - COSMETIC: Use a different icon for torrents being checked and for connecting ones
 | 
			
		||||
    - COSMETIC: Improved some icons
 | 
			
		||||
    - COSMETIC: Improved systray tooltip style
 | 
			
		||||
 | 
			
		||||
* Mon May 07 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.3
 | 
			
		||||
    - BUGFIX: Fixed pause toggle on double-click in download list
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,4 @@
 | 
			
		||||
qBittorrent - A BitTorrent client in C++ / Qt4.2
 | 
			
		||||
qBittorrent - A BitTorrent client in C++ / Qt4
 | 
			
		||||
------------------------------------------
 | 
			
		||||
 | 
			
		||||
*** Necessary if qt3 is default on your system ***
 | 
			
		||||
@@ -14,25 +14,30 @@ qbittorrent
 | 
			
		||||
will install and execute qBittorrent hopefully without any problems.
 | 
			
		||||
 | 
			
		||||
Dependencies:
 | 
			
		||||
- Qt >= 4.2 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
 | 
			
		||||
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
 | 
			
		||||
 | 
			
		||||
- libtorrent by Arvid Norberg (>= v0.13 REQUIRED)
 | 
			
		||||
- rblibtorrent by Arvid Norberg (>= v0.13 REQUIRED)
 | 
			
		||||
    -> http://www.qbittorrent.org/download.php (advised)
 | 
			
		||||
    -> http://www.libtorrent.net
 | 
			
		||||
    Be carefull: another library (the one used by rtorrent) use the same name.
 | 
			
		||||
    Be careful: another library (the one used by rTorrent) use the same name.
 | 
			
		||||
    These are TWO different libraries and qBittorrent will only work with the one provided
 | 
			
		||||
    on sourceforge (created by Arvid Norberg). The two libraries conflicts with each other.
 | 
			
		||||
 | 
			
		||||
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
 | 
			
		||||
 | 
			
		||||
- libcommoncpp2
 | 
			
		||||
- libcurl
 | 
			
		||||
 | 
			
		||||
- python >= 2.3 (previous might work - not tested): needed by search engine.
 | 
			
		||||
- python >= 2.3 (needed by search engine)
 | 
			
		||||
 | 
			
		||||
- libmagick++ (advised, not required)
 | 
			
		||||
  * Needed for favicons support (RSS / Search plugins)
 | 
			
		||||
 | 
			
		||||
NOTE FOR GNOME USERS:
 | 
			
		||||
- qt4-qtconfig package is advised when using Plastique style (default)
 | 
			
		||||
  or just change qBittorrent style to Cleanlooks (GNOME like)
 | 
			
		||||
- libzzip (advised, not required)
 | 
			
		||||
  * Needed for zip support (Search plugins)
 | 
			
		||||
 | 
			
		||||
NOTE FOR NON-KDE USERS:
 | 
			
		||||
- qt4-qtconfig package is advised when using other systems than KDE.
 | 
			
		||||
  You can also change qBittorrent style to Cleanlooks (GNOME like)
 | 
			
		||||
 | 
			
		||||
DOCUMENTATION:
 | 
			
		||||
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								README
									
									
									
									
									
								
							
							
						
						@@ -3,30 +3,30 @@ qBittorrent - A BitTorrent client in Qt4
 | 
			
		||||
 | 
			
		||||
Description:
 | 
			
		||||
********************************
 | 
			
		||||
qBittorrent is a bittorrent client programmed in C++ / Qt4 that use
 | 
			
		||||
libtorrent (sometimes called rb_libtorrent) by Arvid Norberg.
 | 
			
		||||
qBittorrent is a bittorrent client programmed in C++ / Qt4 that uses
 | 
			
		||||
libtorrent (sometimes called rblibtorrent) by Arvid Norberg.
 | 
			
		||||
 | 
			
		||||
It aims to be a good alternative to all other bittorrent clients
 | 
			
		||||
out there. qBittorrent is fast, stable and provides unicode
 | 
			
		||||
support.
 | 
			
		||||
support as well as many features.
 | 
			
		||||
 | 
			
		||||
Installation:
 | 
			
		||||
********************************
 | 
			
		||||
For installation follow the instructions from INSTALL file, but simple
 | 
			
		||||
For installation, follow the instructions from INSTALL file, but simple:
 | 
			
		||||
 | 
			
		||||
./configure
 | 
			
		||||
make && make install
 | 
			
		||||
qbittorrent
 | 
			
		||||
 | 
			
		||||
will install and execute qBittorrent hopefully without any problems.
 | 
			
		||||
will install and execute qBittorrent hopefully without any problem.
 | 
			
		||||
 | 
			
		||||
For more information please visit:
 | 
			
		||||
http://www.qbittorrent.org
 | 
			
		||||
 | 
			
		||||
Please report any bug (or feature requests) to:
 | 
			
		||||
Please report any bug (or feature request) to:
 | 
			
		||||
http://bugs.qbittorrent.org
 | 
			
		||||
 | 
			
		||||
You can also meet me on IRC:
 | 
			
		||||
You can also meet me (chris-qBT) on IRC:
 | 
			
		||||
#qbittorrent on irc.freenode.net
 | 
			
		||||
 | 
			
		||||
------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								TODO
									
									
									
									
									
								
							
							
						
						@@ -1,98 +1,64 @@
 | 
			
		||||
// Easy
 | 
			
		||||
- Translations into as many languages as possible
 | 
			
		||||
- Improve man page
 | 
			
		||||
- Use Launchpad/Rosetta for translations once it supports TS files
 | 
			
		||||
 | 
			
		||||
// Intermediate
 | 
			
		||||
- Port on MacOS, Windows (and create an installer for Windows) - Progressing slowly
 | 
			
		||||
- Add some transparency (menus,...), improve look
 | 
			
		||||
- Port on MacOS, Windows (and create an installer for Windows) - Slow progress
 | 
			
		||||
- Add some transparency (menus,...), improve look / usabilty
 | 
			
		||||
- Skins support? (contact Mateusz)
 | 
			
		||||
 | 
			
		||||
// Harder
 | 
			
		||||
- Display a progress bar that really displays the pieces we have (like in eMule)
 | 
			
		||||
- Torrent scheduler ala µtorrent/Bitcomet
 | 
			
		||||
 | 
			
		||||
// Waiting for libtorrent
 | 
			
		||||
- File selection in a torrent in compact mode
 | 
			
		||||
- Allow to prioritize torrents
 | 
			
		||||
- Allow to prioritize torrents (may code this in qBittorrent?)
 | 
			
		||||
 | 
			
		||||
// Unsure
 | 
			
		||||
- Display the peers we are connected to for each torrent with infos (like flag, dl/up speeds, ...)
 | 
			
		||||
- Azureus spoofing to prevent ban from trackers?
 | 
			
		||||
- Option to shutdown computer when downloads are finished
 | 
			
		||||
- Add a torrent scheduler
 | 
			
		||||
- NAT checker/Tester
 | 
			
		||||
- Display hard drive space left?
 | 
			
		||||
- Make use of dbus on Linux for the single instance instead of socket communication?
 | 
			
		||||
  (http://techbase.kde.org/Development/Tutorials/D-Bus/Accessing_Interfaces)
 | 
			
		||||
- search engines customizing
 | 
			
		||||
- When favicon can't be downloaded, try to parse the webpage for:
 | 
			
		||||
  <link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">
 | 
			
		||||
    * Be carefull, the link can be relative
 | 
			
		||||
 | 
			
		||||
// in v1.2.0
 | 
			
		||||
- Allow user to organize the downloads into categories/folders
 | 
			
		||||
- Allow user to organize the downloads into categories/folders?
 | 
			
		||||
 | 
			
		||||
// in v1.1.0
 | 
			
		||||
- Tabs support in search
 | 
			
		||||
- Allow to hide columns?
 | 
			
		||||
- Allow to scan multiple directories? (useful?)
 | 
			
		||||
- Web interface (turbogears? php?)
 | 
			
		||||
- Web interface (turbogears? php? python?)
 | 
			
		||||
  * Webserver? Try to write a webserver as a plugin for qBittorrent in Python
 | 
			
		||||
    * http://fragments.turtlemeat.com/pythonwebserver.php
 | 
			
		||||
- improve and test tracker authentication code (remember login/pass) (need a tracker to test this)
 | 
			
		||||
- support zipped torrents? (useful?)
 | 
			
		||||
- Add option for RSS customization (refresh interval, max news per RSS...)
 | 
			
		||||
- Allow to disable UPnP/NAT-PMP/LSD in options?
 | 
			
		||||
- Allow to automatically delete torrents when they reach a given ratio (in options) : easy
 | 
			
		||||
- Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes)
 | 
			
		||||
- Add "Mark all as read" feature for RSS
 | 
			
		||||
- Allow to customize lists refreshing interval (in options)
 | 
			
		||||
- Use search engines as plugins (split them, load them dynamically) to allow the user to add some
 | 
			
		||||
- Improve search plugin install (choose in a list taken from plugins.qbittorrent.org)
 | 
			
		||||
- Display the number of DHT node if possible
 | 
			
		||||
- When adding a duplicate torrent, check if the trackers are different from the existing one and ask the user if he wants to add them
 | 
			
		||||
- Display in torrent addition dialog:
 | 
			
		||||
   * free disk space on selected drive
 | 
			
		||||
   * free disk space after torrent download (and/or torrent size)
 | 
			
		||||
- Start minimized option in program preferences
 | 
			
		||||
- In finished list, replace "Seeds/Leechs" column by "Leechers" because Seeds are always 0.
 | 
			
		||||
- Allow to change action on double-click
 | 
			
		||||
  -> in download list
 | 
			
		||||
  -> in seeding list
 | 
			
		||||
 | 
			
		||||
// in v1.0.0 (partial) - WIP
 | 
			
		||||
- Check storage st creation + hasher in torrent creation
 | 
			
		||||
- Fix all (or almost all) opened bugs in bug tracker
 | 
			
		||||
- update sorting when a new torrent is added?
 | 
			
		||||
- Keep documention up to date
 | 
			
		||||
- Windows port (Chris - Peerkoel)
 | 
			
		||||
- write patches libtorrent for file_priority(int index), actual_size() ?
 | 
			
		||||
- valgrind --tool=memcheck --leak-check=full src/qbittorrent (Looks ok)
 | 
			
		||||
- 128m  29m  16m S  4.8  2.9   0:02.28 qbittorrent
 | 
			
		||||
* beta 6
 | 
			
		||||
  - Translations update (IN PROGRESS)
 | 
			
		||||
  - Wait for some bug fixes in libtorrent :
 | 
			
		||||
    - Number of seeds non null for finished torrent (Ticket #122)
 | 
			
		||||
TODO:
 | 
			
		||||
- Check search engine cpu usage
 | 
			
		||||
 | 
			
		||||
LANGUAGES UPDATED:
 | 
			
		||||
- French *BETA3*
 | 
			
		||||
- English *BETA3*
 | 
			
		||||
- Japanese *BETA3*
 | 
			
		||||
- Swedish *BETA3*
 | 
			
		||||
- Slovak *BETA3*
 | 
			
		||||
- Ukrainian *BETA3*
 | 
			
		||||
- Chinese (simplified) *BETA4*
 | 
			
		||||
- Hungarian *BETA4*
 | 
			
		||||
- Italian *BETA5*
 | 
			
		||||
- Polish *BETA5*
 | 
			
		||||
- Portuguese *BETA5*
 | 
			
		||||
- Brazilian *BETA5*
 | 
			
		||||
- Spanish *BETA5*
 | 
			
		||||
- German *BETA5*
 | 
			
		||||
- Russian *BETA5*
 | 
			
		||||
- Korean *BETA5*
 | 
			
		||||
- Greek *BETA6*
 | 
			
		||||
- Dutch *BETA6*
 | 
			
		||||
- Romanian *BETA6*
 | 
			
		||||
 | 
			
		||||
beta5->beta6 changelog:
 | 
			
		||||
- FEATURE: Split download tab from GUI class and cleaned up code
 | 
			
		||||
- FEATURE: A lot of code optimization (CPU & memory usage)
 | 
			
		||||
- FEATURE: Added support for .ico format (useful for RSS favicons)
 | 
			
		||||
- FEATURE: Replaced Meganova search engine by TorrentReactor
 | 
			
		||||
- I18N: Updated Greek, Dutch and Romanian translation
 | 
			
		||||
- I18N: Removed no longer maintained Traditional chinese translation
 | 
			
		||||
- BUGFIX: Made torrent deletion from hard-drive safer
 | 
			
		||||
- BUGFIX: Fixed a bug when switching from finished to downloading list
 | 
			
		||||
- BUGFIX: Showing checking progress for paused torrents too
 | 
			
		||||
- BUGFIX: Fixed progress column sorting on startup
 | 
			
		||||
- BUGFIX: Prevent downloadFromUrl flooding
 | 
			
		||||
- BUGFIX: Fixed pause state toggle for paused and checking torrents
 | 
			
		||||
- BUGFIX: Made finished list context menu more similar to the download list one
 | 
			
		||||
- BUGFIX: Fixed Pause/Start action in lists context menus
 | 
			
		||||
- BUGFIX: Improved ETA calculation
 | 
			
		||||
- BUGFIX: ETA was wrong for torrents with filtered files
 | 
			
		||||
- BUGFIX: Display the torrent that are being checked as 'checking' in seeding list
 | 
			
		||||
- BUGFIX: Fixed file preview and improved previewable files detection
 | 
			
		||||
- BUGFIX: Do not store and calculate ETA values for finished/paused torrents
 | 
			
		||||
- BUGFIX: Fixed memory leak in GUI
 | 
			
		||||
rc9->rc10 changelog:
 | 
			
		||||
- FEATURE: Greatly improved ETA calculation algorithm (use GASA)
 | 
			
		||||
- BUGFIX: Fixed proxy host max length in preferences
 | 
			
		||||
- BUGFIX: Added a 3 minutes search engine timeout
 | 
			
		||||
- BUGFIX: Limit search engine plugins to 10 result pages
 | 
			
		||||
- BUGFIX: Fixed nbResults != 0 when clearing results while a search is running
 | 
			
		||||
- BUGFIX: Fixed possible problem when closing to systray and cancelling app exit
 | 
			
		||||
- BUGFIX: Fixed preview when path contains spaces
 | 
			
		||||
- COSMETIC: Use more skin colors instead of hard coded ones
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 <profile>qbittorrent.pro</profile>
 | 
			
		||||
 <moddir>qcm</moddir>
 | 
			
		||||
 <datadir/>
 | 
			
		||||
  <dep type='qt42'>
 | 
			
		||||
  <dep type='qt4'>
 | 
			
		||||
    <required/>
 | 
			
		||||
  </dep>
 | 
			
		||||
  <dep type='libtorrent'>
 | 
			
		||||
@@ -12,11 +12,9 @@
 | 
			
		||||
  <dep type='libboost'>
 | 
			
		||||
    <required/>
 | 
			
		||||
  </dep>
 | 
			
		||||
  <dep type='libcommoncpp2'>
 | 
			
		||||
    <required/>
 | 
			
		||||
  </dep>
 | 
			
		||||
	<dep type='libmagick'/>
 | 
			
		||||
  <dep type='python'>
 | 
			
		||||
  <dep type='libcurl'>
 | 
			
		||||
    <required/>
 | 
			
		||||
  </dep>
 | 
			
		||||
  <dep type='libmagick'/>
 | 
			
		||||
  <dep type='libzzip'/>
 | 
			
		||||
</qconf>
 | 
			
		||||
 
 | 
			
		||||
@@ -37,15 +37,17 @@ public:
 | 
			
		||||
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBCOMMONCPP2_LIB");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!QFile::exists(s+QString("libccext2.so")))
 | 
			
		||||
			if(!QFile::exists(s+QString("/libccext2.so")))
 | 
			
		||||
		    return false;
 | 
			
		||||
			if(!QFile::exists(s+QString("libccgnu2.so")))
 | 
			
		||||
			if(!QFile::exists(s+QString("/libccgnu2.so")))
 | 
			
		||||
				return false;
 | 
			
		||||
    	conf->addLib(QString("-L") + s);
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/lib/";
 | 
			
		||||
			sl << "/usr/lib64/";
 | 
			
		||||
			sl << "/usr/local/lib/";
 | 
			
		||||
			sl << "/usr/local/lib64/";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(QFile::exists(s+QString("libccext2.so"))){
 | 
			
		||||
@@ -58,16 +60,6 @@ public:
 | 
			
		||||
			if(!found) return false;
 | 
			
		||||
			conf->addLib(QString("-L") + s);
 | 
			
		||||
		}
 | 
			
		||||
		// BUGFIX for Fedora (doesn't support pkg-config?)
 | 
			
		||||
    QFile issue_file("/etc/issue");
 | 
			
		||||
    if(issue_file.open(QIODevice::ReadOnly | QIODevice::Text)){
 | 
			
		||||
      QString content = issue_file.readAll();
 | 
			
		||||
      issue_file.close();
 | 
			
		||||
      if(content.indexOf("Fedora") != -1){
 | 
			
		||||
        qWarning("Fedora detected. WORKAROUND for Fedora pkg-config problem enabled");
 | 
			
		||||
        conf->addLib("-pthread -lccext2 -lz -lccgnu2 -ldl -lrt");
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								qcm/libcurl.qcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,61 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: libcommoncpp2
 | 
			
		||||
arg: with-libcurl-inc=[path], Path to libcurl include files
 | 
			
		||||
arg: with-libcurl-lib=[path], Path to libcurl library files
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
class qc_libcurl : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_libcurl(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "libcurl"; }
 | 
			
		||||
	QString shortname() const { return "libcurl"; }
 | 
			
		||||
	bool exec(){
 | 
			
		||||
    QString s;
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBCURL_INC");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!conf->checkHeader(s, "curl/curl.h")) {
 | 
			
		||||
				return false;
 | 
			
		||||
    	}
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/include";
 | 
			
		||||
			sl << "/usr/local/include";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(conf->checkHeader(s, "curl/curl.h")){
 | 
			
		||||
					found = true;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(!found) {
 | 
			
		||||
				return false;
 | 
			
		||||
      }
 | 
			
		||||
		}
 | 
			
		||||
		conf->addIncludePath(s);
 | 
			
		||||
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBCURL_LIB");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!QFile::exists(s+QString("/libcurl.so")))
 | 
			
		||||
		          return false;
 | 
			
		||||
    	conf->addLib(QString("-L") + s);
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/lib/";
 | 
			
		||||
			sl << "/usr/lib64/";
 | 
			
		||||
			sl << "/usr/local/lib/";
 | 
			
		||||
			sl << "/usr/local/lib64/";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(QFile::exists(s+QString("libcurl.so"))){
 | 
			
		||||
					found = true;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(!found) return false;
 | 
			
		||||
			conf->addLib(QString("-L") + s);
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
@@ -44,13 +44,15 @@ public:
 | 
			
		||||
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBMAGICK_LIB");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!QFile::exists(s+QString("libMagick++.so"))){
 | 
			
		||||
			if(!QFile::exists(s+QString("/libMagick++.so"))){
 | 
			
		||||
                          return false;
 | 
			
		||||
                        }
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/lib/";
 | 
			
		||||
			sl << "/usr/lib64/";
 | 
			
		||||
			sl << "/usr/local/lib/";
 | 
			
		||||
			sl << "/usr/local/lib64/";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(QFile::exists(s+QString("libMagick++.so"))){
 | 
			
		||||
@@ -69,6 +71,7 @@ public:
 | 
			
		||||
		magickConfig.waitForStarted();
 | 
			
		||||
		magickConfig.waitForFinished();
 | 
			
		||||
		QByteArray result = magickConfig.readAll();
 | 
			
		||||
		result = result.replace("\n", "");
 | 
			
		||||
		conf->addLib(result.data());
 | 
			
		||||
		conf->addDefine("HAVE_MAGICK");
 | 
			
		||||
		return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,9 @@ public:
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/lib/";
 | 
			
		||||
			sl << "/usr/lib64/";
 | 
			
		||||
			sl << "/usr/local/lib/";
 | 
			
		||||
			sl << "/usr/local/lib64/";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(conf->checkLibrary(s, "torrent")){
 | 
			
		||||
@@ -63,16 +65,6 @@ public:
 | 
			
		||||
			if(!found) return false;
 | 
			
		||||
			conf->addLib(QString("-L") + s);
 | 
			
		||||
		}
 | 
			
		||||
		// BUGFIX for Fedora (doesn't support pkg-config?)
 | 
			
		||||
		QFile issue_file("/etc/issue");
 | 
			
		||||
		if(issue_file.open(QIODevice::ReadOnly | QIODevice::Text)){
 | 
			
		||||
			QString content = issue_file.readAll();
 | 
			
		||||
			issue_file.close();
 | 
			
		||||
			if(content.indexOf("Fedora") != -1){
 | 
			
		||||
				qWarning("Fedora detected. WORKAROUND for Fedora pkg-config problem enabled");
 | 
			
		||||
				conf->addLib("-lssl -lcrypto -lboost_date_time -lboost_filesystem -lboost_thread -lz -ltorrent");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								qcm/libzzip.qcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: libzzip
 | 
			
		||||
arg: with-libzzip-inc=[path], Path to libzzip++ include files
 | 
			
		||||
arg: with-libzzip-lib=[path], Path to libzzip++ library files
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
#include <QProcess>
 | 
			
		||||
class qc_libzzip : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_libzzip(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "Zzip library (libzzip)"; }
 | 
			
		||||
	QString shortname() const { return "libzzip"; }
 | 
			
		||||
	QString checkString() const {
 | 
			
		||||
		if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
 | 
			
		||||
			return "";
 | 
			
		||||
		return ConfObj::checkString();
 | 
			
		||||
	}
 | 
			
		||||
	bool exec(){
 | 
			
		||||
		if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
 | 
			
		||||
			return false;
 | 
			
		||||
		QString s;
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBZZIP_INC");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!conf->checkHeader(s, "zzip/zzip.h")) {
 | 
			
		||||
				return false;
 | 
			
		||||
    			}
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/include";
 | 
			
		||||
			sl << "/usr/local/include";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(conf->checkHeader(s, "zzip/zzip.h")){
 | 
			
		||||
					found = true;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(!found)
 | 
			
		||||
				return false;
 | 
			
		||||
		}
 | 
			
		||||
		conf->addIncludePath(s);
 | 
			
		||||
 | 
			
		||||
		s = conf->getenv("QC_WITH_LIBZZIP_LIB");
 | 
			
		||||
		if(!s.isEmpty()) {
 | 
			
		||||
			if(!QFile::exists(s+QString("/libzzip.so"))){
 | 
			
		||||
                          return false;
 | 
			
		||||
                        }
 | 
			
		||||
		}else{
 | 
			
		||||
			QStringList sl;
 | 
			
		||||
			sl << "/usr/lib/";
 | 
			
		||||
			sl << "/usr/lib64/";
 | 
			
		||||
			sl << "/usr/local/lib/";
 | 
			
		||||
			sl << "/usr/local/lib64/";
 | 
			
		||||
			bool found = false;
 | 
			
		||||
			foreach(s, sl){
 | 
			
		||||
				if(QFile::exists(s+QString("libzzip.so"))){
 | 
			
		||||
					found = true;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(!found)
 | 
			
		||||
                         	return false;
 | 
			
		||||
		}
 | 
			
		||||
		conf->addLib(QString("-L") + s);
 | 
			
		||||
		conf->addLib("-lzzip");
 | 
			
		||||
		conf->addDefine("HAVE_ZZIP");
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: python
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
class qc_python : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_python(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "python >= 2.3"; }
 | 
			
		||||
	QString shortname() const { return "python"; }
 | 
			
		||||
	bool exec(){
 | 
			
		||||
          int r = conf->doCommand("python testpython.py");
 | 
			
		||||
	  if(r == 0)
 | 
			
		||||
	    return true;
 | 
			
		||||
	  else
 | 
			
		||||
	    return false;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								qcm/qt4.qcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: Qt >= 4.3
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
class qc_qt4 : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_qt4(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "Qt >= 4.3"; }
 | 
			
		||||
	QString shortname() const { return "Qt 4.3"; }
 | 
			
		||||
	bool exec()
 | 
			
		||||
	{
 | 
			
		||||
		return(QT_VERSION >= 0x040300);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								qcm/qt42.qcm
									
									
									
									
									
								
							
							
						
						@@ -1,16 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: Qt >= 4.2
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
class qc_qt42 : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_qt42(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "Qt >= 4.2"; }
 | 
			
		||||
	QString shortname() const { return "qt42"; }
 | 
			
		||||
	bool exec()
 | 
			
		||||
	{
 | 
			
		||||
		return(QT_VERSION >= 0x040200);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
@@ -83,11 +83,9 @@ class DLListDelegate: public QItemDelegate {
 | 
			
		||||
          newopt.maximum = 100;
 | 
			
		||||
          newopt.minimum = 0;
 | 
			
		||||
          newopt.state |= QStyle::State_Enabled;
 | 
			
		||||
          newopt.textVisible = false;
 | 
			
		||||
          newopt.textVisible = true;
 | 
			
		||||
          QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
 | 
			
		||||
          painter);
 | 
			
		||||
          painter->setPen(QColor("Black"));
 | 
			
		||||
          painter->drawText(opt.rect, Qt::AlignCenter, newopt.text);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        default:
 | 
			
		||||
 
 | 
			
		||||
@@ -76,11 +76,9 @@ class FinishedListDelegate: public QItemDelegate {
 | 
			
		||||
          newopt.maximum = 100;
 | 
			
		||||
          newopt.minimum = 0;
 | 
			
		||||
          newopt.state |= QStyle::State_Enabled;
 | 
			
		||||
          newopt.textVisible = false;
 | 
			
		||||
          newopt.textVisible = true;
 | 
			
		||||
          QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
 | 
			
		||||
          painter);
 | 
			
		||||
          painter->setPen(QColor("Black"));
 | 
			
		||||
          painter->drawText(opt.rect, Qt::AlignCenter, newopt.text);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        default:
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,8 @@ void FinishedTorrents::torrentAdded(QString, QTorrentHandle& h, bool) {
 | 
			
		||||
 | 
			
		||||
// Set the color of a row in data model
 | 
			
		||||
void FinishedTorrents::setRowColor(int row, QString color){
 | 
			
		||||
  for(int i=0; i<finishedListModel->columnCount(); ++i){
 | 
			
		||||
  unsigned int nbColumns = finishedListModel->columnCount()-1;
 | 
			
		||||
  for(unsigned int i=0; i<nbColumns; ++i){
 | 
			
		||||
    finishedListModel->setData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -209,6 +210,10 @@ void FinishedTorrents::updateFinishedList(){
 | 
			
		||||
    }
 | 
			
		||||
    Q_ASSERT(row != -1);
 | 
			
		||||
    if(h.is_paused()) continue;
 | 
			
		||||
    if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) != -1) {
 | 
			
		||||
      finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)h.progress()));
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
 | 
			
		||||
      // What are you doing here? go back to download tab!
 | 
			
		||||
      qDebug("Info: a torrent was moved from finished to download tab");
 | 
			
		||||
@@ -218,10 +223,8 @@ void FinishedTorrents::updateFinishedList(){
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    if(h.state() == torrent_status::checking_files){
 | 
			
		||||
      if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) == -1) {
 | 
			
		||||
        finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
 | 
			
		||||
        setRowColor(row, QString::fromUtf8("grey"));
 | 
			
		||||
      }
 | 
			
		||||
      finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
 | 
			
		||||
      setRowColor(row, QString::fromUtf8("grey"));
 | 
			
		||||
      finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)h.progress()));
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
@@ -310,8 +313,6 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
 | 
			
		||||
  QModelIndex index;
 | 
			
		||||
  // Enable/disable pause/start action given the DL state
 | 
			
		||||
  QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
 | 
			
		||||
  QSettings settings("qBittorrent", "qBittorrent");
 | 
			
		||||
  QString previewProgram = settings.value("Options/Misc/PreviewProgram", QString()).toString();
 | 
			
		||||
  bool has_pause = false, has_start = false, has_preview = false;
 | 
			
		||||
  foreach(index, selectedIndexes) {
 | 
			
		||||
    if(index.column() == F_NAME) {
 | 
			
		||||
@@ -331,7 +332,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
 | 
			
		||||
          has_pause = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if(!previewProgram.isEmpty() && BTSession->isFilePreviewPossible(hash) && !has_preview) {
 | 
			
		||||
      if(BTSession->isFilePreviewPossible(hash) && !has_preview) {
 | 
			
		||||
         myFinishedListMenu.addAction(actionPreview_file);
 | 
			
		||||
         has_preview = true;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										413
									
								
								src/GUI.cpp
									
									
									
									
									
								
							
							
						
						@@ -64,7 +64,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{
 | 
			
		||||
    FinishedTorrents *finishedTorrentTab;
 | 
			
		||||
    QLabel *connecStatusLblIcon;
 | 
			
		||||
    bool systrayIntegration;
 | 
			
		||||
    bool displaySpeedInTitle;
 | 
			
		||||
    bool force_exit;
 | 
			
		||||
    unsigned int refreshInterval;
 | 
			
		||||
    QTimer *refresher;
 | 
			
		||||
    // Keyboard shortcuts
 | 
			
		||||
    QShortcut *switchSearchShortcut;
 | 
			
		||||
@@ -72,8 +74,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
 | 
			
		||||
    QShortcut *switchDownShortcut;
 | 
			
		||||
    QShortcut *switchUpShortcut;
 | 
			
		||||
    QShortcut *switchRSSShortcut;
 | 
			
		||||
    // Preview
 | 
			
		||||
    QProcess *previewProcess;
 | 
			
		||||
    // Search
 | 
			
		||||
    SearchEngine *searchEngine;
 | 
			
		||||
    // RSS
 | 
			
		||||
@@ -96,7 +96,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
 | 
			
		||||
    void togglePausedState(QString hash);
 | 
			
		||||
    void on_actionPreview_file_triggered();
 | 
			
		||||
    void previewFile(QString filePath);
 | 
			
		||||
    void cleanTempPreviewFile(int, QProcess::ExitStatus) const;
 | 
			
		||||
    void balloonClicked();
 | 
			
		||||
    void writeSettings();
 | 
			
		||||
    void readSettings();
 | 
			
		||||
@@ -127,10 +126,12 @@ class GUI : public QMainWindow, private Ui::MainWindow{
 | 
			
		||||
    void checkConnectionStatus();
 | 
			
		||||
    void configureSession(bool deleteOptions);
 | 
			
		||||
    void processParams(const QStringList& params);
 | 
			
		||||
    void addTorrent(QString path);
 | 
			
		||||
    void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
 | 
			
		||||
    void processScannedFiles(const QStringList& params);
 | 
			
		||||
    void processDownloadedFiles(QString path, QString url);
 | 
			
		||||
    void downloadFromURLList(const QStringList& urls);
 | 
			
		||||
    void deleteTorrent(QString hash, QString fileName, bool finished);
 | 
			
		||||
    void finishedTorrent(QTorrentHandle& h) const;
 | 
			
		||||
    void torrentChecked(QString hash) const;
 | 
			
		||||
    void updateLists();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/Icons/bt_settings.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/configure.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 820 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/download.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/edit_clear.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 575 B  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/file.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 704 B  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 998 B  | 
| 
		 Before Width: | Height: | Size: 558 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/folder.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 449 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/gear.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.3 KiB  |