mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-10 09:57:41 +02:00
Compare commits
57 Commits
v1.4.0-bet
...
v1.4.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24251bc223 | ||
|
|
f78749d2cd | ||
|
|
0995377d39 | ||
|
|
b9228e64ff | ||
|
|
c4084de716 | ||
|
|
3c667918e7 | ||
|
|
e55745cbcf | ||
|
|
e01ce20431 | ||
|
|
dce8cb83d9 | ||
|
|
8dc956c55b | ||
|
|
6c77921a32 | ||
|
|
55e4748f06 | ||
|
|
5ff9e02517 | ||
|
|
7f7ebc36f5 | ||
|
|
0e5bfc03ce | ||
|
|
b309d333a6 | ||
|
|
ee439382ed | ||
|
|
192212c682 | ||
|
|
148bdfdcd6 | ||
|
|
066c0ba189 | ||
|
|
9651f1cddf | ||
|
|
5feb9b0806 | ||
|
|
44b9ee19e7 | ||
|
|
cc16d19bc4 | ||
|
|
b96c2de2b7 | ||
|
|
f882b80708 | ||
|
|
4d7c014b23 | ||
|
|
1f274699e5 | ||
|
|
697e355f07 | ||
|
|
e89bdfc422 | ||
|
|
c2cc9e62a7 | ||
|
|
1f2ae0d061 | ||
|
|
91a39588c6 | ||
|
|
a642f86d5b | ||
|
|
00cf290574 | ||
|
|
b59952b539 | ||
|
|
88b4ff9809 | ||
|
|
ddd0965a82 | ||
|
|
0a9491ff46 | ||
|
|
32b44e3d87 | ||
|
|
268004b4ff | ||
|
|
6c0f6ae62e | ||
|
|
094f2bb540 | ||
|
|
f4da7f1fb0 | ||
|
|
b058185d3b | ||
|
|
eecb981736 | ||
|
|
46b870e260 | ||
|
|
1ffab7337d | ||
|
|
82fb8c49cf | ||
|
|
ff2d59d32f | ||
|
|
0ced165b3e | ||
|
|
d3378c131a | ||
|
|
0300a85295 | ||
|
|
60a116f3e0 | ||
|
|
ff4d2d488f | ||
|
|
b0852b4cf5 | ||
|
|
c047b4d4de |
@@ -1,6 +1,6 @@
|
||||
set( VERSION_MAJOR 1 )
|
||||
set( VERSION_MINOR 4 )
|
||||
set( VERSION_PATCH 0 )
|
||||
set( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}beta1")
|
||||
set( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}beta2")
|
||||
set( SOVERSION 0 )
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ if(SPHINX_FOUND)
|
||||
# apt-get install texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended
|
||||
add_custom_target(doc-latex ${SPHINX_EXECUTABLE}
|
||||
-q -c . -b latex
|
||||
-d ${SPHINX_CACHE_DIR}
|
||||
-d ${SPHINX_CACHE_DIR}/latex
|
||||
-D latex_logo=${LATEX_LOGO}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${SPHINX_PDF_DIR} )
|
||||
@@ -41,7 +41,7 @@ if(SPHINX_FOUND)
|
||||
if (EXISTS ${QT_QCOLLECTIONGENERATOR_EXECUTABLE})
|
||||
add_custom_target( doc-qch-sphinx ${SPHINX_EXECUTABLE}
|
||||
-q -c . -b qthelp
|
||||
-d ${SPHINX_CACHE_DIR}
|
||||
-d ${SPHINX_CACHE_DIR}/qthelp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${SPHINX_QCH_DIR} )
|
||||
add_custom_target( doc-qch ${QT_QCOLLECTIONGENERATOR_EXECUTABLE}
|
||||
@@ -54,12 +54,12 @@ if(SPHINX_FOUND)
|
||||
endif()
|
||||
add_custom_target( doc-html ${SPHINX_EXECUTABLE}
|
||||
-q -c . -b html
|
||||
-d ${SPHINX_CACHE_DIR}
|
||||
-d ${SPHINX_CACHE_DIR}/html
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${SPHINX_HTML_DIR} )
|
||||
add_custom_target( doc-man ${SPHINX_EXECUTABLE}
|
||||
-q -c . -b man
|
||||
-d ${SPHINX_CACHE_DIR}
|
||||
-d ${SPHINX_CACHE_DIR}/man
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${SPHINX_MAN_DIR} )
|
||||
|
||||
@@ -71,7 +71,7 @@ if(SPHINX_FOUND)
|
||||
add_custom_target( doc-chm-sphinx ${SPHINX_EXECUTABLE}
|
||||
-q -c . -b htmlhelp
|
||||
-D html_theme=basic
|
||||
-d ${SPHINX_CACHE_DIR}
|
||||
-d ${SPHINX_CACHE_DIR}/htmlhelp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${SPHINX_HTMLHELP_DIR} )
|
||||
add_custom_target( doc-chm pushd ${SPHINX_HTMLHELP_DIR}; ${MSHTML_COMPILER} *.hhp; popd
|
||||
|
||||
@@ -5,3 +5,4 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_SHORTNAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing
|
||||
|
||||
@@ -22,7 +22,6 @@ mirall/generalsettings.ui
|
||||
mirall/networksettings.ui
|
||||
mirall/accountsettings.ui
|
||||
mirall/ignorelisteditor.ui
|
||||
mirall/fileitemdialog.ui
|
||||
mirall/itemprogressdialog.ui
|
||||
wizard/owncloudsetupnocredspage.ui
|
||||
wizard/owncloudhttpcredspage.ui
|
||||
@@ -193,7 +192,6 @@ set(mirall_SRCS
|
||||
mirall/occinfo.cpp
|
||||
mirall/sslerrordialog.cpp
|
||||
mirall/logbrowser.cpp
|
||||
mirall/fileitemdialog.cpp
|
||||
mirall/settingsdialog.cpp
|
||||
mirall/generalsettings.cpp
|
||||
mirall/networksettings.cpp
|
||||
@@ -218,7 +216,6 @@ set(mirall_HEADERS
|
||||
mirall/updatedetector.h
|
||||
mirall/sslerrordialog.h
|
||||
mirall/logbrowser.h
|
||||
mirall/fileitemdialog.h
|
||||
mirall/settingsdialog.h
|
||||
mirall/generalsettings.h
|
||||
mirall/networksettings.h
|
||||
|
||||
14
src/main.cpp
14
src/main.cpp
@@ -23,7 +23,12 @@ int main(int argc, char **argv)
|
||||
|
||||
Mirall::Application app(argc, argv);
|
||||
app.initialize();
|
||||
|
||||
|
||||
if( app.giveHelp() ) {
|
||||
app.showHelp();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// if the application is already running, notify it.
|
||||
if( app.isRunning() ) {
|
||||
QStringList args = app.arguments();
|
||||
@@ -43,11 +48,6 @@ int main(int argc, char **argv)
|
||||
.arg(Mirall::Theme::instance()->appNameGUI()));
|
||||
}
|
||||
}
|
||||
// if help requested, show on command line and exit.
|
||||
if( ! app.giveHelp() ) {
|
||||
return app.exec();
|
||||
} else {
|
||||
app.showHelp();
|
||||
}
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "mirall/folderstatusmodel.h"
|
||||
#include "mirall/utility.h"
|
||||
#include "mirall/application.h"
|
||||
#include "mirall/fileitemdialog.h"
|
||||
#include "mirall/owncloudsetupwizard.h"
|
||||
#include "mirall/mirallconfigfile.h"
|
||||
#include "mirall/ignorelisteditor.h"
|
||||
@@ -34,6 +33,8 @@
|
||||
#include <QDesktopServices>
|
||||
#include <QListWidgetItem>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QKeySequence>
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
@@ -54,13 +55,16 @@ AccountSettings::AccountSettings(QWidget *parent) :
|
||||
ui->_folderList->setEditTriggers( QAbstractItemView::NoEditTriggers );
|
||||
|
||||
ui->_ButtonRemove->setEnabled(false);
|
||||
ui->_ButtonReset->setEnabled(false);
|
||||
ui->_ButtonEnable->setEnabled(false);
|
||||
ui->_ButtonInfo->setEnabled(false);
|
||||
ui->_ButtonAdd->setEnabled(true);
|
||||
|
||||
QAction *resetFolderAction = new QAction(this);
|
||||
resetFolderAction->setShortcut(QKeySequence(Qt::Key_F5));
|
||||
connect(resetFolderAction, SIGNAL(triggered()), SLOT(slotResetCurrentFolder()));
|
||||
addAction(resetFolderAction);
|
||||
|
||||
connect(ui->_ButtonRemove, SIGNAL(clicked()), this, SLOT(slotRemoveCurrentFolder()));
|
||||
connect(ui->_ButtonReset, SIGNAL(clicked()), this, SLOT(slotResetCurrentFolder()));
|
||||
connect(ui->_ButtonEnable, SIGNAL(clicked()), this, SLOT(slotEnableCurrentFolder()));
|
||||
connect(ui->_ButtonInfo, SIGNAL(clicked()), this, SLOT(slotInfoAboutCurrentFolder()));
|
||||
connect(ui->_ButtonAdd, SIGNAL(clicked()), this, SLOT(slotAddFolder()));
|
||||
@@ -86,8 +90,6 @@ void AccountSettings::slotFolderActivated( const QModelIndex& indx )
|
||||
bool state = indx.isValid();
|
||||
|
||||
ui->_ButtonRemove->setEnabled( state );
|
||||
ui->_ButtonReset->setEnabled( state );
|
||||
ui->_ButtonReset->setEnabled( state );
|
||||
ui->_ButtonEnable->setEnabled( state );
|
||||
ui->_ButtonInfo->setEnabled( state );
|
||||
|
||||
@@ -140,6 +142,7 @@ void AccountSettings::slotFolderWizardAccepted()
|
||||
folderMan->slotScheduleAllFolders();
|
||||
emit folderChanged();
|
||||
}
|
||||
buttonsSetEnabled();
|
||||
}
|
||||
|
||||
void AccountSettings::slotFolderWizardRejected()
|
||||
@@ -185,7 +188,6 @@ void AccountSettings::buttonsSetEnabled()
|
||||
bool isSelected = selected.isValid();
|
||||
|
||||
ui->_ButtonEnable->setEnabled(isSelected);
|
||||
ui->_ButtonReset->setEnabled(isSelected);
|
||||
ui->_ButtonRemove->setEnabled(isSelected);
|
||||
ui->_ButtonInfo->setEnabled(isSelected);
|
||||
}
|
||||
@@ -260,8 +262,10 @@ void AccountSettings::slotResetCurrentFolder()
|
||||
QString alias = _model->data( selected, FolderStatusDelegate::FolderAliasRole ).toString();
|
||||
int ret = QMessageBox::question( 0, tr("Confirm Folder Reset"),
|
||||
tr("<p>Do you really want to reset folder <i>%1</i> and rebuild your client database?</p>"
|
||||
"<p><b>Note:</b> While no files will be removed, this can cause significant data "
|
||||
"traffic and take several minutes to hours, depending on the size of the folder.</p>").arg(alias),
|
||||
"<p><b>Note:</b> This function is designed for maintenance purposes only. "
|
||||
"No files will be removed, but this can cause significant data traffic and "
|
||||
"take several minutes or hours to complete, depending on the size of the folder. "
|
||||
"Only use this option if advised by your administrator.</p>").arg(alias),
|
||||
QMessageBox::Yes|QMessageBox::No );
|
||||
if( ret == QMessageBox::Yes ) {
|
||||
FolderMan *folderMan = FolderMan::instance();
|
||||
@@ -307,9 +311,10 @@ void AccountSettings::setFolderList( const Folder::Map &folders )
|
||||
slotAddFolder( f );
|
||||
}
|
||||
|
||||
QModelIndex idx = _model->index(0, 0);
|
||||
if (idx.isValid())
|
||||
QModelIndex idx = _model->index(0, 0);
|
||||
if (idx.isValid()) {
|
||||
ui->_folderList->setCurrentIndex(idx);
|
||||
}
|
||||
buttonsSetEnabled();
|
||||
|
||||
}
|
||||
@@ -352,7 +357,7 @@ void AccountSettings::slotEnableCurrentFolder()
|
||||
|
||||
// this sets the folder status to disabled but does not interrupt it.
|
||||
Folder *f = folderMan->folder( alias );
|
||||
if( f && !folderEnabled ) {
|
||||
if( f && folderEnabled ) {
|
||||
// check if a sync is still running and if so, ask if we should terminate.
|
||||
if( f->isBusy() ) { // its still running
|
||||
int reply = QMessageBox::question( 0, tr("Sync Running"),
|
||||
@@ -395,11 +400,6 @@ void AccountSettings::slotUpdateFolderState( Folder *folder )
|
||||
item = _model->item( ++row );
|
||||
}
|
||||
|
||||
#if 0
|
||||
if( !_fileItemDialog.isNull() && _fileItemDialog->isVisible() ) {
|
||||
_fileItemDialog->setSyncResult( FolderMan::instance()->syncResult(folder) );
|
||||
}
|
||||
#endif
|
||||
if( item ) {
|
||||
folderToModelItem( item, folder );
|
||||
} else {
|
||||
@@ -534,6 +534,15 @@ void AccountSettings::slotSetProgress(const QString& folder, const Progress::Inf
|
||||
// stay with the previous kind-string for Context.
|
||||
if( progress.kind != Progress::Context ) {
|
||||
_kindContext = Progress::asActionString(progress.kind);
|
||||
} else {
|
||||
if( _kindContext.isEmpty() ) {
|
||||
// empty kind context means that the dialog was opened after the action
|
||||
// was started.
|
||||
Progress::Kind kind = ProgressDispatcher::instance()->currentFolderContext(progress.folder);
|
||||
if( kind != Progress::Invalid ) {
|
||||
_kindContext = Progress::asActionString(kind);
|
||||
}
|
||||
}
|
||||
}
|
||||
QString kindString = _kindContext;
|
||||
|
||||
@@ -643,7 +652,7 @@ void AccountSettings::slotUpdateQuota(qint64 total, qint64 used)
|
||||
ui->quotaProgressBar->setValue(round(used/(double)total * 100));
|
||||
QString usedStr = Utility::octetsToString(used);
|
||||
QString totalStr = Utility::octetsToString(total);
|
||||
ui->quotaLabel->setText(tr("You are using %1 of your available %2 storage.").arg(usedStr, totalStr));
|
||||
ui->quotaLabel->setText(tr("%1 of %2 in use.").arg(usedStr, totalStr));
|
||||
}
|
||||
|
||||
void AccountSettings::slotIgnoreFilesEditor()
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>607</width>
|
||||
<height>385</height>
|
||||
<height>382</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -30,16 +30,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removeAccountButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Remove Account</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="modifyAccountButton">
|
||||
<property name="text">
|
||||
@@ -47,6 +37,19 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -71,7 +74,7 @@
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonAdd">
|
||||
<property name="text">
|
||||
<string>Add Sync...</string>
|
||||
<string>Add Folder...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -82,19 +85,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonRemove">
|
||||
<property name="text">
|
||||
@@ -102,13 +92,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonReset">
|
||||
<property name="text">
|
||||
<string>Reset</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_3">
|
||||
<property name="orientation">
|
||||
|
||||
@@ -113,11 +113,12 @@ Application::Application(int &argc, char **argv) :
|
||||
setWindowIcon( _theme->applicationIcon() );
|
||||
|
||||
parseOptions(arguments());
|
||||
setupTranslations();
|
||||
setupLogBrowser();
|
||||
//no need to waste time;
|
||||
if ( _helpOnly ) return;
|
||||
|
||||
setupLogBrowser();
|
||||
setupTranslations();
|
||||
|
||||
connect( this, SIGNAL(messageReceived(QString)), SLOT(slotParseOptions(QString)));
|
||||
connect( Logger::instance(), SIGNAL(guiLog(QString,QString)),
|
||||
this, SLOT(slotShowTrayMessage(QString,QString)));
|
||||
@@ -329,7 +330,7 @@ void Application::setupActions()
|
||||
QObject::connect(_actionSettings, SIGNAL(triggered(bool)), SLOT(slotSettings()));
|
||||
_actionHelp = new QAction(tr("Help"), this);
|
||||
QObject::connect(_actionHelp, SIGNAL(triggered(bool)), SLOT(slotHelp()));
|
||||
_actionQuit = new QAction(tr("Quit"), this);
|
||||
_actionQuit = new QAction(tr("Quit %1").arg(_theme->appNameGUI()), this);
|
||||
QObject::connect(_actionQuit, SIGNAL(triggered(bool)), SLOT(quit()));
|
||||
}
|
||||
|
||||
@@ -362,7 +363,7 @@ void Application::setupContextMenu()
|
||||
_recentActionsMenu->addAction(_actionRecent);
|
||||
} else {
|
||||
_contextMenu = new QMenu();
|
||||
_recentActionsMenu = _contextMenu->addMenu(tr("Recent Changes..."));
|
||||
_recentActionsMenu = _contextMenu->addMenu(tr("Recent Changes"));
|
||||
// this must be called only once after creating the context menu, or
|
||||
// it will trigger a bug in Ubuntu's SNI bridge patch (11.10, 12.04).
|
||||
_tray->setContextMenu(_contextMenu);
|
||||
@@ -379,7 +380,7 @@ void Application::setupContextMenu()
|
||||
Folder *folder = folderMan->map().value(li.first());
|
||||
if( folder ) {
|
||||
// if there is singleFolder mode, a generic open action is displayed.
|
||||
QAction *action = new QAction( tr("Open local folder '%1'").arg(_theme->appNameGUI()), this);
|
||||
QAction *action = new QAction( tr("Open %1 folder").arg(_theme->appNameGUI()), this);
|
||||
connect( action, SIGNAL(triggered()),_folderOpenActionMapper,SLOT(map()));
|
||||
_folderOpenActionMapper->setMapping( action, folder->alias() );
|
||||
|
||||
@@ -418,8 +419,8 @@ void Application::setupLogBrowser()
|
||||
// might be called from second instance
|
||||
if (!_logBrowser) {
|
||||
// init the log browser.
|
||||
_logBrowser = new LogBrowser;
|
||||
qInstallMsgHandler( mirallLogCatcher );
|
||||
_logBrowser = new LogBrowser;
|
||||
// ## TODO: allow new log name maybe?
|
||||
if (!_logDirectory.isEmpty()) {
|
||||
enterNextLogFile();
|
||||
@@ -522,7 +523,7 @@ void Application::slotRefreshQuotaDisplay( qint64 total, qint64 used )
|
||||
double percent = used/(double)total*100;
|
||||
QString percentFormatted = Utility::compactFormatDouble(percent, 1);
|
||||
QString totalFormatted = Utility::octetsToString(total);
|
||||
_actionQuota->setText(tr("%1% of %2 used").arg(percentFormatted).arg(totalFormatted));
|
||||
_actionQuota->setText(tr("%1% of %2 in use").arg(percentFormatted).arg(totalFormatted));
|
||||
}
|
||||
|
||||
void Application::slotUseMonoIconsChanged(bool)
|
||||
@@ -594,7 +595,7 @@ void Application::slotUpdateProgress(const QString &folder, const Progress::Info
|
||||
|
||||
void Application::slotDisplayIdle()
|
||||
{
|
||||
_actionStatus->setText(tr("In Sync"));
|
||||
_actionStatus->setText(tr("Up to date"));
|
||||
}
|
||||
|
||||
void Application::slotHelp()
|
||||
|
||||
@@ -257,7 +257,7 @@ int CSyncThread::treewalkFile( TREE_WALK_FILE *file, bool remote )
|
||||
|
||||
int CSyncThread::treewalkError(TREE_WALK_FILE* file)
|
||||
{
|
||||
SyncFileItem item;
|
||||
SyncFileItem item; // only used for search.
|
||||
item._file= QString::fromUtf8(file->path);
|
||||
int indx = _syncedItems.indexOf(item);
|
||||
|
||||
@@ -269,6 +269,7 @@ int CSyncThread::treewalkError(TREE_WALK_FILE* file)
|
||||
file->instruction == CSYNC_INSTRUCTION_ERROR) ) {
|
||||
_mutex.lock();
|
||||
_syncedItems[indx]._instruction = file->instruction;
|
||||
_syncedItems[indx]._errorString = QString::fromUtf8(file->error_string);
|
||||
_mutex.unlock();
|
||||
}
|
||||
|
||||
@@ -335,14 +336,14 @@ void CSyncThread::startSync()
|
||||
|
||||
int downloadLimit = 0;
|
||||
if (cfg.useDownloadLimit()) {
|
||||
downloadLimit = cfg.downloadLimit();
|
||||
downloadLimit = cfg.downloadLimit() * 1000;
|
||||
}
|
||||
csync_set_module_property(_csync_ctx, "bandwidth_limit_download", &downloadLimit);
|
||||
|
||||
int uploadLimit = -75; // 75%
|
||||
int useUpLimit = cfg.useUploadLimit();
|
||||
if ( useUpLimit >= 1) {
|
||||
uploadLimit = cfg.uploadLimit();
|
||||
uploadLimit = cfg.uploadLimit() * 1000;
|
||||
} else if (useUpLimit == 0) {
|
||||
uploadLimit = 0;
|
||||
}
|
||||
@@ -494,7 +495,7 @@ void CSyncThread::cb_progress( CSYNC_PROGRESS *progress, void *userdata )
|
||||
pInfo.current_file_no = progress->current_file_no;
|
||||
pInfo.overall_transmission_size = progress->overall_transmission_size;
|
||||
pInfo.overall_current_bytes = progress->current_overall_bytes;
|
||||
pInfo.timestamp = QTime::currentTime();
|
||||
pInfo.timestamp = QDateTime::currentDateTime();
|
||||
|
||||
// Connect to something in folder!
|
||||
thread->transmissionProgress( pInfo );
|
||||
|
||||
@@ -1,309 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <QtGui>
|
||||
|
||||
#include "mirall/fileitemdialog.h"
|
||||
#include "mirall/syncresult.h"
|
||||
#include "mirall/logger.h"
|
||||
|
||||
#include "ui_fileitemdialog.h"
|
||||
|
||||
#define TYPE_SUCCESS 1
|
||||
#define TYPE_CONFLICT 2
|
||||
#define TYPE_NEW 3
|
||||
#define TYPE_DELETED 4
|
||||
#define TYPE_ERROR 5
|
||||
#define TYPE_RENAME 6
|
||||
#define TYPE_IGNORE 7
|
||||
|
||||
#define FILE_TYPE 100
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
FileItemDialog::FileItemDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
_ui(new Ui::FileItemDialog)
|
||||
{
|
||||
_ui->setupUi(this);
|
||||
connect(_ui->_dialogButtonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()),
|
||||
this, SLOT(accept()));
|
||||
|
||||
QStringList header;
|
||||
header << tr("Files");
|
||||
QString firstColString = tr("File Count");
|
||||
header << firstColString;
|
||||
_ui->_treeWidget->setHeaderLabels( header );
|
||||
|
||||
_ui->_treeWidget->setColumnWidth(0, 480);
|
||||
_timer.setInterval(1000);
|
||||
connect(&_timer, SIGNAL(timeout()), this, SLOT(slotSetFolderMessage()));
|
||||
|
||||
QPushButton *copyBtn = _ui->_dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole);
|
||||
connect(copyBtn, SIGNAL(clicked()), SLOT(copyToClipboard()));
|
||||
|
||||
setWindowTitle(tr("Sync Protocol"));
|
||||
|
||||
}
|
||||
|
||||
FileItemDialog::~FileItemDialog()
|
||||
{
|
||||
delete _ui;
|
||||
}
|
||||
|
||||
void FileItemDialog::setSyncResult( const SyncResult& result )
|
||||
{
|
||||
QString folderMessage;
|
||||
|
||||
SyncResult::Status syncStatus = result.status();
|
||||
switch( syncStatus ) {
|
||||
case SyncResult::Undefined:
|
||||
folderMessage = tr( "Undefined Folder State" );
|
||||
break;
|
||||
case SyncResult::NotYetStarted:
|
||||
folderMessage = tr( "The folder waits to start syncing." );
|
||||
break;
|
||||
case SyncResult::SyncPrepare:
|
||||
folderMessage = tr( "Determining which files to sync." );
|
||||
break;
|
||||
case SyncResult::Unavailable:
|
||||
folderMessage = tr( "Server is currently not available." );
|
||||
break;
|
||||
case SyncResult::SyncRunning:
|
||||
folderMessage = tr("Sync is running.");
|
||||
break;
|
||||
case SyncResult::Success:
|
||||
folderMessage = tr("Last Sync was successful.");
|
||||
break;
|
||||
case SyncResult::Error:
|
||||
folderMessage = tr( "Syncing Error." );
|
||||
break;
|
||||
case SyncResult::SetupError:
|
||||
folderMessage = tr( "Setup Error." );
|
||||
break;
|
||||
default:
|
||||
folderMessage = tr( "Undefined Error State." );
|
||||
}
|
||||
|
||||
_folderMessage = folderMessage;
|
||||
_lastSyncTime = result.syncTime();
|
||||
|
||||
if( result.errorStrings().count() ) {
|
||||
_ui->_errorLabel->setVisible(true);
|
||||
_ui->_errorLabel->setTextFormat(Qt::RichText);
|
||||
QString errStr;
|
||||
foreach( QString err, result.errorStrings() ) {
|
||||
errStr.append(QString("<p>%1</p>").arg(err));
|
||||
}
|
||||
|
||||
_ui->_errorLabel->setText(errStr);
|
||||
} else {
|
||||
_ui->_errorLabel->setText(QString::null);
|
||||
_ui->_errorLabel->setVisible(false);
|
||||
}
|
||||
|
||||
slotSetFolderMessage();
|
||||
if( syncStatus == SyncResult::SyncRunning ) {
|
||||
_timer.stop();
|
||||
} else {
|
||||
_timer.start();
|
||||
}
|
||||
|
||||
setSyncFileItems( result.syncFileItemVector() );
|
||||
|
||||
}
|
||||
|
||||
void FileItemDialog::slotSetFolderMessage()
|
||||
{
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
int secs = _lastSyncTime.secsTo(now);
|
||||
|
||||
if (secs < 60)
|
||||
_ui->_timelabel->setText(tr("%1 (last finished %n sec. ago)", "", secs).arg(_folderMessage));
|
||||
else
|
||||
_ui->_timelabel->setText(tr("%1 (last finished %n min. ago)", "", secs/60).arg(_folderMessage));
|
||||
}
|
||||
|
||||
void FileItemDialog::copyToClipboard()
|
||||
{
|
||||
QString text;
|
||||
QTextStream ts(&text);
|
||||
|
||||
int topLevelItems = _ui->_treeWidget->topLevelItemCount();
|
||||
for (int i = 0; i < topLevelItems; i++) {
|
||||
QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(i);
|
||||
ts << left << qSetFieldWidth(50)
|
||||
<< item->data(0, Qt::DisplayRole).toString()
|
||||
<< right << qSetFieldWidth(6)
|
||||
<< item->data(1, Qt::DisplayRole).toString()
|
||||
<< endl;
|
||||
int childItems = item->childCount();
|
||||
for (int j = 0; j < childItems; j++) {
|
||||
QTreeWidgetItem *child =item->child(j);
|
||||
ts << left << qSetFieldWidth(0) << QLatin1String(" ")
|
||||
<< child->data(0,Qt::DisplayRole).toString()
|
||||
<< QString::fromLatin1(" (%1)").arg(
|
||||
child->data(1, Qt::DisplayRole).toString()
|
||||
)
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
|
||||
QApplication::clipboard()->setText(text);
|
||||
Logger::instance()->postGuiLog(tr("Copied to clipboard"), tr("The sync protocol has been copied to the clipboard."));
|
||||
}
|
||||
|
||||
void FileItemDialog::accept()
|
||||
{
|
||||
_timer.stop();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void FileItemDialog::setSyncFileItems( const SyncFileItemVector& list )
|
||||
{
|
||||
_ui->_treeWidget->clear();
|
||||
QStringList strings;
|
||||
QFont headerFont;
|
||||
headerFont.setWeight(QFont::Bold);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Synced Files"));
|
||||
_syncedFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_SUCCESS );
|
||||
_syncedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_syncedFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("New Files"));
|
||||
_newFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_NEW );
|
||||
_newFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_newFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Deleted Files"));
|
||||
_deletedFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_DELETED );
|
||||
_deletedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_deletedFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Renamed Files"));
|
||||
_renamedFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_RENAME);
|
||||
_renamedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_renamedFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Ignored Files"));
|
||||
_ignoredFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_IGNORE);
|
||||
_ignoredFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_renamedFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Errors"));
|
||||
_errorFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_ERROR );
|
||||
_errorFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_errorFileItem);
|
||||
|
||||
strings.clear();
|
||||
strings.append(tr("Conflicts"));
|
||||
_conflictFileItem = new QTreeWidgetItem( _ui->_treeWidget, strings, TYPE_CONFLICT);
|
||||
_conflictFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
||||
_ui->_treeWidget->addTopLevelItem(_conflictFileItem);
|
||||
|
||||
QList<QTreeWidgetItem*> syncedItems;
|
||||
QList<QTreeWidgetItem*> renamedItems;
|
||||
QList<QTreeWidgetItem*> newItems;
|
||||
QList<QTreeWidgetItem*> deletedItems;
|
||||
QList<QTreeWidgetItem*> ignoredItems;
|
||||
QList<QTreeWidgetItem*> conflictItems;
|
||||
QList<QTreeWidgetItem*> errorItems;
|
||||
|
||||
quint64 overall_files = 0;
|
||||
|
||||
foreach( SyncFileItem item, list ) {
|
||||
overall_files++;
|
||||
|
||||
QString dir;
|
||||
QStringList str( item._file );
|
||||
if( item._dir == SyncFileItem::Up ) dir = tr("Uploaded");
|
||||
if( item._dir == SyncFileItem::Down ) dir = tr("Downloaded");
|
||||
str << dir;
|
||||
|
||||
switch( item._instruction ) {
|
||||
case CSYNC_INSTRUCTION_NONE:
|
||||
// do nothing.
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_EVAL:
|
||||
// should not happen
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_REMOVE:
|
||||
case CSYNC_INSTRUCTION_DELETED:
|
||||
deletedItems.append( new QTreeWidgetItem(_deletedFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_RENAME:
|
||||
renamedItems.append( new QTreeWidgetItem(_renamedFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_NEW:
|
||||
newItems.append( new QTreeWidgetItem(_newFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_CONFLICT:
|
||||
conflictItems.append( new QTreeWidgetItem(_conflictFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_IGNORE:
|
||||
ignoredItems.append( new QTreeWidgetItem(_ignoredFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_SYNC:
|
||||
case CSYNC_INSTRUCTION_UPDATED:
|
||||
syncedItems.append( new QTreeWidgetItem(_syncedFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_STAT_ERROR:
|
||||
case CSYNC_INSTRUCTION_ERROR:
|
||||
errorItems.append( new QTreeWidgetItem(_errorFileItem, str, FILE_TYPE) );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
formatHeaderItem( _syncedFileItem, syncedItems );
|
||||
formatHeaderItem( _newFileItem, newItems );
|
||||
formatHeaderItem( _deletedFileItem, deletedItems );
|
||||
formatHeaderItem( _renamedFileItem, renamedItems );
|
||||
formatHeaderItem( _errorFileItem, errorItems );
|
||||
formatHeaderItem( _conflictFileItem, conflictItems );
|
||||
formatHeaderItem( _ignoredFileItem, ignoredItems );
|
||||
|
||||
}
|
||||
|
||||
void FileItemDialog::formatHeaderItem( QTreeWidgetItem *header, const QList<QTreeWidgetItem*>& list )
|
||||
{
|
||||
if( !header ) return;
|
||||
|
||||
header->addChildren( list );
|
||||
int count = list.count();
|
||||
#if LEAVE_THAT_TO_DESIGNERS
|
||||
QColor col("#adc5d3");
|
||||
header->setBackgroundColor(0, col);
|
||||
header->setBackgroundColor(1, col);
|
||||
#endif
|
||||
header->setText(1, QString::number( count ));
|
||||
if( count ) {
|
||||
QFont font;
|
||||
font.setWeight( QFont::Bold );
|
||||
header->setFont(0, font);
|
||||
header->setFont(1, font);
|
||||
header->setExpanded(true);
|
||||
} else {
|
||||
header->setExpanded(false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef FILEITEMDIALOG_H
|
||||
#define FILEITEMDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QDateTime>
|
||||
#include <QTimer>
|
||||
|
||||
#include "mirall/syncfileitem.h"
|
||||
|
||||
#include "ui_fileitemdialog.h"
|
||||
|
||||
namespace Mirall {
|
||||
class SyncResult;
|
||||
|
||||
namespace Ui {
|
||||
class FileItemDialog;
|
||||
}
|
||||
|
||||
class FileItemDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FileItemDialog(QWidget *parent = 0);
|
||||
~FileItemDialog();
|
||||
void setSyncResult( const SyncResult& );
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void accept();
|
||||
|
||||
protected slots:
|
||||
void slotSetFolderMessage();
|
||||
void copyToClipboard();
|
||||
|
||||
private:
|
||||
void setSyncFileItems( const SyncFileItemVector& list );
|
||||
void formatHeaderItem( QTreeWidgetItem *, const QList<QTreeWidgetItem*>& );
|
||||
|
||||
QTreeWidgetItem *_newFileItem;
|
||||
QTreeWidgetItem *_syncedFileItem;
|
||||
QTreeWidgetItem *_deletedFileItem;
|
||||
QTreeWidgetItem *_renamedFileItem;
|
||||
QTreeWidgetItem *_errorFileItem;
|
||||
QTreeWidgetItem *_conflictFileItem;
|
||||
QTreeWidgetItem *_ignoredFileItem;
|
||||
|
||||
QString _folderMessage;
|
||||
QDateTime _lastSyncTime;
|
||||
QTimer _timer;
|
||||
Ui::FileItemDialog *_ui;
|
||||
};
|
||||
|
||||
}
|
||||
#endif // FILEITEMDIALOG_H
|
||||
@@ -1,87 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Mirall::FileItemDialog</class>
|
||||
<widget class="QWidget" name="Mirall::FileItemDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>612</width>
|
||||
<height>543</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>14</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Detailed Sync Protocol</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="_treeWidget">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="uniformRowHeights">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="columnCount">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">2</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="_timelabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="_errorLabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="_dialogButtonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "mirall/logger.h"
|
||||
#include "mirall/owncloudinfo.h"
|
||||
#include "mirall/utility.h"
|
||||
#include "folderman.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
|
||||
#include <QDebug>
|
||||
@@ -69,10 +70,6 @@ Folder::Folder(const QString &alias, const QString &path, const QString& secondP
|
||||
|
||||
_syncResult.setStatus( SyncResult::NotYetStarted );
|
||||
|
||||
ServerActionNotifier *notifier = new ServerActionNotifier(this);
|
||||
connect(this, SIGNAL(syncFinished(SyncResult)), this, SLOT(slotSyncFinished(SyncResult)));
|
||||
connect(this, SIGNAL(syncFinished(SyncResult)), notifier, SLOT(slotSyncFinished(SyncResult)));
|
||||
|
||||
// check if the local path exists
|
||||
checkLocalPath();
|
||||
|
||||
@@ -236,28 +233,37 @@ void Folder::evaluateSync(const QStringList &/*pathList*/)
|
||||
|
||||
void Folder::slotPollTimerTimeout()
|
||||
{
|
||||
qDebug() << "* Polling" << alias() << "for changes. Ignoring all pending events until now (time since next sync:" << (_timeSinceLastSync.elapsed() / 1000) << "s)";
|
||||
_watcher->clearPendingEvents();
|
||||
qDebug() << "* Polling" << alias() << "for changes. (time since next sync:" << (_timeSinceLastSync.elapsed() / 1000) << "s)";
|
||||
|
||||
if (quint64(_timeSinceLastSync.elapsed()) > MirallConfigFile().forceSyncInterval()) {
|
||||
qDebug() << "* Force Sync now";
|
||||
evaluateSync(QStringList());
|
||||
} else {
|
||||
RequestEtagJob* job = new RequestEtagJob(secondPath(), this);
|
||||
// check if the etag is different
|
||||
QObject::connect(new RequestEtagJob(secondPath(), this), SIGNAL(etagRetreived(QString)),
|
||||
this, SLOT(etagRetreived(QString)));
|
||||
QObject::connect(job, SIGNAL(etagRetreived(QString)), this, SLOT(etagRetreived(QString)));
|
||||
QObject::connect(job, SIGNAL(networkError()), this, SLOT(slotNetworkUnavailable()));
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::etagRetreived(const QString& etag)
|
||||
{
|
||||
qDebug() << "* Compare etag " << etag << " with previous etag " << _lastEtag;
|
||||
qDebug() << "* Compare etag with previous etag: " << (_lastEtag != etag);
|
||||
|
||||
// re-enable sync if it was disabled because network was down
|
||||
FolderMan::instance()->setSyncEnabled(true);
|
||||
|
||||
if (_lastEtag != etag) {
|
||||
_lastEtag = etag;
|
||||
evaluateSync(QStringList());
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::slotNetworkUnavailable()
|
||||
{
|
||||
_syncResult.setStatus(SyncResult::Unavailable);
|
||||
emit syncStateChange();
|
||||
}
|
||||
|
||||
void Folder::slotChanged(const QStringList &pathList)
|
||||
{
|
||||
@@ -265,14 +271,83 @@ void Folder::slotChanged(const QStringList &pathList)
|
||||
evaluateSync(pathList);
|
||||
}
|
||||
|
||||
void Folder::slotSyncFinished(const SyncResult &result)
|
||||
void Folder::bubbleUpSyncResult()
|
||||
{
|
||||
_watcher->setEventsEnabledDelayed(2000);
|
||||
_pollTimer.start();
|
||||
_timeSinceLastSync.restart();
|
||||
// count new, removed and updated items
|
||||
int newItems = 0;
|
||||
int removedItems = 0;
|
||||
int updatedItems = 0;
|
||||
int ignoredItems = 0;
|
||||
|
||||
qDebug() << "OO folder slotSyncFinished: result: " << int(result.status());
|
||||
emit syncStateChange();
|
||||
SyncFileItem firstItemNew;
|
||||
SyncFileItem firstItemDeleted;
|
||||
SyncFileItem firstItemUpdated;
|
||||
|
||||
foreach (const SyncFileItem &item, _syncResult.syncFileItemVector() ) {
|
||||
if( item._instruction == CSYNC_INSTRUCTION_ERROR ) {
|
||||
slotCSyncError( tr("File %1: %2").arg(item._file).arg(item._errorString) );
|
||||
} else {
|
||||
if (item._dir == SyncFileItem::Down) {
|
||||
switch (item._instruction) {
|
||||
case CSYNC_INSTRUCTION_NEW:
|
||||
newItems++;
|
||||
if (firstItemNew.isEmpty())
|
||||
firstItemNew = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_REMOVE:
|
||||
removedItems++;
|
||||
if (firstItemDeleted.isEmpty())
|
||||
firstItemDeleted = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_UPDATED:
|
||||
updatedItems++;
|
||||
if (firstItemUpdated.isEmpty())
|
||||
firstItemUpdated = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_ERROR:
|
||||
qDebug() << "Got Instruction ERROR. " << _syncResult.errorString();
|
||||
break;
|
||||
default:
|
||||
// nothing.
|
||||
break;
|
||||
}
|
||||
} else if( item._dir == SyncFileItem::None ) { // ignored files counting.
|
||||
if( item._instruction == CSYNC_INSTRUCTION_IGNORE ) {
|
||||
ignoredItems++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_syncResult.setWarnCount(ignoredItems);
|
||||
|
||||
Logger *logger = Logger::instance();
|
||||
|
||||
qDebug() << "OO folder slotSyncFinished: result: " << int(_syncResult.status());
|
||||
if (newItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemNew._file);
|
||||
if (newItems == 1)
|
||||
logger->postGuiLog(tr("New file available"), tr("'%1' has been synced to this machine.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("New files available"), tr("'%1' and %n other file(s) have been synced to this machine.",
|
||||
"", newItems-1).arg(file));
|
||||
}
|
||||
if (removedItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemDeleted._file);
|
||||
if (removedItems == 1)
|
||||
logger->postGuiLog(tr("File removed"), tr("'%1' has been removed.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("Files removed"), tr("'%1' and %n other file(s) have been removed.",
|
||||
"", removedItems-1).arg(file));
|
||||
}
|
||||
if (updatedItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemUpdated._file);
|
||||
if (updatedItems == 1)
|
||||
logger->postGuiLog(tr("File updated"), tr("'%1' has been updated.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("Files updated"), tr("'%1' and %n other file(s) have been updated.",
|
||||
"", updatedItems-1).arg(file));
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::slotLocalPathChanged( const QString& dir )
|
||||
@@ -522,10 +597,14 @@ void Folder::slotCsyncUnavailable()
|
||||
void Folder::slotCSyncFinished()
|
||||
{
|
||||
qDebug() << "-> CSync Finished slot with error " << _csyncError;
|
||||
_watcher->setEventsEnabledDelayed(2000);
|
||||
_pollTimer.start();
|
||||
_timeSinceLastSync.restart();
|
||||
|
||||
bubbleUpSyncResult();
|
||||
|
||||
if (_csyncError) {
|
||||
_syncResult.setStatus(SyncResult::Error);
|
||||
|
||||
qDebug() << " ** error Strings: " << _errors;
|
||||
_syncResult.setErrorStrings( _errors );
|
||||
qDebug() << " * owncloud csync thread finished with error";
|
||||
@@ -541,6 +620,7 @@ void Folder::slotCSyncFinished()
|
||||
if( _thread && _thread->isRunning() ) {
|
||||
_thread->quit();
|
||||
}
|
||||
emit syncStateChange();
|
||||
ownCloudInfo::instance()->getQuotaRequest("/");
|
||||
emit syncFinished( _syncResult );
|
||||
}
|
||||
@@ -573,79 +653,6 @@ void Folder::slotTransmissionProgress(const Progress::Info& progress)
|
||||
ProgressDispatcher::instance()->setProgressInfo(alias(), newInfo);
|
||||
}
|
||||
|
||||
ServerActionNotifier::ServerActionNotifier(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void ServerActionNotifier::slotSyncFinished(const SyncResult &result)
|
||||
{
|
||||
SyncFileItemVector items = result.syncFileItemVector();
|
||||
if (items.count() == 0)
|
||||
return;
|
||||
|
||||
int newItems = 0;
|
||||
int removedItems = 0;
|
||||
int updatedItems = 0;
|
||||
SyncFileItem firstItemNew;
|
||||
SyncFileItem firstItemDeleted;
|
||||
SyncFileItem firstItemUpdated;
|
||||
foreach (const SyncFileItem &item, items) {
|
||||
if (item._dir == SyncFileItem::Down) {
|
||||
switch (item._instruction) {
|
||||
case CSYNC_INSTRUCTION_NEW:
|
||||
newItems++;
|
||||
if (firstItemNew.isEmpty())
|
||||
firstItemNew = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_REMOVE:
|
||||
removedItems++;
|
||||
if (firstItemDeleted.isEmpty())
|
||||
firstItemDeleted = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_UPDATED:
|
||||
updatedItems++;
|
||||
if (firstItemUpdated.isEmpty())
|
||||
firstItemUpdated = item;
|
||||
break;
|
||||
case CSYNC_INSTRUCTION_ERROR:
|
||||
qDebug() << "Got Instruction ERROR. " << result.errorString();
|
||||
break;
|
||||
default:
|
||||
// nothing.
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger *logger = Logger::instance();
|
||||
|
||||
if (newItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemNew._file);
|
||||
if (newItems == 1)
|
||||
logger->postGuiLog(tr("New file available"), tr("'%1' has been synced to this machine.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("New files available"), tr("'%1' and %n other file(s) have been synced to this machine.",
|
||||
"", newItems-1).arg(file));
|
||||
}
|
||||
if (removedItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemDeleted._file);
|
||||
if (removedItems == 1)
|
||||
logger->postGuiLog(tr("File removed"), tr("'%1' has been removed.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("Files removed"), tr("'%1' and %n other file(s) have been removed.",
|
||||
"", removedItems-1).arg(file));
|
||||
}
|
||||
if (updatedItems > 0) {
|
||||
QString file = QDir::toNativeSeparators(firstItemUpdated._file);
|
||||
if (updatedItems == 1)
|
||||
logger->postGuiLog(tr("File updated"), tr("'%1' has been updated.").arg(file));
|
||||
else
|
||||
logger->postGuiLog(tr("Files updated"), tr("'%1' and %n other file(s) have been updated.",
|
||||
"", updatedItems-1).arg(file));
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction direction, bool *cancel)
|
||||
{
|
||||
QString msg = direction == SyncFileItem::Down ?
|
||||
|
||||
@@ -53,17 +53,6 @@ typedef enum SyncFileStatus_s {
|
||||
STATUS_UPDATED
|
||||
} SyncFileStatus;
|
||||
|
||||
class ServerActionNotifier : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ServerActionNotifier(QObject *parent = 0);
|
||||
public slots:
|
||||
void slotSyncFinished(const SyncResult &result);
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
class Folder : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -140,7 +129,6 @@ signals:
|
||||
void scheduleToSync( const QString& );
|
||||
|
||||
public slots:
|
||||
void slotSyncFinished(const SyncResult &);
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -172,6 +160,7 @@ private slots:
|
||||
|
||||
void slotPollTimerTimeout();
|
||||
void etagRetreived(const QString &);
|
||||
void slotNetworkUnavailable();
|
||||
|
||||
/**
|
||||
* Triggered by a file system watcher on the local sync dir
|
||||
@@ -189,6 +178,8 @@ protected:
|
||||
void setProxy();
|
||||
const char* proxyTypeToCStr(QNetworkProxy::ProxyType type);
|
||||
|
||||
void bubbleUpSyncResult();
|
||||
|
||||
/**
|
||||
* Starts a sync (calling startSync)
|
||||
* if the policies allow for it
|
||||
|
||||
@@ -355,6 +355,10 @@ void FolderMan::slotScheduleSync( const QString& alias )
|
||||
|
||||
void FolderMan::setSyncEnabled( bool enabled )
|
||||
{
|
||||
if (!_syncEnabled && enabled && !_scheduleQueue.isEmpty()) {
|
||||
// We have things in our queue that were waiting the the connection to go back on.
|
||||
QTimer::singleShot(200, this, SLOT(slotScheduleFolderSync()));
|
||||
}
|
||||
_syncEnabled = enabled;
|
||||
}
|
||||
|
||||
|
||||
@@ -212,6 +212,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
||||
|
||||
int h = iconRect.bottom();
|
||||
if( !errorText.isEmpty() ) {
|
||||
h += aliasMargin;
|
||||
QRect errorRect = localPathRect;
|
||||
errorRect.setLeft( iconRect.left());
|
||||
errorRect.setTop( h );
|
||||
@@ -222,10 +223,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
||||
painter->setPen( QColor(0xaa, 0xaa, 0xaa));
|
||||
painter->drawRoundedRect( errorRect, 4, 4 );
|
||||
|
||||
QIcon warnIcon(":/mirall/resources/warning-16");
|
||||
QPoint warnPos(errorRect.left()+aliasMargin/2, errorRect.top()+aliasMargin/2);
|
||||
painter->drawPixmap( warnPos, warnIcon.pixmap(QSize(16,16)));
|
||||
|
||||
painter->setPen( Qt::white );
|
||||
painter->setFont(errorFont);
|
||||
QRect errorTextRect = errorRect;
|
||||
|
||||
@@ -358,10 +358,9 @@ FolderWizard::FolderWizard( QWidget *parent )
|
||||
setPage(Page_Target, _folderWizardTargetPage );
|
||||
}
|
||||
|
||||
setWindowTitle( tr( "%1 Folder Wizard" ).arg( Theme::instance()->appNameGUI() ) );
|
||||
#ifdef Q_WS_MAC
|
||||
setWizardStyle( QWizard::ModernStyle );
|
||||
#endif
|
||||
setWindowTitle( tr("Add Folder") );
|
||||
setOptions(QWizard::CancelButtonOnLeft);
|
||||
setButtonText(QWizard::FinishButton, tr("Add Folder"));
|
||||
}
|
||||
|
||||
FolderWizard::~FolderWizard()
|
||||
|
||||
@@ -7,29 +7,30 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>423</width>
|
||||
<height>226</height>
|
||||
<height>155</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>14</pointsize>
|
||||
</font>
|
||||
<item row="2" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Sync Directory</string>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>349</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Pick a local folder on your computer to sync:</string>
|
||||
<string>Pick a local folder on your computer to sync</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
@@ -66,7 +67,7 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="warnLabel">
|
||||
<property name="palette">
|
||||
<palette>
|
||||
@@ -152,19 +153,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>349</width>
|
||||
<height>83</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
||||
@@ -7,102 +7,14 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>520</width>
|
||||
<height>367</height>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_6">
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>14</pointsize>
|
||||
<weight>50</weight>
|
||||
<bold>false</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Synchronization Target</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_17">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Select a destination folder</string>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="addFolderButton">
|
||||
<property name="text">
|
||||
<string>Add Folder</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="refreshButton">
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" rowspan="4">
|
||||
<widget class="QTreeWidget" name="folderTreeWidget">
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="headerHidden">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Folders</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QFrame" name="warnFrame">
|
||||
<property name="palette">
|
||||
<palette>
|
||||
@@ -213,7 +125,64 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Select a destination folder</string>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="addFolderButton">
|
||||
<property name="text">
|
||||
<string>Add Folder</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="refreshButton">
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" rowspan="4">
|
||||
<widget class="QTreeWidget" name="folderTreeWidget">
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="headerHidden">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Folders</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
@@ -221,7 +190,7 @@
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>102</height>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "mirall/mirallconfigfile.h"
|
||||
|
||||
#include <QNetworkProxy>
|
||||
#include <QDir>
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
@@ -49,6 +50,16 @@ GeneralSettings::GeneralSettings(QWidget *parent) :
|
||||
|
||||
// misc
|
||||
connect(_ui->monoIconsCheckBox, SIGNAL(toggled(bool)), SLOT(saveMiscSettings()));
|
||||
|
||||
// OEM themes are not obliged to ship mono icons, so there
|
||||
// is no point in offering an option
|
||||
QString themeDir = QString::fromLatin1(":/mirall/theme/1%1/")
|
||||
.arg(Theme::instance()->systrayIconFlavor(true));
|
||||
if (QDir(themeDir).exists())
|
||||
{
|
||||
_ui->monoIconsCheckBox->setVisible(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
GeneralSettings::~GeneralSettings()
|
||||
|
||||
@@ -101,7 +101,14 @@ void IgnoreListEditor::slotUpdateLocalIgnoreList()
|
||||
|
||||
void IgnoreListEditor::slotAddPattern()
|
||||
{
|
||||
QString pattern = QInputDialog::getText(this, tr("Add Ignore Pattern"), tr("Add a new ignore pattern:"));
|
||||
bool okClicked;
|
||||
QString pattern = QInputDialog::getText(this, tr("Add Ignore Pattern"),
|
||||
tr("Add a new ignore pattern:"),
|
||||
QLineEdit::Normal, QString(), &okClicked);
|
||||
|
||||
if (!okClicked || pattern.isEmpty())
|
||||
return;
|
||||
|
||||
QListWidgetItem *item = new QListWidgetItem;
|
||||
setupItemFlags(item);
|
||||
if (pattern.startsWith("]")) {
|
||||
|
||||
@@ -23,16 +23,6 @@
|
||||
|
||||
#include "ui_itemprogressdialog.h"
|
||||
|
||||
#define TYPE_SUCCESS 1
|
||||
#define TYPE_CONFLICT 2
|
||||
#define TYPE_NEW 3
|
||||
#define TYPE_DELETED 4
|
||||
#define TYPE_ERROR 5
|
||||
#define TYPE_RENAME 6
|
||||
#define TYPE_IGNORE 7
|
||||
|
||||
#define FILE_TYPE 100
|
||||
|
||||
namespace Mirall {
|
||||
|
||||
ItemProgressDialog::ItemProgressDialog(Application*, QWidget *parent) :
|
||||
@@ -50,14 +40,16 @@ ItemProgressDialog::ItemProgressDialog(Application*, QWidget *parent) :
|
||||
this, SLOT(slotProgressErrors(const QString&, const Progress::SyncProblem&)));
|
||||
|
||||
QStringList header;
|
||||
header << tr("Folder/Time");
|
||||
header << tr("Time");
|
||||
header << tr("File");
|
||||
header << tr("Folder");
|
||||
header << tr("Action");
|
||||
header << tr("Size");
|
||||
|
||||
_ui->_treeWidget->setHeaderLabels( header );
|
||||
|
||||
_ui->_treeWidget->setColumnWidth(1, 180);
|
||||
_ui->_treeWidget->setColumnCount(5);
|
||||
_ui->_treeWidget->setRootIsDecorated(false);
|
||||
|
||||
connect(this, SIGNAL(guiLog(QString,QString)), Logger::instance(), SIGNAL(guiLog(QString,QString)));
|
||||
|
||||
@@ -70,51 +62,25 @@ ItemProgressDialog::ItemProgressDialog(Application*, QWidget *parent) :
|
||||
|
||||
void ItemProgressDialog::setSyncResultStatus(const SyncResult& result )
|
||||
{
|
||||
QString folderMessage;
|
||||
|
||||
SyncResult::Status syncStatus = result.status();
|
||||
switch( syncStatus ) {
|
||||
case SyncResult::Undefined:
|
||||
folderMessage = tr( "Undefined Folder State" );
|
||||
break;
|
||||
case SyncResult::NotYetStarted:
|
||||
folderMessage = tr( "The folder waits to start syncing." );
|
||||
break;
|
||||
case SyncResult::SyncPrepare:
|
||||
folderMessage = tr( "Determining which files to sync." );
|
||||
break;
|
||||
case SyncResult::Unavailable:
|
||||
folderMessage = tr( "Server is currently not available." );
|
||||
break;
|
||||
case SyncResult::SyncRunning:
|
||||
folderMessage = tr("Sync is running.");
|
||||
break;
|
||||
case SyncResult::Success:
|
||||
folderMessage = tr("Last Sync was successful.");
|
||||
break;
|
||||
case SyncResult::Error:
|
||||
folderMessage = tr( "Syncing Error." );
|
||||
break;
|
||||
case SyncResult::SetupError:
|
||||
folderMessage = tr( "Setup Error." );
|
||||
break;
|
||||
case SyncResult::Problem:
|
||||
folderMessage = tr( "Sync success, but warnings on individual files.");
|
||||
break;
|
||||
default:
|
||||
folderMessage = tr( "Undefined Error State." );
|
||||
}
|
||||
|
||||
_ui->_timelabel->setText(tr("%1").arg(folderMessage));
|
||||
|
||||
if( result.errorStrings().count() ) {
|
||||
if( result.errorStrings().count() ) {
|
||||
_ui->_errorLabel->setVisible(true);
|
||||
_ui->_errorLabel->setTextFormat(Qt::RichText);
|
||||
|
||||
QString errStr;
|
||||
foreach( QString err, result.errorStrings() ) {
|
||||
errStr.append(QString("<p>%1</p>").arg(err));
|
||||
QStringList errors = result.errorStrings();
|
||||
int cnt = errors.size();
|
||||
bool appendDots = false;
|
||||
if( cnt > 3 ) {
|
||||
cnt = 3;
|
||||
appendDots = true;
|
||||
}
|
||||
|
||||
for( int i = 0; i < cnt; i++) {
|
||||
errStr.append(QString("%1<br/>").arg(errors.at(i)));
|
||||
}
|
||||
if( appendDots ) {
|
||||
errStr.append(QString("..."));
|
||||
}
|
||||
_ui->_errorLabel->setText(errStr);
|
||||
} else {
|
||||
_ui->_errorLabel->setText(QString::null);
|
||||
@@ -127,28 +93,25 @@ void ItemProgressDialog::setSyncResult( const SyncResult& result )
|
||||
{
|
||||
setSyncResultStatus(result);
|
||||
|
||||
if(result.status() != SyncResult::Success ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const QString& folder = result.folder();
|
||||
qDebug() << "Setting sync result for folder " << folder;
|
||||
|
||||
QTreeWidgetItem *folderItem = findFolderItem(folder);
|
||||
if( ! folderItem ) return;
|
||||
|
||||
SyncFileItemVector::const_iterator i;
|
||||
const SyncFileItemVector& items = result.syncFileItemVector();
|
||||
QDateTime dt = QDateTime::currentDateTime();
|
||||
|
||||
for (i = items.begin(); i != items.end(); ++i) {
|
||||
const SyncFileItem& item = *i;
|
||||
QString errMsg;
|
||||
// handle ignored files here.
|
||||
if( item._instruction == CSYNC_INSTRUCTION_IGNORE ) {
|
||||
QStringList columns;
|
||||
QString timeStr = QTime::currentTime().toString("hh:mm");
|
||||
QString timeStr = timeString(dt);
|
||||
QString longTimeStr = timeString(dt, QLocale::LongFormat);
|
||||
|
||||
columns << timeStr;
|
||||
columns << item._file;
|
||||
columns << folder;
|
||||
if( item._type == SyncFileItem::File ) {
|
||||
errMsg = tr("File ignored.");
|
||||
} else if( item._type == SyncFileItem::Directory ){
|
||||
@@ -160,11 +123,12 @@ void ItemProgressDialog::setSyncResult( const SyncResult& result )
|
||||
}
|
||||
columns << errMsg;
|
||||
|
||||
QTreeWidgetItem *twitem = new QTreeWidgetItem(folderItem, columns);
|
||||
QTreeWidgetItem *twitem = new QTreeWidgetItem(columns);
|
||||
twitem->setData(0, ErrorIndicatorRole, QVariant(true) );
|
||||
twitem->setToolTip(0, longTimeStr);
|
||||
twitem->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem, true));
|
||||
_ui->_treeWidget->addTopLevelItem(twitem);
|
||||
|
||||
Q_UNUSED(twitem);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,7 +142,6 @@ void ItemProgressDialog::setupList()
|
||||
bool haveSyncResult = false;
|
||||
|
||||
foreach( Folder *f, map.values() ) {
|
||||
findFolderItem(f->alias());
|
||||
if( f->syncResult().syncTime() > dt ) {
|
||||
dt = f->syncResult().syncTime();
|
||||
lastResult = f->syncResult();
|
||||
@@ -204,11 +167,6 @@ void ItemProgressDialog::setupList()
|
||||
slotProgressErrors(prob.folder, prob);
|
||||
folderHash[prob.folder] = 1;
|
||||
}
|
||||
|
||||
foreach( const QString& folder, folderHash.keys() ) {
|
||||
decorateFolderItem(folder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ItemProgressDialog::~ItemProgressDialog()
|
||||
@@ -224,19 +182,25 @@ void ItemProgressDialog::copyToClipboard()
|
||||
int topLevelItems = _ui->_treeWidget->topLevelItemCount();
|
||||
for (int i = 0; i < topLevelItems; i++) {
|
||||
QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(i);
|
||||
ts << left << qSetFieldWidth(50)
|
||||
ts << left << qSetFieldWidth(0)
|
||||
<< item->data(0, Qt::DisplayRole).toString()
|
||||
<< right << qSetFieldWidth(6)
|
||||
<< item->data(1, Qt::DisplayRole).toString()
|
||||
<< endl;
|
||||
int childItems = item->childCount();
|
||||
for (int j = 0; j < childItems; j++) {
|
||||
QTreeWidgetItem *child =item->child(j);
|
||||
ts << left << qSetFieldWidth(0) << QLatin1String(" ")
|
||||
// time stamp
|
||||
ts << left << qSetFieldWidth(10)
|
||||
<< child->data(0,Qt::DisplayRole).toString()
|
||||
<< QString::fromLatin1(" (%1)").arg(
|
||||
child->data(1, Qt::DisplayRole).toString()
|
||||
)
|
||||
// file name
|
||||
<< qSetFieldWidth(50)
|
||||
<< child->data(1,Qt::DisplayRole).toString()
|
||||
// action
|
||||
<< qSetFieldWidth(15)
|
||||
<< child->data(2, Qt::DisplayRole).toString()
|
||||
// size
|
||||
<< qSetFieldWidth(10)
|
||||
<< child->data(3, Qt::DisplayRole).toString()
|
||||
<< qSetFieldWidth(0)
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
@@ -250,107 +214,76 @@ void ItemProgressDialog::accept()
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void ItemProgressDialog::decorateFolderItem( const QString& folder )
|
||||
void ItemProgressDialog::cleanErrors( const QString& /* folder */ ) // FIXME: Use the folder to detect which errors can be deleted.
|
||||
{
|
||||
QTreeWidgetItem *folderItem = findFolderItem(folder);
|
||||
if( ! folderItem ) return;
|
||||
int errorCnt = 0;
|
||||
_problemCounter = 0;
|
||||
QList<QTreeWidgetItem*> wipeList;
|
||||
|
||||
int childCnt = folderItem->childCount();
|
||||
for( int cnt = 0; cnt < childCnt; cnt++ ) {
|
||||
bool isErrorItem = folderItem->child(cnt)->data(0, ErrorIndicatorRole).toBool();
|
||||
if( isErrorItem ) {
|
||||
errorCnt++;
|
||||
int itemCnt = _ui->_treeWidget->topLevelItemCount();
|
||||
|
||||
for( int cnt = 0; cnt < itemCnt; cnt++ ) {
|
||||
QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(cnt);
|
||||
bool isErrorItem = item->data(0, ErrorIndicatorRole).toBool();
|
||||
if( isErrorItem ) {
|
||||
wipeList.append(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( errorCnt == 0 ) {
|
||||
folderItem->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Success));
|
||||
} else {
|
||||
// FIXME: Set a soft error icon here.
|
||||
folderItem->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem));
|
||||
}
|
||||
qDeleteAll(wipeList.begin(), wipeList.end());
|
||||
}
|
||||
|
||||
QTreeWidgetItem *ItemProgressDialog::createFolderItem(const QString& folder)
|
||||
QString ItemProgressDialog::timeString(QDateTime dt, QLocale::FormatType format) const
|
||||
{
|
||||
QStringList strings;
|
||||
strings.append(folder);
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem( _ui->_treeWidget, strings );
|
||||
item->setFirstColumnSpanned(true);
|
||||
item->setExpanded(true);
|
||||
return item;
|
||||
}
|
||||
QLocale loc = QLocale::system();
|
||||
QString timeStr;
|
||||
QDate today = QDate::currentDate();
|
||||
|
||||
QTreeWidgetItem *ItemProgressDialog::findFolderItem( const QString& folder )
|
||||
{
|
||||
QTreeWidgetItem *folderItem;
|
||||
|
||||
if( folder.isEmpty() ) return NULL;
|
||||
|
||||
if( !_folderItems.contains(folder)) {
|
||||
_folderItems[folder] = createFolderItem(folder);
|
||||
_ui->_treeWidget->addTopLevelItem(_folderItems[folder]);
|
||||
}
|
||||
folderItem = _folderItems[folder];
|
||||
|
||||
return folderItem;
|
||||
}
|
||||
|
||||
void ItemProgressDialog::cleanErrors( const QString& folder )
|
||||
{
|
||||
_problemCounter = 0;
|
||||
QList<QTreeWidgetItem*> wipeList;
|
||||
|
||||
QTreeWidgetItem *folderItem = findFolderItem(folder);
|
||||
if( ! folderItem ) return;
|
||||
|
||||
int childCnt = folderItem->childCount();
|
||||
for( int cnt = 0; cnt < childCnt; cnt++ ) {
|
||||
bool isErrorItem = folderItem->child(cnt)->data(0, ErrorIndicatorRole).toBool();
|
||||
if( isErrorItem ) {
|
||||
wipeList.append(folderItem->child(cnt));
|
||||
if( format == QLocale::NarrowFormat ) {
|
||||
if( dt.date().day() == today.day() ) {
|
||||
timeStr = loc.toString(dt.time(), QLocale::NarrowFormat);
|
||||
} else {
|
||||
timeStr = loc.toString(dt, QLocale::NarrowFormat);
|
||||
}
|
||||
} else {
|
||||
timeStr = loc.toString(dt, format);
|
||||
}
|
||||
}
|
||||
qDeleteAll(wipeList.begin(), wipeList.end());
|
||||
return timeStr;
|
||||
}
|
||||
|
||||
void ItemProgressDialog::slotProgressErrors( const QString& folder, const Progress::SyncProblem& problem )
|
||||
{
|
||||
QTreeWidgetItem *folderItem;
|
||||
|
||||
folderItem = findFolderItem(folder);
|
||||
if( !folderItem ) return;
|
||||
|
||||
QStringList columns;
|
||||
QString timeStr = problem.timestamp.toString("hh:mm");
|
||||
QString timeStr = timeString(problem.timestamp);
|
||||
QString longTimeStr = timeString(problem.timestamp, QLocale::LongFormat);
|
||||
|
||||
columns << timeStr;
|
||||
columns << problem.current_file;
|
||||
columns << folder;
|
||||
QString errMsg = tr("Problem: %1").arg(problem.error_message);
|
||||
#if 0
|
||||
if( problem.error_code == 507 ) {
|
||||
errMsg = tr("No more storage space available on server.");
|
||||
}
|
||||
#endif
|
||||
columns << errMsg;
|
||||
// FIXME: Show the error code if available.
|
||||
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(folderItem, columns);
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(columns);
|
||||
item->setData(0, ErrorIndicatorRole, QVariant(true) );
|
||||
item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem, true));
|
||||
|
||||
// Maybe we should not set the error icon for all problems but distinguish
|
||||
// by error_code. A quota problem is considered an error, others might not??
|
||||
item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Error, true));
|
||||
item->setToolTip(0, longTimeStr);
|
||||
_ui->_treeWidget->addTopLevelItem(item);
|
||||
Q_UNUSED(item);
|
||||
}
|
||||
|
||||
void ItemProgressDialog::slotProgressInfo( const QString& folder, const Progress::Info& progress )
|
||||
{
|
||||
QTreeWidgetItem *folderItem;
|
||||
folderItem = findFolderItem(folder);
|
||||
if( !folderItem ) return;
|
||||
|
||||
if( progress.kind == Progress::StartSync ) {
|
||||
cleanErrors( folder );
|
||||
folderItem->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::SyncRunning));
|
||||
}
|
||||
|
||||
if( progress.kind == Progress::EndSync ) {
|
||||
decorateFolderItem( folder );
|
||||
// decorateFolderItem( folder );
|
||||
}
|
||||
|
||||
// Ingore other events than finishing an individual up- or download.
|
||||
@@ -359,14 +292,18 @@ void ItemProgressDialog::slotProgressInfo( const QString& folder, const Progress
|
||||
}
|
||||
|
||||
QStringList columns;
|
||||
QString timeStr = progress.timestamp.toString("hh:mm");
|
||||
QString timeStr = timeString(progress.timestamp);
|
||||
QString longTimeStr = timeString(progress.timestamp, QLocale::LongFormat);
|
||||
|
||||
columns << timeStr;
|
||||
columns << progress.current_file;
|
||||
columns << progress.folder;
|
||||
columns << Progress::asResultString(progress.kind);
|
||||
columns << Utility::octetsToString( progress.file_size );
|
||||
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(folderItem, columns);
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(columns);
|
||||
item->setToolTip(0, longTimeStr);
|
||||
_ui->_treeWidget->addTopLevelItem(item);
|
||||
Q_UNUSED(item);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
#include <QDialog>
|
||||
#include <QDateTime>
|
||||
#include <QLocale>
|
||||
|
||||
#include "mirall/progressdispatcher.h"
|
||||
|
||||
#include "ui_fileitemdialog.h"
|
||||
#include "ui_itemprogressdialog.h"
|
||||
|
||||
namespace Mirall {
|
||||
class SyncResult;
|
||||
@@ -54,12 +55,9 @@ signals:
|
||||
|
||||
private:
|
||||
void setSyncResultStatus(const SyncResult& result );
|
||||
QTreeWidgetItem *createFolderItem(const QString& folder);
|
||||
QTreeWidgetItem *findFolderItem( const QString& folder );
|
||||
void cleanErrors( const QString& folder );
|
||||
void decorateFolderItem( const QString& folder );
|
||||
QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat) const;
|
||||
|
||||
QHash<QString, QTreeWidgetItem*> _folderItems;
|
||||
const int ErrorIndicatorRole;
|
||||
Ui::ItemProgressDialog *_ui;
|
||||
int _problemCounter;
|
||||
|
||||
@@ -67,13 +67,6 @@
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="_timelabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="_errorLabel">
|
||||
<property name="text">
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QSettings>
|
||||
#include <QAction>
|
||||
|
||||
#include "mirall/mirallconfigfile.h"
|
||||
#include "mirall/logger.h"
|
||||
@@ -45,11 +46,6 @@ LogWidget::LogWidget(QWidget *parent)
|
||||
font.setFamily(QLatin1String("Courier New"));
|
||||
font.setFixedPitch(true);
|
||||
document()->setDefaultFont( font );
|
||||
|
||||
MirallConfigFile cfg;
|
||||
int lines = cfg.maxLogLines();
|
||||
// qDebug() << "# ## Have " << lines << " Loglines!";
|
||||
document()->setMaximumBlockCount( lines );
|
||||
}
|
||||
|
||||
// ==============================================================================
|
||||
@@ -57,8 +53,7 @@ LogWidget::LogWidget(QWidget *parent)
|
||||
LogBrowser::LogBrowser(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
_logWidget( new LogWidget(parent) ),
|
||||
_doFileFlush(false),
|
||||
_logstream(0)
|
||||
_doFileFlush(false)
|
||||
{
|
||||
setObjectName("LogBrowser"); // for save/restoreGeometry()
|
||||
setWindowTitle(tr("Log Output"));
|
||||
@@ -118,8 +113,17 @@ LogBrowser::LogBrowser(QWidget *parent) :
|
||||
// Direct connection for log comming from this thread, and queued for the one in a different thread
|
||||
connect(Logger::instance(), SIGNAL(newLog(QString)),this,SLOT(slotNewLog(QString)), Qt::AutoConnection);
|
||||
|
||||
QAction *showLogWindow = new QAction(this);
|
||||
showLogWindow->setShortcut(QKeySequence("F12"));
|
||||
connect(showLogWindow, SIGNAL(triggered()), SLOT(close()));
|
||||
addAction(showLogWindow);
|
||||
|
||||
MirallConfigFile cfg;
|
||||
cfg.restoreGeometry(this);
|
||||
int lines = cfg.maxLogLines();
|
||||
// qDebug() << "# ## Have " << lines << " Loglines!";
|
||||
_logWidget->document()->setMaximumBlockCount( lines );
|
||||
|
||||
}
|
||||
|
||||
LogBrowser::~LogBrowser()
|
||||
@@ -128,9 +132,7 @@ LogBrowser::~LogBrowser()
|
||||
|
||||
void LogBrowser::slotNewLog( const QString& msg )
|
||||
{
|
||||
if( _logWidget->isVisible() ) {
|
||||
_logWidget->appendPlainText( msg );
|
||||
}
|
||||
_logWidget->appendPlainText( msg );
|
||||
|
||||
if( _logstream ) {
|
||||
(*_logstream) << msg << endl;
|
||||
@@ -143,9 +145,16 @@ void LogBrowser::setLogFile( const QString & name, bool flush )
|
||||
if( _logstream ) {
|
||||
_logFile.close();
|
||||
}
|
||||
_logFile.setFileName( name );
|
||||
|
||||
if(!_logFile.open(QIODevice::WriteOnly)) {
|
||||
bool openSucceeded = false;
|
||||
if (name == QLatin1String("-")) {
|
||||
openSucceeded = _logFile.open(1, QIODevice::WriteOnly);
|
||||
} else {
|
||||
_logFile.setFileName( name );
|
||||
openSucceeded = _logFile.open(QIODevice::WriteOnly);
|
||||
}
|
||||
|
||||
if(!openSucceeded) {
|
||||
QMessageBox::warning(
|
||||
this,
|
||||
tr("Error"),
|
||||
|
||||
@@ -94,12 +94,20 @@ MirallConfigFile::MirallConfigFile( const QString& appendix, bool useOldConfig )
|
||||
|
||||
void MirallConfigFile::setConfDir(const QString &value)
|
||||
{
|
||||
if( value.isEmpty() ) return;
|
||||
QString dirPath = value;
|
||||
if( dirPath.isEmpty() ) return;
|
||||
|
||||
QFileInfo fi(value);
|
||||
QFileInfo fi(dirPath);
|
||||
if ( !fi.exists() && !fi.isAbsolute() ) {
|
||||
QDir::current().mkdir(dirPath);
|
||||
QDir dir = QDir::current();
|
||||
dir.cd(dirPath);
|
||||
fi.setFile(dir.path());
|
||||
}
|
||||
if( fi.exists() && fi.isDir() ) {
|
||||
qDebug() << "** Using custom config dir " << value;
|
||||
_confDir=value;
|
||||
dirPath = fi.absoluteFilePath();
|
||||
qDebug() << "** Using custom config dir " << dirPath;
|
||||
_confDir=dirPath;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,7 @@ public:
|
||||
bool useDownloadLimit() const;
|
||||
void setUseUploadLimit(int);
|
||||
void setUseDownloadLimit(bool);
|
||||
/** in kbyte/s */
|
||||
int uploadLimit() const;
|
||||
int downloadLimit() const;
|
||||
void setUploadLimit(int kbytes);
|
||||
|
||||
@@ -296,7 +296,7 @@ void ownCloudInfo::slotGetDirectoryListingFinished()
|
||||
currentItem = reader.readElementText();
|
||||
} else if (name == QLatin1String("collection") &&
|
||||
!currentItem.isEmpty()) {
|
||||
folders.append(currentItem);
|
||||
folders.append(QUrl::fromEncoded(currentItem.toLatin1()).path());
|
||||
currentItem.clear();
|
||||
}
|
||||
}
|
||||
@@ -585,6 +585,8 @@ RequestEtagJob::RequestEtagJob(const QString& dir, QObject* parent)
|
||||
connect( _reply, SIGNAL( finished()), SLOT(slotFinished()) );
|
||||
connect( _reply, SIGNAL(error(QNetworkReply::NetworkError)),
|
||||
this, SLOT(slotError()));
|
||||
connect( _reply, SIGNAL(error(QNetworkReply::NetworkError)),
|
||||
ownCloudInfo::instance(), SLOT(slotError(QNetworkReply::NetworkError)));
|
||||
}
|
||||
|
||||
void RequestEtagJob::slotFinished()
|
||||
@@ -615,6 +617,7 @@ void RequestEtagJob::slotError()
|
||||
qDebug() << "RequestEtagJob Error: " << _reply->errorString();
|
||||
_reply->deleteLater();
|
||||
deleteLater();
|
||||
emit networkError();
|
||||
}
|
||||
|
||||
} // ns Mirall
|
||||
|
||||
@@ -178,6 +178,7 @@ private slots:
|
||||
|
||||
signals:
|
||||
void etagRetreived(const QString &etag);
|
||||
void networkError();
|
||||
};
|
||||
|
||||
} // ns Mirall
|
||||
|
||||
@@ -241,15 +241,10 @@ void OwncloudSetupWizard::testOwnCloudConnect()
|
||||
// write a temporary config.
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
|
||||
// remove a possibly existing custom config.
|
||||
if( ! _configHandle.isEmpty() ) {
|
||||
// remove the old config file.
|
||||
MirallConfigFile oldConfig( _configHandle );
|
||||
oldConfig.cleanupCustomConfig();
|
||||
if( _configHandle.isEmpty() ) {
|
||||
_configHandle = now.toString(QLatin1String("MMddyyhhmmss"));
|
||||
}
|
||||
|
||||
_configHandle = now.toString(QLatin1String("MMddyyhhmmss"));
|
||||
|
||||
MirallConfigFile cfgFile( _configHandle, true );
|
||||
QString url = _ocWizard->field(QLatin1String("OCUrl")).toString();
|
||||
if( url.isEmpty() ) return;
|
||||
@@ -484,8 +479,6 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
|
||||
// first terminate sync jobs.
|
||||
folderMan->terminateSyncProcess();
|
||||
|
||||
folderMan->unloadAllFolders();
|
||||
|
||||
bool startFromScratch = _ocWizard->field( "OCSyncFromScratch" ).toBool();
|
||||
if( startFromScratch ) {
|
||||
// first try to rename (backup) the current local dir.
|
||||
@@ -505,10 +498,6 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
|
||||
}
|
||||
}
|
||||
}
|
||||
// save the user credentials and afterwards clear the cred store.
|
||||
if( acceptCfg ) {
|
||||
cfg.acceptCustomConfig();
|
||||
}
|
||||
|
||||
// Now write the resulting folder definition if folder names are set.
|
||||
if( acceptCfg && urlHasChanged ) {
|
||||
@@ -524,6 +513,11 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
|
||||
qDebug() << "User interrupted change of configuration.";
|
||||
}
|
||||
}
|
||||
|
||||
// save the user credentials and afterwards clear the cred store.
|
||||
if( acceptCfg ) {
|
||||
cfg.acceptCustomConfig();
|
||||
}
|
||||
}
|
||||
|
||||
// clear the custom config handle
|
||||
|
||||
@@ -65,7 +65,7 @@ QString ownCloudTheme::about() const
|
||||
return QCoreApplication::translate("ownCloudTheme::about()",
|
||||
"<p>Version %2. "
|
||||
"For more information visit <a href=\"%3\">%4</a></p>"
|
||||
"<p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, ownCloud Inc. "
|
||||
"<p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, ownCloud Inc.<br>"
|
||||
"Based on Mirall by Duncan Mac-Vicar P.</small></p>"
|
||||
"%7"
|
||||
)
|
||||
|
||||
@@ -158,9 +158,10 @@ void ProgressDispatcher::setProgressInfo(const QString& folder, const Progress::
|
||||
Progress::SyncProblem err;
|
||||
err.folder = folder;
|
||||
err.current_file = newProgress.current_file;
|
||||
// its really
|
||||
err.error_message = QString::fromLocal8Bit( (const char*)newProgress.file_size );
|
||||
err.error_code = newProgress.file_size;
|
||||
err.timestamp = QTime::currentTime();
|
||||
err.error_code = newProgress.current_file_bytes;
|
||||
err.timestamp = QDateTime::currentDateTime();
|
||||
|
||||
_recentProblems.enqueue( err );
|
||||
if( _recentProblems.size() > _problemQueueSize ) {
|
||||
@@ -174,13 +175,29 @@ void ProgressDispatcher::setProgressInfo(const QString& folder, const Progress::
|
||||
if( newProgress.kind == Progress::EndSync ) {
|
||||
newProgress.overall_current_bytes = newProgress.overall_transmission_size;
|
||||
newProgress.current_file_no = newProgress.overall_file_count;
|
||||
_currentAction.remove(newProgress.folder);
|
||||
}
|
||||
if( newProgress.kind == Progress::EndDownload || newProgress.kind == Progress::EndUpload ||
|
||||
if( newProgress.kind == Progress::EndDownload ||
|
||||
newProgress.kind == Progress::EndUpload ||
|
||||
newProgress.kind == Progress::EndDelete ) {
|
||||
_recentChanges.enqueue(newProgress);
|
||||
}
|
||||
// store the last real action to help clients that start during
|
||||
// the Context-phase of an upload or download.
|
||||
if( newProgress.kind != Progress::Context ) {
|
||||
_currentAction[folder] = newProgress.kind;
|
||||
}
|
||||
|
||||
emit progressInfo( folder, newProgress );
|
||||
}
|
||||
}
|
||||
|
||||
Progress::Kind ProgressDispatcher::currentFolderContext( const QString& folder )
|
||||
{
|
||||
if( _currentAction.contains(folder)) {
|
||||
return _currentAction[folder];
|
||||
}
|
||||
return Progress::Invalid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public:
|
||||
qint64 overall_transmission_size;
|
||||
qint64 overall_current_bytes;
|
||||
|
||||
QTime timestamp;
|
||||
QDateTime timestamp;
|
||||
|
||||
} Info;
|
||||
|
||||
@@ -66,7 +66,7 @@ public:
|
||||
QString current_file;
|
||||
QString error_message;
|
||||
int error_code;
|
||||
QTime timestamp;
|
||||
QDateTime timestamp;
|
||||
} SyncProblem;
|
||||
|
||||
static QString asActionString( Kind );
|
||||
@@ -93,6 +93,8 @@ public:
|
||||
|
||||
QList<Progress::Info> recentChangedItems(int count);
|
||||
QList<Progress::SyncProblem> recentProblems(int count);
|
||||
|
||||
Progress::Kind currentFolderContext( const QString& folder );
|
||||
signals:
|
||||
/**
|
||||
@brief Signals the progress of data transmission.
|
||||
@@ -114,6 +116,7 @@ private:
|
||||
QQueue<Progress::Info> _recentChanges;
|
||||
QQueue<Progress::SyncProblem> _recentProblems;
|
||||
|
||||
QHash<QString, Progress::Kind> _currentAction;
|
||||
static ProgressDispatcher* _instance;
|
||||
};
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ SettingsDialog::SettingsDialog(Application *app, QWidget *parent) :
|
||||
_ui->setupUi(this);
|
||||
setObjectName("Settings"); // required as group for saveGeometry call
|
||||
|
||||
setWindowTitle(tr("%1 Settings").arg(Theme::instance()->appNameGUI()));
|
||||
setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI()));
|
||||
|
||||
QIcon generalIcon(QLatin1String(":/mirall/resources/settings.png"));
|
||||
QListWidgetItem *general = new QListWidgetItem(generalIcon, tr("General"), _ui->labelWidget);
|
||||
@@ -73,7 +73,6 @@ SettingsDialog::SettingsDialog(Application *app, QWidget *parent) :
|
||||
connect( app, SIGNAL(folderStateChanged(Folder*)), _accountSettings, SLOT(slotUpdateFolderState(Folder*)));
|
||||
connect( app, SIGNAL(folderStateChanged(Folder*)), SLOT(slotUpdateAccountState()));
|
||||
|
||||
connect( _accountSettings, SIGNAL(addASync()), app, SLOT(slotFolderAdded()) );
|
||||
connect( _accountSettings, SIGNAL(folderChanged()), app, SLOT(slotFoldersChanged()));
|
||||
connect( _accountSettings, SIGNAL(openFolderAlias(const QString&)),
|
||||
app, SLOT(slotFolderOpenAction(QString)));
|
||||
@@ -92,6 +91,11 @@ SettingsDialog::SettingsDialog(Application *app, QWidget *parent) :
|
||||
QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close);
|
||||
connect(closeButton, SIGNAL(pressed()), SLOT(accept()));
|
||||
|
||||
QAction *showLogWindow = new QAction(this);
|
||||
showLogWindow->setShortcut(QKeySequence("F12"));
|
||||
connect(showLogWindow, SIGNAL(triggered()), app, SLOT(slotOpenLogBrowser()));
|
||||
addAction(showLogWindow);
|
||||
|
||||
MirallConfigFile cfg;
|
||||
cfg.restoreGeometry(this);
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ public:
|
||||
// variables
|
||||
QString _file;
|
||||
QString _renameTarget;
|
||||
QString _errorString;
|
||||
csync_instructions_e _instruction;
|
||||
Direction _dir;
|
||||
Type _type;
|
||||
|
||||
@@ -94,12 +94,8 @@ QIcon Theme::trayFolderIcon( const QString& backend ) const
|
||||
QIcon Theme::themeIcon( const QString& name, bool sysTray ) const
|
||||
{
|
||||
QString flavor;
|
||||
if (sysTray && _mono) {
|
||||
#ifdef Q_OS_MAC
|
||||
flavor = QLatin1String("black");
|
||||
#else
|
||||
flavor = QLatin1String("white");
|
||||
#endif
|
||||
if (sysTray) {
|
||||
flavor = systrayIconFlavor(_mono);
|
||||
} else {
|
||||
flavor = QLatin1String("colored");
|
||||
}
|
||||
@@ -158,6 +154,21 @@ QString Theme::defaultClientFolder() const
|
||||
return appName();
|
||||
}
|
||||
|
||||
QString Theme::systrayIconFlavor(bool mono) const
|
||||
{
|
||||
QString flavor;
|
||||
if (mono) {
|
||||
#ifdef Q_OS_MAC
|
||||
flavor = QLatin1String("black");
|
||||
#else
|
||||
flavor = QLatin1String("white");
|
||||
#endif
|
||||
} else {
|
||||
flavor = QLatin1String("colored");
|
||||
}
|
||||
return flavor;
|
||||
}
|
||||
|
||||
void Theme::setSystrayUseMonoIcons(bool mono)
|
||||
{
|
||||
_mono = mono;
|
||||
|
||||
@@ -119,6 +119,8 @@ public:
|
||||
*/
|
||||
virtual QString enforcedLocale() const { return QString::null; }
|
||||
|
||||
/** colored, white or black */
|
||||
QString systrayIconFlavor(bool mono) const;
|
||||
|
||||
/**
|
||||
* Override to use a string or a custom image name.
|
||||
|
||||
@@ -124,6 +124,8 @@ QString Utility::octetsToString( qint64 octets )
|
||||
return QString::number(qRound64(qreal(octets)/qreal(mb))) + QLatin1String(" MB");
|
||||
} else if (octets >= kb) {
|
||||
return QString::number(qRound64(qreal(octets)/qreal(kb))) + QLatin1String(" KB");
|
||||
} else if (octets == 1){
|
||||
return QLatin1String("1 byte");
|
||||
} else {
|
||||
return QString::number(octets) + QLatin1String(" bytes");
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>821</width>
|
||||
<height>647</height>
|
||||
<width>484</width>
|
||||
<height>342</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>478</width>
|
||||
<height>461</height>
|
||||
<width>525</width>
|
||||
<height>193</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@@ -34,11 +34,30 @@
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Server &Address</string>
|
||||
@@ -48,7 +67,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<item>
|
||||
<widget class="Utils::FancyLineEdit" name="leUrl">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
@@ -64,6 +83,22 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -23,6 +23,7 @@ desktop.ini
|
||||
*.toc
|
||||
|
||||
*_conflict-*
|
||||
]*.~*
|
||||
|
||||
].TemporaryItems
|
||||
].Trashes
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR}/../src)
|
||||
include(owncloud_add_test.cmake)
|
||||
|
||||
owncloud_add_test(First)
|
||||
owncloud_add_test(Utility)
|
||||
|
||||
@@ -10,10 +10,10 @@ macro(owncloud_add_test test_class)
|
||||
add_executable(${OWNCLOUD_TEST_CLASS}Test test${OWNCLOUD_TEST_CLASS_LOWERCASE}.cpp ${${OWNCLOUD_TEST_CLASS}_MOCS})
|
||||
|
||||
target_link_libraries(${OWNCLOUD_TEST_CLASS}Test
|
||||
|
||||
${APPLICATION_SHORTNAME}sync
|
||||
${QT_QTTEST_LIBRARY}
|
||||
${QT_QTCORE_LIBRARY}
|
||||
)
|
||||
|
||||
add_test(NAME ${OWNCLOUD_TEST_CLASS}Test COMMAND ${OWNCLOUD_TEST_CLASS}Test)
|
||||
endmacro()
|
||||
endmacro()
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
This software is in the public domain, furnished "as is", without technical
|
||||
support, and with no warranty, express or implied, as to its usefulness for
|
||||
any purpose.
|
||||
*/
|
||||
|
||||
#ifndef MIRALL_TESTFIRST_H
|
||||
#define MIRALL_TESTFIRST_H
|
||||
|
||||
#include <QtTest>
|
||||
|
||||
|
||||
class TestFirst : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void testTheFirstThing()
|
||||
{
|
||||
QVERIFY( true );
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
58
test/testutility.h
Normal file
58
test/testutility.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
This software is in the public domain, furnished "as is", without technical
|
||||
support, and with no warranty, express or implied, as to its usefulness for
|
||||
any purpose.
|
||||
*/
|
||||
|
||||
#ifndef MIRALL_TESTUTILITY_H
|
||||
#define MIRALL_TESTUTILITY_H
|
||||
|
||||
#include <QtTest>
|
||||
|
||||
#include "mirall/utility.h"
|
||||
|
||||
using namespace Mirall::Utility;
|
||||
|
||||
class TestUtility : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void testFormatFingerprint()
|
||||
{
|
||||
QVERIFY2(formatFingerprint("68ac906495480a3404beee4874ed853a037a7a8f")
|
||||
== "68:ac:90:64:95:48:0a:34:04:be:ee:48:74:ed:85:3a:03:7a:7a:8f",
|
||||
"Utility::formatFingerprint() is broken");
|
||||
}
|
||||
void testOctetsToString()
|
||||
{
|
||||
QVERIFY(octetsToString(1) == "1 byte");
|
||||
QVERIFY(octetsToString(2) == "2 bytes");
|
||||
QVERIFY(octetsToString(1024) == "1 KB");
|
||||
QVERIFY(octetsToString(1024*1024) == "1 MB");
|
||||
QVERIFY(octetsToString(1024LL*1024*1024) == "1 GB");
|
||||
QVERIFY(octetsToString(1024LL*1024*1024*1024) == "1 TB");
|
||||
}
|
||||
|
||||
void testLaunchOnStartup()
|
||||
{
|
||||
const QString appName = "testLaunchOnStartup";
|
||||
const QString guiName = "LaunchOnStartup GUI Name";
|
||||
|
||||
QVERIFY(hasLaunchOnStartup(appName) == false);
|
||||
setLaunchOnStartup(appName, guiName, true);
|
||||
QVERIFY(hasLaunchOnStartup(appName) == true);
|
||||
setLaunchOnStartup(appName, guiName, false);
|
||||
QVERIFY(hasLaunchOnStartup(appName) == false);
|
||||
}
|
||||
|
||||
void testToCSyncScheme()
|
||||
{
|
||||
QVERIFY(toCSyncScheme("http://example.com/owncloud/") ==
|
||||
"owncloud://example.com/owncloud/");
|
||||
QVERIFY(toCSyncScheme("https://example.com/owncloud/") ==
|
||||
"ownclouds://example.com/owncloud/");
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user