Ticket #9880: mythgallery_filter_sort.diff

File mythgallery_filter_sort.diff, 35.8 KB (added by Trisooma <trisooma@…>, 9 years ago)
  • new file mythplugins/mythgallery/mythgallery/galleryfilter.cpp

    diff --git a/mythplugins/mythgallery/mythgallery/galleryfilter.cpp b/mythplugins/mythgallery/mythgallery/galleryfilter.cpp
    new file mode 100644
    index 0000000..eb1434f
    - +  
     1
     2#include <set>
     3#include <mythtv/libmythui/mythuitextedit.h>
     4
     5#include "galleryfilter.h"
     6
     7#include <mythtv/mythcontext.h>
     8
     9#include <mythtv/libmythui/mythuibuttonlist.h>
     10#include <mythtv/libmythui/mythuibutton.h>
     11#include <mythtv/libmythui/mythuitext.h>
     12#include <mythtv/libmythui/mythuitextedit.h>
     13
     14#include "config.h"
     15#include "galleryfilter.h"
     16#include "galleryutil.h"
     17
     18#define LOC QString("GalleryFilter:")
     19#define LOC_ERR QString("GalleryFilter, Error:")
     20
     21GalleryFilter::GalleryFilter(bool loaddefaultsettings) :
     22    m_dirFilter(""), m_typeFilter(kTypeFilterAll),
     23    m_sort(kSortOrderUnsorted),
     24    m_changed_state(0)
     25{
     26    // do nothing yet
     27    if (loaddefaultsettings)
     28    {
     29        m_dirFilter = gCoreContext->GetSetting("GalleryFilterDirectory", "");
     30        m_typeFilter = gCoreContext->GetNumSetting("GalleryFilterType", kTypeFilterAll);
     31        m_sort = gCoreContext->GetNumSetting("GallerySortOrder", kSortOrderUnsorted);
     32    }
     33}
     34
     35GalleryFilter::GalleryFilter(const GalleryFilter &gfs) :
     36    m_changed_state(0)
     37{
     38    *this = gfs;
     39}
     40
     41GalleryFilter &
     42GalleryFilter::operator=(const GalleryFilter &gfs)
     43{
     44    if (m_dirFilter != gfs.m_dirFilter)
     45    {
     46        m_dirFilter = gfs.m_dirFilter;
     47        m_changed_state = true;
     48    }
     49
     50    if (m_typeFilter != gfs.m_typeFilter)
     51    {
     52        m_typeFilter = gfs.m_typeFilter;
     53        m_changed_state = true;
     54    }
     55
     56    if (m_sort != gfs.m_sort)
     57    {
     58        m_sort = gfs.m_sort;
     59        m_changed_state = true;
     60    }
     61
     62    return *this;
     63}
     64
     65void GalleryFilter::saveAsDefault()
     66{
     67    gCoreContext->SaveSetting("GalleryFilterDirectory", m_dirFilter);
     68    gCoreContext->SaveSetting("GalleryFilterType", m_typeFilter);
     69    gCoreContext->SaveSetting("GallerySortOrder", m_sort);
     70}
     71
     72bool GalleryFilter::TestFilter(const QString& dir, const GalleryFilter& flt,
     73                               int *dirCount, int *imageCount, int *movieCount)
     74{
     75    QStringList splitFD;
     76    const QFileInfo *fi;
     77
     78    QDir d(dir);
     79    QString currDir = d.absolutePath();
     80    QFileInfoList list = d.entryInfoList(GalleryUtil::GetMediaFilter(),
     81                                         QDir::Files | QDir::AllDirs,
     82                                         (QDir::SortFlag)flt.getSort());
     83
     84    if (list.isEmpty())
     85        return false;
     86
     87    if (!flt.getDirFilter().isEmpty())
     88    {
     89        splitFD = flt.getDirFilter().split(":");
     90    }
     91   
     92   
     93    for (QFileInfoList::const_iterator it = list.begin(); it != list.end(); it++)
     94    {
     95        fi = &(*it);
     96        if (fi->fileName() == "."
     97            || fi->fileName() == "..")
     98        {
     99            continue;
     100        }
     101
     102        // remove these already-resized pictures.
     103        if ((fi->fileName().indexOf(".thumb.") > 0) ||
     104            (fi->fileName().indexOf(".sized.") > 0) ||
     105            (fi->fileName().indexOf(".highlight.") > 0))
     106        {
     107            continue;
     108        }
     109
     110        // skip filtered directory
     111        if (fi->isDir())
     112        {
     113            if (!splitFD.filter(fi->fileName(), Qt::CaseInsensitive).isEmpty())
     114            {
     115                continue;
     116            }
     117            // add directory
     118            (*dirCount)++;
     119            GalleryFilter::TestFilter(QDir::cleanPath(fi->absoluteFilePath()), flt,
     120                                      dirCount, imageCount, movieCount);
     121        }
     122        else
     123        {
     124            if (GalleryUtil::IsImage(fi->absoluteFilePath())
     125                && flt.getTypeFilter() != kTypeFilterMoviesOnly)
     126                (*imageCount)++;
     127            else if (GalleryUtil::IsMovie(fi->absoluteFilePath())
     128                && flt.getTypeFilter() != kTypeFilterImagesOnly)
     129                (*movieCount)++;
     130        }
     131    }
     132   
     133    return true;
     134}
  • new file mythplugins/mythgallery/mythgallery/galleryfilter.h

    diff --git a/mythplugins/mythgallery/mythgallery/galleryfilter.h b/mythplugins/mythgallery/mythgallery/galleryfilter.h
    new file mode 100644
    index 0000000..c18aade
    - +  
     1#ifndef GALLERYFILTER_H
     2#define GALLERYFILTER_H
     3
     4// qt
     5#include <QDir>
     6
     7#include <mythtv/libmythui/mythscreentype.h>
     8#include <mythtv/libmythdb/mythverbose.h>
     9
     10enum SortOrder {
     11    kSortOrderUnsorted = QDir::Unsorted,
     12    kSortOrderNameAsc = QDir::Name + QDir::DirsFirst + QDir::IgnoreCase,
     13    kSortOrderNameDesc = QDir::Name + QDir::Reversed + QDir::DirsFirst + QDir::IgnoreCase,
     14    kSortOrderModTimeAsc = QDir::Time + QDir::DirsFirst + QDir::IgnoreCase,
     15    kSortOrderModTimeDesc = QDir::Time + QDir::Reversed + QDir::DirsFirst + QDir::IgnoreCase,
     16    kSortOrderExtAsc = QDir::Size + QDir::DirsFirst + QDir::IgnoreCase,
     17    kSortOrderExtDesc = QDir::Size + QDir::Reversed + QDir::DirsFirst + QDir::IgnoreCase,
     18    kSortOrderSizeAsc = QDir::Type + QDir::DirsFirst + QDir::IgnoreCase,
     19    kSortOrderSizeDesc = QDir::Type + QDir::Reversed + QDir::DirsFirst + QDir::IgnoreCase
     20};
     21Q_DECLARE_METATYPE(SortOrder)
     22       
     23enum TypeFilter {
     24    kTypeFilterAll = 0,
     25    kTypeFilterImagesOnly = 1,
     26    kTypeFilterMoviesOnly = 2
     27};
     28Q_DECLARE_METATYPE(TypeFilter)
     29
     30class GalleryFilter
     31{
     32  public:
     33    static bool TestFilter(const QString& dir, const GalleryFilter& flt,
     34                           int *dirCount, int *imageCount, int *movieCount);
     35
     36    GalleryFilter(bool loaddefaultsettings = true);
     37    GalleryFilter(const GalleryFilter &gfs);
     38    GalleryFilter &operator=(const GalleryFilter &gfs);
     39
     40    void saveAsDefault();
     41
     42    QString getDirFilter() const { return m_dirFilter; }
     43    void setDirFilter(QString dirFilter)
     44    {
     45        m_changed_state  = 1;
     46        m_dirFilter = dirFilter;
     47    }
     48
     49    int getTypeFilter() const { return m_typeFilter; }
     50    void setTypeFilter(int typeFilter)
     51    {
     52        m_changed_state = 1;
     53        m_typeFilter = typeFilter;
     54    }
     55
     56    int getSort() const { return m_sort; }
     57    void setSort(int sort)
     58    {
     59        m_changed_state = 1;
     60        m_sort = sort;
     61    }
     62
     63    unsigned int getChangedState()
     64    {
     65        unsigned int ret = m_changed_state;
     66        m_changed_state = 0;
     67        return ret;
     68    }
     69    void dumpFilter(QString src)
     70    {
     71        VERBOSE(VB_EXTRA, QString("Dumping GalleryFilter from: %1")
     72                          .arg(src));
     73        VERBOSE(VB_EXTRA, QString("directory fiter: %1")
     74                          .arg(m_dirFilter));
     75        VERBOSE(VB_EXTRA, QString("type filter: %1")
     76                          .arg(m_typeFilter));
     77        VERBOSE(VB_EXTRA, QString("sort options: %1")
     78                          .arg(m_sort));
     79    }
     80
     81
     82  private:
     83    QString m_dirFilter;
     84    int m_typeFilter;
     85    int m_sort;
     86
     87    unsigned int m_changed_state;
     88};
     89
     90#endif /* GALLERYFILTER_H */
  • new file mythplugins/mythgallery/mythgallery/galleryfilterdlg.cpp

    diff --git a/mythplugins/mythgallery/mythgallery/galleryfilterdlg.cpp b/mythplugins/mythgallery/mythgallery/galleryfilterdlg.cpp
    new file mode 100644
    index 0000000..1df5786
    - +  
     1/* ============================================================
     2 * File  : galleryfilterdlg.cpp
     3 * Description :
     4 *
     5 * This program is free software; you can redistribute it
     6 * and/or modify it under the terms of the GNU General
     7 * Public License as published bythe Free Software Foundation;
     8 * either version 2, or (at your option)
     9 * any later version.
     10 *
     11 * This program is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 * GNU General Public License for more details.
     15 *
     16 * ============================================================ */
     17
     18#include "galleryfilter.h"
     19
     20using namespace std;
     21
     22// Qt headers
     23#include <QApplication>
     24#include <QEvent>
     25//#include <QDir>
     26//#include <QMatrix>
     27#include <QList>
     28//#include <QFileInfo>
     29
     30// MythTV headers
     31#include <mythtv/util.h>
     32#include <mythtv/mythdbcon.h>
     33#include <mythtv/libmythui/mythuibuttonlist.h>
     34//#include <mythtv/httpcomms.h>
     35#include <mythtv/mythcontext.h>
     36#include <mythtv/libmythdb/mythverbose.h>
     37//#include <mythtv/libmythui/mythmainwindow.h>
     38//#include <mythtv/libmythui/mythprogressdialog.h>
     39//#include <mythtv/mythmediamonitor.h>
     40
     41// MythGallery headers
     42//#include "galleryutil.h"
     43//#include "gallerysettings.h"
     44#include "galleryfilterdlg.h"
     45#include "galleryfilter.h"
     46//#include "thumbgenerator.h"
     47//#include "iconview.h"
     48//#include "singleview.h"
     49//#include "glsingleview.h"
     50
     51#define LOC QString("GalleryFilterDlg:")
     52#define LOC_ERR QString("GalleryFilterDlg, Error:")
     53
     54class FilterScanThread : public QThread
     55{
     56  public:
     57    FilterScanThread(const QString& dir, const GalleryFilter& flt,
     58                     int *dirCount, int *imageCount, int *movieCount);
     59    virtual void run();
     60
     61  private:
     62    GalleryFilter m_filter;
     63    QString m_dir;
     64    int *m_dirCount;
     65    int *m_imgCount;
     66    int *m_movCount;
     67};
     68
     69FilterScanThread::FilterScanThread(const QString& dir, const GalleryFilter& flt,
     70                                   int *dirCount, int *imageCount, int *movieCount)
     71{
     72    m_dir = dir;
     73    m_filter = flt;
     74    m_dirCount = dirCount;
     75    m_imgCount = imageCount;
     76    m_movCount = movieCount;
     77}
     78
     79void FilterScanThread::run()
     80{
     81    GalleryFilter::TestFilter(m_dir, m_filter, m_dirCount, m_imgCount, m_movCount);
     82}
     83
     84GalleryFilterDialog::GalleryFilterDialog(MythScreenStack *parent, QString name, GalleryFilter *filter)
     85            : MythScreenType(parent, name)
     86{
     87    m_settingsOriginal = filter;
     88    m_settingsOriginal->dumpFilter("GalleryFilterDialog:ctor (original)");
     89    m_settingsTemp = new GalleryFilter();
     90    *m_settingsTemp = *filter;
     91    m_settingsTemp->dumpFilter("GalleryFilterDialog:ctor (temporary)");
     92    m_photoDir = gCoreContext->GetSetting("GalleryDir", "");
     93    m_scanning = false;
     94}
     95
     96GalleryFilterDialog::~GalleryFilterDialog()
     97{
     98    delete m_settingsTemp;
     99}
     100
     101bool GalleryFilterDialog::Create()
     102{
     103    if (!LoadWindowFromXML("gallery-ui.xml", "filter", this))
     104        return false;
     105
     106    bool err = false;
     107
     108    UIUtilE::Assign(this, m_dirFilter, "dirfilter_text", &err);
     109    UIUtilE::Assign(this, m_typeFilter, "typefilter_select", &err);
     110    UIUtilE::Assign(this, m_sortList, "sort_select", &err);
     111    UIUtilE::Assign(this, m_checkButton, "check_button", &err);
     112    UIUtilE::Assign(this, m_doneButton, "done_button", &err);
     113    UIUtilE::Assign(this, m_saveButton, "save_button", &err);
     114    UIUtilE::Assign(this, m_numImagesText, "numimages_text", &err);
     115
     116    if (err)
     117    {
     118        VERBOSE(VB_IMPORTANT, "Cannot load screen 'filter'");
     119        return false;
     120    }
     121
     122    BuildFocusList();
     123   
     124    fillWidgets();
     125
     126    connect(m_dirFilter, SIGNAL(valueChanged()), SLOT(setDirFilter()));
     127    connect(m_typeFilter, SIGNAL(itemSelected(MythUIButtonListItem*)),
     128                          SLOT(setTypeFilter(MythUIButtonListItem*)));
     129    connect(m_sortList, SIGNAL(itemSelected(MythUIButtonListItem*)),
     130                        SLOT(setSort(MythUIButtonListItem*)));
     131    connect(m_checkButton, SIGNAL(Clicked()), SLOT(updateFilter()));
     132    connect(m_saveButton, SIGNAL(Clicked()), SLOT(saveAsDefault()));
     133    connect(m_doneButton, SIGNAL(Clicked()), SLOT(saveAndExit()));
     134   
     135    SetFocusWidget(m_dirFilter);
     136   
     137    return true;
     138}
     139
     140void GalleryFilterDialog::fillWidgets()
     141{
     142    // Directory filter
     143    m_dirFilter->SetText(m_settingsTemp->getDirFilter(), false);
     144   
     145    // Type Filter
     146    new MythUIButtonListItem(m_typeFilter, QObject::tr("All"),
     147                             kTypeFilterAll);
     148    new MythUIButtonListItem(m_typeFilter, QObject::tr("Images only"),
     149                             kTypeFilterImagesOnly);
     150    new MythUIButtonListItem(m_typeFilter, QObject::tr("Movies only"),
     151                             kTypeFilterMoviesOnly);
     152    m_typeFilter->SetValueByData(m_settingsTemp->getTypeFilter());
     153    m_numImagesText->SetText("Filter result : (unknown)");
     154
     155    // Sort order
     156    new MythUIButtonListItem(m_sortList, QObject::tr("Unsorted"),
     157                             kSortOrderUnsorted);
     158    new MythUIButtonListItem(m_sortList, QObject::tr("Name (A-Z alpha)"),
     159                             kSortOrderNameAsc);
     160    new MythUIButtonListItem(m_sortList, QObject::tr("Reverse Name (Z-A alpha)"),
     161                             kSortOrderNameDesc);
     162    new MythUIButtonListItem(m_sortList, QObject::tr("Mod Time (oldest first)"),
     163                             kSortOrderModTimeAsc);
     164    new MythUIButtonListItem(m_sortList, QObject::tr("Reverse Mod Time (most recent first)"),
     165                             kSortOrderModTimeDesc);
     166    new MythUIButtonListItem(m_sortList, QObject::tr("Extension (A-Z alpha)"),
     167                             kSortOrderExtAsc);
     168    new MythUIButtonListItem(m_sortList, QObject::tr("Reverse Extension (Z-A alpha)"),
     169                             kSortOrderExtDesc);
     170    new MythUIButtonListItem(m_sortList, QObject::tr("Filesize (smallest first)"),
     171                             kSortOrderSizeAsc);
     172    new MythUIButtonListItem(m_sortList, QObject::tr("Reverse Filesize (largest first)"),
     173                             kSortOrderSizeDesc);
     174    m_sortList->SetValueByData(m_settingsTemp->getSort());
     175}
     176
     177void GalleryFilterDialog::updateFilter()
     178{
     179    if (m_scanning)
     180    {
     181        m_numImagesText->SetText("-- please be patient --");
     182        return;
     183    }
     184    else
     185    {
     186        m_scanning = true;
     187    }
     188
     189    int dir_count = 0;
     190    int img_count = 0;
     191    int mov_count = 0;
     192
     193    m_numImagesText->SetText("-- scanning current filter --");
     194   
     195    FilterScanThread *fltScan = new FilterScanThread(m_photoDir, *m_settingsTemp, &dir_count, &img_count, &mov_count);
     196    fltScan->start();
     197
     198    while (!fltScan->isFinished())
     199    {
     200        usleep(500);
     201        qApp->processEvents();
     202    }
     203   
     204    if (dir_count + img_count + mov_count == 0)
     205    {
     206        m_numImagesText->SetText(QString(tr("No files / directories found")));
     207    }
     208    else
     209    {
     210        if (dir_count > 0)
     211        {
     212            if (img_count + mov_count == 0)
     213                m_numImagesText->SetText(QString(tr("Filter result : %1 directories found but no files"))
     214                                         .arg(dir_count));
     215            else {
     216                if (img_count == 0)
     217                    m_numImagesText->SetText(QString(tr("Filter result : %1 directories, %2 movie(s) found"))
     218                                             .arg(dir_count)
     219                                             .arg(mov_count));
     220                else if (mov_count == 0)
     221                    m_numImagesText->SetText(QString(tr("Filter result : %1 directories, %2 image(s) found"))
     222                                             .arg(dir_count)
     223                                             .arg(img_count));
     224                else
     225                    m_numImagesText->SetText(QString(tr("Filter result : %1 directories, %2 image(s) and %3 movie(s) found"))
     226                                             .arg(dir_count)
     227                                             .arg(img_count)
     228                                             .arg(mov_count));
     229            }
     230               
     231        }
     232        else
     233        {
     234            if (img_count > 0 && mov_count > 0)
     235                m_numImagesText->SetText(QString(tr("Filter result : %1 image(s) and %2 movie(s) found"))
     236                                         .arg(img_count)
     237                                         .arg(mov_count));
     238            else if (mov_count == 0)
     239                m_numImagesText->SetText(QString(tr("Filter result : %1 image(s) found"))
     240                                         .arg(img_count));
     241            else
     242                m_numImagesText->SetText(QString(tr("Filter result : %1 movie(s) found"))
     243                                         .arg(mov_count));
     244        }
     245    }
     246   
     247    m_scanning = false;
     248}
     249
     250void GalleryFilterDialog::setDirFilter(void)
     251{
     252    m_settingsTemp->setDirFilter(m_dirFilter->GetText());
     253}
     254
     255void GalleryFilterDialog::setTypeFilter(MythUIButtonListItem *item)
     256{
     257    m_settingsTemp->setTypeFilter(item->GetData().toInt());
     258}
     259
     260void GalleryFilterDialog::setSort(MythUIButtonListItem *item)
     261{
     262    m_settingsTemp->setSort(item->GetData().toInt());
     263}
     264
     265void GalleryFilterDialog::saveAsDefault()
     266{
     267    // Save defaults from temp settings
     268    m_settingsTemp->saveAsDefault();
     269    saveAndExit();
     270}
     271
     272void GalleryFilterDialog::saveAndExit()
     273{
     274    *m_settingsOriginal = *m_settingsTemp;
     275
     276    m_settingsOriginal->dumpFilter("GalleryFilterDialog::saveAndExit()");
     277
     278    if (m_settingsOriginal->getChangedState() > 0)
     279    {
     280        emit filterChanged();
     281    }
     282
     283    Close();
     284}
  • new file mythplugins/mythgallery/mythgallery/galleryfilterdlg.h

    diff --git a/mythplugins/mythgallery/mythgallery/galleryfilterdlg.h b/mythplugins/mythgallery/mythgallery/galleryfilterdlg.h
    new file mode 100644
    index 0000000..e0a48f5
    - +  
     1/* ============================================================
     2 * File  : galleryfilterdlg.h
     3 * Description :
     4 *
     5
     6 * This program is free software; you can redistribute it
     7 * and/or modify it under the terms of the GNU General
     8 * Public License as published bythe Free Software Foundation;
     9 * either version 2, or (at your option)
     10 * any later version.
     11 *
     12 * This program is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * ============================================================ */
     18
     19#ifndef GALLERYFILTERDLG_H
     20#define GALLERYFILTERDLG_H
     21
     22// Qt headers
     23#include <QThread>
     24
     25// MythTV headers
     26#include <mythtv/libmythui/mythscreentype.h>
     27#include <mythtv/libmythui/mythuitext.h>
     28#include <mythtv/libmythui/mythuibutton.h>
     29#include <mythtv/libmythui/mythuibuttonlist.h>
     30#include <mythtv/libmythui/mythuiimage.h>
     31#include <mythtv/libmythui/mythdialogbox.h>
     32#include <mythtv/mythmedia.h>
     33
     34#include "galleryfilter.h"
     35
     36using namespace std;
     37
     38class GalleryFilter;
     39class GalleryFilterDialog : public MythScreenType
     40{
     41
     42  Q_OBJECT
     43
     44  public:
     45    GalleryFilterDialog(MythScreenStack *parent, QString name, GalleryFilter *filter);
     46    ~GalleryFilterDialog();
     47
     48    bool Create();
     49
     50  signals:
     51    void filterChanged();
     52   
     53  public slots:
     54    void saveAndExit();
     55    void saveAsDefault();
     56    void updateFilter();
     57    void setDirFilter(void);
     58    void setTypeFilter(MythUIButtonListItem *item);
     59    void setSort(MythUIButtonListItem *item);
     60
     61 private:
     62    void fillWidgets();
     63   
     64    bool               m_scanning;
     65    QString            m_photoDir;
     66    GalleryFilter     *m_settingsOriginal;
     67    GalleryFilter     *m_settingsTemp;
     68
     69    MythUITextEdit    *m_dirFilter;
     70    MythUIButtonList  *m_typeFilter;
     71    MythUIText        *m_numImagesText;
     72    MythUIButtonList  *m_sortList;
     73    MythUIButton      *m_checkButton;
     74    MythUIButton      *m_saveButton;
     75    MythUIButton      *m_doneButton;
     76};
     77
     78#endif /* GALLERYFILTERDLG_H */
  • mythplugins/mythgallery/mythgallery/gallerysettings.cpp

    diff --git a/mythplugins/mythgallery/mythgallery/gallerysettings.cpp b/mythplugins/mythgallery/mythgallery/gallerysettings.cpp
    index d32fec6..c3a1885 100644
    a b  
    88// mythgallery
    99#include "config.h"
    1010#include "gallerysettings.h"
     11#include "galleryfilter.h"
    1112
    1213// General Settings
    1314
     15static HostLineEdit *MythGalleryFilter()
     16{
     17    HostLineEdit *gc = new HostLineEdit("GalleryFilterDirectory");
     18    gc->setLabel(QObject::tr("Directory filter"));
     19    gc->setValue("");
     20    gc->setHelpText(QObject::tr("Enter direcory names to be excluded in browser. "
     21                                "(multiple entries delimited with ':')"));
     22    return gc;
     23};
     24
     25static HostComboBox *MythGalleryFilterType()
     26{
     27    HostComboBox *gc = new HostComboBox("GalleryFilterType");
     28    gc->setLabel(QObject::tr("Type filter"));
     29    gc->addSelection("All", QString::number(kTypeFilterAll));
     30    gc->addSelection("Images only", QString::number(kTypeFilterImagesOnly));
     31    gc->addSelection("Movies only", QString::number(kTypeFilterMoviesOnly));
     32    gc->setHelpText(QObject::tr("This is the type filter for the displayed "
     33                    "thumbnails."));
     34    return gc;
     35};
    1436static HostLineEdit *MythGalleryDir()
    1537{
    1638    HostLineEdit *gc = new HostLineEdit("GalleryDir");
    static HostComboBox *MythGallerySortOrder() 
    3860{
    3961    HostComboBox *gc = new HostComboBox("GallerySortOrder");
    4062    gc->setLabel(QObject::tr("Sort order when browsing"));
     63    gc->addSelection("Unsorted", QString::number(QDir::Unsorted));
    4164    gc->addSelection("Name (A-Z alpha)", QString::number(QDir::Name | QDir::DirsFirst | QDir::IgnoreCase));
    4265    gc->addSelection("Reverse Name (Z-A alpha)", QString::number(QDir::Name | QDir::DirsFirst | QDir::IgnoreCase | QDir::Reversed));
    4366    gc->addSelection("Mod Time (earliest first)", QString::number(QDir::Time | QDir::DirsFirst | QDir::IgnoreCase | QDir::Reversed));
    4467    gc->addSelection("Reverse Mod Time (most recent first)", QString::number(QDir::Time | QDir::DirsFirst | QDir::IgnoreCase));
     68    gc->addSelection("Extension (A-Z alpha)", QString::number(QDir::Size | QDir::DirsFirst | QDir::IgnoreCase));
     69    gc->addSelection("Reverse Extension (Z-A alpha", QString::number(QDir::Size | QDir::Reversed | QDir::DirsFirst | QDir::IgnoreCase));
     70    gc->addSelection("Filesize (smallest first)", QString::number(QDir::Type | QDir::DirsFirst | QDir::IgnoreCase));
     71    gc->addSelection("Reverse Filesize (largest first)", QString::number(QDir::Type | QDir::Reversed | QDir::DirsFirst | QDir::IgnoreCase));
    4572    gc->setHelpText(QObject::tr("This is the sort order for the displayed "
    4673                    "picture thumbnails."));
    4774    return gc;
    GallerySettings::GallerySettings() 
    228255    general->addChild(MythGalleryImportDirs());
    229256    general->addChild(MythGalleryAutoLoad());
    230257    general->addChild(MythGalleryMoviePlayerCmd());
     258    general->addChild(MythGalleryFilter());
     259    general->addChild(MythGalleryFilterType());
    231260    addChild(general);
    232261
    233262    GalleryConfigurationGroup* config = new GalleryConfigurationGroup();
  • mythplugins/mythgallery/mythgallery/galleryutil.cpp

    diff --git a/mythplugins/mythgallery/mythgallery/galleryutil.cpp b/mythplugins/mythgallery/mythgallery/galleryutil.cpp
    index b4a3b3e..e572e22 100644
    a b long GalleryUtil::GetNaturalRotation(const QString &filePathString) 
    206206}
    207207
    208208bool GalleryUtil::LoadDirectory(ThumbList& itemList, const QString& dir,
    209                                 int sortorder, bool recurse,
     209                                const GalleryFilter& flt, bool recurse,
    210210                                ThumbHash *itemHash, ThumbGenerator* thumbGen)
    211211{
    212212    QString blah = dir;
    213213    QDir d(blah);
    214214    QString currDir = d.absolutePath();
     215    QStringList splitFD;
    215216
    216217    bool isGallery;
    217218    QFileInfoList gList = d.entryInfoList(QStringList("serial*.dat"),
    bool GalleryUtil::LoadDirectory(ThumbList& itemList, const QString& dir, 
    224225
    225226    QFileInfoList list = d.entryInfoList(GetMediaFilter(),
    226227                                         QDir::Files | QDir::AllDirs,
    227                                          (QDir::SortFlag)sortorder);
     228                                         (QDir::SortFlag)flt.getSort());
    228229
    229230    if (list.isEmpty())
    230231        return false;
    bool GalleryUtil::LoadDirectory(ThumbList& itemList, const QString& dir, 
    238239        thumbGen->setDirectory(currDir, isGallery);
    239240    }
    240241
     242    if (!flt.getDirFilter().isEmpty())
     243    {
     244        splitFD = flt.getDirFilter().split(":");
     245    }
     246
    241247    while (it != list.end())
    242248    {
    243249        fi = &(*it);
    bool GalleryUtil::LoadDirectory(ThumbList& itemList, const QString& dir, 
    252258                (fi->fileName().indexOf(".highlight.") > 0)))
    253259            continue;
    254260
     261        // skip filtered directory
     262        if (fi->isDir() && !splitFD.filter(fi->fileName(), Qt::CaseInsensitive).isEmpty())
     263        {
     264            continue;
     265        }
     266
    255267        if (fi->isDir() && recurse)
    256268        {
    257             GalleryUtil::LoadDirectory(
     269            LoadDirectory(
    258270                itemList, QDir::cleanPath(fi->absoluteFilePath()),
    259                 sortorder, true, itemHash, thumbGen);
     271                flt, true, itemHash, thumbGen);
    260272        }
    261273        else
    262274        {
     275            if ((GalleryUtil::IsImage(fi->absoluteFilePath())
     276                    && flt.getTypeFilter() == kTypeFilterMoviesOnly)
     277             || (GalleryUtil::IsMovie(fi->absoluteFilePath())
     278                    && flt.getTypeFilter() == kTypeFilterImagesOnly))
     279                continue;
     280
    263281            ThumbItem *item = new ThumbItem(
    264282                fi->fileName(),
    265283                QDir::cleanPath(fi->absoluteFilePath()), fi->isDir());
  • mythplugins/mythgallery/mythgallery/galleryutil.h

    diff --git a/mythplugins/mythgallery/mythgallery/galleryutil.h b/mythplugins/mythgallery/mythgallery/galleryutil.h
    index 3e7b5ff..15a4c0b 100644
    a b  
    1717 *
    1818 * ============================================================ */
    1919
    20 #ifndef EXIFUTIL_H
    21 #define EXIFUTIL_H
     20#ifndef GALLERYUTIL_H
     21#define GALLERYUTIL_H
    2222
    2323#include <QFileInfo>
    2424
    class GalleryUtil 
    4545    static QString GetCaption(const QString &filePath);
    4646
    4747    static bool LoadDirectory(ThumbList &itemList, const QString &dir,
    48                               int sortorder, bool recurse,
     48                              const GalleryFilter& flt, bool recurse,
    4949                              ThumbHash *itemHash, ThumbGenerator *thumbGen);
    5050
    5151    static QSize ScaleToDest(const QSize &sz, const QSize &dest, ScaleMax scaleMax);
    class GalleryUtil 
    6767                                const QString &newName);
    6868};
    6969
    70 #endif /* EXIFUTIL_H */
     70#endif /* GALLERYUTIL_H */
  • mythplugins/mythgallery/mythgallery/iconview.cpp

    diff --git a/mythplugins/mythgallery/mythgallery/iconview.cpp b/mythplugins/mythgallery/mythgallery/iconview.cpp
    index ea8e766..0161fbf 100644
    a b using namespace std; 
    4242#include <mythmainwindow.h>
    4343#include <mythprogressdialog.h>
    4444#include <mythmediamonitor.h>
     45#include <mythtv/libmythdb/mythverbose.h>
    4546
    4647// MythGallery headers
    4748#include "galleryutil.h"
    4849#include "gallerysettings.h"
     50#include "galleryfilter.h"
    4951#include "thumbgenerator.h"
    5052#include "iconview.h"
    5153#include "singleview.h"
    IconView::IconView(MythScreenStack *parent, const char *name, 
    104106        : MythScreenType(parent, name)
    105107{
    106108    m_galleryDir = galleryDir;
     109    m_galleryFilter = new GalleryFilter();
    107110
    108111    m_isGallery = false;
    109112    m_showDevices = false;
    IconView::~IconView() 
    143146        delete m_thumbGen;
    144147        m_thumbGen = NULL;
    145148    }
    146 
     149    if (m_galleryFilter)
     150    {
     151        delete m_galleryFilter;
     152        m_galleryFilter = NULL;
     153    }
    147154    if (m_childCountThread)
    148155    {
    149156        delete m_childCountThread;
    void IconView::LoadDirectory(const QString &dir) 
    234241    m_itemHash.clear();
    235242    m_imageList->Reset();
    236243
    237     m_isGallery = GalleryUtil::LoadDirectory(m_itemList, dir, m_sortorder,
     244    m_isGallery = GalleryUtil::LoadDirectory(m_itemList, dir, *m_galleryFilter,
    238245                                             false, &m_itemHash, m_thumbGen);
    239246
    240247    if (m_thumbGen && !m_thumbGen->isRunning())
    void IconView::customEvent(QEvent *event) 
    797804                    HandleSubMenuMark();
    798805                    break;
    799806                case 4:
    800                     HandleSubMenuFile();
     807                    HandleSubMenuFilter();
    801808                    break;
    802809                case 5:
     810                    HandleSubMenuFile();
     811                    break;
     812                case 6:
    803813                    HandleSettings();
    804814                    break;
    805815            }
    void IconView::customEvent(QEvent *event) 
    871881
    872882}
    873883
     884void IconView::reloadData()
     885{
     886    LoadDirectory(m_galleryDir);
     887}
     888
    874889void IconView::HandleMainMenu(void)
    875890{
    876891    QString label = tr("Gallery Options");
    void IconView::HandleMainMenu(void) 
    890905    m_menuPopup->AddButton(tr("Random"));
    891906    m_menuPopup->AddButton(tr("Meta Data Menu"));
    892907    m_menuPopup->AddButton(tr("Marking Menu"));
     908    m_menuPopup->AddButton(tr("Filter / Sort Menu"));
    893909    m_menuPopup->AddButton(tr("File Menu"));
    894910    m_menuPopup->AddButton(tr("Settings"));
    895911//     if (m_showDevices)
    void IconView::HandleSubMenuMark(void) 
    937953    m_menuPopup->AddButton(tr("Clear Marked"));
    938954}
    939955
     956void IconView::HandleSubMenuFilter(void)
     957{
     958    MythScreenStack *mainStack = GetScreenStack();
     959
     960    GalleryFilterDialog *filterdialog = new GalleryFilterDialog(mainStack,
     961                                                                "galleryfilter", m_galleryFilter);
     962
     963    if (filterdialog->Create())
     964        mainStack->AddScreen(filterdialog);
     965
     966    connect(filterdialog, SIGNAL(filterChanged()), SLOT(reloadData()));
     967}
     968
    940969void IconView::HandleSubMenuFile(void)
    941970{
    942971    QString label = tr("File Options");
  • mythplugins/mythgallery/mythgallery/iconview.h

    diff --git a/mythplugins/mythgallery/mythgallery/iconview.h b/mythplugins/mythgallery/mythgallery/iconview.h
    index 1b57e63..a6bc372 100644
    a b  
    3636#include <mythmedia.h>
    3737
    3838// MythGallery headers
     39#include "galleryfilter.h"
     40#include "galleryfilterdlg.h"
    3941#include "thumbview.h"
    4042
    4143using namespace std;
    class IconView : public MythScreenType 
    7678    void HandleMainMenu(void);
    7779    void HandleSubMenuMetadata(void);
    7880    void HandleSubMenuMark(void);
     81    void HandleSubMenuFilter(void);
    7982    void HandleSubMenuFile(void);
    8083
    8184  private slots:
    class IconView : public MythScreenType 
    116119    QStringList         m_itemMarked;
    117120    QString             m_galleryDir;
    118121    vector<int>         m_history;
     122    GalleryFilter      *m_galleryFilter;
    119123
    120124    MythUIButtonList   *m_imageList;
    121125    MythUIText         *m_captionText;
    class IconView : public MythScreenType 
    142146
    143147    QString             m_errorStr;
    144148
     149  protected slots:
     150    void reloadData();
     151
    145152  public slots:
    146153    void mediaStatusChanged(MediaStatus oldStatus, MythMediaDevice *pMedia);
    147154    void HandleItemSelect(MythUIButtonListItem *);
  • mythplugins/mythgallery/mythgallery/mythgallery.pro

    diff --git a/mythplugins/mythgallery/mythgallery/mythgallery.pro b/mythplugins/mythgallery/mythgallery/mythgallery.pro
    index cf8219a..b916627 100644
    a b INCLUDEPATH += $${PREFIX}/include/mythtv 
    1919# Input
    2020HEADERS += iconview.h          singleview.h
    2121HEADERS += imageview.h
     22HEADERS += galleryfilter.h galleryfilterdlg.h
    2223HEADERS += gallerysettings.h   dbcheck.h
    2324HEADERS += galleryutil.h
    2425HEADERS += thumbgenerator.h    thumbview.h
    2526SOURCES += iconview.cpp        singleview.cpp
    2627SOURCES += imageview.cpp
     28SOURCES += galleryfilter.cpp galleryfilterdlg.cpp
    2729SOURCES += gallerysettings.cpp dbcheck.cpp
    2830SOURCES += galleryutil.cpp
    2931SOURCES += thumbgenerator.cpp  thumbview.cpp
  • mythplugins/mythgallery/theme/default-wide/gallery-ui.xml

    diff --git a/mythplugins/mythgallery/theme/default-wide/gallery-ui.xml b/mythplugins/mythgallery/theme/default-wide/gallery-ui.xml
    index acaf10c..7f6ba7c 100644
    a b  
    115115
    116116    </window>
    117117
     118    <window name="filter">
     119
     120        <textarea name="title" from="basetextarea">
     121            <area>20,50,1260,30</area>
     122            <value>Filter/sort images</value>
     123            <align>hcenter,vcenter</align>
     124            <font>baselarge</font>
     125        </textarea>
     126
     127        <!-- Filter: labels -->
     128        <textarea name="filter_text" from="basetextarea">
     129            <area>10,107,180,34</area>
     130            <value>Directory filter :</value>
     131            <align>right,top</align>
     132        </textarea>
     133
     134        <textarea name="type_filter" from="filter_text">
     135            <position>10,161</position>
     136            <value>Type filter :</value>
     137        </textarea>
     138
     139        <textarea name="numimages_text" from="basetextarea">
     140            <area>200,255,1260,30</area>
     141            <value>NumImages_Text</value>
     142            <align>left,top</align>
     143        </textarea>
     144
     145        <!-- Sort: labels -->
     146        <textarea name="sort_text" from="basetextarea">
     147            <area>10,319,180,34</area>
     148            <value>Sort by :</value>
     149            <align>right,top</align>
     150        </textarea>
     151
     152        <!-- Widgets -->
     153        <textedit name="dirfilter_text" from="basetextedit">
     154            <position>200,100</position>
     155        </textedit>
     156
     157        <buttonlist name="typefilter_select" from="baseselector">
     158            <position>200,154</position>
     159        </buttonlist>
     160
     161        <button name="check_button" from="basebutton">
     162            <position>200,200</position>
     163            <value>Check Filter</value>
     164        </button>
     165
     166        <buttonlist name="sort_select" from="baseselector">
     167            <position>200,312</position>
     168        </buttonlist>
     169
     170        <button name="done_button" from="basebutton">
     171            <position>670,505</position>
     172            <value>Done</value>
     173        </button>
     174
     175        <button name="save_button" from="basebutton">
     176            <position>490,505</position>
     177            <value>Save as default</value>
     178        </button>
     179
     180    </window>
    118181</mythuitheme>
  • mythplugins/mythgallery/theme/default/gallery-ui.xml

    diff --git a/mythplugins/mythgallery/theme/default/gallery-ui.xml b/mythplugins/mythgallery/theme/default/gallery-ui.xml
    index e515e77..7ab939a 100644
    a b  
    112112        </textarea>
    113113    </window>
    114114
     115    <window name="filter">
     116
     117        <textarea name="title" from="basetextarea">
     118            <area>20,50,770,30</area>
     119            <value>Filter/sort images</value>
     120            <align>hcenter,vcenter</align>
     121            <font>baselarge</font>
     122        </textarea>
     123
     124        <!-- Filter: labels -->
     125        <textarea name="filter_text" from="basetextarea">
     126            <area>10,107,180,34</area>
     127            <value>Directory filter :</value>
     128            <align>right,top</align>
     129        </textarea>
     130
     131        <textarea name="type_filter" from="filter_text">
     132            <position>10,161</position>
     133            <value>Type filter :</value>
     134        </textarea>
     135
     136        <textarea name="numimages_text" from="basetextarea">
     137            <area>200,255,770,30</area>
     138            <value>NumImages_Text</value>
     139            <align>left,top</align>
     140        </textarea>
     141
     142        <!-- Sort: labels -->
     143        <textarea name="sort_text" from="basetextarea">
     144            <area>10,319,180,34</area>
     145            <value>Sort by :</value>
     146            <align>right,top</align>
     147        </textarea>
     148
     149        <!-- Widgets -->
     150        <textedit name="dirfilter_text" from="basetextedit">
     151            <position>200,100</position>
     152        </textedit>
     153
     154        <buttonlist name="typefilter_select" from="baseselector">
     155            <position>200,154</position>
     156        </buttonlist>
     157
     158        <button name="check_button" from="basebutton">
     159            <position>200,200</position>
     160            <value>Check Filter</value>
     161        </button>
     162
     163        <buttonlist name="sort_select" from="baseselector">
     164            <position>200,312</position>
     165        </buttonlist>
     166
     167        <button name="done_button" from="basebutton">
     168            <position>380,505</position>
     169            <value>Done</value>
     170        </button>
     171
     172        <button name="save_button" from="basebutton">
     173            <position>200,505</position>
     174            <value>Save as default</value>
     175        </button>
     176
     177    </window>
    115178</mythuitheme>