added UI and parameters for two new options in shared files: max share depth and ignore duplicates

This commit is contained in:
csoler 2017-09-24 17:53:06 +02:00
parent a2ccf97b82
commit 2a99df4d48
11 changed files with 233 additions and 70 deletions

View file

@ -40,9 +40,10 @@ LocalDirectoryUpdater::LocalDirectoryUpdater(HashStorage *hc,LocalDirectoryStora
, mLastSweepTime(0), mLastTSUpdateTime(0) , mLastSweepTime(0), mLastTSUpdateTime(0)
, mDelayBetweenDirectoryUpdates(DELAY_BETWEEN_DIRECTORY_UPDATES) , mDelayBetweenDirectoryUpdates(DELAY_BETWEEN_DIRECTORY_UPDATES)
, mIsEnabled(false), mFollowSymLinks(FOLLOW_SYMLINKS_DEFAULT) , mIsEnabled(false), mFollowSymLinks(FOLLOW_SYMLINKS_DEFAULT)
, mIgnoreDuplicates(true)
/* Can be left to false, but setting it to true will force to re-hash any file that has been left unhashed in the last session.*/ /* Can be left to false, but setting it to true will force to re-hash any file that has been left unhashed in the last session.*/
, mNeedsFullRecheck(true) , mNeedsFullRecheck(true)
, mIsChecking(false), mForceUpdate(false), mIgnoreFlags (0) , mIsChecking(false), mForceUpdate(false), mIgnoreFlags (0), mMaxShareDepth(0)
{ {
} }
@ -344,4 +345,25 @@ bool LocalDirectoryUpdater::getIgnoreLists(std::list<std::string>& ignored_prefi
return true; return true;
} }
int LocalDirectoryUpdater::maxShareDepth() const
{
return mMaxShareDepth ;
}
void LocalDirectoryUpdater::setMaxShareDepth(int d)
{
if(d != mMaxShareDepth)
mNeedsFullRecheck = true ;
mMaxShareDepth = d ;
}
bool LocalDirectoryUpdater::ignoreDuplicates() const
{
return mIgnoreDuplicates;
}
void LocalDirectoryUpdater::setIgnoreDuplicates(bool b)
{
mIgnoreDuplicates = b ;
}

View file

@ -58,6 +58,12 @@ public:
void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes,uint32_t ignore_flags) ; void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes,uint32_t ignore_flags) ;
bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes,uint32_t& ignore_flags) const ; bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes,uint32_t& ignore_flags) const ;
void setMaxShareDepth(int i) ;
int maxShareDepth() const;
void setIgnoreDuplicates(bool b) ;
bool ignoreDuplicates() const;
protected: protected:
virtual void data_tick() ; virtual void data_tick() ;
@ -81,11 +87,14 @@ private:
uint32_t mDelayBetweenDirectoryUpdates; uint32_t mDelayBetweenDirectoryUpdates;
bool mIsEnabled ; bool mIsEnabled ;
bool mFollowSymLinks; bool mFollowSymLinks;
bool mIgnoreDuplicates;
bool mNeedsFullRecheck ; bool mNeedsFullRecheck ;
bool mIsChecking ; bool mIsChecking ;
bool mForceUpdate ; bool mForceUpdate ;
uint32_t mIgnoreFlags ; uint32_t mIgnoreFlags ;
uint32_t mMaxShareDepth ;
std::list<std::string> mIgnoredPrefixes ; std::list<std::string> mIgnoredPrefixes ;
std::list<std::string> mIgnoredSuffixes ; std::list<std::string> mIgnoredSuffixes ;
}; };

View file

@ -38,10 +38,12 @@ static const std::string HASH_CACHE_DURATION_SS = "HASH_CACHE_DURATION" ; // ke
static const std::string WATCH_FILE_DURATION_SS = "WATCH_FILES_DELAY" ; // key to store delay before re-checking for new files static const std::string WATCH_FILE_DURATION_SS = "WATCH_FILES_DELAY" ; // key to store delay before re-checking for new files
static const std::string WATCH_FILE_ENABLED_SS = "WATCH_FILES_ENABLED"; // key to store ON/OFF flags for file whatch static const std::string WATCH_FILE_ENABLED_SS = "WATCH_FILES_ENABLED"; // key to store ON/OFF flags for file whatch
static const std::string FOLLOW_SYMLINKS_SS = "FOLLOW_SYMLINKS"; // dereference symbolic links, or just ignore them. static const std::string FOLLOW_SYMLINKS_SS = "FOLLOW_SYMLINKS"; // dereference symbolic links, or just ignore them.
static const std::string IGNORE_DUPLICATES = "IGNORE_DUPLICATES"; // do not index files that are referenced multiple times because of links
static const std::string WATCH_HASH_SALT_SS = "WATCH_HASH_SALT"; // Salt that is used to hash directory names static const std::string WATCH_HASH_SALT_SS = "WATCH_HASH_SALT"; // Salt that is used to hash directory names
static const std::string IGNORED_PREFIXES_SS = "IGNORED_PREFIXES"; // ignore file prefixes static const std::string IGNORED_PREFIXES_SS = "IGNORED_PREFIXES"; // ignore file prefixes
static const std::string IGNORED_SUFFIXES_SS = "IGNORED_SUFFIXES"; // ignore file suffixes static const std::string IGNORED_SUFFIXES_SS = "IGNORED_SUFFIXES"; // ignore file suffixes
static const std::string IGNORE_LIST_FLAGS_SS = "IGNORED_FLAGS"; // ignore file flags static const std::string IGNORE_LIST_FLAGS_SS = "IGNORED_FLAGS"; // ignore file flags
static const std::string MAX_SHARE_DEPTH = "MAX_SHARE_DEPTH"; // maximum depth of shared directories
static const std::string FILE_SHARING_DIR_NAME = "file_sharing" ; // hard-coded directory name to store friend file lists, hash cache, etc. static const std::string FILE_SHARING_DIR_NAME = "file_sharing" ; // hard-coded directory name to store friend file lists, hash cache, etc.
static const std::string HASH_CACHE_FILE_NAME = "hash_cache.bin" ; // hard-coded directory name to store encrypted hash cache. static const std::string HASH_CACHE_FILE_NAME = "hash_cache.bin" ; // hard-coded directory name to store encrypted hash cache.

View file

@ -332,6 +332,17 @@ cleanup = true;
kv.key = WATCH_FILE_DURATION_SS; kv.key = WATCH_FILE_DURATION_SS;
kv.value = s ; kv.value = s ;
rskv->tlvkvs.pairs.push_back(kv);
}
{
std::string s ;
rs_sprintf(s, "%d", maxShareDepth()) ;
RsTlvKeyValue kv;
kv.key = MAX_SHARE_DEPTH;
kv.value = s ;
rskv->tlvkvs.pairs.push_back(kv); rskv->tlvkvs.pairs.push_back(kv);
} }
{ {
@ -342,6 +353,14 @@ cleanup = true;
rskv->tlvkvs.pairs.push_back(kv); rskv->tlvkvs.pairs.push_back(kv);
} }
{
RsTlvKeyValue kv;
kv.key = IGNORE_DUPLICATES;
kv.value = ignoreDuplicates()?"YES":"NO" ;
rskv->tlvkvs.pairs.push_back(kv);
}
{ {
RsTlvKeyValue kv; RsTlvKeyValue kv;
@ -400,6 +419,7 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
std::list<SharedDirInfo> dirList; std::list<SharedDirInfo> dirList;
std::list<std::string> ignored_prefixes,ignored_suffixes ; std::list<std::string> ignored_prefixes,ignored_suffixes ;
uint32_t ignore_flags = RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES | RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES ; uint32_t ignore_flags = RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES | RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES ;
uint32_t max_share_depth = 0;
// OS-dependent default ignore lists // OS-dependent default ignore lists
#ifdef WINDOWS_SYS #ifdef WINDOWS_SYS
@ -437,6 +457,10 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
{ {
setFollowSymLinks(kit->value == "YES") ; setFollowSymLinks(kit->value == "YES") ;
} }
else if(kit->key == IGNORE_DUPLICATES)
{
setIgnoreDuplicates(kit->value == "YES") ;
}
else if(kit->key == WATCH_FILE_ENABLED_SS) else if(kit->key == WATCH_FILE_ENABLED_SS)
{ {
setWatchEnabled(kit->value == "YES") ; setWatchEnabled(kit->value == "YES") ;
@ -480,6 +504,12 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
if(sscanf(kit->value.c_str(),"%d",&t) == 1) if(sscanf(kit->value.c_str(),"%d",&t) == 1)
ignore_flags = (uint32_t)t ; ignore_flags = (uint32_t)t ;
} }
else if(kit->key == MAX_SHARE_DEPTH)
{
int t=0 ;
if(sscanf(kit->value.c_str(),"%d",&t) == 1)
max_share_depth = (uint32_t)t ;
}
delete *it ; delete *it ;
continue ; continue ;
@ -509,6 +539,7 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
/* set directories */ /* set directories */
mLocalSharedDirs->setSharedDirectoryList(dirList); mLocalSharedDirs->setSharedDirectoryList(dirList);
mLocalDirWatcher->setIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ; mLocalDirWatcher->setIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
mLocalDirWatcher->setMaxShareDepth(max_share_depth);
load.clear() ; load.clear() ;
@ -1070,6 +1101,28 @@ bool p3FileDatabase::followSymLinks() const
RS_STACK_MUTEX(mFLSMtx) ; RS_STACK_MUTEX(mFLSMtx) ;
return mLocalDirWatcher->followSymLinks() ; return mLocalDirWatcher->followSymLinks() ;
} }
void p3FileDatabase::setIgnoreDuplicates(bool i)
{
RS_STACK_MUTEX(mFLSMtx) ;
mLocalDirWatcher->setIgnoreDuplicates(i) ;
IndicateConfigChanged();
}
bool p3FileDatabase::ignoreDuplicates() const
{
RS_STACK_MUTEX(mFLSMtx) ;
return mLocalDirWatcher->ignoreDuplicates() ;
}
void p3FileDatabase::setMaxShareDepth(int i)
{
RS_STACK_MUTEX(mFLSMtx) ;
mLocalDirWatcher->setMaxShareDepth(i) ;
IndicateConfigChanged();
}
int p3FileDatabase::maxShareDepth() const
{
RS_STACK_MUTEX(mFLSMtx) ;
return mLocalDirWatcher->maxShareDepth() ;
}
void p3FileDatabase::setWatchEnabled(bool b) void p3FileDatabase::setWatchEnabled(bool b)
{ {
RS_STACK_MUTEX(mFLSMtx) ; RS_STACK_MUTEX(mFLSMtx) ;

View file

@ -130,6 +130,12 @@ class p3FileDatabase: public p3Service, public p3Config, public ftSearch //, pub
void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes, uint32_t ignore_flags) ; void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes, uint32_t ignore_flags) ;
bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes, uint32_t& ignore_flags) ; bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes, uint32_t& ignore_flags) ;
void setIgnoreDuplicates(bool i) ;
bool ignoreDuplicates() const ;
void setMaxShareDepth(int i) ;
int maxShareDepth() const ;
// computes/gathers statistics about shared directories // computes/gathers statistics about shared directories
int getSharedDirStatistics(const RsPeerId& pid,SharedDirStats& stats); int getSharedDirStatistics(const RsPeerId& pid,SharedDirStats& stats);

