/* * Copyright (C) 2012 Webdoc SA * * This file is part of Open-Sankoré. * * Open-Sankoré is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation, version 2, * with a specific linking exception for the OpenSSL project's * "OpenSSL" library (or with modified versions of it that use the * same license as the "OpenSSL" library). * * Open-Sankoré 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 Open-Sankoré; if not, see * . */ #include "UBActionPalette.h" #include "core/memcheck.h" UBActionPalette::UBActionPalette(QList actions, Qt::Orientation orientation, QWidget * parent) : UBFloatingPalette(Qt::TopRightCorner, parent) { init(orientation); setActions(actions); } UBActionPalette::UBActionPalette(Qt::Orientation orientation, QWidget * parent) : UBFloatingPalette(Qt::TopRightCorner, parent) { init(orientation); } UBActionPalette::UBActionPalette(QWidget * parent) : UBFloatingPalette(Qt::TopRightCorner, parent) { init(Qt::Vertical); } UBActionPalette::UBActionPalette(Qt::Corner corner, QWidget * parent, Qt::Orientation orient) : UBFloatingPalette(corner, parent) { init(orient); } void UBActionPalette::init(Qt::Orientation orientation) { m_customCloseProcessing = false; mButtonSize = QSize(32, 32); mIsClosable = false; mAutoClose = false; mButtonGroup = 0; mToolButtonStyle = Qt::ToolButtonIconOnly; mButtons.clear(); if (orientation == Qt::Horizontal) new QHBoxLayout(this); else new QVBoxLayout(this); updateLayout(); } void UBActionPalette::setActions(QList actions) { mMapActionToButton.clear(); foreach(QAction* action, actions) { addAction(action); } actionChanged(); } UBActionPaletteButton* UBActionPalette::createPaletteButton(QAction* action, QWidget *parent) { UBActionPaletteButton* button = new UBActionPaletteButton(action, parent); button->setIconSize(mButtonSize); button->setToolButtonStyle(mToolButtonStyle); if (mButtonGroup) mButtonGroup->addButton(button, mButtons.length()); mButtons << button; mMapActionToButton[action] = button; connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(action, SIGNAL(changed()), this, SLOT(actionChanged())); return button; } void UBActionPalette::addAction(QAction* action) { UBActionPaletteButton* button = createPaletteButton(action, this); layout()->addWidget(button); mActions << action; } void UBActionPalette::buttonClicked() { if (mAutoClose) { close(); } } QList UBActionPalette::actions() { return mActions; } UBActionPalette::~UBActionPalette() { qDeleteAll(mButtons.begin(), mButtons.end()); mButtons.clear(); } void UBActionPalette::setButtonIconSize(const QSize& size) { foreach(QToolButton* button, mButtons) button->setIconSize(size); mButtonSize = size; } void UBActionPalette::groupActions() { mButtonGroup = new QButtonGroup(this); int i = 0; foreach(QToolButton* button, mButtons) { mButtonGroup->addButton(button, i); ++i; } connect(mButtonGroup, SIGNAL(buttonClicked(int)), this, SIGNAL(buttonGroupClicked(int))); } void UBActionPalette::setToolButtonStyle(Qt::ToolButtonStyle tbs) { foreach(QToolButton* button, mButtons) button->setToolButtonStyle(tbs); mToolButtonStyle = tbs; updateLayout(); } void UBActionPalette::updateLayout() { if (mToolButtonStyle == Qt::ToolButtonIconOnly) { layout()->setContentsMargins (sLayoutContentMargin / 2 + border(), sLayoutContentMargin / 2 + border() , sLayoutContentMargin / 2 + border(), sLayoutContentMargin / 2 + border()); } else { layout()->setContentsMargins (sLayoutContentMargin + border(), sLayoutContentMargin + border() , sLayoutContentMargin + border(), sLayoutContentMargin + border()); } update(); } void UBActionPalette::setClosable(bool pClosable) { mIsClosable = pClosable; updateLayout(); } int UBActionPalette::border() { if (mIsClosable) return 10; else return 5; } void UBActionPalette::paintEvent(QPaintEvent *event) { UBFloatingPalette::paintEvent(event); if (mIsClosable) { QPainter painter(this); painter.drawPixmap(0, 0, QPixmap(":/images/close.svg")); } } void UBActionPalette::close() { if(!m_customCloseProcessing) hide(); emit closed(); } void UBActionPalette::mouseReleaseEvent(QMouseEvent * event) { if (mIsClosable && event->pos().x() >= 0 && event->pos().x() < QPixmap(":/images/close.svg").width() && event->pos().y() >= 0 && event->pos().y() < QPixmap(":/images/close.svg").height()) { event->accept(); close(); } UBFloatingPalette::mouseReleaseEvent(event); } void UBActionPalette::actionChanged() { for(int i = 0; i < mActions.length() && i < mButtons.length(); i++) { mButtons.at(i)->setVisible(mActions.at(i)->isVisible()); } } void UBActionPalette::clearLayout() { QLayout* pLayout = layout(); if(NULL != pLayout) { while(!pLayout->isEmpty()) { QLayoutItem* pItem = pLayout->itemAt(0); QWidget* pW = pItem->widget(); pLayout->removeItem(pItem); delete pItem; pLayout->removeWidget(pW); delete pW; } mActions.clear(); mButtons.clear(); } } UBActionPaletteButton::UBActionPaletteButton(QAction* action, QWidget * parent) : QToolButton(parent) { setIconSize(QSize(32, 32)); setDefaultAction(action); setStyleSheet(QString("QToolButton {color: white; font-weight: bold; font-family: Arial; background-color: transparent; border: none}")); setFocusPolicy(Qt::NoFocus); setObjectName("ubActionPaletteButton"); } UBActionPaletteButton::~UBActionPaletteButton() { } void UBActionPaletteButton::mouseDoubleClickEvent(QMouseEvent *event) { Q_UNUSED(event); emit doubleClicked(); } QSize UBActionPalette::buttonSize() { return mButtonSize; } /** * \brief Returns the button related to the given action * @param action as the given action */ UBActionPaletteButton* UBActionPalette::getButtonFromAction(QAction *action) { UBActionPaletteButton* pButton = NULL; pButton = mMapActionToButton.value(action); return pButton; } bool UBActionPaletteButton::hitButton(const QPoint &pos) const { Q_UNUSED(pos); return true; }