1 /* -*- C++ -*-
2  *
3  *  This file is part of RawTherapee.
4  *
5  *  Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
6  *
7  *  RawTherapee is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  RawTherapee 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  *  You should have received a copy of the GNU General Public License
18  *  along with RawTherapee.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 #ifndef _FILECATALOG_
21 #define _FILECATALOG_
22 
23 #include "filebrowser.h"
24 #include "exiffiltersettings.h"
25 #include <giomm.h>
26 #include "fileselectionlistener.h"
27 #include <set>
28 #include "fileselectionchangelistener.h"
29 #include "coarsepanel.h"
30 #include "toolbar.h"
31 #include "filterpanel.h"
32 //#include "exportpanel.h"
33 #include "previewloader.h"
34 #include "multilangmgr.h"
35 #include "threadutils.h"
36 //#include "popupbutton.h"
37 
38 class FilePanel;
39 class BatchQueue;
40 /*
41  * Class:
42  *   - handling the list of file (add/remove them)
43  *   - handling the thumbnail toolbar,
44  *   - monitoring the directory (for any change)
45  */
46 class FileCatalog : public Gtk::VBox,
47     public PreviewLoaderListener,
48     public FilterPanelListener,
49     public FileBrowserListener//,
50 //    public ExportPanelListener
51 {
52 public:
53     typedef sigc::slot<void, const Glib::ustring&> DirSelectionSlot;
54 
55 private:
56     FilePanel* filepanel;
57     Gtk::HBox* hBox;
58     Glib::ustring selectedDirectory;
59     int selectedDirectoryId;
60     int refresh_counter_;
61     bool enabled;
62     bool inTabMode;  // Tab mode has e.g. different progress bar handling
63     Glib::ustring imageToSelect_fname;
64     Glib::ustring refImageForOpen_fname; // Next/previous for Editor's perspective
65     eRTNav actionNextPrevious;
66 
67     FileSelectionListener* listener;
68     FileSelectionChangeListener* fslistener;
69     DirSelectionSlot selectDir;
70 
71     Gtk::HBox* buttonBar;
72     Gtk::HBox* hbToolBar1;
73     MyScrolledToolbar* hbToolBar1STB;
74 
75     Gtk::HBox* fltrRankbox;
76     Gtk::HBox* fltrLabelbox;
77     Gtk::VBox* fltrVbox1;
78 
79     Gtk::HBox* fltrEditedBox;
80     Gtk::HBox* fltrRecentlySavedBox;
81     Gtk::VBox* fltrVbox2;
82 
83     Gtk::VSeparator* vSepiLeftPanel;
84 
85     Gtk::ToggleButton* tbLeftPanel_1;
86     Gtk::ToggleButton* tbRightPanel_1;
87     Gtk::ToggleButton* bFilterClear;
88     Gtk::ToggleButton* bUnRanked;
89     Gtk::ToggleButton* bRank[5];
90     Gtk::ToggleButton* bUnCLabeled;
91     Gtk::ToggleButton* bCLabel[5];//color label
92     Gtk::ToggleButton* bEdited[2];
93     Gtk::ToggleButton* bRecentlySaved[2];
94     Gtk::ToggleButton* bTrash;
95     Gtk::ToggleButton* bNotTrash;
96     Gtk::ToggleButton* bOriginal;
97     Gtk::ToggleButton* categoryButtons[20];
98     Gtk::ToggleButton* exifInfo;
99     //PopUpButton *thumbOrder;
100     Gtk::MenuButton *thumbOrder;
101     std::vector<Gtk::MenuItem *> thumbOrderItems;
102     std::vector<Glib::ustring> thumbOrderLabels;
103     sigc::connection bCateg[20];
104     Gtk::Image* iFilterClear, *igFilterClear;
105     Gtk::Image* iranked[5], *igranked[5], *iUnRanked, *igUnRanked;
106     Gtk::Image* iCLabeled[5], *igCLabeled[5], *iUnCLabeled, *igUnCLabeled;
107     Gtk::Image* iEdited[2], *igEdited[2];
108     Gtk::Image* iRecentlySaved[2], *igRecentlySaved[2];
109     Gtk::Image *iTrashShowEmpty, *iTrashShowFull;
110     Gtk::Image *iNotTrash, *iOriginal;
111     Gtk::Image *iRefreshWhite, *iRefreshRed;
112     Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide;
113     Gtk::Image *iQueryClear;
114 
115     Gtk::Entry* BrowsePath;
116     Gtk::Button* buttonBrowsePath;
117     Glib::RefPtr<Gtk::EntryCompletion> browsePathCompletion;
118 
119     Gtk::Entry* Query;
120     Gtk::Button* buttonQueryClear;
121 
122     double hScrollPos[18];
123     double vScrollPos[18];
124     int lastScrollPos;
125 
126     Gtk::VBox* trashButtonBox;
127 
128     Gtk::Button* zoomInButton;
129     Gtk::Button* zoomOutButton;
130 
131     MyMutex dirEFSMutex;
132     ExifFilterSettings dirEFS;
133     ExifFilterSettings currentEFS;
134     bool hasValidCurrentEFS;
135 
136     FilterPanel* filterPanel;
137     // ExportPanel* exportPanel;
138 
139     int previewsToLoad;
140     int previewsLoaded;
141 
142 
143     std::vector<Glib::ustring> fileNameList;
144     std::set<Glib::ustring> editedFiles;
145     guint modifierKey; // any modifiers held when rank button was pressed
146 
147     Glib::RefPtr<Gio::FileMonitor> dirMonitor;
148 
149     IdleRegister idle_register;
150 
151     BatchQueue *bqueue_;
152 
153     void addAndOpenFile (const Glib::ustring& fname);
154     void addFile (const Glib::ustring& fName);
155     std::vector<Glib::ustring> getFileList ();
156     BrowserFilter getFilter ();
157     void trashChanged ();
158 
159     void onBrowsePathChanged();
160     Glib::ustring getBrowsePath();
161 
162     void removeFromBatchQueue(const std::vector<FileBrowserEntry*>& tbe);
163 
164 public:
165     // thumbnail browsers
166     FileBrowser* fileBrowser;
167 
168     FileCatalog(FilePanel* filepanel);
169     ~FileCatalog() override;
170     void dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile);
171     void closeDir    ();
172     void refreshEditedState (const std::set<Glib::ustring>& efiles);
173 
174     // previewloaderlistener interface
175     void previewReady (int dir_id, FileBrowserEntry* fdn) override;
176     void previewsFinished (int dir_id) override;
177     void previewsFinishedUI ();
178     void _refreshProgressBar ();
179 
setInspector(Inspector * inspector)180     void setInspector(Inspector* inspector)
181     {
182         if (fileBrowser) {
183             fileBrowser->setInspector(inspector);
184         }
185     }
186     void disableInspector();
187     void enableInspector();
188 
189     // filterpanel interface
190     void exifFilterChanged () override;
191 
192     // exportpanel interface
193     // void exportRequested() override;
194 
lastSelectedDir()195     Glib::ustring lastSelectedDir ()
196     {
197         return selectedDirectory;
198     }
199     void setEnabled (bool e);   // if not enabled, it does not open image
200     void enableTabMode(bool enable);  // sets progress bar
201 
202     // accessors for FileBrowser
203     void redrawAll ();
204     void refreshThumbImages ();
205     void refreshHeight ();
206 
207     void filterApplied() override;
208     void openRequested(const std::vector<Thumbnail*>& tbe) override;
209     void deleteRequested(const std::vector<FileBrowserEntry*>& tbe, bool inclBatchProcessed, bool onlySelected) override;
210     void copyMoveRequested(const std::vector<FileBrowserEntry*>& tbe, bool moveRequested) override;
211     void developRequested(const std::vector<FileBrowserEntry*>& tbe, bool fastmode) override;
212     void renameRequested(const std::vector<FileBrowserEntry*>& tbe) override;
213     void selectionChanged(const std::vector<Thumbnail*>& tbe) override;
214     void clearFromCacheRequested(const std::vector<FileBrowserEntry*>& tbe, bool leavenotrace) override;
215     bool isInTabMode() const override;
216 
217     void emptyTrash ();
218     bool trashIsEmpty ();
219 
setFileSelectionListener(FileSelectionListener * l)220     void setFileSelectionListener (FileSelectionListener* l)
221     {
222         listener = l;
223     }
setFileSelectionChangeListener(FileSelectionChangeListener * l)224     void setFileSelectionChangeListener (FileSelectionChangeListener* l)
225     {
226         fslistener = l;
227     }
228     void setDirSelector (const DirSelectionSlot& selectDir);
229 
230     void setFilterPanel (FilterPanel* fpanel);
231     // void setExportPanel (ExportPanel* expanel);
232     void exifInfoButtonToggled();
233     void categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick);
234     bool capture_event(GdkEventButton* event);
235     void filterChanged ();
236     void runFilterDialog ();
237 
238     void on_realize() override;
239     void reparseDirectory ();
240     void _openImage (const std::vector<Thumbnail*>& tmb);
241 
242     void zoomIn ();
243     void zoomOut ();
244 
245     void buttonBrowsePathPressed ();
246     bool BrowsePath_key_pressed (GdkEventKey *event);
247     void buttonQueryClearPressed ();
248     void executeQuery ();
249     bool Query_key_pressed(GdkEventKey *event);
250     void updateFBQueryTB (bool singleRow);
251     void updateFBToolBarVisibility (bool showFilmStripToolBar);
252 
253     void tbLeftPanel_1_toggled ();
254     void tbLeftPanel_1_visible (bool visible);
255     void tbRightPanel_1_toggled ();
256     void tbRightPanel_1_visible (bool visible);
257 
openNextImage()258     void openNextImage ()
259     {
260         fileBrowser->openNextImage();
261     }
openPrevImage()262     void openPrevImage ()
263     {
264         fileBrowser->openPrevImage();
265     }
266     void selectImage (Glib::ustring fname, bool clearFilters);
267     bool isSelected(const Glib::ustring &fname) const;
268     void openNextPreviousEditorImage (Glib::ustring fname, bool clearFilters, eRTNav nextPrevious);
269 
270     bool handleShortcutKey (GdkEventKey* event);
271 
272     bool CheckSidePanelsVisibility();
273     void toggleSidePanels();
274     void toggleLeftPanel();
275     void toggleRightPanel();
276     void setupSidePanels();
277 
278     void showToolBar();
279     void hideToolBar();
280 
281     void on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Glib::RefPtr<Gio::File>& other_file, Gio::FileMonitorEvent event_type, bool internal);
282 
setBatchQueue(BatchQueue * bq)283     void setBatchQueue(BatchQueue *bq) { bqueue_ = bq; }
284 };
285 
setDirSelector(const FileCatalog::DirSelectionSlot & selectDir)286 inline void FileCatalog::setDirSelector (const FileCatalog::DirSelectionSlot& selectDir)
287 {
288     this->selectDir = selectDir;
289 }
290 
291 #endif
292