Split tile while keeping existing plot

This commit is contained in:
Jan Käberich 2022-07-09 13:39:31 +02:00
parent ade970b35a
commit 80eaf5bce7
7 changed files with 94 additions and 32 deletions

View File

@ -122,24 +122,24 @@ bool TileWidget::allLimitsPassing()
} }
} }
void TileWidget::splitVertically() void TileWidget::splitVertically(bool moveContentToSecondChild)
{ {
if(isSplit) { if(isSplit) {
return; return;
} }
isSplit = true; isSplit = true;
splitter = new QSplitter(Qt::Vertical); splitter = new QSplitter(Qt::Vertical);
split(); split(moveContentToSecondChild);
} }
void TileWidget::splitHorizontally() void TileWidget::splitHorizontally(bool moveContentToSecondChild)
{ {
if(isSplit) { if(isSplit) {
return; return;
} }
isSplit = true; isSplit = true;
splitter = new QSplitter(Qt::Horizontal); splitter = new QSplitter(Qt::Horizontal);
split(); split(moveContentToSecondChild);
} }
void TileWidget::closeTile() void TileWidget::closeTile()
@ -197,7 +197,7 @@ TileWidget::TileWidget(TraceModel &model, TileWidget &parent)
ui->bClose->setVisible(true); ui->bClose->setVisible(true);
} }
void TileWidget::split() void TileWidget::split(bool moveContentToSecondChild)
{ {
splitter->setHandleWidth(0); splitter->setHandleWidth(0);
child1 = new TileWidget(model, *this); child1 = new TileWidget(model, *this);
@ -205,19 +205,40 @@ void TileWidget::split()
splitter->addWidget(child1); splitter->addWidget(child1);
splitter->addWidget(child2); splitter->addWidget(child2);
ui->ContentPage->layout()->addWidget(splitter); ui->ContentPage->layout()->addWidget(splitter);
if(hasContent) {
if(moveContentToSecondChild) {
child2->setContent(content);
} else {
child1->setContent(content);
}
removeContent();
}
ui->stack->setCurrentWidget(ui->ContentPage); ui->stack->setCurrentWidget(ui->ContentPage);
} }
void TileWidget::setContent(TracePlot *plot) void TileWidget::setContent(TracePlot *plot)
{ {
content = plot; content = plot;
content->setParentTile(this);
hasContent = true; hasContent = true;
ui->ContentPage->layout()->addWidget(plot); ui->ContentPage->layout()->addWidget(plot);
ui->stack->setCurrentWidget(ui->ContentPage); ui->stack->setCurrentWidget(ui->ContentPage);
connect(content, &TracePlot::deleted, this, &TileWidget::traceDeleted); connect(content, &TracePlot::deleted, this, &TileWidget::plotDeleted);
connect(content, &TracePlot::doubleClicked, this, &TileWidget::on_plotDoubleClicked); connect(content, &TracePlot::doubleClicked, this, &TileWidget::on_plotDoubleClicked);
} }
void TileWidget::removeContent()
{
if(hasContent) {
disconnect(content, &TracePlot::deleted, this, &TileWidget::plotDeleted);
disconnect(content, &TracePlot::doubleClicked, this, &TileWidget::on_plotDoubleClicked);
hasContent = false;
content = nullptr;
ui->stack->setCurrentWidget(ui->TilePage);
}
}
void TileWidget::on_plotDoubleClicked() void TileWidget::on_plotDoubleClicked()
{ {
setFullScreen(); setFullScreen();
@ -272,9 +293,8 @@ void TileWidget::on_bXYplot_clicked()
plot->axisSetupDialog(); plot->axisSetupDialog();
} }
void TileWidget::traceDeleted(TracePlot *) void TileWidget::plotDeleted()
{ {
if (isFullScreen) if (isFullScreen)
{ {
auto rootTile = findRootTile(); auto rootTile = findRootTile();

View File

@ -20,8 +20,8 @@ public:
explicit TileWidget(TraceModel &model, QWidget *parent = nullptr); explicit TileWidget(TraceModel &model, QWidget *parent = nullptr);
~TileWidget(); ~TileWidget();
TileWidget *Child1() { return child1; }; TileWidget *Child1() { return child1; }
TileWidget *Child2() { return child2; }; TileWidget *Child2() { return child2; }
// closes all plots/childs, leaving only the tilewidget at the top // closes all plots/childs, leaving only the tilewidget at the top
void clear(); void clear();
@ -31,9 +31,10 @@ public:
// check potential trace limits on graphs, only returns true if all traces in all graphs are within limits // check potential trace limits on graphs, only returns true if all traces in all graphs are within limits
bool allLimitsPassing(); bool allLimitsPassing();
public slots: public slots:
void splitVertically(); void splitVertically(bool moveContentToSecondChild = false);
void splitHorizontally(); void splitHorizontally(bool moveContentToSecondChild = false);
void closeTile(); void closeTile();
void setPlot(TracePlot *plot); void setPlot(TracePlot *plot);
@ -41,14 +42,15 @@ private slots:
void on_bSmithchart_clicked(); void on_bSmithchart_clicked();
void on_bXYplot_clicked(); void on_bXYplot_clicked();
void on_plotDoubleClicked(); void on_plotDoubleClicked();
void traceDeleted(TracePlot *t); void plotDeleted();
void on_bWaterfall_clicked(); void on_bWaterfall_clicked();
private: private:
TileWidget(TraceModel &model, TileWidget &parent); TileWidget(TraceModel &model, TileWidget &parent);
void split(); void split(bool moveContentToSecondChild = false);
void setContent(TracePlot *plot); void setContent(TracePlot *plot);
void removeContent();
void setChild(); void setChild();
TileWidget* findRootTile(); TileWidget* findRootTile();
void setFullScreen(); void setFullScreen();

View File

@ -5,6 +5,7 @@
#include "Marker/markermodel.h" #include "Marker/markermodel.h"
#include "preferences.h" #include "preferences.h"
#include "Util/util.h" #include "Util/util.h"
#include "CustomWidgets/tilewidget.h"
#include <QPainter> #include <QPainter>
#include <QPainterPath> #include <QPainterPath>
@ -25,6 +26,8 @@ TracePlot::TracePlot(TraceModel &model, QWidget *parent)
marginTop(20), marginTop(20),
limitPassing(true) limitPassing(true)
{ {
parentTile = nullptr;
contextmenu = new QMenu(); contextmenu = new QMenu();
markedForDeletion = false; markedForDeletion = false;
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@ -51,6 +54,12 @@ TracePlot::~TracePlot()
delete cursorLabel; delete cursorLabel;
} }
void TracePlot::setParentTile(TileWidget *tile)
{
parentTile = tile;
updateContextMenu();
}
void TracePlot::enableTrace(Trace *t, bool enabled) void TracePlot::enableTrace(Trace *t, bool enabled)
{ {
if(traces[t] != enabled) { if(traces[t] != enabled) {
@ -246,6 +255,45 @@ void TracePlot::paintEvent(QPaintEvent *event)
draw(p); draw(p);
} }
void TracePlot::finishContextMenu()
{
contextmenu->addSeparator();
if(parentTile) {
auto add = new QMenu("Add graph...", contextmenu);
auto left = new QAction("to the left");
connect(left, &QAction::triggered, [=](){
// split, keep current graph on the right
parentTile->splitHorizontally(true);
});
add->addAction(left);
auto right = new QAction("to the right");
connect(right, &QAction::triggered, [=](){
// split, keep current graph on the left
parentTile->splitHorizontally(false);
});
add->addAction(right);
auto above = new QAction("above");
connect(above, &QAction::triggered, [=](){
// split, keep current graph on the bottom
parentTile->splitVertically(true);
});
add->addAction(above);
auto below = new QAction("below");
connect(below, &QAction::triggered, [=](){
// split, keep current graph on the top
parentTile->splitVertically(false);
});
add->addAction(below);
contextmenu->addMenu(add);
}
auto close = new QAction("Close", contextmenu);
contextmenu->addAction(close);
connect(close, &QAction::triggered, [=]() {
markedForDeletion = true;
});
}
void TracePlot::mousePressEvent(QMouseEvent *event) void TracePlot::mousePressEvent(QMouseEvent *event)
{ {

View File

@ -10,6 +10,8 @@
#include <QLabel> #include <QLabel>
#include <QWidget> #include <QWidget>
class TileWidget;
class TracePlot : public QWidget, public Savable class TracePlot : public QWidget, public Savable
{ {
Q_OBJECT Q_OBJECT
@ -23,6 +25,8 @@ public:
TracePlot(TraceModel &model, QWidget *parent = nullptr); TracePlot(TraceModel &model, QWidget *parent = nullptr);
~TracePlot(); ~TracePlot();
void setParentTile(TileWidget *tile);
virtual void enableTrace(Trace *t, bool enabled); virtual void enableTrace(Trace *t, bool enabled);
void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override;
virtual void updateSpan(double min, double max); virtual void updateSpan(double min, double max);
@ -51,6 +55,8 @@ protected:
void contextMenuEvent(QContextMenuEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
virtual void updateContextMenu(){} virtual void updateContextMenu(){}
// adds common entries at bottom of context menu. Should be called at the end of derived udpateContextMenu functions
void finishContextMenu();
virtual void replot(){update();} virtual void replot(){update();}
virtual void draw(QPainter& p) = 0; virtual void draw(QPainter& p) = 0;
virtual bool supported(Trace *t) = 0; virtual bool supported(Trace *t) = 0;
@ -97,6 +103,7 @@ protected:
double sweep_fmin, sweep_fmax; double sweep_fmin, sweep_fmax;
TraceModel &model; TraceModel &model;
Marker *selectedMarker; Marker *selectedMarker;
TileWidget *parentTile;
// graph settings have been changed, check and possibly remove incompatible traces before next paint event // graph settings have been changed, check and possibly remove incompatible traces before next paint event
bool traceRemovalPending; bool traceRemovalPending;

View File

@ -525,12 +525,7 @@ void TraceSmithChart::updateContextMenu()
contextmenu->addAction(action); contextmenu->addAction(action);
} }
contextmenu->addSeparator(); finishContextMenu();
auto close = new QAction("Close", contextmenu);
contextmenu->addAction(close);
connect(close, &QAction::triggered, [=]() {
markedForDeletion = true;
});
} }
bool TraceSmithChart::supported(Trace *t) bool TraceSmithChart::supported(Trace *t)

View File

@ -211,12 +211,7 @@ void TraceWaterfall::updateContextMenu()
contextmenu->addAction(action); contextmenu->addAction(action);
} }
contextmenu->addSeparator(); finishContextMenu();
auto close = new QAction("Close", contextmenu);
contextmenu->addAction(close);
connect(close, &QAction::triggered, [=]() {
markedForDeletion = true;
});
} }
void TraceWaterfall::draw(QPainter &p) void TraceWaterfall::draw(QPainter &p)

View File

@ -322,12 +322,7 @@ void TraceXYPlot::updateContextMenu()
} }
} }
contextmenu->addSeparator(); finishContextMenu();
auto close = new QAction("Close", contextmenu);
contextmenu->addAction(close);
connect(close, &QAction::triggered, [=]() {
markedForDeletion = true;
});
} }
bool TraceXYPlot::dropSupported(Trace *t) bool TraceXYPlot::dropSupported(Trace *t)