##// END OF EJS Templates
Parser refactoring (3)...
Parser refactoring (3) Implements properties reading and properties checking Implementation takes some of the basic parser, which will be deleted at the end

File last commit:

r937:839cf5f776e4
r946:49134789d5f3
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.
r839 #include "Visualization/VisualizationGraphWidget.h"
Format changes
r844 #include "Visualization/VisualizationZoneWidget.h"
Integrates the drag&drop classes into the existing visualization classes.
r839
Thibaud Rabillard
New style on mac to keep the scrollbars visible
r930 #include "Visualization/MacScrollBarStyle.h"
Manage drag&drop of empty graphs
r841 #include "Variable/VariableController.h"
Move Common MIME types constants in a Definition file in core module.
r848 #include "Common/MimeTypesDef.h"
Moves the DragDropHelper file
r884 #include "DragAndDrop/DragDropHelper.h"
Format changes
r844 #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
r850
Thibaud Rabillard
New style on mac to keep the scrollbars visible
r930 #ifdef Q_OS_MAC
std::unique_ptr<MacScrollBarStyle> m_MacScrollBarStyle = std::make_unique<MacScrollBarStyle>();
#endif
drop of variables in the visualization
r850 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
r930 #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.
r881 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
r937 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 12);
ui->dragDropContainer->layout()->setSpacing(0);
drop of zone on the time widget
r936 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
r879
drop of variables in the visualization
r850 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
ui->dragDropContainer);
});
Drag of the time widget on a graph
r879
connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this,
&VisualizationTabWidget::dropMimeData);
Manage the scroll of the tab QScrollArea during a drag&drop operation
r840 sqpApp->dragDropHelper().addDragDropScrollArea(ui->scrollArea);
Integrates the drag&drop classes into the existing visualization classes.
r839
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
r840 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.
r839 ui->dragDropContainer->addDragWidget(zoneWidget);
}
void VisualizationTabWidget::insertZone(int index, VisualizationZoneWidget *zoneWidget)
{
Format changes
r844 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.
r839 return createZone({variable}, -1);
}
Format changes
r844 VisualizationZoneWidget *
VisualizationTabWidget::createZone(const QList<std::shared_ptr<Variable> > &variables, int index)
Integrates the drag&drop classes into the existing visualization classes.
r839 {
Manage drag&drop of empty graphs
r841 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.
r839 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
r841 VisualizationZoneWidget *VisualizationTabWidget::createEmptyZone(int index)
{
Format changes
r844 auto zoneWidget
= new VisualizationZoneWidget{defaultZoneName(*ui->dragDropContainer->layout()), this};
Manage drag&drop of empty graphs
r841 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.
r839 return *ui->dragDropContainer->layout();
}
void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData)
{
Move Common MIME types constants in a Definition file in core module.
r848 if (mimeData->hasFormat(MIME_TYPE_GRAPH)) {
drop of variables in the visualization
r850 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
r841
drop of variables in the visualization
r850 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
r911 helper.delayedCloseWidget(graphWidget->parentZoneWidget());
Integrates the drag&drop classes into the existing visualization classes.
r839 }
Format changes
r844 else {
drop of variables in the visualization
r850 // Close the graph
Thibaud Rabillard
Fix for D&D bug on mac
r911 helper.delayedCloseWidget(graphWidget);
drop of variables in the visualization
r850 }
Integrates the drag&drop classes into the existing visualization classes.
r839
drop of variables in the visualization
r850 tabWidget->createZone(variables, index);
}
else {
// The graph is empty, create an empty zone and move the graph inside
Manage drag&drop of empty graphs
r841
drop of variables in the visualization
r850 auto parentZoneWidget = graphWidget->parentZoneWidget();
Manage drag&drop of empty graphs
r841
drop of variables in the visualization
r850 parentDragDropContainer->layout()->removeWidget(graphWidget);
Manage drag&drop of empty graphs
r841
drop of variables in the visualization
r850 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
r911 helper.delayedCloseWidget(parentZoneWidget);
Manage drag&drop of empty graphs
r841 }
Integrates the drag&drop classes into the existing visualization classes.
r839 }
drop of variables in the visualization
r850 }
Integrates the drag&drop classes into the existing visualization classes.
r839
drop of variables in the visualization
r850 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.
r839 }
drop of variables in the visualization
r850
// 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
r868 // 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
r870 }
Drag of product
r868
drop of variables in the visualization
r850 tabWidget->createZone(variables, index);
Alexandre Leroux
Adds scrollbar to tabs
r307 }