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