diff options
author | Mavridis Philippe <mavridisf@gmail.com> | 2022-10-15 19:06:14 +0300 |
---|---|---|
committer | Mavridis Philippe <mavridisf@gmail.com> | 2022-10-15 19:06:14 +0300 |
commit | 47d22fa476f71a0e29649c2342fe11b04f079386 (patch) | |
tree | 7becd4dfe5cb5a67ca14e600b5afb4a5e4c8baf4 /src/MachBuntButton.cpp | |
download | twin-style-machbunt-47d22fa476f71a0e29649c2342fe11b04f079386.tar.gz twin-style-machbunt-47d22fa476f71a0e29649c2342fe11b04f079386.zip |
Initial commit (imported from Pling)
Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
Diffstat (limited to 'src/MachBuntButton.cpp')
-rw-r--r-- | src/MachBuntButton.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/src/MachBuntButton.cpp b/src/MachBuntButton.cpp new file mode 100644 index 0000000..82f1b14 --- /dev/null +++ b/src/MachBuntButton.cpp @@ -0,0 +1,228 @@ +/* + * $Id: MachBuntButton.cpp,v 1.34 2004/03/23 15:34:45 llunak Exp $ + * + */ + +#include "MachBunt.h" +#include <kpixmapeffect.h> +#include <kimageeffect.h> +#include <kiconeffect.h> +#include <kdrawutil.h> +#include <klocale.h> + +#include <qlayout.h> +#include <qdrawutil.h> +#include <qtooltip.h> +#include <qdatetime.h> +#include <qbitmap.h> +#include <qimage.h> +#include <qcursor.h> + +namespace SuSEMachBunt { + +// the titlebar buttons +extern bool pixmaps_created; + +QPixmap *defaultPixmap; +QColor *btnForeground; + +MachBuntButton::MachBuntButton(MachBunt * c, const char *name, + int _button, QPixmap bgI, QPixmap bgA, + bool isMini, + const QString &tip) + : QButton (c->widget(), name), position( ButtonMiddle ), client( c ) +{ + setTipText(tip); + setMouseTracking( true ); + setCursor( arrowCursor ); + + // Eliminate background flicker + setBackgroundMode( QWidget::NoBackground ); + + menuBtn = _button == BtnMenu; + miniBtn = isMini; + button = _button; + state = 0; + pressed = 0; + bg[0] = bgI; + bg[1] = bgA; + + // Use larger button for the menu, or mini-buttons for toolwindows. + if ( isMini ) { + setFixedSize(12, 12); + resize(12, 12); + } else{ + setFixedSize(PIX_HEIGHT, PIX_HEIGHT); + resize(PIX_HEIGHT, PIX_HEIGHT); + } +} + +MachBuntButton::~MachBuntButton() +{ +}; + +QSize MachBuntButton::sizeHint() const +{ + if ( miniBtn ) + return(QSize(12, 12)); + else + return(QSize(PIX_HEIGHT, PIX_HEIGHT)); +} + + +void MachBuntButton::reset(unsigned long changes) +{ + repaint(false); + if (!menuBtn){ + emit ( shapeMe(0) ); + state=0; + pressed = 0; + } +} + + +void MachBuntButton::setBitmap(const unsigned char *bitmap) +{ + repaint( false ); +} + + +void MachBuntButton::setPixmap( const QPixmap &_p ) +{ + QPixmap p; + + if ( _p.isNull() ) + p = *defaultPixmap; + else + p = _p; + + if ( miniBtn ){ + menuPixmap.convertFromImage( p.convertToImage().smoothScale(8,8) ); + }else + menuPixmap = p; + + + for ( int m=0; m<2; m++ ) + for ( int M=0; M<3; M++ ) + for ( int a=0; a<2; a++ ) + if (menuBtn) + menuButtonPixmap[button][m][M][a].resize(0,0); + else + buttonPixmap[button][m][M][a].resize(0,0); + + repaint( false ); +} + +void MachBuntButton::enterEvent( QEvent *e ) +{ + if (pressed){ + state = 2; + emit ( shapeMe(this->x()) ); + }else + state = 1; + repaint(); + QButton::enterEvent(e); +} + +void MachBuntButton::leaveEvent( QEvent *e ) +{ + if (pressed) + emit ( shapeMe(0) ); + state = 0; + repaint(); + QButton::leaveEvent(e); +} + +void MachBuntButton::setPosition( ButtonPos pos ) +{ + position = pos; +} + +bool MachBuntButton::resizePosition( QPoint pos ) +{ + if( pos.y() < BUTTON_RESIZE_SIZE ) + return true; + if( position == ButtonLeft && pos.x() < BUTTON_RESIZE_SIZE ) + return true; + if( position == ButtonRight && pos.x() > width() - 1 - BUTTON_RESIZE_SIZE ) + return true; + return false; +} + +void MachBuntButton::mouseMoveEvent( QMouseEvent* e ) +{ + if( resizePosition( e->pos())) + { + e->ignore(); + unsetCursor(); // use cursor set according to mousePosition() + return; + } + if ( pressed == 1 ) + emit( mousePressedMove(e) ); + e->ignore(); // so that dragging works, even when moving more inside the button + setCursor( arrowCursor ); +} + +void MachBuntButton::mousePressEvent( QMouseEvent* e ) +{ + if( resizePosition( e->pos())) + { + e->ignore(); + return; + } + if (!menuBtn){ + state = 2; + pressed = 1; + emit ( shapeMe(this->x()) ); + } + + last_button = e->button(); + QMouseEvent me ( e->type(), e->pos(), e->globalPos(), + LeftButton, e->state() ); + QButton::mousePressEvent( &me ); +} + +void MachBuntButton::mouseReleaseEvent( QMouseEvent* e ) +{ + if (!menuBtn){ + emit ( shapeMe(0) ); + if (state==2) + state=1; + pressed = 0; + } + if( resizePosition( e->pos())) + { + e->ignore(); + return; + } + last_button = e->button(); + QMouseEvent me ( e->type(), e->pos(), e->globalPos(), + LeftButton, e->state() ); + QButton::mouseReleaseEvent( &me ); +} + +void MachBuntButton::drawButton(QPainter *p) +{ + bool a = client->isActive(); + QPixmap *P; + if (menuBtn) + P = &menuButtonPixmap[button][a][state][miniBtn]; + else + P = &buttonPixmap[button][a][state][miniBtn]; + + if ( P->isNull() ) + *P = create_buttonPixmap( miniBtn ? 12 : PIX_HEIGHT, miniBtn ? 12 : PIX_HEIGHT, menuPixmap, bg[a], a, state ); + + p->drawPixmap( 0, 0, *P ); +} + +void MachBuntButton::setTipText(const QString &tip) { + if(KDecoration::options()->showTooltips()) { + QToolTip::remove(this ); + QToolTip::add(this, tip ); + } +} + +} + +// vim: ts=4 |