mirror of
https://github.com/yse/easy_profiler.git
synced 2024-12-26 16:11:02 +08:00
#31 [Gui] Fixed appox. line painting for complexity chart; Added export to .csv for regular chart type (timestamp;value);
This commit is contained in:
parent
4fb35b2099
commit
9308a17c21
@ -1360,13 +1360,35 @@ void ArbitraryValuesChartItem::updateComplexityImageAsync(QRectF _boundingRect,
|
|||||||
|
|
||||||
QPainterPath pp;
|
QPainterPath pp;
|
||||||
pp.moveTo(averages.front());
|
pp.moveTo(averages.front());
|
||||||
const size_t step = std::max(averages.size() / (size_t)40, (size_t)1);
|
const auto last = averages.size() - 1;
|
||||||
for (size_t k = 3 * step; k < averages.size(); k += 4 * step)
|
size_t last_k = 0;
|
||||||
|
size_t step = std::max(averages.size() / (size_t)40, (size_t)1);
|
||||||
|
const auto dubstep = step << 1; // lol :P
|
||||||
|
const auto iteration_step = 3 * step;
|
||||||
|
for (size_t k = iteration_step; k < averages.size(); k += iteration_step)
|
||||||
{
|
{
|
||||||
if (isReady())
|
if (isReady())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pp.cubicTo(averages[k - 2 * step], averages[k - 1 * step], averages[k]);
|
last_k = k;
|
||||||
|
pp.cubicTo(averages[k - dubstep], averages[k - step], averages[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto rest = last - last_k;
|
||||||
|
if (rest < iteration_step)
|
||||||
|
{
|
||||||
|
if ((rest % 4) == 0)
|
||||||
|
{
|
||||||
|
step = rest / 4;
|
||||||
|
pp.cubicTo(averages[last - (step << 1)], averages[last - step], averages[last]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
step = std::max(rest / (size_t)4, (size_t)1);
|
||||||
|
const auto k1 = std::max(last - step, last_k);
|
||||||
|
const auto k0 = std::max(k1 - step, last_k);
|
||||||
|
pp.cubicTo(averages[k0], averages[k1], averages[last]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p.drawPath(pp);
|
p.drawPath(pp);
|
||||||
@ -1539,6 +1561,11 @@ int GraphicsChart::filterWindowSize() const
|
|||||||
return m_chartItem->filterWindowSize();
|
return m_chartItem->filterWindowSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GraphicsChart::canShowSlider() const
|
||||||
|
{
|
||||||
|
return chartType() != ChartType::Complexity && !m_bBindMode;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
enum class ArbitraryColumns : uint8_t
|
enum class ArbitraryColumns : uint8_t
|
||||||
@ -1614,11 +1641,12 @@ void ArbitraryTreeWidgetItem::collectValues(profiler::thread_id_t _threadId, Cha
|
|||||||
m_collection->interrupt();
|
m_collection->interrupt();
|
||||||
|
|
||||||
auto parentItem = parent();
|
auto parentItem = parent();
|
||||||
auto parentBlockId = profiler_gui::numeric_max<profiler::block_id_t>();
|
|
||||||
bool directParent = false;
|
|
||||||
|
|
||||||
|
profiler::block_id_t parentBlockId = 0;
|
||||||
if (parentItem->data(int_cast(ArbitraryColumns::Type), Qt::UserRole).toInt() == 1)
|
if (parentItem->data(int_cast(ArbitraryColumns::Type), Qt::UserRole).toInt() == 1)
|
||||||
parentBlockId = parentItem->data(int_cast(ArbitraryColumns::Vin), Qt::UserRole).toUInt();
|
parentBlockId = parentItem->data(int_cast(ArbitraryColumns::Vin), Qt::UserRole).toUInt();
|
||||||
|
else
|
||||||
|
parentBlockId = EASY_GLOBALS.selected_block_id;
|
||||||
|
|
||||||
m_collection->collectValuesAndPoints(_chartType, _threadId, m_vin
|
m_collection->collectValuesAndPoints(_chartType, _threadId, m_vin
|
||||||
, text(int_cast(ArbitraryColumns::Name)).toStdString().c_str(), EASY_GLOBALS.begin_time
|
, text(int_cast(ArbitraryColumns::Name)).toStdString().c_str(), EASY_GLOBALS.begin_time
|
||||||
@ -1992,9 +2020,63 @@ void ArbitraryValuesWidget::onExportToCsvClicked(bool)
|
|||||||
if (fileinfo.suffix() != QStringLiteral("csv"))
|
if (fileinfo.suffix() != QStringLiteral("csv"))
|
||||||
filename += QStringLiteral(".csv");
|
filename += QStringLiteral(".csv");
|
||||||
|
|
||||||
QMessageBox::warning(this, "Warning", "Export to csv is not implemented yet", QMessageBox::Close);
|
QFile csv(filename);
|
||||||
|
if (!csv.open(QIODevice::WriteOnly | QIODevice::Text) || !csv.isOpen())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, "Warning", "Can not open file for writing", QMessageBox::Close);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Implement export to csv
|
for (auto item : m_checkedItems)
|
||||||
|
{
|
||||||
|
if (item->collection()->status() == ArbitraryValuesCollection::InProgress)
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, "Warning", "Not all values collected to the moment.\nTry again a bit later.",
|
||||||
|
QMessageBox::Close);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto writeHeader = [this, &csv]
|
||||||
|
{
|
||||||
|
csv.write(" ; ;\n"); // blank line
|
||||||
|
if (m_chart->chartType() == ChartType::Regular)
|
||||||
|
csv.write("timestamp;value;\n");
|
||||||
|
else
|
||||||
|
csv.write("value;duration;\n");
|
||||||
|
};
|
||||||
|
|
||||||
|
if (m_chart->chartType() == ChartType::Regular)
|
||||||
|
{
|
||||||
|
for (auto item : m_checkedItems)
|
||||||
|
{
|
||||||
|
const auto header = QString(" ; ;\nname:;%1;\ntimestamp;value;\n").arg(item->text(int_cast(ArbitraryColumns::Name)));
|
||||||
|
csv.write(header.toStdString().c_str());
|
||||||
|
|
||||||
|
auto collection = item->collection();
|
||||||
|
auto it = collection->valuesMap().find(EASY_GLOBALS.selected_thread);
|
||||||
|
if (it != collection->valuesMap().end())
|
||||||
|
{
|
||||||
|
for (auto val : it->second)
|
||||||
|
{
|
||||||
|
const auto str = QString("%1;%2;\n").arg(val->begin()).arg(profiler_gui::valueString(*val));
|
||||||
|
csv.write(str.toStdString().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, "Warning", "Export to csv for complexity chart\nis not implemented yet",
|
||||||
|
QMessageBox::Close);
|
||||||
|
|
||||||
|
// TODO: Implement complexity chart export to csv
|
||||||
|
// for (auto item : m_checkedItems)
|
||||||
|
// {
|
||||||
|
// const auto header = QString(" ; ;\nname:;%1;\nvalue;duration;\n").arg(item->text(int_cast(ArbitraryColumns::Name)));
|
||||||
|
// csv.write(header.toStdString().c_str());
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArbitraryValuesWidget::buildTree(profiler::thread_id_t _threadId, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId)
|
void ArbitraryValuesWidget::buildTree(profiler::thread_id_t _threadId, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId)
|
||||||
|
@ -284,6 +284,10 @@ public:
|
|||||||
FilterType filterType() const;
|
FilterType filterType() const;
|
||||||
int filterWindowSize() const;
|
int filterWindowSize() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool canShowSlider() const override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void onAutoAdjustChartChanged();
|
void onAutoAdjustChartChanged();
|
||||||
|
@ -242,6 +242,11 @@ void GraphicsSliderArea::showEvent(QShowEvent* _event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GraphicsSliderArea::canShowSlider() const
|
||||||
|
{
|
||||||
|
return !m_bBindMode;
|
||||||
|
}
|
||||||
|
|
||||||
void GraphicsSliderArea::validateScene()
|
void GraphicsSliderArea::validateScene()
|
||||||
{
|
{
|
||||||
if (!EASY_GLOBALS.scene.empty)
|
if (!EASY_GLOBALS.scene.empty)
|
||||||
@ -250,8 +255,11 @@ void GraphicsSliderArea::validateScene()
|
|||||||
setRange(EASY_GLOBALS.scene.left, EASY_GLOBALS.scene.right);
|
setRange(EASY_GLOBALS.scene.left, EASY_GLOBALS.scene.right);
|
||||||
setSliderWidth(EASY_GLOBALS.scene.window);
|
setSliderWidth(EASY_GLOBALS.scene.window);
|
||||||
setValue(EASY_GLOBALS.scene.offset);
|
setValue(EASY_GLOBALS.scene.offset);
|
||||||
m_slider->show();
|
if (canShowSlider())
|
||||||
scene()->update();
|
{
|
||||||
|
m_slider->show();
|
||||||
|
scene()->update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,7 +276,8 @@ void GraphicsSliderArea::onSceneSizeChanged(qreal _left, qreal _right)
|
|||||||
{
|
{
|
||||||
const profiler_gui::BoolFlagGuard guard(m_bEmitChange, false);
|
const profiler_gui::BoolFlagGuard guard(m_bEmitChange, false);
|
||||||
setRange(_left, _right);
|
setRange(_left, _right);
|
||||||
m_slider->show();
|
if (canShowSlider())
|
||||||
|
m_slider->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -154,6 +154,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
virtual bool canShowSlider() const;
|
||||||
void validateScene();
|
void validateScene();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
<qresource prefix="/images/default">
|
<qresource prefix="/images/default">
|
||||||
<file alias="exit">images/default/off.svg</file>
|
<file alias="exit">images/default/off.svg</file>
|
||||||
<file alias="open">images/default/open-folder2.svg</file>
|
<file alias="open">images/default/open-folder2.svg</file>
|
||||||
<file alias="reopen">images/default/reload-folder2.svg</file>
|
|
||||||
<file alias="reload">images/default/reload.svg</file>
|
<file alias="reload">images/default/reload.svg</file>
|
||||||
<file alias="expand">images/default/expand.svg</file>
|
<file alias="expand">images/default/expand.svg</file>
|
||||||
<file alias="collapse">images/default/collapse.svg</file>
|
<file alias="collapse">images/default/collapse.svg</file>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user