fractorium/Source/Fractorium/VariationTreeWidgetItem.h

96 lines
3.0 KiB
C
Raw Normal View History

#pragma once
#include "FractoriumPch.h"
#include "DoubleSpinBox.h"
/// <summary>
0.4.1.3 Beta 10/14/2014 --User Changes Size is no longer fixed to the window size. Size scaling is done differently in the final render dialog. This fixes several bugs. Remove Xml saving size from settings and options dialog, it no longer applies. Final render can be broken into strips. Set default save path to the desktop if none is found in the settings file. Set default output size to 1920x1080 if none is found in the settings file. --Bug Fixes Better memory size reporting in final render dialog. --Code Changes Migrate to C++11, Qt 5.3.1, and Visual Studio 2013. Change most instances of unsigned int to size_t, and int to intmax_t. Add m_OrigPixPerUnit and m_ScaleType to Ember for scaling purposes. Replace some sprintf_s() calls in XmlToEmber with ostringstream. Move more non-templated members into RendererBase. Add CopyVec() overload that takes a per element function pointer. Add vector Memset(). Replace '&' with '+' instead of "&amp;" in XmlToEmber for much faster parsing. Break strips rendering out into EmberCommon and call from EmberRender and Fractorium. Make AddAndWriteBuffer() just call WriteBuffer(). Make AddAndWriteImage() delete the existing image first before replacing it. Add SetOutputTexture() to RendererCL to support making new textures in response to resize events. Remove multiple return statements in RendererCL, and replace with a bool that tracks results. Add ToDouble(), MakeEnd(), ToString() and Exists() wrappers in Fractorium. Add Size() wrapper in EmberFile. Make QString function arguments const QString&, and string with const string&. Make ShowCritical() wrapper for invoking a message box from another thread. Add combo box to TwoButtonWidget and rename.
2014-10-14 11:53:15 -04:00
/// VariationTreeWidgetItem class.
/// </summary>
/// <summary>
/// A derivation of QTreeWidgetItem which helps us with sorting.
/// This is used when the user chooses to sort the variations tree
/// by index or by weight. It supports weights less than, equal to, or
/// greater than zero.
/// </summary>
class VariationTreeWidgetItem : public QTreeWidgetItem
{
public:
/// <summary>
/// Constructor that takes a pointer to a QTreeWidget as the parent
/// and passes it to the base.
/// </summary>
/// <param name="id">The ID of the variation this widget will represent</param>
2014-12-11 00:50:15 -05:00
/// <param name="p">The parent widget</param>
VariationTreeWidgetItem(eVariationId id, QTreeWidget* p = 0)
: QTreeWidgetItem(p)
{
m_Id = id;
}
/// <summary>
/// Constructor that takes a pointer to a QTreeWidgetItem as the parent
/// and passes it to the base.
/// This is used for making sub items for parametric variation parameters.
/// </summary>
/// <param name="id">The ID of the variation this widget will represent</param>
2014-12-11 00:50:15 -05:00
/// <param name="p">The parent widget</param>
VariationTreeWidgetItem(eVariationId id, QTreeWidgetItem* p = 0)
: QTreeWidgetItem(p)
{
m_Id = id;
}
virtual ~VariationTreeWidgetItem() { }
eVariationId Id() { return m_Id; }
private:
/// <summary>
/// Less than operator used for sorting.
/// </summary>
/// <param name="other">The QTreeWidgetItem to compare against for sorting</param>
/// <returns>True if this is less than other, else false.</returns>
bool operator < (const QTreeWidgetItem& other) const
{
int column = treeWidget()->sortColumn();
eVariationId index1, index2;
double weight1 = 0, weight2 = 0;
VariationTreeWidgetItem* varItemWidget;
VariationTreeDoubleSpinBox* spinBox1, *spinBox2;
auto itemWidget1 = treeWidget()->itemWidget(const_cast<VariationTreeWidgetItem*>(this), 1);//Get the widget for the second column.
if ((spinBox1 = dynamic_cast<VariationTreeDoubleSpinBox*>(itemWidget1)))//Cast the widget to the VariationTreeDoubleSpinBox type.
{
auto itemWidget2 = treeWidget()->itemWidget(const_cast<QTreeWidgetItem*>(&other), 1);//Get the widget for the second column of the widget item passed in.
if ((spinBox2 = dynamic_cast<VariationTreeDoubleSpinBox*>(itemWidget2)))//Cast the widget to the VariationTreeDoubleSpinBox type.
{
if (spinBox1->IsParam() || spinBox2->IsParam())//Do not sort params, their order will always remain the same.
return false;
weight1 = spinBox1->value();
weight2 = spinBox2->value();
index1 = spinBox1->GetVariationId();
index2 = spinBox2->GetVariationId();
if (column == 0)//First column clicked, sort by variation index.
{
return index1 < index2;
}
else if (column == 1)//Second column clicked, sort by weight.
{
if (IsNearZero(weight1) && IsNearZero(weight2))
return index1 > index2;
else
return fabs(weight1) < fabs(weight2);
}
}
}
return false;
}
eVariationId m_Id;
2014-12-11 00:50:15 -05:00
};