Split tile while keeping existing plot
This commit is contained in:
parent
ade970b35a
commit
80eaf5bce7
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user