##// END OF EJS Templates
Increase spacing at the bottom of the visu to give more space for dropping in a new zone
Increase spacing at the bottom of the visu to give more space for dropping in a new zone

File last commit:

r978:839cf5f776e4
r978:839cf5f776e4
Show More
VisualizationTabWidget.cpp
320 lines | 10.3 KiB | text/x-c | CppLexer
/ gui / src / Visualization / VisualizationTabWidget.cpp
mv visualization -> Visualization...
r95 #include "Visualization/VisualizationTabWidget.h"
Alexandre Leroux
Updates visitor interface...
r207 #include "Visualization/IVisualizationWidgetVisitor.h"
Creation of VisualizationWidget, VizualizationTabWidget, VisualizationZoneWidget, VisualizationGraphWidget
r58 #include "ui_VisualizationTabWidget.h"
Integrates the drag&drop classes into the existing visualization classes.
r842 #include "Visualization/VisualizationGraphWidget.h"
Format changes
r847 #include "Visualization/VisualizationZoneWidget.h"
Integrates the drag&drop classes into the existing visualization classes.
r842
Thibaud Rabillard
New style on mac to keep the scrollbars visible
r929 #include "Visualization/MacScrollBarStyle.h"
Manage drag&drop of empty graphs
r844 #include "Variable/VariableController.h"
Move Common MIME types constants in a Definition file in core module.
r850 #include "Common/MimeTypesDef.h"
Moves the DragDropHelper file
r890 #include "DragAndDrop/DragDropHelper.h"
Format changes
r847 #include "SqpApplication.h"
Add the visualization gui classes
r118
Alexandre Leroux
Adds logs for null visitors
r219 Q_LOGGING_CATEGORY(LOG_VisualizationTabWidget, "VisualizationTabWidget")
Alexandre Leroux
Completes the method of creating a zone from a variable
r201 namespace {
/// Generates a default name for a new zone, according to the number of zones already displayed in
/// the tab
QString defaultZoneName(const QLayout &layout)
{
auto count = 0;
for (auto i = 0; i < layout.count(); ++i) {
if (dynamic_cast<VisualizationZoneWidget *>(layout.itemAt(i)->widget())) {
count++;
}
}
return QObject::tr("Zone %1").arg(count + 1);
}
Alexandre Leroux
Handles desynchronisation when removing variable from a graph (2)...
r738 /**
* Applies a function to all zones of the tab represented by its layout
* @param layout the layout that contains zones
* @param fun the function to apply to each zone
*/
template <typename Fun>
void processZones(QLayout &layout, Fun fun)
{
for (auto i = 0; i < layout.count(); ++i) {
if (auto item = layout.itemAt(i)) {
if (auto visualizationZoneWidget
= dynamic_cast<VisualizationZoneWidget *>(item->widget())) {
fun(*visualizationZoneWidget);
}
}
}
}
Alexandre Leroux
Completes the method of creating a zone from a variable
r201 } // namespace
Alexandre Leroux
Adds a name for a tab...
r198 struct VisualizationTabWidget::VisualizationTabWidgetPrivate {
explicit VisualizationTabWidgetPrivate(const QString &name) : m_Name{name} {}
Add the visualization gui classes
r118
Alexandre Leroux
Adds a name for a tab...
r198 QString m_Name;
drop of variables in the visualization
r852
Thibaud Rabillard
New style on mac to keep the scrollbars visible
r929 #ifdef Q_OS_MAC
std::unique_ptr<MacScrollBarStyle> m_MacScrollBarStyle = std::make_unique<MacScrollBarStyle>();
#endif
drop of variables in the visualization
r852 void dropGraph(int index, VisualizationTabWidget *tabWidget);
void dropZone(int index, VisualizationTabWidget *tabWidget);
void dropVariables(const QList<std::shared_ptr<Variable> > &variables, int index,
VisualizationTabWidget *tabWidget);
Alexandre Leroux
Adds a name for a tab...
r198 };
VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent)
: QWidget{parent},
ui{new Ui::VisualizationTabWidget},
impl{spimpl::make_unique_impl<VisualizationTabWidgetPrivate>(name)}
Creation of VisualizationWidget, VizualizationTabWidget, VisualizationZoneWidget, VisualizationGraphWidget
r58 {
ui->setupUi(this);
Alexandre Leroux
Updates tab widget so it can be deleted when closed
r267
Thibaud Rabillard
New style on mac to keep the scrollbars visible
r929 #ifdef Q_OS_MAC
impl->m_MacScrollBarStyle->selfInstallOn(ui->scrollArea, true);
#endif
Add an empty area at the bottom of the tab where a new zone can be created from a drop. Differentiate graph and zone placeHolders.
r887 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone");
Increase spacing at the bottom of the visu to give more space for dropping in a new zone
r978 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 12);
ui->dragDropContainer->layout()->setSpacing(0);
drop of zone on the time widget
r977 ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH,
VisualizationDragDropContainer::DropBehavior::Inserted);
ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE,
VisualizationDragDropContainer::DropBehavior::Inserted);
ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST,
VisualizationDragDropContainer::DropBehavior::Inserted);
Drag of the time widget on a graph
r885
drop of variables in the visualization
r852 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
ui->dragDropContainer);
});
Drag of the time widget on a graph
r885
connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this,
&VisualizationTabWidget::dropMimeData);
Manage the scroll of the tab QScrollArea during a drag&drop operation
r843 sqpApp->dragDropHelper().addDragDropScrollArea(ui->scrollArea);
Integrates the drag&drop classes into the existing visualization classes.
r842
Alexandre Leroux
Updates tab widget so it can be deleted when closed
r267 // Widget is deleted when closed
setAttribute(Qt::WA_DeleteOnClose);
Creation of VisualizationWidget, VizualizationTabWidget, VisualizationZoneWidget, VisualizationGraphWidget
r58 }
VisualizationTabWidget::~VisualizationTabWidget()
{
Manage the scroll of the tab QScrollArea during a drag&drop operation
r843 sqpApp->dragDropHelper().removeDragDropScrollArea(ui->scrollArea);
Creation of VisualizationWidget, VizualizationTabWidget, VisualizationZoneWidget, VisualizationGraphWidget
r58 delete ui;
}
Add the visualization gui classes
r118
void VisualizationTabWidget::addZone(VisualizationZoneWidget *zoneWidget)
{
Integrates the drag&drop classes into the existing visualization classes.
r842 ui->dragDropContainer->addDragWidget(zoneWidget);
}
void VisualizationTabWidget::insertZone(int index, VisualizationZoneWidget *zoneWidget)
{
Format changes
r847 ui->dragDropContainer->insertDragWidget(index, zoneWidget);
Add the visualization gui classes
r118 }
Alexandre Leroux
Completes the method of creating a zone from a variable
r201 VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr<Variable> variable)
Add the visualization gui classes
r118 {
Integrates the drag&drop classes into the existing visualization classes.
r842 return createZone({variable}, -1);
}
Format changes
r847 VisualizationZoneWidget *
VisualizationTabWidget::createZone(const QList<std::shared_ptr<Variable> > &variables, int index)
Integrates the drag&drop classes into the existing visualization classes.
r842 {
Manage drag&drop of empty graphs
r844 auto zoneWidget = createEmptyZone(index);
Add the visualization gui classes
r118
Alexandre Leroux
Completes the method of creating a zone from a variable
r201 // Creates a new graph into the zone
Integrates the drag&drop classes into the existing visualization classes.
r842 zoneWidget->createGraph(variables, index);
Alexandre Leroux
Completes the method of creating a zone from a variable
r201
Add the visualization gui classes
r118 return zoneWidget;
}
Manage drag&drop of empty graphs
r844 VisualizationZoneWidget *VisualizationTabWidget::createEmptyZone(int index)
{
Format changes
r847 auto zoneWidget
= new VisualizationZoneWidget{defaultZoneName(*ui->dragDropContainer->layout()), this};
Manage drag&drop of empty graphs
r844 this->insertZone(index, zoneWidget);
return zoneWidget;
}
Alexandre Leroux
Updates visitor interface...
r207 void VisualizationTabWidget::accept(IVisualizationWidgetVisitor *visitor)
Add the visualization gui classes
r118 {
Alexandre Leroux
Implements accept() method of visualization widgets
r208 if (visitor) {
visitor->visitEnter(this);
Alexandre Leroux
Handles desynchronisation when removing variable from a graph (2)...
r738 // Apply visitor to zone children: widgets different from zones are not visited (no action)
processZones(tabLayout(), [visitor](VisualizationZoneWidget &zoneWidget) {
zoneWidget.accept(visitor);
});
Alexandre Leroux
Implements accept() method of visualization widgets
r208
visitor->visitLeave(this);
}
Alexandre Leroux
Adds logs for null visitors
r219 else {
qCCritical(LOG_VisualizationTabWidget()) << tr("Can't visit widget : the visitor is null");
}
Add the visualization gui classes
r118 }
Alexandre Leroux
Creates a interface that defines a variable container...
r209 bool VisualizationTabWidget::canDrop(const Variable &variable) const
{
// A tab can always accomodate a variable
Q_UNUSED(variable);
return true;
}
Alexandre Leroux
Unplot menu (5): adds contains() method to an IVariableContainer...
r327 bool VisualizationTabWidget::contains(const Variable &variable) const
{
Q_UNUSED(variable);
return false;
}
Add const and override
r119 QString VisualizationTabWidget::name() const
Add the visualization gui classes
r118 {
Alexandre Leroux
Adds a name for a tab...
r198 return impl->m_Name;
Add the visualization gui classes
r118 }
Alexandre Leroux
Adds scrollbar to tabs
r307
Alexandre Leroux
Handles desynchronisation when removing variable from a graph (2)...
r738 void VisualizationTabWidget::closeEvent(QCloseEvent *event)
{
// Closes zones in the tab
processZones(tabLayout(), [](VisualizationZoneWidget &zoneWidget) { zoneWidget.close(); });
QWidget::closeEvent(event);
}
Alexandre Leroux
Adds scrollbar to tabs
r307 QLayout &VisualizationTabWidget::tabLayout() const noexcept
{
Integrates the drag&drop classes into the existing visualization classes.
r842 return *ui->dragDropContainer->layout();
}
void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData)
{
Move Common MIME types constants in a Definition file in core module.
r850 if (mimeData->hasFormat(MIME_TYPE_GRAPH)) {
drop of variables in the visualization
r852 impl->dropGraph(index, this);
}
else if (mimeData->hasFormat(MIME_TYPE_ZONE)) {
impl->dropZone(index, this);
}
else if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) {
auto variables = sqpApp->variableController().variablesForMimeData(
mimeData->data(MIME_TYPE_VARIABLE_LIST));
impl->dropVariables(variables, index, this);
}
else {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropMimeData, unknown MIME data received.");
}
}
void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropGraph(
int index, VisualizationTabWidget *tabWidget)
{
auto &helper = sqpApp->dragDropHelper();
auto graphWidget = qobject_cast<VisualizationGraphWidget *>(helper.getCurrentDragWidget());
if (!graphWidget) {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropGraph, drop aborted, the dropped graph is not "
"found or invalid.");
Q_ASSERT(false);
return;
}
auto parentDragDropContainer
= qobject_cast<VisualizationDragDropContainer *>(graphWidget->parentWidget());
if (!parentDragDropContainer) {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropGraph, drop aborted, the parent container of "
"the dropped graph is not found.");
Q_ASSERT(false);
return;
}
auto nbGraph = parentDragDropContainer->countDragWidget();
Manage drag&drop of empty graphs
r844
drop of variables in the visualization
r852 const auto &variables = graphWidget->variables();
if (!variables.isEmpty()) {
// Abort the requests for the variables (if any)
// Commented, because it's not sure if it's needed or not
// for (const auto& var : variables)
//{
// sqpApp->variableController().onAbortProgressRequested(var);
//}
if (nbGraph == 1) {
// This is the only graph in the previous zone, close the zone
Thibaud Rabillard
Fix for D&D bug on mac
r912 helper.delayedCloseWidget(graphWidget->parentZoneWidget());
Integrates the drag&drop classes into the existing visualization classes.
r842 }
Format changes
r847 else {
drop of variables in the visualization
r852 // Close the graph
Thibaud Rabillard
Fix for D&D bug on mac
r912 helper.delayedCloseWidget(graphWidget);
drop of variables in the visualization
r852 }
Integrates the drag&drop classes into the existing visualization classes.
r842
drop of variables in the visualization
r852 tabWidget->createZone(variables, index);
}
else {
// The graph is empty, create an empty zone and move the graph inside
Manage drag&drop of empty graphs
r844
drop of variables in the visualization
r852 auto parentZoneWidget = graphWidget->parentZoneWidget();
Manage drag&drop of empty graphs
r844
drop of variables in the visualization
r852 parentDragDropContainer->layout()->removeWidget(graphWidget);
Manage drag&drop of empty graphs
r844
drop of variables in the visualization
r852 auto zoneWidget = tabWidget->createEmptyZone(index);
zoneWidget->addGraph(graphWidget);
// Close the old zone if it was the only graph inside
if (nbGraph == 1) {
Thibaud Rabillard
Fix for D&D bug on mac
r912 helper.delayedCloseWidget(parentZoneWidget);
Manage drag&drop of empty graphs
r844 }
Integrates the drag&drop classes into the existing visualization classes.
r842 }
drop of variables in the visualization
r852 }
Integrates the drag&drop classes into the existing visualization classes.
r842
drop of variables in the visualization
r852 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropZone(
int index, VisualizationTabWidget *tabWidget)
{
auto &helper = sqpApp->dragDropHelper();
auto zoneWidget = qobject_cast<VisualizationZoneWidget *>(helper.getCurrentDragWidget());
if (!zoneWidget) {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropZone, drop aborted, the dropped zone is not "
"found or invalid.");
Q_ASSERT(false);
return;
}
auto parentDragDropContainer
= qobject_cast<VisualizationDragDropContainer *>(zoneWidget->parentWidget());
if (!parentDragDropContainer) {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropZone, drop aborted, the parent container of "
"the dropped zone is not found.");
Q_ASSERT(false);
return;
Integrates the drag&drop classes into the existing visualization classes.
r842 }
drop of variables in the visualization
r852
// Simple move of the zone, no variable operation associated
parentDragDropContainer->layout()->removeWidget(zoneWidget);
tabWidget->ui->dragDropContainer->insertDragWidget(index, zoneWidget);
}
void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropVariables(
const QList<std::shared_ptr<Variable> > &variables, int index,
VisualizationTabWidget *tabWidget)
{
Drag of product
r876 // Note: the AcceptMimeDataFunction (set on the drop container) ensure there is a single and
// compatible variable here
if (variables.count() > 1) {
qCWarning(LOG_VisualizationZoneWidget())
<< tr("VisualizationTabWidget::dropVariables, dropping multiple variables, operation "
"aborted.");
return;
Drop of product in variables
r877 }
Drag of product
r876
drop of variables in the visualization
r852 tabWidget->createZone(variables, index);
Alexandre Leroux
Adds scrollbar to tabs
r307 }