1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date        : 2009-12-05
7  * Description : Side Bar Widget for the search.
8  *
9  * Copyright (C) 2009-2010 by Johannes Wienke <languitar at semipol dot de>
10  * Copyright (C) 2010-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
11  * Copyright (C) 2012      by Andi Clemens <andi dot clemens at gmail dot com>
12  * Copyright (C) 2014      by Mohamed_Anwer <m_dot_anwer at gmx dot com>
13  * Copyright (C) 2010      by Aditya Bhatt <adityabhatt1991 at gmail dot com>
14  *
15  * This program is free software; you can redistribute it
16  * and/or modify it under the terms of the GNU General
17  * Public License as published by the Free Software Foundation;
18  * either version 2, or (at your option)
19  * any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * ============================================================ */
27 
28 #include "searchsidebarwidget.h"
29 
30 // Qt includes
31 
32 #include <QApplication>
33 #include <QStyle>
34 #include <QIcon>
35 
36 // KDE includes
37 
38 #include <kconfiggroup.h>
39 #include <klocalizedstring.h>
40 
41 // Local includes
42 
43 #include "digikam_debug.h"
44 #include "albumpointer.h"
45 #include "applicationsettings.h"
46 #include "editablesearchtreeview.h"
47 #include "searchfolderview.h"
48 #include "searchtabheader.h"
49 #include "searchtextbardb.h"
50 #include "searchtreeview.h"
51 
52 namespace Digikam
53 {
54 
55 class Q_DECL_HIDDEN SearchSideBarWidget::Private
56 {
57 public:
58 
Private()59     explicit Private()
60       : searchSearchBar(nullptr),
61         searchTreeView (nullptr),
62         searchTabHeader(nullptr)
63     {
64     }
65 
66     SearchTextBarDb*      searchSearchBar;
67     NormalSearchTreeView* searchTreeView;
68     SearchTabHeader*      searchTabHeader;
69 };
70 
SearchSideBarWidget(QWidget * const parent,SearchModel * const searchModel,SearchModificationHelper * const searchModificationHelper)71 SearchSideBarWidget::SearchSideBarWidget(QWidget* const parent,
72                                          SearchModel* const searchModel,
73                                          SearchModificationHelper* const searchModificationHelper)
74     : SidebarWidget(parent),
75       d            (new Private)
76 {
77     setObjectName(QLatin1String("Search Sidebar"));
78     setProperty("Shortcut", Qt::CTRL + Qt::SHIFT + Qt::Key_F6);
79 
80     const int spacing         = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
81 
82     QVBoxLayout* const layout = new QVBoxLayout(this);
83 
84     d->searchTabHeader  = new SearchTabHeader(this);
85     d->searchTreeView   = new NormalSearchTreeView(this, searchModel, searchModificationHelper);
86     d->searchTreeView->setConfigGroup(getConfigGroup());
87     d->searchTreeView->filteredModel()->listNormalSearches();
88     d->searchTreeView->filteredModel()->setListTemporarySearches(true);
89     d->searchTreeView->setAlbumManagerCurrentAlbum(true);
90     d->searchSearchBar  = new SearchTextBarDb(this, QLatin1String("ItemIconViewSearchSearchBar"));
91     d->searchSearchBar->setModel(d->searchTreeView->filteredModel(),
92                                  AbstractAlbumModel::AlbumIdRole, AbstractAlbumModel::AlbumTitleRole);
93     d->searchSearchBar->setFilterModel(d->searchTreeView->albumFilterModel());
94 
95     layout->addWidget(d->searchTabHeader);
96     layout->addWidget(d->searchTreeView);
97     layout->setStretchFactor(d->searchTreeView, 1);
98     layout->addWidget(d->searchSearchBar);
99     layout->setContentsMargins(0, 0, spacing, 0);
100 
101     connect(d->searchTreeView, SIGNAL(newSearch()),
102             d->searchTabHeader, SLOT(newAdvancedSearch()));
103 
104     connect(d->searchTreeView, SIGNAL(editSearch(SAlbum*)),
105             d->searchTabHeader, SLOT(editSearch(SAlbum*)));
106 
107     connect(d->searchTreeView, SIGNAL(currentAlbumChanged(Album*)),
108             d->searchTabHeader, SLOT(selectedSearchChanged(Album*)));
109 
110     connect(d->searchTabHeader, SIGNAL(searchShallBeSelected(QList<Album*>)),
111             d->searchTreeView, SLOT(setCurrentAlbums(QList<Album*>)));
112 }
113 
~SearchSideBarWidget()114 SearchSideBarWidget::~SearchSideBarWidget()
115 {
116     delete d;
117 }
118 
setActive(bool active)119 void SearchSideBarWidget::setActive(bool active)
120 {
121     if (active)
122     {
123         AlbumManager::instance()->setCurrentAlbums(QList<Album*>() << d->searchTreeView->currentAlbum());
124         d->searchTabHeader->selectedSearchChanged(d->searchTreeView->currentAlbum());
125     }
126 }
127 
doLoadState()128 void SearchSideBarWidget::doLoadState()
129 {
130     d->searchTreeView->loadState();
131 }
132 
doSaveState()133 void SearchSideBarWidget::doSaveState()
134 {
135     d->searchTreeView->saveState();
136 }
137 
applySettings()138 void SearchSideBarWidget::applySettings()
139 {
140 }
141 
changeAlbumFromHistory(const QList<Album * > & album)142 void SearchSideBarWidget::changeAlbumFromHistory(const QList<Album*>& album)
143 {
144     d->searchTreeView->setCurrentAlbums(album);
145 }
146 
getIcon()147 const QIcon SearchSideBarWidget::getIcon()
148 {
149     return QIcon::fromTheme(QLatin1String("edit-find"));
150 }
151 
getCaption()152 const QString SearchSideBarWidget::getCaption()
153 {
154     return i18nc("Advanced search images, access stored searches", "Search");
155 }
156 
newKeywordSearch()157 void SearchSideBarWidget::newKeywordSearch()
158 {
159     d->searchTabHeader->newKeywordSearch();
160 }
161 
newAdvancedSearch()162 void SearchSideBarWidget::newAdvancedSearch()
163 {
164     d->searchTabHeader->newAdvancedSearch();
165 }
166 
167 } // namespace Digikam
168