Compare commits

...

25 Commits
2.1 ... 2.6.1

Author SHA1 Message Date
6bfbfe1c78 version 2.6.1 2023-03-01 15:50:55 +01:00
7e736b524e bug correction in making treeview 2023-03-01 15:50:37 +01:00
3345a65b28 version 2.6 2023-03-01 14:25:31 +01:00
63f7aafc68 translation 2023-03-01 14:25:06 +01:00
f47160622c Added support for password protected services 2023-03-01 14:12:38 +01:00
e7eafb3117 added password protected connexion
correction bug on detection of already downloaded file
2023-02-27 23:48:05 +01:00
10060ee2c4 version 2.5 2023-02-22 00:57:07 +01:00
e14d1539fe Merge branch 'master' of git.labolyon.fr:dtux/RsyncUI 2023-02-22 00:53:29 +01:00
a8e888e20d corrected regression: resuming downloadlist download did not start\n added downloading speed in progress bar 2023-02-22 00:52:53 +01:00
f3c361f155 corrected regression: resuming downloadlist download did not start\n added downloading speed in progress bar 2023-02-22 00:48:16 +01:00
e8743ff802 version 2.4.1 2023-02-16 21:33:53 +01:00
1145c74440 - resolved regression: no icon on menutray. 2023-02-16 21:28:58 +01:00
c42baaa2c8 changed qtcreator config 2023-02-15 14:25:21 +01:00
8419f8ad90 - resolved a bug in filelist: when clicking again on a directory add
again files
- resolved bug: at startup relaoding download do not start downloading
- added downloading filename in progress bar
2023-02-15 13:49:31 +01:00
623ad81c6b version 2.4 2023-02-15 13:48:38 +01:00
7e424a57b5 version 2.3.1 2023-02-13 17:25:31 +01:00
da94bcb44b version 2.3 2023-02-13 16:55:13 +01:00
ca61c6013e - added help in window About\nchanged About QMessageBox by a window 2023-02-13 16:54:56 +01:00
d681d65d9c version 2.2 2023-02-12 19:11:26 +01:00
65896b087f -corrected bug in localization 2023-02-12 19:11:06 +01:00
3e0bd57029 version 2.1.3 2023-02-12 17:56:12 +01:00
65c0318449 version 2.1.2 2023-02-12 17:50:13 +01:00
a2d9f93ace added icon in system tray 2023-02-12 00:37:50 +01:00
4ead825bad version 2.1.1 2023-02-11 13:42:46 +01:00
f73174216a -corrected bug
- added  warning when selecting a file which is already in download
  queue
2023-02-11 13:40:46 +01:00
15 changed files with 964 additions and 206 deletions

View File

@ -2,4 +2,46 @@
client Rsync - QT5 - KDE client Rsync - QT5 - KDE
#Compilation: # Compilation:
$ qmake
$ make
$ make install
# Lancement
Lancez le programme en cliquant sur l'icone ou en tapant dans un terminal:
$ RsyncUI
# Utilisation
Entrez le nom du serveur et le numéro port dans les champs de saisie dédiés.(par défaut le port est 873)
La liste des services s'affiche dans le cadre services, cliquez sur celui que vous voulez consulter.
La liste des dossiers et des fichiers s'affichent.
Un clic gauche sur un fichier l'ajoute à la file des téléchargements, sur un dossier, ça l'ouvre.
Un clic droit sur un dossier ouvre un menu contextuel permettant de télécharger le dossier entier.
Une notification s'affiche lors du début, de la fin, et lorsque l'on stoppe un téléchargement.
Le gadget de fermeture ferme la fenêtre mais ne quitte pas l'application, pour afficher à nouveau la fenêtre, cliquez sur l'icône dans la boite à miniatures.
## File de téléchargement
Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmation apparait.
## Barre d'outils
1er icône: Changer le dossier de destination
Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur.
2ème icône: Paramètres de l'application
- Limite de bande passante
Permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po.
Si la valeur est 0 alors pas de limite de la vitesse de téléchargement.
- Affichage de la barre d'outils
Permet de choisir le style d'affichage des icônes de la barre d'outils
- Enregistrement automatique
Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut)
3ème icône: À propos
Affiche les propriétés de l'application.
4ème icône: À propos de QT
5 ème icône: Quitter
Permet de quitter le programme.

View File

@ -27,7 +27,9 @@ HEADERS += \
tools.h tools.h
FORMS += \ FORMS += \
about.ui \
configuration.ui \ configuration.ui \
login.ui \
mainwindow.ui mainwindow.ui
TRANSLATIONS += \ TRANSLATIONS += \

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.14.2, 2023-02-11T01:13:28. --> <!-- Written by QtCreator 4.14.2, 2023-03-01T13:05:08. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
@ -141,7 +141,7 @@
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">true</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
@ -183,7 +183,7 @@
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">true</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">

View File

@ -2,7 +2,7 @@
Name: rsyncui Name: rsyncui
Summary: Client for rsync server Summary: Client for rsync server
Version: 2.1 Version: 2.6.1
Release: %mkrel 1 Release: %mkrel 1
License: GPLv3 License: GPLv3
Group: Networking/Remote access Group: Networking/Remote access

View File

@ -66,6 +66,34 @@
<translation>Enregistrement automatique de la file d&apos;enregistrement</translation> <translation>Enregistrement automatique de la file d&apos;enregistrement</translation>
</message> </message>
</context> </context>
<context>
<name>LoginDialog</name>
<message>
<location filename="login.ui" line="17"/>
<source>RsyncUI request</source>
<translation>Requête RsyncUI</translation>
</message>
<message>
<location filename="login.ui" line="51"/>
<source>Login name</source>
<translation>Identifiant</translation>
</message>
<message>
<location filename="login.ui" line="79"/>
<source>Enter login</source>
<translation>Entrez votre identifiant</translation>
</message>
<message>
<location filename="login.ui" line="86"/>
<source>Password</source>
<translation>Mot de passe</translation>
</message>
<message>
<location filename="login.ui" line="102"/>
<source>Enter password</source>
<translation>Entrez votre mot de passe</translation>
</message>
</context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
@ -74,266 +102,361 @@
<translation>Fenêtre principale</translation> <translation>Fenêtre principale</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="83"/> <location filename="mainwindow.ui" line="87"/>
<source>Server</source> <source>Server</source>
<oldsource>Serveur</oldsource> <oldsource>Serveur</oldsource>
<translation>Serveur</translation> <translation>Serveur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="105"/> <location filename="mainwindow.ui" line="109"/>
<source>Enter server&apos;s URL</source> <source>Enter server&apos;s URL</source>
<translation>Entrez l&apos;adresse du serveur</translation> <translation>Entrez l&apos;adresse du serveur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="121"/> <location filename="mainwindow.ui" line="125"/>
<source>Port</source> <source>Port</source>
<translation>Port</translation> <translation>Port</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="149"/> <location filename="mainwindow.ui" line="153"/>
<source>Enter rsync port on server</source> <source>Enter rsync port on server</source>
<translation>Entrez le port du serveur rsync</translation> <translation>Entrez le port du serveur rsync</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="186"/> <location filename="mainwindow.ui" line="190"/>
<source>Press button to connect to rsync server</source> <source>Press button to connect to rsync server</source>
<extracomment>Connect to server</extracomment> <extracomment>Connect to server</extracomment>
<translation>Cliquez pour se connecter au serveur rsync</translation> <translation>Cliquez pour se connecter au serveur rsync</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="192"/> <location filename="mainwindow.ui" line="196"/>
<source>Connection</source> <source>Connection</source>
<translation>Connexion</translation> <translation>Connexion</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="195"/> <location filename="mainwindow.ui" line="199"/>
<source>Return</source> <source>Return</source>
<translation>Retour</translation> <translation>Retour</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="221"/> <location filename="mainwindow.ui" line="225"/>
<source>Click to view the list of files of this folder</source> <source>Click to view the list of files of this folder</source>
<translation>Cliquez pour afficher la liste des documents</translation> <translation>Cliquez pour afficher la liste des documents</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="256"/> <location filename="mainwindow.ui" line="260"/>
<source>Click to add to download queue</source> <source>Click to add to download queue</source>
<translation>Cliquez pour ajouter à la file de téléchargement</translation> <translation>Cliquez pour ajouter à la file de téléchargement</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="334"/> <location filename="mainwindow.ui" line="338"/>
<source>Click on file to stop downloading</source> <source>Click on file to stop downloading</source>
<translation>Cliquez sur le document pour arrêter le téléchargement et l&apos;enlever de la file</translation> <translation>Cliquez sur le document pour arrêter le téléchargement et l&apos;enlever de la file</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="357"/> <location filename="mainwindow.ui" line="364"/>
<source>%p%</source> <source>%p%</source>
<extracomment>Downloading</extracomment> <extracomment>Downloading</extracomment>
<translation>Téléchargement</translation> <translation>Téléchargement</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="368"/> <location filename="mainwindow.ui" line="375"/>
<source>toolBar</source> <source>toolBar</source>
<translation>Barre d&apos;outils</translation> <translation>Barre d&apos;outils</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="440"/> <location filename="mainwindow.ui" line="448"/>
<source>Download</source> <source>Download</source>
<translation>Télécharger</translation> <translation>Télécharger</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="443"/> <location filename="mainwindow.ui" line="451"/>
<source>Click on menu button to download the entire folder</source> <source>Click on menu button to download the entire folder</source>
<translation>Cliquer sur le bouton droit de la souris pour télécharger le dossier entier</translation> <translation>Cliquer sur le bouton droit de la souris pour télécharger le dossier entier</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="405"/> <location filename="mainwindow.ui" line="460"/>
<location filename="mainwindow.ui" line="408"/> <source>Exit</source>
<translation>Quitter</translation>
</message>
<message>
<location filename="mainwindow.ui" line="463"/>
<source>Terminate the program</source>
<translation>Terminer le programme</translation>
</message>
<message>
<location filename="mainwindow.ui" line="466"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
<location filename="mainwindow.ui" line="413"/>
<location filename="mainwindow.ui" line="416"/>
<source>Change save folder</source> <source>Change save folder</source>
<translation>Changer le dossier de destination</translation> <translation>Changer le dossier de destination</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="417"/> <location filename="mainwindow.ui" line="425"/>
<source>About</source> <source>About</source>
<translation>À propos</translation> <translation>À propos</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="426"/> <location filename="mainwindow.ui" line="434"/>
<source>About Qt</source> <source>About Qt</source>
<translation>À propos de Qt</translation> <translation>À propos de Qt</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="435"/> <location filename="mainwindow.ui" line="443"/>
<source>Settings</source> <source>Settings</source>
<translation>Paramètres</translation> <translation>Paramètres</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="90"/> <location filename="mainwindow.cpp" line="107"/>
<source>KB</source> <source>KB</source>
<translation>Ko</translation> <translation>Ko</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="90"/> <location filename="mainwindow.cpp" line="107"/>
<source>MB</source> <source>MB</source>
<translation>Mo</translation> <translation>Mo</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="90"/> <location filename="mainwindow.cpp" line="107"/>
<source>GB</source> <source>GB</source>
<translation>Go</translation> <translation>Go</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="90"/> <location filename="mainwindow.cpp" line="107"/>
<source>TB</source> <source>TB</source>
<translation>To</translation> <translation>To</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="90"/> <location filename="mainwindow.cpp" line="107"/>
<source>PB</source> <source>PB</source>
<translation>Po</translation> <translation>Po</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="50"/> <location filename="mainwindow.cpp" line="61"/>
<source>Client for rsync server <source>You click on file to enqueue it, and RyncUI Download one file a time</source>
<oldsource>Client for rsync server&lt;br&gt;&lt;br&gt;You click on file to enqueue it, and RyncUI Download one file a time</oldsource>
<translation>&lt;h3&gt;Utilisation&lt;/h3&gt;
Entrez le nom du serveur et le numéro du port dans les champs de saisie dédiés.(par défaut le port est 873)
La liste des services s&apos;affiche dans le cadre services, cliquez sur celui que vous voulez consulter.
La liste des dossiers et des fichiers s&apos;affichent.
Un clic gauche sur un fichier l&apos;ajoute à la file des téléchargements, sur un dossier, ça l&apos;ouvre.
Un clic droit sur un dossier ouvre un menu contextuel permettant de télécharger le dossier entier.
Une notification s&apos;affiche lors du début, de la fin, et lorsque l&apos;on stoppe un téléchargement.
Le gadget de fermeture ferme la fenêtre mais ne quitte pas l&apos;application, pour afficher à nouveau la fenêtre, cliquez sur l&apos;icône dans la boite à miniatures.
You click on file to enqueue it, and RyncUI Download one file a time</source> &lt;h3&gt;File de téléchargement&lt;/h3&gt;
<translation>Client pour serveur rsync Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmation apparait.
Cliquez sur un fichier pour l&apos;ajouter dans la file de téléchargement</translation> &lt;h3&gt;Barre d&apos;outils&lt;/h3&gt;
&lt;b&gt;1er icône: Changer le dossier de destination&lt;/b&gt;&lt;br&gt;
Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur.&lt;br&gt;
&lt;b&gt;2ème icône: Paramètres de l&apos;application&lt;/b&gt;&lt;br&gt;
Limite de bande passante: permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po.&lt;br&gt;
Si la valeur est 0 alors pas de limite de la vitesse de téléchargement.&lt;br&gt;
- Affichage de la barre d&apos;outils&lt;br&gt;
Permet de choisir le style d&apos;affichage des icônes de la barre d&apos;outils&lt;br&gt;
- Enregistrement automatique&lt;br&gt;
Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut)&lt;br&gt;
&lt;b&gt;3ème icône: À propos&lt;/b&gt;&lt;br&gt;
affiche les propriétés de l&apos;application, ainsi que l&apos;aide.&lt;br&gt;
&lt;b&gt;4ème icône: À propos de QT&lt;/b&gt;&lt;br&gt;
affiche les propriétés de QT&lt;br&gt;
&lt;b&gt;5ème icône: Quitter&lt;/b&gt;&lt;br&gt;
Permet de quitter le programme</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="62"/> <source>&lt;h2&gt;Client for rsync server&lt;2&gt;&lt;br&gt;&lt;br&gt;</source>
<translation type="vanished">&lt;h2&gt;Client pour serveur rsync&lt;2&gt;&lt;br&gt;&lt;br&gt;éaa</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="78"/>
<source>Path</source> <source>Path</source>
<translation>Chemin</translation> <translation>Chemin</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="62"/> <location filename="mainwindow.cpp" line="78"/>
<source>Size</source> <source>Size</source>
<translation>Taille</translation> <translation>Taille</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="62"/> <location filename="mainwindow.cpp" line="78"/>
<source>Type</source> <source>Type</source>
<translation>Type</translation> <translation>Type</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="97"/> <location filename="mainwindow.cpp" line="122"/>
<source>A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared</source> <source>A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared</source>
<translation>Une liste de téléchargement existe, voulez-vous utiliser cette liste ? si non, elle sera effacée</translation> <translation>Une liste de téléchargement existe, voulez-vous utiliser cette liste ? si non, elle sera effacée</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="138"/> <location filename="mainwindow.cpp" line="151"/>
<source>&amp;Quit</source>
<translation>&amp;Quitter</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="208"/>
<source>Clicking Save button, You can save the list of downloads <source>Clicking Save button, You can save the list of downloads
</source> </source>
<translation>Vous pouvez enregistrer la liste des téléchargements en cliquant sur &quot;enregister&quot; <translation>Vous pouvez enregistrer la liste des téléchargements en cliquant sur &quot;enregister&quot;
</translation> </translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="143"/> <location filename="mainwindow.cpp" line="214"/>
<source>Exiting will stop downloading, and will clear the download queue. <source>Exiting will stop downloading, and will clear the download queue.
Do you want to exit ?</source> Do you want to exit ?</source>
<translation>Si vous sortez, les téléchargements seront arrêter. <translation>Si vous sortez, les téléchargements seront arrêter.
Voulez-vous vraiment sortir ?</translation> Voulez-vous vraiment sortir ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="425"/> <location filename="mainwindow.cpp" line="252"/>
<source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
<translation>Le programme continue dans la boîte à miniatures. Pour quitter le programme cliquez sur l&apos;icône &lt;b&gt;Quitter&lt;/b&gt; ou dans les menu contextuel.</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="492"/>
<source>The processus does&apos;nt respond: </source>
<translation>Le processus ne répond pas: </translation>
</message>
<message>
<location filename="mainwindow.cpp" line="578"/>
<source>server does not exists</source> <source>server does not exists</source>
<translation>Le serveur n&apos;existe pas</translation> <translation>Le serveur n&apos;existe pas</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="452"/> <location filename="mainwindow.cpp" line="606"/>
<location filename="mainwindow.cpp" line="472"/> <location filename="mainwindow.cpp" line="626"/>
<source>Dir</source> <source>Dir</source>
<translation>dossier</translation> <translation>dossier</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="456"/> <location filename="mainwindow.cpp" line="610"/>
<location filename="mainwindow.cpp" line="553"/> <location filename="mainwindow.cpp" line="740"/>
<source>File</source> <source>File</source>
<translation>Doc</translation> <translation>Doc</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="534"/> <location filename="mainwindow.cpp" line="751"/>
<source>File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory</source>
<translation>Le document est déjà partiellement téléchargé. Voulez vous continuer le téléchargemnt ? Si non, il sera supprimer du dossier de destination</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="768"/>
<source>File is already downloaded. Do you want to reload it ? The old file will be deleted</source> <source>File is already downloaded. Do you want to reload it ? The old file will be deleted</source>
<translation>Le document est déjà téléchargé. Voulez-vous le télécharger à nouveau ? L&apos;ancien fichier sera effacé</translation> <translation>Le document est déjà téléchargé. Voulez-vous le télécharger à nouveau ? L&apos;ancien fichier sera effacé</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="615"/> <location filename="mainwindow.cpp" line="805"/>
<source>File is already downloading</source>
<translation>Le document est déjà en téléchargement</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="830"/>
<source>Starting downloading
</source>
<translation>Démarrage du téléchargement
</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="845"/>
<source>finished</source>
<translation>Terminé</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="853"/>
<source>Rsync process crashed</source> <source>Rsync process crashed</source>
<translation>Le processus rsync à planté</translation> <translation>Le processus rsync à planté</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="770"/> <location filename="mainwindow.cpp" line="865"/>
<source>stopped by user</source>
<translation>stoppé par l&apos;utilisateur</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="871"/>
<source>Download </source>
<translation>Téléchargement </translation>
</message>
<message>
<location filename="mainwindow.cpp" line="56"/>
<source>Version</source> <source>Version</source>
<translation>Version</translation> <translation>Version</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="771"/> <location filename="mainwindow.cpp" line="55"/>
<source>&lt;h2&gt;Client for rsync server&lt;/h2&gt;</source>
<translation>&lt;h2&gt;Client pour serveur rsync&lt;/h2&gt;</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="57"/>
<source>Licence</source> <source>Licence</source>
<translation>License</translation> <translation>License</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="772"/> <location filename="mainwindow.cpp" line="58"/>
<source>Author</source> <source>Author</source>
<translation>Auteur</translation> <translation>Auteur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="773"/> <location filename="mainwindow.cpp" line="59"/>
<source>EMail</source> <source>EMail</source>
<translation>Courriel</translation> <translation>Courriel</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="774"/> <location filename="mainwindow.cpp" line="60"/>
<source>Source code</source> <source>Source code</source>
<translation>Code source</translation> <translation>Code source</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="797"/> <location filename="mainwindow.cpp" line="1036"/>
<source>Since the save path is linked to service, you need to select a service before you can select a folder</source> <source>Since the save path is linked to service, you need to select a service before you can select a folder</source>
<translation>Vous devez sélectionnez un service pour pouvoir sélectionnez un dossier par défaut</translation> <translation>Vous devez sélectionnez un service pour pouvoir sélectionnez un dossier par défaut</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="802"/> <location filename="mainwindow.cpp" line="1041"/>
<source>Choose folder where to save file</source> <source>Choose folder where to save file</source>
<translation>Choisissez un dossier enregistrer le document</translation> <translation>Choisissez un dossier enregistrer le document</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="688"/> <location filename="mainwindow.cpp" line="932"/>
<source>Do you want to stop downloading and delete this file from download queue ?</source> <source>Do you want to stop downloading and delete this file from download queue ?</source>
<translation>Voulez-vous arrêter le téléchargement et enlever ce fichier de la file de téléchargement ?</translation> <translation>Voulez-vous arrêter le téléchargement et enlever ce fichier de la file de téléchargement ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="702"/> <location filename="mainwindow.cpp" line="946"/>
<source>Do you want to delete this file from download queue ?</source> <source>Do you want to delete this file from download queue ?</source>
<translation>Voulez-vous enlever ce fichier de la file de téléchargement ?</translation> <translation>Voulez-vous enlever ce fichier de la file de téléchargement ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="118"/> <location filename="mainwindow.h" line="137"/>
<source>The process failed to start. Either the invoked program is missing, or you may have insufficient permissions or resources to invoke the program.</source> <source>The process failed to start. Either the invoked program is missing, or you may have insufficient permissions or resources to invoke the program.</source>
<translation>Le processus échoué, soit le programme est manquant, soit vous n&apos;avez pas l&apos;autorisation de l&apos;exécuter.</translation> <translation>Le processus échoué, soit le programme est manquant, soit vous n&apos;avez pas l&apos;autorisation de l&apos;exécuter.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="119"/> <location filename="mainwindow.h" line="138"/>
<source>The process crashed some time after starting successfully.</source> <source>The process crashed some time after starting successfully.</source>
<translation>Le processus à planté après avoir démarré avec succès.</translation> <translation>Le processus à planté après avoir démarré avec succès.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="120"/> <location filename="mainwindow.h" line="139"/>
<source>The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.</source> <source>The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.</source>
<translation>La fonction waitFor...() a dépassé la limite de temps, you pouvez essayer de la relancer.</translation> <translation>La fonction waitFor...() a dépassé la limite de temps, you pouvez essayer de la relancer.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="121"/> <location filename="mainwindow.h" line="140"/>
<source>An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.</source> <source>An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.</source>
<translation>Une erreur est survenue lors de l&apos;envoi des données vers le processus. Le processus est peut être arrté ou il a fermé son canal d&apos;entrée.</translation> <translation>Une erreur est survenue lors de l&apos;envoi des données vers le processus. Le processus est peut être arrté ou il a fermé son canal d&apos;entrée.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="122"/> <location filename="mainwindow.h" line="141"/>
<source>An error occurred when attempting to read from the process. For example, the process may not be running.</source> <source>An error occurred when attempting to read from the process. For example, the process may not be running.</source>
<translation>Une erreur est survenue lors de la lecturee de données, le processus est probablement arrêté.</translation> <translation>Une erreur est survenue lors de la lecturee de données, le processus est probablement arrêté.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="123"/> <location filename="mainwindow.h" line="142"/>
<source>An unknown error occurred. This is the default return value of error().</source> <source>An unknown error occurred. This is the default return value of error().</source>
<translation>Une erreur inconnue est survenue. C&apos;est la valeur de retour par défaut de error().</translation> <translation>Une erreur inconnue est survenue. C&apos;est la valeur de retour par défaut de error().</translation>
</message> </message>
@ -426,4 +549,12 @@ Voulez-vous vraiment sortir ?</translation>
<translation>Transfert partiel à la disparition des fichiers source. Des fichiers source ont disparu avec d&apos;avoir é transférés.</translation> <translation>Transfert partiel à la disparition des fichiers source. Des fichiers source ont disparu avec d&apos;avoir é transférés.</translation>
</message> </message>
</context> </context>
<context>
<name>windowAbout</name>
<message>
<location filename="about.ui" line="23"/>
<source>About RsyncUI</source>
<translation>À propos de RsyncUI</translation>
</message>
</context>
</TS> </TS>

57
about.ui Normal file
View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>windowAbout</class>
<widget class="QWidget" name="windowAbout">
<property name="windowModality">
<enum>Qt::NonModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>387</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>About RsyncUI</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>../../../../usr/share/icons/RsyncUI.png</normaloff>../../../../usr/share/icons/RsyncUI.png</iconset>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetNoConstraint</enum>
</property>
<item>
<widget class="QTextEdit" name="TextAbout">
<property name="autoFormatting">
<set>QTextEdit::AutoAll</set>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -27,7 +27,14 @@ downloadFile::downloadFile()
//Slot activated when download is cancelled //Slot activated when download is cancelled
void MainWindow::cancelled(QProcess * process) void MainWindow::cancelled(QProcess * process)
{ {
bool n = 0;
process->terminate(); process->terminate();
n = process->waitForFinished(30000);
if (n == false)
{
process->close();
}
} }
// launch a rsync processus downloading a file // launch a rsync processus downloading a file
@ -35,18 +42,26 @@ void MainWindow::download()
{ {
QString cmd; QString cmd;
QStringList param; QStringList param;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
this->downloading.process = new QProcess(this);
if (!this->downloading.user.isEmpty())
{
this->downloading.server.prepend(this->connexion.user + "@");
env.insert("RSYNC_PASSWORD", this->downloading.password); // Add an environment variable
this->downloading.process->setProcessEnvironment(env);
}
// Populating array with command and parameters for popen2 // Populating array with command and parameters for popen2
cmd = "rsync"; cmd = "rsync";
if (this->connexion.bandwidthLimit != 0) if (this->connexion.bandwidthLimit != 0)
{ {
param << "--bwlimit=" + QString::number(this->connexion.bandwidthLimit) + bwUnitChar[this->connexion.bandwidthLimitUnit]; param << "--bwlimit=" + QString::number(this->connexion.bandwidthLimit) + bwUnitChar[this->connexion.bandwidthLimitUnit];
} }
param << "--port=" + QString::number(this->connexion.port); param << "--port=" + QString::number(this->downloading.port);
param << "-aXP"; param << "-aXP";
param << this->downloading.server + "::" + this->downloading.service + "/" + this->downloading.path << this->downloading.savePath + "/"; param << this->downloading.server + "::" + this->downloading.service + "/" + this->downloading.path << this->downloading.savePath + "/";
this->downloading.process = new QProcess(this);
connect(this->downloading.process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(downloadFinished(int, QProcess::ExitStatus))); connect(this->downloading.process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(downloadFinished(int, QProcess::ExitStatus)));
//connect(this->downloading.process, SIGNAL(errorOccurred(QProcess::ProcessError error)), this, SLOT(downloadProcessError(QProcess::ProcessError error))); //connect(this->downloading.process, SIGNAL(errorOccurred(QProcess::ProcessError error)), this, SLOT(downloadProcessError(QProcess::ProcessError error)));
@ -62,26 +77,50 @@ void MainWindow::readRsyncOutput()
bool flag = false; bool flag = false;
int value; int value;
int pos; int pos;
static QString dlSpeed;
QStringList list;
static QString filename;
int i;
int listSize;
while(!flag) while(!flag)
{ {
list.clear();
line = QString::fromUtf8(this->downloading.process->readLine()); line = QString::fromUtf8(this->downloading.process->readLine());
if (line.isEmpty()) if (line.isEmpty())
{ {
flag = true; flag = true;
break; break;
} }else
pos = line.indexOf("%");
if (pos != -1)
{ {
line.resize(pos); pos = line.indexOf("%");
pos = line.lastIndexOf(' ');
if (pos != -1) if (pos != -1)
{ {
line.remove(0, pos); line = line.simplified();
value = line.toInt(); list = line.split(" ");
// sending progress to Main window listSize = list.count() / 4;
emit progressSignal(value); for (i = 0; i < listSize; i++)
{
value = list.at(i *4 + 1).chopped(1).toInt();
dlSpeed = list.at(i * 4 + 2);
/*line.resize(pos);
pos = line.lastIndexOf(' ');
if (pos != -1)
{
line.remove(0, pos);
value = line.toInt();*/
// sending progress to Main window
emit progressSignal(value);
emit fileName(filename + " %p%" + "\t " + dlSpeed);
}
}else
{
if (!line.contains("receiving"))
{
filename = line.remove(QChar('\n'), Qt::CaseInsensitive);
emit fileName(filename + " %p%\t " + dlSpeed);
}
} }
} }
} }

144
login.ui Normal file
View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LoginDialog</class>
<widget class="QDialog" name="LoginDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>194</height>
</rect>
</property>
<property name="windowTitle">
<string>RsyncUI request</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<widget class="QDialogButtonBox" name="loginBox">
<property name="geometry">
<rect>
<x>50</x>
<y>150</y>
<width>341</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>381</width>
<height>121</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Login name</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="loginEdit">
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="text">
<string/>
</property>
<property name="maxLength">
<number>32767</number>
</property>
<property name="placeholderText">
<string>Enter login</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="passwordEdit">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Enter password</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>loginBox</sender>
<signal>accepted()</signal>
<receiver>LoginDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>loginBox</sender>
<signal>rejected()</signal>
<receiver>LoginDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -12,13 +12,17 @@ int main(int argc, char *argv[])
// Initialization of localization // Initialization of localization
QLocale localeName = QLocale::system(); QLocale localeName = QLocale::system();
QString localeFile = "/usr/share/locale/" + localeName.name() + "/LC_MESSAGES/RsyncUI_" + localeName.name() + ".qm"; QString localeDir = "/usr/share/locale/" + localeName.name() + "/LC_MESSAGES/"; //RsyncUI_" + localeName.name() + ".qm";
if (myappTranslator.load(localeFile)) QString localeFilename = QCoreApplication::applicationName() + "_" + localeName.name();
QLocale locale = QLocale();
if (myappTranslator.load(localeFilename, localeDir))
{ {
a.installTranslator(&myappTranslator); a.installTranslator(&myappTranslator);
} }
MainWindow w; MainWindow w;
w.show(); w.show();
w.init();
return a.exec(); return a.exec();
} }

View File

@ -33,8 +33,6 @@ MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui::MainWindow) , ui(new Ui::MainWindow)
{ {
QAbstractButton * reply;
QMessageBox msgBox;
ui->setupUi(this); ui->setupUi(this);
QCoreApplication::setOrganizationName("RsyncUI"); QCoreApplication::setOrganizationName("RsyncUI");
@ -46,32 +44,39 @@ MainWindow::MainWindow(QWidget *parent)
// init configuration window // init configuration window
config.setupUi(&Configuration); config.setupUi(&Configuration);
// init of About // init about window
this->about.description = tr("Client for rsync server\n\nYou click on file to enqueue it, and RyncUI Download one file a time"); AboutW.setupUi(&aboutDialog);
//init login dialog
loginD.setupUi(&loginDialog);
loginD.loginEdit->setFocus();
// text of About
QString aboutText = tr("<h2>Client for rsync server</h2>") +
"<b>" + tr("Version") + ": " + this->about.version + "</b><br>" +
"<b>" + tr("Licence") + ": " + this->about.licence + "</b><br>" +
"<b>" + tr("Author") + ": " + this->about.author + "</b><br>" +
"<b>" + tr("EMail") + ": " + this->about.email + "</b><br>" +
"<b>" + tr("Source code") + ": " + this->about.git + "</b><br>" +
tr("You click on file to enqueue it, and RyncUI Download one file a time");
AboutW.TextAbout->setHtml(aboutText);
// connectors // connectors
connect(this, &MainWindow::fileName, ui->progressBar, &QProgressBar::setFormat);
connect(this, &MainWindow::progressSignal, ui->progressBar, &QProgressBar::setValue); connect(this, &MainWindow::progressSignal, ui->progressBar, &QProgressBar::setValue);
//connect(this, &MainWindow::speed, ui->progressBar, &MainWindow::setDlSpeed);
//connect(this, &MainWindow::errorSignal, this, &MainWindow::downloadingErrorSlot); //connect(this, &MainWindow::errorSignal, this, &MainWindow::downloadingErrorSlot);
connect(this, &MainWindow::stopDownloading, this, &MainWindow::cancelled); connect(this, &MainWindow::stopDownloading, this, &MainWindow::cancelled);
connect(config.buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted())); connect(config.buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted()));
connect(config.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::on_comboBox_currentIndexChanged); connect(config.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::on_comboBox_currentIndexChanged);
connect(loginD.loginBox, SIGNAL(accepted()), this, SLOT(on_loginBox_accepted()));
// init of widgets // init of widgets
ui->ktreewidgetsearchline->setTreeWidget(ui->treeWidget); // attach search widget to treewidget ui->ktreewidgetsearchline->setTreeWidget(ui->treeWidget); // attach search widget to treewidget
ui->ktreewidgetsearchline->setCaseSensitivity(Qt::CaseInsensitive); // and set it case insensitive ui->ktreewidgetsearchline->setCaseSensitivity(Qt::CaseInsensitive); // and set it case insensitive
ui->treeWidget->setHeaderLabels({tr("Path"), tr("Type"), tr("Size")} ); // set header of columns of tree widget ui->treeWidget->setHeaderLabels({tr("Path"), tr("Type"), tr("Size")} ); // set header of columns of tree widget
// if last server exists in settings
if (this->settings.contains("connexion/lastServer"))
{
// set window to precedent server/port configuration
ui->portEdit->setText(this->settings.value("connexion/port").toString());
ui->khistorycombobox->setCurrentText(this->settings.value("connexion/lastServer").toString());
}else
{
ui->portEdit->text() = QString::number(this->connexion.port);
ui->khistorycombobox->clear();
}
// setting arrowcursor for treeWidget, listWidget and listDownload to arrow // setting arrowcursor for treeWidget, listWidget and listDownload to arrow
ui->treeWidget->setCursor(Qt::ArrowCursor); ui->treeWidget->setCursor(Qt::ArrowCursor);
@ -83,12 +88,32 @@ MainWindow::MainWindow(QWidget *parent)
loadSettings(); loadSettings();
// if last server exists in settings
if (this->settings.contains("connexion/lastServer"))
{
// set window to precedent server/port configuration
ui->portEdit->setText(this->settings.value("connexion/port").toString());
ui->khistorycombobox->setCurrentText(this->settings.value("connexion/lastServer").toString());
}else
{
ui->portEdit->setText(QString::number(this->connexion.port));
ui->khistorycombobox->clear();
}
//setting configuration window //setting configuration window
config.comboBox->setCurrentIndex(ui->toolBar->toolButtonStyle()); // setting combobox to saved settings config.comboBox->setCurrentIndex(ui->toolBar->toolButtonStyle()); // setting combobox to saved settings
//setting unit of bandwidth limit //setting unit of bandwidth limit
config.UnitCombobox->addItems({tr("KB"), tr("MB"), tr("GB"), tr("TB"), tr("PB")}); config.UnitCombobox->addItems({tr("KB"), tr("MB"), tr("GB"), tr("TB"), tr("PB")});
initSystemTrayIcon();
}
void MainWindow::init()
{
QAbstractButton * reply;
QMessageBox msgBox;
//if exists list of donwloads in saved settings //if exists list of donwloads in saved settings
if (this->settings.value("Downloads/rows").toInt() != 0) if (this->settings.value("Downloads/rows").toInt() != 0)
{ {
@ -113,13 +138,58 @@ MainWindow::MainWindow(QWidget *parent)
populateList(); populateList();
} }
void MainWindow::initSystemTrayIcon()
{
QMenu *trayIconMenu;
QAction * quitAction;
QIcon icon;
icon.addFile(this->icon);
this->trayIcon = new QSystemTrayIcon;
this->trayIcon->setIcon(icon);
quitAction = new QAction(tr("&Quit"), this);
connect(quitAction, &QAction::triggered, this, &MainWindow::quitApp);
trayIconMenu = new QMenu(this);
trayIconMenu->addAction(quitAction);
trayIcon->setContextMenu(trayIconMenu);
connect(this->trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_trayIcon_clicked(QSystemTrayIcon::ActivationReason)));
this->trayIcon->show();
}
void MainWindow::on_trayIcon_clicked(QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::Trigger)
{
if (this->isHidden())
{
this->show();
}else
{
this->hide();
}
}
}
void MainWindow::hideWindow()
{
this->hide();
}
void MainWindow::showWindow()
{
this->show();
}
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui; delete ui;
QCoreApplication::quit();
} }
// Close window has been clicked void MainWindow::quitApp()
void MainWindow::closeEvent (QCloseEvent *event)
{ {
QMessageBox::StandardButton reply; QMessageBox::StandardButton reply;
QMessageBox::StandardButtons param; QMessageBox::StandardButtons param;
@ -137,28 +207,71 @@ void MainWindow::closeEvent (QCloseEvent *event)
param |= QMessageBox::Save; param |= QMessageBox::Save;
displayText = tr("Clicking Save button, You can save the list of downloads\n"); displayText = tr("Clicking Save button, You can save the list of downloads\n");
} }
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", "RsyncUI",
tr("Exiting will stop downloading, and will clear the download queue.\nDo you want to exit ?") + displayText, tr("Exiting will stop downloading, and will clear the download queue.\nDo you want to exit ?") + displayText,
param, param,
QMessageBox::No); QMessageBox::No);
this->downloading.quit = true;
if(reply == QMessageBox::Yes)
{
if (this->downloading.process->state() != QProcess::NotRunning)
{
// emission of signal to downloading thread and stopping
emit (stopDownloading(this->downloading.process));
}
}else if (reply == QMessageBox::Save)
{
if (config.autosaveCheckbox->checkState() == Qt::Unchecked)
{
if (reply == QMessageBox::No) //saveDownloadList();
emit (stopDownloading(this->downloading.process));
}
}else if (reply == QMessageBox::No)
{ {
// continuing
event->ignore();
return; return;
}else if(reply == QMessageBox::Yes)
{
// emission of signal to downloading thread and stopping
emit (stopDownloading(this->downloading.process));
}else
{
saveDownloadList();
} }
} }
event->accept(); QCoreApplication::quit();
}
// Close window has been clicked
void MainWindow::closeEvent (QCloseEvent *event)
{
QMessageBox msgBox;
QCheckBox *cb = new QCheckBox("Don't show this again ?");
if (!event->spontaneous() || !isVisible())
return;
if (trayIcon->isVisible() and this->settings.value("CloseCheckbox").toBool() == false)
{
msgBox.setWindowTitle("RsyncUI");
msgBox.setInformativeText(tr("The program will keep running in the "
"system tray. To terminate the program, "
"choose <b>Quit</b> in the context menu "
"of the system tray entry."));
msgBox.addButton(QMessageBox::Ok);
//msgBox.addButton(QMessageBox::No);
// msgBox.setDefaultButton(QMessageBox::Yes);
msgBox.setCheckBox(cb);
msgBox.exec();
msgBox.clickedButton();
// if response is yes then loading list
if (cb->isChecked())
{
this->settings.setValue("CloseCheckbox", true);
}
hide();
//event->accept();
event->ignore();
}
} }
// Populate treeview with list of files // Populate treeview with list of files
@ -176,9 +289,9 @@ void MainWindow::populateTree(QTreeWidgetItem * parent)
// validating server's address // validating server's address
if (validateServer(this->connexion.server)) if (validateServer(this->connexion.server))
{ {
// server is validated // server is validated, scanning directory
path = ui->listWidget->currentItem()->text().section('\n', 0, 0) + "/"; path = ui->listWidget->currentItem()->text().section('\n', 0, 0) + "/";
scanDir(this->connexion.server, this->connexion.port, parent, path); scanDir(this->connexion.server, this->connexion.port, parent, path);
} }
// Restoring cursor // Restoring cursor
QGuiApplication::restoreOverrideCursor(); QGuiApplication::restoreOverrideCursor();
@ -284,69 +397,109 @@ void MainWindow::listServices()
} }
// verifying error code // verifying error code
testRsyncReturn(myProcess); testRsyncReturn(this, myProcess);
myProcess->close();
} }
// connect to rsync server to get list of files // connect to rsync server to get list of files
void MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QString path) bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QString path)
{ {
QString cmd; QString cmd;
QStringList param; QStringList param;
QString line; QString line;
QString size; QString size;
QString filename; QString filename;
QTreeWidgetItem * item;
QProcess * myProcess; QProcess * myProcess;
bool isDir = false; bool isDir = false;
bool flag = false; bool flag = false;
bool readOk = false;
cmd = "rsync"; int nChild = 0;
param << "--contimeout=10" << "--port=" + QString::number(portN) << server + "::" + path; QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->start(cmd, param);
// waiting for response of the server with a timeout of 10 seconds if (parent != nullptr)
while(myProcess->waitForReadyRead(100000))
{ {
while (!flag) nChild = parent->childCount();
{
line = QString::fromUtf8(myProcess->readLine());
// line empty then buffer is empty so returning to wait new datas
if (line.isEmpty())
{
flag = true;
break;
}
// extracting name, size and is dir/file
line = line.simplified();
size = line.section(" ", 1, 1);
filename = line.section(" ", 4);
if (filename != '.')
{
if (line[0] == "d")
{
isDir = true;
}else
{
isDir = false;
}
if (parent != NULL)
{
//adding item to tree
item = addTreeChild(parent, filename, size, isDir);
}else
{
//adding item to tree (as directory)
item = addTreeRoot(filename, size, isDir);
}
}
}
flag = false;
} }
// buffer empty go to waiting new datas if (nChild == 0)
testRsyncReturn(myProcess); {
if (!this->connexion.user.isEmpty())
{
server.prepend(this->connexion.user + "@");
env.insert("RSYNC_PASSWORD", this->connexion.password); // Add an environment variable
}else
{
server.prepend("anonymous@");
env.insert("RSYNC_PASSWORD", "anonymous"); // Add an environment variable
}
myProcess->setProcessEnvironment(env);
cmd = "rsync";
param << "--contimeout=10" << "--port=" + QString::number(portN) << server + "::" + path;
myProcess->start(cmd, param);
// waiting for response of the server with a timeout of 10 seconds
do
{
readOk = myProcess->waitForReadyRead(10000);
if (readOk)
{
while (!flag)
{
line = QString::fromUtf8(myProcess->readLine());
// line empty then buffer is empty so returning to wait new datas
if (line.isEmpty())
{
flag = true;
break;
}
// extracting name, size and is dir/file
line = line.simplified();
size = line.section(" ", 1, 1);
filename = line.section(" ", 4);
if (filename != '.')
{
if (line[0] == "d")
{
isDir = true;
}else
{
isDir = false;
}
if (parent != NULL)
{
//adding item to tree
addTreeChild(parent, filename, size, isDir);
}else
{
//adding item to tree (as directory)
addTreeRoot(filename, size, isDir);
}
}
}
flag = false;
}else
{
if (myProcess->state() == QProcess::Running)
{
if (myProcess->waitForFinished(10000) == 0)
{
QMessageBox::warning(
this,
"RsyncUI",
tr("The processus does'nt respond: ") + myProcess->errorString());
}
}
}
}while(readOk);
// buffer empty go to waiting new datas
testRsyncReturn(this, myProcess);
myProcess->close();
}
return 0;
} }
// Verify if server address is IP address // Verify if server address is IP address
@ -425,6 +578,7 @@ bool MainWindow::validateServer(QString server)
tr("server does not exists" ) tr("server does not exists" )
); );
} }
myProcess->close();
return flag; return flag;
} }
@ -473,7 +627,7 @@ QTreeWidgetItem * MainWindow::addTreeChild(QTreeWidgetItem *parent, QString name
}else }else
{ {
// item is a file // item is a file
treeItem->setText(1,("File")); treeItem->setText(1,tr("File"));
} }
treeItem->setText(0, name); treeItem->setText(0, name);
treeItem->setText(2, fileSize); treeItem->setText(2, fileSize);
@ -487,8 +641,11 @@ QTreeWidgetItem * MainWindow::addTreeChild(QTreeWidgetItem *parent, QString name
void MainWindow::on_listWidget_clicked() void MainWindow::on_listWidget_clicked()
{ {
QString str; QString str;
QStringList logins;
this->connexion.service = ui->listWidget->currentItem()->text().section("\n", 0 ,0); this->rescan = true;
this->connexion.user = nullptr;
this->connexion.password = nullptr; this->connexion.service = ui->listWidget->currentItem()->text().section("\n", 0 ,0);
str = "Folder/" + this->connexion.server + "/" + this->connexion.service; str = "Folder/" + this->connexion.server + "/" + this->connexion.service;
// if service exists in settings for this server // if service exists in settings for this server
if (this->settings.contains(str)) if (this->settings.contains(str))
@ -496,9 +653,50 @@ void MainWindow::on_listWidget_clicked()
// setting savePath from settings // setting savePath from settings
this->downloading.savePath = this->settings.value(str).toString(); this->downloading.savePath = this->settings.value(str).toString();
} }
this->settings.beginGroup("Passwords/" + this->connexion.server + "/" + this->connexion.service);
logins = this->settings.allKeys();
//TODO choose login
if (logins.count() != 0)
{
this->connexion.user = logins[0];
this->connexion.password = this->settings.value(logins[0]).toString();
}
this->settings.endGroup();
populateTree(NULL); populateTree(NULL);
} }
// get password and user login
// if object = false ==> searching from connexion object
// else searching from downloading object
bool MainWindow::getUserPassword(bool object = false)
{
QStringList logins;
bool returnValue;
if (object == false)
{
this->settings.beginGroup("Passwords/" + this->connexion.server + "/" + this->connexion.service);
}else
{
this->settings.beginGroup("Passwords/" + this->downloading.server + "/" + this->downloading.service);
}
logins = this->settings.allKeys();
//TODO choose login in case of multiples logins
if (logins.count() != 0)
{
this->downloading.user = logins[0];
this->downloading.password = this->settings.value(logins[0]).toString();
returnValue = true;
}else
{
this->downloading.user = nullptr;
this->downloading.password = nullptr;
returnValue = false;
}
this->settings.endGroup();
return returnValue;
}
//Slot activated when a file is clicked in the treeview //Slot activated when a file is clicked in the treeview
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadDir) void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadDir)
{ {
@ -508,11 +706,13 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
QString path; QString path;
QString str; QString str;
QMessageBox::StandardButton reply; QMessageBox::StandardButton reply;
int sizeFromRsync;
itemR = item; itemR = item;
// assembling path from treewidget // assembling path from treewidget
path = item->text(0); path = item->text(0);
sizeFromRsync = item->text(2).remove(',').toUInt();
// exists saving path in settings ? // exists saving path in settings ?
str = "Folder/" + this->connexion.server + "/" + this->connexion.service; str = "Folder/" + this->connexion.server + "/" + this->connexion.service;
@ -524,35 +724,62 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
cout << "no directory selectioned, ignoring download request"; cout << "no directory selectioned, ignoring download request";
return; return;
} }
} }else
if (QFile::exists(this->downloading.savePath + "/" + path))
{ {
reply = QMessageBox::question( this->downloading.savePath = this->settings.value(str).toString();
this,
"RsyncUI",
tr("File is already downloaded. Do you want to reload it ? The old file will be deleted"),
QMessageBox::Yes|QMessageBox::No,
QMessageBox::No);
if (reply == QMessageBox::No)
{
return;
}else
{
QFile::remove(this->downloading.savePath + "/" + path);
}
} }
while(itemR->parent() != NULL) while(itemR->parent() != NULL)
{ {
itemR = itemR->parent(); itemR = itemR->parent();
// concatening parent to path // concatening parent to path
path.prepend(itemR->text(0) + "/"); path.prepend(itemR->text(0) + "/");
}; };
QFileInfo info(this->downloading.savePath + "/" + path);
cout << item->text(1).toStdString() <<endl;
if (item->text(1) == tr("File") or downloadDir == true) if (item->text(1) == tr("File") or downloadDir == true)
{ {
// Item is a file // Item is a file
// searching if file exists in savepath
if (QFile::exists(this->downloading.savePath + "/" + path))
{
if (info.size() < sizeFromRsync)
{
reply = QMessageBox::question(
this,
"RsyncUI",
tr("File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory"),
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
QMessageBox::Cancel);
if (reply == QMessageBox::Cancel)
{
return;
}else if(reply == QMessageBox::No)
{
QFile::remove(this->downloading.savePath + "/" + path);
return;
}
}else
{
reply = QMessageBox::question(
this,
"RsyncUI",
tr("File is already downloaded. Do you want to reload it ? The old file will be deleted"),
QMessageBox::Yes|QMessageBox::No,
QMessageBox::No);
if (reply == QMessageBox::No)
{
return;
}else
{
QFile::remove(this->downloading.savePath + "/" + path);
}
}
}
if(ui->listDownload->findItems(path, Qt::MatchStartsWith).empty()) if(ui->listDownload->findItems(path, Qt::MatchStartsWith).empty())
{ {
// is there a downloading process ? // is there a downloading process ?
@ -561,15 +788,23 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
// no downloading process launching it // no downloading process launching it
this->downloading.path = path; this->downloading.path = path;
this->downloading.server = this->connexion.server; this->downloading.server = this->connexion.server;
this->downloading.port = this->connexion.port;
this->downloading.service = this->connexion.service; this->downloading.service = this->connexion.service;
startDownloading(); startDownloading();
// wit 1 second to process start // wait 1 second to process start
//sleep(1); //sleep(1);
} }
// Adding download in download list // Adding download in download list
str = path + " => " + this->connexion.server + "/" + this->connexion.service; str = path + " => " + this->connexion.server + "/" + this->connexion.service;
ui->listDownload->addItem(str); ui->listDownload->addItem(str);
}else
{
QMessageBox::warning(
this,
"RsyncUI",
tr("File is already downloading" )
);
} }
}else }else
{ {
@ -586,11 +821,14 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
// Launch the thread which download the file // Launch the thread which download the file
void MainWindow::startDownloading() void MainWindow::startDownloading()
{ {
ui->progressBar->setValue(0); ui->progressBar->setValue(0);
ui->progressBar->show(); ui->progressBar->show();
getUserPassword(false);
//QtConcurrent::run(&this->downloadO, &downloadFile::download, this); //QtConcurrent::run(&this->downloadO, &downloadFile::download, this);
download(); this->download();
this->trayIcon->showMessage("RsyncUI", tr("Starting downloading\n") + this->downloading.path, QSystemTrayIcon::Information);
} }
// Slot stopping download // Slot stopping download
@ -605,6 +843,7 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
QString path; QString path;
QString str; QString str;
int pos; int pos;
QString aborted = tr("finished");
// test if process crashed // test if process crashed
if (exitStatus == QProcess::CrashExit) if (exitStatus == QProcess::CrashExit)
@ -622,13 +861,21 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
NULL, NULL,
"RsyncUI", "RsyncUI",
rsyncErrorStrings[exitCode]); rsyncErrorStrings[exitCode]);
}else if (exitCode == 20)
{
aborted = tr("stopped by user");
}else if (exitCode == 5) // password asked
{
loginDialog.show();
} }
this->trayIcon->showMessage("RsyncUI", tr("Download ") + aborted + "\n" + this->downloading.path, QSystemTrayIcon::Information);
// disconnecting signals to slots // disconnecting signals to slots
disconnect(this->downloading.process, 0, 0, 0); disconnect(this->downloading.process, 0, 0, 0);
// reset variables and window // reset variables and window
this->downloading.process= nullptr; this->downloading.process->close();
ui->progressBar->hide(); ui->progressBar->hide();
delete ui->listDownload->takeItem(0); delete ui->listDownload->takeItem(0);
this->downloading.clear(); this->downloading.clear();
@ -636,13 +883,6 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
// Some downloads staying in queue // Some downloads staying in queue
if (ui->listDownload->count() != 0) if (ui->listDownload->count() != 0)
{ {
// autosave is activated
if (config.autosaveCheckbox->checkState() == Qt::Checked)
{
// saving download list
saveDownloadList();
}
// initializing download // initializing download
path = ui->listDownload->item(0)->text(); path = ui->listDownload->item(0)->text();
pos = path.lastIndexOf("/"); pos = path.lastIndexOf("/");
@ -652,8 +892,9 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
this->downloading.server = path.midRef(pos+4).toString(); this->downloading.server = path.midRef(pos+4).toString();
path.resize(pos); path.resize(pos);
this->downloading.path = path; this->downloading.path = path;
getUserPassword(true);
// save path exists in settings ? // savepath exists in settings ?
str = "Folder/" + this->downloading.server + "/" + this->downloading.service; str = "Folder/" + this->downloading.server + "/" + this->downloading.service;
if (this->settings.contains(str)) if (this->settings.contains(str))
{ {
@ -671,6 +912,10 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
} }
} }
} }
if(config.autosaveCheckbox->checkState() == Qt::Checked and this->downloading.quit == false)
{
saveDownloadList();
}
} }
@ -707,13 +952,14 @@ void MainWindow::on_listDownload_itemClicked(QListWidgetItem *item)
// removing line from download list // removing line from download list
ui->listDownload->removeItemWidget(item); ui->listDownload->removeItemWidget(item);
delete item; delete item;
if (config.autosaveCheckbox->checkState() == Qt::Checked)
{
// autosave acivated,so saving download list
saveDownloadList();
}
} }
} }
if (config.autosaveCheckbox->checkState() == Qt::Checked)
{
// autosave acivated,so saving download list
saveDownloadList();
}
} }
// load settings // load settings
@ -766,13 +1012,7 @@ void MainWindow::saveSettings()
// About // About
void MainWindow::on_actionAbout_triggered() void MainWindow::on_actionAbout_triggered()
{ {
QString text = this->about.description + "\n\n" + aboutDialog.show();
tr("Version") + ": " + this->about.version + "\n" +
tr("Licence") + ": " + this->about.licence + "\n" +
tr("Author") + ": " + this->about.author + "\n" +
tr("EMail") + ": " + this->about.email + "\n" +
tr("Source code") + ": " + this->about.git;
QMessageBox::about(this, this->about.title, text);
} }
// About QT // About QT
@ -893,6 +1133,7 @@ void MainWindow::loadDownloadList()
path.resize(pos); path.resize(pos);
pos = path.lastIndexOf(" => "); pos = path.lastIndexOf(" => ");
this->downloading.server = path.midRef(pos+4).toString(); this->downloading.server = path.midRef(pos+4).toString();
this->downloading.port = this->settings.value("connexion/server/" + this->downloading.server).toInt();
path.resize(pos); path.resize(pos);
this->downloading.path = path; this->downloading.path = path;
str = "Folder/" + this->downloading.server + "/" + this->downloading.service; str = "Folder/" + this->downloading.server + "/" + this->downloading.service;
@ -910,6 +1151,11 @@ void Downloading::clear()
this->server.clear(); this->server.clear();
this->savePath.clear(); this->savePath.clear();
this->service.clear(); this->service.clear();
this->user.clear();
this->password.clear();
this->port = 0;
this->process = nullptr;
this->quit = false;
} }
// Context menu of file list clicked // Context menu of file list clicked
@ -932,8 +1178,38 @@ void MainWindow::on_actionDownload_triggered()
} }
*/ */
// Chnage toolbar style // Change toolbar style
void MainWindow::on_comboBox_currentIndexChanged(int index) void MainWindow::on_comboBox_currentIndexChanged(int index)
{ {
ui->toolBar->setToolButtonStyle((Qt::ToolButtonStyle)index); ui->toolBar->setToolButtonStyle((Qt::ToolButtonStyle)index);
} }
void MainWindow::on_actionExit_triggered()
{
quitApp();
}
void MainWindow::on_loginBox_accepted()
{
if (!loginD.loginEdit->text().isEmpty())
{
this->connexion.user = loginD.loginEdit->text();
if (!loginD.passwordEdit->text().isEmpty())
{
this->connexion.password = loginD.passwordEdit->text();
this->settings.setValue("Passwords/" + this->connexion.server + "/" + this->connexion.service + "/" + this->connexion.user, this->connexion.password);
this->settings.sync();
if (this->rescan == true)
{
this->rescan = false;
populateTree(NULL);
}
}
}
}
void MainWindow::setDlSpeed(QString speed)
{
speed.squeeze();
}

