| @@ -0,0 +1,72 @@ | |||
| /* | |||
| * Carla Qt4 Style, based on Qt5 fusion style | |||
| * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies) | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the GPL3.txt file | |||
| */ | |||
| #ifndef __CARLA_STYLE_HPP__ | |||
| #define __CARLA_STYLE_HPP__ | |||
| #include <QtGui/QCommonStyle> | |||
| #include <QtGui/QStylePlugin> | |||
| class CarlaStylePrivate; | |||
| class CarlaStyle : public QCommonStyle | |||
| { | |||
| Q_OBJECT | |||
| public: | |||
| CarlaStyle(); | |||
| ~CarlaStyle(); | |||
| QPalette standardPalette() const; | |||
| void drawPrimitive(PrimitiveElement elem, | |||
| const QStyleOption *option, | |||
| QPainter *painter, const QWidget *widget = 0) const; | |||
| void drawControl(ControlElement ce, const QStyleOption *option, QPainter *painter, | |||
| const QWidget *widget) const; | |||
| int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const; | |||
| void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, | |||
| QPainter *painter, const QWidget *widget) const; | |||
| QRect subElementRect(SubElement r, const QStyleOption *opt, const QWidget *widget = 0) const; | |||
| QSize sizeFromContents(ContentsType type, const QStyleOption *option, | |||
| const QSize &size, const QWidget *widget) const; | |||
| QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, | |||
| SubControl sc, const QWidget *widget) const; | |||
| int styleHint(StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0, | |||
| QStyleHintReturn *returnData = 0) const; | |||
| void drawItemText(QPainter *painter, const QRect &rect, | |||
| int flags, const QPalette &pal, bool enabled, | |||
| const QString &text, QPalette::ColorRole textRole = QPalette::NoRole) const; | |||
| void polish(QWidget *widget); | |||
| void unpolish(QWidget *widget); | |||
| private: | |||
| CarlaStylePrivate* const d; | |||
| friend class CarlaStylePrivate; | |||
| }; | |||
| class CarlaStylePlugin : public QStylePlugin | |||
| { | |||
| Q_OBJECT | |||
| public: | |||
| CarlaStylePlugin(QObject* parent = nullptr); | |||
| QStyle* create(const QString& key); | |||
| QStringList keys() const; | |||
| }; | |||
| #endif // __CARLA_STYLE_HPP__ | |||
| @@ -0,0 +1,177 @@ | |||
| /* | |||
| * Carla Qt4 Style, based on Qt5 fusion style | |||
| * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies) | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the GPL3.txt file | |||
| */ | |||
| #ifndef __CARLA_STYLE_ANIMATIONS_HPP__ | |||
| #define __CARLA_STYLE_ANIMATIONS_HPP__ | |||
| #include <QtCore/QAbstractAnimation> | |||
| #include <QtCore/QCoreApplication> | |||
| #include <QtCore/QDateTime> | |||
| #include <QtGui/QImage> | |||
| #include <QtGui/QWidget> | |||
| class CarlaStyleAnimation : public QAbstractAnimation | |||
| { | |||
| Q_OBJECT | |||
| public: | |||
| CarlaStyleAnimation(QObject* target) | |||
| : QAbstractAnimation(), | |||
| _delay(0), | |||
| _duration(-1), | |||
| _startTime(QTime::currentTime()) | |||
| { | |||
| if (target != nullptr) | |||
| { | |||
| moveToThread(target->thread()); | |||
| setParent(target); | |||
| } | |||
| connect(this, SIGNAL(finished()), SLOT(deleteLater())); | |||
| } | |||
| virtual ~CarlaStyleAnimation() | |||
| { | |||
| } | |||
| QObject* target() const | |||
| { | |||
| return parent(); | |||
| } | |||
| int duration() const | |||
| { | |||
| return _duration; | |||
| } | |||
| void setDuration(int duration) | |||
| { | |||
| _duration = duration; | |||
| } | |||
| int delay() const | |||
| { | |||
| return _delay; | |||
| } | |||
| void setDelay(int delay) | |||
| { | |||
| _delay = delay; | |||
| } | |||
| QTime startTime() const | |||
| { | |||
| return _startTime; | |||
| } | |||
| void setStartTime(const QTime& time) | |||
| { | |||
| _startTime = time; | |||
| } | |||
| void updateTarget() | |||
| { | |||
| QEvent event(QEvent::HoverEnter); | |||
| QCoreApplication::sendEvent(target(), &event); | |||
| } | |||
| protected: | |||
| virtual bool isUpdateNeeded() const | |||
| { | |||
| return currentTime() > _delay; | |||
| } | |||
| virtual void updateCurrentTime(int /*time*/) | |||
| { | |||
| if (QObject* tgt = target()) | |||
| { | |||
| if (tgt->isWidgetType()) | |||
| { | |||
| QWidget* widget = static_cast<QWidget*>(tgt); | |||
| if (widget->window()->isMinimized() || ! widget->isVisible()) | |||
| stop(); | |||
| } | |||
| if (isUpdateNeeded()) | |||
| updateTarget(); | |||
| } | |||
| } | |||
| private: | |||
| int _delay; | |||
| int _duration; | |||
| QTime _startTime; | |||
| }; | |||
| class CarlaProgressStyleAnimation : public CarlaStyleAnimation | |||
| { | |||
| Q_OBJECT | |||
| public: | |||
| CarlaProgressStyleAnimation(int speed, QObject* target) | |||
| : CarlaStyleAnimation(target), | |||
| _speed(speed), | |||
| _step(-1) | |||
| { | |||
| } | |||
| int animationStep() const | |||
| { | |||
| return currentTime() / (1000.0 / _speed); | |||
| } | |||
| int progressStep(int width) const | |||
| { | |||
| int step = animationStep(); | |||
| int progress = (step * width / _speed) % width; | |||
| if (((step * width / _speed) % (2 * width)) >= width) | |||
| progress = width - progress; | |||
| return progress; | |||
| } | |||
| int speed() const | |||
| { | |||
| return _speed; | |||
| } | |||
| void setSpeed(int speed) | |||
| { | |||
| _speed = speed; | |||
| } | |||
| protected: | |||
| bool isUpdateNeeded() const | |||
| { | |||
| if (CarlaStyleAnimation::isUpdateNeeded()) | |||
| { | |||
| int current = animationStep(); | |||
| if (_step == -1 || _step != current) | |||
| { | |||
| _step = current; | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| private: | |||
| int _speed; | |||
| mutable int _step; | |||
| }; | |||
| #endif // __CARLA_STYLE_ANIMATIONS_HPP__ | |||
| @@ -0,0 +1,160 @@ | |||
| /* | |||
| * Carla Qt4 Style, based on Qt5 fusion style | |||
| * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies) | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the GPL3.txt file | |||
| */ | |||
| #ifndef __CARLA_STYLE_PRIVATE_HPP__ | |||
| #define __CARLA_STYLE_PRIVATE_HPP__ | |||
| #include "CarlaStyle.hpp" | |||
| #include "CarlaStyleAnimations.hpp" | |||
| #include <QtCore/QHash> | |||
| class QStyleAnimation; | |||
| class CarlaStylePrivate : public QObject | |||
| { | |||
| Q_OBJECT | |||
| public: | |||
| enum { | |||
| menuItemHMargin = 3, // menu item hor text margin | |||
| menuArrowHMargin = 6, // menu arrow horizontal margin | |||
| menuRightBorder = 15, // right border on menus | |||
| menuCheckMarkWidth = 12 // checkmarks width on menus | |||
| }; | |||
| CarlaStylePrivate(CarlaStyle* const style) | |||
| : kStyle(style), | |||
| fAnimationFps(60) | |||
| { | |||
| } | |||
| ~CarlaStylePrivate() | |||
| { | |||
| qDeleteAll(fAnimations); | |||
| } | |||
| int animationFps() const | |||
| { | |||
| return fAnimationFps; | |||
| } | |||
| // Used for grip handles | |||
| QColor lightShade() const | |||
| { | |||
| return QColor(102, 102, 102, 90); | |||
| } | |||
| QColor darkShade() const | |||
| { | |||
| return QColor(0, 0, 0, 60); | |||
| } | |||
| QColor topShadow() const | |||
| { | |||
| return QColor(0, 0, 0, 18); | |||
| } | |||
| QColor innerContrastLine() const | |||
| { | |||
| return QColor(255, 255, 255, 30); | |||
| } | |||
| QColor highlight(const QPalette& pal) const | |||
| { | |||
| return pal.color(QPalette::Active, QPalette::Highlight); | |||
| } | |||
| QColor highlightedText(const QPalette& pal) const | |||
| { | |||
| return pal.color(QPalette::Active, QPalette::HighlightedText); | |||
| } | |||
| QColor outline(const QPalette& pal) const | |||
| { | |||
| if (! pal.window().texture().isNull()) | |||
| return QColor(0, 0, 0, 160); | |||
| return pal.background().color().darker(140); | |||
| } | |||
| QColor highlightedOutline(const QPalette &pal) const | |||
| { | |||
| QColor highlightedOutline = highlight(pal).darker(125); | |||
| if (highlightedOutline.value() > 160) | |||
| highlightedOutline.setHsl(highlightedOutline.hue(), highlightedOutline.saturation(), 160); | |||
| return highlightedOutline; | |||
| } | |||
| QColor tabFrameColor(const QPalette& pal) const | |||
| { | |||
| if (! pal.button().texture().isNull()) | |||
| return QColor(255, 255, 255, 8); | |||
| return buttonColor(pal).lighter(104); | |||
| } | |||
| QColor buttonColor(const QPalette& pal) const | |||
| { | |||
| QColor buttonColor = pal.button().color(); | |||
| int val = qGray(buttonColor.rgb()); | |||
| buttonColor = buttonColor.lighter(100 + qMax(1, (180 - val)/6)); | |||
| buttonColor.setHsv(buttonColor.hue(), buttonColor.saturation() * 0.75, buttonColor.value()); | |||
| return buttonColor; | |||
| } | |||
| QIcon tabBarcloseButtonIcon; | |||
| QList<const QObject*> animationTargets() const | |||
| { | |||
| return fAnimations.keys(); | |||
| } | |||
| CarlaStyleAnimation* animation(const QObject* target) const | |||
| { | |||
| return fAnimations.value(target); | |||
| } | |||
| void startAnimation(CarlaStyleAnimation* animation) const | |||
| { | |||
| stopAnimation(animation->target()); | |||
| kStyle->connect(animation, SIGNAL(destroyed()), SLOT(_removeAnimation()), Qt::UniqueConnection); | |||
| fAnimations.insert(animation->target(), animation); | |||
| animation->start(); | |||
| } | |||
| void stopAnimation(const QObject* target) const | |||
| { | |||
| CarlaStyleAnimation* animation = fAnimations.take(target); | |||
| if (animation != nullptr && animation->state() != QAbstractAnimation::Stopped) | |||
| animation->stop(); | |||
| } | |||
| private: | |||
| CarlaStyle* const kStyle; | |||
| int fAnimationFps; | |||
| mutable QHash<const QObject*, CarlaStyleAnimation*> fAnimations; | |||
| private slots: | |||
| void _removeAnimation() | |||
| { | |||
| QObject* animation = kStyle->sender(); | |||
| if (animation != nullptr) | |||
| fAnimations.remove(animation->parent()); | |||
| } | |||
| }; | |||
| #endif // __CARLA_STYLE_PRIVATE_HPP__ | |||
| @@ -0,0 +1,59 @@ | |||
| #!/usr/bin/make -f | |||
| # Makefile for theme # | |||
| # ------------------ # | |||
| # Created by falkTX | |||
| # | |||
| include ../Makefile.mk | |||
| # -------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += -fvisibility=hidden -I. | |||
| ifeq ($(HAVE_QT5),true) | |||
| BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
| LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
| else | |||
| BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
| LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | |||
| endif | |||
| FILES = \ | |||
| moc_CarlaStyle.cpp \ | |||
| moc_CarlaStylePrivate.cpp \ | |||
| moc_CarlaStyleAnimations.cpp \ | |||
| resources.cpp | |||
| OBJS = \ | |||
| CarlaStyle.cpp.o \ | |||
| moc_CarlaStyle.cpp.o \ | |||
| moc_CarlaStyleAnimations.cpp.o \ | |||
| moc_CarlaStylePrivate.cpp.o | |||
| TARGET = ../libs/theme.a | |||
| # -------------------------------------------------------------- | |||
| all: $(TARGET) | |||
| clean: | |||
| rm -f $(FILES) $(OBJS) $(TARGET) | |||
| debug: | |||
| $(MAKE) DEBUG=true | |||
| # -------------------------------------------------------------- | |||
| $(TARGET): $(FILES) $(OBJS) | |||
| $(AR) rs $@ $(OBJS) | |||
| # -------------------------------------------------------------- | |||
| %.cpp.o: %.cpp CarlaStyle.hpp moc_CarlaStyle.cpp | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| moc_%.cpp: %.hpp | |||
| $(MOC) $< -o $@ | |||
| resources.cpp: ../../resources/resources-theme.qrc | |||
| $(RCC) $< -o $@ | |||