Files
o3de/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/DragAndDrop.cpp
T
Steve Pham 38261d0800 Shorten copyright headers by splitting into 2 lines (#2213)
* Updated all copyright headers to split the longer original copyright line into 2 shorter lines

Signed-off-by: Steve Pham <spham@amazon.com>
2021-07-16 15:25:48 -07:00

122 lines
5.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzQtComponents/Components/Widgets/DragAndDrop.h>
#include <AzQtComponents/Components/Style.h>
#include <AzQtComponents/Components/ConfigHelpers.h>
#include <QColor>
#include <QPainter>
#include <QSettings>
#include <QStyleOption>
namespace AzQtComponents
{
DragAndDrop::Config DragAndDrop::loadConfig(QSettings& settings)
{
ConfigHelpers::GroupGuard dropIndicator(&settings, QStringLiteral("DropIndicator"));
DragAndDrop::Config config = defaultConfig();
ConfigHelpers::read<int>(settings, QStringLiteral("rectOutlineWidth"), config.dropIndicator.rectOutlineWidth);
ConfigHelpers::read<int>(settings, QStringLiteral("lineSeparatorOutlineWidth"), config.dropIndicator.lineSeparatorOutlineWidth);
ConfigHelpers::read<int>(settings, QStringLiteral("ballDiameter"), config.dropIndicator.ballDiameter);
ConfigHelpers::read<int>(settings, QStringLiteral("ballOutlineWidth"), config.dropIndicator.ballOutlineWidth);
ConfigHelpers::read<QColor>(settings, QStringLiteral("rectOutlineColor"), config.dropIndicator.rectOutlineColor);
ConfigHelpers::read<QColor>(settings, QStringLiteral("lineSeparatorColor"), config.dropIndicator.lineSeparatorColor);
ConfigHelpers::read<QColor>(settings, QStringLiteral("ballFillColor"), config.dropIndicator.ballFillColor);
ConfigHelpers::read<QColor>(settings, QStringLiteral("ballOutlineColor"), config.dropIndicator.ballOutlineColor);
ConfigHelpers::read<int>(settings, QStringLiteral("rectBorderRadius"), config.dragIndicator.rectBorderRadius);
ConfigHelpers::read<QColor>(settings, QStringLiteral("rectFillColor"), config.dragIndicator.rectFillColor);
return config;
}
DragAndDrop::Config DragAndDrop::defaultConfig()
{
Config config;
config.dropIndicator.rectOutlineWidth = 1;
config.dropIndicator.lineSeparatorOutlineWidth = 1;
config.dropIndicator.ballDiameter = 5;
config.dropIndicator.ballOutlineWidth = 1;
config.dropIndicator.rectOutlineColor = QColor("#94D2FF");
config.dropIndicator.lineSeparatorColor = QColor("#94D2FF");
config.dropIndicator.ballFillColor = QColor("#444444");
config.dropIndicator.ballOutlineColor = QColor("#94D2FF");
config.dragIndicator.rectBorderRadius = 2;
config.dragIndicator.rectFillColor = QColor("#888888");
return config;
}
bool DragAndDrop::drawDragIndicator(const Style* style, const QStyleOption* option, QPainter* painter, const QWidget* widget, const DragAndDrop::Config& config)
{
Q_UNUSED(style)
Q_UNUSED(widget)
painter->save();
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(QPen(config.dragIndicator.rectFillColor, 1));
painter->setBrush(QBrush(config.dragIndicator.rectFillColor));
painter->drawRoundedRect(option->rect, config.dragIndicator.rectBorderRadius, config.dragIndicator.rectBorderRadius);
painter->restore();
return true;
}
bool DragAndDrop::drawDropIndicator(const Style* style, const QStyleOption* option, QPainter* painter, const QWidget* widget, const DragAndDrop::Config& config)
{
Q_UNUSED(style)
Q_UNUSED(widget)
painter->save();
painter->setRenderHint(QPainter::Antialiasing, true);
// If true means we're moving the row, not dropping into another one
const bool inBetweenRows = option->rect.height() == 0;
if (inBetweenRows)
{
//draw circle followed by line for drops between items
const int ballFillDiameter = config.dropIndicator.ballDiameter - 2*config.dropIndicator.ballOutlineWidth;
const int paintedDiameter = config.dropIndicator.ballDiameter + config.dropIndicator.ballOutlineWidth;
const int paintedRadius = paintedDiameter / 2;
QPen pen(config.dropIndicator.ballOutlineColor);
pen.setWidth(config.dropIndicator.ballOutlineWidth);
painter->setPen(pen);
painter->drawEllipse(option->rect.topLeft() + QPoint(paintedRadius, 0), ballFillDiameter, ballFillDiameter);
painter->drawEllipse(option->rect.topRight() - QPoint(paintedRadius, 0), ballFillDiameter, ballFillDiameter);
pen = QPen(config.dropIndicator.lineSeparatorColor);
pen.setWidth(config.dropIndicator.lineSeparatorOutlineWidth);
painter->setPen(pen);
painter->drawLine(option->rect.topLeft() + QPoint(paintedDiameter, 0), option->rect.topRight() - QPoint(paintedDiameter, 0));
}
else
{
//draw a rounded box for drops on items
QPen pen(config.dropIndicator.rectOutlineColor);
pen.setWidth(config.dropIndicator.rectOutlineWidth);
painter->setPen(pen);
painter->drawRect(option->rect);
}
painter->restore();
return true;
}
}