Move Oxygen kwin decoration to the oxygen folder
parent
f8134f9393
commit
b33425baaa
|
@ -133,7 +133,6 @@ endif()
|
|||
include(CMakeDependentOption)
|
||||
|
||||
option(KWIN_BUILD_DECORATIONS "Enable building of KWin decorations." ON)
|
||||
option(KWIN_BUILD_OXYGEN "Enable building of default decoration Oxygen" ON)
|
||||
option(KWIN_BUILD_KCMS "Enable building of KWin configuration modules." ON)
|
||||
option(KWIN_BUILD_TABBOX "Enable building of KWin Tabbox functionality" ON)
|
||||
option(KWIN_BUILD_SCREENEDGES "Enable building of KWin with screen edge support" ON)
|
||||
|
|
|
@ -1,5 +1,2 @@
|
|||
add_definitions(-DKDE_DEFAULT_DEBUG_AREA=1216)
|
||||
add_subdirectory( aurorae )
|
||||
if(KWIN_BUILD_OXYGEN)
|
||||
add_subdirectory( oxygen )
|
||||
endif()
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
########### add version number into compilation defines
|
||||
add_definitions (-DAPP_VERSION=\\\"${KWIN_VERSION}\\\")
|
||||
add_definitions(-DHAVE_X11=${X11_FOUND})
|
||||
add_subdirectory(config)
|
||||
add_subdirectory(demo)
|
||||
add_subdirectory(data)
|
||||
|
||||
########### next target ###############
|
||||
set(kwin_oxygen_SRCS
|
||||
oxygenbutton.cpp
|
||||
oxygenclient.cpp
|
||||
oxygenclientgroupitemdata.cpp
|
||||
oxygendecohelper.cpp
|
||||
oxygenexceptionlist.cpp
|
||||
oxygenfactory.cpp
|
||||
oxygensizegrip.cpp
|
||||
oxygentitleanimationdata.cpp
|
||||
)
|
||||
|
||||
kconfig_add_kcfg_files(kwin_oxygen_SRCS oxygenconfiguration.kcfgc )
|
||||
|
||||
add_library(kwin3_oxygen MODULE ${kwin_oxygen_SRCS})
|
||||
target_link_libraries(kwin3_oxygen Qt5::Widgets )
|
||||
target_link_libraries(kwin3_oxygen KF5::I18n KF5::WindowSystem KF5::Style KF5::Service)
|
||||
|
||||
target_link_libraries(kwin3_oxygen kdecorations)
|
||||
|
||||
target_link_libraries(kwin3_oxygen oxygenstyle)
|
||||
|
||||
kservice_desktop_to_json(kwin3_oxygen oxygenclient.desktop)
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(kwin3_oxygen XCB::XCB)
|
||||
endif()
|
||||
|
||||
install(TARGETS kwin3_oxygen DESTINATION ${PLUGIN_INSTALL_DIR}/kwin/kdecorations)
|
|
@ -1,35 +0,0 @@
|
|||
set(kwin_oxygen_config_PART_SRCS
|
||||
oxygenanimationconfigwidget.cpp
|
||||
oxygenconfig.cpp
|
||||
oxygenconfigwidget.cpp
|
||||
oxygendetectwidget.cpp
|
||||
oxygenexceptiondialog.cpp
|
||||
oxygenexceptionlistwidget.cpp
|
||||
oxygenexceptionmodel.cpp
|
||||
../oxygenexceptionlist.cpp
|
||||
)
|
||||
|
||||
kconfig_add_kcfg_files(kwin_oxygen_config_PART_SRCS ../oxygenconfiguration.kcfgc)
|
||||
|
||||
set( kwin_oxygen_config_PART_FORMS
|
||||
ui/oxygenconfigurationui.ui
|
||||
ui/oxygendetectwidget.ui
|
||||
ui/oxygenexceptiondialog.ui
|
||||
ui/oxygenexceptionlistwidget.ui
|
||||
)
|
||||
|
||||
qt5_wrap_ui(kwin_oxygen_config_PART_FORMS_HEADERS ${kwin_oxygen_config_PART_FORMS})
|
||||
add_library(kwin_oxygen_config MODULE
|
||||
${kwin_oxygen_config_PART_SRCS}
|
||||
${kwin_oxygen_config_PART_FORMS_HEADERS})
|
||||
|
||||
target_link_libraries(kwin_oxygen_config Qt5::Core Qt5::Gui Qt5::Widgets Qt5::DBus)
|
||||
target_link_libraries(kwin_oxygen_config KF5::WindowSystem KF5::Completion)
|
||||
target_link_libraries(kwin_oxygen_config kdecorations oxygenstyle oxygenstyleconfig)
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(kwin_oxygen_config XCB::XCB)
|
||||
target_link_libraries(kwin_oxygen_config Qt5::X11Extras)
|
||||
endif()
|
||||
|
||||
install(TARGETS kwin_oxygen_config DESTINATION ${QT_PLUGIN_INSTALL_DIR}/kf5/kwin/kdecorations/config)
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"X-KDE-PluginInfo-Name": "Oxygen"
|
||||
}
|
|
@ -1,156 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenanimationconfigwidget.cpp
|
||||
// animation configuration widget
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenanimationconfigwidget.h"
|
||||
#include "oxygenanimationconfigwidget.moc"
|
||||
#include "oxygenanimationconfigitem.h"
|
||||
#include "oxygengenericanimationconfigitem.h"
|
||||
|
||||
#include <QButtonGroup>
|
||||
#include <QHoverEvent>
|
||||
#include <QTextStream>
|
||||
#include <KLocalizedString>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_______________________________________________
|
||||
AnimationConfigWidget::AnimationConfigWidget( QWidget* parent ):
|
||||
BaseAnimationConfigWidget( parent )
|
||||
{
|
||||
|
||||
QGridLayout* layout( qobject_cast<QGridLayout*>( BaseAnimationConfigWidget::layout() ) );
|
||||
|
||||
setupItem( layout, _buttonAnimations = new GenericAnimationConfigItem( this,
|
||||
i18n("Button mouseover transition"),
|
||||
i18n("Configure window buttons' mouseover highlight animation" ) ) );
|
||||
|
||||
setupItem( layout, _titleAnimations = new GenericAnimationConfigItem( this,
|
||||
i18n("Title transitions" ),
|
||||
i18n("Configure fading transitions when window title is changed" ) ) );
|
||||
|
||||
setupItem( layout, _shadowAnimations = new GenericAnimationConfigItem( this,
|
||||
i18n("Window active state change transitions" ),
|
||||
i18n("Configure fading between window shadow and glow when window's active state is changed" ) ) );
|
||||
|
||||
setupItem( layout, _tabAnimations = new GenericAnimationConfigItem( this,
|
||||
i18n("Window grouping animations" ),
|
||||
i18n("Configure window titlebar animations when windows are grouped/ungrouped" ) ) );
|
||||
|
||||
// add spacers to the first column, previous row to finalize layout
|
||||
layout->addItem( new QSpacerItem( 25, 0 ), _row-1, 0, 1, 1 );
|
||||
|
||||
// add vertical spacer
|
||||
layout->addItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding ), _row, 1, 1, 1 );
|
||||
++_row;
|
||||
|
||||
connect( animationsEnabled(), SIGNAL(toggled(bool)), SLOT(updateChanged()) );
|
||||
foreach( AnimationConfigItem* item, findChildren<AnimationConfigItem*>() )
|
||||
{
|
||||
item->QWidget::setEnabled( false );
|
||||
connect( animationsEnabled(), SIGNAL(toggled(bool)), item, SLOT(setEnabled(bool)) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
void AnimationConfigWidget::load( void )
|
||||
{
|
||||
|
||||
// check configuration
|
||||
if( !_configuration ) return;
|
||||
|
||||
animationsEnabled()->setChecked( _configuration->animationsEnabled() );
|
||||
|
||||
_buttonAnimations->setEnabled( _configuration->buttonAnimationsEnabled() );
|
||||
_buttonAnimations->setDuration( _configuration->buttonAnimationsDuration() );
|
||||
|
||||
_titleAnimations->setEnabled( _configuration->titleAnimationsEnabled() );
|
||||
_titleAnimations->setDuration( _configuration->titleAnimationsDuration() );
|
||||
|
||||
_shadowAnimations->setEnabled( _configuration->shadowAnimationsEnabled() );
|
||||
_shadowAnimations->setDuration( _configuration->shadowAnimationsDuration() );
|
||||
|
||||
_tabAnimations->setEnabled( _configuration->tabAnimationsEnabled() );
|
||||
_tabAnimations->setDuration( _configuration->tabAnimationsDuration() );
|
||||
|
||||
setChanged( false );
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
void AnimationConfigWidget::save( void )
|
||||
{
|
||||
|
||||
// check configuration
|
||||
if( !_configuration ) return;
|
||||
|
||||
// save modifications
|
||||
_configuration->setAnimationsEnabled( animationsEnabled()->isChecked() );
|
||||
|
||||
_configuration->setButtonAnimationsEnabled( _buttonAnimations->enabled() );
|
||||
_configuration->setButtonAnimationsDuration( _buttonAnimations->duration() );
|
||||
|
||||
_configuration->setTitleAnimationsEnabled( _titleAnimations->enabled() );
|
||||
_configuration->setTitleAnimationsDuration( _titleAnimations->duration() );
|
||||
|
||||
_configuration->setShadowAnimationsEnabled( _shadowAnimations->enabled() );
|
||||
_configuration->setShadowAnimationsDuration( _shadowAnimations->duration() );
|
||||
|
||||
_configuration->setTabAnimationsEnabled( _tabAnimations->enabled() );
|
||||
_configuration->setTabAnimationsDuration( _tabAnimations->duration() );
|
||||
|
||||
setChanged( false );
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
void AnimationConfigWidget::updateChanged( void )
|
||||
{
|
||||
|
||||
// check configuration
|
||||
if( !_configuration ) return;
|
||||
|
||||
// track modifications
|
||||
bool modified( false );
|
||||
if( animationsEnabled()->isChecked() != _configuration->animationsEnabled() ) modified = true;
|
||||
else if( _buttonAnimations->enabled() != _configuration->buttonAnimationsEnabled() ) modified = true;
|
||||
else if( _buttonAnimations->duration() != _configuration->buttonAnimationsDuration() ) modified = true;
|
||||
|
||||
else if( _titleAnimations->enabled() != _configuration->titleAnimationsEnabled() ) modified = true;
|
||||
else if( _titleAnimations->duration() != _configuration->titleAnimationsDuration() ) modified = true;
|
||||
|
||||
else if( _shadowAnimations->enabled() != _configuration->shadowAnimationsEnabled() ) modified = true;
|
||||
else if( _shadowAnimations->duration() != _configuration->shadowAnimationsDuration() ) modified = true;
|
||||
|
||||
else if( _tabAnimations->enabled() != _configuration->tabAnimationsEnabled() ) modified = true;
|
||||
else if( _tabAnimations->duration() != _configuration->tabAnimationsDuration() ) modified = true;
|
||||
|
||||
setChanged( modified );
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
#ifndef oxygenanimationconfigwidget_h
|
||||
#define oxygenanimationconfigwidget_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenanimationconfigwidget.h
|
||||
// animation configuration item
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "../oxygendecorationdefines.h"
|
||||
#include "oxygenbaseanimationconfigwidget.h"
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
// forward declaration
|
||||
class GenericAnimationConfigItem;
|
||||
|
||||
//! container to configure animations individually
|
||||
class AnimationConfigWidget: public BaseAnimationConfigWidget
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit AnimationConfigWidget( QWidget* = 0 );
|
||||
|
||||
//! destructor
|
||||
virtual ~AnimationConfigWidget( void )
|
||||
{}
|
||||
|
||||
//! configuration
|
||||
void setConfiguration( ConfigurationPtr configuration )
|
||||
{ _configuration = configuration; }
|
||||
|
||||
public Q_SLOTS:
|
||||
|
||||
//! read current configuration
|
||||
virtual void load( void );
|
||||
|
||||
//! save current configuration
|
||||
virtual void save( void );
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! check whether configuration is changed and emit appropriate signal if yes
|
||||
virtual void updateChanged();
|
||||
|
||||
private:
|
||||
|
||||
//! local configuration, needed to handle I/O
|
||||
ConfigurationPtr _configuration;
|
||||
|
||||
//!@name animations
|
||||
//@{
|
||||
GenericAnimationConfigItem* _buttonAnimations;
|
||||
GenericAnimationConfigItem* _titleAnimations;
|
||||
GenericAnimationConfigItem* _shadowAnimations;
|
||||
GenericAnimationConfigItem* _tabAnimations;
|
||||
//@}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,181 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// config.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
// Copyright (C) 2008 Lubos Lunak <l.lunak@kde.org>
|
||||
//
|
||||
// Based on the Quartz configuration module,
|
||||
// Copyright (c) 2001 Karol Szwed <gallium@kde.org>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfig.h"
|
||||
|
||||
#include "oxygenanimationconfigwidget.h"
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "oxygenutil.h"
|
||||
#include "../oxygenexceptionlist.h"
|
||||
|
||||
#include <QTextStream>
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusMessage>
|
||||
|
||||
#include <KConfigGroup>
|
||||
#include <KLocalizedString>
|
||||
#include <KPluginFactory>
|
||||
|
||||
//_______________________________________________________________________
|
||||
|
||||
K_PLUGIN_FACTORY_WITH_JSON(OxygenConfigPlugin,
|
||||
"config.json",
|
||||
registerPlugin<Oxygen::Config>(QString(), &Oxygen::Config::create); )
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
QObject *Config::create(QWidget *parentWidget, QObject *, const QList<QVariant> &)
|
||||
{
|
||||
return new Config(parentWidget);
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
Config::Config(QWidget* parent ):
|
||||
QObject( parent )
|
||||
{
|
||||
|
||||
// configuration
|
||||
_configuration = KSharedConfig::openConfig( QStringLiteral( "oxygenrc" ) );
|
||||
|
||||
// create new configuration widget and add to layout, if any
|
||||
_configWidget = new ConfigWidget( parent );
|
||||
if( parent && parent->layout() ) parent->layout()->addWidget( _configWidget );
|
||||
else _configWidget->show();
|
||||
|
||||
load();
|
||||
connect( _configWidget, SIGNAL(changed(bool)), SLOT(updateChanged()) );
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
Config::~Config()
|
||||
{ delete _configWidget; }
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::toggleExpertMode( bool value )
|
||||
{ _configWidget->toggleExpertMode( value ); }
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::load( void )
|
||||
{
|
||||
|
||||
// load standard configuration
|
||||
ConfigurationPtr configuration( new Configuration() );
|
||||
configuration->readConfig();
|
||||
loadConfiguration( configuration );
|
||||
|
||||
// load shadows
|
||||
foreach( ShadowConfigWidget* ui, _configWidget->shadowConfigurations )
|
||||
{ ui->readConfig( _configuration.data() ); }
|
||||
|
||||
// load exceptions
|
||||
ExceptionList exceptions;
|
||||
exceptions.readConfig( _configuration );
|
||||
_configWidget->exceptionListWidget()->setExceptions( exceptions.get() );
|
||||
updateChanged();
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::updateChanged( void )
|
||||
{
|
||||
|
||||
ConfigurationPtr configuration( new Configuration() );
|
||||
configuration->readConfig();
|
||||
bool modified( false );
|
||||
|
||||
// exceptions
|
||||
if( _configWidget->isChanged() ) modified = true;
|
||||
|
||||
// emit relevant signals
|
||||
if( modified ) emit changed();
|
||||
emit changed( modified );
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::save( void )
|
||||
{
|
||||
|
||||
// create configuration from group
|
||||
ConfigurationPtr configuration( new Configuration() );
|
||||
configuration->readConfig();
|
||||
|
||||
// save config widget
|
||||
_configWidget->setConfiguration( configuration );
|
||||
_configWidget->save();
|
||||
|
||||
// save standard configuration
|
||||
Util::writeConfig( configuration.data(), _configuration.data() );
|
||||
|
||||
// get list of exceptions and write
|
||||
ConfigurationList exceptions( _configWidget->exceptionListWidget()->exceptions() );
|
||||
ExceptionList( exceptions ).writeConfig( _configuration );
|
||||
|
||||
// write shadow configuration
|
||||
foreach( ShadowConfigWidget* ui, _configWidget->shadowConfigurations )
|
||||
{ ui->writeConfig( _configuration.data() ); }
|
||||
|
||||
// sync configuration
|
||||
_configuration->sync();
|
||||
|
||||
QDBusMessage message( QDBusMessage::createSignal( QStringLiteral( "/OxygenWindeco" ), QStringLiteral( "org.kde.Oxygen.Style" ), QStringLiteral( "reparseConfiguration") ) );
|
||||
QDBusConnection::sessionBus().send(message);
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::defaults( void )
|
||||
{
|
||||
|
||||
// install default configuration
|
||||
ConfigurationPtr configuration( new Configuration() );
|
||||
configuration->setDefaults();
|
||||
loadConfiguration( configuration );
|
||||
|
||||
// load shadows
|
||||
foreach( ShadowConfigWidget* ui, _configWidget->shadowConfigurations )
|
||||
{ ui->readDefaults( _configuration.data() ); }
|
||||
|
||||
updateChanged();
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
void Config::loadConfiguration( ConfigurationPtr configuration )
|
||||
{
|
||||
|
||||
_configWidget->setConfiguration( configuration );
|
||||
_configWidget->load();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#include "oxygenconfig.moc"
|
|
@ -1,112 +0,0 @@
|
|||
#ifndef oxygen_config_h
|
||||
#define oxygen_config_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// config.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
// Copyright (C) 2008 Lubos Lunak <l.lunak@kde.org>
|
||||
//
|
||||
// Based on the Quartz configuration module,
|
||||
// Copyright (c) 2001 Karol Szwed <gallium@kde.org>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfigwidget.h"
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "../oxygendecorationdefines.h"
|
||||
|
||||
#include <KSharedConfig>
|
||||
#include <QPalette>
|
||||
|
||||
namespace Oxygen {
|
||||
|
||||
class Configuration;
|
||||
|
||||
// oxygen configuration object
|
||||
class Config: public QObject
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
Config( QWidget* parent );
|
||||
|
||||
//! destructor
|
||||
~Config();
|
||||
|
||||
static QObject *create(QWidget *parentWidget, QObject *parent, const QList<QVariant> &arguments);
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
//! emmited whenever configuration is changed
|
||||
void changed();
|
||||
|
||||
//! emmited whenever configuration is changed
|
||||
void changed( bool );
|
||||
|
||||
public Q_SLOTS:
|
||||
|
||||
//! load configuration
|
||||
/*! although kconfiggroup argument is not used. It is required by KWin API */
|
||||
void load( const KConfigGroup& )
|
||||
{ load(); }
|
||||
|
||||
//! save configuration
|
||||
/*! although kconfiggroup argument is not used. It is required by KWin API */
|
||||
void save( KConfigGroup& )
|
||||
{ save(); }
|
||||
|
||||
//! load configuration
|
||||
void load( void );
|
||||
|
||||
//! save configuration
|
||||
void save( void );
|
||||
|
||||
//! restore defaults
|
||||
void defaults( void );
|
||||
|
||||
//! toggle expert mode
|
||||
void toggleExpertMode( bool );
|
||||
|
||||
private Q_SLOTS:
|
||||
|
||||
//! update change state
|
||||
void updateChanged( void );
|
||||
|
||||
private:
|
||||
|
||||
//! load configuration
|
||||
void loadConfiguration( ConfigurationPtr );
|
||||
|
||||
//! user interface
|
||||
ConfigWidget* _configWidget;
|
||||
|
||||
//! kconfiguration object
|
||||
KSharedConfig::Ptr _configuration;
|
||||
|
||||
};
|
||||
|
||||
} //namespace Oxygen
|
||||
|
||||
#endif
|
|
@ -1,251 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenconfigurationui.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfigwidget.h"
|
||||
#include "oxygenanimationconfigwidget.h"
|
||||
|
||||
#include <QGroupBox>
|
||||
#include <QIcon>
|
||||
#include <QLabel>
|
||||
#include <QLayout>
|
||||
|
||||
#include <KLocalizedString>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_________________________________________________________
|
||||
ConfigWidget::ConfigWidget( QWidget* parent ):
|
||||
QWidget( parent ),
|
||||
_expertMode( false ),
|
||||
_animationConfigWidget(0),
|
||||
_changed( false )
|
||||
{
|
||||
|
||||
ui.setupUi( this );
|
||||
|
||||
// shadow configuration
|
||||
ui.activeShadowConfiguration->setGroup( QPalette::Active );
|
||||
ui.inactiveShadowConfiguration->setGroup( QPalette::Inactive );
|
||||
|
||||
shadowConfigurations.append( ui.activeShadowConfiguration );
|
||||
shadowConfigurations.append( ui.inactiveShadowConfiguration );
|
||||
|
||||
// animation config widget
|
||||
_animationConfigWidget = new AnimationConfigWidget();
|
||||
_animationConfigWidget->installEventFilter( this );
|
||||
|
||||
// expert mode
|
||||
ui._expertModeButton->setIcon( QIcon::fromTheme( QStringLiteral( "configure" ) ) );
|
||||
toggleExpertModeInternal( false );
|
||||
|
||||
// connections
|
||||
connect( ui._expertModeButton, SIGNAL(clicked()), SLOT(toggleExpertModeInternal()) );
|
||||
connect( _animationConfigWidget, SIGNAL(layoutChanged()), SLOT(updateLayout()) );
|
||||
|
||||
// track ui changes
|
||||
connect( ui.titleAlignment, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( ui.buttonSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( ui.frameBorder, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
|
||||
connect( ui.titleOutline, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
connect( ui.drawSizeGrip, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
connect( ui.narrowButtonSpacing, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
connect( ui.closeFromMenuButton, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
connect( ui.separatorMode, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( ui.drawBorderOnMaximizedWindows, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
|
||||
// track exception changes
|
||||
connect( ui.exceptions, SIGNAL(changed(bool)), SLOT(updateChanged()) );
|
||||
|
||||
// track shadow configuration changes
|
||||
connect( shadowConfigurations[0], SIGNAL(changed(bool)), SLOT(updateChanged()) );
|
||||
connect( shadowConfigurations[1], SIGNAL(changed(bool)), SLOT(updateChanged()) );
|
||||
|
||||
// track animations changes
|
||||
connect( ui.animationsEnabled, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
connect( _animationConfigWidget, SIGNAL(changed(bool)), SLOT(updateChanged()) );
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ConfigWidget::setConfiguration( ConfigurationPtr configuration )
|
||||
{
|
||||
_configuration = configuration;
|
||||
_animationConfigWidget->setConfiguration( configuration );
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ConfigWidget::load( void )
|
||||
{
|
||||
if( !_configuration ) return;
|
||||
ui.titleAlignment->setCurrentIndex( _configuration->titleAlignment() );
|
||||
ui.buttonSize->setCurrentIndex( _configuration->buttonSize() );
|
||||
ui.frameBorder->setCurrentIndex( _configuration->frameBorder() );
|
||||
ui.separatorMode->setCurrentIndex( _configuration->separatorMode() );
|
||||
ui.drawSizeGrip->setChecked( _configuration->drawSizeGrip() );
|
||||
ui.titleOutline->setChecked( _configuration->drawTitleOutline() );
|
||||
ui.animationsEnabled->setChecked( _configuration->animationsEnabled() );
|
||||
ui.narrowButtonSpacing->setChecked( _configuration->useNarrowButtonSpacing() );
|
||||
ui.closeFromMenuButton->setChecked( _configuration->closeWindowFromMenuButton() );
|
||||
ui.drawBorderOnMaximizedWindows->setChecked( _configuration->drawBorderOnMaximizedWindows() );
|
||||
setChanged( false );
|
||||
|
||||
_animationConfigWidget->load();
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ConfigWidget::save( void )
|
||||
{
|
||||
|
||||
if( !_configuration ) return;
|
||||
|
||||
// apply modifications from ui
|
||||
_configuration->setTitleAlignment( ui.titleAlignment->currentIndex() );
|
||||
_configuration->setButtonSize( ui.buttonSize->currentIndex() );
|
||||
_configuration->setFrameBorder( ui.frameBorder->currentIndex() );
|
||||
_configuration->setSeparatorMode( ui.separatorMode->currentIndex() );
|
||||
_configuration->setDrawSizeGrip( ui.drawSizeGrip->isChecked() );
|
||||
_configuration->setDrawTitleOutline( ui.titleOutline->isChecked() );
|
||||
_configuration->setUseNarrowButtonSpacing( ui.narrowButtonSpacing->isChecked() );
|
||||
_configuration->setCloseWindowFromMenuButton( ui.closeFromMenuButton->isChecked() );
|
||||
_configuration->setDrawBorderOnMaximizedWindows( ui.drawBorderOnMaximizedWindows->isChecked() );
|
||||
setChanged( false );
|
||||
|
||||
if( _expertMode ) _animationConfigWidget->save();
|
||||
else _configuration->setAnimationsEnabled( ui.animationsEnabled->isChecked() );
|
||||
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ConfigWidget::toggleExpertMode( bool value )
|
||||
{
|
||||
ui._expertModeContainer->hide();
|
||||
toggleExpertModeInternal( value );
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ConfigWidget::toggleExpertModeInternal( bool value )
|
||||
{
|
||||
|
||||
// store value
|
||||
_expertMode = value;
|
||||
|
||||
// update button text
|
||||
ui._expertModeButton->setText( _expertMode ? i18n( "Hide Advanced Configuration Options" ):i18n( "Show Advanced Configuration Options" ) );
|
||||
|
||||
// narrow button spacing
|
||||
ui.narrowButtonSpacing->setVisible( _expertMode );
|
||||
|
||||
// size grip
|
||||
ui.drawSizeGrip->setVisible( _expertMode );
|
||||
|
||||
// 'basic' animations enabled flag
|
||||
ui.animationsEnabled->setVisible( !_expertMode );
|
||||
|
||||
// layout and animations
|
||||
if( _expertMode )
|
||||
{
|
||||
|
||||
// add animationConfigWidget to tabbar if needed
|
||||
if( ui.tabWidget->indexOf( _animationConfigWidget ) < 0 )
|
||||
{ ui.tabWidget->insertTab( 1, _animationConfigWidget, i18n( "Animations" ) ); }
|
||||
|
||||
ui.shadowSpacer->changeSize(0,0, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
|
||||
} else {
|
||||
|
||||
ui.shadowSpacer->changeSize(0,0, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
|
||||
|
||||
if( int index = ui.tabWidget->indexOf( _animationConfigWidget ) >= 0 )
|
||||
{ ui.tabWidget->removeTab( index ); }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//__________________________________________________________________
|
||||
bool ConfigWidget::eventFilter( QObject* object, QEvent* event )
|
||||
{
|
||||
|
||||
switch( event->type() )
|
||||
{
|
||||
case QEvent::ShowToParent:
|
||||
object->event( event );
|
||||
updateLayout();
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//__________________________________________________________________
|
||||
void ConfigWidget::updateLayout( void )
|
||||
{
|
||||
|
||||
int delta = _animationConfigWidget->minimumSizeHint().height() - _animationConfigWidget->size().height();
|
||||
window()->setMinimumSize( QSize( window()->minimumSizeHint().width(), window()->size().height() + delta ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
//_______________________________________________
|
||||
void ConfigWidget::updateChanged( void )
|
||||
{
|
||||
|
||||
// check configuration
|
||||
if( !_configuration ) return;
|
||||
|
||||
// track modifications
|
||||
bool modified( false );
|
||||
|
||||
if( ui.titleAlignment->currentIndex() != _configuration->titleAlignment() ) modified = true;
|
||||
else if( ui.buttonSize->currentIndex() != _configuration->buttonSize() ) modified = true;
|
||||
else if( ui.frameBorder->currentIndex() != _configuration->frameBorder() ) modified = true;
|
||||
else if( ui.separatorMode->currentIndex() != _configuration->separatorMode() ) modified = true;
|
||||
else if( ui.drawSizeGrip->isChecked() != _configuration->drawSizeGrip() ) modified = true;
|
||||
else if( ui.titleOutline->isChecked() != _configuration->drawTitleOutline() ) modified = true;
|
||||
else if( ui.narrowButtonSpacing->isChecked() != _configuration->useNarrowButtonSpacing() ) modified = true;
|
||||
else if( ui.closeFromMenuButton->isChecked() != _configuration->closeWindowFromMenuButton() ) modified = true;
|
||||
else if( ui.drawBorderOnMaximizedWindows->isChecked() != _configuration->drawBorderOnMaximizedWindows() ) modified = true;
|
||||
|
||||
// exceptions
|
||||
else if( ui.exceptions->isChanged() ) modified = true;
|
||||
|
||||
// shadow configurations
|
||||
else if( shadowConfigurations[0]->isChanged() ) modified = true;
|
||||
else if( shadowConfigurations[1]->isChanged() ) modified = true;
|
||||
|
||||
// animations
|
||||
else if( !_expertMode && ui.animationsEnabled->isChecked() != _configuration->animationsEnabled() ) modified = true;
|
||||
else if( _expertMode && _animationConfigWidget->isChanged() ) modified = true;
|
||||
|
||||
setChanged( modified );
|
||||
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
#ifndef oxygenconfigwidget_h
|
||||
#define oxygenconfigwidget_h
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenconfigurationui.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "ui_oxygenconfigurationui.h"
|
||||
#include "oxygenshadowconfigwidget.h"
|
||||
#include "oxygenexceptionlistwidget.h"
|
||||
#include "../oxygendecorationdefines.h"
|
||||
|
||||
#include <KComboBox>
|
||||
#include <QWidget>
|
||||
#include <QCheckBox>
|
||||
#include <QVector>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class AnimationConfigWidget;
|
||||
|
||||
//_____________________________________________
|
||||
class ConfigWidget: public QWidget
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ConfigWidget( QWidget* );
|
||||
|
||||
//! destructor
|
||||
virtual ~ConfigWidget( void )
|
||||
{}
|
||||
|
||||
//! set configuration
|
||||
void setConfiguration( ConfigurationPtr );
|
||||
|
||||
//! load configuration
|
||||
void load( void );
|
||||
|
||||
//! save configuration
|
||||
void save( void );
|
||||
|
||||
//! true if changed
|
||||
virtual bool isChanged( void ) const
|
||||
{ return _changed; }
|
||||
|
||||
//! exceptions
|
||||
ExceptionListWidget* exceptionListWidget( void ) const
|
||||
{ return ui.exceptions; }
|
||||
|
||||
//! shadow configuration
|
||||
QVector<ShadowConfigWidget*> shadowConfigurations;
|
||||
|
||||
//! toggle expert mode
|
||||
void toggleExpertMode( bool );
|
||||
|
||||
//! event filter
|
||||
virtual bool eventFilter( QObject*, QEvent* );
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
//! emmited when changed
|
||||
void changed( bool );
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! toggle expert mode
|
||||
void toggleExpertModeInternal( void )
|
||||
{ toggleExpertModeInternal( !_expertMode ); }
|
||||
|
||||
//! toggle expert mode
|
||||
void toggleExpertModeInternal( bool );
|
||||
|
||||
//! update changed state
|
||||
virtual void updateChanged();
|
||||
|
||||
//! update layout
|
||||
/*! needed in expert mode to accommodate with animations config widget size changes */
|
||||
void updateLayout( void );
|
||||
|
||||
protected:
|
||||
|
||||
//! set changed state
|
||||
virtual void setChanged( bool value )
|
||||
{
|
||||
_changed = value;
|
||||
emit changed( value );
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
//! ui
|
||||
Ui_OxygenConfigurationUI ui;
|
||||
|
||||
//! internal exception
|
||||
ConfigurationPtr _configuration;
|
||||
|
||||
//! expert mode
|
||||
bool _expertMode;
|
||||
|
||||
//! animation config (expert mode only)
|
||||
AnimationConfigWidget* _animationConfigWidget;
|
||||
|
||||
//! changed state
|
||||
bool _changed;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,175 +0,0 @@
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygendetectwidget.cpp
|
||||
// Note: this class is a stripped down version of
|
||||
// /kdebase/workspace/kwin/kcmkwin/kwinrules/detectwidget.cpp
|
||||
// Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org>
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygendetectwidget.h"
|
||||
#include "oxygendetectwidget.moc"
|
||||
|
||||
#include <QButtonGroup>
|
||||
#include <QLayout>
|
||||
#include <QGroupBox>
|
||||
#include <QMouseEvent>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <QX11Info>
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_________________________________________________________
|
||||
DetectDialog::DetectDialog( QWidget* parent ):
|
||||
QDialog( parent ),
|
||||
_grabber( 0 ),
|
||||
_wmStateAtom( 0 )
|
||||
{
|
||||
|
||||
// setup
|
||||
setupUi( this );
|
||||
|
||||
connect( buttonBox->button( QDialogButtonBox::Cancel ), SIGNAL(clicked()), this, SLOT(close()) );
|
||||
windowClassCheckBox->setChecked( true );
|
||||
|
||||
// create atom
|
||||
xcb_connection_t* connection( QX11Info::connection() );
|
||||
const QString atomName( QStringLiteral( "WM_STATE" ) );
|
||||
xcb_intern_atom_cookie_t cookie( xcb_intern_atom( connection, false, atomName.size(), qPrintable( atomName ) ) );
|
||||
QScopedPointer<xcb_intern_atom_reply_t, QScopedPointerPodDeleter> reply( xcb_intern_atom_reply( connection, cookie, nullptr) );
|
||||
_wmStateAtom = reply ? reply->atom : 0;
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void DetectDialog::detect( WId window )
|
||||
{
|
||||
if( window == 0 ) selectWindow();
|
||||
else readWindow( window );
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void DetectDialog::readWindow( WId window )
|
||||
{
|
||||
|
||||
if( window == 0 )
|
||||
{
|
||||
emit detectionDone( false );
|
||||
return;
|
||||
}
|
||||
|
||||
_info.reset(new KWindowInfo( window, NET::WMAllProperties, NET::WM2AllProperties ));
|
||||
if( !_info->valid())
|
||||
{
|
||||
emit detectionDone( false );
|
||||
return;
|
||||
}
|
||||
|
||||
const QString wmClassClass( QString::fromUtf8( _info->windowClassClass() ) );
|
||||
const QString wmClassName( QString::fromUtf8( _info->windowClassName() ) );
|
||||
|
||||
windowClass->setText( QStringLiteral( "%1 (%2 %3)" ).arg( wmClassClass ).arg( wmClassName ).arg( wmClassClass ) );
|
||||
Ui::OxygenDetectWidget::windowTitle->setText( _info->name() );
|
||||
emit detectionDone( exec() == QDialog::Accepted );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void DetectDialog::selectWindow()
|
||||
{
|
||||
|
||||
// use a dialog, so that all user input is blocked
|
||||
// use WX11BypassWM and moving away so that it's not actually visible
|
||||
// grab only mouse, so that keyboard can be used e.g. for switching windows
|
||||
_grabber = new QDialog( 0, Qt::X11BypassWindowManagerHint );
|
||||
_grabber->move( -1000, -1000 );
|
||||
_grabber->setModal( true );
|
||||
_grabber->show();
|
||||
|
||||
// need to explicitly override cursor for Qt5
|
||||
qApp->setOverrideCursor( Qt::CrossCursor );
|
||||
_grabber->grabMouse( Qt::CrossCursor );
|
||||
_grabber->installEventFilter( this );
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
bool DetectDialog::eventFilter( QObject* o, QEvent* e )
|
||||
{
|
||||
// check object and event type
|
||||
if( o != _grabber ) return false;
|
||||
if( e->type() != QEvent::MouseButtonRelease ) return false;
|
||||
|
||||
// need to explicitely release cursor for Qt5
|
||||
qApp->restoreOverrideCursor();
|
||||
|
||||
// delete old _grabber
|
||||
delete _grabber;
|
||||
_grabber = 0;
|
||||
|
||||
// check button
|
||||
if( static_cast< QMouseEvent* >( e )->button() != Qt::LeftButton ) return true;
|
||||
|
||||
// read window information
|
||||
readWindow( findWindow() );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
WId DetectDialog::findWindow()
|
||||
{
|
||||
|
||||
// check atom
|
||||
if( !_wmStateAtom ) return 0;
|
||||
|
||||
xcb_connection_t* connection( QX11Info::connection() );
|
||||
xcb_window_t parent( QX11Info::appRootWindow() );
|
||||
|
||||
// why is there a loop of only 10 here
|
||||
for( int i = 0; i < 10; ++i )
|
||||
{
|
||||
|
||||
// query pointer
|
||||
xcb_query_pointer_cookie_t pointerCookie( xcb_query_pointer( connection, parent ) );
|
||||
QScopedPointer<xcb_query_pointer_reply_t, QScopedPointerPodDeleter> pointerReply( xcb_query_pointer_reply( connection, pointerCookie, nullptr ) );
|
||||
if( !( pointerReply && pointerReply->child ) ) return 0;
|
||||
|
||||
const xcb_window_t child( pointerReply->child );
|
||||
xcb_get_property_cookie_t cookie( xcb_get_property( connection, 0, child, _wmStateAtom, XCB_GET_PROPERTY_TYPE_ANY, 0, 0 ) );
|
||||
QScopedPointer<xcb_get_property_reply_t, QScopedPointerPodDeleter> reply( xcb_get_property_reply( connection, cookie, nullptr ) );
|
||||
if( reply && reply->type ) return child;
|
||||
else parent = child;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
#ifndef oxygendetectwidget_h
|
||||
#define oxygendetectwidget_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygendetectwidget.h
|
||||
// Note: this class is a stripped down version of
|
||||
// /kdebase/workspace/kwin/kcmkwin/kwinrules/detectwidget.h
|
||||
// Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "ui_oxygendetectwidget.h"
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QCheckBox>
|
||||
#include <QDialog>
|
||||
#include <QEvent>
|
||||
#include <QLabel>
|
||||
|
||||
#include <kwindowsystem.h>
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class DetectDialog : public QDialog, Ui::OxygenDetectWidget
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit DetectDialog( QWidget* );
|
||||
|
||||
//! read window properties or select one from mouse grab
|
||||
void detect( WId window );
|
||||
|
||||
//! selected class
|
||||
QByteArray selectedClass() const;
|
||||
|
||||
//! window information
|
||||
const KWindowInfo& windowInfo() const
|
||||
{ return *(_info.data()); }
|
||||
|
||||
//! exception type
|
||||
Configuration::EnumExceptionType exceptionType() const
|
||||
{
|
||||
if( windowClassCheckBox->isChecked() ) return Configuration::ExceptionWindowClassName;
|
||||
else if( windowTitleCheckBox->isChecked() ) return Configuration::ExceptionWindowTitle;
|
||||
else return Configuration::ExceptionWindowClassName;
|
||||
}
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
void detectionDone( bool );
|
||||
|
||||
protected:
|
||||
|
||||
virtual bool eventFilter( QObject* o, QEvent* e );
|
||||
|
||||
private:
|
||||
|
||||
//! select window from grab
|
||||
void selectWindow();
|
||||
|
||||
//! read window properties
|
||||
void readWindow( WId window );
|
||||
|
||||
//! find window under cursor
|
||||
WId findWindow();
|
||||
|
||||
//! execute
|
||||
void executeDialog( void );
|
||||
|
||||
//! invisible dialog used to grab mouse
|
||||
QDialog* _grabber;
|
||||
|
||||
//! current window information
|
||||
QScopedPointer<KWindowInfo> _info;
|
||||
|
||||
//! wm state atom
|
||||
xcb_atom_t _wmStateAtom;
|
||||
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
|
@ -1,189 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptiondialog.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenexceptiondialog.h"
|
||||
#include "oxygenexceptiondialog.moc"
|
||||
#include "oxygendetectwidget.h"
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//___________________________________________
|
||||
ExceptionDialog::ExceptionDialog( QWidget* parent ):
|
||||
QDialog( parent ),
|
||||
_detectDialog(0),
|
||||
_changed( false )
|
||||
{
|
||||
|
||||
setupUi( this );
|
||||
connect( buttonBox->button( QDialogButtonBox::Cancel ), SIGNAL(clicked()), this, SLOT(close()) );
|
||||
|
||||
// store checkboxes from ui into list
|
||||
_checkBoxes.insert( FrameBorder, frameBorderCheckBox );
|
||||
_checkBoxes.insert( SizeGripMode, sizeGripCheckBox );
|
||||
_checkBoxes.insert( TitleOutline, titleOutlineCheckBox );
|
||||
_checkBoxes.insert( DrawSeparator, separatorCheckBox );
|
||||
|
||||
// detect window properties
|
||||
connect( detectDialogButton, SIGNAL(clicked()), SLOT(selectWindowProperties()) );
|
||||
|
||||
// connections
|
||||
connect( exceptionType, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( exceptionEditor, SIGNAL(textChanged(QString)), SLOT(updateChanged()) );
|
||||
connect( frameBorderComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( sizeGripComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( titleOutlineComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
connect( separatorComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
|
||||
|
||||
for( CheckBoxMap::iterator iter = _checkBoxes.begin(); iter != _checkBoxes.end(); ++iter )
|
||||
{ connect( iter.value(), SIGNAL(clicked()), SLOT(updateChanged()) ); }
|
||||
|
||||
connect( hideTitleBar, SIGNAL(clicked()), SLOT(updateChanged()) );
|
||||
}
|
||||
|
||||
//___________________________________________
|
||||
void ExceptionDialog::setException( ConfigurationPtr exception )
|
||||
{
|
||||
|
||||
// store exception internally
|
||||
_exception = exception;
|
||||
|
||||
// type
|
||||
exceptionType->setCurrentIndex(_exception->exceptionType() );
|
||||
exceptionEditor->setText( _exception->exceptionPattern() );
|
||||
frameBorderComboBox->setCurrentIndex( _exception->frameBorder() );
|
||||
sizeGripComboBox->setCurrentIndex( _exception->drawSizeGrip() );
|
||||
separatorComboBox->setCurrentIndex( _exception->separatorMode() );
|
||||
titleOutlineComboBox->setCurrentIndex( _exception->drawTitleOutline() );
|
||||
hideTitleBar->setChecked( _exception->hideTitleBar() );
|
||||
|
||||
// mask
|
||||
for( CheckBoxMap::iterator iter = _checkBoxes.begin(); iter != _checkBoxes.end(); ++iter )
|
||||
{ iter.value()->setChecked( _exception->mask() & iter.key() ); }
|
||||
|
||||
setChanged( false );
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________
|
||||
void ExceptionDialog::save( void )
|
||||
{
|
||||
_exception->setExceptionType( exceptionType->currentIndex() );
|
||||
_exception->setExceptionPattern( exceptionEditor->text() );
|
||||
_exception->setFrameBorder( frameBorderComboBox->currentIndex() );
|
||||
_exception->setDrawSizeGrip( sizeGripComboBox->currentIndex() );
|
||||
_exception->setSeparatorMode( separatorComboBox->currentIndex() );
|
||||
_exception->setDrawTitleOutline( titleOutlineComboBox->currentIndex() );
|
||||
_exception->setHideTitleBar( hideTitleBar->isChecked() );
|
||||
|
||||
// mask
|
||||
unsigned int mask = None;
|
||||
for( CheckBoxMap::iterator iter = _checkBoxes.begin(); iter != _checkBoxes.end(); ++iter )
|
||||
{ if( iter.value()->isChecked() ) mask |= iter.key(); }
|
||||
|
||||
_exception->setMask( mask );
|
||||
|
||||
setChanged( false );
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________
|
||||
void ExceptionDialog::updateChanged( void )
|
||||
{
|
||||
bool modified( false );
|
||||
if( _exception->exceptionType() != exceptionType->currentIndex() ) modified = true;
|
||||
else if( _exception->exceptionPattern() != exceptionEditor->text() ) modified = true;
|
||||
else if( _exception->frameBorder() != frameBorderComboBox->currentIndex() ) modified = true;
|
||||
else if( _exception->drawSizeGrip() != sizeGripComboBox->currentIndex() ) modified = true;
|
||||
else if( _exception->separatorMode() != separatorComboBox->currentIndex() ) modified = true;
|
||||
else if( _exception->drawTitleOutline() != titleOutlineComboBox->currentIndex() ) modified = true;
|
||||
else if( _exception->hideTitleBar() != hideTitleBar->isChecked() ) modified = true;
|
||||
else
|
||||
{
|
||||
// check mask
|
||||
for( CheckBoxMap::iterator iter = _checkBoxes.begin(); iter != _checkBoxes.end(); ++iter )
|
||||
{
|
||||
if( iter.value()->isChecked() != (bool)( _exception->mask() & iter.key() ) )
|
||||
{
|
||||
modified = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setChanged( modified );
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________
|
||||
void ExceptionDialog::selectWindowProperties( void )
|
||||
{
|
||||
|
||||
// create widget
|
||||
if( !_detectDialog )
|
||||
{
|
||||
_detectDialog = new DetectDialog( this );
|
||||
connect( _detectDialog, SIGNAL(detectionDone(bool)), SLOT(readWindowProperties(bool)) );
|
||||
}
|
||||
|
||||
_detectDialog->detect(0);
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________
|
||||
void ExceptionDialog::readWindowProperties( bool valid )
|
||||
{
|
||||
Q_CHECK_PTR( _detectDialog );
|
||||
if( valid )
|
||||
{
|
||||
|
||||
// type
|
||||
exceptionType->setCurrentIndex( _detectDialog->exceptionType() );
|
||||
|
||||
// window info
|
||||
const KWindowInfo& info( _detectDialog->windowInfo() );
|
||||
|
||||
switch( _detectDialog->exceptionType() )
|
||||
{
|
||||
|
||||
default:
|
||||
case Configuration::ExceptionWindowClassName:
|
||||
exceptionEditor->setText( QString::fromUtf8( info.windowClassClass() ) );
|
||||
break;
|
||||
|
||||
case Configuration::ExceptionWindowTitle:
|
||||
exceptionEditor->setText( info.name() );
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
delete _detectDialog;
|
||||
_detectDialog = 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
#ifndef oxygenexceptiondialog_h
|
||||
#define oxygenexceptiondialog_h
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptiondialog.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "ui_oxygenexceptiondialog.h"
|
||||
#include "../oxygendecorationdefines.h"
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QMap>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class DetectDialog;
|
||||
|
||||
//! oxygen exceptions list
|
||||
class ExceptionDialog: public QDialog, Ui::OxygenExceptionDialog
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ExceptionDialog( QWidget* parent );
|
||||
|
||||
//! destructor
|
||||
virtual ~ExceptionDialog( void )
|
||||
{}
|
||||
|
||||
//! set exception
|
||||
void setException( ConfigurationPtr );
|
||||
|
||||
//! save exception
|
||||
void save( void );
|
||||
|
||||
//! true if changed
|
||||
virtual bool isChanged( void ) const
|
||||
{ return _changed; }
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
//! emmited when changed
|
||||
void changed( bool );
|
||||
|
||||
protected:
|
||||
|
||||
//! set changed state
|
||||
virtual void setChanged( bool value )
|
||||
{
|
||||
_changed = value;
|
||||
emit changed( value );
|
||||
}
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! check whether configuration is changed and emit appropriate signal if yes
|
||||
virtual void updateChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
|
||||
//! select window properties from grabbed pointers
|
||||
void selectWindowProperties( void );
|
||||
|
||||
//! read properties of selected window
|
||||
void readWindowProperties( bool );
|
||||
|
||||
private:
|
||||
|
||||
//! map mask and checkbox
|
||||
typedef QMap< ExceptionMask, QCheckBox*> CheckBoxMap;
|
||||
|
||||
//! map mask and checkbox
|
||||
CheckBoxMap _checkBoxes;
|
||||
|
||||
//! internal exception
|
||||
ConfigurationPtr _exception;
|
||||
|
||||
//! detection dialog
|
||||
DetectDialog* _detectDialog;
|
||||
|
||||
//! changed state
|
||||
bool _changed;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,347 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionlistwidget.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenexceptionlistwidget.h"
|
||||
#include "oxygenexceptionlistwidget.moc"
|
||||
#include "oxygenexceptiondialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QPointer>
|
||||
#include <QIcon>
|
||||
#include <KLocalizedString>
|
||||
|
||||
//__________________________________________________________
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//__________________________________________________________
|
||||
ExceptionListWidget::ExceptionListWidget( QWidget* parent ):
|
||||
QWidget( parent ),
|
||||
_changed( false )
|
||||
{
|
||||
|
||||
//! ui
|
||||
ui.setupUi( this );
|
||||
|
||||
// list
|
||||
ui.exceptionListView->setAllColumnsShowFocus( true );
|
||||
ui.exceptionListView->setRootIsDecorated( false );
|
||||
ui.exceptionListView->setSortingEnabled( false );
|
||||
ui.exceptionListView->setModel( &model() );
|
||||
ui.exceptionListView->sortByColumn( ExceptionModel::TYPE );
|
||||
ui.exceptionListView->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Ignored ) );
|
||||
|
||||
ui.moveUpButton->setIcon( QIcon::fromTheme( QStringLiteral( "arrow-up" ) ) );
|
||||
ui.moveDownButton->setIcon( QIcon::fromTheme( QStringLiteral( "arrow-down" ) ) );
|
||||
ui.addButton->setIcon( QIcon::fromTheme( QStringLiteral( "list-add" ) ) );
|
||||
ui.removeButton->setIcon( QIcon::fromTheme( QStringLiteral( "list-remove" ) ) );
|
||||
ui.editButton->setIcon( QIcon::fromTheme( QStringLiteral( "edit-rename" ) ) );
|
||||
|
||||
connect( ui.addButton, SIGNAL(clicked()), SLOT(add()) );
|
||||
connect( ui.editButton, SIGNAL(clicked()), SLOT(edit()) );
|
||||
connect( ui.removeButton, SIGNAL(clicked()), SLOT(remove()) );
|
||||
connect( ui.moveUpButton, SIGNAL(clicked()), SLOT(up()) );
|
||||
connect( ui.moveDownButton, SIGNAL(clicked()), SLOT(down()) );
|
||||
|
||||
connect( ui.exceptionListView, SIGNAL(activated(QModelIndex)), SLOT(edit()) );
|
||||
connect( ui.exceptionListView, SIGNAL(clicked(QModelIndex)), SLOT(toggle(QModelIndex)) );
|
||||
connect( ui.exceptionListView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(updateButtons()) );
|
||||
|
||||
updateButtons();
|
||||
resizeColumns();
|
||||
|
||||
|
||||
}
|
||||
|
||||
//__________________________________________________________
|
||||
void ExceptionListWidget::setExceptions( const ConfigurationList& exceptions )
|
||||
{
|
||||
model().set( exceptions );
|
||||
resizeColumns();
|
||||
setChanged( false );
|
||||
}
|
||||
|
||||
//__________________________________________________________
|
||||
ConfigurationList ExceptionListWidget::exceptions( void )
|
||||
{
|
||||
return model().get();
|
||||
setChanged( false );
|
||||
}
|
||||
|
||||
//__________________________________________________________
|
||||
void ExceptionListWidget::updateButtons( void )
|
||||
{
|
||||
|
||||
bool hasSelection( !ui.exceptionListView->selectionModel()->selectedRows().empty() );
|
||||
ui.removeButton->setEnabled( hasSelection );
|
||||
ui.editButton->setEnabled( hasSelection );
|
||||
|
||||
ui.moveUpButton->setEnabled( hasSelection && !ui.exceptionListView->selectionModel()->isRowSelected( 0, QModelIndex() ) );
|
||||
ui.moveDownButton->setEnabled( hasSelection && !ui.exceptionListView->selectionModel()->isRowSelected( model().rowCount()-1, QModelIndex() ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::add( void )
|
||||
{
|
||||
|
||||
|
||||
QPointer<ExceptionDialog> dialog = new ExceptionDialog( this );
|
||||
ConfigurationPtr exception( new Configuration() );
|
||||
exception->readConfig();
|
||||
dialog->setException( exception );
|
||||
|
||||
// run dialog and check existence
|
||||
if( !dialog->exec() )
|
||||
{
|
||||
delete dialog;
|
||||
return;
|
||||
}
|
||||
|
||||
dialog->save();
|
||||
delete dialog;
|
||||
|
||||
// check exceptions
|
||||
if( !checkException( exception ) ) return;
|
||||
|
||||
// create new item
|
||||
model().add( exception );
|
||||
setChanged( true );
|
||||
|
||||
// make sure item is selected
|
||||
QModelIndex index( model().index( exception ) );
|
||||
if( index != ui.exceptionListView->selectionModel()->currentIndex() )
|
||||
{
|
||||
ui.exceptionListView->selectionModel()->select( index, QItemSelectionModel::Clear|QItemSelectionModel::Select|QItemSelectionModel::Rows );
|
||||
ui.exceptionListView->selectionModel()->setCurrentIndex( index, QItemSelectionModel::Current|QItemSelectionModel::Rows );
|
||||
}
|
||||
|
||||
resizeColumns();
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::edit( void )
|
||||
{
|
||||
|
||||
// retrieve selection
|
||||
QModelIndex current( ui.exceptionListView->selectionModel()->currentIndex() );
|
||||
if( ! model().contains( current ) ) return;
|
||||
|
||||
ConfigurationPtr exception( model().get( current ) );
|
||||
|
||||
// create dialog
|
||||
QPointer<ExceptionDialog> dialog( new ExceptionDialog( this ) );
|
||||
dialog->setException( exception );
|
||||
|
||||
// map dialog
|
||||
if( !dialog->exec() )
|
||||
{
|
||||
delete dialog;
|
||||
return;
|
||||
}
|
||||
|
||||
// check modifications
|
||||
if( !dialog->isChanged() ) return;
|
||||
|
||||
// retrieve exception
|
||||
dialog->save();
|
||||
delete dialog;
|
||||
|
||||
// check new exception validity
|
||||
checkException( exception );
|
||||
resizeColumns();
|
||||
|
||||
setChanged( true );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::remove( void )
|
||||
{
|
||||
|
||||
// should use a konfirmation dialog
|
||||
if( QMessageBox::question( this, i18n("Question - Oxygen Settings" ), i18n("Remove selected exception?") ) == QMessageBox::No ) return;
|
||||
|
||||
// remove
|
||||
model().remove( model().get( ui.exceptionListView->selectionModel()->selectedRows() ) );
|
||||
resizeColumns();
|
||||
updateButtons();
|
||||
|
||||
setChanged( true );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::toggle( const QModelIndex& index )
|
||||
{
|
||||
|
||||
if( !model().contains( index ) ) return;
|
||||
if( index.column() != ExceptionModel::ENABLED ) return;
|
||||
|
||||
// get matching exception
|
||||
ConfigurationPtr exception( model().get( index ) );
|
||||
exception->setEnabled( !exception->enabled() );
|
||||
setChanged( true );
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::up( void )
|
||||
{
|
||||
|
||||
ConfigurationList selection( model().get( ui.exceptionListView->selectionModel()->selectedRows() ) );
|
||||
if( selection.empty() ) { return; }
|
||||
|
||||
// retrieve selected indexes in list and store in model
|
||||
QModelIndexList selectedIndices( ui.exceptionListView->selectionModel()->selectedRows() );
|
||||
ConfigurationList selectedExceptions( model().get( selectedIndices ) );
|
||||
|
||||
ConfigurationList currentException( model().get() );
|
||||
ConfigurationList newExceptions;
|
||||
|
||||
for( ConfigurationList::const_iterator iter = currentException.constBegin(); iter != currentException.constEnd(); ++iter )
|
||||
{
|
||||
|
||||
// check if new list is not empty, current index is selected and last index is not.
|
||||
// if yes, move.
|
||||
if(
|
||||
!( newExceptions.empty() ||
|
||||
selectedIndices.indexOf( model().index( *iter ) ) == -1 ||
|
||||
selectedIndices.indexOf( model().index( newExceptions.back() ) ) != -1
|
||||
) )
|
||||
{
|
||||
ConfigurationPtr last( newExceptions.back() );
|
||||
newExceptions.removeLast();
|
||||
newExceptions.append( *iter );
|
||||
newExceptions.append( last );
|
||||
} else newExceptions.append( *iter );
|
||||
|
||||
}
|
||||
|
||||
model().set( newExceptions );
|
||||
|
||||
// restore selection
|
||||
ui.exceptionListView->selectionModel()->select( model().index( selectedExceptions.front() ), QItemSelectionModel::Clear|QItemSelectionModel::Select|QItemSelectionModel::Rows );
|
||||
for( ConfigurationList::const_iterator iter = selectedExceptions.constBegin(); iter != selectedExceptions.constEnd(); ++iter )
|
||||
{ ui.exceptionListView->selectionModel()->select( model().index( *iter ), QItemSelectionModel::Select|QItemSelectionModel::Rows ); }
|
||||
|
||||
setChanged( true );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::down( void )
|
||||
{
|
||||
|
||||
ConfigurationList selection( model().get( ui.exceptionListView->selectionModel()->selectedRows() ) );
|
||||
if( selection.empty() )
|
||||
{ return; }
|
||||
|
||||
// retrieve selected indexes in list and store in model
|
||||
QModelIndexList selectedIndices( ui.exceptionListView->selectionModel()->selectedIndexes() );
|
||||
ConfigurationList selectedExceptions( model().get( selectedIndices ) );
|
||||
|
||||
ConfigurationList currentExceptions( model().get() );
|
||||
ConfigurationList newExceptions;
|
||||
|
||||
ConfigurationListIterator iter( currentExceptions );
|
||||
iter.toBack();
|
||||
while( iter.hasPrevious() )
|
||||
{
|
||||
|
||||
ConfigurationPtr current( iter.previous() );
|
||||
|
||||
// check if new list is not empty, current index is selected and last index is not.
|
||||
// if yes, move.
|
||||
if(
|
||||
!( newExceptions.empty() ||
|
||||
selectedIndices.indexOf( model().index( current ) ) == -1 ||
|
||||
selectedIndices.indexOf( model().index( newExceptions.front() ) ) != -1
|
||||
) )
|
||||
{
|
||||
|
||||
ConfigurationPtr first( newExceptions.front() );
|
||||
newExceptions.removeFirst();
|
||||
newExceptions.prepend( current );
|
||||
newExceptions.prepend( first );
|
||||
|
||||
} else newExceptions.prepend( current );
|
||||
}
|
||||
|
||||
model().set( newExceptions );
|
||||
|
||||
// restore selection
|
||||
ui.exceptionListView->selectionModel()->select( model().index( selectedExceptions.front() ), QItemSelectionModel::Clear|QItemSelectionModel::Select|QItemSelectionModel::Rows );
|
||||
for( ConfigurationList::const_iterator iter = selectedExceptions.constBegin(); iter != selectedExceptions.constEnd(); ++iter )
|
||||
{ ui.exceptionListView->selectionModel()->select( model().index( *iter ), QItemSelectionModel::Select|QItemSelectionModel::Rows ); }
|
||||
|
||||
setChanged( true );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
void ExceptionListWidget::resizeColumns( void ) const
|
||||
{
|
||||
ui.exceptionListView->resizeColumnToContents( ExceptionModel::ENABLED );
|
||||
ui.exceptionListView->resizeColumnToContents( ExceptionModel::TYPE );
|
||||
ui.exceptionListView->resizeColumnToContents( ExceptionModel::REGEXP );
|
||||
}
|
||||
|
||||
//_______________________________________________________
|
||||
bool ExceptionListWidget::checkException( ConfigurationPtr exception )
|
||||
{
|
||||
|
||||
while( exception->exceptionPattern().isEmpty() || !QRegExp( exception->exceptionPattern() ).isValid() )
|
||||
{
|
||||
|
||||
QMessageBox::warning( this, i18n( "Warning - Oxygen Settings" ), i18n("Regular Expression syntax is incorrect") );
|
||||
QPointer<ExceptionDialog> dialog( new ExceptionDialog( this ) );
|
||||
dialog->setException( exception );
|
||||
if( dialog->exec() == QDialog::Rejected )
|
||||
{
|
||||
delete dialog;
|
||||
return false;
|
||||
}
|
||||
|
||||
dialog->save();
|
||||
delete dialog;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,124 +0,0 @@
|
|||
#ifndef oxygenexceptionlistwidget_h
|
||||
#define oxygenexceptionlistwidget_h
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionlistwidget.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "ui_oxygenexceptionlistwidget.h"
|
||||
#include "oxygenexceptionmodel.h"
|
||||
|
||||
//! QDialog used to commit selected files
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class ExceptionListWidget: public QWidget
|
||||
{
|
||||
|
||||
//! Qt meta object
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ExceptionListWidget( QWidget* = 0 );
|
||||
|
||||
//! set exceptions
|
||||
void setExceptions( const ConfigurationList& );
|
||||
|
||||
//! get exceptions
|
||||
ConfigurationList exceptions( void );
|
||||
|
||||
//! true if changed
|
||||
virtual bool isChanged( void ) const
|
||||
{ return _changed; }
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
//! emitted when changed
|
||||
void changed( bool );
|
||||
|
||||
protected:
|
||||
|
||||
//! model
|
||||
const ExceptionModel& model() const
|
||||
{ return _model; }
|
||||
|
||||
//! model
|
||||
ExceptionModel& model()
|
||||
{ return _model; }
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! update button states
|
||||
virtual void updateButtons( void );
|
||||
|
||||
//! add
|
||||
virtual void add( void );
|
||||
|
||||
//! edit
|
||||
virtual void edit( void );
|
||||
|
||||
//! remove
|
||||
virtual void remove( void );
|
||||
|
||||
//! toggle
|
||||
virtual void toggle( const QModelIndex& );
|
||||
|
||||
//! move up
|
||||
virtual void up( void );
|
||||
|
||||
//! move down
|
||||
virtual void down( void );
|
||||
|
||||
protected:
|
||||
|
||||
//! resize columns
|
||||
void resizeColumns( void ) const;
|
||||
|
||||
//! check exception
|
||||
bool checkException( ConfigurationPtr );
|
||||
|
||||
//! set changed state
|
||||
virtual void setChanged( bool value )
|
||||
{
|
||||
_changed = value;
|
||||
emit changed( value );
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
//! model
|
||||
ExceptionModel _model;
|
||||
|
||||
//! ui
|
||||
Ui_OxygenExceptionListWidget ui;
|
||||
|
||||
//! changed state
|
||||
bool _changed;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,105 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionmodel.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenexceptionmodel.h"
|
||||
#include <KLocalizedString>
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_______________________________________________
|
||||
const QString ExceptionModel::_columnTitles[ ExceptionModel::nColumns ] =
|
||||
{
|
||||
QStringLiteral( "" ),
|
||||
i18n("Exception Type"),
|
||||
i18n("Regular Expression")
|
||||
};
|
||||
|
||||
//__________________________________________________________________
|
||||
QVariant ExceptionModel::data( const QModelIndex& index, int role ) const
|
||||
{
|
||||
|
||||
// check index, role and column
|
||||
if( !index.isValid() ) return QVariant();
|
||||
|
||||
// retrieve associated file info
|
||||
const ConfigurationPtr& configuration( get(index) );
|
||||
|
||||
// return text associated to file and column
|
||||
if( role == Qt::DisplayRole )
|
||||
{
|
||||
|
||||
switch( index.column() )
|
||||
{
|
||||
case TYPE:
|
||||
{
|
||||
switch( configuration->exceptionType() )
|
||||
{
|
||||
|
||||
case Configuration::ExceptionWindowTitle:
|
||||
return i18n( "Window Title" );
|
||||
|
||||
default:
|
||||
case Configuration::ExceptionWindowClassName:
|
||||
return i18n( "Window Class Name" );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
case REGEXP: return configuration->exceptionPattern();
|
||||
default: return QVariant();
|
||||
break;
|
||||
}
|
||||
|
||||
} else if( role == Qt::CheckStateRole && index.column() == ENABLED ) {
|
||||
|
||||
return configuration->enabled() ? Qt::Checked : Qt::Unchecked;
|
||||
|
||||
} else if( role == Qt::ToolTipRole && index.column() == ENABLED ) {
|
||||
|
||||
return i18n("Enable/disable this exception");
|
||||
|
||||
}
|
||||
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
//__________________________________________________________________
|
||||
QVariant ExceptionModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
|
||||
if(
|
||||
orientation == Qt::Horizontal &&
|
||||
role == Qt::DisplayRole &&
|
||||
section >= 0 &&
|
||||
section < nColumns )
|
||||
{ return _columnTitles[section]; }
|
||||
|
||||
// return empty
|
||||
return QVariant();
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,81 +0,0 @@
|
|||
#ifndef oxygenexceptionmodel_h
|
||||
#define oxygenexceptionmodel_h
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionmodel.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenlistmodel.h"
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "../oxygendecorationdefines.h"
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//! qlistview for object counters
|
||||
class ExceptionModel: public ListModel<ConfigurationPtr>
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! number of columns
|
||||
enum { nColumns = 3 };
|
||||
|
||||
//! column type enumeration
|
||||
enum ColumnType {
|
||||
ENABLED,
|
||||
TYPE,
|
||||
REGEXP
|
||||
};
|
||||
|
||||
|
||||
//!@name methods reimplemented from base class
|
||||
//@{
|
||||
|
||||
// return data for a given index
|
||||
virtual QVariant data(const QModelIndex &index, int role) const;
|
||||
|
||||
//! header data
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||
|
||||
//! number of columns for a given index
|
||||
virtual int columnCount(const QModelIndex& ) const
|
||||
{ return nColumns; }
|
||||
|
||||
//@}
|
||||
|
||||
protected:
|
||||
|
||||
//! sort
|
||||
virtual void privateSort( int, Qt::SortOrder )
|
||||
{}
|
||||
|
||||
private:
|
||||
|
||||
//! column titles
|
||||
static const QString _columnTitles[ nColumns ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
|
@ -1,463 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OxygenConfigurationUI</class>
|
||||
<widget class="QWidget" name="OxygenConfigurationUI">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>538</width>
|
||||
<height>388</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="usesScrollButtons">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>General</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Border si&ze:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>frameBorder</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="KComboBox" name="frameBorder">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">No Border</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">No Side Borders</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Tiny</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Normal</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Very Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Huge</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Very Huge</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Oversized</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Tit&le alignment:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>titleAlignment</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="KComboBox" name="titleAlignment">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Left</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Center</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Center (Full Width)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Right</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>B&utton size:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>buttonSize</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="KComboBox" name="buttonSize">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Button size:">Small</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Button size:">Normal</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Button size:">Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Button size:">Very Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Button size:">Huge</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="4">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="4">
|
||||
<widget class="QCheckBox" name="animationsEnabled">
|
||||
<property name="text">
|
||||
<string>Enable animations</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Fine Tuning</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<property name="margin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<item row="6" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="closeFromMenuButton">
|
||||
<property name="text">
|
||||
<string>Close windows by double clicking the menu button</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="KComboBox" name="separatorMode">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Never Draw Separator</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Draw Separator When Window is Active</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Always Draw Separator</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Separator disp&lay:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>separatorMode</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="titleOutline">
|
||||
<property name="text">
|
||||
<string>Outline active window title</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="0" colspan="3">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="narrowButtonSpacing">
|
||||
<property name="text">
|
||||
<string>Use narrow space between decoration buttons</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="drawSizeGrip">
|
||||
<property name="text">
|
||||
<string>Add handle to resize windows with no border</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="drawBorderOnMaximizedWindows">
|
||||
<property name="text">
|
||||
<string>Display window borders for maximized windows</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_3">
|
||||
<attribute name="title">
|
||||
<string>Shadows</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||
<item>
|
||||
<widget class="Oxygen::ShadowConfigWidget" name="inactiveShadowConfiguration">
|
||||
<property name="title">
|
||||
<string>Window Drop-Down Shadow</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Oxygen::ShadowConfigWidget" name="activeShadowConfiguration">
|
||||
<property name="title">
|
||||
<string>Active Window Glow</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="shadowSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_4">
|
||||
<attribute name="title">
|
||||
<string>Window-Specific Overrides</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="Oxygen::ExceptionListWidget" name="exceptions" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="_expertModeContainer" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="_expertModeButton">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::HLine</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>KComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>kcombobox.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>Oxygen::ShadowConfigWidget</class>
|
||||
<extends>QGroupBox</extends>
|
||||
<header>oxygenshadowconfigwidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>Oxygen::ExceptionListWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>oxygenexceptionlistwidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>tabWidget</tabstop>
|
||||
<tabstop>frameBorder</tabstop>
|
||||
<tabstop>titleAlignment</tabstop>
|
||||
<tabstop>buttonSize</tabstop>
|
||||
<tabstop>animationsEnabled</tabstop>
|
||||
<tabstop>_expertModeButton</tabstop>
|
||||
<tabstop>separatorMode</tabstop>
|
||||
<tabstop>titleOutline</tabstop>
|
||||
<tabstop>narrowButtonSpacing</tabstop>
|
||||
<tabstop>inactiveShadowConfiguration</tabstop>
|
||||
<tabstop>activeShadowConfiguration</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>titleOutline</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>separatorMode</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>90</x>
|
||||
<y>92</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>182</x>
|
||||
<y>67</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>titleOutline</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>label_5</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>39</x>
|
||||
<y>90</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>53</x>
|
||||
<y>64</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -1,133 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OxygenDetectWidget</class>
|
||||
<widget class="QDialog" name="OxygenDetectWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Information about Selected Window</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Class: </string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="windowClass">
|
||||
<property name="text">
|
||||
<string notr="true">TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Title: </string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="windowTitle">
|
||||
<property name="text">
|
||||
<string notr="true">TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Window Property Selection</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="windowClassCheckBox">
|
||||
<property name="text">
|
||||
<string>Use window class (whole application)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="windowTitleCheckBox">
|
||||
<property name="locale">
|
||||
<locale language="French" country="France"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use window title</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>OxygenDetectWidget</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>OxygenDetectWidget</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -1,365 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OxygenExceptionDialog</class>
|
||||
<widget class="QDialog" name="OxygenExceptionDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>514</width>
|
||||
<height>347</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Window Identification</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Matching window property: </string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>exceptionType</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Regular expression to match: </string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>exceptionEditor</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QPushButton" name="detectDialogButton">
|
||||
<property name="text">
|
||||
<string>Detect Window Properties</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="KLineEdit" name="exceptionEditor">
|
||||
<property name="showClearButton" stdset="0">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" colspan="2">
|
||||
<widget class="KComboBox" name="exceptionType">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Window Class Name</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Window Title</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Decoration Options</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="3" column="2">
|
||||
<widget class="KComboBox" name="titleOutlineComboBox">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="outline window title">Disabled</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="outline window title">Enabled</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="KComboBox" name="separatorComboBox">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Never Draw Separator</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Draw Separator When Window is Active</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Always Draw Separator</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="frameBorderCheckBox">
|
||||
<property name="text">
|
||||
<string>Border size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="sizeGripCheckBox">
|
||||
<property name="text">
|
||||
<string>Add handle to resize windows with no border</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="titleOutlineCheckBox">
|
||||
<property name="text">
|
||||
<string>Outline active window title:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="separatorCheckBox">
|
||||
<property name="text">
|
||||
<string>Separator display:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="hideTitleBar">
|
||||
<property name="text">
|
||||
<string>Hide window title bar</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="3">
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::HLine</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="KComboBox" name="frameBorderComboBox">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">No Border</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">No Side Borders</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Tiny</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Normal</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Very Large</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Huge</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Very Huge</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="@item:inlistbox Border size:">Oversized</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="KComboBox" name="sizeGripComboBox">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="Add handle to resize windows with no border">Disabled</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string comment="Add handle to resize windows with no border">Enabled</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>KComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>kcombobox.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>KLineEdit</class>
|
||||
<extends>QLineEdit</extends>
|
||||
<header>klineedit.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>OxygenExceptionDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>252</x>
|
||||
<y>342</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>OxygenExceptionDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>320</x>
|
||||
<y>342</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>frameBorderCheckBox</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>frameBorderComboBox</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>125</x>
|
||||
<y>162</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>316</x>
|
||||
<y>163</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>sizeGripCheckBox</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>sizeGripComboBox</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>202</x>
|
||||
<y>212</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>319</x>
|
||||
<y>214</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>titleOutlineCheckBox</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>titleOutlineComboBox</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>198</x>
|
||||
<y>237</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>317</x>
|
||||
<y>241</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>separatorCheckBox</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>separatorComboBox</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>118</x>
|
||||
<y>264</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>298</x>
|
||||
<y>266</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -1,102 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OxygenExceptionListWidget</class>
|
||||
<widget class="QWidget" name="OxygenExceptionListWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>473</width>
|
||||
<height>163</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" rowspan="6">
|
||||
<widget class="QTreeView" name="exceptionListView">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>100</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>1</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="moveUpButton">
|
||||
<property name="text">
|
||||
<string>Move Up</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="moveDownButton">
|
||||
<property name="text">
|
||||
<string>Move Down</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="addButton">
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QPushButton" name="removeButton">
|
||||
<property name="text">
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QPushButton" name="editButton">
|
||||
<property name="text">
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>exceptionListView</tabstop>
|
||||
<tabstop>moveUpButton</tabstop>
|
||||
<tabstop>moveDownButton</tabstop>
|
||||
<tabstop>addButton</tabstop>
|
||||
<tabstop>removeButton</tabstop>
|
||||
<tabstop>editButton</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -1,3 +0,0 @@
|
|||
########### install files ###############
|
||||
install( FILES oxygen.upd DESTINATION ${KCONF_UPDATE_INSTALL_DIR} )
|
||||
install( PROGRAMS update_oxygen.pl DESTINATION ${KCONF_UPDATE_INSTALL_DIR} )
|
|
@ -1,5 +0,0 @@
|
|||
# update decoration options for KDE 4.11
|
||||
Id=1
|
||||
File=oxygenrc
|
||||
Options=overwrite
|
||||
Script=update_oxygen.pl,perl
|
|
@ -1,192 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
{
|
||||
|
||||
# keep track of current section
|
||||
my $section = "";
|
||||
|
||||
# separator mode
|
||||
my $drawSeparator;
|
||||
my $separatorActiveOnly;
|
||||
|
||||
while( <> )
|
||||
{
|
||||
|
||||
# store current line
|
||||
my $line = $_;
|
||||
|
||||
# parse section
|
||||
if( $line =~ /^\[\s*(.*)\s*\]/ )
|
||||
{
|
||||
$section = $1;
|
||||
print( $line );
|
||||
next;
|
||||
}
|
||||
|
||||
# parse key and value
|
||||
if( !( $line=~ /^(.+)\s*=\s*(.+)$/ ) )
|
||||
{
|
||||
print( $line );
|
||||
next;
|
||||
}
|
||||
|
||||
my $key = $1;
|
||||
my $value = $2;
|
||||
|
||||
if( $key eq "BlendColor" ) {
|
||||
|
||||
# Blend style
|
||||
# delete key (renamed to BlendStyle )
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
$key="BlendStyle";
|
||||
|
||||
my %hash = (
|
||||
"Solid Color"=>"BlendNone",
|
||||
"Radial Gradient"=>"BlendRadial",
|
||||
"Follow Style Hint"=>"BlendFromStyle" );
|
||||
|
||||
if( $hash{$value} )
|
||||
{ print( "$key=$hash{$value}\n" ); }
|
||||
|
||||
} elsif( $key eq "ButtonSize" ) {
|
||||
|
||||
# Button size
|
||||
my %hash = (
|
||||
"Small"=>"ButtonSmall",
|
||||
"Normal"=>"ButtonDefault",
|
||||
"Large"=>"ButtonLarge",
|
||||
"Very Large"=>"ButtonVeryLarge",
|
||||
"Huge"=>"ButtonHuge" );
|
||||
|
||||
if( $hash{$value} ) { print( "$key=$hash{$value}\n" ); }
|
||||
else { print( "# DELETE [$section]$key\n" ); }
|
||||
|
||||
} elsif( $key eq "FrameBorder" ) {
|
||||
|
||||
# frame border size
|
||||
my %hash = (
|
||||
"No Border"=>"BorderNone",
|
||||
"No Side Border"=>"BorderNoSide",
|
||||
"Tiny"=>"BorderTiny",
|
||||
"Normal"=>"BorderDefault",
|
||||
"Large"=>"BorderLarge",
|
||||
"Very Large"=>"BorderVeryLarge",
|
||||
"Huge"=>"BorderHuge",
|
||||
"Very Huge"=>"BorderVeryHuge",
|
||||
"Oversized"=>"BorderOverSized" );
|
||||
|
||||
if( $hash{$value} ) { print( "$key=$hash{$value}\n" ); }
|
||||
else { print( "# DELETE [$section]$key\n" ); }
|
||||
|
||||
} elsif( $key eq "SizeGripMode" ) {
|
||||
|
||||
# size grip
|
||||
# delete key (renamed to DrawSizeGrip )
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
$key="DrawSizeGrip";
|
||||
|
||||
my %hash = (
|
||||
"Always Hide Extra Size Grip"=>"false",
|
||||
"Show Extra Size Grip When Needed"=>"true" );
|
||||
|
||||
if( $hash{$value} ) { print( "$key=$hash{$value}\n" ); }
|
||||
|
||||
} elsif( $key eq "TitleAlignment" ) {
|
||||
|
||||
# title alignment
|
||||
my %hash = (
|
||||
"Left"=>"AlignLeft",
|
||||
"Center"=>"AlignCenter",
|
||||
"Center (Full Width)"=>"AlignCenterFullWidth",
|
||||
"Right"=>"AlignRight" );
|
||||
|
||||
if( $hash{$value} ) { print( "$key=$hash{$value}\n" ); }
|
||||
else { print( "# DELETE [$section]$key\n" ); }
|
||||
|
||||
} elsif( $key eq "DrawSeparator" ) {
|
||||
|
||||
# separator
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
|
||||
$drawSeparator = $value;
|
||||
if( !( $separatorActiveOnly eq "" ) )
|
||||
{
|
||||
|
||||
$key = "SeparatorMode";
|
||||
$value = "";
|
||||
|
||||
if( $drawSeparator eq "false" ) { $value = "SeparatorNever"; }
|
||||
elsif( $drawSeparator eq "true" ) {
|
||||
|
||||
if( $separatorActiveOnly eq "true" ) { $value = "SeparatorActive"; }
|
||||
elsif( $separatorActiveOnly eq "false" ) { $value = "SeparatorAlways"; }
|
||||
|
||||
}
|
||||
|
||||
if( !( $value eq "" ) ) { print( "$key=$value\n" ); }
|
||||
$separatorActiveOnly="";
|
||||
$drawSeparator="";
|
||||
}
|
||||
|
||||
} elsif( $key eq "SeparatorActiveOnly" ) {
|
||||
|
||||
# separator
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
|
||||
$separatorActiveOnly = $value;
|
||||
if( !( $drawSeparator eq "" ) )
|
||||
{
|
||||
|
||||
$key = "SeparatorMode";
|
||||
$value = "";
|
||||
|
||||
if( $drawSeparator eq "false" ) { $value = "SeparatorNever"; }
|
||||
elsif( $drawSeparator eq "true" ) {
|
||||
|
||||
if( $separatorActiveOnly eq "true" ) { $value = "SeparatorActive"; }
|
||||
elsif( $separatorActiveOnly eq "false" ) { $value = "SeparatorAlways"; }
|
||||
|
||||
}
|
||||
|
||||
if( !( $value eq "" ) ) { print( "$key=$value\n" ); }
|
||||
$separatorActiveOnly="";
|
||||
$drawSeparator="";
|
||||
|
||||
}
|
||||
|
||||
} elsif( $key eq "Pattern" ) {
|
||||
|
||||
# exception pattern
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
|
||||
$key="ExceptionPattern";
|
||||
print( "$key=$value\n" );
|
||||
|
||||
} elsif( $key eq "Type" ) {
|
||||
|
||||
# exception type
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
$key = "ExceptionType";
|
||||
my %hash = (
|
||||
"Window Class Name"=>"ExceptionWindowClassName",
|
||||
"Window Title"=>"ExceptionWindowTitle" );
|
||||
|
||||
if( $hash{$value} ) { print( "$key=$hash{$value}\n" ); }
|
||||
|
||||
} elsif(
|
||||
( $key eq "CenterTitleOnFullWidth" ) ||
|
||||
( $key eq "UseDropShadows" ) ||
|
||||
( $key eq "UseOxygenShadows" ) ) {
|
||||
|
||||
# obsolete flags
|
||||
print( "# DELETE [$section]$key\n" );
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
print( $line );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
set(oxygen_shadow_demo_SOURCES
|
||||
oxygenshadowdemodialog.cpp
|
||||
oxygenshadowdemowidget.cpp
|
||||
main.cpp)
|
||||
|
||||
set(oxygen_shadow_demo_FORMS ui/oxygenshadowdemo.ui)
|
||||
|
||||
qt5_wrap_ui(oxygen_shadow_demo_FORMS_HEADERS ${oxygen_shadow_demo_FORMS})
|
||||
|
||||
add_executable(oxygen-shadow-demo ${oxygen_shadow_demo_SOURCES} ${oxygen_shadow_demo_FORMS_HEADERS})
|
||||
|
||||
target_link_libraries(oxygen-shadow-demo Qt5::Core Qt5::Gui Qt5::Widgets Qt5::DBus)
|
||||
target_link_libraries(oxygen-shadow-demo KF5::I18n)
|
||||
target_link_libraries(oxygen-shadow-demo oxygenstyle )
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(oxygen-shadow-demo ${X11_LIBRARIES})
|
||||
endif()
|
||||
|
||||
install(TARGETS oxygen-shadow-demo ${INSTALL_TARGETS_DEFAULT_ARGS})
|
|
@ -1,45 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// main.cpp
|
||||
// oxygen-demo main
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenshadowdemodialog.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QIcon>
|
||||
|
||||
#include <KLocalizedString>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QApplication app( argc, argv );
|
||||
app.setApplicationName( i18n( "Oxygen Shadow Demo" ) );
|
||||
app.setWindowIcon( QIcon::fromTheme( QStringLiteral( "oxygen" ) ) );
|
||||
Oxygen::ShadowDemoDialog dialog;
|
||||
dialog.show();
|
||||
bool result = app.exec();
|
||||
return result;
|
||||
|
||||
}
|
|
@ -1,116 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenshadowdemodialog.h
|
||||
// oxygen shadow demo dialog
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenshadowdemodialog.h"
|
||||
#include "oxygenshadowdemodialog.moc"
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QDBusConnection>
|
||||
|
||||
#include <KLocalizedString>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_________________________________________________________
|
||||
ShadowDemoDialog::ShadowDemoDialog( QWidget* parent ):
|
||||
QDialog( parent ),
|
||||
_helper( KSharedConfig::openConfig("oxygenrc") ),
|
||||
_cache( _helper )
|
||||
{
|
||||
|
||||
setWindowTitle( i18n( "Oxygen Shadow Demo" ) );
|
||||
setupUi( this );
|
||||
|
||||
inactiveRoundWidget->setHelper( _helper );
|
||||
inactiveSquareWidget->setHelper( _helper );
|
||||
activeRoundWidget->setHelper( _helper );
|
||||
activeSquareWidget->setHelper( _helper );
|
||||
|
||||
// reparse configuration
|
||||
reparseConfiguration();
|
||||
|
||||
// customize button box
|
||||
QList<QDialogButtonBox*> children( findChildren<QDialogButtonBox*>() );
|
||||
if( !children.isEmpty() )
|
||||
{
|
||||
QDialogButtonBox* buttonBox( children.front() );
|
||||
|
||||
_backgroundCheckBox = new QCheckBox( i18n( "Draw window background" ) );
|
||||
_backgroundCheckBox->setChecked( true );
|
||||
buttonBox->addButton( _backgroundCheckBox, QDialogButtonBox::ResetRole );
|
||||
|
||||
connect( _backgroundCheckBox, SIGNAL(toggled(bool)), inactiveRoundWidget, SLOT(toggleBackground(bool)) );
|
||||
connect( _backgroundCheckBox, SIGNAL(toggled(bool)), inactiveSquareWidget, SLOT(toggleBackground(bool)) );
|
||||
connect( _backgroundCheckBox, SIGNAL(toggled(bool)), activeRoundWidget, SLOT(toggleBackground(bool)) );
|
||||
connect( _backgroundCheckBox, SIGNAL(toggled(bool)), activeSquareWidget, SLOT(toggleBackground(bool)) );
|
||||
|
||||
}
|
||||
|
||||
// use DBus connection to update on oxygen configuration change
|
||||
QDBusConnection dbus = QDBusConnection::sessionBus();
|
||||
dbus.connect( QString(),
|
||||
QStringLiteral( "/OxygenWindeco" ),
|
||||
QStringLiteral( "org.kde.Oxygen.Style" ),
|
||||
QStringLiteral( "reparseConfiguration" ), this, SLOT(reparseConfiguration()) );
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void ShadowDemoDialog::reparseConfiguration( void )
|
||||
{
|
||||
|
||||
// read shadow configurations
|
||||
_cache.invalidateCaches();
|
||||
_cache.setEnabled( true );
|
||||
|
||||
// pass tileSets to UI
|
||||
ShadowCache::Key key;
|
||||
key.active = false;
|
||||
key.hasBorder = true;
|
||||
inactiveRoundWidget->setTileSet( *_cache.tileSet( key ) );
|
||||
inactiveRoundWidget->setShadowSize( _cache.shadowSize() );
|
||||
|
||||
key.active = false;
|
||||
key.hasBorder = false;
|
||||
inactiveSquareWidget->setTileSet( *_cache.tileSet( key ) );
|
||||
inactiveSquareWidget->setShadowSize( _cache.shadowSize() );
|
||||
inactiveSquareWidget->setSquare( true );
|
||||
|
||||
key.active = true;
|
||||
key.hasBorder = true;
|
||||
activeRoundWidget->setTileSet( *_cache.tileSet( key ) );
|
||||
activeRoundWidget->setShadowSize( _cache.shadowSize() );
|
||||
|
||||
key.active = true;
|
||||
key.hasBorder = false;
|
||||
activeSquareWidget->setTileSet( *_cache.tileSet( key ) );
|
||||
activeSquareWidget->setShadowSize( _cache.shadowSize() );
|
||||
activeSquareWidget->setSquare( true );
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
#ifndef oxygenshadowdemodialog_h
|
||||
#define oxygenshadowdemodialog_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenshadowdemodialog.h
|
||||
// oxygen shadow demo dialog
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "ui_oxygenshadowdemo.h"
|
||||
#include "oxygenhelper.h"
|
||||
#include "oxygenshadowcache.h"
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QDialog>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
class ShadowDemoDialog: public QDialog, Ui::OxygenShadowDemoDialog
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ShadowDemoDialog( QWidget* = 0 );
|
||||
|
||||
//! destructor
|
||||
virtual ~ShadowDemoDialog( void )
|
||||
{}
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! reparse configuration
|
||||
void reparseConfiguration( void );
|
||||
|
||||
private:
|
||||
|
||||
//! helper
|
||||
Helper _helper;
|
||||
|
||||
//! shadow cache
|
||||
ShadowCache _cache;
|
||||
|
||||
//! enable state checkbox
|
||||
QCheckBox* _backgroundCheckBox;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,105 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenshadowdemowidget.h
|
||||
// shadow demo widget
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenshadowdemowidget.h"
|
||||
#include "oxygenshadowdemowidget.moc"
|
||||
|
||||
#include <QPainter>
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//______________________________________
|
||||
void ShadowDemoWidget::paintEvent( QPaintEvent* event )
|
||||
{
|
||||
|
||||
if( !_tileSet.isValid() ) return;
|
||||
|
||||
QPainter painter( this );
|
||||
painter.setClipRegion( event->region() );
|
||||
_tileSet.render( rect(), &painter );
|
||||
|
||||
// draw background
|
||||
if( _drawBackground )
|
||||
{
|
||||
updateBackgroundPixmap();
|
||||
painter.translate( _shadowSize, _shadowSize );
|
||||
painter.drawPixmap( QPoint(0,0), _backgroundPixmap );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//______________________________________
|
||||
void ShadowDemoWidget::updateBackgroundPixmap( void )
|
||||
{
|
||||
|
||||
// check if background pixmap needs update
|
||||
QRect backgroundRect( QPoint( 0, 0 ), size() - QSize( 2*_shadowSize, 2*_shadowSize ) );
|
||||
if( !_backgroundPixmap.isNull() && _backgroundPixmap.size() == backgroundRect.size() )
|
||||
{ return; }
|
||||
|
||||
_backgroundPixmap = QPixmap( backgroundRect.size() );
|
||||
_backgroundPixmap.fill( Qt::transparent );
|
||||
QPainter painter( &_backgroundPixmap );
|
||||
painter.setRenderHint( QPainter::Antialiasing );
|
||||
|
||||
_dummy.resize( backgroundRect.size() );
|
||||
helper().renderWindowBackground(
|
||||
&painter, backgroundRect,
|
||||
&_dummy, &_dummy, palette().color( QPalette::Window ), 0, 64 );
|
||||
|
||||
// float frame
|
||||
helper().drawFloatFrame( &painter, backgroundRect.adjusted( -1, -1, 1, 1 ), palette().color( QPalette::Window ), false );
|
||||
|
||||
// add rounded mask
|
||||
painter.save();
|
||||
painter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
|
||||
painter.setBrush( Qt::black );
|
||||
painter.setPen( Qt::NoPen );
|
||||
if( _square )
|
||||
{
|
||||
QRectF rectF( backgroundRect );
|
||||
QPainterPath path;
|
||||
|
||||
// rotate counterclockwise, cause that makes angles easier
|
||||
path.moveTo( rectF.topLeft() + QPointF( 3.5, 0 ) );
|
||||
path.arcTo( QRectF( rectF.topLeft(), QSize( 7, 7 ) ), 90, 90 );
|
||||
path.lineTo( rectF.bottomLeft() );
|
||||
path.lineTo( rectF.bottomRight() );
|
||||
path.lineTo( rectF.topRight() + QPointF( 0, 3.5 ) );
|
||||
path.arcTo( QRectF( rectF.topRight() + QPointF( -7, 0 ), QSize( 7, 7 ) ), 0, 90 );
|
||||
path.lineTo( rectF.topLeft() + QPointF( 3.5, 0 ) );
|
||||
painter.drawPath( path );
|
||||
|
||||
} else {
|
||||
|
||||
painter.drawRoundedRect( QRectF( backgroundRect ), 3.5, 3.5 );
|
||||
|
||||
}
|
||||
|
||||
painter.restore();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,140 +0,0 @@
|
|||
#ifndef oxygenshadowdemowidget_h
|
||||
#define oxygenshadowdemowidget_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenshadowdemowidget.h
|
||||
// shadow demo widget
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygentileset.h"
|
||||
#include "oxygenhelper.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPaintEvent>
|
||||
#include <QPixmap>
|
||||
#include <cassert>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//! shadow demo widget
|
||||
class ShadowDemoWidget: public QWidget
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ShadowDemoWidget( QWidget* parent = nullptr ):
|
||||
QWidget( parent ),
|
||||
_drawBackground( true ),
|
||||
_square( false ),
|
||||
_helper( 0L )
|
||||
{}
|
||||
|
||||
//! destructor
|
||||
virtual ~ShadowDemoWidget( void )
|
||||
{}
|
||||
|
||||
//! helper
|
||||
void setHelper( Helper& helper )
|
||||
{ _helper = &helper; }
|
||||
|
||||
//! set tileSet
|
||||
void setTileSet( const TileSet& tileSet )
|
||||
{
|
||||
_tileSet = tileSet;
|
||||
if( isVisible() ) update();
|
||||
}
|
||||
|
||||
//! tileset
|
||||
const TileSet& tileSet( void ) const
|
||||
{ return _tileSet; }
|
||||
|
||||
//! set shadow size
|
||||
void setShadowSize( int size )
|
||||
{
|
||||
_shadowSize = size;
|
||||
setMinimumSize( _shadowSize*2 + 100, _shadowSize*2 + 60 );
|
||||
}
|
||||
|
||||
//! square
|
||||
void setSquare( bool value )
|
||||
{
|
||||
_square = value;
|
||||
if( isVisible() ) update();
|
||||
}
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! toggle background drawing
|
||||
void toggleBackground( bool value )
|
||||
{
|
||||
if( value == _drawBackground ) return;
|
||||
_drawBackground = value;
|
||||
update();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
//! paint event
|
||||
virtual void paintEvent( QPaintEvent* );
|
||||
|
||||
//! render window to pixmap
|
||||
void updateBackgroundPixmap( void );
|
||||
|
||||
Helper& helper( void ) const
|
||||
{
|
||||
assert( _helper );
|
||||
return *_helper;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
//! shadow size
|
||||
int _shadowSize;
|
||||
|
||||
//! draw window background
|
||||
bool _drawBackground;
|
||||
|
||||
//! true if (bottom) corners are square
|
||||
bool _square;
|
||||
|
||||
//! helper
|
||||
Helper* _helper;
|
||||
|
||||
//! dummy widget
|
||||
QWidget _dummy;
|
||||
|
||||
//! window pixmap
|
||||
QPixmap _backgroundPixmap;
|
||||
|
||||
//! tileSet
|
||||
TileSet _tileSet;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,104 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OxygenShadowDemoDialog</class>
|
||||
<widget class="QDialog" name="OxygenShadowDemoDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>535</width>
|
||||
<height>466</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1,0">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Inactive Windows</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Active Windows</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="Oxygen::ShadowDemoWidget" name="inactiveRoundWidget" native="true"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="Oxygen::ShadowDemoWidget" name="inactiveSquareWidget" native="true"/>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="Oxygen::ShadowDemoWidget" name="activeRoundWidget" native="true"/>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="Oxygen::ShadowDemoWidget" name="activeSquareWidget" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Oxygen::ShadowDemoWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>oxygenshadowdemowidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>OxygenShadowDemoDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>OxygenShadowDemoDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -1,440 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Button.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
// Copyright (c) 2006, 2007 Riccardo Iaconelli <riccardo@kde.org>
|
||||
// Copyright (c) 2006, 2007 Casper Boemann <cbr@boemann.dk>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenbutton.h"
|
||||
#include "oxygenbutton.moc"
|
||||
#include "oxygenclient.h"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include <QPainter>
|
||||
#include <QPen>
|
||||
|
||||
#include <KColorUtils>
|
||||
#include <KColorScheme>
|
||||
#include <kcommondecoration.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
//_______________________________________________
|
||||
Button::Button(
|
||||
Client &parent,
|
||||
const QString& tip,
|
||||
ButtonType type):
|
||||
KCommonDecorationButton((::ButtonType)type, &parent),
|
||||
_client(parent),
|
||||
_helper( parent.helper() ),
|
||||
_type(type),
|
||||
_status( 0 ),
|
||||
_forceInactive( false ),
|
||||
_glowAnimation( new Animation( 150, this ) ),
|
||||
_glowIntensity(0)
|
||||
{
|
||||
setAutoFillBackground(false);
|
||||
setAttribute(Qt::WA_NoSystemBackground);
|
||||
|
||||
int size( _client.buttonSize() );
|
||||
setFixedSize( size, size );
|
||||
|
||||
setCursor(Qt::ArrowCursor);
|
||||
setToolTip(tip);
|
||||
|
||||
// setup animation
|
||||
_glowAnimation->setStartValue( 0 );
|
||||
_glowAnimation->setEndValue( 1.0 );
|
||||
_glowAnimation->setTargetObject( this );
|
||||
_glowAnimation->setPropertyName( "glowIntensity" );
|
||||
_glowAnimation->setEasingCurve( QEasingCurve::InOutQuad );
|
||||
|
||||
// setup connections
|
||||
reset(0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
Button::~Button()
|
||||
{}
|
||||
|
||||
//_______________________________________________
|
||||
QColor Button::buttonDetailColor(const QPalette &palette) const
|
||||
{
|
||||
if( _client.glowIsAnimated() && !_forceInactive && !_client.isForcedActive()) return KColorUtils::mix(
|
||||
buttonDetailColor( palette, false ),
|
||||
buttonDetailColor( palette, true ),
|
||||
_client.glowIntensity() );
|
||||
else return buttonDetailColor( palette, isActive() || _client.isForcedActive() );
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
bool Button::isActive( void ) const
|
||||
{ return (!_forceInactive) && _client.isActive(); }
|
||||
|
||||
//___________________________________________________
|
||||
bool Button::buttonAnimationsEnabled( void ) const
|
||||
{ return _client.animationsEnabled() && _client.configuration()->buttonAnimationsEnabled(); }
|
||||
|
||||
//___________________________________________________
|
||||
QSize Button::sizeHint() const
|
||||
{
|
||||
unsigned int size( _client.buttonSize() );
|
||||
return QSize( size, size );
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::reset( unsigned long )
|
||||
{ _glowAnimation->setDuration( _client.configuration()->buttonAnimationsDuration() ); }
|
||||
|
||||
//___________________________________________________
|
||||
void Button::paint( QPainter& painter )
|
||||
{
|
||||
|
||||
QPalette palette( _client.palette() );
|
||||
palette.setCurrentColorGroup( isActive() ? QPalette::Active : QPalette::Inactive);
|
||||
|
||||
if(
|
||||
_client.compositingActive() &&
|
||||
!( _client.isMaximized() || _type == ButtonItemClose || _type == ButtonItemMenu ) )
|
||||
{ painter.translate( 0, -1 ); }
|
||||
|
||||
// translate buttons down if window maximized
|
||||
if( _client.isMaximized() ) painter.translate( 0, 1 );
|
||||
|
||||
// base button color
|
||||
QColor base;
|
||||
if( _type == ButtonItemClose && _forceInactive ) base = _client.backgroundPalette( this, palette ).window().color();
|
||||
else if( _type == ButtonItemClose ) base = palette.window().color();
|
||||
else base = palette.button().color();
|
||||
|
||||
// text color
|
||||
QColor color = (_type == ButtonItemClose && _forceInactive ) ?
|
||||
buttonDetailColor( _client.backgroundPalette( this, palette ) ):
|
||||
buttonDetailColor( palette );
|
||||
|
||||
// decide decoration color
|
||||
QColor glow;
|
||||
if( isAnimated() || (_status&Hovered) )
|
||||
{
|
||||
glow = isCloseButton() ?
|
||||
_helper.viewNegativeTextBrush().brush(palette).color():
|
||||
_helper.viewHoverBrush().brush(palette).color();
|
||||
|
||||
if( isAnimated() )
|
||||
{
|
||||
|
||||
color = KColorUtils::mix( color, glow, glowIntensity() );
|
||||
glow = _helper.alphaColor( glow, glowIntensity() );
|
||||
|
||||
} else if( _status&Hovered ) color = glow;
|
||||
|
||||
}
|
||||
|
||||
if( hasDecoration() )
|
||||
{
|
||||
// scale
|
||||
qreal scale( (21.0*_client.buttonSize())/22.0 );
|
||||
|
||||
// pressed state
|
||||
const bool pressed(
|
||||
(_status&Pressed) ||
|
||||
( _type == ButtonSticky && _client.isOnAllDesktops() ) ||
|
||||
( _type == ButtonAbove && _client.keepAbove() ) ||
|
||||
( _type == ButtonBelow && _client.keepBelow() ) );
|
||||
|
||||
// draw button shape
|
||||
painter.drawPixmap(0, 0, _helper.windecoButton( base, glow, pressed, scale ) );
|
||||
|
||||
}
|
||||
|
||||
// Icon
|
||||
// for menu button the application icon is used
|
||||
if( isMenuButton() )
|
||||
{
|
||||
|
||||
int iconScale( 0 );
|
||||
switch( _client.buttonSize() )
|
||||
{
|
||||
case Configuration::ButtonSmall: iconScale = 13; break;
|
||||
|
||||
default:
|
||||
case Configuration::ButtonDefault: iconScale = 16; break;
|
||||
case Configuration::ButtonLarge: iconScale = 20; break;
|
||||
case Configuration::ButtonVeryLarge: iconScale = 24; break;
|
||||
case Configuration::ButtonHuge: iconScale = 35; break;
|
||||
}
|
||||
|
||||
const QPixmap& pixmap( _client.icon().pixmap( iconScale ) );
|
||||
const double offset = 0.5*(width()-pixmap.width() );
|
||||
painter.drawPixmap(offset, offset-1, pixmap );
|
||||
|
||||
} else {
|
||||
|
||||
painter.setRenderHints(QPainter::Antialiasing);
|
||||
qreal width( 1.2 );
|
||||
|
||||
// contrast
|
||||
painter.setBrush(Qt::NoBrush);
|
||||
painter.setPen(QPen( _helper.calcLightColor( base ), width, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
||||
drawIcon(&painter);
|
||||
|
||||
// main
|
||||
painter.translate(0,-1.5);
|
||||
painter.setBrush(Qt::NoBrush);
|
||||
painter.setPen(QPen(color, width, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
||||
drawIcon(&painter);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::mousePressEvent( QMouseEvent *event )
|
||||
{
|
||||
|
||||
if( _type == ButtonMax || event->button() == Qt::LeftButton )
|
||||
{
|
||||
_status |= Pressed;
|
||||
parentUpdate();
|
||||
}
|
||||
|
||||
KCommonDecorationButton::mousePressEvent( event );
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::mouseReleaseEvent( QMouseEvent* event )
|
||||
{
|
||||
if (_type != ButtonApplicationMenu)
|
||||
{
|
||||
_status &= ~Pressed;
|
||||
parentUpdate();
|
||||
}
|
||||
|
||||
KCommonDecorationButton::mouseReleaseEvent( event );
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::enterEvent( QEvent *event )
|
||||
{
|
||||
|
||||
KCommonDecorationButton::enterEvent( event );
|
||||
_status |= Hovered;
|
||||
|
||||
if( buttonAnimationsEnabled() )
|
||||
{
|
||||
|
||||
_glowAnimation->setDirection( Animation::Forward );
|
||||
if( !isAnimated() ) _glowAnimation->start();
|
||||
|
||||
} else parentUpdate();
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::leaveEvent( QEvent *event )
|
||||
{
|
||||
|
||||
KCommonDecorationButton::leaveEvent( event );
|
||||
|
||||
if( _status&Hovered && buttonAnimationsEnabled() )
|
||||
{
|
||||
_glowAnimation->setDirection( Animation::Backward );
|
||||
if( !isAnimated() ) _glowAnimation->start();
|
||||
}
|
||||
|
||||
_status &= ~Hovered;
|
||||
parentUpdate();
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::resizeEvent( QResizeEvent *event )
|
||||
{
|
||||
|
||||
// resize backing store pixmap
|
||||
if( !_client.compositingActive() )
|
||||
{ _pixmap = QPixmap( event->size() ); }
|
||||
|
||||
// base class implementation
|
||||
KCommonDecorationButton::resizeEvent( event );
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
|
||||
if( _client.hideTitleBar() ) return;
|
||||
|
||||
/*
|
||||
do nothing in compositing mode.
|
||||
painting is performed by the parent widget
|
||||
*/
|
||||
if( !_client.compositingActive() )
|
||||
{
|
||||
|
||||
{
|
||||
|
||||
// create painter
|
||||
QPainter painter( &_pixmap );
|
||||
painter.setRenderHints(QPainter::Antialiasing);
|
||||
painter.setClipRect( this->rect().intersected( event->rect() ) );
|
||||
|
||||
// render parent background
|
||||
painter.translate( -geometry().topLeft() );
|
||||
_client.paintBackground( painter );
|
||||
|
||||
// render buttons
|
||||
painter.translate( geometry().topLeft() );
|
||||
paint( painter );
|
||||
|
||||
}
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setClipRegion( event->region() );
|
||||
painter.drawPixmap( QPoint(), _pixmap );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::parentUpdate( void )
|
||||
{
|
||||
|
||||
if( _client.compositingActive() || _client.isPreview() ) _client.update( geometry().adjusted( -1, -1, 1, 1 ) );
|
||||
else if( parentWidget() ) parentWidget()->update( geometry().adjusted( -1, -1, 1, 1 ) );
|
||||
else this->update();
|
||||
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
void Button::drawIcon( QPainter* painter )
|
||||
{
|
||||
|
||||
painter->save();
|
||||
painter->setWindow( 0, 0, 22, 22 );
|
||||
|
||||
switch(_type)
|
||||
{
|
||||
|
||||
case ButtonSticky:
|
||||
painter->drawPoint(QPointF(10.5,10.5));
|
||||
break;
|
||||
|
||||
case ButtonHelp:
|
||||
painter->translate(1.5, 1.5);
|
||||
painter->drawArc(7,5,4,4,135*16, -180*16);
|
||||
painter->drawArc(9,8,4,4,135*16,45*16);
|
||||
painter->drawPoint(9,12);
|
||||
painter->translate(-1.5, -1.5);
|
||||
break;
|
||||
|
||||
case ButtonApplicationMenu:
|
||||
painter->drawLine(QPointF(7.5, 7.5), QPointF(13.5, 7.5));
|
||||
painter->drawLine(QPointF(7.5, 10.5), QPointF(13.5, 10.5));
|
||||
painter->drawLine(QPointF(7.5, 13.5), QPointF(13.5, 13.5));
|
||||
break;
|
||||
|
||||
case ButtonMin:
|
||||
painter->drawLine(QPointF( 7.5, 9.5), QPointF(10.5,12.5));
|
||||
painter->drawLine(QPointF(10.5,12.5), QPointF(13.5, 9.5));
|
||||
break;
|
||||
|
||||
case ButtonMax:
|
||||
switch(_client.maximizeMode())
|
||||
{
|
||||
case Client::MaximizeRestore:
|
||||
case Client::MaximizeVertical:
|
||||
case Client::MaximizeHorizontal:
|
||||
painter->drawLine(QPointF( 7.5,11.5), QPointF(10.5, 8.5));
|
||||
painter->drawLine(QPointF(10.5, 8.5), QPointF(13.5,11.5));
|
||||
break;
|
||||
|
||||
case Client::MaximizeFull:
|
||||
{
|
||||
painter->translate(1.5, 1.5);
|
||||
QPoint points[4] = {QPoint(9, 6), QPoint(12, 9), QPoint(9, 12), QPoint(6, 9)};
|
||||
painter->drawPolygon(points, 4);
|
||||
painter->translate(-1.5, -1.5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ButtonItemClose:
|
||||
case ButtonClose:
|
||||
painter->drawLine(QPointF( 7.5,7.5), QPointF(13.5,13.5));
|
||||
painter->drawLine(QPointF(13.5,7.5), QPointF( 7.5,13.5));
|
||||
break;
|
||||
|
||||
case ButtonAbove:
|
||||
painter->drawLine(QPointF( 7.5,14), QPointF(10.5,11));
|
||||
painter->drawLine(QPointF(10.5,11), QPointF(13.5,14));
|
||||
painter->drawLine(QPointF( 7.5,10), QPointF(10.5, 7));
|
||||
painter->drawLine(QPointF(10.5, 7), QPointF(13.5,10));
|
||||
break;
|
||||
|
||||
case ButtonBelow:
|
||||
painter->drawLine(QPointF( 7.5,11), QPointF(10.5,14));
|
||||
painter->drawLine(QPointF(10.5,14), QPointF(13.5,11));
|
||||
painter->drawLine(QPointF( 7.5, 7), QPointF(10.5,10));
|
||||
painter->drawLine(QPointF(10.5,10), QPointF(13.5, 7));
|
||||
break;
|
||||
|
||||
case ButtonShade:
|
||||
if (!isChecked())
|
||||
{
|
||||
|
||||
// shade button
|
||||
painter->drawLine(QPointF( 7.5, 7.5), QPointF(10.5,10.5));
|
||||
painter->drawLine(QPointF(10.5,10.5), QPointF(13.5, 7.5));
|
||||
painter->drawLine(QPointF( 7.5,13.0), QPointF(13.5,13.0));
|
||||
|
||||
} else {
|
||||
|
||||
// unshade button
|
||||
painter->drawLine(QPointF( 7.5,10.5), QPointF(10.5, 7.5));
|
||||
painter->drawLine(QPointF(10.5, 7.5), QPointF(13.5,10.5));
|
||||
painter->drawLine(QPointF( 7.5,13.0), QPointF(13.5,13.0));
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
painter->restore();
|
||||
return;
|
||||
}
|
||||
|
||||
void Button::slotAppMenuHidden()
|
||||
{
|
||||
_status = Normal;
|
||||
update();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,206 +0,0 @@
|
|||
#ifndef oxygenbutton_h
|
||||
#define oxygenbutton_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Button.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2006, 2007 Riccardo Iaconelli <riccardo@kde.org>
|
||||
// Copyright (c) 2006, 2007 Casper Boemann <cbr@boemann.dk>
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenanimation.h"
|
||||
#include "oxygendecorationdefines.h"
|
||||
#include "oxygendecohelper.h"
|
||||
|
||||
#include <kcommondecoration.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
class Client;
|
||||
|
||||
Q_DECLARE_FLAGS(ButtonState, ButtonStatus)
|
||||
|
||||
class Button : public KCommonDecorationButton
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
//! declare animation progress property
|
||||
Q_PROPERTY( qreal glowIntensity READ glowIntensity WRITE setGlowIntensity )
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit Button(Client&, const QString& = QString(), ButtonType = ButtonHelp );
|
||||
|
||||
//! destructor
|
||||
~Button();
|
||||
|
||||
//! destructor
|
||||
QSize sizeHint() const;
|
||||
|
||||
//! button type
|
||||
ButtonType type( void ) const
|
||||
{ return _type; }
|
||||
|
||||
//! set force inactive
|
||||
/*! returns true if value was actually changed */
|
||||
void setForceInactive( const bool& value )
|
||||
{ _forceInactive = value; }
|
||||
|
||||
//! configuration reset
|
||||
virtual void reset( unsigned long );
|
||||
|
||||
//!@name glow animation
|
||||
//@{
|
||||
void setGlowIntensity( qreal value )
|
||||
{
|
||||
if( _glowIntensity == value ) return;
|
||||
_glowIntensity = value;
|
||||
parentUpdate();
|
||||
}
|
||||
|
||||
qreal glowIntensity( void ) const
|
||||
{ return _glowIntensity; }
|
||||
|
||||
//@}
|
||||
|
||||
//! render buttn to provided painter
|
||||
void paint(QPainter& );
|
||||
|
||||
protected:
|
||||
|
||||
//! press event
|
||||
void mousePressEvent( QMouseEvent* );
|
||||
|
||||
//! release event
|
||||
void mouseReleaseEvent( QMouseEvent* );
|
||||
|
||||
//! enter event
|
||||
void enterEvent( QEvent* );
|
||||
|
||||
//! leave event
|
||||
void leaveEvent( QEvent* );
|
||||
|
||||
//! resize event
|
||||
void resizeEvent( QResizeEvent* );
|
||||
|
||||
//! paint
|
||||
void paintEvent( QPaintEvent* );
|
||||
|
||||
// parent update
|
||||
void parentUpdate( void );
|
||||
|
||||
//! draw icon
|
||||
void drawIcon( QPainter* );
|
||||
|
||||
//! color
|
||||
QColor buttonDetailColor( const QPalette& ) const;
|
||||
|
||||
//! color
|
||||
QColor buttonDetailColor( const QPalette& palette, bool active ) const
|
||||
{
|
||||
if( _type == ButtonItemClose )
|
||||
{
|
||||
|
||||
return active ?
|
||||
palette.color(QPalette::Active, QPalette::WindowText ):
|
||||
_helper.inactiveTitleBarTextColor( palette );
|
||||
|
||||
} else {
|
||||
|
||||
return active ?
|
||||
palette.color(QPalette::Active, QPalette::ButtonText ):
|
||||
_helper.inactiveButtonTextColor( palette );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//! true if animation is in progress
|
||||
bool isAnimated( void ) const
|
||||
{ return _glowAnimation->isRunning(); }
|
||||
|
||||
//! true if button is active
|
||||
bool isActive( void ) const;
|
||||
|
||||
//! true if buttons hover are animated
|
||||
bool buttonAnimationsEnabled( void ) const;
|
||||
|
||||
//!@name button properties
|
||||
//@{
|
||||
|
||||
//! true if button if of menu type
|
||||
bool isMenuButton( void ) const
|
||||
{ return _type == ButtonMenu || _type == ButtonItemMenu; }
|
||||
|
||||
//! true if button is of toggle type
|
||||
bool isToggleButton( void ) const
|
||||
{ return _type == ButtonSticky || _type == ButtonAbove || _type == ButtonBelow; }
|
||||
|
||||
//! true if button if of close type
|
||||
bool isCloseButton( void ) const
|
||||
{ return _type == ButtonClose || _type == ButtonItemClose; }
|
||||
|
||||
//! true if button has decoration
|
||||
bool hasDecoration( void ) const
|
||||
{ return !isMenuButton() && _type != ButtonItemClose; }
|
||||
|
||||
//@}
|
||||
|
||||
private Q_SLOTS:
|
||||
void slotAppMenuHidden();
|
||||
|
||||
private:
|
||||
|
||||
//! parent client
|
||||
Client &_client;
|
||||
|
||||
//! helper
|
||||
DecoHelper &_helper;
|
||||
|
||||
//! backing store pixmap (when compositing is not active)
|
||||
QPixmap _pixmap;
|
||||
|
||||
//! button type
|
||||
ButtonType _type;
|
||||
|
||||
//! button status
|
||||
unsigned int _status;
|
||||
|
||||
//! true if button should be forced inactive
|
||||
bool _forceInactive;
|
||||
|
||||
//! glow animation
|
||||
//Animation::Pointer _glowAnimation;
|
||||
Animation* _glowAnimation;
|
||||
|
||||
//! glow intensity
|
||||
qreal _glowIntensity;
|
||||
|
||||
|
||||
};
|
||||
|
||||
} //namespace Oxygen
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -1,178 +0,0 @@
|
|||
# KDE Desktop Entry
|
||||
[Desktop Entry]
|
||||
Name=Oxygen
|
||||
Name[af]=Oxygen
|
||||
Name[ar]=أكسجين
|
||||
Name[as]=Oxygen
|
||||
Name[ast]=Oxíxenu
|
||||
Name[be]=Oxygen
|
||||
Name[be@latin]=Oxygen
|
||||
Name[bg]=Oxygen
|
||||
Name[bn]=অক্সিজেন
|
||||
Name[bn_IN]=Oxygen
|
||||
Name[bs]=Kiseonik
|
||||
Name[ca]=Oxygen
|
||||
Name[ca@valencia]=Oxygen
|
||||
Name[cs]=Oxygen
|
||||
Name[csb]=Krziseń
|
||||
Name[da]=Oxygen
|
||||
Name[de]=Oxygen
|
||||
Name[el]=Oxygen
|
||||
Name[en_GB]=Oxygen
|
||||
Name[eo]=Oxygen
|
||||
Name[es]=Oxígeno
|
||||
Name[et]=Oxygen
|
||||
Name[eu]=Oxygen
|
||||
Name[fa]=اکسیژن
|
||||
Name[fi]=Oxygen
|
||||
Name[fr]=Oxygen
|
||||
Name[fy]=Oxygen
|
||||
Name[ga]=Oxygen
|
||||
Name[gl]=Oxygen
|
||||
Name[gu]=ઓક્સિજન
|
||||
Name[he]=Oxygen
|
||||
Name[hi]=आक्सीजन
|
||||
Name[hne]=आक्सीजन
|
||||
Name[hr]=Oxygen
|
||||
Name[hsb]=Oxygen
|
||||
Name[hu]=Oxygen
|
||||
Name[ia]=Oxygen
|
||||
Name[id]=Oksigen
|
||||
Name[is]=Oxygen
|
||||
Name[it]=Oxygen
|
||||
Name[ja]=Oxygen
|
||||
Name[kk]=Oxygen
|
||||
Name[km]=អុកស៊ីហ្សែន
|
||||
Name[kn]=ಆಕ್ಸಿಜನ್
|
||||
Name[ko]=Oxygen
|
||||
Name[ku]=Oxygen
|
||||
Name[lt]=Oxygen
|
||||
Name[lv]=Oxygen
|
||||
Name[mai]=आक्सीजन
|
||||
Name[mk]=Оксиген
|
||||
Name[ml]=ഓക്സിജന്
|
||||
Name[mr]=ऑक्सीजन
|
||||
Name[nb]=Oxygen
|
||||
Name[nds]=Oxygen
|
||||
Name[ne]=अक्सिजन
|
||||
Name[nl]=Oxygen
|
||||
Name[nn]=Oksygen
|
||||
Name[or]=ଅକ୍ସିଜେନ
|
||||
Name[pa]=ਆਕਸੀਜਨ
|
||||
Name[pl]=Oxygen
|
||||
Name[pt]=Oxygen
|
||||
Name[pt_BR]=Oxygen
|
||||
Name[ro]=Oxygen
|
||||
Name[ru]=Oxygen
|
||||
Name[se]=Oksygena
|
||||
Name[si]=ඔක්සිජන්
|
||||
Name[sk]=Oxygen
|
||||
Name[sl]=Kisik
|
||||
Name[sr]=Кисеоник
|
||||
Name[sr@ijekavian]=Кисеоник
|
||||
Name[sr@ijekavianlatin]=Kiseonik
|
||||
Name[sr@latin]=Kiseonik
|
||||
Name[sv]=Oxygen
|
||||
Name[ta]=ஆக்ஸிஜன்
|
||||
Name[te]=Oxygen
|
||||
Name[tg]=Oxygen
|
||||
Name[th]=รูปแบบ Oxygen
|
||||
Name[tr]=Oxygen
|
||||
Name[ug]=ئوكسېگىن
|
||||
Name[uk]=Oxygen
|
||||
Name[uz]=Oxygen
|
||||
Name[uz@cyrillic]=Oxygen
|
||||
Name[vi]=Oxygen
|
||||
Name[wa]=Ocsidjinne
|
||||
Name[x-test]=xxOxygenxx
|
||||
Name[zh_CN]=Oxygen
|
||||
Name[zh_TW]=Oxygen
|
||||
|
||||
Comment=Styling of the next generation desktop
|
||||
Comment[af]=Stilering van die volgende generasie werkskerm
|
||||
Comment[ar]=نمط الجيل التالي من سطح المكتب
|
||||
Comment[ast]=Estilu de la siguiente xeneración d'escritorios
|
||||
Comment[be]=Стыль працоўных сталоў наступнага пакалення
|
||||
Comment[be@latin]=Styl nastupnaha pakaleńnia rabočaha stała
|
||||
Comment[bg]=Стил за следващото поколение работни плотове
|
||||
Comment[bs]=Stil za narednu generaciju površi
|
||||
Comment[ca]=Estil de la propera generació d'escriptori
|
||||
Comment[ca@valencia]=Estil de la propera generació d'escriptori
|
||||
Comment[cs]=Styl plochy nové generace
|
||||
Comment[csb]=Sztél nôslédny generacëji wëzdrzatkù pùltù
|
||||
Comment[da]=Stilisering af næste generation af skrivebordet
|
||||
Comment[de]=Das KDE-Design der nächsten Generation
|
||||
Comment[el]=Μορφή της νέας γενιάς επιφάνειας εργασίας
|
||||
Comment[en_GB]=Styling of the next generation desktop
|
||||
Comment[eo]=Stilo por la labortablo de sekva generacio
|
||||
Comment[es]=Estilo de la siguiente generación de escritorios
|
||||
Comment[et]=Uue põlvkonna töölaua stiil
|
||||
Comment[eu]=Hurrengo belaunaldiko mahaigainen estiloa
|
||||
Comment[fi]=Seuraavan sukupolven työpöydän tyyli
|
||||
Comment[fr]=Style pour la prochaine génération de bureau
|
||||
Comment[fy]=De styl fan it buroblêd fan de folgjende generaasje
|
||||
Comment[ga]=Stíliú na deisce don mhílaois nua
|
||||
Comment[gl]=O estilo da seguinte xeración do escritorio
|
||||
Comment[gu]=નવી પેઢીનાં ડેસ્કટોપની શૈલી
|
||||
Comment[he]=הסגנון של הדור הבא של שולחן העבודה
|
||||
Comment[hi]=अगली पीढ़ी के डेस्कटॉप की शैलियाँ
|
||||
Comment[hne]=अगला जनरेसन डेस्कटाप के स्टाइलिंग
|
||||
Comment[hr]=Stil sljedeće generacije radnih okruženja
|
||||
Comment[hsb]=Stil za dźěłowy powjerch přichodneje generacije
|
||||
Comment[hu]=Új generációs stílus
|
||||
Comment[ia]=Le stilo de scriptorio de proxime generation
|
||||
Comment[id]=Gaya dekstop generasi selanjutnya
|
||||
Comment[is]=Stílar fyrir næstu-kynslóðar skjáborð
|
||||
Comment[it]=Stile per il desktop di prossima generazione
|
||||
Comment[ja]=次世代デスクトップのスタイル
|
||||
Comment[kk]=Келесі буын үстел стилі
|
||||
Comment[km]=ការកំណត់រចនាប័ទ្មរបស់ផ្ទៃតុជំនាន់ក្រោយ
|
||||
Comment[kn]=ಮುಂದಿನ ಪೀಳಿಗೆಯ ಗಣಕತೆರೆ ವೈಖರಿ
|
||||
Comment[ko]=다음 세대 데스크톱을 위한 스타일
|
||||
Comment[ku]=Curekirina nifşê pêş ê sermaseyê
|
||||
Comment[lt]=Kitos kartos darbastalio stiliaus kūrimas
|
||||
Comment[lv]=Nākamās paaudzes darbvirsmas stils
|
||||
Comment[mai]=अगिला पीढ़ीक डेस्कटापक शैली
|
||||
Comment[mk]=Стил за следната генерација десктопи
|
||||
Comment[ml]=ഭാവിതലമുറയിലെ പണിയിടത്തിനുള്ള രീതികള്
|
||||
Comment[mr]=नेक्स्ट जेनरेशन डेस्कटॉपचे स्टायलिंग
|
||||
Comment[nb]=Stil for skrivebord av neste generasjon
|
||||
Comment[nds]=Stil för den kamen Schriefdisch
|
||||
Comment[ne]=पछिल्लो युगको डेस्कटपको शैली
|
||||
Comment[nl]=De stijl voor de volgende generatie bureaubladen
|
||||
Comment[nn]=Ein stil for neste generasjons skrivebord
|
||||
Comment[or]=ପରବର୍ତ୍ତୀ ପିଢ଼ି ଡ଼େସ୍କଟପର ଶୈଳୀକରଣ କରିବା
|
||||
Comment[pa]=ਅਗਲੀ ਪੀੜ੍ਹੀ ਡੈਸਕਟਾਪ ਦਾ ਸਟਾਇਲ
|
||||
Comment[pl]=Styl pulpitu następnej generacji
|
||||
Comment[pt]=O estilo do ambiente de trabalho da próxima geração
|
||||
Comment[pt_BR]=Estilo da próxima geração de área de trabalho
|
||||
Comment[ro]=Stilul biroului de generație următoare
|
||||
Comment[ru]=Стиль рабочего стола следующего поколения
|
||||
Comment[se]=Stiila boahttebuolvvalaš čállinbeavdái
|
||||
Comment[si]=ඊලඟ පරම්පරාවේ වැඩතල රටා
|
||||
Comment[sk]=Štýl plochy novej generácie
|
||||
Comment[sl]=Slog namizja naslednje generacije
|
||||
Comment[sr]=Стил за наредну генерацију површи
|
||||
Comment[sr@ijekavian]=Стил за наредну генерацију површи
|
||||
Comment[sr@ijekavianlatin]=Stil za narednu generaciju površi
|
||||
Comment[sr@latin]=Stil za narednu generaciju površi
|
||||
Comment[sv]=Stil för nästa generations skrivbord
|
||||
Comment[ta]=Styling of the next generation desktop
|
||||
Comment[te]=తరువాతి తరం డెస్క్టాప్ యొక్క శైలీకరణ
|
||||
Comment[tg]=Стиль рабочего стола следующего поколения
|
||||
Comment[th]=รูปแบบสำหรับพื้นที่ทำงานในยุคถัดไป
|
||||
Comment[tr]=Sonraki kuşak masaüstü biçimi
|
||||
Comment[ug]=كېيىنكى ئەۋلاد ئۈستەلئۈستى ئۇسلۇبى
|
||||
Comment[uk]=Стиль стільниці наступного покоління
|
||||
Comment[wa]=Stîle del novele djermêye di scribannes
|
||||
Comment[x-test]=xxStyling of the next generation desktopxx
|
||||
Comment[zh_CN]=下一代桌面的风格
|
||||
Comment[zh_TW]=下一代桌面的樣式
|
||||
|
||||
X-KDE-PluginInfo-Author=Nuno Pinheiro, Casper Boemann, Riccardo Iaconelli, Huynh Huu Long, Thomas Luebking, Hugo Pereira Da Costa, Matthew Woehlke
|
||||
X-KDE-PluginInfo-Email=nuno@oxygen-icons.org, cbr@boemann.dk, riccardo@kde.org, long.upcase@googlemail.com, thomas.luebking@web.de, hugo.pereira@free.fr, mw_triad@users.sourceforge.net
|
||||
X-KDE-PluginInfo-Name=Oxygen
|
||||
X-KDE-PluginInfo-Category=
|
||||
X-KDE-PluginInfo-Depends=
|
||||
X-KDE-PluginInfo-License=GPL
|
||||
X-KDE-PluginInfo-EnabledByDefault=true
|
|
@ -1,540 +0,0 @@
|
|||
#ifndef oxygenclient_h
|
||||
#define oxygenclient_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenclient.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
// Copyright (c) 2003, 2004 David Johnson <david@usermode.org>
|
||||
// Copyright (c) 2006, 2007 Riccardo Iaconelli <ruphy@fsfe.org>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenanimation.h"
|
||||
#include "oxygenclientgroupitemdata.h"
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "oxygendecohelper.h"
|
||||
#include "oxygenfactory.h"
|
||||
#include "oxygenshadowcache.h"
|
||||
#include "oxygentitleanimationdata.h"
|
||||
|
||||
#include <kcommondecoration.h>
|
||||
#include <QBasicTimer>
|
||||
#include <QTextStream>
|
||||
#include <QTimerEvent>
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class SizeGrip;
|
||||
class Client : public KCommonDecoration
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
//! declare glow intensity property
|
||||
Q_PROPERTY( qreal glowIntensity READ glowIntensityUnbiased WRITE setGlowIntensity )
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
Client(KDecorationBridge *b, Factory *f);
|
||||
|
||||
//! destructor
|
||||
virtual ~Client();
|
||||
|
||||
//! decoration name
|
||||
virtual QString visibleName() const;
|
||||
|
||||
//! buttons
|
||||
virtual KCommonDecorationButton *createButton(::ButtonType type);
|
||||
|
||||
//!@name flags
|
||||
//@{
|
||||
|
||||
//! true if decoration has iquired behavior
|
||||
virtual bool decorationBehaviour(DecorationBehaviour behaviour) const;
|
||||
|
||||
//! true if window is maximized
|
||||
virtual bool isMaximized( void ) const
|
||||
{ return maximizeMode()==MaximizeFull && !configuration()->drawBorderOnMaximizedWindows(); }
|
||||
|
||||
//! true if animations are used
|
||||
bool animationsEnabled( void ) const
|
||||
{ return _configuration->animationsEnabled(); }
|
||||
|
||||
//! true if glow is animated
|
||||
bool glowIsAnimated( void ) const
|
||||
{ return _glowAnimation->isRunning(); }
|
||||
|
||||
//! true when decoration is forced active
|
||||
bool isForcedActive( void ) const
|
||||
{ return _forceActive && tabCount() > 1; }
|
||||
|
||||
//! true when separator is to be drawn
|
||||
bool drawSeparator( void ) const
|
||||
{
|
||||
if( _configuration->drawTitleOutline() ) return false;
|
||||
switch( _configuration->separatorMode() )
|
||||
{
|
||||
case Configuration::SeparatorAlways:
|
||||
return true;
|
||||
|
||||
case Configuration::SeparatorActive:
|
||||
return ( glowIsAnimated() || isActive() );
|
||||
|
||||
default:
|
||||
case Configuration::SeparatorNever:
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//! true if titlebar is hidden
|
||||
bool hideTitleBar( void ) const
|
||||
{
|
||||
return
|
||||
_configuration->hideTitleBar() &&
|
||||
!isShade() &&
|
||||
tabCount() == 1;
|
||||
}
|
||||
|
||||
//@}
|
||||
|
||||
//! window shape
|
||||
virtual void updateWindowShape();
|
||||
|
||||
//! initialization
|
||||
virtual void init();
|
||||
|
||||
//! return associated configuration
|
||||
Factory::ConfigurationPtr configuration( void ) const
|
||||
{ return _configuration; }
|
||||
|
||||
//!@name glow animation
|
||||
//@{
|
||||
|
||||
void setGlowIntensity( qreal value )
|
||||
{
|
||||
if( _glowIntensity == value ) return;
|
||||
_glowIntensity = value;
|
||||
widget()->update();
|
||||
}
|
||||
|
||||
//! unbiased glow intensity
|
||||
qreal glowIntensityUnbiased( void ) const
|
||||
{ return _glowIntensity; }
|
||||
|
||||
//! glow bias
|
||||
static qreal glowBias( void )
|
||||
{ return 0.2; }
|
||||
|
||||
//! true (biased) intensity
|
||||
/*! this is needed to have glow go from either 0.2->1 or 0.8->0 depending on the animation direction */
|
||||
qreal glowIntensity( void ) const
|
||||
{ return _glowAnimation->direction() == Animation::Forward ? _glowIntensity : _glowIntensity-glowBias(); }
|
||||
|
||||
//@}
|
||||
|
||||
//! helper class
|
||||
DecoHelper& helper( void ) const
|
||||
{ return _factory->helper(); }
|
||||
|
||||
//! helper class
|
||||
ShadowCache& shadowCache( void ) const
|
||||
{ return _factory->shadowCache(); }
|
||||
|
||||
//!@name metrics and color definitions
|
||||
//@{
|
||||
|
||||
//! dimensions
|
||||
virtual int layoutMetric(LayoutMetric lm, bool respectWindowState = true, const KCommonDecorationButton * = 0) const;
|
||||
|
||||
//! get title rect for untabbed window
|
||||
virtual QRect defaultTitleRect( bool active = true ) const;
|
||||
|
||||
//! get title bounding rect
|
||||
virtual QRect titleBoundingRect( const QFont& font, const QString& caption ) const
|
||||
{ return titleBoundingRect( font, titleRect(), caption ); }
|
||||
|
||||
//! get title bounding rect
|
||||
virtual QRect titleBoundingRect( const QFont&, QRect, const QString& ) const;
|
||||
|
||||
//! palette background
|
||||
QPalette backgroundPalette( const QWidget*, QPalette ) const;
|
||||
|
||||
//! background
|
||||
QColor backgroundColor( const QWidget* widget, QPalette palette ) const
|
||||
{ return backgroundColor( widget, palette, isActive() || isForcedActive() ); }
|
||||
|
||||
//! background
|
||||
QColor backgroundColor( const QWidget*, QPalette, bool ) const;
|
||||
|
||||
//@}
|
||||
|
||||
//! title alignment
|
||||
inline Qt::Alignment titleAlignment( void ) const;
|
||||
|
||||
//! button size
|
||||
inline int buttonSize( void ) const;
|
||||
|
||||
//! frame border
|
||||
inline int frameBorder( void ) const;
|
||||
|
||||
//!@name status change methods (overloaded from KCommonDecorationUnstable)
|
||||
//@{
|
||||
|
||||
//! triggered when window activity is changed
|
||||
virtual void activeChange();
|
||||
|
||||
//! triggered when maximize state changed
|
||||
virtual void maximizeChange();
|
||||
|
||||
//! triggered when window shade is changed
|
||||
virtual void shadeChange();
|
||||
|
||||
//! triggered when window shade is changed
|
||||
virtual void captionChange();
|
||||
|
||||
//@}
|
||||
|
||||
//! event filter
|
||||
virtual bool eventFilter( QObject*, QEvent* );
|
||||
|
||||
//! resize event
|
||||
virtual void resizeEvent( QResizeEvent* );
|
||||
|
||||
//! paint background to painter
|
||||
void paintBackground( QPainter& ) const;
|
||||
|
||||
public Q_SLOTS:
|
||||
|
||||
//! triggers widget update in titleRect only
|
||||
/*! one needs to add the title top margin to avoid some clipping glitches */
|
||||
void updateTitleRect( void )
|
||||
{ widget()->update( titleRect().adjusted( 0, -layoutMetric( LM_TitleEdgeTop ), 0, 1 ) ); }
|
||||
|
||||
//! return region for a given defines. This allows to implement extended borders
|
||||
QRegion region( KDecorationDefines::Region );
|
||||
|
||||
protected:
|
||||
|
||||
//! return shadow cache key associated to this client
|
||||
ShadowCache::Key key( void ) const
|
||||
{
|
||||
ShadowCache::Key key;
|
||||
key.active = ( isActive() || isForcedActive() ) && shadowCache().isEnabled( QPalette::Active );
|
||||
key.isShade = isShade();
|
||||
key.hasBorder = ( _configuration->frameBorder() > Configuration::BorderNone );
|
||||
return key;
|
||||
}
|
||||
|
||||
//! true when decoration is forced active
|
||||
void setForceActive( bool value )
|
||||
{ _forceActive = value; }
|
||||
|
||||
//!@name event filters
|
||||
//@{
|
||||
|
||||
//! paint
|
||||
virtual void paintEvent( QPaintEvent* );
|
||||
|
||||
//! render full decoration to provided painter
|
||||
virtual void paint( QPainter& );
|
||||
|
||||
//! mouse press event
|
||||
virtual bool mousePressEvent( QMouseEvent* );
|
||||
|
||||
//! mouse release event
|
||||
virtual bool mouseReleaseEvent( QMouseEvent* );
|
||||
|
||||
//! mouse move event
|
||||
virtual bool mouseMoveEvent( QMouseEvent* );
|
||||
|
||||
//! drag enter event
|
||||
virtual bool dragEnterEvent( QDragEnterEvent* );
|
||||
|
||||
//! drag move event
|
||||
virtual bool dragMoveEvent( QDragMoveEvent* );
|
||||
|
||||
//! drag leave event
|
||||
virtual bool dragLeaveEvent( QDragLeaveEvent* );
|
||||
|
||||
//! drop event
|
||||
virtual bool dropEvent( QDropEvent* );
|
||||
|
||||
//! timer event
|
||||
virtual void timerEvent( QTimerEvent* );
|
||||
|
||||
//@}
|
||||
|
||||
//!@name rendering methods (called in paintEvent)
|
||||
//@{
|
||||
|
||||
//! window background
|
||||
virtual void renderWindowBackground( QPainter*, const QRect&, const QWidget*, const QPalette& ) const;
|
||||
|
||||
//! window border
|
||||
// this draws a "blue" border around active window
|
||||
virtual void renderWindowBorder( QPainter*, const QRect&, const QWidget*, const QPalette& ) const;
|
||||
|
||||
//! separator
|
||||
virtual void renderSeparator( QPainter*, const QRect&, const QWidget*, const QColor& ) const;
|
||||
|
||||
//! title outline
|
||||
virtual void renderTitleOutline( QPainter*, const QRect&, const QPalette& ) const;
|
||||
|
||||
//! title text
|
||||
/*! second color, if valid, is for contrast pixel */
|
||||
virtual void renderTitleText( QPainter*, const QRect&, const QColor&, const QColor& = QColor() ) const;
|
||||
|
||||
//! title text
|
||||
/*! second color, if valid, is for contrast pixel */
|
||||
virtual void renderTitleText( QPainter*, const QRect&, const QString&, const QColor&, const QColor& = QColor(), bool elide = true ) const;
|
||||
|
||||
//! title text
|
||||
virtual QPixmap renderTitleText( const QRect&, const QString&, const QColor&, bool elide = true ) const;
|
||||
|
||||
//! GroupItem
|
||||
virtual void renderItem( QPainter*, int, const QPalette& );
|
||||
|
||||
//! tabbing target rect
|
||||
virtual void renderTargetRect( QPainter*, const QPalette& );
|
||||
|
||||
//! render corners
|
||||
virtual void renderCorners( QPainter*, const QRect&, const QPalette& ) const;
|
||||
|
||||
//! render float frame
|
||||
virtual void renderFloatFrame( QPainter*, const QRect&, const QPalette& ) const;
|
||||
|
||||
//! render dots
|
||||
virtual void renderDots( QPainter*, const QRect&, const QColor& ) const;
|
||||
|
||||
//@}
|
||||
|
||||
//! close tab matching give button
|
||||
virtual bool closeItem( const Button* );
|
||||
|
||||
//! index of item matching point
|
||||
int tabIndexAt( const QPoint& position, bool between = false ) const
|
||||
{ return _itemData.itemAt( position , between ); }
|
||||
|
||||
//! return pixmap corresponding to a given tab, for dragging
|
||||
QPixmap itemDragPixmap( int, QRect, bool = false );
|
||||
|
||||
//! return true when activity change are animated
|
||||
bool shadowAnimationsEnabled( void ) const
|
||||
{ return ( animationsEnabled() && _configuration->shadowAnimationsEnabled() && !isPreview() ); }
|
||||
|
||||
//! return true when activity change are animated
|
||||
bool titleAnimationsEnabled( void ) const
|
||||
{
|
||||
return
|
||||
animationsEnabled() &&
|
||||
_configuration->titleAnimationsEnabled() &&
|
||||
!_configuration->drawTitleOutline() &&
|
||||
!hideTitleBar() &&
|
||||
!isPreview();
|
||||
}
|
||||
|
||||
//! true if some title outline is rendered
|
||||
bool hasTitleOutline( void ) const
|
||||
{
|
||||
return
|
||||
tabCount() >= 2 ||
|
||||
_itemData.isAnimated() ||
|
||||
( (isActive()||glowIsAnimated()) && _configuration->drawTitleOutline() );
|
||||
}
|
||||
|
||||
//! calculate mask
|
||||
QRegion calcMask( void ) const;
|
||||
|
||||
//! text color
|
||||
QColor titlebarTextColor(const QPalette&) const;
|
||||
|
||||
//! text color
|
||||
QColor titlebarTextColor(const QPalette& palette, bool active) const
|
||||
{
|
||||
return active ?
|
||||
palette.color(QPalette::Active, QPalette::WindowText):
|
||||
helper().inactiveTitleBarTextColor( palette );
|
||||
}
|
||||
|
||||
//! text color
|
||||
QColor titlebarContrastColor(const QPalette& palette ) const
|
||||
{ return titlebarContrastColor( palette.color( widget()->window()->backgroundRole() ) ); }
|
||||
|
||||
//! text color
|
||||
QColor titlebarContrastColor(const QColor& color ) const
|
||||
{ return helper().calcLightColor( color ); }
|
||||
|
||||
//!@name size grip
|
||||
//@{
|
||||
|
||||
//! create size grip
|
||||
void createSizeGrip( void );
|
||||
|
||||
//! delete size grip
|
||||
void deleteSizeGrip( void );
|
||||
|
||||
// size grip
|
||||
bool hasSizeGrip( void ) const
|
||||
{ return (bool)_sizeGrip; }
|
||||
|
||||
//! size grip
|
||||
SizeGrip& sizeGrip( void ) const
|
||||
{ return *_sizeGrip; }
|
||||
|
||||
//@}
|
||||
|
||||
//! remove shadow hint
|
||||
void removeShadowHint( void );
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! set target item to -1
|
||||
void clearTargetItem( void );
|
||||
|
||||
//! clear force active flag
|
||||
void clearForceActive( void )
|
||||
{ if( isActive() ) setForceActive( false ); }
|
||||
|
||||
//! title bounding rects
|
||||
/*! calculate and return title bounding rects in case of tabbed window */
|
||||
void updateItemBoundingRects( bool alsoUpdate = true );
|
||||
|
||||
//! bound one rect to another
|
||||
void boundRectTo( QRect&, const QRect& ) const;
|
||||
|
||||
private Q_SLOTS:
|
||||
void updateCompositing();
|
||||
void updateConfig();
|
||||
|
||||
private:
|
||||
|
||||
//! factory
|
||||
Factory* _factory;
|
||||
|
||||
//! backing store pixmap (when compositing is not active)
|
||||
QPixmap _pixmap;
|
||||
|
||||
//! size grip widget
|
||||
SizeGrip* _sizeGrip;
|
||||
|
||||
//! configuration
|
||||
Factory::ConfigurationPtr _configuration;
|
||||
|
||||
//! glow animation
|
||||
Animation* _glowAnimation;
|
||||
|
||||
//! title animation data
|
||||
TitleAnimationData* _titleAnimationData;
|
||||
|
||||
//! glow intensity
|
||||
qreal _glowIntensity;
|
||||
|
||||
//! true when initialized
|
||||
bool _initialized;
|
||||
|
||||
//! true when decoration is forced active
|
||||
bool _forceActive;
|
||||
|
||||
//! mouse button
|
||||
Qt::MouseButton _mouseButton;
|
||||
|
||||
//! tab bounding rects
|
||||
ClientGroupItemDataList _itemData;
|
||||
|
||||
//! index of tab being dragged if any, -1 otherwise
|
||||
int _sourceItem;
|
||||
|
||||
//! drag start point
|
||||
QPoint _dragPoint;
|
||||
|
||||
//! drag start timer.
|
||||
/*!
|
||||
it is needed to activate animations when this was not done via either
|
||||
dragMoveEvent or dragLeaveEvent
|
||||
*/
|
||||
QBasicTimer _dragStartTimer;
|
||||
|
||||
//! shadow atom
|
||||
xcb_atom_t _shadowAtom;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Oxygen
|
||||
|
||||
//____________________________________________________
|
||||
Qt::Alignment Oxygen::Client::titleAlignment( void ) const
|
||||
{
|
||||
switch( _configuration->titleAlignment() )
|
||||
{
|
||||
case Configuration::AlignLeft: return Qt::AlignLeft;
|
||||
case Configuration::AlignRight: return Qt::AlignRight;
|
||||
|
||||
default:
|
||||
case Configuration::AlignCenter:
|
||||
case Configuration::AlignCenterFullWidth:
|
||||
return Qt::AlignCenter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________
|
||||
int Oxygen::Client::buttonSize( void ) const
|
||||
{
|
||||
switch( _configuration->buttonSize() )
|
||||
{
|
||||
case Configuration::ButtonSmall: return 18;
|
||||
|
||||
default:
|
||||
case Configuration::ButtonDefault: return 20;
|
||||
case Configuration::ButtonLarge: return 24;
|
||||
case Configuration::ButtonVeryLarge: return 32;
|
||||
case Configuration::ButtonHuge: return 48;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________
|
||||
int Oxygen::Client::frameBorder( void ) const
|
||||
{
|
||||
switch( _configuration->frameBorder() )
|
||||
{
|
||||
case Configuration::BorderNone: return 0;
|
||||
case Configuration::BorderNoSide: return 1;
|
||||
|
||||
default:
|
||||
case Configuration::BorderTiny: return 2;
|
||||
case Configuration::BorderDefault: return 4;
|
||||
case Configuration::BorderLarge: return 8;
|
||||
case Configuration::BorderVeryLarge: return 12;
|
||||
case Configuration::BorderHuge: return 18;
|
||||
case Configuration::BorderVeryHuge: return 27;
|
||||
case Configuration::BorderOversized: return 40;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,353 +0,0 @@
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenclientgroupitemdata.cpp
|
||||
// handles tabs' geometry and animations
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenclientgroupitemdata.h"
|
||||
#include "oxygenclientgroupitemdata.moc"
|
||||
#include "oxygenclient.h"
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//____________________________________________________________________________
|
||||
ClientGroupItemDataList::ClientGroupItemDataList( Client* parent ):
|
||||
QObject( parent ),
|
||||
QList<ClientGroupItemData>(),
|
||||
_client( *parent ),
|
||||
_dirty( false ),
|
||||
animationsEnabled_( true ),
|
||||
_animation( new Animation( 150, this ) ),
|
||||
animationType_( AnimationNone ),
|
||||
progress_(0),
|
||||
draggedItem_( NoItem ),
|
||||
targetItem_( NoItem )
|
||||
{
|
||||
|
||||
// setup animation
|
||||
animation().data()->setStartValue( 0 );
|
||||
animation().data()->setEndValue( 1.0 );
|
||||
animation().data()->setTargetObject( this );
|
||||
animation().data()->setPropertyName( "progress" );
|
||||
|
||||
}
|
||||
|
||||
//________________________________________________________________
|
||||
int ClientGroupItemDataList::itemAt( const QPoint& point, bool between ) const
|
||||
{
|
||||
|
||||
for( int i=0; i < count(); i++ )
|
||||
{
|
||||
QRect rect = at(i)._activeRect;
|
||||
if( between ) rect.translate( -rect.width() / 2, 0 );
|
||||
if( rect.adjusted(0,0,0,2).contains( point ) )
|
||||
{ return i; }
|
||||
}
|
||||
|
||||
return NoItem;
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________________________________
|
||||
void ClientGroupItemDataList::animate( AnimationTypes type, int target )
|
||||
{
|
||||
|
||||
// store animation type
|
||||
animationType_ = type;
|
||||
|
||||
if( type == AnimationNone )
|
||||
{
|
||||
|
||||
if( isAnimationRunning() ) animation().data()->stop();
|
||||
targetItem_ = NoItem;
|
||||
draggedItem_ = NoItem;
|
||||
targetRect_ = QRect();
|
||||
|
||||
} else if( type & (AnimationEnter|AnimationMove ) ) {
|
||||
|
||||
// store dragged item
|
||||
bool animate( true );
|
||||
|
||||
if( (type&AnimationSameTarget) && draggedItem_ == NoItem )
|
||||
{
|
||||
|
||||
animate = false;
|
||||
draggedItem_ = target;
|
||||
|
||||
} else if( (type&AnimationMove) && targetItem_ == target ) return;
|
||||
|
||||
// check animation state
|
||||
if( isAnimationRunning() ) animation().data()->stop();
|
||||
|
||||
targetItem_ = target;
|
||||
targetRect_ = QRect();
|
||||
QRect titleRect( _client.titleRect() );
|
||||
int left( titleRect.left() );
|
||||
int width = (type&AnimationSameTarget) ?
|
||||
titleRect.width()/count():
|
||||
titleRect.width()/(count()+1);
|
||||
|
||||
if( (type&AnimationSameTarget) && draggedItem_ < target )
|
||||
{
|
||||
target++;
|
||||
if( target >= count() ) target = NoItem;
|
||||
}
|
||||
|
||||
// loop over items and update bounding rects
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
|
||||
ClientGroupItemData& item( ClientGroupItemDataList::operator[](index) );
|
||||
if( index == target )
|
||||
{
|
||||
targetRect_ = item._refBoundingRect;
|
||||
targetRect_.setLeft( left );
|
||||
targetRect_.setWidth( width );
|
||||
left+=width;
|
||||
}
|
||||
|
||||
item._startBoundingRect = item._boundingRect;
|
||||
item._endBoundingRect = item._refBoundingRect;
|
||||
item._endBoundingRect.setLeft( left );
|
||||
|
||||
if( (type&AnimationSameTarget) && index == draggedItem_ )
|
||||
{
|
||||
|
||||
item._endBoundingRect.setWidth( 0 );
|
||||
|
||||
} else {
|
||||
|
||||
item._endBoundingRect.setWidth( width );
|
||||
left+=width;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( targetRect_.isNull() )
|
||||
{
|
||||
targetRect_ = back()._refBoundingRect;
|
||||
targetRect_.setLeft( left );
|
||||
targetRect_.setWidth( width );
|
||||
}
|
||||
|
||||
if( animate )
|
||||
{
|
||||
|
||||
if( animationsEnabled() ) animation().data()->start();
|
||||
else {
|
||||
|
||||
// change progress to maximum
|
||||
progress_ = 1;
|
||||
updateBoundingRects();
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
ClientGroupItemData& item( ClientGroupItemDataList::operator[](index) );
|
||||
item._boundingRect = item._endBoundingRect;
|
||||
}
|
||||
|
||||
updateButtons( true );
|
||||
|
||||
}
|
||||
|
||||
} else if( type & AnimationLeave ) {
|
||||
|
||||
// stop animation state
|
||||
if( isAnimationRunning() ) animation().data()->stop();
|
||||
|
||||
// reset target
|
||||
targetItem_ = NoItem;
|
||||
targetRect_ = QRect();
|
||||
|
||||
if( type & AnimationSameTarget )
|
||||
{
|
||||
|
||||
// store dragged item
|
||||
draggedItem_ = target;
|
||||
|
||||
// do nothing if only one item
|
||||
if( count() <= 1 ) return;
|
||||
|
||||
QRect titleRect( _client.titleRect() );
|
||||
int left( titleRect.left() );
|
||||
int width = titleRect.width()/(count()-1);
|
||||
|
||||
// loop over items and update bounding rects
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
|
||||
ClientGroupItemData& item( ClientGroupItemDataList::operator[](index) );
|
||||
item._startBoundingRect = item._boundingRect;
|
||||
item._endBoundingRect = item._refBoundingRect;
|
||||
item._endBoundingRect.setLeft( left );
|
||||
if( index != target )
|
||||
{
|
||||
|
||||
if( count() <= 2 )
|
||||
{
|
||||
|
||||
item._endBoundingRect = _client.defaultTitleRect( _client.tabId(index) == _client.currentTabId() );
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
item._endBoundingRect.setWidth( width );
|
||||
left+=width;
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
item._endBoundingRect.setWidth( 0 );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// loop over items and update bounding rects
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
ClientGroupItemData& item( ClientGroupItemDataList::operator[](index) );
|
||||
item._startBoundingRect = item._boundingRect;
|
||||
item._endBoundingRect = item._refBoundingRect;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( animationsEnabled() ) animation().data()->start();
|
||||
else {
|
||||
|
||||
// change progress to maximum
|
||||
progress_ = 1;
|
||||
updateBoundingRects();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________________________________
|
||||
void ClientGroupItemDataList::updateButtonActivity( long visibleItem ) const
|
||||
{
|
||||
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
|
||||
const ClientGroupItemData& item( at(index) );
|
||||
if( item._closeButton )
|
||||
{ item._closeButton.data()->setForceInactive( _client.tabId(index) != visibleItem ); }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________________________________
|
||||
void ClientGroupItemDataList::updateButtons( bool alsoUpdate ) const
|
||||
{
|
||||
|
||||
// move close buttons
|
||||
if( alsoUpdate ) _client.widget()->setUpdatesEnabled( false );
|
||||
for( int index = 0; index < count(); index++ )
|
||||
{
|
||||
|
||||
const ClientGroupItemData& item( at(index) );
|
||||
if( !item._closeButton ) continue;
|
||||
|
||||
if( (!item._boundingRect.isValid()) || ((animationType_ & AnimationSameTarget)&&count()<=2 ) )
|
||||
{
|
||||
|
||||
item._closeButton.data()->hide();
|
||||
|
||||
} else {
|
||||
|
||||
QPoint position(
|
||||
item._boundingRect.right() - _client.buttonSize() - _client.layoutMetric(KCommonDecoration::LM_TitleEdgeRight),
|
||||
item._boundingRect.top() + _client.layoutMetric( KCommonDecoration::LM_TitleEdgeTop ) );
|
||||
|
||||
if( item._closeButton.data()->isHidden() ) item._closeButton.data()->show();
|
||||
item._closeButton.data()->move( position );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( alsoUpdate )
|
||||
{
|
||||
_client.widget()->setUpdatesEnabled( true );
|
||||
_client.updateTitleRect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//____________________________________________________________________________
|
||||
void ClientGroupItemDataList::updateBoundingRects( bool alsoUpdate )
|
||||
{
|
||||
|
||||
qreal ratio( progress() );
|
||||
for( iterator iter = begin(); iter != end(); ++iter )
|
||||
{
|
||||
|
||||
// left
|
||||
if( iter->_endBoundingRect.left() == iter->_startBoundingRect.left() )
|
||||
{
|
||||
|
||||
iter->_boundingRect.setLeft( iter->_startBoundingRect.left() );
|
||||
|
||||
} else {
|
||||
|
||||
iter->_boundingRect.setLeft( (1.0-ratio)*iter->_startBoundingRect.left() + ratio*iter->_endBoundingRect.left() );
|
||||
|
||||
}
|
||||
|
||||
// right
|
||||
if( iter->_endBoundingRect.right() == iter->_startBoundingRect.right() )
|
||||
{
|
||||
|
||||
iter->_boundingRect.setRight( iter->_startBoundingRect.right() );
|
||||
|
||||
} else {
|
||||
|
||||
iter->_boundingRect.setRight( (1.0-ratio)*iter->_startBoundingRect.right() + ratio*iter->_endBoundingRect.right() );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// update button position
|
||||
updateButtons( alsoUpdate );
|
||||
|
||||
}
|
||||
}
|
|
@ -1,223 +0,0 @@
|
|||
#ifndef oxygenclientgroupitemdata_h
|
||||
#define oxygenclientgroupitemdata_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenclientgroupitemdata.h
|
||||
// handles tabs' geometry and animations
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenbutton.h"
|
||||
#include "oxygenanimation.h"
|
||||
|
||||
#include <QList>
|
||||
#include <QPointer>
|
||||
#include <QRect>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class Client;
|
||||
|
||||
//! animation type
|
||||
enum AnimationType {
|
||||
AnimationNone = 0,
|
||||
AnimationEnter = 1<<0,
|
||||
AnimationMove = 1<<1,
|
||||
AnimationLeave = 1<<2,
|
||||
AnimationSameTarget = 1<<3
|
||||
};
|
||||
|
||||
Q_DECLARE_FLAGS(AnimationTypes, AnimationType)
|
||||
|
||||
//! tab data
|
||||
class ClientGroupItemData
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit ClientGroupItemData( void )
|
||||
{}
|
||||
|
||||
//! destructor
|
||||
virtual ~ClientGroupItemData( void )
|
||||
{}
|
||||
|
||||
//! reset all rects to argument
|
||||
void reset( const QRect& rect )
|
||||
{
|
||||
_refBoundingRect = rect;
|
||||
_startBoundingRect = rect;
|
||||
_endBoundingRect = rect;
|
||||
_boundingRect = rect;
|
||||
}
|
||||
|
||||
//! tab active rect
|
||||
QRect _activeRect;
|
||||
|
||||
//! reference bounding rect
|
||||
/*! it is usually identical to activeRect unless there is only one tab in window */
|
||||
QRect _refBoundingRect;
|
||||
|
||||
//! tab drawing rect
|
||||
QRect _startBoundingRect;
|
||||
|
||||
//! tab drawing rect
|
||||
QRect _endBoundingRect;
|
||||
|
||||
//! tab drawing rect
|
||||
QRect _boundingRect;
|
||||
|
||||
//! tab button
|
||||
typedef QPointer<Button> ButtonPointer;
|
||||
ButtonPointer _closeButton;
|
||||
|
||||
};
|
||||
|
||||
class ClientGroupItemDataList: public QObject, public QList<ClientGroupItemData>
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
//! declare animation progress property
|
||||
Q_PROPERTY( qreal progress READ progress WRITE setProgress )
|
||||
|
||||
public:
|
||||
|
||||
//! invalid item index
|
||||
enum { NoItem = -1 };
|
||||
|
||||
//! constructor
|
||||
explicit ClientGroupItemDataList( Client* parent );
|
||||
|
||||
//! dirty state
|
||||
void setDirty( const bool& value )
|
||||
{ _dirty = value; }
|
||||
|
||||
//! dirty state
|
||||
bool isDirty( void ) const
|
||||
{ return _dirty; }
|
||||
|
||||
//! enable animations
|
||||
void setAnimationsEnabled( bool value )
|
||||
{ animationsEnabled_ = value; }
|
||||
|
||||
//! animations enabled
|
||||
bool animationsEnabled( void ) const
|
||||
{ return animationsEnabled_; }
|
||||
|
||||
//! true if being animated
|
||||
bool isAnimated( void ) const
|
||||
{ return animationType_ != AnimationNone; }
|
||||
|
||||
//! animation type
|
||||
AnimationTypes animationType( void ) const
|
||||
{ return animationType_; }
|
||||
|
||||
//! return item index matching QPoint, or -1 if none
|
||||
int itemAt( const QPoint&, bool ) const;
|
||||
|
||||
//! returns true if index is target
|
||||
bool isTarget( int index ) const
|
||||
{ return index == targetItem_; }
|
||||
|
||||
//! start animation
|
||||
/* might need to add the side of the target here */
|
||||
void animate( AnimationTypes, int = NoItem );
|
||||
|
||||
//! true if animation is in progress
|
||||
bool isAnimationRunning( void ) const
|
||||
{ return animation().data()->isRunning(); }
|
||||
|
||||
//! update button activity
|
||||
void updateButtonActivity( long visibleItem ) const;
|
||||
|
||||
//! update buttons
|
||||
void updateButtons( bool alsoUpdate ) const;
|
||||
|
||||
//! target rect
|
||||
const QRect& targetRect( void ) const
|
||||
{ return targetRect_; }
|
||||
|
||||
//!@name animation progress
|
||||
//@{
|
||||
|
||||
//! return animation object
|
||||
virtual const Animation::Pointer& animation() const
|
||||
{ return _animation; }
|
||||
|
||||
void setProgress( qreal value )
|
||||
{
|
||||
if( progress_ == value ) return;
|
||||
progress_ = value;
|
||||
updateBoundingRects();
|
||||
}
|
||||
|
||||
qreal progress( void ) const
|
||||
{ return progress_; }
|
||||
|
||||
//@}
|
||||
|
||||
protected:
|
||||
|
||||
//! update bounding rects
|
||||
void updateBoundingRects( bool alsoUpdate = true );
|
||||
|
||||
private:
|
||||
|
||||
//! client
|
||||
Client& _client;
|
||||
|
||||
//! dirty flag
|
||||
/* used to trigger update at next paintEvent */
|
||||
bool _dirty;
|
||||
|
||||
//! true if animations are enabled
|
||||
bool animationsEnabled_;
|
||||
|
||||
//! animation
|
||||
Animation::Pointer _animation;
|
||||
|
||||
//! last animation type
|
||||
AnimationTypes animationType_;
|
||||
|
||||
//! animation progress
|
||||
qreal progress_;
|
||||
|
||||
//! dragged item
|
||||
int draggedItem_;
|
||||
|
||||
//! target item
|
||||
int targetItem_;
|
||||
|
||||
//! target rect
|
||||
QRect targetRect_;
|
||||
|
||||
};
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Oxygen::AnimationTypes)
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,139 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
|
||||
<kcfg>
|
||||
<kcfgfile name="oxygenrc"/>
|
||||
|
||||
<group name="Windeco">
|
||||
|
||||
<entry name="TitleAlignment" type="Enum">
|
||||
<choices>
|
||||
<choice name="AlignLeft" />
|
||||
<choice name="AlignCenter" />
|
||||
<choice name="AlignCenterFullWidth" />
|
||||
<choice name="AlignRight" />
|
||||
</choices>
|
||||
<default>AlignCenterFullWidth</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ButtonSize" type="Enum">
|
||||
<choices>
|
||||
<choice name="ButtonSmall" />
|
||||
<choice name="ButtonDefault" />
|
||||
<choice name="ButtonLarge" />
|
||||
<choice name="ButtonVeryLarge" />
|
||||
<choice name="ButtonHuge" />
|
||||
</choices>
|
||||
<default>ButtonDefault</default>
|
||||
</entry>
|
||||
|
||||
<entry name="SeparatorMode" type = "Enum">
|
||||
<choices>
|
||||
<choice name="SeparatorNever" />
|
||||
<choice name="SeparatorActive" />
|
||||
<choice name="SeparatorAlways" />
|
||||
</choices>
|
||||
<default>SeparatorNever</default>
|
||||
</entry>
|
||||
|
||||
<entry name="FrameBorder" type = "Enum">
|
||||
<choices>
|
||||
<choice name="BorderNone" />
|
||||
<choice name="BorderNoSide" />
|
||||
<choice name="BorderTiny" />
|
||||
<choice name="BorderDefault" />
|
||||
<choice name="BorderLarge" />
|
||||
<choice name="BorderVeryLarge" />
|
||||
<choice name="BorderHuge" />
|
||||
<choice name="BorderVeryHuge" />
|
||||
<choice name="BorderOversized" />
|
||||
</choices>
|
||||
<default>BorderTiny</default>
|
||||
</entry>
|
||||
|
||||
<entry name="DrawSizeGrip" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="DrawTitleOutline" type = "Bool">
|
||||
<default>false</default>
|
||||
</entry>
|
||||
|
||||
<entry name="HideTitleBar" type = "Bool">
|
||||
<default>false</default>
|
||||
</entry>
|
||||
|
||||
<entry name="UseNarrowButtonSpacing" type = "Bool">
|
||||
<default>false</default>
|
||||
</entry>
|
||||
|
||||
<entry name="CloseWindowFromMenuButton" type = "Bool">
|
||||
<default>false</default>
|
||||
</entry>
|
||||
|
||||
<entry name="UseExtendedWindowBorders" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<!-- maximized windows -->
|
||||
<entry name="DrawBorderOnMaximizedWindows" type = "Bool">
|
||||
<default>false</default>
|
||||
</entry>
|
||||
|
||||
<!-- animations -->
|
||||
<entry name="AnimationsEnabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ButtonAnimationsEnabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="TitleAnimationsEnabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ShadowAnimationsEnabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="TabAnimationsEnabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ButtonAnimationsDuration" type = "Int">
|
||||
<default>150</default>
|
||||
</entry>
|
||||
|
||||
<entry name="TitleAnimationsDuration" type = "Int">
|
||||
<default>150</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ShadowAnimationsDuration" type = "Int">
|
||||
<default>150</default>
|
||||
</entry>
|
||||
|
||||
<entry name="TabAnimationsDuration" type = "Int">
|
||||
<default>150</default>
|
||||
</entry>
|
||||
|
||||
<!-- exceptions -->
|
||||
<entry name="ExceptionType" type="Enum">
|
||||
<choices>
|
||||
<choice name="ExceptionWindowClassName" />
|
||||
<choice name="ExceptionWindowTitle" />
|
||||
</choices>
|
||||
<default>ExceptionWindowClassName</default>
|
||||
</entry>
|
||||
|
||||
<entry name="ExceptionPattern" type = "String"/>
|
||||
|
||||
<entry name="Enabled" type = "Bool">
|
||||
<default>true</default>
|
||||
</entry>
|
||||
|
||||
<entry name="Mask" type = "Int">
|
||||
<default>0</default>
|
||||
</entry>
|
||||
|
||||
</group>
|
||||
</kcfg>
|
|
@ -1,6 +0,0 @@
|
|||
File=oxygenconfigdata.kcfgc
|
||||
ClassName=Configuration
|
||||
NameSpace=Oxygen
|
||||
Singleton=false
|
||||
Mutators=true
|
||||
GlobalEnums=true
|
|
@ -1,217 +0,0 @@
|
|||
/*
|
||||
* Copyright 2013 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
* Copyright 2008 Long Huynh Huu <long.upcase@googlemail.com>
|
||||
* Copyright 2007 Matthew Woehlke <mw_triad@users.sourceforge.net>
|
||||
* Copyright 2007 Casper Boemann <cbr@boemann.dk>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "oxygendecohelper.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <KColorUtils>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//______________________________________________________________________________
|
||||
DecoHelper::DecoHelper(KSharedConfigPtr config):
|
||||
Helper(config)
|
||||
{}
|
||||
|
||||
//______________________________________________________________________________
|
||||
void DecoHelper::invalidateCaches( void )
|
||||
{
|
||||
// base class call
|
||||
Helper::invalidateCaches();
|
||||
|
||||
// local caches
|
||||
_windecoButtonCache.clear();
|
||||
_titleBarTextColorCache.clear();
|
||||
_buttonTextColorCache.clear();
|
||||
|
||||
}
|
||||
|
||||
//______________________________________________________________________________
|
||||
QPixmap DecoHelper::windecoButton(const QColor &color, const QColor& glow, bool sunken, int size)
|
||||
{
|
||||
|
||||
Oxygen::Cache<QPixmap>::Value* cache( _windecoButtonCache.get( color ) );
|
||||
|
||||
const quint64 key( ( colorKey(glow) << 32 ) | (sunken << 23 ) | size );
|
||||
QPixmap *pixmap = cache->object( key );
|
||||
|
||||
if( !pixmap )
|
||||
{
|
||||
pixmap = new QPixmap(size, size);
|
||||
pixmap->fill(Qt::transparent);
|
||||
|
||||
QPainter p( pixmap );
|
||||
p.setRenderHints(QPainter::Antialiasing);
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setWindow( 0, 0, 21, 21 );
|
||||
|
||||
// button shadow
|
||||
if( color.isValid() )
|
||||
{
|
||||
p.save();
|
||||
p.translate( 0, -1.4 );
|
||||
drawShadow( p, calcShadowColor( color ), 21 );
|
||||
p.restore();
|
||||
}
|
||||
|
||||
// button glow
|
||||
if( glow.isValid() )
|
||||
{
|
||||
p.save();
|
||||
p.translate( 0, -1.4 );
|
||||
drawOuterGlow( p, glow, 21 );
|
||||
p.restore();
|
||||
}
|
||||
|
||||
// button slab
|
||||
p.setWindow( 0, 0, 18, 18 );
|
||||
if( color.isValid() )
|
||||
{
|
||||
p.translate( 0, (0.5-0.668) );
|
||||
|
||||
const QColor light( calcLightColor(color) );
|
||||
const QColor dark( calcDarkColor(color) );
|
||||
|
||||
{
|
||||
//plain background
|
||||
QLinearGradient lg( 0, 1.665, 0, (12.33+1.665) );
|
||||
if( sunken )
|
||||
{
|
||||
lg.setColorAt( 1, light );
|
||||
lg.setColorAt( 0, dark );
|
||||
} else {
|
||||
lg.setColorAt( 0, light );
|
||||
lg.setColorAt( 1, dark );
|
||||
}
|
||||
|
||||
const QRectF r( 0.5*(18-12.33), 1.665, 12.33, 12.33 );
|
||||
p.setBrush( lg );
|
||||
p.drawEllipse( r );
|
||||
}
|
||||
|
||||
{
|
||||
// outline circle
|
||||
const qreal penWidth( 0.7 );
|
||||
QLinearGradient lg( 0, 1.665, 0, (2.0*12.33+1.665) );
|
||||
lg.setColorAt( 0, light );
|
||||
lg.setColorAt( 1, dark );
|
||||
const QRectF r( 0.5*(18-12.33+penWidth), (1.665+penWidth), (12.33-penWidth), (12.33-penWidth) );
|
||||
p.setPen( QPen( lg, penWidth ) );
|
||||
p.setBrush( Qt::NoBrush );
|
||||
p.drawEllipse( r );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
p.end();
|
||||
cache->insert( key, pixmap );
|
||||
}
|
||||
|
||||
return *pixmap;
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
QRegion DecoHelper::decoRoundedMask( const QRect& r, int left, int right, int top, int bottom ) const
|
||||
{
|
||||
// get rect geometry
|
||||
int x, y, w, h;
|
||||
r.getRect(&x, &y, &w, &h);
|
||||
|
||||
QRegion mask(x + 3*left, y + 0*top, w-3*(left+right), h-0*(top+bottom));
|
||||
mask += QRegion(x + 0*left, y + 3*top, w-0*(left+right), h-3*(top+bottom));
|
||||
mask += QRegion(x + 1*left, y + 1*top, w-1*(left+right), h-1*(top+bottom));
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
//______________________________________________________________________________
|
||||
const QColor& DecoHelper::inactiveTitleBarTextColor( const QPalette& palette )
|
||||
{
|
||||
|
||||
const quint32 key( colorKey( palette.color(QPalette::Active, QPalette::Window) ) );
|
||||
QColor* out( _titleBarTextColorCache.object( key ) );
|
||||
if( !out )
|
||||
{
|
||||
|
||||
// todo: reimplement cache
|
||||
const QColor ab = palette.color(QPalette::Active, QPalette::Window);
|
||||
const QColor af = palette.color(QPalette::Active, QPalette::WindowText);
|
||||
const QColor nb = palette.color(QPalette::Inactive, QPalette::Window);
|
||||
const QColor nf = palette.color(QPalette::Inactive, QPalette::WindowText);
|
||||
out = new QColor( reduceContrast(nb, nf, qMax(qreal(2.5), KColorUtils::contrastRatio(ab, KColorUtils::mix(ab, af, 0.4)))) );
|
||||
_titleBarTextColorCache.insert( key, out );
|
||||
}
|
||||
|
||||
return *out;
|
||||
}
|
||||
|
||||
|
||||
//______________________________________________________________________________
|
||||
const QColor& DecoHelper::inactiveButtonTextColor( const QPalette& palette )
|
||||
{
|
||||
|
||||
const quint32 key( colorKey( palette.color(QPalette::Active, QPalette::Window) ) );
|
||||
QColor* out( _buttonTextColorCache.object( key ) );
|
||||
if( !out )
|
||||
{
|
||||
|
||||
// todo: reimplement cache
|
||||
const QColor ab = palette.color(QPalette::Active, QPalette::Button);
|
||||
const QColor af = palette.color(QPalette::Active, QPalette::ButtonText);
|
||||
const QColor nb = palette.color(QPalette::Inactive, QPalette::Button);
|
||||
const QColor nf = palette.color(QPalette::Inactive, QPalette::ButtonText);
|
||||
out = new QColor( reduceContrast(nb, nf, qMax(qreal(2.5), KColorUtils::contrastRatio(ab, KColorUtils::mix(ab, af, 0.4)))) );
|
||||
_buttonTextColorCache.insert( key, out );
|
||||
}
|
||||
|
||||
return *out;
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
QColor DecoHelper::reduceContrast(const QColor &c0, const QColor &c1, double t) const
|
||||
{
|
||||
const double s( KColorUtils::contrastRatio(c0, c1) );
|
||||
if( s < t ) return c1;
|
||||
|
||||
double l(0);
|
||||
double h(1.0);
|
||||
double x(s);
|
||||
double a;
|
||||
QColor r( c1 );
|
||||
for (int maxiter = 16; maxiter; --maxiter)
|
||||
{
|
||||
|
||||
a = 0.5 * (l + h);
|
||||
r = KColorUtils::mix(c0, c1, a);
|
||||
x = KColorUtils::contrastRatio(c0, r);
|
||||
|
||||
if ( std::abs(x - t) < 0.01) break;
|
||||
if (x > t) h = a;
|
||||
else l = a;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,83 +0,0 @@
|
|||
#ifndef oxygendecohelper_h
|
||||
#define oxygendecohelper_h
|
||||
|
||||
/*
|
||||
* Copyright 2013 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
* Copyright 2008 Long Huynh Huu <long.upcase@googlemail.com>
|
||||
* Copyright 2007 Matthew Woehlke <mw_triad@users.sourceforge.net>
|
||||
* Copyright 2007 Casper Boemann <cbr@boemann.dk>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "oxygenhelper.h"
|
||||
#include <ksharedconfig.h>
|
||||
|
||||
//! helper class
|
||||
/*! contains utility functions used at multiple places in oxygen style */
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class DecoHelper : public Helper
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit DecoHelper(KSharedConfigPtr config);
|
||||
|
||||
//! destructor
|
||||
virtual ~DecoHelper()
|
||||
{}
|
||||
|
||||
//! reset all caches
|
||||
virtual void invalidateCaches();
|
||||
|
||||
//!@name decoration specific helper functions
|
||||
//!
|
||||
//@{
|
||||
virtual QPixmap windecoButton(const QColor &color, const QColor& glow, bool sunken, int size = 21);
|
||||
//@}
|
||||
|
||||
//
|
||||
virtual QRegion decoRoundedMask( const QRect&, int left = 1, int right = 1, int top = 1, int bottom = 1 ) const;
|
||||
|
||||
//! title bar text color
|
||||
const QColor& inactiveTitleBarTextColor( const QPalette& );
|
||||
|
||||
//! button text color
|
||||
const QColor& inactiveButtonTextColor( const QPalette& );
|
||||
|
||||
protected:
|
||||
|
||||
//! reduce contrast between two colors
|
||||
QColor reduceContrast(const QColor&, const QColor&, double) const;
|
||||
|
||||
private:
|
||||
|
||||
//! windeco buttons
|
||||
Cache<QPixmap> _windecoButtonCache;
|
||||
|
||||
//! titleBar text color cache
|
||||
ColorCache _titleBarTextColorCache;
|
||||
|
||||
//! button text color cache
|
||||
ColorCache _buttonTextColorCache;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __OXYGEN_STYLE_HELPER_H
|
|
@ -1,83 +0,0 @@
|
|||
#ifndef oxygendecorationdefines_h
|
||||
#define oxygendecorationdefines_h
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygendecorationdefines.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfiguration.h"
|
||||
|
||||
#include <QSharedPointer>
|
||||
#include <QList>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//! this should move to some global declaration
|
||||
typedef QSharedPointer<Configuration> ConfigurationPtr;
|
||||
typedef QList<ConfigurationPtr> ConfigurationList;
|
||||
typedef QListIterator<ConfigurationPtr> ConfigurationListIterator;
|
||||
|
||||
//! buttons
|
||||
enum ButtonType {
|
||||
ButtonHelp=0,
|
||||
ButtonMax,
|
||||
ButtonMin,
|
||||
ButtonClose,
|
||||
ButtonMenu,
|
||||
ButtonSticky,
|
||||
ButtonAbove,
|
||||
ButtonBelow,
|
||||
ButtonShade,
|
||||
ButtonApplicationMenu,
|
||||
ButtonTypeCount,
|
||||
|
||||
// Close only one tab
|
||||
ButtonItemClose=100,
|
||||
|
||||
// shows the window menu for one tab
|
||||
ButtonItemMenu
|
||||
|
||||
};
|
||||
|
||||
//! buttons status
|
||||
enum ButtonStatus {
|
||||
Normal = 0,
|
||||
Hovered = 1<<0,
|
||||
Pressed = 1<<1
|
||||
};
|
||||
|
||||
//! exception
|
||||
enum ExceptionMask
|
||||
{
|
||||
None = 0,
|
||||
TitleAlignment = 1<<0,
|
||||
DrawSeparator = 1<<2,
|
||||
TitleOutline = 1<<3,
|
||||
FrameBorder = 1<<4,
|
||||
SizeGripMode = 1<<6
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,104 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionlist.cpp
|
||||
// window decoration exceptions
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenexceptionlist.h"
|
||||
#include "oxygenutil.h"
|
||||
|
||||
#include <QTextStream>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//______________________________________________________________
|
||||
void ExceptionList::readConfig( KSharedConfig::Ptr config )
|
||||
{
|
||||
|
||||
_exceptions.clear();
|
||||
|
||||
QString groupName;
|
||||
for( int index = 0; config->hasGroup( groupName = exceptionGroupName( index ) ); ++index )
|
||||
{
|
||||
|
||||
// create exception
|
||||
Configuration exception;
|
||||
|
||||
// reset group
|
||||
Util::readConfig( &exception, config.data(), groupName );
|
||||
|
||||
// create new configuration
|
||||
ConfigurationPtr configuration( new Configuration() );
|
||||
Util::readConfig( configuration.data(), config.data() );
|
||||
|
||||
// apply changes from exception
|
||||
configuration->setEnabled( exception.enabled() );
|
||||
configuration->setExceptionType( exception.exceptionType() );
|
||||
configuration->setExceptionPattern( exception.exceptionPattern() );
|
||||
configuration->setMask( exception.mask() );
|
||||
|
||||
// propagate all features found in mask to the output configuration
|
||||
if( exception.mask() & FrameBorder ) configuration->setFrameBorder( exception.frameBorder() );
|
||||
if( exception.mask() & DrawSeparator ) configuration->setSeparatorMode( exception.separatorMode() );
|
||||
if( exception.mask() & TitleOutline ) configuration->setDrawTitleOutline( exception.drawTitleOutline() );
|
||||
if( exception.mask() & SizeGripMode ) configuration->setDrawSizeGrip( exception.drawSizeGrip() );
|
||||
configuration->setHideTitleBar( exception.hideTitleBar() );
|
||||
|
||||
// append to exceptions
|
||||
_exceptions.append( configuration );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//______________________________________________________________
|
||||
void ExceptionList::writeConfig( KSharedConfig::Ptr config )
|
||||
{
|
||||
|
||||
// remove all existing exceptions
|
||||
QString groupName;
|
||||
for( int index = 0; config->hasGroup( groupName = exceptionGroupName( index ) ); ++index )
|
||||
{ config->deleteGroup( groupName ); }
|
||||
|
||||
// rewrite current exceptions
|
||||
int index = 0;
|
||||
foreach( const ConfigurationPtr& exception, _exceptions )
|
||||
{
|
||||
|
||||
Util::writeConfig( exception.data(), config.data(), exceptionGroupName( index ) );
|
||||
++index;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________
|
||||
QString ExceptionList::exceptionGroupName( int index )
|
||||
{
|
||||
QString out;
|
||||
QTextStream( &out ) << "Windeco Exception " << index;
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
#ifndef oxygenexceptionlist_h
|
||||
#define oxygenexceptionlist_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygenexceptionlist.h
|
||||
// window decoration exceptions
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "oxygendecorationdefines.h"
|
||||
|
||||
#include <KSharedConfig>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//! oxygen exceptions list
|
||||
class ExceptionList
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! constructor from list
|
||||
explicit ExceptionList( const ConfigurationList& exceptions = ConfigurationList() ):
|
||||
_exceptions( exceptions )
|
||||
{}
|
||||
|
||||
//! exceptions
|
||||
const ConfigurationList& get( void ) const
|
||||
{ return _exceptions; }
|
||||
|
||||
//! read from KConfig
|
||||
void readConfig( KSharedConfig::Ptr );
|
||||
|
||||
//! write to kconfig
|
||||
void writeConfig( KSharedConfig::Ptr );
|
||||
|
||||
protected:
|
||||
|
||||
//! generate exception group name for given exception index
|
||||
static QString exceptionGroupName( int index );
|
||||
|
||||
private:
|
||||
|
||||
//! exceptions
|
||||
ConfigurationList _exceptions;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,204 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygen.cpp
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
// Copyright (c) 2006, 2007 Riccardo Iaconelli <riccardo@kde.org>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenfactory.h"
|
||||
#include "oxygenclient.h"
|
||||
#include "oxygenexceptionlist.h"
|
||||
|
||||
#include <KSharedConfig>
|
||||
#include <KConfigGroup>
|
||||
#include <KWindowInfo>
|
||||
|
||||
KWIN_DECORATION(OxygenPluginFactory, "oxygenclient.json", Oxygen::Factory)
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//___________________________________________________
|
||||
Factory::Factory(QObject *parent):
|
||||
KDecorationFactory(parent),
|
||||
_initialized( false ),
|
||||
_config( KSharedConfig::openConfig( QStringLiteral("oxygenrc") ) ),
|
||||
_helper( _config ),
|
||||
_shadowCache( _helper )
|
||||
{
|
||||
readConfig();
|
||||
setInitialized( true );
|
||||
connect(options(), &KDecorationOptions::colorsChanged, this, [this]() {
|
||||
_shadowCache.invalidateCaches();
|
||||
});
|
||||
connect(options(), &KDecorationOptions::configChanged, this, [this]() {
|
||||
// read in the configuration
|
||||
setInitialized( false );
|
||||
readConfig();
|
||||
setInitialized( true );
|
||||
emit recreateDecorations();
|
||||
});
|
||||
}
|
||||
|
||||
//___________________________________________________
|
||||
Factory::~Factory()
|
||||
{ setInitialized( false ); }
|
||||
|
||||
//___________________________________________________
|
||||
KDecoration* Factory::createDecoration(KDecorationBridge* bridge )
|
||||
{ return (new Client( bridge, this ))->decoration(); }
|
||||
|
||||
//___________________________________________________
|
||||
void Factory::readConfig()
|
||||
{
|
||||
/*
|
||||
always reload helper
|
||||
this is needed to properly handle
|
||||
color contrast settings changed
|
||||
*/
|
||||
_config->reparseConfiguration(); // could be skipped on startup
|
||||
helper().invalidateCaches();
|
||||
helper().loadConfig();
|
||||
|
||||
// initialize default configuration and read
|
||||
if( !_defaultConfiguration ) _defaultConfiguration = ConfigurationPtr(new Configuration());
|
||||
_defaultConfiguration->setCurrentGroup( QStringLiteral("Windeco") );
|
||||
_defaultConfiguration->readConfig();
|
||||
|
||||
// clear exceptions and read
|
||||
ExceptionList exceptions;
|
||||
exceptions.readConfig( _config );
|
||||
_exceptions = exceptions.get();
|
||||
|
||||
// read shadowCache configuration
|
||||
_shadowCache.readConfig();
|
||||
_shadowCache.setAnimationsDuration( _defaultConfiguration->shadowAnimationsDuration() );
|
||||
|
||||
// background pixmap
|
||||
{
|
||||
KConfigGroup group( _config->group("Common") );
|
||||
helper().setBackgroundPixmap( group.readEntry( "BackgroundPixmap", "" ) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________________
|
||||
bool Factory::supports( Ability ability ) const
|
||||
{
|
||||
switch( ability )
|
||||
{
|
||||
|
||||
// announce
|
||||
case AbilityAnnounceButtons:
|
||||
|
||||
// buttons
|
||||
case AbilityButtonMenu:
|
||||
case AbilityButtonApplicationMenu:
|
||||
case AbilityButtonHelp:
|
||||
case AbilityButtonMinimize:
|
||||
case AbilityButtonMaximize:
|
||||
case AbilityButtonClose:
|
||||
case AbilityButtonOnAllDesktops:
|
||||
case AbilityButtonAboveOthers:
|
||||
case AbilityButtonBelowOthers:
|
||||
case AbilityButtonSpacer:
|
||||
case AbilityButtonShade:
|
||||
|
||||
// compositing
|
||||
case AbilityProvidesShadow:
|
||||
return true;
|
||||
|
||||
case AbilityUsesAlphaChannel:
|
||||
case AbilityAnnounceAlphaChannel:
|
||||
return true;
|
||||
|
||||
// tabs
|
||||
case AbilityTabbing:
|
||||
return true;
|
||||
|
||||
// no colors supported at this time
|
||||
default:
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
//____________________________________________________________________
|
||||
Factory::ConfigurationPtr Factory::configuration( const Client& client )
|
||||
{
|
||||
|
||||
QString windowTitle;
|
||||
QString className;
|
||||
foreach( const ConfigurationPtr& configuration, _exceptions )
|
||||
{
|
||||
|
||||
// discard disabled exceptions
|
||||
if( !configuration->enabled() ) continue;
|
||||
|
||||
// discard exceptions with empty exception pattern
|
||||
if( configuration->exceptionPattern().isEmpty() ) continue;
|
||||
|
||||
/*
|
||||
decide which value is to be compared
|
||||
to the regular expression, based on exception type
|
||||
*/
|
||||
QString value;
|
||||
switch( configuration->exceptionType() )
|
||||
{
|
||||
case Configuration::ExceptionWindowTitle:
|
||||
{
|
||||
value = windowTitle.isEmpty() ? (windowTitle = client.caption()):windowTitle;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
case Configuration::ExceptionWindowClassName:
|
||||
{
|
||||
if( className.isEmpty() )
|
||||
{
|
||||
// retrieve class name
|
||||
KWindowInfo info( client.windowId(), 0, NET::WM2WindowClass );
|
||||
QString window_className( QString::fromUtf8(info.windowClassName()) );
|
||||
QString window_class( QString::fromUtf8(info.windowClassClass()) );
|
||||
className = window_className + QStringLiteral(" ") + window_class;
|
||||
}
|
||||
|
||||
value = className;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// check matching
|
||||
if( QRegExp( configuration->exceptionPattern() ).indexIn( value ) >= 0 )
|
||||
{ return configuration; }
|
||||
|
||||
}
|
||||
|
||||
return _defaultConfiguration;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#include "oxygenfactory.moc"
|
|
@ -1,138 +0,0 @@
|
|||
#ifndef oxygenfactory_h
|
||||
#define oxygenfactory_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygen.h
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira <hugo.pereira@free.fr>
|
||||
// Copyright (c) 2006, 2007 Riccardo Iaconelli <ruphy@fsfe.org>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenconfiguration.h"
|
||||
#include "oxygendecorationdefines.h"
|
||||
#include "oxygendecohelper.h"
|
||||
#include "oxygenshadowcache.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <kdecorationfactory.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class Client;
|
||||
|
||||
enum {
|
||||
|
||||
//! this is the top title bar edge
|
||||
TFRAMESIZE = 3,
|
||||
|
||||
/*!
|
||||
this is the extra title bar top and bottom edges
|
||||
needed to outline active window title bar
|
||||
*/
|
||||
HFRAMESIZE = 4
|
||||
};
|
||||
|
||||
//! window decoration factory
|
||||
class Factory: public KDecorationFactory
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit Factory(QObject *parent = nullptr);
|
||||
|
||||
//! destructor
|
||||
virtual ~Factory();
|
||||
|
||||
//! create decoration
|
||||
virtual KDecoration *createDecoration(KDecorationBridge *b);
|
||||
|
||||
//! configuration capabilities
|
||||
virtual bool supports( Ability ability ) const;
|
||||
|
||||
//! true if initialized
|
||||
virtual bool initialized()
|
||||
{ return _initialized; }
|
||||
|
||||
//! helper
|
||||
virtual DecoHelper& helper( void )
|
||||
{ return _helper; }
|
||||
|
||||
//! shadow cache
|
||||
virtual ShadowCache& shadowCache( void )
|
||||
{ return _shadowCache; }
|
||||
|
||||
//! shadow cache
|
||||
virtual const ShadowCache& shadowCache( void ) const
|
||||
{ return _shadowCache; }
|
||||
|
||||
//! pointer to configuration
|
||||
typedef QSharedPointer<Configuration> ConfigurationPtr;
|
||||
|
||||
//! get configuration for a give client
|
||||
virtual ConfigurationPtr configuration( const Client& );
|
||||
|
||||
protected:
|
||||
|
||||
//! read configuration from KConfig
|
||||
void readConfig();
|
||||
|
||||
//! initialization
|
||||
void setInitialized( bool value )
|
||||
{ _initialized = value; }
|
||||
|
||||
//! exception group name
|
||||
QString exceptionGroupName( int index ) const
|
||||
{
|
||||
QString out;
|
||||
QTextStream( &out ) << "Windeco Exception " << index;
|
||||
return out;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
//! initialization flag
|
||||
bool _initialized;
|
||||
|
||||
//! config object
|
||||
KSharedConfigPtr _config;
|
||||
|
||||
//! helper
|
||||
DecoHelper _helper;
|
||||
|
||||
//! shadow cache
|
||||
ShadowCache _shadowCache;
|
||||
|
||||
//! default configuration
|
||||
ConfigurationPtr _defaultConfiguration;
|
||||
|
||||
//! list of exceptiosn
|
||||
QList<ConfigurationPtr> _exceptions;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,238 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygensizegrip.cpp
|
||||
// bottom right size grip for borderless windows
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "oxygensizegrip.h"
|
||||
#include "oxygenbutton.h"
|
||||
#include "oxygenclient.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <QPainter>
|
||||
#include <QPolygon>
|
||||
#include <QTimer>
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
//_____________________________________________
|
||||
SizeGrip::SizeGrip( Client* client ):
|
||||
QWidget(0),
|
||||
_client( client )
|
||||
{
|
||||
|
||||
setAttribute(Qt::WA_NoSystemBackground );
|
||||
setAutoFillBackground( false );
|
||||
|
||||
// cursor
|
||||
setCursor( Qt::SizeFDiagCursor );
|
||||
|
||||
// size
|
||||
setFixedSize( QSize( GRIP_SIZE, GRIP_SIZE ) );
|
||||
|
||||
// mask
|
||||
QPolygon p;
|
||||
p << QPoint( 0, GRIP_SIZE )
|
||||
<< QPoint( GRIP_SIZE, 0 )
|
||||
<< QPoint( GRIP_SIZE, GRIP_SIZE )
|
||||
<< QPoint( 0, GRIP_SIZE );
|
||||
|
||||
setMask( QRegion( p ) );
|
||||
|
||||
// embed
|
||||
embed();
|
||||
updatePosition();
|
||||
|
||||
// event filter
|
||||
client->widget()->installEventFilter( this );
|
||||
|
||||
// show
|
||||
show();
|
||||
|
||||
}
|
||||
|
||||
//_____________________________________________
|
||||
SizeGrip::~SizeGrip( void )
|
||||
{}
|
||||
|
||||
//_____________________________________________
|
||||
void SizeGrip::activeChange( void )
|
||||
{
|
||||
static const uint32_t value = XCB_STACK_MODE_ABOVE;
|
||||
xcb_configure_window( _client->helper().xcbConnection(), winId(), XCB_CONFIG_WINDOW_STACK_MODE, &value );
|
||||
xcb_map_window( _client->helper().xcbConnection(), winId() );
|
||||
}
|
||||
|
||||
//_____________________________________________
|
||||
void SizeGrip::embed( void )
|
||||
{
|
||||
xcb_window_t window_id = _client->windowId();
|
||||
if( _client->isPreview() ) {
|
||||
|
||||
setParent( _client->widget() );
|
||||
|
||||
} else if( window_id ) {
|
||||
|
||||
xcb_window_t current = window_id;
|
||||
xcb_connection_t* connection = _client->helper().xcbConnection();
|
||||
while( true )
|
||||
{
|
||||
xcb_query_tree_cookie_t cookie = xcb_query_tree_unchecked( connection, current );
|
||||
Helper::ScopedPointer<xcb_query_tree_reply_t> tree(xcb_query_tree_reply( connection, cookie, nullptr ) );
|
||||
if (tree.isNull()) break;
|
||||
|
||||
if (tree->parent && tree->parent != tree->root && tree->parent != current) current = tree->parent;
|
||||
else break;
|
||||
}
|
||||
|
||||
// reparent
|
||||
xcb_reparent_window( connection, winId(), current, 0, 0 );
|
||||
|
||||
} else {
|
||||
|
||||
hide();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//_____________________________________________
|
||||
bool SizeGrip::eventFilter( QObject*, QEvent* event )
|
||||
{
|
||||
|
||||
if ( event->type() == QEvent::Resize) updatePosition();
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
//_____________________________________________
|
||||
void SizeGrip::paintEvent( QPaintEvent* )
|
||||
{
|
||||
|
||||
// get relevant colors
|
||||
QColor base( _client->backgroundColor( this, palette(), _client->isActive() ) );
|
||||
QColor light( _client->helper().calcDarkColor( base ) );
|
||||
QColor dark( _client->helper().calcDarkColor( base.darker(150) ) );
|
||||
|
||||
// create and configure painter
|
||||
QPainter painter(this);
|
||||
painter.setRenderHints(QPainter::Antialiasing );
|
||||
|
||||
painter.setPen( Qt::NoPen );
|
||||
painter.setBrush( base );
|
||||
|
||||
// polygon
|
||||
QPolygon p;
|
||||
p << QPoint( 0, GRIP_SIZE )
|
||||
<< QPoint( GRIP_SIZE, 0 )
|
||||
<< QPoint( GRIP_SIZE, GRIP_SIZE )
|
||||
<< QPoint( 0, GRIP_SIZE );
|
||||
painter.drawPolygon( p );
|
||||
|
||||
// diagonal border
|
||||
painter.setBrush( Qt::NoBrush );
|
||||
painter.setPen( QPen( dark, 3 ) );
|
||||
painter.drawLine( QPoint( 0, GRIP_SIZE ), QPoint( GRIP_SIZE, 0 ) );
|
||||
|
||||
// side borders
|
||||
painter.setPen( QPen( light, 1.5 ) );
|
||||
painter.drawLine( QPoint( 1, GRIP_SIZE ), QPoint( GRIP_SIZE, GRIP_SIZE ) );
|
||||
painter.drawLine( QPoint( GRIP_SIZE, 1 ), QPoint( GRIP_SIZE, GRIP_SIZE ) );
|
||||
painter.end();
|
||||
|
||||
}
|
||||
|
||||
//_____________________________________________
|
||||
void SizeGrip::mousePressEvent( QMouseEvent* event )
|
||||
{
|
||||
|
||||
switch (event->button())
|
||||
{
|
||||
|
||||
case Qt::RightButton:
|
||||
{
|
||||
hide();
|
||||
QTimer::singleShot(5000, this, SLOT(show()));
|
||||
break;
|
||||
}
|
||||
|
||||
case Qt::MidButton:
|
||||
{
|
||||
hide();
|
||||
break;
|
||||
}
|
||||
|
||||
case Qt::LeftButton:
|
||||
if( rect().contains( event->pos() ) )
|
||||
{
|
||||
|
||||
// check client window id
|
||||
if( !_client->windowId() ) break;
|
||||
_client->widget()->setFocus();
|
||||
if( _client->decoration() )
|
||||
{ _client->decoration()->performWindowOperation( KDecorationDefines::ResizeOp ); }
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_______________________________________________________________________________
|
||||
void SizeGrip::updatePosition( void )
|
||||
{
|
||||
|
||||
QPoint position(
|
||||
_client->width() - GRIP_SIZE - OFFSET,
|
||||
_client->height() - GRIP_SIZE - OFFSET );
|
||||
|
||||
if( _client->isPreview() )
|
||||
{
|
||||
|
||||
position -= QPoint(
|
||||
_client->layoutMetric( Client::LM_BorderRight )+
|
||||
_client->layoutMetric( Client::LM_OuterPaddingRight ),
|
||||
_client->layoutMetric( Client::LM_OuterPaddingBottom )+
|
||||
_client->layoutMetric( Client::LM_BorderBottom )
|
||||
);
|
||||
|
||||
} else {
|
||||
|
||||
position -= QPoint(
|
||||
_client->layoutMetric( Client::LM_BorderRight ),
|
||||
_client->layoutMetric( Client::LM_BorderBottom ) );
|
||||
}
|
||||
|
||||
move( position );
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
#ifndef oxygensizegrip_h
|
||||
#define oxygensizegrip_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygensizegrip.h
|
||||
// bottom right size grip for borderless windows
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPaintEvent>
|
||||
#include <QMouseEvent>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class Client;
|
||||
|
||||
//! implements size grip for all widgets
|
||||
class SizeGrip: public QWidget
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
explicit SizeGrip( Client* );
|
||||
|
||||
//! constructor
|
||||
virtual ~SizeGrip( void );
|
||||
|
||||
//! event filter
|
||||
virtual bool eventFilter( QObject*, QEvent* );
|
||||
|
||||
public Q_SLOTS:
|
||||
|
||||
//! update background color
|
||||
void activeChange( void );
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
||||
//! embed into parent widget
|
||||
void embed( void );
|
||||
|
||||
protected:
|
||||
|
||||
//!@name event handlers
|
||||
//@{
|
||||
|
||||
//! paint
|
||||
virtual void paintEvent( QPaintEvent* );
|
||||
|
||||
//! mouse press
|
||||
virtual void mousePressEvent( QMouseEvent* );
|
||||
|
||||
//@}
|
||||
|
||||
//! client
|
||||
Client& client( void ) const
|
||||
{ return *_client; }
|
||||
|
||||
//! update position
|
||||
void updatePosition( void );
|
||||
|
||||
private:
|
||||
|
||||
//! grip size
|
||||
enum {
|
||||
OFFSET = 0,
|
||||
GRIP_SIZE = 14
|
||||
};
|
||||
|
||||
// oxygen client
|
||||
Client* _client;
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,152 +0,0 @@
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygentitleanimationdata.h
|
||||
// handles transition when window title is changed
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygentitleanimationdata.h"
|
||||
#include "oxygentitleanimationdata.moc"
|
||||
|
||||
#include <QPainter>
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
// use 300 milliseconds for animation lock
|
||||
const int TitleAnimationData::_lockTime = 300;
|
||||
|
||||
//_________________________________________________________
|
||||
TitleAnimationData::TitleAnimationData( QObject* parent ):
|
||||
QObject( parent ),
|
||||
_dirty( false ),
|
||||
_animation( new Animation( 200, this ) ),
|
||||
_opacity(0)
|
||||
{}
|
||||
|
||||
//_________________________________________________________
|
||||
void TitleAnimationData::initialize( void )
|
||||
{
|
||||
|
||||
// setup title animation
|
||||
animation().data()->setStartValue( 0 );
|
||||
animation().data()->setEndValue( 1 );
|
||||
animation().data()->setTargetObject( this );
|
||||
animation().data()->setPropertyName( "opacity" );
|
||||
animation().data()->setEasingCurve( QEasingCurve::InOutQuad );
|
||||
|
||||
}
|
||||
|
||||
|
||||
//_________________________________________________________
|
||||
void TitleAnimationData::setPixmaps( QRect rect, QPixmap pixmap, QPixmap contrast )
|
||||
{
|
||||
|
||||
// stop animation
|
||||
if( isAnimated() ) animation().data()->stop();
|
||||
|
||||
// update pixmaps
|
||||
_contrastPixmap.initialize( rect, contrast );
|
||||
_pixmap.initialize( rect, pixmap );
|
||||
|
||||
setOpacity(0);
|
||||
updatePixmaps();
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void TitleAnimationData::updatePixmaps( void )
|
||||
{
|
||||
_contrastPixmap.blend( opacity() );
|
||||
_pixmap.blend( opacity() );
|
||||
emit pixmapsChanged();
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void TitleAnimationData::timerEvent( QTimerEvent* e )
|
||||
{
|
||||
|
||||
if( e->timerId() != _animationLockTimer.timerId() )
|
||||
{ return QObject::timerEvent( e ); }
|
||||
|
||||
// unlock
|
||||
unlockAnimations();
|
||||
|
||||
if( !isAnimated() )
|
||||
{
|
||||
// triggers pixmap updates
|
||||
reset();
|
||||
emit pixmapsChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
void TitleAnimationData::BlendedPixmap::blend( qreal opacity )
|
||||
{
|
||||
|
||||
_currentPixmap = QPixmap( _endRect.size() );
|
||||
_currentPixmap.fill( Qt::transparent );
|
||||
|
||||
QPainter painter( &_currentPixmap );
|
||||
if( opacity < 1 && !_startPixmap.isNull() )
|
||||
{ painter.drawPixmap( _startRect.topLeft() - _endRect.topLeft(), fade( _startPixmap, 1.0 - opacity ) ); }
|
||||
|
||||
if( opacity > 0 && !_endPixmap.isNull() )
|
||||
{ painter.drawPixmap( QPoint(0,0), fade( _endPixmap, opacity ) ); }
|
||||
|
||||
painter.end();
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
//_________________________________________________________
|
||||
QPixmap TitleAnimationData::BlendedPixmap::fade( QPixmap source, qreal opacity ) const
|
||||
{
|
||||
|
||||
if( source.isNull() ) return QPixmap();
|
||||
|
||||
QPixmap out( source.size() );
|
||||
out.fill( Qt::transparent );
|
||||
|
||||
// do nothing if opacity is too small
|
||||
if( opacity*255 < 1 ) return out;
|
||||
|
||||
// draw pixmap
|
||||
QPainter p( &out );
|
||||
p.drawPixmap( QPoint(0,0), source );
|
||||
|
||||
// opacity mask
|
||||
if( opacity*255 <= 254 )
|
||||
{
|
||||
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
|
||||
QColor color( Qt::black );
|
||||
color.setAlphaF( opacity );
|
||||
p.fillRect(out.rect(), color );
|
||||
}
|
||||
|
||||
p.end();
|
||||
return out;
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,258 +0,0 @@
|
|||
#ifndef oxygentitleanimationdata_h
|
||||
#define oxygentitleanimationdata_h
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// oxygentitleanimationdata.h
|
||||
// handles transition when window title is changed
|
||||
// -------------------
|
||||
//
|
||||
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "oxygenanimation.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <QObject>
|
||||
#include <QPointer>
|
||||
#include <QBasicTimer>
|
||||
#include <QTimerEvent>
|
||||
#include <QPixmap>
|
||||
|
||||
|
||||
namespace Oxygen
|
||||
{
|
||||
|
||||
class TitleAnimationData: public QObject
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
//! declare title opacity
|
||||
Q_PROPERTY( qreal opacity READ opacity WRITE setOpacity )
|
||||
|
||||
public:
|
||||
|
||||
typedef QPointer<TitleAnimationData> Pointer;
|
||||
|
||||
//! constructor
|
||||
explicit TitleAnimationData( QObject* );
|
||||
|
||||
//! reset
|
||||
void reset( void )
|
||||
{
|
||||
setOpacity(0);
|
||||
_contrastPixmap.reset();
|
||||
_pixmap.reset();
|
||||
}
|
||||
|
||||
//! initialize
|
||||
void initialize( void );
|
||||
|
||||
// reset
|
||||
void reset( QRect rect, QPixmap pixmap, QPixmap contrast )
|
||||
{
|
||||
setOpacity(0);
|
||||
_contrastPixmap.reset( rect, contrast );
|
||||
_pixmap.reset( rect, pixmap );
|
||||
}
|
||||
|
||||
//! set pixmaps
|
||||
void setPixmaps( QRect, QPixmap pixmap, QPixmap contrast );
|
||||
|
||||
//! duration
|
||||
void setDuration( int duration )
|
||||
{
|
||||
assert( animation() );
|
||||
animation().data()->setDuration( duration );
|
||||
}
|
||||
|
||||
//! retrieve contrast pixmap
|
||||
QPixmap contrastPixmap( void ) const
|
||||
{ return _contrastPixmap.currentPixmap(); }
|
||||
|
||||
//! pixmap
|
||||
QPixmap pixmap( void ) const
|
||||
{ return _pixmap.currentPixmap(); }
|
||||
|
||||
//!@name animation
|
||||
//@{
|
||||
|
||||
//! returns true if animations are locked
|
||||
bool isLocked( void ) const
|
||||
{ return _animationLockTimer.isActive(); }
|
||||
|
||||
//! returns true if title transition animation is currently running
|
||||
bool isAnimated( void ) const
|
||||
{ return animation().data()->isRunning(); }
|
||||
|
||||
//! start lock animation timer
|
||||
void lockAnimations( void )
|
||||
{ _animationLockTimer.start( _lockTime, this ); }
|
||||
|
||||
//! start lock animation timer
|
||||
void unlockAnimations( void )
|
||||
{ _animationLockTimer.stop(); }
|
||||
|
||||
//! start title transition animation
|
||||
void startAnimation( void )
|
||||
{
|
||||
assert( !isAnimated() );
|
||||
animation().data()->start();
|
||||
}
|
||||
|
||||
//! finish title transition animation
|
||||
void finishAnimation( void )
|
||||
{
|
||||
assert( isAnimated() );
|
||||
animation().data()->stop();
|
||||
}
|
||||
|
||||
//@}
|
||||
|
||||
//!@name opacity
|
||||
//@{
|
||||
|
||||
qreal opacity( void ) const
|
||||
{ return _opacity; }
|
||||
|
||||
void setOpacity( qreal value )
|
||||
{
|
||||
if( _opacity == value ) return;
|
||||
_opacity = value;
|
||||
updatePixmaps();
|
||||
}
|
||||
|
||||
//@}
|
||||
|
||||
//! validity
|
||||
bool isValid( void ) const
|
||||
{ return _pixmap.isValid(); }
|
||||
|
||||
//! dirty flag
|
||||
void setDirty( bool value )
|
||||
{ _dirty = value; }
|
||||
|
||||
//! dirty flag
|
||||
bool isDirty( void ) const
|
||||
{ return _dirty; }
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
void pixmapsChanged( void );
|
||||
|
||||
protected:
|
||||
|
||||
//! update pixmaps
|
||||
virtual void updatePixmaps( void );
|
||||
|
||||
//! timer event
|
||||
void timerEvent( QTimerEvent* );
|
||||
|
||||
//! animation object
|
||||
const Animation::Pointer& animation( void ) const
|
||||
{ return _animation; }
|
||||
|
||||
private:
|
||||
|
||||
//! used to blend pixmap
|
||||
class BlendedPixmap
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
// reset everything
|
||||
void reset( void )
|
||||
{
|
||||
_startRect = _endRect = QRect();
|
||||
_startPixmap = _endPixmap = _currentPixmap = QPixmap();
|
||||
}
|
||||
|
||||
//! reset
|
||||
void reset( const QRect& rect, QPixmap pixmap )
|
||||
{
|
||||
_startRect = _endRect = rect;
|
||||
_startPixmap = _endPixmap = _currentPixmap = pixmap;
|
||||
}
|
||||
|
||||
// update pixmaps
|
||||
void initialize( const QRect& rect, QPixmap pixmap )
|
||||
{
|
||||
_startRect = _endRect;
|
||||
_endRect = rect;
|
||||
_startPixmap = _currentPixmap;
|
||||
_endPixmap = pixmap;
|
||||
}
|
||||
|
||||
//! update currentPixmap by blending start and end pixmap
|
||||
void blend( qreal opacity );
|
||||
|
||||
//! current pixmap
|
||||
QPixmap currentPixmap( void ) const
|
||||
{ return _currentPixmap; }
|
||||
|
||||
//! validity
|
||||
bool isValid( void ) const
|
||||
{ return !(_endRect.isNull() || _endPixmap.isNull() ); }
|
||||
|
||||
protected:
|
||||
|
||||
// fade pixmap by some amount
|
||||
QPixmap fade( QPixmap, qreal ) const;
|
||||
|
||||
private:
|
||||
|
||||
//! animation starting pixmap
|
||||
QPixmap _startPixmap;
|
||||
|
||||
//! animation ending pixmap
|
||||
QPixmap _endPixmap;
|
||||
|
||||
//! animation current pixmap
|
||||
QPixmap _currentPixmap;
|
||||
|
||||
QRect _startRect;
|
||||
QRect _endRect;
|
||||
|
||||
};
|
||||
|
||||
bool _dirty;
|
||||
|
||||
BlendedPixmap _contrastPixmap;
|
||||
BlendedPixmap _pixmap;
|
||||
|
||||
//! lock time (milliseconds
|
||||
static const int _lockTime;
|
||||
|
||||
//! timer used to disable animations when triggered too early
|
||||
QBasicTimer _animationLockTimer;
|
||||
|
||||
//! title animation
|
||||
Animation::Pointer _animation;
|
||||
|
||||
//! title opacity
|
||||
qreal _opacity;
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue