Commit 7db8d5ee authored by Niccolò Venerandi's avatar Niccolò Venerandi
Browse files

Add support for adaptive opacity panels


Co-authored-by: Jan Blackquill's avatarJan Blackquill <uhhadd@gmail.com>
parent 69d5de3e
......@@ -40,6 +40,7 @@ public:
bool filterByScreen = false;
bool filterByActivity = false;
bool filterNotMinimized = false;
bool filterNotMaximized = false;
bool filterSkipTaskbar = true;
bool filterSkipPager = false;
......@@ -185,6 +186,22 @@ void TaskFilterProxyModel::setFilterNotMinimized(bool filter)
}
}
bool TaskFilterProxyModel::filterNotMaximized() const
{
return d->filterNotMaximized;
}
void TaskFilterProxyModel::setFilterNotMaximized(bool filter)
{
if (d->filterNotMaximized != filter) {
d->filterNotMaximized = filter;
invalidateFilter();
emit filterNotMaximizedChanged();
}
}
bool TaskFilterProxyModel::filterSkipTaskbar() const
{
return d->filterSkipTaskbar;
......@@ -301,6 +318,15 @@ bool TaskFilterProxyModel::acceptsRow(int sourceRow) const
}
}
// Filter not maximized.
if (d->filterNotMaximized) {
bool isMaximized = sourceIdx.data(AbstractTasksModel::IsMaximized).toBool();
if (!isMaximized) {
return false;
}
}
return true;
}
......
......@@ -52,6 +52,7 @@ class TASKMANAGER_EXPORT TaskFilterProxyModel : public QSortFilterProxyModel, pu
Q_PROPERTY(bool filterByScreen READ filterByScreen WRITE setFilterByScreen NOTIFY filterByScreenChanged)
Q_PROPERTY(bool filterByActivity READ filterByActivity WRITE setFilterByActivity NOTIFY filterByActivityChanged)
Q_PROPERTY(bool filterNotMinimized READ filterNotMinimized WRITE setFilterNotMinimized NOTIFY filterNotMinimizedChanged)
Q_PROPERTY(bool filterNotMaximized READ filterNotMaximized WRITE setFilterNotMaximized NOTIFY filterNotMaximizedChanged)
Q_PROPERTY(bool filterSkipTaskbar READ filterSkipTaskbar WRITE setFilterSkipTaskbar NOTIFY filterSkipTaskbarChanged)
Q_PROPERTY(bool filterSkipPager READ filterSkipPager WRITE setFilterSkipPager NOTIFY filterSkipPagerChanged)
......@@ -212,6 +213,23 @@ public:
**/
void setFilterNotMinimized(bool filter);
/**
* Whether non-maximized tasks should be filtered. Defaults to
* @c false.
*
* @see setFilterNotMaximized
* @returns @c true if non-maximized tasks should be filtered.
**/
bool filterNotMaximized() const;
/**
* Set whether non-maximized tasks should be filtered.
*
* @see filterNotMaximized
* @param filter Whether non-maximized tasks should be filtered.
**/
void setFilterNotMaximized(bool filter);
/**
* Whether tasks which should be omitted from 'task bars' should be
* filtered. Defaults to @c true.
......@@ -285,6 +303,7 @@ Q_SIGNALS:
void filterByScreenChanged() const;
void filterByActivityChanged() const;
void filterNotMinimizedChanged() const;
void filterNotMaximizedChanged() const;
void filterSkipTaskbarChanged() const;
void filterSkipPagerChanged() const;
void demandingAttentionSkipsFiltersChanged() const;
......
......@@ -302,6 +302,7 @@ void TasksModel::Private::initModels()
QObject::connect(filterProxyModel, &TaskFilterProxyModel::filterByScreenChanged, q, &TasksModel::filterByScreenChanged);
QObject::connect(filterProxyModel, &TaskFilterProxyModel::filterByActivityChanged, q, &TasksModel::filterByActivityChanged);
QObject::connect(filterProxyModel, &TaskFilterProxyModel::filterNotMinimizedChanged, q, &TasksModel::filterNotMinimizedChanged);
QObject::connect(filterProxyModel, &TaskFilterProxyModel::filterNotMaximizedChanged, q, &TasksModel::filterNotMaximizedChanged);
groupingProxyModel = new TaskGroupingProxyModel(q);
groupingProxyModel->setSourceModel(filterProxyModel);
......@@ -1152,6 +1153,16 @@ void TasksModel::setFilterNotMinimized(bool filter)
d->filterProxyModel->setFilterNotMinimized(filter);
}
bool TasksModel::filterNotMaximized() const
{
return d->filterProxyModel->filterNotMaximized();
}
void TasksModel::setFilterNotMaximized(bool filter)
{
d->filterProxyModel->setFilterNotMaximized(filter);
}
TasksModel::SortMode TasksModel::sortMode() const
{
return d->sortMode;
......
......@@ -73,6 +73,7 @@ class TASKMANAGER_EXPORT TasksModel : public QSortFilterProxyModel, public Abstr
Q_PROPERTY(bool filterByScreen READ filterByScreen WRITE setFilterByScreen NOTIFY filterByScreenChanged)
Q_PROPERTY(bool filterByActivity READ filterByActivity WRITE setFilterByActivity NOTIFY filterByActivityChanged)
Q_PROPERTY(bool filterNotMinimized READ filterNotMinimized WRITE setFilterNotMinimized NOTIFY filterNotMinimizedChanged)
Q_PROPERTY(bool filterNotMaximized READ filterNotMaximized WRITE setFilterNotMaximized NOTIFY filterNotMaximized)
Please register or sign in to reply
Q_PROPERTY(SortMode sortMode READ sortMode WRITE setSortMode NOTIFY sortModeChanged)
Q_PROPERTY(bool separateLaunchers READ separateLaunchers WRITE setSeparateLaunchers NOTIFY separateLaunchersChanged)
......@@ -295,6 +296,23 @@ public:
**/
void setFilterNotMinimized(bool filter);
/**
* Whether non-maximized tasks should be filtered. Defaults to
* @c false.
*
* @see setFilterNotMaximized
* @returns @c true if non-maximized tasks should be filtered.
**/
bool filterNotMaximized() const;
/**
* Set whether non-maximized tasks should be filtered.
*
* @see filterNotMaximized
* @param filter Whether non-maximized tasks should be filtered.
**/
void setFilterNotMaximized(bool filter);
/**
* The sort mode used in sorting tasks. Defaults to SortAlpha.
*
......@@ -848,6 +866,7 @@ Q_SIGNALS:
void filterByScreenChanged() const;
void filterByActivityChanged() const;
void filterNotMinimizedChanged() const;
void filterNotMaximizedChanged() const;
void sortModeChanged() const;
void separateLaunchersChanged() const;
void launchInPlaceChanged() const;
......
......@@ -289,6 +289,17 @@ PanelView::VisibilityMode PanelConfigView::visibilityMode() const
return m_panelView->visibilityMode();
}
void PanelConfigView::setOpacityMode(PanelView::OpacityMode mode)
{
m_panelView->setOpacityMode(mode);
emit opacityModeChanged();
}
PanelView::OpacityMode PanelConfigView::opacityMode() const
{
return m_panelView->opacityMode();
}
Plasma::FrameSvg::EnabledBorders PanelConfigView::enabledBorders() const
{
return m_enabledBorders;
......
......@@ -51,6 +51,7 @@ class PanelConfigView : public PlasmaQuick::ConfigView
{
Q_OBJECT
Q_PROPERTY(PanelView::VisibilityMode visibilityMode READ visibilityMode WRITE setVisibilityMode NOTIFY visibilityModeChanged)
Q_PROPERTY(PanelView::OpacityMode opacityMode READ opacityMode WRITE setOpacityMode NOTIFY opacityModeChanged)
Q_PROPERTY(Plasma::FrameSvg::EnabledBorders enabledBorders READ enabledBorders NOTIFY enabledBordersChanged)
public:
......@@ -62,6 +63,9 @@ public:
PanelView::VisibilityMode visibilityMode() const;
void setVisibilityMode(PanelView::VisibilityMode mode);
PanelView::OpacityMode opacityMode() const;
void setOpacityMode(PanelView::OpacityMode mode);
Plasma::FrameSvg::EnabledBorders enabledBorders() const;
protected:
......@@ -84,6 +88,7 @@ private Q_SLOTS:
Q_SIGNALS:
void visibilityModeChanged();
void opacityModeChanged();
void enabledBordersChanged();
private:
......
......@@ -64,6 +64,7 @@ PanelView::PanelView(ShellCorona *corona, QScreen *targetScreen, QWindow *parent
, m_alignment(Qt::AlignLeft)
, m_corona(corona)
, m_visibilityMode(NormalPanel)
, m_opacityMode(Adaptive)
, m_backgroundHints(Plasma::Types::StandardBackground)
, m_shellSurface(nullptr)
{
......@@ -76,8 +77,10 @@ PanelView::PanelView(ShellCorona *corona, QScreen *targetScreen, QWindow *parent
setClearBeforeRendering(true);
setColor(QColor(Qt::transparent));
setFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus);
updateAdaptiveOpacityEnabled();
connect(&m_theme, &Plasma::Theme::themeChanged, this, &PanelView::updateMask);
connect(&m_theme, &Plasma::Theme::themeChanged, this, &PanelView::updateAdaptiveOpacityEnabled);
connect(this, &PanelView::backgroundHintsChanged, this, &PanelView::updateMask);
connect(this, &PanelView::backgroundHintsChanged, this, &PanelView::updateEnabledBorders);
// TODO: add finished/componentComplete signal to QuickViewSharedEngine,
......@@ -405,6 +408,37 @@ PanelView::VisibilityMode PanelView::visibilityMode() const
return m_visibilityMode;
}
PanelView::OpacityMode PanelView::opacityMode() const
{
if (!m_theme.adaptiveTransparencyEnabled()) {
return PanelView::Translucent;
}
return m_opacityMode;
}
bool PanelView::adaptiveOpacityEnabled()
{
return m_theme.adaptiveTransparencyEnabled();
}
void PanelView::setOpacityMode(PanelView::OpacityMode mode)
{
if (m_opacityMode != mode) {
m_opacityMode = mode;
if (config().isValid() && config().parent().isValid()) {
config().parent().writeEntry("panelOpacity", (int)mode);
m_corona->requestApplicationConfigSync();
}
emit opacityModeChanged();
}
}
void PanelView::updateAdaptiveOpacityEnabled()
{
emit opacityModeChanged();
emit adaptiveOpacityEnabledChanged();
}
void PanelView::positionPanel()
{
if (!containment()) {
......@@ -599,6 +633,7 @@ void PanelView::restore()
// the place for this config key is changed in Plasma 5.9
// Do NOT use readConfigValueWithFallBack
setVisibilityMode((VisibilityMode)panelConfig.parent().readEntry<int>("panelVisibility", panelConfig.readEntry<int>("panelVisibility", (int)NormalPanel)));
setOpacityMode((OpacityMode)readConfigValueWithFallBack("panelOpacity", PanelView::OpacityMode::Adaptive));
m_initCompleted = true;
resizePanel();
positionPanel();
......
......@@ -100,6 +100,18 @@ class PanelView : public PlasmaQuick::ContainmentView
*/
Q_PROPERTY(VisibilityMode visibilityMode READ visibilityMode WRITE setVisibilityMode NOTIFY visibilityModeChanged)
/**
* Property that determines how a panel's opacity behaves.
*
* @see OpacityMode
*/
Q_PROPERTY(OpacityMode opacityMode READ opacityMode WRITE setOpacityMode NOTIFY opacityModeChanged)
/**
/* Property that determines whether adaptive opacity is used.
*/
Q_PROPERTY(bool adaptiveOpacityEnabled READ adaptiveOpacityEnabled NOTIFY adaptiveOpacityEnabledChanged)
public:
enum VisibilityMode {
NormalPanel = 0, /** default, always visible panel, the windowmanager reserves a places for it */
......@@ -109,6 +121,14 @@ public:
};
Q_ENUM(VisibilityMode)
/** Enumeration of possible opacity modes. */
enum OpacityMode {
Adaptive = 0, /** The panel will change opacity depending on the presence of a maximized window */
Opaque, /** The panel will always be opaque */
Translucent /** The panel will always be translucent */
};
Q_ENUM(OpacityMode)
explicit PanelView(ShellCorona *corona, QScreen *targetScreen = nullptr, QWindow *parent = nullptr);
~PanelView() override;
......@@ -147,6 +167,11 @@ public:
VisibilityMode visibilityMode() const;
void setVisibilityMode(PanelView::VisibilityMode mode);
PanelView::OpacityMode opacityMode() const;
bool adaptiveOpacityEnabled();
void setOpacityMode(PanelView::OpacityMode mode);
void updateAdaptiveOpacityEnabled();
/**
* @returns the geometry of the panel given a distance
*/
......@@ -185,6 +210,8 @@ Q_SIGNALS:
// QWindow does not have a property for screen. Adding this property requires re-implementing the signal
void screenToFollowChanged(QScreen *screen);
void visibilityModeChanged();
void opacityModeChanged();
void adaptiveOpacityEnabledChanged();
protected Q_SLOTS:
/**
......@@ -235,6 +262,7 @@ private:
ShellCorona *m_corona;
QTimer m_strutsTimer;
VisibilityMode m_visibilityMode;
OpacityMode m_opacityMode;
Plasma::Theme m_theme;
QTimer m_positionPaneltimer;
QTimer m_unhideTimer;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment