1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
|
#ifndef adwaita_helper_h
#define adwaita_helper_h
/*************************************************************************
* Copyright (C) 2014 by Hugo Pereira Da Costa <hugo.pereira@free.fr> *
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
*************************************************************************/
#include "adwaita.h"
#include "adwaitaanimationdata.h"
#include "config-adwaita.h"
#include <QPainterPath>
#include <QWidget>
#include <QStyle>
#if ADWAITA_HAVE_X11
#include <QX11Info>
#include <xcb/xcb.h>
#endif
#include <cmath>
namespace Adwaita
{
//* adwaita style helper class.
/** contains utility functions used at multiple places in both adwaita style and adwaita window decoration */
class Helper
{
public:
//* constructor
explicit Helper( );
#if ADWAITA_USE_KDE4
//* constructor
explicit Helper( const QByteArray& );
#endif
//* destructor
virtual ~Helper()
{}
//*@name color utilities
//@{
// Borrowed from the KColorUtils code
static QColor mix(const QColor &c1, const QColor &c2, qreal bias = 0.5)
{
auto mixQreal = [](qreal a, qreal b, qreal bias) { return a + (b - a) * bias; };
if (bias <= 0.0) return c1;
if (bias >= 1.0) return c2;
if (std::isnan(bias)) return c1;
qreal r = mixQreal(c1.redF(), c2.redF(), bias);
qreal g = mixQreal(c1.greenF(), c2.greenF(), bias);
qreal b = mixQreal(c1.blueF(), c2.blueF(), bias);
qreal a = mixQreal(c1.alphaF(), c2.alphaF(), bias);
return QColor::fromRgbF(r, g, b, a);
}
//* add alpha channel multiplier to color
QColor alphaColor( QColor color, qreal alpha ) const;
// ADWAITA TODO
//* mouse over color
QColor hoverColor( const QPalette& palette ) const
{ return palette.highlight().color(); }
//* focus color
QColor focusColor( const QPalette& palette ) const
{ return palette.highlight().color(); }
//* negative text color (used for close button)
QColor negativeText( const QPalette& palette ) const
// { return _viewNegativeTextBrush.brush( palette ).color(); }
{ Q_UNUSED(palette); return Qt::red; }
//* shadow
QColor shadowColor( const QPalette& palette ) const
{ return alphaColor( palette.color( QPalette::Shadow ), 0.15 ); }
//* titlebar color
QColor titleBarColor( const QPalette& palette, bool active ) const
{ return palette.color(active ? QPalette::Active : QPalette::Inactive, QPalette::Window); }
//* titlebar text color
QColor titleBarTextColor( const QPalette& palette, bool active ) const
{ return palette.color(active ? QPalette::Active : QPalette::Inactive, QPalette::WindowText); }
//* frame outline color, using animations
QColor frameOutlineColor( const QPalette&, bool mouseOver = false, bool hasFocus = false, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* input outline color, using animations
QColor inputOutlineColor( const QPalette& palette, bool mouseOver = false, bool hasFocus = false, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* focus outline color, using animations
QColor focusOutlineColor( const QPalette& ) const;
//* hover outline color, using animations
QColor hoverOutlineColor( const QPalette& ) const;
//* focus outline color, using animations
QColor buttonFocusOutlineColor( const QPalette& ) const;
//* hover outline color, using animations
QColor buttonHoverOutlineColor( const QPalette& ) const;
//* side panel outline color, using animations
QColor sidePanelOutlineColor( const QPalette&, bool hasFocus = false, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* frame background color
QColor frameBackgroundColor( const QPalette& palette ) const
{ return frameBackgroundColor( palette, palette.currentColorGroup() ); }
//* frame background color
QColor frameBackgroundColor( const QPalette&, QPalette::ColorGroup ) const;
//* arrow outline color
QColor arrowColor( const QPalette&, QPalette::ColorGroup, QPalette::ColorRole ) const;
//* arrow outline color
QColor arrowColor( const QPalette& palette, QPalette::ColorRole role ) const
{ return arrowColor( palette, palette.currentColorGroup(), role ); }
//* arrow outline color, using animations
QColor arrowColor( const QPalette&, bool mouseOver, bool hasFocus, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* button outline color, using animations
QColor buttonOutlineColor( const QPalette&, bool mouseOver, bool hasFocus, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* button panel color, using animations
QColor buttonBackgroundColor( const QPalette&, bool mouseOver, bool hasFocus, bool sunken, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* tool button color
QColor toolButtonColor( const QPalette&, bool mouseOver, bool hasFocus, bool sunken, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* slider outline color, using animations
QColor sliderOutlineColor( const QPalette&, bool mouseOver, bool hasFocus, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* scrollbar handle color, using animations
QColor scrollBarHandleColor( const QPalette&, bool mouseOver, bool hasFocus, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* checkbox indicator, using animations
QColor checkBoxIndicatorColor( const QPalette&, bool mouseOver, bool active, qreal opacity = AnimationData::OpacityInvalid, AnimationMode = AnimationNone ) const;
//* separator color
QColor separatorColor( const QPalette& ) const;
//* TreeView header text color
QColor headerTextColor( const QPalette& palette, const QStyle::State state ) const;
//* TabBar background color
QColor tabBarColor( const QPalette& palette, const QStyle::State state ) const;
//* merge active and inactive palettes based on ratio, for smooth enable state change transition
QPalette disabledPalette( const QPalette&, qreal ratio ) const;
//@}
//*@name rendering utilities
//@{
//* debug frame
void renderDebugFrame( QPainter*, const QRect& ) const;
//* focus rect
void renderFocusRect( QPainter*, const QRect&, const QColor&, const QColor& outline = QColor(), Sides = 0 ) const;
//* focus line
void renderFocusLine( QPainter*, const QRect&, const QColor& ) const;
//* generic frame
void renderFrame( QPainter*, const QRect&, const QColor& color, const QColor& outline = QColor(), bool hasFocus = false ) const;
//* square frame
void renderSquareFrame( QPainter* painter, const QRect& rect, QColor color, bool hasFocus ) const;
//* generic frame flat on right side
void renderFlatFrame( QPainter*, const QRect&, const QColor& color, const QColor& outline = QColor(), bool hasFocus = false ) const;
//* side panel frame
void renderSidePanelFrame( QPainter*, const QRect&, const QColor& outline, Side ) const;
//* menu frame
void renderMenuFrame( QPainter*, const QRect&, const QColor& color, const QColor& outline, bool roundCorners = true ) const;
//* button frame
void renderButtonFrame(QPainter*, const QRect&, const QColor& color, const QColor& outline, const QColor& shadow, bool focus, bool sunken, bool mouseOver , bool active) const;
//* button frame
void renderFlatButtonFrame(QPainter*, const QRect&, const QColor& color, const QColor& outline, const QColor& shadow, bool focus, bool sunken, bool mouseOver , bool active) const;
//* toolbutton frame
void renderToolButtonFrame( QPainter*, const QRect&, const QColor& color, bool sunken ) const;
//* toolbutton frame
void renderToolBoxFrame( QPainter*, const QRect&, int tabWidth, const QColor& color ) const;
//* tab widget frame
void renderTabWidgetFrame( QPainter*, const QRect&, const QColor& color, const QColor& outline, Corners ) const;
//* selection frame
void renderSelection( QPainter*, const QRect&, const QColor& ) const;
//* separator
void renderSeparator( QPainter*, const QRect&, const QColor&, bool vertical = false ) const;
//* checkbox
void renderCheckBoxBackground( QPainter*, const QRect&, const QColor& color, const QColor& outline, bool sunken ) const;
//* checkbox
void renderCheckBox( QPainter*, const QRect&, const QColor& background, const QColor& outline, const QColor& tickColor, bool sunken, CheckBoxState state, qreal animation = AnimationData::OpacityInvalid, bool active = true ) const;
//* radio button
void renderRadioButtonBackground( QPainter*, const QRect&, const QColor& color, const QColor& outline, bool sunken ) const;
//* radio button
void renderRadioButton(QPainter*, const QRect&, const QColor& background, const QColor& outline, const QColor& tickColor, bool sunken, bool enabled, RadioButtonState state, qreal animation = AnimationData::OpacityInvalid ) const;
//* slider groove
void renderSliderGroove( QPainter*, const QRect&, const QColor& ) const;
//* slider handle
void renderSliderHandle( QPainter*, const QRect&, const QColor&, const QColor& outline, const QColor& shadow, bool sunken, bool enabled, Side ticks, qreal angle = 0.0 ) const;
//* dial groove
void renderDialGroove( QPainter*, const QRect&, const QColor& ) const;
//* dial groove
void renderDialContents( QPainter*, const QRect&, const QColor&, qreal first, qreal second ) const;
//* progress bar groove
void renderProgressBarGroove( QPainter*, const QRect&, const QColor&, const QColor& ) const;
//* progress bar contents
void renderProgressBarContents( QPainter* painter, const QRect& rect, const QColor& color, const QColor& outline ) const
{ return renderProgressBarGroove( painter, rect, color, outline ); }
//* progress bar contents (animated)
void renderProgressBarBusyContents( QPainter* painter, const QRect& rect, const QColor& color, const QColor& outline, bool horizontal, bool reverse, int progress ) const;
//* scrollbar groove
void renderScrollBarGroove( QPainter* painter, const QRect& rect, const QColor& color ) const
{ return renderScrollBarHandle( painter, rect, color ); }
//* scrollbar handle
void renderScrollBarHandle( QPainter*, const QRect&, const QColor& ) const;
//* toolbar handle
void renderToolBarHandle( QPainter* painter, const QRect& rect, const QColor& color ) const
{ return renderProgressBarGroove( painter, rect, color, Qt::transparent ); }
//* tabbar tab
void renderTabBarTab(QPainter*, const QRect&, const QColor &background, const QColor& color, const QColor& outline, Corners, bool renderFrame ) const;
//* generic arrow
void renderArrow( QPainter*, const QRect&, const QColor&, ArrowOrientation ) const;
//* generic sign (+-)
void renderSign(QPainter*painter, const QRect&rect, const QColor&color, bool orientation ) const;
//* generic button (for mdi decorations, tabs and dock widgets)
void renderDecorationButton( QPainter*, const QRect&, const QColor&, ButtonType, bool inverted ) const;
//@}
//*@name compositing utilities
//@{
//* true if style was compiled for and is running on X11
static bool isX11( void );
//* true if running on platform Wayland
static bool isWayland( void );
//* returns true if compositing is active
bool compositingActive( void ) const;
//* returns true if a given widget supports alpha channel
bool hasAlphaChannel( const QWidget* ) const;
//@}
//@name high dpi utility functions
//@{
//* return dpi-aware pixmap of given size
virtual QPixmap highDpiPixmap( const QSize& size ) const
{ return highDpiPixmap( size.width(), size.height() ); }
//* return dpi-aware pixmap of given size
virtual QPixmap highDpiPixmap( int width ) const
{ return highDpiPixmap( width, width ); }
//* return dpi-aware pixmap of given size
virtual QPixmap highDpiPixmap( int width, int height ) const;
//* return device pixel ratio for a given pixmap
virtual qreal devicePixelRatio( const QPixmap& ) const;
//@}
//*@name X11 utilities
//@{
#if ADWAITA_HAVE_X11
//* get xcb connection
static xcb_connection_t* connection( void );
//* create xcb atom
xcb_atom_t createAtom( const QString& ) const;
#endif
//@}
//* frame radius
qreal frameRadius( qreal bias = 0 ) const
{ return qMax( qreal( Metrics::Frame_FrameRadius ) - 0.5 + bias, 0.0 ); }
void setVariant(QWidget *widget, const QByteArray &variant);
protected:
//* initialize
void init( void );
//* return rectangle for widgets shadow, offset depending on light source
QRectF shadowRect( const QRectF& ) const;
//* return rounded path in a given rect, with only selected corners rounded, and for a given radius
QPainterPath roundedPath( const QRectF&, Corners, qreal ) const;
private:
#if ADWAITA_HAVE_X11
//* atom used for compositing manager
xcb_atom_t _compositingManagerAtom;
#endif
};
}
#endif
|