From e9c4a2c0399b193351687ffaa6bf7f7b32c49823 Mon Sep 17 00:00:00 2001 From: Vincent Reher Date: Mon, 12 Sep 2022 10:38:31 -0700 Subject: [PATCH] Modify class KFileItem to use a TDEHiddenFileMatcher class instance to determine whether or not a file is hidden. KFileItem is initialized to use the single default instance TDEGlobal::hiddenFileMatcher but a method is provided for installing an application-specific instance. Provide a caching mechanism to minimize calls to the match() method of the TDEHiddenFileMatcher instance after an initial determination of "hidden" for a filesystem object has been made. Change names of variables and functions to use *HiddenFiles instead of *DotFiles terminology. Signed-off-by: Vincent Reher --- tdeio/tdefile/tdediroperator.cpp | 4 +-- tdeio/tdefile/tdefiletreebranch.cpp | 2 +- tdeio/tdeio/kdirlister_p.h | 4 +-- tdeio/tdeio/tdefilefilter.cpp | 8 ++--- tdeio/tdeio/tdefilefilter.h | 18 +++++----- tdeio/tdeio/tdefileitem.cpp | 40 ++++++++++++++++++--- tdeio/tdeio/tdefileitem.h | 56 ++++++++++++++++++++++++----- 7 files changed, 102 insertions(+), 30 deletions(-) diff --git a/tdeio/tdefile/tdediroperator.cpp b/tdeio/tdefile/tdediroperator.cpp index c7dc845cc..609a2409f 100644 --- a/tdeio/tdefile/tdediroperator.cpp +++ b/tdeio/tdefile/tdediroperator.cpp @@ -301,7 +301,7 @@ void KDirOperator::slotSimpleView() void KDirOperator::slotToggleHidden( bool show ) { - dir->setShowingDotFiles( show ); + dir->setShowingHiddenFiles( show ); updateDir(); if ( m_fileView ) m_fileView->listingCompleted(); @@ -1486,7 +1486,7 @@ void KDirOperator::readConfig( TDEConfig *kc, const TQString& group ) if ( kc->readBoolEntry( TQString::fromLatin1("Show hidden files"), DefaultShowHidden ) ) { showHiddenAction->setChecked( true ); - dir->setShowingDotFiles( true ); + dir->setShowingHiddenFiles( true ); } if ( kc->readBoolEntry( TQString::fromLatin1("Sort reversed"), DefaultSortReversed ) ) diff --git a/tdeio/tdefile/tdefiletreebranch.cpp b/tdeio/tdefile/tdefiletreebranch.cpp index b55c3ffb2..cef65b181 100644 --- a/tdeio/tdefile/tdefiletreebranch.cpp +++ b/tdeio/tdefile/tdefiletreebranch.cpp @@ -62,7 +62,7 @@ KFileTreeBranch::KFileTreeBranch( KFileTreeView *parent, const KURL& url, m_root->setPixmap( 0, pix ); m_root->setText( 0, name ); - setShowingDotFiles( showHidden ); + setShowingHiddenFiles( showHidden ); connect( this, TQT_SIGNAL( refreshItems(const KFileItemList&)), this, TQT_SLOT ( slotRefreshItems( const KFileItemList& ))); diff --git a/tdeio/tdeio/kdirlister_p.h b/tdeio/tdeio/kdirlister_p.h index 0e1bfa259..25eead443 100644 --- a/tdeio/tdeio/kdirlister_p.h +++ b/tdeio/tdeio/kdirlister_p.h @@ -44,7 +44,7 @@ public: complete = false; autoUpdate = false; - isShowingDotFiles = false; + isShowingHiddenFiles = false; dirOnlyMode = false; autoErrorHandling = false; @@ -79,7 +79,7 @@ public: bool complete; bool autoUpdate; - bool isShowingDotFiles; + bool isShowingHiddenFiles; bool dirOnlyMode; bool autoErrorHandling; diff --git a/tdeio/tdeio/tdefilefilter.cpp b/tdeio/tdeio/tdefilefilter.cpp index c1663c2e8..f07676d6f 100644 --- a/tdeio/tdeio/tdefilefilter.cpp +++ b/tdeio/tdeio/tdefilefilter.cpp @@ -26,7 +26,7 @@ #include "tdefilefilter.h" KSimpleFileFilter::KSimpleFileFilter() - : m_filterDotFiles( true ), + : m_filterHiddenFiles( true ), m_filterSpecials( true ), m_modeFilter( 0 ) { @@ -37,9 +37,9 @@ KSimpleFileFilter::~KSimpleFileFilter() { } -void KSimpleFileFilter::setFilterDotFiles( bool filter ) +void KSimpleFileFilter::setFilterHiddenFiles( bool filter ) { - m_filterDotFiles = filter; + m_filterHiddenFiles = filter; } void KSimpleFileFilter::setFilterSpecials( bool filter ) @@ -84,7 +84,7 @@ bool KSimpleFileFilter::passesFilter( const KFileItem *item ) const const TQString& name = item->name(); - if ( m_filterDotFiles && item->isHidden() ) + if ( m_filterHiddenFiles && item->isHidden() ) return false; if ( m_filterSpecials && (name == dot || name == dotdot) ) diff --git a/tdeio/tdeio/tdefilefilter.h b/tdeio/tdeio/tdefilefilter.h index c6b396785..8750bc02b 100644 --- a/tdeio/tdeio/tdefilefilter.h +++ b/tdeio/tdeio/tdefilefilter.h @@ -60,27 +60,27 @@ class TDEIO_EXPORT KSimpleFileFilter : public KFileFilter { public: /** - * Creates a new filter. By default, it filters only hidden dot files + * Creates a new filter. By default, it filters only hidden files * and "." and "..". */ KSimpleFileFilter(); virtual ~KSimpleFileFilter(); /** - * Enable or disable filtering hidden dot files. + * Enable or disable filtering hidden files. * This option is enabled by default. - * @param filter true to enable filtering dot files, false to + * @param filter true to enable filtering hidden files, false to * disable - * @see filterDotFiles + * @see filterHiddenFiles */ - virtual void setFilterDotFiles( bool filter ); + virtual void setFilterHiddenFiles( bool filter ); /** - * Checks whether filtering dot files is enabled. + * Checks whether filtering hidden files is enabled. * This option is enabled by default. * @return true if filtering is enabled, false otherwise - * @see setFilterDotFiles + * @see setFilterHiddenFiles */ - bool filterDotFiles() const { return m_filterDotFiles; } + bool filterHiddenFiles() const { return m_filterHiddenFiles; } /** * Filters "." and "..", default is true. @@ -158,7 +158,7 @@ protected: private: TQStringList m_mimeFilters; - bool m_filterDotFiles :1; + bool m_filterHiddenFiles :1; bool m_filterSpecials :1; mode_t m_modeFilter; protected: diff --git a/tdeio/tdeio/tdefileitem.cpp b/tdeio/tdeio/tdefileitem.cpp index 577a8a0d7..4fbb5eedb 100644 --- a/tdeio/tdeio/tdefileitem.cpp +++ b/tdeio/tdeio/tdefileitem.cpp @@ -204,6 +204,9 @@ void KFileItem::init( bool _determineMimeTypeOnDemand ) // otherwise, determineMimeType will be able to do better. m_bMimeTypeKnown = (!_determineMimeTypeOnDemand) || accurate; } + + // initialize hidden file matching apparatus + setHiddenFileMatcher( TDEGlobal::hiddenFileMatcher() ); } void KFileItem::readUDSEntry( bool _urlIsDirectory ) @@ -830,15 +833,44 @@ bool KFileItem::isWritable() const return true; } +void KFileItem::setHiddenFileMatcher( TDEHiddenFileMatcher *hiddenFileMatcher ) +{ + kdDebug(7077) << "KFileItem::setHiddenFileMatcher(...) called for " << m_url.fileName() << " [" << hiddenFileMatcher->getCriteria() << "]" <match( m_url.fileName() ); + else // should never happen + m_bHiddenByMatcher = m_pHiddenFileMatcher->match( m_strName ); + kdDebug(7077) << "KFileItem::checkHiddenByMatcher() called for " << m_url.fileName() << " [" << m_bHiddenByMatcher << "]" <(this)->checkHiddenByMatcher(); + + kdDebug(7077) << "KFileItem::isHidden() called for " << m_url.fileName() << " [" << m_bHiddenByMatcher << "]" < #include +#include #include #include #include @@ -228,16 +229,33 @@ public: */ bool isWritable() const; - /** - * Checks whether the file is hidden. - * @return true if the file is hidden. + /** + * Sets pointer to object that encapsulates criteria for determining + * whether or not a filesystem entity is hidden based on characteristics + * of its name. Pointer is stored in @property m_pHiddenFileMatcher. */ - bool isHidden() const; + void setHiddenFileMatcher( TDEHiddenFileMatcher *hiddenFileMatcher ); + + /** + * Sets @property m_bCheckHidden to true, thereby forcing next call + * to method isHidden() to call method checkHiddenByMatcher() instead + * of simply relying on previously cached result. + */ + void reEvaluateHidden(); /** - * Returns the link destination if isLink() == true. - * @return the link destination. TQString::null if the item is not a link + Checks whether or not the current filesystem object is "hidden" by + calling the match() method of the TDEHiddenFileMatcher object stored + in @property m_pHiddenFileMatcher. Result of this check is cached in + @property m_bHiddenByMatcher. */ + void checkHiddenByMatcher(); + + /** + Checks whether or not the current filesystem object is "hidden". + */ + bool isHidden() const; + TQString linkDest() const; /** @@ -261,7 +279,7 @@ public: * @return the file size, or 0 if not known */ TDEIO::filesize_t size(bool &hasSize) const; - + //FIXME KDE4 deprecate this in favor of time(unsigned int which, bool &hasSize) /** * Requests the modification, access or creation time, depending on @p which. @@ -667,9 +685,31 @@ private: bool m_bMimeTypeKnown:1; - // Auto: check leading dot. + // Auto: always check if hidden. enum { Auto, Hidden, Shown } m_hidden:3; + /** + * If true, next call to isHidden() will force a full (re-)evaluation of + * whether or not a filesystem object is hidden based on criteria stored + * in the TDEHiddenFileMatcher object @property m_pHiddenFileMatcher. Can + * be set to true by external callers using method reEvaluateHidden(). + */ + mutable bool m_bCheckHidden:1; + + /** + * Caches result of most recent call to the TDEHiddenFileMatcher object + * @property m_pHiddenFileMatcher. True if file is "hidden" (i.e. hide-able), + * false otherwise. + */ + mutable bool m_bHiddenByMatcher:1; + + /** + * Pointer to object that encapsulates criteria for determining whether + * or not a this filesystem entity is hidden based on characteristics of + * its name. This property is set by method setHiddenFileMatcher(). + */ + mutable TDEHiddenFileMatcher *m_pHiddenFileMatcher; + // For special case like link to dirs over FTP TQString m_guessedMimeType; mutable TQString m_access;