View File

@ -4,11 +4,14 @@
#define QT_USE_FAST_OPERATOR_PLUS #define QT_USE_FAST_OPERATOR_PLUS
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "ui_configuration.h" #include "ui_configuration.h"
#include "ui_about.h"
#include "ui_login.h"
#include "downloadfile.h" #include "downloadfile.h"
#include "tools.h" #include "tools.h"
#include <QMainWindow> #include <QMainWindow>
#include <string> #include <string>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
#include <QList>
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QProgressDialog> #include <QProgressDialog>
#include <QSettings> #include <QSettings>
@ -39,6 +42,10 @@
#include <QProcess> #include <QProcess>
#include <QToolBar> #include <QToolBar>
#include <QDir> #include <QDir>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QTranslator>
#include <QInputDialog>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@ -53,6 +60,8 @@ class Connexion
int bandwidthLimitUnit; int bandwidthLimitUnit;
QString server; QString server;
QString service; QString service;
QString user;
QString password;
int port = 873; int port = 873;
bool comboboxChanged; bool comboboxChanged;
}; };
@ -64,8 +73,11 @@ class Downloading
QString service; QString service;
QString path; QString path;
QString savePath; QString savePath;
QString user;
QString password;
int port = 873;
QProcess * process = nullptr; QProcess * process = nullptr;
bool quit = false;
void clear(); void clear();
}; };
@ -73,7 +85,7 @@ class About
{ {
public: public:
QString title = "RsyncUI"; QString title = "RsyncUI";
QString version = "2.1"; QString version = "2.6.1";
QString author = "Daniel TARTAVEL-JEANNOT"; QString author = "Daniel TARTAVEL-JEANNOT";
QString licence = "GPL_V3"; QString licence = "GPL_V3";
QString description; QString description;
@ -92,12 +104,19 @@ class MainWindow : public QMainWindow
QProgressDialog *progress; QProgressDialog *progress;
Connexion connexion; Connexion connexion;
Downloading downloading; Downloading downloading;
//downloadFile downloadO;
QSettings settings; QSettings settings;
About about; About about;
QDialog Configuration; QDialog Configuration;
Ui::Configuration config; Ui::Configuration config;
QDialog aboutDialog;
Ui::windowAbout AboutW;
QDialog loginDialog;
Ui::LoginDialog loginD;
std::vector <QString> serversList; std::vector <QString> serversList;
QSystemTrayIcon * trayIcon;
QString icon = "/usr/share/icons/RsyncUI.png";
bool rescan = false;
QList<QString> bwUnitText { QList<QString> bwUnitText {
"KB", "KB",
"MB", "MB",
@ -131,7 +150,7 @@ class MainWindow : public QMainWindow
bool isIpAddress(QString server); bool isIpAddress(QString server);
QTreeWidgetItem * addTreeRoot(QString name, QString description, bool isDir); QTreeWidgetItem * addTreeRoot(QString name, QString description, bool isDir);
QTreeWidgetItem * addTreeChild(QTreeWidgetItem *parent, QString name, QString size, bool isDir); QTreeWidgetItem * addTreeChild(QTreeWidgetItem *parent, QString name, QString size, bool isDir);
void scanDir(QString server, int portN, QTreeWidgetItem *parent = NULL, QString path = "" ); bool scanDir(QString server, int portN, QTreeWidgetItem *parent = NULL, QString path = "" );
void startDownloading(); void startDownloading();
void loadSettings(); void loadSettings();
void saveSettings(); void saveSettings();
@ -139,6 +158,11 @@ class MainWindow : public QMainWindow
void saveDownloadList(); void saveDownloadList();
void loadDownloadList(); void loadDownloadList();
void download(); void download();
void initSystemTrayIcon();
void hideWindow();
void showWindow();
void init();
bool getUserPassword(bool);
private slots: private slots:
@ -180,12 +204,23 @@ class MainWindow : public QMainWindow
void cancelled(QProcess *); void cancelled(QProcess *);
signals: void on_trayIcon_clicked(QSystemTrayIcon::ActivationReason reason);
void quitApp();
void on_actionExit_triggered();
void setDlSpeed(QString speed);
void on_loginBox_accepted();
signals:
void stopDownloading(QProcess *); void stopDownloading(QProcess *);
void progressSignal(int); void progressSignal(int);
void speed(QString);
void finishedSignal(bool = true); void finishedSignal(bool = true);
void fileName(QString);
//void errorSignal(QString); //void errorSignal(QString);
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -20,6 +20,10 @@
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>MainWindow</string>
</property> </property>
<property name="windowIcon">
<iconset theme="/usr/share/icons/RsyncUI.png">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="toolButtonStyle"> <property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum> <enum>Qt::ToolButtonTextUnderIcon</enum>
</property> </property>
@ -271,10 +275,10 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="dragEnabled"> <property name="dragEnabled">
<bool>true</bool> <bool>false</bool>
</property> </property>
<property name="dragDropMode"> <property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum> <enum>QAbstractItemView::NoDragDrop</enum>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
@ -353,6 +357,9 @@
<property name="value"> <property name="value">
<number>0</number> <number>0</number>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="format"> <property name="format">
<string extracomment="Downloading">%p%</string> <string extracomment="Downloading">%p%</string>
</property> </property>
@ -395,6 +402,7 @@
<addaction name="action_Settings"/> <addaction name="action_Settings"/>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionAbout_Qt"/> <addaction name="actionAbout_Qt"/>
<addaction name="actionExit"/>
</widget> </widget>
<action name="DefaultSaveFolder"> <action name="DefaultSaveFolder">
<property name="icon"> <property name="icon">
@ -443,6 +451,21 @@
<string>Click on menu button to download the entire folder</string> <string>Click on menu button to download the entire folder</string>
</property> </property>
</action> </action>
<action name="actionExit">
<property name="icon">
<iconset theme="application-exit">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Exit</string>
</property>
<property name="toolTip">
<string>Terminate the program</string>
</property>
<property name="shortcut">
<string>Ctrl+Q</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

View File

@ -44,7 +44,7 @@ const vector<string> explode(const string& s, const char& c, int n = 0)
} }
// test return code of rsync // test return code of rsync
bool testRsyncReturn(QProcess * myProcess) bool testRsyncReturn(MainWindow * w, QProcess * myProcess)
{ {
if (myProcess->exitStatus() != 0) if (myProcess->exitStatus() != 0)
{ {
@ -55,6 +55,9 @@ bool testRsyncReturn(QProcess * myProcess)
QMessageBox::Ok, QMessageBox::Ok,
QMessageBox::Ok); QMessageBox::Ok);
return true; return true;
}else if (myProcess->exitCode() == 5)
{
w->loginDialog.show();
}else if (myProcess->exitCode() != 0) }else if (myProcess->exitCode() != 0)
{ {
QMessageBox::warning( QMessageBox::warning(
@ -67,3 +70,5 @@ bool testRsyncReturn(QProcess * myProcess)
} }
return false; return false;
} }

View File

@ -1,6 +1,7 @@
#ifndef TOOLS_H #ifndef TOOLS_H
#define TOOLS_H #define TOOLS_H
#include "mainwindow.h"
#include <string> #include <string>
#include <vector> #include <vector>
#include <array> #include <array>
@ -17,7 +18,6 @@ FILE * popen2(array<string,8> argv, string type, int & pid);
int pclose2(FILE * fp, pid_t pid); int pclose2(FILE * fp, pid_t pid);
bool testRsyncReturn(QProcess *); bool testRsyncReturn(MainWindow *, QProcess *);
#endif // TOOLS_H #endif // TOOLS_H