View file

@ -839,10 +839,14 @@ void ftServer::setIgnoreLists(const std::list<std::string>& ignored_prefixes, co
bool ftServer::watchEnabled() { return mFileDatabase->watchEnabled() ; } bool ftServer::watchEnabled() { return mFileDatabase->watchEnabled() ; }
int ftServer::watchPeriod() const { return mFileDatabase->watchPeriod()/60 ; } int ftServer::watchPeriod() const { return mFileDatabase->watchPeriod()/60 ; }
bool ftServer::followSymLinks() const { return mFileDatabase->followSymLinks() ; } bool ftServer::followSymLinks() const { return mFileDatabase->followSymLinks() ; }
bool ftServer::ignoreDuplicates() { return mFileDatabase->ignoreDuplicates() ; }
int ftServer::maxShareDepth() const { return mFileDatabase->maxShareDepth() ; }
void ftServer::setWatchEnabled(bool b) { mFileDatabase->setWatchEnabled(b) ; } void ftServer::setWatchEnabled(bool b) { mFileDatabase->setWatchEnabled(b) ; }
void ftServer::setWatchPeriod(int minutes) { mFileDatabase->setWatchPeriod(minutes*60) ; } void ftServer::setWatchPeriod(int minutes) { mFileDatabase->setWatchPeriod(minutes*60) ; }
void ftServer::setFollowSymLinks(bool b) { mFileDatabase->setFollowSymLinks(b) ; } void ftServer::setFollowSymLinks(bool b) { mFileDatabase->setFollowSymLinks(b) ; }
void ftServer::setIgnoreDuplicates(bool ignore) { mFileDatabase->setIgnoreDuplicates(ignore); }
void ftServer::setMaxShareDepth(int depth) { mFileDatabase->setMaxShareDepth(depth) ; }
void ftServer::togglePauseHashingProcess() { mFileDatabase->togglePauseHashingProcess() ; } void ftServer::togglePauseHashingProcess() { mFileDatabase->togglePauseHashingProcess() ; }
bool ftServer::hashingProcessPaused() { return mFileDatabase->hashingProcessPaused() ; } bool ftServer::hashingProcessPaused() { return mFileDatabase->hashingProcessPaused() ; }

View file

@ -228,6 +228,12 @@ public:
virtual void togglePauseHashingProcess(); virtual void togglePauseHashingProcess();
virtual bool hashingProcessPaused(); virtual bool hashingProcessPaused();
virtual void setMaxShareDepth(int depth) ;
virtual int maxShareDepth() const;
virtual bool ignoreDuplicates() ;
virtual void setIgnoreDuplicates(bool ignore) ;
/***************************************************************/ /***************************************************************/
/*************** Data Transfer Interface ***********************/ /*************** Data Transfer Interface ***********************/
/***************************************************************/ /***************************************************************/

View file

@ -62,6 +62,9 @@ const uint32_t RS_FILE_PEER_OFFLINE = 0x00002000;
const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES = 0x0001 ; const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES = 0x0001 ;
const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES = 0x0002 ; const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES = 0x0002 ;
const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_DUPLICATES = 0x0004 ;
const uint32_t RS_FILE_SHARE_PARAMETER_DEFAULT_MAXIMUM_DEPTH = 8;
/************************************ /************************************
* Used To indicate where to search. * Used To indicate where to search.
@ -269,6 +272,12 @@ class RsFiles
virtual bool getShareDownloadDirectory() = 0; virtual bool getShareDownloadDirectory() = 0;
virtual bool shareDownloadDirectory(bool share) = 0; virtual bool shareDownloadDirectory(bool share) = 0;
virtual void setMaxShareDepth(int depth) =0;
virtual int maxShareDepth() const=0;
virtual bool ignoreDuplicates() = 0;
virtual void setIgnoreDuplicates(bool ignore) = 0;
}; };

View file

@ -59,6 +59,8 @@ TransferPage::TransferPage(QWidget * parent, Qt::WindowFlags flags)
QObject::connect(ui.prefixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ; QObject::connect(ui.prefixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.suffixesIgnoreList_LE, SIGNAL(editingFinished()), this,SLOT(updateIgnoreLists())) ; QObject::connect(ui.suffixesIgnoreList_LE, SIGNAL(editingFinished()), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.suffixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ; QObject::connect(ui.suffixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.ignoreDuplicates_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreDuplicates())) ;
QObject::connect(ui.maxDepth_SB, SIGNAL(valueChanged(int)), this,SLOT(updateMaxShareDepth(int))) ;
} }
void TransferPage::updateIgnoreLists() void TransferPage::updateIgnoreLists()
@ -116,6 +118,8 @@ void TransferPage::updateFilePermDirectDL(int i)
void TransferPage::load() void TransferPage::load()
{ {
ui.ignoreDuplicates_CB->setEnabled(rsFiles->followSymLinks()) ;
whileBlocking(ui.shareDownloadDirectoryCB)->setChecked(rsFiles->getShareDownloadDirectory()); whileBlocking(ui.shareDownloadDirectoryCB)->setChecked(rsFiles->getShareDownloadDirectory());
int u = rsFiles->watchPeriod() ; int u = rsFiles->watchPeriod() ;
@ -125,6 +129,8 @@ void TransferPage::load()
whileBlocking(ui.incomingDir)->setText(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str())); whileBlocking(ui.incomingDir)->setText(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()));
whileBlocking(ui.partialsDir)->setText(QString::fromUtf8(rsFiles->getPartialsDirectory().c_str())); whileBlocking(ui.partialsDir)->setText(QString::fromUtf8(rsFiles->getPartialsDirectory().c_str()));
whileBlocking(ui.followSymLinks_CB)->setChecked(rsFiles->followSymLinks()); whileBlocking(ui.followSymLinks_CB)->setChecked(rsFiles->followSymLinks());
whileBlocking(ui.ignoreDuplicates_CB)->setChecked(rsFiles->ignoreDuplicates());
whileBlocking(ui.maxDepth_SB)->setValue(rsFiles->maxShareDepth());
whileBlocking(ui._queueSize_SB)->setValue(rsFiles->getQueueSize()) ; whileBlocking(ui._queueSize_SB)->setValue(rsFiles->getQueueSize()) ;
@ -199,6 +205,14 @@ void TransferPage::updateDiskSizeLimit(int s)
{ {
rsFiles->setFreeDiskSpaceLimit(s) ; rsFiles->setFreeDiskSpaceLimit(s) ;
} }
void TransferPage::updateIgnoreDuplicates()
{
rsFiles->setIgnoreDuplicates(ui.ignoreDuplicates_CB->isChecked());
}
void TransferPage::updateMaxShareDepth(int s)
{
rsFiles->setMaxShareDepth(s) ;
}
void TransferPage::updateQueueSize(int s) void TransferPage::updateQueueSize(int s)
{ {
@ -243,4 +257,4 @@ void TransferPage::editDirectories()
void TransferPage::updateAutoCheckDirectories() { rsFiles->setWatchEnabled(ui.autoCheckDirectories_CB->isChecked()) ; } void TransferPage::updateAutoCheckDirectories() { rsFiles->setWatchEnabled(ui.autoCheckDirectories_CB->isChecked()) ; }
void TransferPage::updateAutoScanDirectoriesPeriod() { rsFiles->setWatchPeriod(ui.autoCheckDirectoriesDelay_SB->value()); } void TransferPage::updateAutoScanDirectoriesPeriod() { rsFiles->setWatchPeriod(ui.autoCheckDirectoriesDelay_SB->value()); }
void TransferPage::updateShareDownloadDirectory() { rsFiles->shareDownloadDirectory(ui.shareDownloadDirectoryCB->isChecked());} void TransferPage::updateShareDownloadDirectory() { rsFiles->shareDownloadDirectory(ui.shareDownloadDirectoryCB->isChecked());}
void TransferPage::updateFollowSymLinks() { rsFiles->setFollowSymLinks(ui.followSymLinks_CB->isChecked()); } void TransferPage::updateFollowSymLinks() { rsFiles->setFollowSymLinks(ui.followSymLinks_CB->isChecked()); ui.ignoreDuplicates_CB->setEnabled(ui.followSymLinks_CB->isChecked());}

View file

@ -51,6 +51,7 @@ class TransferPage: public ConfigPage
void updateMaxUploadSlots(int); void updateMaxUploadSlots(int);
void updateFilePermDirectDL(int); void updateFilePermDirectDL(int);
void updateIgnoreLists(); void updateIgnoreLists();
void updateMaxShareDepth(int);
void editDirectories() ; void editDirectories() ;
void setIncomingDirectory(); void setIncomingDirectory();
@ -61,6 +62,7 @@ class TransferPage: public ConfigPage
void updateAutoScanDirectoriesPeriod() ; void updateAutoScanDirectoriesPeriod() ;
void updateShareDownloadDirectory() ; void updateShareDownloadDirectory() ;
void updateFollowSymLinks() ; void updateFollowSymLinks() ;
void updateIgnoreDuplicates() ;
private: private:

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1126</width> <width>1312</width>
<height>1103</height> <height>1305</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="TransferPageVLayout"> <layout class="QVBoxLayout" name="TransferPageVLayout">
@ -18,7 +18,12 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="shareDownloadHLayout"> <widget class="QPushButton" name="editShareButton">
<property name="text">
<string>Edit Share</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="shareDownloadDirectoryCB"> <widget class="QCheckBox" name="shareDownloadDirectoryCB">
<property name="enabled"> <property name="enabled">
@ -32,19 +37,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="editShareButton">
<property name="text">
<string>Edit Share</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="autoCheckDirectoriesHLayout"> <layout class="QHBoxLayout" name="autoCheckDirectoriesHLayout">
<item> <item>
<widget class="QCheckBox" name="autoCheckDirectories_CB"> <widget class="QCheckBox" name="autoCheckDirectories_CB">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>Auto-check shared directories every </string> <string>Auto-check shared directories every </string>
</property> </property>
@ -88,6 +90,30 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="ignoreDuplicates_CB">
<property name="text">
<string>Ignore duplicate files/directories</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Maximum depth:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="maxDepth_SB"/>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
@ -132,16 +158,28 @@
<property name="title"> <property name="title">
<string>Incoming Directory</string> <string>Incoming Directory</string>
</property> </property>
<layout class="QGridLayout" name="incomingGBoxGLayout">
<item row="0" column="0">
<widget class="QLineEdit" name="incomingDir"> <widget class="QLineEdit" name="incomingDir">
<property name="geometry">
<rect>
<x>21</x>
<y>52</y>
<width>244</width>
<height>36</height>
</rect>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="incomingButton"> <widget class="QPushButton" name="incomingButton">
<property name="geometry">
<rect>
<x>1224</x>
<y>54</y>
<width>31</width>
<height>31</height>
</rect>
</property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>31</width> <width>31</width>
@ -171,8 +209,6 @@
</size> </size>
</property> </property>
</widget> </widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>