[Digikam-devel] Re: [Patch] make UI more usable on small screens

Gilles Caulier caulier.gilles at gmail.com
Thu Feb 10 18:29:39 GMT 2011


Thanks matthias for this patch.

It's done against digiKam 1.x or 2.0 ?

Gilles Caulier

2011/2/10 Matthias Welwarsky <matze at welwarsky.de>:
> Hi,
>
> what do you think about the following changes to make UI more usable on small
> screens:
>
>     - SideBarWidget is now a QScrollArea
>     - minimumSizeHint() enforces minimum width of 20% of screen width,
> regardless of minimum sizes of managed widgets
>     - adjust left sidebar widgets to play nice with QScrollArea
>
> diff --git a/digikam/leftsidebarwidgets.cpp b/digikam/leftsidebarwidgets.cpp
> index 6a27fe1..8cdcd68 100644
> --- a/digikam/leftsidebarwidgets.cpp
> +++ b/digikam/leftsidebarwidgets.cpp
> @@ -87,20 +87,24 @@
> AlbumFolderViewSideBarWidget::AlbumFolderViewSideBarWidget(QWidget* parent,
> Albu
>
>     d->albumModificationHelper = albumModificationHelper;
>
> -    QVBoxLayout* layout = new QVBoxLayout(this);
> +    QWidget *mainWidget = new QWidget(this);
> +    QVBoxLayout* layout = new QVBoxLayout(mainWidget);
>
> -    d->albumFolderView = new AlbumSelectionTreeView(this, model, d-
>>albumModificationHelper);
> +    d->albumFolderView = new AlbumSelectionTreeView(mainWidget, model, d-
>>albumModificationHelper);
>     d->albumFolderView->setObjectName("AlbumFolderView");
>     d->albumFolderView->setConfigGroup(getConfigGroup());
>     d->albumFolderView->setExpandNewCurrentItem(true);
>     d->albumFolderView->setAlbumManagerCurrentAlbum(true);
> -    d->searchTextBar   = new SearchTextBar(this,
> "DigikamViewFolderSearchBar");
> +    d->searchTextBar   = new SearchTextBar(mainWidget,
> "DigikamViewFolderSearchBar");
>     d->searchTextBar->setHighlightOnResult(true);
>     d->searchTextBar->setModel(model, AbstractAlbumModel::AlbumIdRole,
> AbstractAlbumModel::AlbumTitleRole);
>     d->searchTextBar->setFilterModel(d->albumFolderView->albumFilterModel());
>
>     layout->addWidget(d->albumFolderView);
>     layout->addWidget(d->searchTextBar);
> +
> +    setWidget(mainWidget);
> +    setWidgetResizable(true);
>
>     // setup connection
>     connect(d->albumFolderView, SIGNAL(signalFindDuplicatesInAlbum(Album*)),
> @@ -187,19 +191,23 @@ TagViewSideBarWidget::TagViewSideBarWidget(QWidget*
> parent, TagModel* model)
>
>     d->tagModel = model;
>
> -    QVBoxLayout* layout = new QVBoxLayout(this);
> +    QWidget *mainWidget = new QWidget(this);
> +    QVBoxLayout* layout = new QVBoxLayout(mainWidget);
>
> -    d->tagFolderView = new TagFolderView(this, model);
> +    d->tagFolderView = new TagFolderView(mainWidget, model);
>     d->tagFolderView->setConfigGroup(getConfigGroup());
>     d->tagFolderView->setExpandNewCurrentItem(true);
>     d->tagFolderView->setAlbumManagerCurrentAlbum(true);
> -    d->tagSearchBar  = new SearchTextBar(this, "DigikamViewTagSearchBar");
> +    d->tagSearchBar  = new SearchTextBar(mainWidget,
> "DigikamViewTagSearchBar");
>     d->tagSearchBar->setHighlightOnResult(true);
>     d->tagSearchBar->setModel(model, AbstractAlbumModel::AlbumIdRole,
> AbstractAlbumModel::AlbumTitleRole);
>     d->tagSearchBar->setFilterModel(d->tagFolderView->albumFilterModel());
>
>     layout->addWidget(d->tagFolderView);
>     layout->addWidget(d->tagSearchBar);
> +
> +    setWidget(mainWidget);
> +    setWidgetResizable(true);
>
>     connect(d->tagFolderView, SIGNAL(signalFindDuplicatesInAlbum(Album*)),
>             this, SIGNAL(signalFindDuplicatesInAlbum(Album*)));
> @@ -284,6 +292,9 @@
> DateFolderViewSideBarWidget::DateFolderViewSideBarWidget(QWidget* parent,
> DateAl
>     d->dateFolderView->setImageModel(imageFilterModel);
>
>     layout->addWidget(d->dateFolderView);
> +
> +    setWidget(d->dateFolderView);
> +    setWidgetResizable(true);
>  }
>
>  DateFolderViewSideBarWidget::~DateFolderViewSideBarWidget()
> @@ -396,9 +407,11 @@ TimelineSideBarWidget::TimelineSideBarWidget(QWidget*
> parent, SearchModel* searc
>     d->searchModificationHelper = searchModificationHelper;
>     d->timer                    = new QTimer(this);
>     setAttribute(Qt::WA_DeleteOnClose);
> -
> -    QVBoxLayout* vlay = new QVBoxLayout(this);
> -    QFrame* panel     = new QFrame(this);
> +
> +    QWidget* mainWidget = new QWidget(this);
> +
> +    QVBoxLayout* vlay = new QVBoxLayout(mainWidget);
> +    QFrame* panel     = new QFrame(mainWidget);
>     panel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
>     panel->setLineWidth(1);
>
> @@ -521,6 +534,9 @@ TimelineSideBarWidget::TimelineSideBarWidget(QWidget*
> parent, SearchModel* searc
>     vlay->setMargin(0);
>     vlay->setSpacing(0);
>
> +    setWidget(mainWidget);
> +    setWidgetResizable(true);
> +
>     // ---------------------------------------------------------------
>
>     connect(AlbumManager::instance(), SIGNAL(signalDatesMapDirty(const
> QMap<QDateTime, int>&)),
> @@ -819,16 +835,17 @@ SearchSideBarWidget::SearchSideBarWidget(QWidget*
> parent, SearchModel* searchMod
>
>     d->searchModel      = searchModel;
>
> -    QVBoxLayout* layout = new QVBoxLayout(this);
> +    QWidget *mainWidget = new QWidget(this);
> +    QVBoxLayout* layout = new QVBoxLayout(mainWidget);
>
> -    d->searchTabHeader  = new SearchTabHeader(this);
> -    d->searchTreeView   = new NormalSearchTreeView(this, searchModel,
> +    d->searchTabHeader  = new SearchTabHeader(mainWidget);
> +    d->searchTreeView   = new NormalSearchTreeView(mainWidget, searchModel,
>             searchModeificationHelper);
>     d->searchTreeView->setConfigGroup(getConfigGroup());
>     d->searchTreeView->filteredModel()->listNormalSearches();
>     d->searchTreeView->filteredModel()->setListTemporarySearches(true);
>     d->searchTreeView->setAlbumManagerCurrentAlbum(true);
> -    d->searchSearchBar  = new SearchTextBar(this,
> "DigikamViewSearchSearchBar");
> +    d->searchSearchBar  = new SearchTextBar(mainWidget,
> "DigikamViewSearchSearchBar");
>     d->searchSearchBar->setModel(d->searchTreeView->filteredModel(),
>                                  AbstractAlbumModel::AlbumIdRole,
> AbstractAlbumModel::AlbumTitleRole);
>     d->searchSearchBar->setFilterModel(d->searchTreeView-
>>albumFilterModel());
> @@ -837,6 +854,9 @@ SearchSideBarWidget::SearchSideBarWidget(QWidget* parent,
> SearchModel* searchMod
>     layout->addWidget(d->searchTreeView);
>     layout->setStretchFactor(d->searchTreeView, 1);
>     layout->addWidget(d->searchSearchBar);
> +
> +    setWidget(mainWidget);
> +    setWidgetResizable(true);
>
>     connect(d->searchTreeView, SIGNAL(newSearch()),
>             d->searchTabHeader, SLOT(newAdvancedSearch()));
> @@ -935,6 +955,9 @@
> FuzzySearchSideBarWidget::FuzzySearchSideBarWidget(QWidget* parent,
> SearchModel*
>
>     layout->addWidget(d->fuzzySearchView);
>
> +    setWidget(d->fuzzySearchView->mainWidget());
> +    setWidgetResizable(true);
> +
>     connect(d->fuzzySearchView, SIGNAL(signalUpdateFingerPrints()),
>             this, SIGNAL(signalUpdateFingerPrints()));
>
> @@ -1032,7 +1055,10 @@ GPSSearchSideBarWidget::GPSSearchSideBarWidget(QWidget*
> parent, SearchModel* sea
>     QVBoxLayout* layout = new QVBoxLayout(this);
>
>     layout->addWidget(d->gpsSearchView);
> -
> +
> +    setWidget(d->gpsSearchView);
> +    setWidgetResizable(true);
> +
>     connect(d->gpsSearchView, SIGNAL(signalMapSoloItems(const
> QList<qlonglong>&, const QString&)),
>             this, SIGNAL(signalMapSoloItems(const QList<qlonglong>&, const
> QString&)));
>  }
> @@ -1106,10 +1132,11 @@ PeopleSideBarWidget::PeopleSideBarWidget(QWidget*
> parent, TagModel* model,
>     d->tagModel = model;
>     d->searchModificationHelper = searchModificationHelper;
>
> -    QVBoxLayout* layout = new QVBoxLayout;
> +    QWidget *mainWidget = new QWidget(this);
> +    QVBoxLayout* layout = new QVBoxLayout(mainWidget);
>     QHBoxLayout* hlay = new QHBoxLayout;
>
> -    d->tagFolderView = new TagFolderView(this, model);
> +    d->tagFolderView = new TagFolderView(mainWidget, model);
>     d->tagFolderView->setConfigGroup(getConfigGroup());
>     d->tagFolderView->setExpandNewCurrentItem(true);
>     d->tagFolderView->setAlbumManagerCurrentAlbum(true);
> @@ -1117,7 +1144,7 @@ PeopleSideBarWidget::PeopleSideBarWidget(QWidget*
> parent, TagModel* model,
>     d->tagFolderView->filteredModel()->listOnlyTagsWithProperty("person");
>     d->tagFolderView->filteredModel()-
>>setFilterBehavior(AlbumFilterModel::StrictFiltering);
>
> -    d->tagSearchBar  = new SearchTextBar(this, "DigikamViewPeopleSearchBar");
> +    d->tagSearchBar  = new SearchTextBar(mainWidget,
> "DigikamViewPeopleSearchBar");
>     d->tagSearchBar->setHighlightOnResult(true);
>     d->tagSearchBar->setModel(d->tagFolderView->filteredModel(),
>                               AbstractAlbumModel::AlbumIdRole,
> AbstractAlbumModel::AlbumTitleRole);
> @@ -1142,7 +1169,8 @@ PeopleSideBarWidget::PeopleSideBarWidget(QWidget*
> parent, TagModel* model,
>     layout->addWidget(d->tagFolderView);
>     layout->addWidget(d->tagSearchBar);
>
> -    setLayout(layout);
> +    setWidget(mainWidget);
> +    setWidgetResizable(true);
>
>     connect(d->tagFolderView, SIGNAL(signalFindDuplicatesInAlbum(Album*)),
>             this, SIGNAL(signalFindDuplicatesInAlbum(Album*)));
> diff --git a/digikam/sidebarwidget.cpp b/digikam/sidebarwidget.cpp
> index cd6b329..065f0e8 100644
> --- a/digikam/sidebarwidget.cpp
> +++ b/digikam/sidebarwidget.cpp
> @@ -21,13 +21,19 @@
>  *
>  * ============================================================ */
>
> +// Qt includes
> +#include <QScrollBar>
> +
> +// KDE includes
> +#include <kglobalsettings.h>
> +
>  #include "sidebarwidget.moc"
>
>  namespace Digikam
>  {
>
>  SidebarWidget::SidebarWidget(QWidget* parent) :
> -    QWidget(parent), StateSavingObject(this)
> +    QScrollArea(parent), StateSavingObject(this)
>  {
>  }
>
> @@ -35,4 +41,20 @@ SidebarWidget::~SidebarWidget()
>  {
>  }
>
> +QSize SidebarWidget::minimumSizeHint() const
> +{
> +    // Set scroll area to a horizontal minimum size sufficient for the
> widgets.
> +    // Do not touch vertical size hint.
> +    // Limit to 20% of the desktop width.
> +    const QWidget *w = widget();
> +    if (0 == w)
> +       return QScrollArea::minimumSizeHint();
> +
> +    QSize hint        = w->minimumSizeHint();
> +    QRect desktopRect = KGlobalSettings::desktopGeometry(w);
> +    int wSB           = verticalScrollBar()->height();
> +    hint.setWidth(qMin(w->minimumSizeHint().width() + wSB,
> desktopRect.width() / 5 ));
> +    return hint;
> +}
> +
>  }
> diff --git a/digikam/sidebarwidget.h b/digikam/sidebarwidget.h
> index 4b9ddd0..a0c119a 100644
> --- a/digikam/sidebarwidget.h
> +++ b/digikam/sidebarwidget.h
> @@ -28,6 +28,7 @@
>
>  #include <qpixmap.h>
>  #include <qwidget.h>
> +#include <qscrollarea.h>
>
>  // KDE includes
>
> @@ -48,7 +49,7 @@ namespace Digikam
>  *
>  * @author jwienke
>  */
> -class SidebarWidget: public QWidget, public StateSavingObject
> +class SidebarWidget: public QScrollArea, public StateSavingObject
>  {
>     Q_OBJECT
>  public:
> @@ -99,6 +100,11 @@ public:
>      * @return localized title string
>      */
>     virtual QString getCaption() = 0;
> +
> +    /**
> +     * Reimplemented to provide a sensible size hint towards the container
> +     */
> +    virtual QSize minimumSizeHint() const;
>
>  Q_SIGNALS:
>
> diff --git a/utilities/fuzzysearch/fuzzysearchview.cpp
> b/utilities/fuzzysearch/fuzzysearchview.cpp
> index 28c0168..ad163ba 100644
> --- a/utilities/fuzzysearch/fuzzysearchview.cpp
> +++ b/utilities/fuzzysearch/fuzzysearchview.cpp
> @@ -122,7 +122,8 @@ public:
>         imageSAlbum(0),
>         sketchSAlbum(0),
>         searchModel(0),
> -        searchModificationHelper(0)
> +        searchModificationHelper(0),
> +        mainWidget(0)
>     {
>     }
>
> @@ -185,6 +186,8 @@ public:
>
>     SearchModel*              searchModel;
>     SearchModificationHelper* searchModificationHelper;
> +
> +    QWidget*                  mainWidget;
>  };
>  const QString
> FuzzySearchView::FuzzySearchViewPriv::configTabEntry("FuzzySearch Tab");
>  const QString
> FuzzySearchView::FuzzySearchViewPriv::configPenSketchSizeEntry("Pen Sketch
> Size");
> @@ -199,7 +202,7 @@ const QString
> FuzzySearchView::FuzzySearchViewPriv::configSimilarsThresholdEntry
>  FuzzySearchView::FuzzySearchView(SearchModel* searchModel,
>                                  SearchModificationHelper*
> searchModificationHelper,
>                                  QWidget* parent)
> -    : QScrollArea(parent), StateSavingObject(this),
> +    : QWidget(parent), StateSavingObject(this),
>       d(new FuzzySearchViewPriv)
>  {
>     d->thumbLoadThread = ThumbnailLoadThread::defaultThread();
> @@ -207,10 +210,8 @@ FuzzySearchView::FuzzySearchView(SearchModel*
> searchModel,
>     d->searchModel = searchModel;
>     d->searchModificationHelper = searchModificationHelper;
>
> -    setWidgetResizable(true);
>     setAttribute(Qt::WA_DeleteOnClose);
>     setAcceptDrops(true);
> -    viewport()->setAcceptDrops(true);
>
>     // ---------------------------------------------------------------
>
> @@ -240,18 +241,16 @@ FuzzySearchView::FuzzySearchView(SearchModel*
> searchModel,
>
>     // ---------------------------------------------------------------
>
> -    QWidget* mainWidget     = new QWidget(this);
> +    d->mainWidget     = new QWidget(this);
>     QVBoxLayout* mainLayout = new QVBoxLayout();
>     mainLayout->addWidget(d->tabWidget);
>     mainLayout->addWidget(d->folderView);
>     mainLayout->setMargin(0);
>     mainLayout->setSpacing(0);
> -    mainWidget->setLayout(mainLayout);
> +    d->mainWidget->setLayout(mainLayout);
>
> -    setWidget(mainWidget);
>     setAutoFillBackground(false);
> -    mainWidget->setAutoFillBackground(false);
> -    viewport()->setAutoFillBackground(false);
> +    d->mainWidget->setAutoFillBackground(false);
>
>     // ---------------------------------------------------------------
>
> @@ -263,6 +262,11 @@ FuzzySearchView::FuzzySearchView(SearchModel*
> searchModel,
>     slotCheckNameEditImageConditions();
>  }
>
> +QWidget* FuzzySearchView::mainWidget() const
> +{
> +       return d->mainWidget;
> +}
> +
>  QWidget* FuzzySearchView::setupFindSimilarPanel()
>  {
>     KHBox* imageBox     = new KHBox();
> diff --git a/utilities/fuzzysearch/fuzzysearchview.h
> b/utilities/fuzzysearch/fuzzysearchview.h
> index 542d8c4..7cca7fe 100644
> --- a/utilities/fuzzysearch/fuzzysearchview.h
> +++ b/utilities/fuzzysearch/fuzzysearchview.h
> @@ -49,7 +49,7 @@ class SearchModel;
>  class SearchModificationHelper;
>  class SearchTextBar;
>
> -class FuzzySearchView : public QScrollArea, public StateSavingObject
> +class FuzzySearchView : public QWidget, public StateSavingObject
>  {
>     Q_OBJECT
>
> @@ -71,6 +71,8 @@ public:
>     virtual void setConfigGroup(KConfigGroup group);
>     void doLoadState();
>     void doSaveState();
> +
> +    QWidget* mainWidget() const;
>
>  Q_SIGNALS:
>
>
> _______________________________________________
> Digikam-devel mailing list
> Digikam-devel at kde.org
> https://mail.kde.org/mailman/listinfo/digikam-devel
>



More information about the Digikam-devel mailing list