File indexing completed on 2024-12-08 06:40:08
0001 /* 0002 This file is part of the KDE project 0003 SPDX-FileCopyrightText: 2007 Kevin Ottens <ervin@kde.org> 0004 SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de> 0005 0006 SPDX-License-Identifier: LGPL-2.0-only 0007 */ 0008 0009 #ifndef KFILEPLACESVIEW_H 0010 #define KFILEPLACESVIEW_H 0011 0012 #include "kiofilewidgets_export.h" 0013 0014 #include <QListView> 0015 #include <QUrl> 0016 0017 #include <functional> 0018 #include <memory> 0019 0020 class QResizeEvent; 0021 class QContextMenuEvent; 0022 0023 class KFilePlacesViewPrivate; 0024 0025 /** 0026 * @class KFilePlacesView kfileplacesview.h <KFilePlacesView> 0027 * 0028 * This class allows to display a KFilePlacesModel. 0029 */ 0030 class KIOFILEWIDGETS_EXPORT KFilePlacesView : public QListView 0031 { 0032 Q_OBJECT 0033 public: 0034 explicit KFilePlacesView(QWidget *parent = nullptr); 0035 ~KFilePlacesView() override; 0036 0037 /** 0038 * The teardown function signature. Custom teardown logic 0039 * may be provided via the setTeardownFunction method. 0040 * @since 5.91 0041 */ 0042 using TeardownFunction = std::function<void(const QModelIndex &)>; 0043 0044 /** 0045 * Whether hidden places, if any, are currently shown. 0046 * @since 5.91 0047 */ 0048 bool allPlacesShown() const; 0049 0050 /** 0051 * If \a enabled is true, it is allowed dropping items 0052 * above a place for e. g. copy or move operations. The application 0053 * has to take care itself to perform the operation 0054 * (see KFilePlacesView::urlsDropped()). If 0055 * \a enabled is false, it is only possible adding items 0056 * as additional place. Per default dropping on a place is 0057 * disabled. 0058 */ 0059 void setDropOnPlaceEnabled(bool enabled); 0060 bool isDropOnPlaceEnabled() const; 0061 0062 /** 0063 * If \a delay (in ms) is greater than zero, the place will 0064 * automatically be activated if an item is dragged over 0065 * and held on top of a place for at least that duraton. 0066 * 0067 * @param delay Delay in ms, default is zero. 0068 * @since 5.92 0069 */ 0070 void setDragAutoActivationDelay(int delay); 0071 int dragAutoActivationDelay() const; 0072 0073 /** 0074 * If \a enabled is true (the default), items will automatically resize 0075 * themselves to fill the view. 0076 * 0077 */ 0078 void setAutoResizeItemsEnabled(bool enabled); 0079 bool isAutoResizeItemsEnabled() const; 0080 0081 /** 0082 * Sets a custom function that will be called when teardown of 0083 * a device (e.g.\ unmounting a drive) is requested. 0084 * @since 5.91 0085 */ 0086 void setTeardownFunction(TeardownFunction teardownFunc); 0087 0088 QSize sizeHint() const override; // clazy:exclude=const-signal-or-slot 0089 0090 public Q_SLOTS: 0091 void setUrl(const QUrl &url); 0092 void setShowAll(bool showAll); 0093 0094 void setModel(QAbstractItemModel *model) override; 0095 0096 protected: 0097 void keyPressEvent(QKeyEvent *event) override; 0098 void contextMenuEvent(QContextMenuEvent *event) override; 0099 void resizeEvent(QResizeEvent *event) override; 0100 void showEvent(QShowEvent *event) override; 0101 void hideEvent(QHideEvent *event) override; 0102 void dragEnterEvent(QDragEnterEvent *event) override; 0103 void dragLeaveEvent(QDragLeaveEvent *event) override; 0104 void dragMoveEvent(QDragMoveEvent *event) override; 0105 void dropEvent(QDropEvent *event) override; 0106 void paintEvent(QPaintEvent *event) override; 0107 void startDrag(Qt::DropActions supportedActions) override; 0108 void mousePressEvent(QMouseEvent *event) override; 0109 0110 protected Q_SLOTS: 0111 void rowsInserted(const QModelIndex &parent, int start, int end) override; 0112 void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles) override; 0113 0114 Q_SIGNALS: 0115 /** 0116 * Emitted when an item in the places view is clicked on with left mouse 0117 * button with no modifier keys pressed. 0118 * 0119 * If a storage device needs to be mounted first, this signal is emitted once 0120 * mounting has completed successfully. 0121 * 0122 * @param url The URL of the place 0123 * @since 5.91 0124 */ 0125 void placeActivated(const QUrl &url); 0126 0127 /** 0128 * Emitted when the URL \a url should be opened in a new inactive tab because 0129 * the user clicked on a place with the middle mouse button or 0130 * left-clicked with the Ctrl modifier pressed or selected "Open in New Tab" 0131 * from the context menu. 0132 * 0133 * If a storage device needs to be mounted first, this signal is emitted once 0134 * mounting has completed successfully. 0135 * @since 5.91 0136 */ 0137 void tabRequested(const QUrl &url); 0138 0139 /** 0140 * Emitted when the URL \a url should be opened in a new active tab because 0141 * the user clicked on a place with the middle mouse button with 0142 * the Shift modifier pressed or left-clicked with both the Ctrl and Shift 0143 * modifiers pressed. 0144 0145 * If a storage device needs to be mounted first, this signal is emitted once 0146 * mounting has completed successfully. 0147 * @since 5.91 0148 */ 0149 void activeTabRequested(const QUrl &url); 0150 0151 /** 0152 * Emitted when the URL \a url should be opened in a new window because 0153 * the user left-clicked on a place with Shift modifier pressed or selected 0154 * "Open in New Window" from the context menu. 0155 * 0156 * If a storage device needs to be mounted first, this signal is emitted once 0157 * mounting has completed successfully. 0158 * @since 5.91 0159 */ 0160 void newWindowRequested(const QUrl &url); 0161 0162 /** 0163 * Emitted just before the context menu opens. This can be used to add additional 0164 * application actions to the menu. 0165 * @param index The model index of the place whose menu is about to open. 0166 * @param menu The menu that will be opened. 0167 * @since 5.91 0168 */ 0169 void contextMenuAboutToShow(const QModelIndex &index, QMenu *menu); 0170 0171 /** 0172 * Emitted when allPlacesShown changes 0173 * @since 5.91 0174 */ 0175 void allPlacesShownChanged(bool allPlacesShown); 0176 0177 void urlChanged(const QUrl &url); 0178 0179 /** 0180 * Is emitted if items are dropped on the place \a dest. 0181 * The application has to take care itself about performing the 0182 * corresponding action like copying or moving. 0183 */ 0184 void urlsDropped(const QUrl &dest, QDropEvent *event, QWidget *parent); 0185 0186 private: 0187 friend class KFilePlacesViewPrivate; 0188 friend class KFilePlacesEventWatcher; 0189 std::unique_ptr<KFilePlacesViewPrivate> const d; 0190 }; 0191 0192 #endif