File indexing completed on 2024-12-01 09:53: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      * @since 4.1
0078      */
0079     void setAutoResizeItemsEnabled(bool enabled);
0080     bool isAutoResizeItemsEnabled() const;
0081 
0082     /**
0083      * Sets a custom function that will be called when teardown of
0084      * a device (e.g.\ unmounting a drive) is requested.
0085      * @since 5.91
0086      */
0087     void setTeardownFunction(TeardownFunction teardownFunc);
0088 
0089 public Q_SLOTS:
0090     void setUrl(const QUrl &url);
0091     void setShowAll(bool showAll);
0092 
0093     // TODO KF6: make it a public method, not a slot
0094     QSize sizeHint() const override; // clazy:exclude=const-signal-or-slot
0095 
0096     void setModel(QAbstractItemModel *model) override;
0097 
0098 protected:
0099     void keyPressEvent(QKeyEvent *event) override;
0100     void contextMenuEvent(QContextMenuEvent *event) override;
0101     void resizeEvent(QResizeEvent *event) override;
0102     void showEvent(QShowEvent *event) override;
0103     void hideEvent(QHideEvent *event) override;
0104     void dragEnterEvent(QDragEnterEvent *event) override;
0105     void dragLeaveEvent(QDragLeaveEvent *event) override;
0106     void dragMoveEvent(QDragMoveEvent *event) override;
0107     void dropEvent(QDropEvent *event) override;
0108     void paintEvent(QPaintEvent *event) override;
0109     void startDrag(Qt::DropActions supportedActions) override;
0110     void mousePressEvent(QMouseEvent *event) override;
0111 
0112 protected Q_SLOTS:
0113     void rowsInserted(const QModelIndex &parent, int start, int end) override;
0114     void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) override;
0115 
0116 Q_SIGNALS:
0117     /**
0118      * Emitted when an item in the places view is clicked on with left mouse
0119      * button with no modifier keys pressed.
0120      *
0121      * If a storage device needs to be mounted first, this signal is emitted once
0122      * mounting has completed successfully.
0123      *
0124      * @param url The URL of the place
0125      * @since 5.91
0126      */
0127     void placeActivated(const QUrl &url);
0128 
0129     /**
0130      * Emitted when the URL \a url should be opened in a new inactive tab because
0131      * the user clicked on a place with the middle mouse button or
0132      * left-clicked with the Ctrl modifier pressed or selected "Open in New Tab"
0133      * from the context menu.
0134      *
0135      * If a storage device needs to be mounted first, this signal is emitted once
0136      * mounting has completed successfully.
0137      * @since 5.91
0138      */
0139     void tabRequested(const QUrl &url);
0140 
0141     /**
0142      * Emitted when the URL \a url should be opened in a new active tab because
0143      * the user clicked on a place with the middle mouse button with
0144      * the Shift modifier pressed or left-clicked with both the Ctrl and Shift
0145      * modifiers pressed.
0146 
0147      * If a storage device needs to be mounted first, this signal is emitted once
0148      * mounting has completed successfully.
0149      * @since 5.91
0150      */
0151     void activeTabRequested(const QUrl &url);
0152 
0153     /**
0154      * Emitted when the URL \a url should be opened in a new window because
0155      * the user left-clicked on a place with Shift modifier pressed or selected
0156      * "Open in New Window" from the context menu.
0157      *
0158      * If a storage device needs to be mounted first, this signal is emitted once
0159      * mounting has completed successfully.
0160      * @since 5.91
0161      */
0162     void newWindowRequested(const QUrl &url);
0163 
0164     /**
0165      * Emitted just before the context menu opens. This can be used to add additional
0166      * application actions to the menu.
0167      * @param index The model index of the place whose menu is about to open.
0168      * @param menu The menu that will be opened.
0169      * @since 5.91
0170      */
0171     void contextMenuAboutToShow(const QModelIndex &index, QMenu *menu);
0172 
0173     /**
0174      * Emitted when allPlacesShown changes
0175      * @since 5.91
0176      */
0177     void allPlacesShownChanged(bool allPlacesShown);
0178 
0179     void urlChanged(const QUrl &url);
0180 
0181     /**
0182      * Is emitted if items are dropped on the place \a dest.
0183      * The application has to take care itself about performing the
0184      * corresponding action like copying or moving.
0185      */
0186     void urlsDropped(const QUrl &dest, QDropEvent *event, QWidget *parent);
0187 
0188 private:
0189     friend class KFilePlacesViewPrivate;
0190     friend class KFilePlacesEventWatcher;
0191     std::unique_ptr<KFilePlacesViewPrivate> const d;
0192 };
0193 
0194 #endif