/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RawTherapee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #pragma once #include #include #include "exiffiltersettings.h" #include "exportpanel.h" #include "filebrowser.h" #include "fileselectionchangelistener.h" #include "fileselectionlistener.h" #include "filterpanel.h" #include "previewloader.h" #include "threadutils.h" #include "../rtengine/noncopyable.h" class FilePanel; class CoarsePanel; class ToolBar; /* * Class: * - handling the list of file (add/remove them) * - handling the thumbnail toolbar, * - monitoring the directory (for any change) */ class FileCatalog final : public Gtk::VBox, public PreviewLoaderListener, public FilterPanelListener, public FileBrowserListener, public ExportPanelListener, public rtengine::NonCopyable { public: typedef sigc::slot DirSelectionSlot; private: FilePanel* filepanel; Gtk::HBox* hBox; Glib::ustring selectedDirectory; int selectedDirectoryId; bool enabled; bool inTabMode; // Tab mode has e.g. different progress bar handling Glib::ustring imageToSelect_fname; Glib::ustring refImageForOpen_fname; // Next/previous for Editor's perspective eRTNav actionNextPrevious; FileSelectionListener* listener; FileSelectionChangeListener* fslistener; ImageAreaToolListener* iatlistener; DirSelectionSlot selectDir; Gtk::HBox* buttonBar; Gtk::HBox* hbToolBar1; MyScrolledToolbar* hbToolBar1STB; Gtk::HBox* fltrRankbox; Gtk::HBox* fltrLabelbox; Gtk::VBox* fltrVbox1; Gtk::HBox* fltrEditedBox; Gtk::HBox* fltrRecentlySavedBox; Gtk::VBox* fltrVbox2; Gtk::VSeparator* vSepiLeftPanel; Gtk::ToggleButton* tbLeftPanel_1; Gtk::ToggleButton* tbRightPanel_1; Gtk::ToggleButton* bFilterClear; Gtk::ToggleButton* bUnRanked; Gtk::ToggleButton* bRank[5]; Gtk::ToggleButton* bUnCLabeled; Gtk::ToggleButton* bCLabel[5];//color label Gtk::ToggleButton* bEdited[2]; Gtk::ToggleButton* bRecentlySaved[2]; Gtk::ToggleButton* bTrash; Gtk::ToggleButton* bNotTrash; Gtk::ToggleButton* bOriginal; Gtk::ToggleButton* categoryButtons[20]; Gtk::ToggleButton* exifInfo; sigc::connection bCateg[20]; Gtk::Image* iFilterClear, *igFilterClear; Gtk::Image* iranked[5], *igranked[5], *iUnRanked, *igUnRanked; Gtk::Image* iCLabeled[5], *igCLabeled[5], *iUnCLabeled, *igUnCLabeled; Gtk::Image* iEdited[2], *igEdited[2]; Gtk::Image* iRecentlySaved[2], *igRecentlySaved[2]; Gtk::Image *iTrashShowEmpty, *iTrashShowFull; Gtk::Image *iNotTrash, *iOriginal; Gtk::Image *iRefreshWhite, *iRefreshRed; Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide; Gtk::Image *iQueryClear; Gtk::Entry* BrowsePath; Gtk::Button* buttonBrowsePath; Gtk::Entry* Query; Gtk::Button* buttonQueryClear; double hScrollPos[18]; double vScrollPos[18]; int lastScrollPos; Gtk::VBox* trashButtonBox; Gtk::Button* zoomInButton; Gtk::Button* zoomOutButton; MyMutex dirEFSMutex; ExifFilterSettings dirEFS; ExifFilterSettings currentEFS; bool hasValidCurrentEFS; FilterPanel* filterPanel; ExportPanel* exportPanel; int previewsToLoad; int previewsLoaded; std::vector fileNameList; std::set editedFiles; guint modifierKey; // any modifiers held when rank button was pressed Glib::RefPtr dirMonitor; IdleRegister idle_register; void addAndOpenFile (const Glib::ustring& fname); void addFile (const Glib::ustring& fName); std::vector getFileList (); BrowserFilter getFilter (); void trashChanged (); public: // thumbnail browsers FileBrowser* fileBrowser; CoarsePanel* coarsePanel; ToolBar* toolBar; FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel); ~FileCatalog() override; void dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile); void closeDir (); void refreshEditedState (const std::set& efiles); // previewloaderlistener interface void previewReady (int dir_id, FileBrowserEntry* fdn) override; void previewsFinished (int dir_id) override; void previewsFinishedUI (); void _refreshProgressBar (); void setInspector(Inspector* inspector) { if (fileBrowser) { fileBrowser->setInspector(inspector); } } void disableInspector() { if (fileBrowser) { fileBrowser->disableInspector(); } } void enableInspector() { if (fileBrowser) { fileBrowser->enableInspector(); } } // filterpanel interface void exifFilterChanged () override; // exportpanel interface void exportRequested() override; Glib::ustring lastSelectedDir () { return selectedDirectory; } void setEnabled (bool e); // if not enabled, it does not open image void enableTabMode(bool enable); // sets progress bar // accessors for FileBrowser void redrawAll (); void refreshThumbImages (); void refreshHeight (); void filterApplied() override; void openRequested(const std::vector& tbe) override; void deleteRequested(const std::vector& tbe, bool inclBatchProcessed, bool onlySelected) override; void copyMoveRequested(const std::vector& tbe, bool moveRequested) override; void developRequested(const std::vector& tbe, bool fastmode) override; void renameRequested(const std::vector& tbe) override; void selectionChanged(const std::vector& tbe) override; void clearFromCacheRequested(const std::vector& tbe, bool leavenotrace) override; bool isInTabMode() const override; void emptyTrash (); bool trashIsEmpty (); void setFileSelectionListener (FileSelectionListener* l) { listener = l; } void setFileSelectionChangeListener (FileSelectionChangeListener* l) { fslistener = l; } void setImageAreaToolListener (ImageAreaToolListener* l) { iatlistener = l; } void setDirSelector (const DirSelectionSlot& selectDir); void setFilterPanel (FilterPanel* fpanel); void setExportPanel (ExportPanel* expanel); void exifInfoButtonToggled(); void categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick); bool capture_event(GdkEventButton* event); void filterChanged (); void runFilterDialog (); void on_realize() override; void reparseDirectory (); void _openImage (const std::vector& tmb); void zoomIn (); void zoomOut (); void buttonBrowsePathPressed (); bool BrowsePath_key_pressed (GdkEventKey *event); void buttonQueryClearPressed (); void executeQuery (); bool Query_key_pressed(GdkEventKey *event); void updateFBQueryTB (bool singleRow); void updateFBToolBarVisibility (bool showFilmStripToolBar); void tbLeftPanel_1_toggled (); void tbLeftPanel_1_visible (bool visible); void tbRightPanel_1_toggled (); void tbRightPanel_1_visible (bool visible); void openNextImage () { fileBrowser->openNextImage(); } void openPrevImage () { fileBrowser->openPrevImage(); } void selectImage (Glib::ustring fname, bool clearFilters); void openNextPreviousEditorImage (Glib::ustring fname, bool clearFilters, eRTNav nextPrevious); bool handleShortcutKey (GdkEventKey* event); bool CheckSidePanelsVisibility(); void toggleSidePanels(); void toggleLeftPanel(); void toggleRightPanel(); void showToolBar(); void hideToolBar(); void on_dir_changed (const Glib::RefPtr& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal); }; inline void FileCatalog::setDirSelector (const FileCatalog::DirSelectionSlot& selectDir) { this->selectDir = selectDir; }