Files
create/src/Gui/OverlayManager.h
2025-11-11 13:49:01 +01:00

203 lines
7.1 KiB
C++

/****************************************************************************
* Copyright (c) 2022 Zheng Lei (realthunder) <realthunder.dev@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library 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 Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
****************************************************************************/
#ifndef FC_OVERLAYMANAGER_H
#define FC_OVERLAYMANAGER_H
#include <QObject>
#include <QDockWidget>
#include <FCGlobal.h>
class QAction;
class QDockWidget;
class QString;
class QPoint;
class QWidget;
namespace Gui
{
class OverlayTabWidget;
/// Class that manages overlay dockable widgets
class GuiExport OverlayManager: public QObject
{
Q_OBJECT
public:
OverlayManager();
~OverlayManager() override;
/// restore states
void restore();
/// save states
void save();
/// Retranslate text on language change
void retranslate();
/// Reload icon images
void refreshIcons();
/// Reload mode
enum class ReloadMode
{
/// Reload is pending
ReloadPending = 0,
/// Reload is paused
ReloadPause = 1,
/// Resume state reload
ReloadResume = 2,
};
/** Set reload mode
*
* An internal timer is used to batch handle all relevant parameter
* changes. The function is provided to let other code temporarily disable
* the timer before changing the parameter, and then resume it after done.
*/
void reload(ReloadMode mode = ReloadMode::ReloadPending);
/** Refresh overlay internal layout
* @param widget: optional source widget that triggers the refresh
* @param refreshStyle: whether to reload stylesheet
*/
void refresh(QWidget* widget = nullptr, bool refreshStyle = false);
/// Setup title bar for a QDockWidget
void setupTitleBar(QDockWidget*);
/// Overlay mode
enum class OverlayMode
{
/// Toggle the focused widget between normal and overlay on top of MDI client area
ToggleActive,
/// Toggle overlay dock widget background between opaque and transparent
ToggleTransparent,
/// Make the focused widget switch to overlay on top of MDI client area
EnableActive,
/// Make the focused widget switch back to normal dockable widget
DisableActive,
/// Make all docked widget switch to overlay
EnableAll,
/// Make all docked widget switch back to normal
DisableAll,
/// Toggle all docked widget between normal and overlay
ToggleAll,
/// Set all overlay dock widget to transparent background
TransparentAll,
/// Set all overlay dock widget to opaque background
TransparentNone,
/// Toggle all overlay dock widget background between opaque and transparent
ToggleTransparentAll,
/// Toggle show/hide of the left docked widgets
ToggleLeft,
/// Toggle show/hide of the right docked widgets
ToggleRight,
/// Toggle show/hide of the top docked widgets
ToggleTop,
/// Toggle show/hide of the bottom docked widgets
ToggleBottom,
};
/// Set overlay mode
void setOverlayMode(OverlayMode mode);
/// Enable/disable mouse transparent mode
void setMouseTransparent(bool enabled);
/// Report if mouse transparent mode is active
bool isMouseTransparent() const;
/// Check if the cursor is within an overlay docked widget
bool isUnderOverlay() const;
/// Initialize a newly created dock widget
void initDockWidget(QDockWidget*);
/// Prepare a dock widget for overlay display
void setupDockWidget(QDockWidget*, int dockArea = Qt::NoDockWidgetArea);
/// Switch a dock widget back to normal display
void unsetupDockWidget(QDockWidget*);
/** Mouse event handler for dragging a dock widget
* @param pos: mouse cursor position
* @param widget: dragging widget, can either be a QDockWidget if it is
* floating, or a OverlayTabWidget if docked in overlay mode
* @param offset: offset from the mouse cursor to the widget origin
* @param size: widget size before dragging start
* @param drop: whether to drop after drag to the position
*/
void dragDockWidget(
const QPoint& pos,
QWidget* widget,
const QPoint& offset,
const QSize& size,
bool drop = false
);
/// Float an overlay docked widget
void floatDockWidget(QDockWidget*);
/// Return the last widget whose mouse event got intercepted by the overlay manager for mouse
/// pass through
QWidget* getLastMouseInterceptWidget() const;
/// Return the stylesheet for overlay widgets
const QString& getStyleSheet() const;
/// Check whether to hide tab in overlay dock widget
bool getHideTab() const;
/// Helper function to set focus when switching active sub window
static void setFocusView();
/// Return the singleton instance of the overlay manager
static OverlayManager* instance();
/// Destroy the overlay manager
static void destruct();
class Private;
protected:
bool eventFilter(QObject* obj, QEvent* ev) override;
/// Register a named docked widget with an overlay tab widget
void registerDockWidget(const QString& name, OverlayTabWidget*);
/// Unregister a named docked widget with an overlay tab widget
void unregisterDockWidget(const QString& name, OverlayTabWidget*);
private:
void onToggleDockWidget(bool checked);
void onDockVisibleChange(bool visible);
void onDockFeaturesChange(QDockWidget::DockWidgetFeatures features);
void onDockWidgetTitleChange(const QString&);
void onTaskViewUpdate();
void onFocusChanged(QWidget*, QWidget*);
void onAction();
private Q_SLOTS:
void raiseAll();
private:
friend class Private;
friend class OverlayTabWidget;
Private* d;
};
} // namespace Gui
#endif // FC_OVERLAYMANAGER_H