новые иконки в OpenBoard
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OpenBoard/src/gui/UBLibActionBar.cpp

535 lines
14 KiB

14 years ago
/*
* 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
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QIcon>
#include <QSize>
#include <QDebug>
#include "UBLibWidget.h"
#include "UBLibActionBar.h"
#include "core/UBApplication.h"
#include "core/memcheck.h"
/**
* \brief Constructor
* @param parent as the parent widget
* @param name as the object name
*/
UBLibActionBar::UBLibActionBar(QWidget *parent, const char *name):QWidget(parent)
, mCrntButtonSet(eButtonSet_Default)
, mPreviousButtonSet(eButtonSet_Default)
, mButtonGroup(NULL)
, mSearchBar(NULL)
, mLayout(NULL)
, mpFavoriteAction(NULL)
, mpSocialAction(NULL)
, mpDeleteAction(NULL)
, mpSearchAction(NULL)
, mpCloseAction(NULL)
, mpRemoveFavorite(NULL)
, mpNewFolderAction(NULL)
, mpFavoriteBtn(NULL)
, mpSocialBtn(NULL)
, mpDeleteBtn(NULL)
, mpSearchBtn(NULL)
, mpCloseBtn(NULL)
, mpRemoveFavoriteBtn(NULL)
, mpNewFolderBtn(NULL)
, bFavorite(false)
, bIsInTrash(false)
{
setObjectName(name);
setStyleSheet(QString("background: #EEEEEE; border-radius : 10px; border : 2px solid #999999;"));
setAcceptDrops(true);
mButtonGroup = new QButtonGroup(this);
mSearchBar = new QLineEdit(this);
mSearchBar->setStyleSheet(QString("background-color:white; border-radius : 10px; padding : 2px;"));
connect(mSearchBar, SIGNAL(returnPressed()), this, SLOT(onActionSearch()));
mLayout = new QHBoxLayout();
setLayout(mLayout);
setMaximumHeight(ACTIONBAR_HEIGHT);
// Create the actions
mpFavoriteAction = new QAction(QIcon(":/images/libpalette/miniFavorite.png"), tr("Add to favorites"), this);
mpSocialAction = new QAction(QIcon(":/images/libpalette/social.png"), tr("Share"), this);
mpSearchAction = new QAction(QIcon(":/images/libpalette/miniSearch.png"), tr("Search"), this);
mpDeleteAction = new QAction(QIcon(":/images/libpalette/miniTrash.png"), tr("Delete"), this);
mpCloseAction = new QAction(QIcon(":/images/close.svg"), tr("Back to folder"), this);
mpRemoveFavorite = new QAction(QIcon(":/images/libpalette/trash_favorite.svg"), tr("Remove from favorites"), this);
mpNewFolderAction = new QAction(QIcon(":/images/libpalette/miniNewFolder.png"), tr("Create new folder"), this);
// Create the buttons
mpFavoriteBtn = new UBActionButton(this, mpFavoriteAction);
mpSocialBtn = new UBActionButton(this, mpSocialAction);
mpSearchBtn = new UBActionButton(this, mpSearchAction);
mpDeleteBtn = new UBActionButton(this, mpDeleteAction);
mpCloseBtn = new UBActionButton(this, mpCloseAction);
mpRemoveFavoriteBtn = new UBActionButton(this, mpRemoveFavorite);
mpNewFolderBtn = new UBActionButton(this, mpNewFolderAction);
// Initialize the buttons
mpSearchBtn->setEnabled(false);
mpNewFolderBtn->setEnabled(false);
// Add the buttons to the button group
mButtonGroup->addButton(mpFavoriteBtn);
mButtonGroup->addButton(mpSocialBtn);
mButtonGroup->addButton(mpSearchBtn);
mButtonGroup->addButton(mpDeleteBtn);
mButtonGroup->addButton(mpCloseBtn);
mButtonGroup->addButton(mpRemoveFavoriteBtn);
mButtonGroup->addButton(mpNewFolderBtn);
// Connect signals & slots
connect(mpFavoriteAction,SIGNAL(triggered()), this, SLOT(onActionFavorite()));
connect(mpSocialAction,SIGNAL(triggered()), this, SLOT(onActionSocial()));
connect(mpSearchAction,SIGNAL(triggered()), this, SLOT(onActionSearch()));
connect(mpDeleteAction,SIGNAL(triggered()), this, SLOT(onActionTrash()));
connect(mpCloseAction, SIGNAL(triggered()), this, SLOT(onActionClose()));
connect(mpRemoveFavorite, SIGNAL(triggered()), this, SLOT(onActionRemoveFavorite()));
connect(mSearchBar, SIGNAL(textChanged(QString)), this, SLOT(onSearchTextChanged(QString)));
connect(mpNewFolderAction, SIGNAL(triggered()), this, SLOT(onActionNewFolder()));
// Build the default toolbar
mLayout->addWidget(mpFavoriteBtn);
mLayout->addWidget(mpSocialBtn);
mLayout->addWidget(mpNewFolderBtn);
mLayout->addWidget(mSearchBar);
mLayout->addWidget(mpSearchBtn);
mLayout->addWidget(mpDeleteBtn);
mLayout->addWidget(mpCloseBtn);
mLayout->addWidget(mpRemoveFavoriteBtn);
setButtons(eButtonSet_Default);
}
/**
* \brief Destructor
*/
UBLibActionBar::~UBLibActionBar()
{
if(NULL != mpNewFolderAction)
{
delete mpNewFolderAction;
mpNewFolderAction = NULL;
}
if(NULL != mpNewFolderBtn)
{
delete mpNewFolderBtn;
mpNewFolderBtn = NULL;
}
if(NULL != mpRemoveFavorite)
{
delete mpRemoveFavorite;
mpRemoveFavorite = NULL;
}
if(NULL != mpRemoveFavoriteBtn)
{
delete mpRemoveFavoriteBtn;
mpRemoveFavoriteBtn = NULL;
}
if(NULL != mpCloseAction)
{
delete mpCloseAction;
mpCloseAction = NULL;
}
if(NULL != mpDeleteAction)
{
delete mpDeleteAction;
mpDeleteAction = NULL;
}
if(NULL != mpFavoriteAction)
{
delete mpFavoriteAction;
mpFavoriteAction = NULL;
}
if(NULL != mpSearchAction)
{
delete mpSearchAction;
mpSearchAction = NULL;
}
if(NULL != mpSocialAction)
{
delete mpSocialAction;
mpSocialAction = NULL;
}
if(NULL != mpCloseBtn)
{
delete mpCloseBtn;
mpCloseBtn = NULL;
}
if(NULL != mpDeleteBtn)
{
delete mpDeleteBtn;
mpDeleteBtn = NULL;
}
if(NULL != mpFavoriteBtn)
{
delete mpFavoriteBtn;
mpFavoriteBtn = NULL;
}
if(NULL != mpSearchBtn)
{
delete mpSearchBtn;
mpSearchBtn = NULL;
}
if(NULL != mpSocialBtn)
{
delete mpSocialBtn;
mpSocialBtn = NULL;
}
if(NULL != mButtonGroup)
{
delete mButtonGroup;
mButtonGroup = NULL;
}
if(NULL != mSearchBar)
{
delete mSearchBar;
mSearchBar = NULL;
}
if(NULL != mLayout)
{
delete mLayout;
mLayout = NULL;
}
}
/**
* \brief Set the buttons of the action bar
* @param setID as the button set
*/
void UBLibActionBar::setButtons(eButtonSet setID)
{
mPreviousButtonSet = mCrntButtonSet;
mCrntButtonSet = setID;
switch(setID)
{
case eButtonSet_Default:
mpFavoriteBtn->show();
mpSocialBtn->hide();
mSearchBar->show();
mpSearchBtn->show();
mpDeleteBtn->show();
mpCloseBtn->hide();
mpRemoveFavoriteBtn->hide();
mpNewFolderBtn->show();
break;
case eButtonSet_Properties:
mpFavoriteBtn->show();
mpSocialBtn->hide();
mSearchBar->show();
mpSearchBtn->show();
mpDeleteBtn->hide();
mpCloseBtn->hide();
mpRemoveFavoriteBtn->hide();
mpNewFolderBtn->hide();
break;
case eButtonSet_Favorite:
mpFavoriteBtn->hide();
mpSocialBtn->hide();
mSearchBar->show();
mpSearchBtn->show();
mpDeleteBtn->hide();
mpCloseBtn->hide();
mpRemoveFavoriteBtn->show();
mpNewFolderBtn->hide();
break;
default:
break;
}
}
/**
* \brief (un)set the selected element to favorite
*/
void UBLibActionBar::onActionFavorite()
{
mpFavoriteBtn->setIcon(QIcon(":/images/libpalette/miniFavorite.png"));
libraryController()->addToFavorite(mSelectedElements);
}
/**
* \brief Handle the mouse enter event
* @param event as the event
*/
void UBLibActionBar::enterEvent(QEvent *event)
{
Q_UNUSED(event);
setCursor(Qt::ArrowCursor);
}
/**
* \brief Handle the mouse leave event
* @param event as the event
*/
void UBLibActionBar::leaveEvent(QEvent *event)
{
Q_UNUSED(event);
unsetCursor();
}
/**
* \brief Perform the search
*/
void UBLibActionBar::onActionSearch()
{
emit searchElement(mSearchBar->text());
}
/**
* \brief Trigger the social action
*/
void UBLibActionBar::onActionSocial()
{
// To be implemented
}
/**
* \brief Handles the close action
*/
void UBLibActionBar::onActionClose()
{
emit showFolderContent();
}
/**
* \brief Delete the selected element
*/
void UBLibActionBar::onActionTrash()
{
if(!bIsInTrash)
{
libraryController()->trashElements(mSelectedElements);
}
else
{
libraryController()->emptyElementsOnTrash(mSelectedElements);
}
emit deleteDone();
}
/**
* \brief Remove the selected favorite(s)
*/
void UBLibActionBar::onActionRemoveFavorite()
{
libraryController()->removeFromFavorite(mSelectedElements);
emit deleteDone();
}
/**
* \brief Handles the selection change event
* @param itemList as the list of selected items
* @param isInTrash indicates if the current folder is the trash
*/
void UBLibActionBar::onSelectionChanged(QList<UBLibElement *> itemList, bool isInTrash)
{
bIsInTrash = isInTrash;
mSelectedElements = itemList;
bool bEnable = (itemList.count() != 0) ? true : false;
if(mCrntButtonSet == eButtonSet_Favorite)
{
mpRemoveFavoriteBtn->setEnabled(bEnable);
return;
}
mpFavoriteAction->setEnabled(bEnable);
mpSocialAction->setEnabled(bEnable);
mpDeleteAction->setEnabled(bEnable && libraryController()->canItemsOnElementBeDeleted(itemList.at(0)));
}
/**
* \brief Get the library controller
* @return a pointer on the library controller
*/
UBLibraryController* UBLibActionBar::libraryController()
{
UBLibWidget* libWidget = dynamic_cast<UBLibWidget*>(parentWidget());
return libWidget->libNavigator()->libraryWidget()->libraryController();
}
/**
* \brief Show the actions related to the Favorites folder
*/
void UBLibActionBar::onFavoritesEntered(bool bFav)
{
setButtons(bFav ? eButtonSet_Favorite : eButtonSet_Default);
}
/**
* \brief Handles the drag enter event
* @param event as the drag enter event
*/
void UBLibActionBar::dragEnterEvent(QDragEnterEvent *event)
{
event->acceptProposedAction();
}
/**
* \brief Handles the drag move event
* @param event as the drag move event
*/
void UBLibActionBar::dragMoveEvent(QDragMoveEvent *event)
{
event->acceptProposedAction();
}
/**
* \brief Handles the drop event
* @param event as the given drop event
*/
void UBLibActionBar::dropEvent(QDropEvent *event)
{
const QPoint droppedPoint = event->pos();
QWidget* pTargetW = widgetAtPos(droppedPoint);
if(NULL != pTargetW)
{
if(mpFavoriteBtn == pTargetW)
{
onActionFavorite();
}
else if(mpRemoveFavoriteBtn == pTargetW)
{
onActionRemoveFavorite();
}
else if(mpDeleteBtn == pTargetW)
{
if(mpDeleteBtn->isEnabled())
{
onActionTrash();
}
}
else if(mpSocialBtn == pTargetW)
{
onActionSocial();
}
}
event->acceptProposedAction();
}
/**
* \brief Get the widget at the given position
* @param p as the given position
* @return a pointer on the related QWidget
*/
QWidget* UBLibActionBar::widgetAtPos(const QPoint p)
{
Q_ASSERT(mpDeleteBtn != NULL);
Q_ASSERT(mpFavoriteBtn != NULL);
Q_ASSERT(mpRemoveFavoriteBtn != NULL);
Q_ASSERT(mpSocialBtn != NULL);
QList<UBActionButton*> qlBttns;
qlBttns << mpFavoriteBtn;
qlBttns << mpDeleteBtn;
qlBttns << mpRemoveFavoriteBtn;
qlBttns << mpSocialBtn;
foreach(UBActionButton* bt, qlBttns)
{
if(bt->pos().x() <= p.x() &&
bt->pos().x() + bt->rect().width() >= p.x() &&
bt->pos().y() <= p.y() &&
bt->pos().y() + bt->rect().height() >= p.y())
{
if(bt->isVisible())
{
return bt;
}
}
}
// No interesting button has been found
return NULL;
}
/**
* \brief Handles the text changed event of the search bar
*/
void UBLibActionBar::onSearchTextChanged(QString txt)
{
Q_UNUSED(txt);
onActionSearch();
}
/**
* \brief Add a new folder
*/
void UBLibActionBar::onActionNewFolder()
{
emit newFolderToCreate();
}
/**
* \brief Update the action bar elements
* @param crntElem as the current element
*/
void UBLibActionBar::onNavigbarUpdate(UBLibElement *crntElem)
{
if(NULL != crntElem)
{
if(crntElem->type() == eUBLibElementType_Folder)
{
if(libraryController()->canItemsOnElementBeDeleted(crntElem) && !bIsInTrash)
mpNewFolderBtn->setEnabled(true);
else
mpNewFolderBtn->setEnabled(false);
}
else
{
mpNewFolderBtn->setEnabled(false);
}
}
}
void UBLibActionBar::onItemChanged()
{
mSearchBar->setText("");
mpSearchBtn->setEnabled(false);
}
/**
* \brief Construtor
* @param parent as the parent widget
* @param action as the related action
* @param name as the related object name
*/
UBActionButton::UBActionButton(QWidget *parent, QAction* action, const char *name):QToolButton(parent)
{
setObjectName(name);
addAction(action);
setDefaultAction(action);
setIconSize(QSize(BUTTON_SIZE, BUTTON_SIZE));
setToolButtonStyle(Qt::ToolButtonIconOnly);
setStyleSheet(QString("QToolButton {color: white; font-weight: bold; font-family: Arial; background-color: transparent; border: none}"));
setFocusPolicy(Qt::NoFocus);
}
/**
* \brief Destructor
*/
UBActionButton::~UBActionButton()
{
}