Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/styleeditor.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/filefield.h"
Toshihiro Shimizu 890ddd
#include "historytypes.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txshlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/stylemanager.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include "toonz/cleanupcolorstyles.h"
Toshihiro Shimizu 890ddd
#include "toonz/palettecontroller.h"
Toshihiro Shimizu 890ddd
#include "toonz/imagestyles.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h" //iwsw
Toshihiro Shimizu 890ddd
#include "toonz/levelproperties.h" //iwsw
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tfiletype.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tcolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "tpixel.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "tofflinegl.h"
Toshihiro Shimizu 890ddd
#include "tropcm.h"
Toshihiro Shimizu 890ddd
#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "tsimplecolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tvectorbrushstyle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <QHBoxLayout>
Toshihiro Shimizu 890ddd
#include <QVBoxLayout>
Toshihiro Shimizu 890ddd
#include <QGridLayout>
Toshihiro Shimizu 890ddd
#include <QPainter>
Toshihiro Shimizu 890ddd
#include <QButtonGroup>
Toshihiro Shimizu 890ddd
#include <QMouseEvent>
Toshihiro Shimizu 890ddd
#include <QLabel>
Toshihiro Shimizu 890ddd
#include <QCheckBox>
Toshihiro Shimizu 890ddd
#include <QPushButton>
Toshihiro Shimizu 890ddd
#include <QRadioButton>
Toshihiro Shimizu 890ddd
#include <QComboBox>
Toshihiro Shimizu 890ddd
#include <QScrollArea>
Toshihiro Shimizu 890ddd
#include <QStackedWidget>
Toshihiro Shimizu 890ddd
#include <QStyleOptionSlider>
Toshihiro Shimizu 890ddd
#include <QToolTip>
Toshihiro Shimizu 890ddd
#include <QSplitter>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace StyleEditorGUI;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    UndoPaletteChange  definition
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class UndoPaletteChange : public TUndo
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPaletteHandle *m_paletteHandle;
Toshihiro Shimizu 890ddd
	TPaletteP m_palette;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_styleId;
Toshihiro Shimizu 890ddd
	const TColorStyleP m_oldColor, m_newColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::wstring m_oldName, m_newName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_oldEditedFlag, m_newEditedFlag;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_frame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	UndoPaletteChange(TPaletteHandle *paletteHandle, int styleId,
Toshihiro Shimizu 890ddd
					  const TColorStyle &oldColor, const TColorStyle &newColor)
Toshihiro Shimizu 890ddd
		: m_paletteHandle(paletteHandle), m_palette(paletteHandle->getPalette()), m_styleId(styleId), m_oldColor(oldColor.clone()), m_newColor(newColor.clone()), m_oldName(oldColor.getName()), m_newName(newColor.getName()), m_frame(m_palette->getFrame()), m_oldEditedFlag(oldColor.getIsEditedFlag()), m_newEditedFlag(newColor.getIsEditedFlag()) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void undo() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_palette->setStyle(m_styleId, m_oldColor->clone());
Toshihiro Shimizu 890ddd
		m_palette->getStyle(m_styleId)->setIsEditedFlag(m_oldEditedFlag);
Toshihiro Shimizu 890ddd
		m_palette->getStyle(m_styleId)->setName(m_oldName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_palette->isKeyframe(m_styleId, m_frame))
Toshihiro Shimizu 890ddd
			m_palette->setKeyframe(m_styleId, m_frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//don't change the dirty flag. because m_palette may not the current palette when undo executed
Toshihiro Shimizu 890ddd
		m_paletteHandle->notifyColorStyleChanged(false, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void redo() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_palette->setStyle(m_styleId, m_newColor->clone());
Toshihiro Shimizu 890ddd
		m_palette->getStyle(m_styleId)->setIsEditedFlag(m_newEditedFlag);
Toshihiro Shimizu 890ddd
		m_palette->getStyle(m_styleId)->setName(m_newName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_palette->isKeyframe(m_styleId, m_frame))
Toshihiro Shimizu 890ddd
			m_palette->setKeyframe(m_styleId, m_frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//don't change the dirty flag. because m_palette may not the current palette when undo executed
Toshihiro Shimizu 890ddd
		m_paletteHandle->notifyColorStyleChanged(false, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// imprecise - depends on the style
Toshihiro Shimizu 890ddd
	int getSize() const { return sizeof(*this) + 2 * sizeof(TColorStyle *); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString getHistoryString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QObject::tr("Change Style   Palette : %1  Style#%2  [R%3 G%4 B%5] -> [R%6 G%7 B%8]")
Toshihiro Shimizu 890ddd
			.arg(QString::fromStdWString(m_palette->getPaletteName()))
Toshihiro Shimizu 890ddd
			.arg(QString::number(m_styleId))
Toshihiro Shimizu 890ddd
			.arg(m_oldColor->getMainColor().r)
Toshihiro Shimizu 890ddd
			.arg(m_oldColor->getMainColor().g)
Toshihiro Shimizu 890ddd
			.arg(m_oldColor->getMainColor().b)
Toshihiro Shimizu 890ddd
			.arg(m_newColor->getMainColor().r)
Toshihiro Shimizu 890ddd
			.arg(m_newColor->getMainColor().g)
Toshihiro Shimizu 890ddd
			.arg(m_newColor->getMainColor().b);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getHistoryType()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return HistoryType::Palette;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ColorModel  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const int ChannelMaxValues[] = {255, 255, 255, 255, 359, 100, 100};
Toshihiro Shimizu 890ddd
const int ChannelPairMaxValues[][2] =
Toshihiro Shimizu 890ddd
	{{255, 255}, {255, 255}, {255, 255}, {255, 255}, {100, 100}, {359, 100}, {359, 100}};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ColorModel::ColorModel()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	memset(m_channels, 0, sizeof m_channels);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::rgb2hsv()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QColor converter(m_channels[0], m_channels[1], m_channels[2]);
Toshihiro Shimizu 890ddd
	m_channels[4] = tmax(converter.hue(), 0); // hue() ritorna -1 per colori acromatici
Toshihiro Shimizu 890ddd
	m_channels[5] = converter.saturation() * 100 / 255;
Toshihiro Shimizu 890ddd
	m_channels[6] = converter.value() * 100 / 255;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::hsv2rgb()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QColor converter = QColor::fromHsv(
Toshihiro Shimizu 890ddd
		m_channels[4],
Toshihiro Shimizu 890ddd
		m_channels[5] * 255 / 100,
Toshihiro Shimizu 890ddd
		m_channels[6] * 255 / 100);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_channels[0] = converter.red();
Toshihiro Shimizu 890ddd
	m_channels[1] = converter.green();
Toshihiro Shimizu 890ddd
	m_channels[2] = converter.blue();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::setTPixel(const TPixel32 &pix)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QColor color(pix.r, pix.g, pix.b, pix.m);
Toshihiro Shimizu 890ddd
	m_channels[0] = color.red();
Toshihiro Shimizu 890ddd
	m_channels[1] = color.green();
Toshihiro Shimizu 890ddd
	m_channels[2] = color.blue();
Toshihiro Shimizu 890ddd
	m_channels[3] = color.alpha();
Toshihiro Shimizu 890ddd
	m_channels[4] = tmax(color.hue(), 0); // hue() ritorna -1 per colori acromatici
Toshihiro Shimizu 890ddd
	m_channels[5] = color.saturation() * 100 / 255;
Toshihiro Shimizu 890ddd
	m_channels[6] = color.value() * 100 / 255;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 ColorModel::getTPixel() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPixel32(m_channels[0], m_channels[1], m_channels[2], m_channels[3]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::setValue(ColorChannel channel, int value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= (int)channel && (int)channel < 7);
Toshihiro Shimizu 890ddd
	assert(0 <= value && value <= ChannelMaxValues[channel]);
Toshihiro Shimizu 890ddd
	m_channels[(int)channel] = value;
Toshihiro Shimizu 890ddd
	if (channel >= eHue)
Toshihiro Shimizu 890ddd
		hsv2rgb();
Toshihiro Shimizu 890ddd
	else if (channel <= eBlue)
Toshihiro Shimizu 890ddd
		rgb2hsv();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::setValues(ColorChannel channel, int v, int u)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= (int)channel && (int)channel < 7);
Toshihiro Shimizu 890ddd
	switch (channel) {
Toshihiro Shimizu 890ddd
	case eRed:
Toshihiro Shimizu 890ddd
		setValue(eGreen, v);
Toshihiro Shimizu 890ddd
		setValue(eBlue, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eGreen:
Toshihiro Shimizu 890ddd
		setValue(eRed, v);
Toshihiro Shimizu 890ddd
		setValue(eBlue, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eBlue:
Toshihiro Shimizu 890ddd
		setValue(eRed, v);
Toshihiro Shimizu 890ddd
		setValue(eGreen, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eHue:
Toshihiro Shimizu 890ddd
		setValue(eSaturation, v);
Toshihiro Shimizu 890ddd
		setValue(eValue, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eSaturation:
Toshihiro Shimizu 890ddd
		setValue(eHue, v);
Toshihiro Shimizu 890ddd
		setValue(eValue, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eValue:
Toshihiro Shimizu 890ddd
		setValue(eHue, v);
Toshihiro Shimizu 890ddd
		setValue(eSaturation, u);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ColorModel::getValue(ColorChannel channel) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= (int)channel && (int)channel < 7);
Toshihiro Shimizu 890ddd
	return m_channels[(int)channel];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorModel::getValues(ColorChannel channel, int &u, int &v)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (channel) {
Toshihiro Shimizu 890ddd
	case eRed:
Toshihiro Shimizu 890ddd
		u = getValue(eGreen);
Toshihiro Shimizu 890ddd
		v = getValue(eBlue);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eGreen:
Toshihiro Shimizu 890ddd
		u = getValue(eRed);
Toshihiro Shimizu 890ddd
		v = getValue(eBlue);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eBlue:
Toshihiro Shimizu 890ddd
		u = getValue(eRed);
Toshihiro Shimizu 890ddd
		v = getValue(eGreen);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eHue:
Toshihiro Shimizu 890ddd
		u = getValue(eSaturation);
Toshihiro Shimizu 890ddd
		v = getValue(eValue);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eSaturation:
Toshihiro Shimizu 890ddd
		u = getValue(eHue);
Toshihiro Shimizu 890ddd
		v = getValue(eValue);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eValue:
Toshihiro Shimizu 890ddd
		u = getValue(eHue);
Toshihiro Shimizu 890ddd
		v = getValue(eSaturation);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class RedShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	RedShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(value, m_color.g(), m_color.b()).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class GreenShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	GreenShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(m_color.r(), value, m_color.b()).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class BlueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	BlueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(m_color.r(), m_color.g(), value).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class AlphaShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	AlphaShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(m_color.r(), m_color.g(), m_color.b(), value).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(359 * value / 255, m_color.s() * 255 / 100, m_color.v() * 255 / 100).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SaturationShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SaturationShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(m_color.h(), value, m_color.v() * 255 / 100).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ValueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ValueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int value) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(m_color.h(), m_color.s() * 255 / 100, value).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class RedGreenShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	RedGreenShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(u, v, m_color.b()).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class RedBlueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	RedBlueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(u, m_color.g(), v).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class GreenBlueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	GreenBlueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor(m_color.r(), u, v).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SaturationValueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SaturationValueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(m_color.h(), u, v).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HueValueShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HueValueShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(359 * u / 255, m_color.s() * 255 / 100, v).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HueSaturationShadeMaker
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const ColorModel &m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HueSaturationShadeMaker(const ColorModel &color) : m_color(color) {}
Toshihiro Shimizu 890ddd
	inline QRgb shade(int u, int v) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return QColor::fromHsv(359 * u / 255, v, m_color.v() * 255 / 100).rgba();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class ShadeMaker>
Toshihiro Shimizu 890ddd
QPixmap makeLinearShading(
Toshihiro Shimizu 890ddd
	const ShadeMaker &shadeMaker,
Toshihiro Shimizu 890ddd
	int size,
Toshihiro Shimizu 890ddd
	bool isVertical)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(size > 0);
Toshihiro Shimizu 890ddd
	QPixmap bgPixmap;
Toshihiro Shimizu 890ddd
	int i, dx, dy, w = 1, h = 1;
Toshihiro Shimizu 890ddd
	int x = 0, y = 0;
Toshihiro Shimizu 890ddd
	if (isVertical) {
Toshihiro Shimizu 890ddd
		dx = 0;
Toshihiro Shimizu 890ddd
		dy = -1;
Toshihiro Shimizu 890ddd
		h = size;
Toshihiro Shimizu 890ddd
		y = size - 1;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		dx = 1;
Toshihiro Shimizu 890ddd
		dy = 0;
Toshihiro Shimizu 890ddd
		w = size;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	QImage image(w, h, QImage::Format_ARGB32);
Toshihiro Shimizu 890ddd
	for (i = 0; i < size; i++) {
Toshihiro Shimizu 890ddd
		int v = 255 * i / (size - 1);
Toshihiro Shimizu 890ddd
		image.setPixel(x, y, shadeMaker.shade(v));
Toshihiro Shimizu 890ddd
		x += dx;
Toshihiro Shimizu 890ddd
		y += dy;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QPixmap::fromImage(image);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QPixmap makeLinearShading(
Toshihiro Shimizu 890ddd
	const ColorModel &color,
Toshihiro Shimizu 890ddd
	ColorChannel channel,
Toshihiro Shimizu 890ddd
	int size,
Toshihiro Shimizu 890ddd
	bool isVertical)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (channel) {
Toshihiro Shimizu 890ddd
	case eRed:
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			return makeLinearShading(RedShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return QPixmap(":Resources/grad_r.png").scaled(size, 1);
Toshihiro Shimizu 890ddd
	case eGreen:
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			return makeLinearShading(GreenShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return QPixmap(":Resources/grad_g.png").scaled(size, 1);
Toshihiro Shimizu 890ddd
	case eBlue:
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			return makeLinearShading(BlueShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return QPixmap(":Resources/grad_b.png").scaled(size, 1);
Toshihiro Shimizu 890ddd
	case eAlpha:
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			return makeLinearShading(AlphaShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return QPixmap(":Resources/grad_m.png").scaled(size, 1);
Toshihiro Shimizu 890ddd
	case eHue:
Toshihiro Shimizu 890ddd
		return makeLinearShading(HueShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
	case eSaturation:
Toshihiro Shimizu 890ddd
		return makeLinearShading(SaturationShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
	case eValue:
Toshihiro Shimizu 890ddd
		return makeLinearShading(ValueShadeMaker(color), size, isVertical);
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		assert(0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QPixmap();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class ShadeMaker>
Toshihiro Shimizu 890ddd
QPixmap makeSquareShading(const ShadeMaker &shadeMaker, int size)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(size > 0);
Toshihiro Shimizu 890ddd
	QPixmap bgPixmap;
Toshihiro Shimizu 890ddd
	QImage image(size, size, QImage::Format_RGB32);
Toshihiro Shimizu 890ddd
	int i, j;
Toshihiro Shimizu 890ddd
	for (j = 0; j < size; j++) {
Toshihiro Shimizu 890ddd
		int u = 255 - (255 * j / (size - 1));
Toshihiro Shimizu 890ddd
		for (i = 0; i < size; i++) {
Toshihiro Shimizu 890ddd
			int v = 255 * i / (size - 1);
Toshihiro Shimizu 890ddd
			image.setPixel(i, j, shadeMaker.shade(v, u));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QPixmap::fromImage(image);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QPixmap makeSquareShading(
Toshihiro Shimizu 890ddd
	const ColorModel &color,
Toshihiro Shimizu 890ddd
	ColorChannel channel,
Toshihiro Shimizu 890ddd
	int size)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (channel) {
Toshihiro Shimizu 890ddd
	case eRed:
Toshihiro Shimizu 890ddd
		return makeSquareShading(GreenBlueShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	case eGreen:
Toshihiro Shimizu 890ddd
		return makeSquareShading(RedBlueShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	case eBlue:
Toshihiro Shimizu 890ddd
		return makeSquareShading(RedGreenShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	case eHue:
Toshihiro Shimizu 890ddd
		return makeSquareShading(SaturationValueShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	case eSaturation:
Toshihiro Shimizu 890ddd
		return makeSquareShading(HueValueShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	case eValue:
Toshihiro Shimizu 890ddd
		return makeSquareShading(HueSaturationShadeMaker(color), size);
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		assert(0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QPixmap();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    HexagonalColorWheel  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
HexagonalColorWheel::HexagonalColorWheel(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QGLWidget(parent), m_bgColor(128, 128, 128) //defaul value in case this value does not set in the style sheet
Toshihiro Shimizu 890ddd
												  //, m_ghibli3DLutUtil(0)//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setObjectName("HexagonalColorWheel");
Toshihiro Shimizu 890ddd
	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	m_currentWheel = none;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled() && Ghibli3DLutUtil::m_isValid)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil = new Ghibli3DLutUtil();
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->setInvert();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
HexagonalColorWheel::~HexagonalColorWheel()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(m_ghibli3DLutUtil)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->onEnd();
Toshihiro Shimizu 890ddd
	delete m_ghibli3DLutUtil;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::initializeGL()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	qglClearColor(getBGColor());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled() && m_ghibli3DLutUtil)
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->onInit();
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::resizeGL(int width, int height)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	float d = (width - 5.0f) / 2.5f;
Toshihiro Shimizu 890ddd
	bool isHorizontallyLong = ((d * 1.732f) < height) ? false : true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isHorizontallyLong) {
Toshihiro Shimizu 890ddd
		m_triEdgeLen = (float)height / 1.732f;
Toshihiro Shimizu 890ddd
		m_triHeight = (float)height / 2.0f;
Toshihiro Shimizu 890ddd
		m_wheelPosition.setX(((float)width - (m_triEdgeLen * 2.5f + 5.0f)) / 2.0f);
Toshihiro Shimizu 890ddd
		m_wheelPosition.setY(0.0f);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_triEdgeLen = d;
Toshihiro Shimizu 890ddd
		m_triHeight = m_triEdgeLen * 0.866f;
Toshihiro Shimizu 890ddd
		m_wheelPosition.setX(0.0f);
Toshihiro Shimizu 890ddd
		m_wheelPosition.setY(((float)height - (m_triHeight * 2.0f)) / 2.0f);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//set all vertices positions
Toshihiro Shimizu 890ddd
	m_wp[0].setX(m_triEdgeLen);
Toshihiro Shimizu 890ddd
	m_wp[0].setY(m_triHeight);
Toshihiro Shimizu 890ddd
	m_wp[1].setX(m_triEdgeLen * 0.5f);
Toshihiro Shimizu 890ddd
	m_wp[1].setY(0.0f);
Toshihiro Shimizu 890ddd
	m_wp[2].setX(0.0f);
Toshihiro Shimizu 890ddd
	m_wp[2].setY(m_triHeight);
Toshihiro Shimizu 890ddd
	m_wp[3].setX(m_triEdgeLen * 0.5f);
Toshihiro Shimizu 890ddd
	m_wp[3].setY(m_triHeight * 2.0f);
Toshihiro Shimizu 890ddd
	m_wp[4].setX(m_triEdgeLen * 1.5f);
Toshihiro Shimizu 890ddd
	m_wp[4].setY(m_triHeight * 2.0f);
Toshihiro Shimizu 890ddd
	m_wp[5].setX(m_triEdgeLen * 2.0f);
Toshihiro Shimizu 890ddd
	m_wp[5].setY(m_triHeight);
Toshihiro Shimizu 890ddd
	m_wp[6].setX(m_triEdgeLen * 1.5f);
Toshihiro Shimizu 890ddd
	m_wp[6].setY(0.0f);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_leftp[0].setX(m_wp[6].x() + 5.0f);
Toshihiro Shimizu 890ddd
	m_leftp[0].setY(0.0f);
Toshihiro Shimizu 890ddd
	m_leftp[1].setX(m_leftp[0].x() + m_triEdgeLen);
Toshihiro Shimizu 890ddd
	m_leftp[1].setY(m_triHeight * 2.0f);
Toshihiro Shimizu 890ddd
	m_leftp[2].setX(m_leftp[1].x());
Toshihiro Shimizu 890ddd
	m_leftp[2].setY(0.0f);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//GL settings
Toshihiro Shimizu 890ddd
	glViewport(0, 0, width, height);
Toshihiro Shimizu 890ddd
	glMatrixMode(GL_PROJECTION);
Toshihiro Shimizu 890ddd
	glLoadIdentity();
Toshihiro Shimizu 890ddd
	glOrtho(0.0, (GLdouble)width, (GLdouble)height, 0.0, 1.0, -1.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled() && m_ghibli3DLutUtil)
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->onResize(width,height);
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::paintGL()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//call ClearColor() here in order to update bg color when the stylesheet is switched
Toshihiro Shimizu 890ddd
	qglClearColor(getBGColor());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glMatrixMode(GL_MODELVIEW);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled() && m_ghibli3DLutUtil)
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->startDraw();
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glClear(GL_COLOR_BUFFER_BIT);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	float v = (float)m_color.getValue(eValue) / 100.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw hexagonal color wheel
Toshihiro Shimizu 890ddd
	glTranslatef(m_wheelPosition.rx(), m_wheelPosition.ry(), 0.0f);
Toshihiro Shimizu 890ddd
	glBegin(GL_TRIANGLE_FAN);
Toshihiro Shimizu 890ddd
	glColor3f(v, v, v);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[0].x(), m_wp[0].y());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glColor3f(0.0f, v, 0.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[1].x(), m_wp[1].y());
Toshihiro Shimizu 890ddd
	glColor3f(0.0f, v, v);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[2].x(), m_wp[2].y());
Toshihiro Shimizu 890ddd
	glColor3f(0.0f, 0.0f, v);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[3].x(), m_wp[3].y());
Toshihiro Shimizu 890ddd
	glColor3f(v, 0.0f, v);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[4].x(), m_wp[4].y());
Toshihiro Shimizu 890ddd
	glColor3f(v, 0.0f, 0.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[5].x(), m_wp[5].y());
Toshihiro Shimizu 890ddd
	glColor3f(v, v, 0.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[6].x(), m_wp[6].y());
Toshihiro Shimizu 890ddd
	glColor3f(0.0f, v, 0.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_wp[1].x(), m_wp[1].y());
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QColor leftCol = QColor().fromHsv(m_color.getValue(eHue), 255, 255);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw triangle color picker
Toshihiro Shimizu 890ddd
	glBegin(GL_TRIANGLES);
Toshihiro Shimizu 890ddd
	glColor3f(leftCol.redF(), leftCol.greenF(), leftCol.blueF());
Toshihiro Shimizu 890ddd
	glVertex2f(m_leftp[0].x(), m_leftp[0].y());
Toshihiro Shimizu 890ddd
	glColor3f(0.0f, 0.0f, 0.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_leftp[1].x(), m_leftp[1].y());
Toshihiro Shimizu 890ddd
	glColor3f(1.0f, 1.0f, 1.0f);
Toshihiro Shimizu 890ddd
	glVertex2f(m_leftp[2].x(), m_leftp[2].y());
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw small quad at current color position
Toshihiro Shimizu 890ddd
	drawCurrentColorMark();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//iwsw commented out temporarily
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	if(Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled() && m_ghibli3DLutUtil)
Toshihiro Shimizu 890ddd
	m_ghibli3DLutUtil->endDraw();
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::drawCurrentColorMark()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int h;
Toshihiro Shimizu 890ddd
	float s, v;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//show hue in a counterclockwise fashion
Toshihiro Shimizu 890ddd
	h = 360 - m_color.getValue(eHue);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	s = (float)m_color.getValue(eSaturation) / 100.0f;
Toshihiro Shimizu 890ddd
	v = (float)m_color.getValue(eValue) / 100.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// d is a distance from a center of the wheel
Toshihiro Shimizu 890ddd
	float d, phi;
Toshihiro Shimizu 890ddd
	phi = (float)(h % 60 - 30) / 180.0f * 3.1415f;
Toshihiro Shimizu 890ddd
	d = s * m_triHeight / cosf(phi);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//set marker color
Toshihiro Shimizu 890ddd
	if (v > 0.4f)
Toshihiro Shimizu 890ddd
		glColor3f(0.0f, 0.0f, 0.0f);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		glColor3f(1.0f, 1.0f, 1.0f);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw marker (in the wheel)
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslatef(m_wp[0].x(), m_wp[0].y(), 0.1f);
Toshihiro Shimizu 890ddd
	glRotatef(h, 0.0, 0.0, 1.0);
Toshihiro Shimizu 890ddd
	glTranslatef(d, 0.0f, 0.0f);
Toshihiro Shimizu 890ddd
	glRotatef(-h, 0.0, 0.0, 1.0);
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_LOOP);
Toshihiro Shimizu 890ddd
	glVertex2f(-3, -3);
Toshihiro Shimizu 890ddd
	glVertex2f(3, -3);
Toshihiro Shimizu 890ddd
	glVertex2f(3, 3);
Toshihiro Shimizu 890ddd
	glVertex2f(-3, 3);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw marker (in the triangle)
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslatef(m_leftp[1].x(), m_leftp[1].y(), 0.1f);
Toshihiro Shimizu 890ddd
	glTranslatef(-m_triEdgeLen * v * s, -m_triHeight * v * 2.0f, 0.0f);
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_LOOP);
Toshihiro Shimizu 890ddd
	glVertex2f(-3, -3);
Toshihiro Shimizu 890ddd
	glVertex2f(3, -3);
Toshihiro Shimizu 890ddd
	glVertex2f(3, 3);
Toshihiro Shimizu 890ddd
	glVertex2f(-3, 3);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (~event->buttons() & Qt::LeftButton)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// check whether the mouse cursor is in the wheel or in the triangle (or nothing).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPolygonF wheelPolygon;
Toshihiro Shimizu 890ddd
	// in the case of the wheel
Toshihiro Shimizu 890ddd
	wheelPolygon << m_wp[1] << m_wp[2] << m_wp[3] << m_wp[4] << m_wp[5] << m_wp[6];
Toshihiro Shimizu 890ddd
	wheelPolygon.translate(m_wheelPosition);
Toshihiro Shimizu 890ddd
	if (wheelPolygon.toPolygon().containsPoint(event->pos(), Qt::OddEvenFill)) {
Toshihiro Shimizu 890ddd
		m_currentWheel = leftWheel;
Toshihiro Shimizu 890ddd
		clickLeftWheel(event->pos());
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wheelPolygon.clear();
Toshihiro Shimizu 890ddd
	// in the case of the triangle
Toshihiro Shimizu 890ddd
	wheelPolygon << m_leftp[0] << m_leftp[1] << m_leftp[2];
Toshihiro Shimizu 890ddd
	wheelPolygon.translate(m_wheelPosition);
Toshihiro Shimizu 890ddd
	if (wheelPolygon.toPolygon().containsPoint(event->pos(), Qt::OddEvenFill)) {
Toshihiro Shimizu 890ddd
		m_currentWheel = rightTriangle;
Toshihiro Shimizu 890ddd
		clickRightTriangle(event->pos());
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//... or, in the case of nothing
Toshihiro Shimizu 890ddd
	m_currentWheel = none;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::mouseMoveEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// change the behavior according to the current touching wheel
Toshihiro Shimizu 890ddd
	switch (m_currentWheel) {
Toshihiro Shimizu 890ddd
	case none:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case leftWheel:
Toshihiro Shimizu 890ddd
		clickLeftWheel(event->pos());
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case rightTriangle:
Toshihiro Shimizu 890ddd
		clickRightTriangle(event->pos());
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::mouseReleaseEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_currentWheel = none;
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! compute hue and saturation position. saturation value must be clamped
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::clickLeftWheel(const QPoint &pos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QLineF p(m_wp[0] + m_wheelPosition, QPointF(pos));
Toshihiro Shimizu 890ddd
	QLineF horizontal(0, 0, 1, 0);
Toshihiro Shimizu 890ddd
	float theta = (p.dy() < 0) ? p.angle(horizontal) : 360 - p.angle(horizontal);
Toshihiro Shimizu 890ddd
	float phi = theta;
Toshihiro Shimizu 890ddd
	while (phi >= 60.0f)
Toshihiro Shimizu 890ddd
		phi -= 60.0f;
Toshihiro Shimizu 890ddd
	phi -= 30.0f;
Toshihiro Shimizu 890ddd
	// d is a length from center to edge of the wheel when saturation = 100
Toshihiro Shimizu 890ddd
	float d = m_triHeight / cosf(phi / 180.0f * 3.1415f);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int h = (int)theta;
Toshihiro Shimizu 890ddd
	if (h > 359)
Toshihiro Shimizu 890ddd
		h = 359;
Toshihiro Shimizu 890ddd
	//clamping
Toshihiro Shimizu 890ddd
	int s = (int)(tmin(p.length() / d, 1.0) * 100.0f);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_color.setValues(eValue, h, s);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void HexagonalColorWheel::clickRightTriangle(const QPoint &pos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int s, v;
Toshihiro Shimizu 890ddd
	QPointF p = m_leftp[1] + m_wheelPosition - QPointF(pos);
Toshihiro Shimizu 890ddd
	if (p.ry() <= 0.0f) {
Toshihiro Shimizu 890ddd
		s = 0;
Toshihiro Shimizu 890ddd
		v = 0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		float v_ratio = tmin((float)(p.ry() / (m_triHeight * 2.0f)), 1.0f);
Toshihiro Shimizu 890ddd
		float s_f = p.rx() / (m_triEdgeLen * v_ratio);
Toshihiro Shimizu 890ddd
		v = (int)(v_ratio * 100.0f);
Toshihiro Shimizu 890ddd
		s = (int)(tmin(tmax(s_f, 0.0f), 1.0f) * 100.0f);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_color.setValues(eHue, s, v);
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    SquaredColorWheel  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SquaredColorWheel::SquaredColorWheel(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_channel(eRed), m_color()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::paintEvent(QPaintEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPainter p(this);
Toshihiro Shimizu 890ddd
	// calcolo lo sfondo
Toshihiro Shimizu 890ddd
	int size = width();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPixmap bgPixmap = makeSquareShading(m_color, m_channel, size);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!bgPixmap.isNull())
Toshihiro Shimizu 890ddd
		p.drawTiledPixmap(0, 0, size, size, bgPixmap);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int u = 0, v = 0;
Toshihiro Shimizu 890ddd
	m_color.getValues(m_channel, u, v);
Toshihiro Shimizu 890ddd
	int x = u * width() / ChannelPairMaxValues[m_channel][0];
Toshihiro Shimizu 890ddd
	int y = (ChannelPairMaxValues[m_channel][1] - v) * height() / ChannelPairMaxValues[m_channel][1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_color.v() > 127)
Toshihiro Shimizu 890ddd
		p.setPen(Qt::black);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		p.setPen(Qt::white);
Toshihiro Shimizu 890ddd
	p.drawRect(x - 1, y - 1, 3, 3);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::click(const QPoint &pos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int u = ChannelPairMaxValues[m_channel][0] * pos.x() / width();
Toshihiro Shimizu 890ddd
	int v = ChannelPairMaxValues[m_channel][1] * (height() - pos.y()) / height();
Toshihiro Shimizu 890ddd
	u = tcrop(u, 0, ChannelPairMaxValues[m_channel][0]);
Toshihiro Shimizu 890ddd
	v = tcrop(v, 0, ChannelPairMaxValues[m_channel][1]);
Toshihiro Shimizu 890ddd
	m_color.setValues(m_channel, u, v);
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (event->buttons() & Qt::LeftButton)
Toshihiro Shimizu 890ddd
		click(event->pos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::mouseMoveEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (event->buttons() & Qt::LeftButton)
Toshihiro Shimizu 890ddd
		click(event->pos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::mouseReleaseEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::setColor(const ColorModel &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_color = color;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SquaredColorWheel::setChannel(int channel)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= channel && channel < 7);
Toshihiro Shimizu 890ddd
	m_channel = (ColorChannel)channel;
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ColorSlider  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ColorSlider::ColorSlider(Qt::Orientation orientation, QWidget *parent)
Toshihiro Shimizu 890ddd
	: QSlider(orientation, parent), m_channel(eRed), m_color()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setOrientation(orientation);
Toshihiro Shimizu 890ddd
	setMinimum(0);
Toshihiro Shimizu 890ddd
	setMaximum(ChannelMaxValues[m_channel]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setMinimumHeight(7);
Toshihiro Shimizu 890ddd
	setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Attenzione: necessario per poter individuare l'oggetto nel file di definizione dello stile
Toshihiro Shimizu 890ddd
	setObjectName("colorSlider");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSlider::setChannel(ColorChannel channel)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_channel == channel)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_channel = channel;
Toshihiro Shimizu 890ddd
	setMaximum(ChannelMaxValues[m_channel]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSlider::setColor(const ColorModel &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_color = color;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSlider::paintEvent(QPaintEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPainter p(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int x = rect().x();
Toshihiro Shimizu 890ddd
	int y = rect().y();
Toshihiro Shimizu 890ddd
	int w = width();
Toshihiro Shimizu 890ddd
	int h = height();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isVertical = orientation() == Qt::Vertical;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!isVertical)
Toshihiro Shimizu 890ddd
		h -= 5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPixmap bgPixmap =
Toshihiro Shimizu 890ddd
		makeLinearShading(m_color, m_channel, isVertical ? h : w, isVertical);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_channel == eAlpha) {
Toshihiro Shimizu 890ddd
		static QPixmap checkboard(":Resources/backg.png");
Toshihiro Shimizu 890ddd
		p.drawTiledPixmap(x, y, w, h, checkboard);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!bgPixmap.isNull()) {
Toshihiro Shimizu 890ddd
		p.drawTiledPixmap(x, y, w, h, bgPixmap);
Toshihiro Shimizu 890ddd
		p.setPen(Qt::white);
Toshihiro Shimizu 890ddd
		p.drawLine(x, y + h, x + w, y + h);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
	   Bug in Qt 4.3: The vertical Slider cannot be styled due to a bug.
Toshihiro Shimizu 890ddd
	   In this case we draw "manually" the slider handle at correct position
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	if (isVertical) {
Toshihiro Shimizu 890ddd
		int pos = QStyle::sliderPositionFromValue(minimum(), maximum(), value(), h - 9, true);
Toshihiro Shimizu 890ddd
		static QPixmap vHandlePixmap(":Resources/v_chandle.png");
Toshihiro Shimizu 890ddd
		p.drawPixmap(0, pos, vHandlePixmap);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		static QPixmap hHandleUpPm(":Resources/h_chandleUp.png");
Toshihiro Shimizu 890ddd
		static QPixmap hHandleDownPm(":Resources/h_chandleDown.png");
Toshihiro Shimizu 890ddd
		static QPixmap hHandleCenterPm(":Resources/h_chandleCenter.png");
Toshihiro Shimizu 890ddd
		int pos = QStyle::sliderPositionFromValue(0, maximum(), value(), width() - hHandleCenterPm.width(), false);
Toshihiro Shimizu 890ddd
		p.drawPixmap(pos, 0, hHandleUpPm);
Toshihiro Shimizu 890ddd
		p.drawPixmap(pos, height() - hHandleDownPm.height(), hHandleDownPm);
Toshihiro Shimizu 890ddd
		p.drawPixmap(pos,
Toshihiro Shimizu 890ddd
					 hHandleUpPm.height(),
Toshihiro Shimizu 890ddd
					 hHandleCenterPm.width(),
Toshihiro Shimizu 890ddd
					 height() - hHandleUpPm.height() - hHandleDownPm.height(),
Toshihiro Shimizu 890ddd
					 hHandleCenterPm);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSlider::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// vogliamo che facendo click sullo slider, lontano dall'handle
Toshihiro Shimizu 890ddd
	// l'handle salti subito nella posizione giusta invece di far partire
Toshihiro Shimizu 890ddd
	// l'autorepeat.
Toshihiro Shimizu 890ddd
	//
Toshihiro Shimizu 890ddd
	// cfr. qslider.cpp:429: sembra che questo comportamento si possa ottenere
Toshihiro Shimizu 890ddd
	// anche con SH_Slider_AbsoluteSetButtons. Ma non capisco come si possa fare
Toshihiro Shimizu 890ddd
	// per definire quest hint
Toshihiro Shimizu 890ddd
	QStyleOptionSlider opt;
Toshihiro Shimizu 890ddd
	initStyleOption(&opt);
Toshihiro Shimizu 890ddd
	const QRect handleRect =
Toshihiro Shimizu 890ddd
		style()->subControlRect(
Toshihiro Shimizu 890ddd
			QStyle::CC_Slider, &opt,
Toshihiro Shimizu 890ddd
			QStyle::SC_SliderHandle, this);
Toshihiro Shimizu 890ddd
	if (!handleRect.contains(event->pos())) {
Toshihiro Shimizu 890ddd
		const QPoint handleCenter = handleRect.center();
Toshihiro Shimizu 890ddd
		const QRect grooveRect = style()->subControlRect(
Toshihiro Shimizu 890ddd
			QStyle::CC_Slider, &opt,
Toshihiro Shimizu 890ddd
			QStyle::SC_SliderGroove, this);
Toshihiro Shimizu 890ddd
		int pos, span;
Toshihiro Shimizu 890ddd
		bool upsideDown = false;
Toshihiro Shimizu 890ddd
		if (opt.orientation == Qt::Vertical) {
Toshihiro Shimizu 890ddd
			upsideDown = true;
Toshihiro Shimizu 890ddd
			int handleSize = handleRect.height();
Toshihiro Shimizu 890ddd
			pos = event->pos().y() - handleSize / 2;
Toshihiro Shimizu 890ddd
			span = grooveRect.height() - handleSize;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			int handleSize = QPixmap(":Resources/h_chandleCenter.png").width();
Toshihiro Shimizu 890ddd
			pos = event->pos().x() - handleSize / 2;
Toshihiro Shimizu 890ddd
			span = grooveRect.width() - handleSize;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		int value = QStyle::sliderValueFromPosition(minimum(), maximum(), pos, span, upsideDown);
Toshihiro Shimizu 890ddd
		setValue(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	QSlider::mousePressEvent(event);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSlider::mouseReleaseEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	emit sliderReleased();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ArrowButton  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ArrowButton::ArrowButton(QWidget *parent, Qt::Orientation orientation, bool isFirstArrow)
Toshihiro Shimizu 890ddd
	: QToolButton(parent), m_orientaion(orientation), m_isFirstArrow(isFirstArrow), m_timerId(0), m_firstTimerId(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFixedSize(10, 10);
Toshihiro Shimizu 890ddd
	setObjectName("StyleEditorArrowButton");
Toshihiro Shimizu 890ddd
	bool isVertical = orientation == Qt::Vertical;
Toshihiro Shimizu 890ddd
	if (m_isFirstArrow) {
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			setIcon(createQIconPNG("arrow_up"));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			setIcon(createQIconPNG("arrow_left"));
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		if (isVertical)
Toshihiro Shimizu 890ddd
			setIcon(createQIconPNG("arrow_down"));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			setIcon(createQIconPNG("arrow_right"));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	connect(this, SIGNAL(pressed()), this, SLOT(onPressed()));
Toshihiro Shimizu 890ddd
	connect(this, SIGNAL(released()), this, SLOT(onRelease()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArrowButton::timerEvent(QTimerEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_firstTimerId != 0) {
Toshihiro Shimizu 890ddd
		killTimer(m_firstTimerId);
Toshihiro Shimizu 890ddd
		m_firstTimerId = 0;
Toshihiro Shimizu 890ddd
		m_timerId = startTimer(10);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	notifyChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArrowButton::notifyChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool isVertical = m_orientaion == Qt::Vertical;
Toshihiro Shimizu 890ddd
	if ((m_isFirstArrow && !isVertical) || (!m_isFirstArrow && isVertical))
Toshihiro Shimizu 890ddd
		emit remove();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		emit add();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArrowButton::onPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	notifyChanged();
Toshihiro Shimizu 890ddd
	assert(m_timerId == 0 && m_firstTimerId == 0);
Toshihiro Shimizu 890ddd
	m_firstTimerId = startTimer(500);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArrowButton::onRelease()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_firstTimerId != 0) {
Toshihiro Shimizu 890ddd
		killTimer(m_firstTimerId);
Toshihiro Shimizu 890ddd
		m_firstTimerId = 0;
Toshihiro Shimizu 890ddd
	} else if (m_timerId != 0) {
Toshihiro Shimizu 890ddd
		killTimer(m_timerId);
Toshihiro Shimizu 890ddd
		m_timerId = 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ColorSliderBar  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ColorSliderBar::ColorSliderBar(QWidget *parent, Qt::Orientation orientation)
Toshihiro Shimizu 890ddd
	: QWidget(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool isVertical = orientation == Qt::Vertical;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ArrowButton *first = new ArrowButton(this, orientation, true);
Toshihiro Shimizu 890ddd
	connect(first, SIGNAL(remove()), this, SLOT(onRemove()));
Toshihiro Shimizu 890ddd
	connect(first, SIGNAL(add()), this, SLOT(onAdd()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_colorSlider = new ColorSlider(orientation, this);
Toshihiro Shimizu 890ddd
	if (isVertical)
Toshihiro Shimizu 890ddd
		m_colorSlider->setMaximumWidth(22);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ArrowButton *last = new ArrowButton(this, orientation, false);
Toshihiro Shimizu 890ddd
	connect(last, SIGNAL(add()), this, SLOT(onAdd()));
Toshihiro Shimizu 890ddd
	connect(last, SIGNAL(remove()), this, SLOT(onRemove()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	connect(m_colorSlider, SIGNAL(valueChanged(int)), this, SIGNAL(valueChanged(int)));
Toshihiro Shimizu 890ddd
	connect(m_colorSlider, SIGNAL(sliderReleased()), this, SIGNAL(valueChanged()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QBoxLayout *layout;
Toshihiro Shimizu 890ddd
	if (!isVertical)
Toshihiro Shimizu 890ddd
		layout = new QHBoxLayout(this);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		layout = new QVBoxLayout(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	layout->setSpacing(0);
Toshihiro Shimizu 890ddd
	layout->setMargin(0);
Toshihiro Shimizu 890ddd
	layout->addWidget(first, 0, Qt::AlignCenter);
Toshihiro Shimizu 890ddd
	layout->addWidget(m_colorSlider, 1);
Toshihiro Shimizu 890ddd
	layout->addWidget(last, 0, Qt::AlignCenter);
Toshihiro Shimizu 890ddd
	setLayout(layout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSliderBar::onRemove()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int value = m_colorSlider->value();
Toshihiro Shimizu 890ddd
	if (value <= m_colorSlider->minimum())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_colorSlider->setValue(value - 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorSliderBar::onAdd()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int value = m_colorSlider->value();
Toshihiro Shimizu 890ddd
	if (value >= m_colorSlider->maximum())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_colorSlider->setValue(value + 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ChannelLineEdit  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ChannelLineEdit::mousePressEvent(QMouseEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	IntLineEdit::mousePressEvent(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_isEditing) {
Toshihiro Shimizu 890ddd
		selectAll();
Toshihiro Shimizu 890ddd
		m_isEditing = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ChannelLineEdit::focusOutEvent(QFocusEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	IntLineEdit::focusOutEvent(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_isEditing = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ChannelLineEdit::paintEvent(QPaintEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	IntLineEdit::paintEvent(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isEditing) {
Toshihiro Shimizu 890ddd
		QPainter p(this);
Toshihiro Shimizu 890ddd
		p.setPen(Qt::yellow);
Toshihiro Shimizu 890ddd
		p.drawRect(rect().adjusted(0, 0, -1, -1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ColorChannelControl  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ColorChannelControl::ColorChannelControl(
Toshihiro Shimizu 890ddd
	ColorChannel channel, QWidget *parent)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_channel(channel), m_value(0), m_signalEnabled(true)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static const char *names[] = {"R", "G", "B", "M", "H", "S", "V"};
Toshihiro Shimizu 890ddd
	assert(0 <= (int)m_channel && (int)m_channel < 7);
Toshihiro Shimizu 890ddd
	QString text = names[(int)m_channel];
Toshihiro Shimizu 890ddd
	m_label = new QLabel(text, this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int minValue = 0;
Toshihiro Shimizu 890ddd
	int maxValue = 0;
Toshihiro Shimizu 890ddd
	if (m_channel < 4) // RGBA
Toshihiro Shimizu 890ddd
		maxValue = 255;
Toshihiro Shimizu 890ddd
	else if (m_channel == 4) // H
Toshihiro Shimizu 890ddd
		maxValue = 359;
Toshihiro Shimizu 890ddd
	else // SV
Toshihiro Shimizu 890ddd
		maxValue = 100;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_field = new ChannelLineEdit(this, 0, minValue, maxValue);
Toshihiro Shimizu 890ddd
	m_slider = new ColorSlider(Qt::Horizontal, this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//buttons to increment/decrement the values by 1
Toshihiro Shimizu 890ddd
	QPushButton *addButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
	QPushButton *subButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_slider->setValue(0);
Toshihiro Shimizu 890ddd
	m_slider->setChannel(m_channel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_label->setObjectName("colorSliderLabel");
Toshihiro Shimizu 890ddd
	m_label->setFixedWidth(11);
Toshihiro Shimizu 890ddd
	m_label->setMinimumHeight(7);
Toshihiro Shimizu 890ddd
	m_label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_field->setObjectName("colorSliderField");
Toshihiro Shimizu 890ddd
	m_field->setFixedWidth(fontMetrics().width('0') * 6 + 5);
Toshihiro Shimizu 890ddd
	m_field->setMinimumHeight(7);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addButton->setObjectName("colorSliderAddButton");
Toshihiro Shimizu 890ddd
	subButton->setObjectName("colorSliderSubButton");
Toshihiro Shimizu 890ddd
	addButton->setFixedWidth(18);
Toshihiro Shimizu 890ddd
	subButton->setFixedWidth(18);
Toshihiro Shimizu 890ddd
	addButton->setMinimumHeight(7);
Toshihiro Shimizu 890ddd
	subButton->setMinimumHeight(7);
Toshihiro Shimizu 890ddd
	addButton->setFlat(true);
Toshihiro Shimizu 890ddd
	subButton->setFlat(true);
Toshihiro Shimizu 890ddd
	addButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
Toshihiro Shimizu 890ddd
	subButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
Toshihiro Shimizu 890ddd
	addButton->setAutoRepeat(true);
Toshihiro Shimizu 890ddd
	subButton->setAutoRepeat(true);
Toshihiro Shimizu 890ddd
	addButton->setAutoRepeatInterval(25);
Toshihiro Shimizu 890ddd
	subButton->setAutoRepeatInterval(25);
Toshihiro Shimizu 890ddd
	addButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	subButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QHBoxLayout *mainLayout = new QHBoxLayout(this);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(0);
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(1);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_label, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(2);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_field, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(2);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(subButton, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_slider, 1);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(addButton, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = connect(m_field, SIGNAL(editingFinished()), this, SLOT(onFieldChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_slider, SIGNAL(sliderReleased()), this, SLOT(onSliderReleased()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(addButton, SIGNAL(clicked()), this, SLOT(onAddButtonClicked()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(subButton, SIGNAL(clicked()), this, SLOT(onSubButtonClicked()));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::onAddButtonClicked()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_slider->setValue(m_slider->value() + 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::onSubButtonClicked()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_slider->setValue(m_slider->value() - 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::setColor(const ColorModel &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_color = color;
Toshihiro Shimizu 890ddd
	m_slider->setColor(color);
Toshihiro Shimizu 890ddd
	int value = color.getValue(m_channel);
Toshihiro Shimizu 890ddd
	if (m_value != value) {
Toshihiro Shimizu 890ddd
		bool signalEnabled = m_signalEnabled;
Toshihiro Shimizu 890ddd
		m_signalEnabled = false;
Toshihiro Shimizu 890ddd
		m_value = value;
Toshihiro Shimizu 890ddd
		m_field->setText(QString::number(value));
Toshihiro Shimizu 890ddd
		m_slider->setValue(value);
Toshihiro Shimizu 890ddd
		m_signalEnabled = signalEnabled;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::onFieldChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int value = m_field->text().toInt();
Toshihiro Shimizu 890ddd
	if (m_value == value)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_value = value;
Toshihiro Shimizu 890ddd
	m_slider->setValue(value);
Toshihiro Shimizu 890ddd
	if (m_signalEnabled) {
Toshihiro Shimizu 890ddd
		m_color.setValue(m_channel, value);
Toshihiro Shimizu 890ddd
		emit colorChanged(m_color, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::onSliderChanged(int value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_value == value)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_value = value;
Toshihiro Shimizu 890ddd
	m_field->setText(QString::number(value));
Toshihiro Shimizu 890ddd
	if (m_signalEnabled) {
Toshihiro Shimizu 890ddd
		m_color.setValue(m_channel, value);
Toshihiro Shimizu 890ddd
		emit colorChanged(m_color, true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorChannelControl::onSliderReleased()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	emit colorChanged(m_color, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    StyleEditorPage  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StyleEditorPage::StyleEditorPage(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QFrame(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// It is necessary for the style sheets
Toshihiro Shimizu 890ddd
	setObjectName("styleEditorPage");
Toshihiro Shimizu 890ddd
	setFrameStyle(QFrame::StyledPanel);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    ColorParameterSelector  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ColorParameterSelector::ColorParameterSelector(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_index(-1), m_chipSize(21, 21), m_chipOrigin(0, 1), m_chipDelta(21, 0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorParameterSelector::paintEvent(QPaintEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_colors.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	QPainter p(this);
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	QRect currentChipRect = QRect();
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)m_colors.size(); i++) {
Toshihiro Shimizu 890ddd
		QRect chipRect(m_chipOrigin + i * m_chipDelta, m_chipSize);
Toshihiro Shimizu 890ddd
		p.fillRect(chipRect, m_colors[i]);
Toshihiro Shimizu 890ddd
		if (i == m_index)
Toshihiro Shimizu 890ddd
			currentChipRect = chipRect;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	// Current index border
Toshihiro Shimizu 890ddd
	if (!currentChipRect.isEmpty()) {
Toshihiro Shimizu 890ddd
		p.setPen(QColor(199, 202, 50));
Toshihiro Shimizu 890ddd
		p.drawRect(currentChipRect.adjusted(0, 0, -1, -1));
Toshihiro Shimizu 890ddd
		p.setPen(Qt::white);
Toshihiro Shimizu 890ddd
		p.drawRect(currentChipRect.adjusted(1, 1, -2, -2));
Toshihiro Shimizu 890ddd
		p.setPen(Qt::black);
Toshihiro Shimizu 890ddd
		p.drawRect(currentChipRect.adjusted(2, 2, -3, -3));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorParameterSelector::setStyle(const TColorStyle &style)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int count = style.getColorParamCount();
Toshihiro Shimizu 890ddd
	if (count <= 1) {
Toshihiro Shimizu 890ddd
		clear();
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (m_colors.size() != count) {
Toshihiro Shimizu 890ddd
		m_index = 0;
Toshihiro Shimizu 890ddd
		m_colors.resize(count);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
		TPixel32 color = style.getColorParamValue(i);
Toshihiro Shimizu 890ddd
		m_colors[i] = QColor(color.r, color.g, color.b, color.m);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorParameterSelector::clear()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_colors.size() != 0)
Toshihiro Shimizu 890ddd
		m_colors.clear();
Toshihiro Shimizu 890ddd
	m_index = -1;
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ColorParameterSelector::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPoint pos = event->pos() - m_chipOrigin;
Toshihiro Shimizu 890ddd
	int index = pos.x() / m_chipDelta.x();
Toshihiro Shimizu 890ddd
	QRect chipRect(index * m_chipDelta, m_chipSize);
Toshihiro Shimizu 890ddd
	if (chipRect.contains(pos)) {
Toshihiro Shimizu 890ddd
		m_index = index;
Toshihiro Shimizu 890ddd
		emit colorParamChanged();
Toshihiro Shimizu 890ddd
		update();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    PlainColorPage  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PlainColorPage::PlainColorPage(QWidget *parent)
Toshihiro Shimizu 890ddd
	: StyleEditorPage(parent), m_color(), m_signalEnabled(true)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_squaredColorWheel = new SquaredColorWheel(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_verticalSlider = new ColorSliderBar(this, Qt::Vertical);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_hexagonalColorWheel = new HexagonalColorWheel(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	QButtonGroup *channelButtonGroup = new QButtonGroup();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i<7; i++)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (i != (int)eAlpha)
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			QRadioButton *button = new QRadioButton(this);
Toshihiro Shimizu 890ddd
			m_modeButtons[i] = button;
Toshihiro Shimizu 890ddd
			if (i == 0) button->setChecked(true);
Toshihiro Shimizu 890ddd
			channelButtonGroup->addButton(button, i);
Toshihiro Shimizu 890ddd
			//slidersLayout->addWidget(button,i,0); 
Toshihiro Shimizu 890ddd
			//とりあえず隠す
Toshihiro Shimizu 890ddd
			m_modeButtons[i]->hide();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			m_modeButtons[i] = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_channelControls[i] = new ColorChannelControl((ColorChannel)i, this);
Toshihiro Shimizu 890ddd
		m_channelControls[i]->setColor(m_color);
Toshihiro Shimizu 890ddd
		bool ret = connect(m_channelControls[i], SIGNAL(colorChanged(const ColorModel &, bool)),
Toshihiro Shimizu 890ddd
			this, SLOT(onControlChanged(const ColorModel &, bool)));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 7; i++) {
Toshihiro Shimizu 890ddd
		m_channelControls[i] = new ColorChannelControl((ColorChannel)i, this);
Toshihiro Shimizu 890ddd
		m_channelControls[i]->setColor(m_color);
Toshihiro Shimizu 890ddd
		bool ret = connect(m_channelControls[i], SIGNAL(colorChanged(const ColorModel &, bool)),
Toshihiro Shimizu 890ddd
						   this, SLOT(onControlChanged(const ColorModel &, bool)));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPushButton *wheelShowButton = new QPushButton(tr("Wheel"), this);
Toshihiro Shimizu 890ddd
	QPushButton *hsvShowButton = new QPushButton(tr("HSV"), this);
Toshihiro Shimizu 890ddd
	QPushButton *matteShowButton = new QPushButton(tr("Matte"), this);
Toshihiro Shimizu 890ddd
	QPushButton *rgbShowButton = new QPushButton(tr("RGB"), this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QFrame *wheelFrame = new QFrame(this);
Toshihiro Shimizu 890ddd
	QFrame *hsvFrame = new QFrame(this);
Toshihiro Shimizu 890ddd
	QFrame *matteFrame = new QFrame(this);
Toshihiro Shimizu 890ddd
	QFrame *rgbFrame = new QFrame(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QFrame *slidersContainer = new QFrame(this);
Toshihiro Shimizu 890ddd
	QSplitter *vSplitter = new QSplitter(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//プロパティの設定
Toshihiro Shimizu 890ddd
	//channelButtonGroup->setExclusive(true);
Toshihiro Shimizu 890ddd
	wheelShowButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	hsvShowButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	matteShowButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	rgbShowButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	wheelShowButton->setMinimumWidth(30);
Toshihiro Shimizu 890ddd
	hsvShowButton->setMinimumWidth(30);
Toshihiro Shimizu 890ddd
	matteShowButton->setMinimumWidth(30);
Toshihiro Shimizu 890ddd
	rgbShowButton->setMinimumWidth(30);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wheelFrame->setObjectName("PlainColorPageParts");
Toshihiro Shimizu 890ddd
	hsvFrame->setObjectName("PlainColorPageParts");
Toshihiro Shimizu 890ddd
	matteFrame->setObjectName("PlainColorPageParts");
Toshihiro Shimizu 890ddd
	rgbFrame->setObjectName("PlainColorPageParts");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wheelShowButton->setChecked(true);
Toshihiro Shimizu 890ddd
	wheelShowButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	hsvShowButton->setChecked(true);
Toshihiro Shimizu 890ddd
	hsvShowButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	matteShowButton->setChecked(true);
Toshihiro Shimizu 890ddd
	matteShowButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	rgbShowButton->setChecked(true);
Toshihiro Shimizu 890ddd
	rgbShowButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vSplitter->setOrientation(Qt::Vertical);
Toshihiro Shimizu 890ddd
	vSplitter->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_verticalSlider->hide();
Toshihiro Shimizu 890ddd
	//m_squaredColorWheel->hide();
Toshihiro Shimizu 890ddd
	//m_ghibliColorWheel->hide();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//layout
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(0);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QHBoxLayout *showButtonLayout = new QHBoxLayout();
Toshihiro Shimizu 890ddd
		showButtonLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		showButtonLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			showButtonLayout->addWidget(wheelShowButton, 1);
Toshihiro Shimizu 890ddd
			showButtonLayout->addWidget(hsvShowButton, 1);
Toshihiro Shimizu 890ddd
			showButtonLayout->addWidget(matteShowButton, 1);
Toshihiro Shimizu 890ddd
			showButtonLayout->addWidget(rgbShowButton, 1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(showButtonLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QHBoxLayout *wheelLayout = new QHBoxLayout();
Toshihiro Shimizu 890ddd
		wheelLayout->setMargin(5);
Toshihiro Shimizu 890ddd
		wheelLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			wheelLayout->addWidget(m_hexagonalColorWheel);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		wheelFrame->setLayout(wheelLayout);
Toshihiro Shimizu 890ddd
		vSplitter->addWidget(wheelFrame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QVBoxLayout *slidersLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
		slidersLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		slidersLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			QVBoxLayout *hsvLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
			hsvLayout->setMargin(4);
Toshihiro Shimizu 890ddd
			hsvLayout->setSpacing(4);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				hsvLayout->addWidget(m_channelControls[eHue]);
Toshihiro Shimizu 890ddd
				hsvLayout->addWidget(m_channelControls[eSaturation]);
Toshihiro Shimizu 890ddd
				hsvLayout->addWidget(m_channelControls[eValue]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			hsvFrame->setLayout(hsvLayout);
Toshihiro Shimizu 890ddd
			slidersLayout->addWidget(hsvFrame, 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QVBoxLayout *matteLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
			matteLayout->setMargin(4);
Toshihiro Shimizu 890ddd
			matteLayout->setSpacing(4);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				matteLayout->addWidget(m_channelControls[eAlpha]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			matteFrame->setLayout(matteLayout);
Toshihiro Shimizu 890ddd
			slidersLayout->addWidget(matteFrame, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QVBoxLayout *rgbLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
			rgbLayout->setMargin(4);
Toshihiro Shimizu 890ddd
			rgbLayout->setSpacing(4);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				rgbLayout->addWidget(m_channelControls[eRed]);
Toshihiro Shimizu 890ddd
				rgbLayout->addWidget(m_channelControls[eGreen]);
Toshihiro Shimizu 890ddd
				rgbLayout->addWidget(m_channelControls[eBlue]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			rgbFrame->setLayout(rgbLayout);
Toshihiro Shimizu 890ddd
			slidersLayout->addWidget(rgbFrame, 3);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		slidersContainer->setLayout(slidersLayout);
Toshihiro Shimizu 890ddd
		vSplitter->addWidget(slidersContainer);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(vSplitter, 1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QList<int> list;
Toshihiro Shimizu 890ddd
	list << rect().height() / 2 << rect().height() / 2;
Toshihiro Shimizu 890ddd
	vSplitter->setSizes(list);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//connect(m_squaredColorWheel, SIGNAL(colorChanged(const ColorModel &, bool)),
Toshihiro Shimizu 890ddd
	//	this, SLOT(onWheelChanged(const ColorModel &, bool)));
Toshihiro Shimizu 890ddd
	connect(m_hexagonalColorWheel, SIGNAL(colorChanged(const ColorModel &, bool)),
Toshihiro Shimizu 890ddd
			this, SLOT(onWheelChanged(const ColorModel &, bool)));
Toshihiro Shimizu 890ddd
	//m_verticalSlider->setMaximumSize(20,150);
Toshihiro Shimizu 890ddd
	//connect(m_verticalSlider, SIGNAL(valueChanged(int)), this, SLOT(onWheelSliderChanged(int)));
Toshihiro Shimizu 890ddd
	//connect(m_verticalSlider, SIGNAL(valueChanged()), this, SLOT(onWheelSliderReleased()));
Toshihiro Shimizu 890ddd
	//connect( m_verticalSlider,		SIGNAL(sliderReleased()),	this, SLOT(onWheelSliderReleased()));
Toshihiro Shimizu 890ddd
	//connect(channelButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(setWheelChannel(int)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Show/Hideトグルボタン
Toshihiro Shimizu 890ddd
	connect(wheelShowButton, SIGNAL(toggled(bool)), wheelFrame, SLOT(setVisible(bool)));
Toshihiro Shimizu 890ddd
	connect(hsvShowButton, SIGNAL(toggled(bool)), hsvFrame, SLOT(setVisible(bool)));
Toshihiro Shimizu 890ddd
	connect(matteShowButton, SIGNAL(toggled(bool)), matteFrame, SLOT(setVisible(bool)));
Toshihiro Shimizu 890ddd
	connect(rgbShowButton, SIGNAL(toggled(bool)), rgbFrame, SLOT(setVisible(bool)));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlainColorPage::resizeEvent(QResizeEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int w = width();
Toshihiro Shimizu 890ddd
	int h = height();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int parentW = parentWidget()->width();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlainColorPage::updateControls()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < 7; i++) {
Toshihiro Shimizu 890ddd
		m_channelControls[i]->setColor(m_color);
Toshihiro Shimizu 890ddd
		m_channelControls[i]->update();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	m_squaredColorWheel->setColor(m_color);
Toshihiro Shimizu 890ddd
	m_squaredColorWheel->update();
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_hexagonalColorWheel->setColor(m_color);
Toshihiro Shimizu 890ddd
	m_hexagonalColorWheel->update();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  bool signalsBlocked = m_verticalSlider->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_verticalSlider->setColor(m_color);
Toshihiro Shimizu 890ddd
  int value = m_color.getValue(m_verticalSlider->getChannel());
Toshihiro Shimizu 890ddd
  m_verticalSlider->setValue(value);
Toshihiro Shimizu 890ddd
	m_verticalSlider->update();
Toshihiro Shimizu 890ddd
  m_verticalSlider->blockSignals(signalsBlocked);
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlainColorPage::setColor(const TColorStyle &style, int colorParameterIndex)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 newPixel = style.getColorParamValue(colorParameterIndex);
Toshihiro Shimizu 890ddd
	if (m_color.getTPixel() == newPixel)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	bool oldSignalEnabled = m_signalEnabled;
Toshihiro Shimizu 890ddd
	m_signalEnabled = false;
Toshihiro Shimizu 890ddd
	m_color.setTPixel(newPixel);
Toshihiro Shimizu 890ddd
	updateControls();
Toshihiro Shimizu 890ddd
	m_signalEnabled = oldSignalEnabled;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void PlainColorPage::setWheelChannel(int channel)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0<=channel && channel<7);
Toshihiro Shimizu 890ddd
	m_squaredColorWheel->setChannel(channel);
Toshihiro Shimizu 890ddd
  bool signalsBlocked = m_verticalSlider->signalsBlocked();
Toshihiro Shimizu 890ddd
	m_verticalSlider->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_verticalSlider->setChannel((ColorChannel)channel);
Toshihiro Shimizu 890ddd
  m_verticalSlider->setRange(0,ChannelMaxValues[channel]);
Toshihiro Shimizu 890ddd
  m_verticalSlider->setValue(m_color.getValue((ColorChannel)channel));
Toshihiro Shimizu 890ddd
  m_verticalSlider->update();
Toshihiro Shimizu 890ddd
  m_verticalSlider->blockSignals(signalsBlocked);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlainColorPage::onControlChanged(const ColorModel &color, bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!(m_color == color)) {
Toshihiro Shimizu 890ddd
		m_color = color;
Toshihiro Shimizu 890ddd
		updateControls();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_signalEnabled)
Toshihiro Shimizu 890ddd
		emit colorChanged(m_color, isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlainColorPage::onWheelChanged(const ColorModel &color, bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!(m_color == color)) {
Toshihiro Shimizu 890ddd
		m_color = color;
Toshihiro Shimizu 890ddd
		updateControls();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (m_signalEnabled)
Toshihiro Shimizu 890ddd
		emit colorChanged(m_color, isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void PlainColorPage::onWheelSliderChanged(int value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if(m_color.getValue(m_verticalSlider->getChannel()) == value) return;
Toshihiro Shimizu 890ddd
	m_color.setValue(m_verticalSlider->getChannel(), value);
Toshihiro Shimizu 890ddd
  updateControls();
Toshihiro Shimizu 890ddd
  if(m_signalEnabled)
Toshihiro Shimizu 890ddd
    emit colorChanged(m_color, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void PlainColorPage::onWheelSliderReleased()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  emit colorChanged(m_color, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    StyleChooserPage  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath StyleChooserPage::m_rootPath;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StyleChooserPage::StyleChooserPage(QWidget *parent)
Toshihiro Shimizu 890ddd
	: StyleEditorPage(parent), m_chipOrigin(5, 3), m_chipSize(25, 25), m_chipPerRow(0), m_currentIndex(-1)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleChooserPage::paintEvent(QPaintEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (loadIfNeeded())
Toshihiro Shimizu 890ddd
		computeSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPainter p(this);
Toshihiro Shimizu 890ddd
	//p.setRenderHint(QPainter::SmoothPixmapTransform);
Toshihiro Shimizu 890ddd
	if (m_chipPerRow == 0 || getChipCount() == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int w = parentWidget()->width();
Toshihiro Shimizu 890ddd
	int chipLx = m_chipSize.width(), chipLy = m_chipSize.height();
Toshihiro Shimizu 890ddd
	int nX = m_chipPerRow;
Toshihiro Shimizu 890ddd
	int nY = (getChipCount() + m_chipPerRow - 1) / m_chipPerRow;
Toshihiro Shimizu 890ddd
	int x0 = m_chipOrigin.x();
Toshihiro Shimizu 890ddd
	int y0 = m_chipOrigin.y();
Toshihiro Shimizu 890ddd
	int i, j;
Toshihiro Shimizu 890ddd
	QRect currentIndexRect = QRect();
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	for (i = 0; i < nY; i++)
Toshihiro Shimizu 890ddd
		for (j = 0; j < nX; j++) {
Toshihiro Shimizu 890ddd
			QRect rect(x0 + chipLx * j + 2, y0 + chipLy * i + 2, chipLx, chipLy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			drawChip(p, rect, count);
Toshihiro Shimizu 890ddd
			p.setPen(Qt::black);
Toshihiro Shimizu 890ddd
			p.drawRect(rect);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (m_currentIndex == count)
Toshihiro Shimizu 890ddd
				currentIndexRect = rect;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			count++;
Toshihiro Shimizu 890ddd
			if (count >= getChipCount())
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!currentIndexRect.isEmpty()) {
Toshihiro Shimizu 890ddd
		// Draw the curentIndex border
Toshihiro Shimizu 890ddd
		p.setPen(Qt::white);
Toshihiro Shimizu 890ddd
		p.drawRect(currentIndexRect);
Toshihiro Shimizu 890ddd
		p.setPen(QColor(199, 202, 50));
Toshihiro Shimizu 890ddd
		p.drawRect(currentIndexRect.adjusted(1, 1, -1, -1));
Toshihiro Shimizu 890ddd
		p.setPen(Qt::white);
Toshihiro Shimizu 890ddd
		p.drawRect(currentIndexRect.adjusted(2, 2, -2, -2));
Toshihiro Shimizu 890ddd
		p.setPen(Qt::black);
Toshihiro Shimizu 890ddd
		p.drawRect(currentIndexRect.adjusted(3, 3, -3, -3));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleChooserPage::computeSize()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int w = width();
Toshihiro Shimizu 890ddd
	m_chipPerRow = (w - 15) / m_chipSize.width();
Toshihiro Shimizu 890ddd
	int rowCount = 0;
Toshihiro Shimizu 890ddd
	if (m_chipPerRow != 0)
Toshihiro Shimizu 890ddd
		rowCount = (getChipCount() + m_chipPerRow - 1) / m_chipPerRow;
Toshihiro Shimizu 890ddd
	setMinimumSize(5 * m_chipSize.width(), rowCount * m_chipSize.height() + 10);
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int StyleChooserPage::posToIndex(const QPoint &pos) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_chipPerRow == 0)
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int x = (pos.x() - m_chipOrigin.x() - 2) / m_chipSize.width();
Toshihiro Shimizu 890ddd
	if (x >= m_chipPerRow)
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int y = (pos.y() - m_chipOrigin.y() - 2) / m_chipSize.height();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int index = x + m_chipPerRow * y;
Toshihiro Shimizu 890ddd
	if (index < 0 || index >= getChipCount())
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return index;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleChooserPage::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPoint pos = event->pos();
Toshihiro Shimizu 890ddd
	int currentIndex = posToIndex(pos);
Toshihiro Shimizu 890ddd
	if (currentIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_currentIndex = currentIndex;
Toshihiro Shimizu 890ddd
	onSelect(currentIndex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleChooserPage::mouseReleaseEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//TOGLIERE
Toshihiro Shimizu 890ddd
void StyleChooserPage::setRootPath(const TFilePath &rootPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_rootPath = rootPath;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    CustomStyleChooser  definition
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class CustomStyleChooserPage : public StyleChooserPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	CustomStyleChooserPage(QWidget *parent = 0)
Toshihiro Shimizu 890ddd
		: StyleChooserPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static CustomStyleManager *styleManager();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool event(QEvent *e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void showEvent(QShowEvent *)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		connect(styleManager(), SIGNAL(patternAdded()), this, SLOT(computeSize()));
Toshihiro Shimizu 890ddd
		styleManager()->loadItems();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void hideEvent(QHideEvent *)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		disconnect(styleManager(), SIGNAL(patternAdded()), this, SLOT(computeSize()));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bool loadIfNeeded() { return false; } // serve?
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
    if(!m_loaded) {loadItems(); m_loaded=true;return true;}
Toshihiro Shimizu 890ddd
    else return false;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getChipCount() const { return styleManager()->getPatternCount(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawChip(QPainter &p, QRect rect, int index)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		assert(0 <= index && index < getChipCount());
Toshihiro Shimizu 890ddd
		CustomStyleManager::PatternData pattern =
Toshihiro Shimizu 890ddd
			styleManager()->getPattern(index);
Toshihiro Shimizu 890ddd
		p.drawImage(rect, *pattern.m_image);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void onSelect(int index);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CustomStyleManager *CustomStyleChooserPage::styleManager()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static const QString filters("*.pli *.tif *.png *.tga *.tiff *.sgi *.rgb *.pct *.pic");
Toshihiro Shimizu 890ddd
	static CustomStyleManager theManager(TFilePath("custom styles"), filters);
Toshihiro Shimizu 890ddd
	return &theManager;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool CustomStyleChooserPage::event(QEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//Intercept tooltip events
Toshihiro Shimizu 890ddd
	if (e->type() != QEvent::ToolTip)
Toshihiro Shimizu 890ddd
		return StyleChooserPage::event(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//see StyleChooserPage::paintEvent
Toshihiro Shimizu 890ddd
	CustomStyleManager *manager = styleManager();
Toshihiro Shimizu 890ddd
	QHelpEvent *he = static_cast<QHelpEvent *>(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int chipIdx = posToIndex(he->pos()), chipCount = manager->getPatternCount();
Toshihiro Shimizu 890ddd
	if (chipIdx < 0 || chipIdx >= chipCount)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CustomStyleManager::PatternData pattern = manager->getPattern(chipIdx);
Toshihiro Shimizu 890ddd
	QToolTip::showText(he->globalPos(), QString::fromStdString(pattern.m_patternName));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void CustomStyleChooserPage::onSelect(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index < 0 || index >= getChipCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CustomStyleManager::PatternData pattern =
Toshihiro Shimizu 890ddd
		styleManager()->getPattern(index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_currentIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string name = pattern.m_patternName;
Toshihiro Shimizu 890ddd
	if (pattern.m_isVector) {
Toshihiro Shimizu 890ddd
		TVectorImagePatternStrokeStyle cs(name);
Toshihiro Shimizu 890ddd
		emit styleSelected(cs);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		TRasterImagePatternStrokeStyle cs(name);
Toshihiro Shimizu 890ddd
		emit styleSelected(cs);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    VectorBrushStyleChooser  definition
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class VectorBrushStyleChooserPage : public StyleChooserPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	VectorBrushStyleChooserPage(QWidget *parent = 0)
Toshihiro Shimizu 890ddd
		: StyleChooserPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_chipSize = QSize(60, 25);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static CustomStyleManager *styleManager();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool event(QEvent *e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void showEvent(QShowEvent *)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		connect(styleManager(), SIGNAL(patternAdded()), this, SLOT(computeSize()));
Toshihiro Shimizu 890ddd
		styleManager()->loadItems();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void hideEvent(QHideEvent *)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		disconnect(styleManager(), SIGNAL(patternAdded()), this, SLOT(computeSize()));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bool loadIfNeeded() { return false; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getChipCount() const { return styleManager()->getPatternCount() + 1; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawChip(QPainter &p, QRect rect, int index);
Toshihiro Shimizu 890ddd
	void onSelect(int index);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CustomStyleManager *VectorBrushStyleChooserPage::styleManager()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static CustomStyleManager theManager(TFilePath("vector brushes"), "*.pli", QSize(60, 25));
Toshihiro Shimizu 890ddd
	return &theManager;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool VectorBrushStyleChooserPage::event(QEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//Intercept tooltip events
Toshihiro Shimizu 890ddd
	if (e->type() != QEvent::ToolTip)
Toshihiro Shimizu 890ddd
		return StyleChooserPage::event(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//see StyleChooserPage::paintEvent
Toshihiro Shimizu 890ddd
	CustomStyleManager *manager = styleManager();
Toshihiro Shimizu 890ddd
	QHelpEvent *he = static_cast<QHelpEvent *>(e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int chipIdx = posToIndex(he->pos()), chipCount = getChipCount();
Toshihiro Shimizu 890ddd
	if (chipIdx < 0 || chipIdx >= chipCount)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (chipIdx > 0) {
Toshihiro Shimizu 890ddd
		CustomStyleManager::PatternData pattern = manager->getPattern(chipIdx - 1);
Toshihiro Shimizu 890ddd
		QToolTip::showText(he->globalPos(), QString::fromStdString(pattern.m_patternName));
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		QToolTip::showText(he->globalPos(), tr("Plain color"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void VectorBrushStyleChooserPage::drawChip(QPainter &p, QRect rect, int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		static QImage noSpecialStyleImage(":Resources/no_vectorbrush.png");
Toshihiro Shimizu 890ddd
		p.drawImage(rect, noSpecialStyleImage);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		assert(0 <= index && index < getChipCount());
Toshihiro Shimizu 890ddd
		CustomStyleManager::PatternData pattern =
Toshihiro Shimizu 890ddd
			styleManager()->getPattern(index - 1);
Toshihiro Shimizu 890ddd
		p.drawImage(rect, *pattern.m_image);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void VectorBrushStyleChooserPage::onSelect(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index < 0 || index >= getChipCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (index > 0) {
Toshihiro Shimizu 890ddd
		--index;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CustomStyleManager::PatternData pattern =
Toshihiro Shimizu 890ddd
			styleManager()->getPattern(index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_currentIndex < 0)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		string name = pattern.m_patternName;
Toshihiro Shimizu 890ddd
		assert(pattern.m_isVector);
Toshihiro Shimizu 890ddd
		if (!pattern.m_isVector)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TVectorBrushStyle cs(name);
Toshihiro Shimizu 890ddd
		emit styleSelected(cs);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle cs(TPixel32::Black);
Toshihiro Shimizu 890ddd
		emit styleSelected(cs);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    TextureStyleChooser  definition
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct Texture {
Toshihiro Shimizu 890ddd
	TRasterP m_raster;
Toshihiro Shimizu 890ddd
	QString m_name;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TextureStyleChooserPage : public StyleChooserPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static vector<Texture> m_textures;
Toshihiro Shimizu 890ddd
	static bool m_loaded;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TextureStyleChooserPage(QWidget *parent = 0)
Toshihiro Shimizu 890ddd
		: StyleChooserPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool loadIfNeeded()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!m_loaded) {
Toshihiro Shimizu 890ddd
			loadItems();
Toshihiro Shimizu 890ddd
			m_loaded = true;
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getChipCount() const { return m_textures.size(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void loadTexture(const TFilePath &fp);
Toshihiro Shimizu 890ddd
	static void loadItems();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawChip(QPainter &p, QRect rect, int index)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		assert(0 <= index && index < getChipCount());
Toshihiro Shimizu 890ddd
		p.drawImage(rect, rasterToQImage(m_textures[index].m_raster));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onSelect(int index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool event(QEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
vector<Texture> TextureStyleChooserPage::m_textures;
Toshihiro Shimizu 890ddd
bool TextureStyleChooserPage::m_loaded(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TextureStyleChooserPage::loadTexture(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (fp == TFilePath()) {
Toshihiro Shimizu 890ddd
		TRaster32P ras(25, 25);
Toshihiro Shimizu 890ddd
		TTextureStyle::fillCustomTextureIcon(ras);
Toshihiro Shimizu 890ddd
		//ras->fill(TPixel::Blue);
Toshihiro Shimizu 890ddd
		Texture customText = {
Toshihiro Shimizu 890ddd
			ras,
Toshihiro Shimizu 890ddd
			QString("")};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_textures.push_back(customText);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRasterP ras;
Toshihiro Shimizu 890ddd
	TImageReader::load(fp, ras);
Toshihiro Shimizu 890ddd
	if (!ras || ras->getLx() < 2 || ras->getLy() < 2)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P ras32 = ras;
Toshihiro Shimizu 890ddd
	if (!ras32)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimension d(2, 2);
Toshihiro Shimizu 890ddd
	while (d.lx < 256 && d.lx * 2 <= ras32->getLx())
Toshihiro Shimizu 890ddd
		d.lx *= 2;
Toshihiro Shimizu 890ddd
	while (d.ly < 256 && d.ly * 2 <= ras32->getLy())
Toshihiro Shimizu 890ddd
		d.ly *= 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P texture;
Toshihiro Shimizu 890ddd
	if (d == ras32->getSize())
Toshihiro Shimizu 890ddd
		texture = ras32;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		texture = TRaster32P(d);
Toshihiro Shimizu 890ddd
		TScale sc((double)texture->getLx() / ras32->getLx(), (double)texture->getLy() / ras32->getLy());
Toshihiro Shimizu 890ddd
		TRop::resample(texture, ras32, sc);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Texture text = {
Toshihiro Shimizu 890ddd
		texture,
Toshihiro Shimizu 890ddd
		QString::fromStdWString(fp.getLevelNameW())};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_textures.push_back(text);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TextureStyleChooserPage::loadItems()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_textures.clear();
Toshihiro Shimizu 890ddd
	if (getRootPath() == TFilePath())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFilePath texturePath = getRootPath() + "textures";
Toshihiro Shimizu 890ddd
	TFilePathSet fps;
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		fps = TSystem::readDirectory(texturePath);
Toshihiro Shimizu 890ddd
	} catch (...) {
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (fps.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	for (TFilePathSet::iterator it = fps.begin(); it != fps.end(); it++)
Toshihiro Shimizu 890ddd
		if (TFileType::getInfo(*it) == TFileType::RASTER_IMAGE) {
Toshihiro Shimizu 890ddd
			try {
Toshihiro Shimizu 890ddd
				loadTexture(*it);
Toshihiro Shimizu 890ddd
				++count;
Toshihiro Shimizu 890ddd
			} catch (...) {
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	loadTexture(TFilePath()); //custom texture
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TextureStyleChooserPage::onSelect(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < (int)m_textures.size());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TTextureStyle style(m_textures[index].m_raster,
Toshihiro Shimizu 890ddd
						TFilePath(m_textures[index].m_name.toStdWString()));
Toshihiro Shimizu 890ddd
	emit styleSelected(style);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TextureStyleChooserPage::event(QEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (e->type() == QEvent::ToolTip) {
Toshihiro Shimizu 890ddd
		QHelpEvent *helpEvent = dynamic_cast<QHelpEvent *>(e);
Toshihiro Shimizu 890ddd
		QString toolTip;
Toshihiro Shimizu 890ddd
		QPoint pos = helpEvent->pos();
Toshihiro Shimizu 890ddd
		int index = posToIndex(pos);
Toshihiro Shimizu 890ddd
		if (index >= 0 && index < (int)m_textures.size()) {
Toshihiro Shimizu 890ddd
			toolTip = m_textures[index].m_name;
Toshihiro Shimizu 890ddd
			QToolTip::showText(helpEvent->globalPos(), toolTip != QString() ? toolTip : "Custom Texture");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		e->accept();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return StyleChooserPage::event(e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    SpecialStyleChooser  definition
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SpecialStyleChooserPage : public StyleChooserPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static vector<pair<int, QImage *>> m_customStyles;
Toshihiro Shimizu 890ddd
	static bool m_loaded;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SpecialStyleChooserPage(QWidget *parent = 0, const TFilePath &rootDir = TFilePath())
Toshihiro Shimizu 890ddd
		: StyleChooserPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool loadIfNeeded()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!m_loaded) {
Toshihiro Shimizu 890ddd
			loadItems();
Toshihiro Shimizu 890ddd
			m_loaded = true;
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	int getChipCount() const { return m_customStyles.size(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void loadItems();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawChip(QPainter &p, QRect rect, int index);
Toshihiro Shimizu 890ddd
	void onSelect(int index);
Toshihiro Shimizu 890ddd
	bool event(QEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
vector<pair<int, QImage *>> SpecialStyleChooserPage::m_customStyles;
Toshihiro Shimizu 890ddd
bool SpecialStyleChooserPage::m_loaded(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpecialStyleChooserPage::loadItems()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	vector<int> tags;
Toshihiro Shimizu 890ddd
	TColorStyle::getAllTags(tags);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int chipCount = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int j = 0; j < (int)tags.size(); j++) {
Toshihiro Shimizu 890ddd
		int tagId = tags[j];
Toshihiro Shimizu 890ddd
		if (tagId == 3 ||	// solid color
Toshihiro Shimizu 890ddd
			tagId == 4 ||	// texture
Toshihiro Shimizu 890ddd
			tagId == 100 ||  // obsolete imagepattern id
Toshihiro Shimizu 890ddd
			tagId == 2000 || // imagepattern
Toshihiro Shimizu 890ddd
			tagId == 2800 || // imagepattern
Toshihiro Shimizu 890ddd
			tagId == 2001 || // cleanup
Toshihiro Shimizu 890ddd
			tagId == 2002 || // ??
Toshihiro Shimizu 890ddd
			tagId == 3000	// vector brush
Toshihiro Shimizu 890ddd
			)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TColorStyle *style = TColorStyle::create(tagId);
Toshihiro Shimizu 890ddd
		if (style->isRasterStyle()) {
Toshihiro Shimizu 890ddd
			delete style;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TDimension chipSize(getChipSize().width(), getChipSize().height());
Toshihiro Shimizu 890ddd
		QImage *image = new QImage(rasterToQImage(style->getIcon(chipSize), false));
Toshihiro Shimizu 890ddd
		m_customStyles.push_back(std::make_pair(tagId, image));
Toshihiro Shimizu 890ddd
		delete style;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpecialStyleChooserPage::drawChip(QPainter &p, QRect rect, int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		static QImage noSpecialStyleImage(":Resources/no_specialstyle.png");
Toshihiro Shimizu 890ddd
		p.drawImage(rect, noSpecialStyleImage);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		int j = index - 1;
Toshihiro Shimizu 890ddd
		if (0 <= j && j < (int)m_customStyles.size())
Toshihiro Shimizu 890ddd
			p.drawImage(rect, *m_customStyles[j].second);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			p.fillRect(rect, QBrush(QColor(255, 0, 0)));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpecialStyleChooserPage::onSelect(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < (int)m_customStyles.size());
Toshihiro Shimizu 890ddd
	TColorStyle *cs = 0;
Toshihiro Shimizu 890ddd
	if (m_currentIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		cs = new TSolidColorStyle(TPixel32::Black);
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		int j = index - 1;
Toshihiro Shimizu 890ddd
		assert(0 <= j && j < (int)m_customStyles.size());
Toshihiro Shimizu 890ddd
		int tagId = m_customStyles[j].first;
Toshihiro Shimizu 890ddd
		cs = TColorStyle::create(tagId);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	emit styleSelected(*cs);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool SpecialStyleChooserPage::event(QEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (e->type() == QEvent::ToolTip) {
Toshihiro Shimizu 890ddd
		QHelpEvent *helpEvent = dynamic_cast<QHelpEvent *>(e);
Toshihiro Shimizu 890ddd
		QString toolTip;
Toshihiro Shimizu 890ddd
		QPoint pos = helpEvent->pos();
Toshihiro Shimizu 890ddd
		int index = posToIndex(pos);
Toshihiro Shimizu 890ddd
		if (index == 0)
Toshihiro Shimizu 890ddd
			toolTip = tr("Plain color");
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			int j = index - 1;
Toshihiro Shimizu 890ddd
			if (0 <= j && j < (int)m_customStyles.size()) {
Toshihiro Shimizu 890ddd
				int tagId = m_customStyles[j].first;
Toshihiro Shimizu 890ddd
				TColorStyle *cs = TColorStyle::create(tagId);
Toshihiro Shimizu 890ddd
				if (cs) {
Toshihiro Shimizu 890ddd
					toolTip = cs->getDescription();
Toshihiro Shimizu 890ddd
					delete cs;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (toolTip != "")
Toshihiro Shimizu 890ddd
			QToolTip::showText(helpEvent->globalPos(), toolTip);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			QToolTip::hideText();
Toshihiro Shimizu 890ddd
		e->accept();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return StyleChooserPage::event(e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// SettingBox
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
SettingBox::SettingBox(QWidget *parent, int index)
Toshihiro Shimizu 890ddd
: QWidget(parent)
Toshihiro Shimizu 890ddd
, m_index(index)
Toshihiro Shimizu 890ddd
, m_style(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QHBoxLayout* hLayout = new QHBoxLayout(this);
Toshihiro Shimizu 890ddd
	hLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
	hLayout->setMargin(0);
Toshihiro Shimizu 890ddd
	hLayout->addSpacing(10);
Toshihiro Shimizu 890ddd
	m_name = new QLabel(this);
Toshihiro Shimizu 890ddd
	m_name->setFixedSize(82,20);
Toshihiro Shimizu 890ddd
	m_name->setStyleSheet("border: 0px;");
Toshihiro Shimizu 890ddd
	hLayout->addWidget(m_name,0);
Toshihiro Shimizu 890ddd
	m_doubleField = new DoubleField(this, true);
Toshihiro Shimizu 890ddd
	hLayout->addWidget(m_doubleField,1);
Toshihiro Shimizu 890ddd
	hLayout->addSpacing(10);
Toshihiro Shimizu 890ddd
	bool ret = connect(m_doubleField, SIGNAL(valueChanged(bool)), this, SLOT(onValueChanged(bool)));
Toshihiro Shimizu 890ddd
  assert(ret);
Toshihiro Shimizu 890ddd
	setLayout(hLayout);
Toshihiro Shimizu 890ddd
	setFixedHeight(22);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingBox::setParameters(TColorStyle* cs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if(!cs)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_style = cs;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if(cs->getParamCount() == 0 || m_index<0 || cs->getParamCount()<=m_index)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	QString paramName = cs->getParamNames(m_index);
Toshihiro Shimizu 890ddd
	m_name->setText(paramName);
Toshihiro Shimizu 890ddd
   double newValue = cs->getParamValue(TColorStyle::double_tag(), m_index);
Toshihiro Shimizu 890ddd
	double value = m_doubleField->getValue();
Toshihiro Shimizu 890ddd
	m_style = cs;
Toshihiro Shimizu 890ddd
	if(value != newValue)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		double min=0, max=1;
Toshihiro Shimizu 890ddd
		cs->getParamRange(m_index,min,max);
Toshihiro Shimizu 890ddd
		m_doubleField->setValues(newValue, min, max);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TCleanupStyle* cleanupStyle = dynamic_cast<TCleanupStyle*>(cs);
Toshihiro Shimizu 890ddd
	if(paramName == "Contrast" && cleanupStyle)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if(!cleanupStyle->isContrastEnabled())
Toshihiro Shimizu 890ddd
			m_doubleField->setEnabled(false);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			m_doubleField->setEnabled(true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingBox::setColorStyleParam(double value, bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  TColorStyle* style = m_style;
Toshihiro Shimizu 890ddd
  assert(style && m_index < style->getParamCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  double min = 0.0, max = 1.0;
Toshihiro Shimizu 890ddd
  style->getParamRange(m_index, min, max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  style->setParamValue(m_index, tcrop(value, min, max));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  emit valueChanged(*style, isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingBox::onValueChanged(bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if(!m_style || m_style->getParamCount() == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double value = m_doubleField->getValue();
Toshihiro Shimizu 890ddd
	if(isDragging && m_style->getParamValue(TColorStyle::double_tag(), m_index) == value)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setColorStyleParam(value, isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    SettingsPage  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SettingsPage::SettingsPage(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QScrollArea(parent), m_updating(false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setObjectName("styleEditorPage"); // It is necessary for the styleSheet
Toshihiro Shimizu 890ddd
	setFrameStyle(QFrame::StyledPanel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Toshihiro Shimizu 890ddd
	setWidgetResizable(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Build the scrolled widget
Toshihiro Shimizu 890ddd
	QFrame *paramsContainer = new QFrame(this);
Toshihiro Shimizu 890ddd
	setWidget(paramsContainer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QVBoxLayout *paramsContainerLayout = new QVBoxLayout(this);
Toshihiro Shimizu 890ddd
	paramsContainer->setLayout(paramsContainerLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Add a vertical layout to store the "autofill" checkbox widgets
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_autopaintToggleBox = new QWidget(this);
Toshihiro Shimizu 890ddd
		//box->setFixedHeight(22);
Toshihiro Shimizu 890ddd
		paramsContainerLayout->addWidget(m_autopaintToggleBox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QHBoxLayout *hLayout = new QHBoxLayout;
Toshihiro Shimizu 890ddd
		m_autopaintToggleBox->setLayout(hLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		hLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
		hLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		hLayout->addSpacing(98);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_autoFillCheckBox = new QCheckBox;
Toshihiro Shimizu 890ddd
		hLayout->addWidget(m_autoFillCheckBox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QLabel *label = new QLabel(StyleEditorGUI::SettingsPage::tr("Autopaint for Lines"));
Toshihiro Shimizu 890ddd
		hLayout->addWidget(label);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		hLayout->addStretch();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ret = connect(m_autoFillCheckBox, SIGNAL(stateChanged(int)),
Toshihiro Shimizu 890ddd
					  this, SLOT(onAutofillChanged()));
Toshihiro Shimizu 890ddd
		assert(ret);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Prepare the style parameters layout
Toshihiro Shimizu 890ddd
	m_paramsLayout = new QGridLayout;
Toshihiro Shimizu 890ddd
	paramsContainerLayout->addLayout(m_paramsLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	paramsContainerLayout->addStretch();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingsPage::enableAutopaintToggle(bool enabled)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_autopaintToggleBox->setVisible(enabled);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingsPage::setStyle(const TColorStyleP &editedStyle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct locals {
Toshihiro Shimizu 890ddd
		inline static void clearLayout(QLayout *layout)
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			QLayoutItem *item;
Toshihiro Shimizu 890ddd
			while ((item = layout->takeAt(0)) != 0) {
Toshihiro Shimizu 890ddd
				delete item->layout();
Toshihiro Shimizu 890ddd
				delete item->spacerItem();
Toshihiro Shimizu 890ddd
				delete item->widget();
Toshihiro Shimizu 890ddd
				delete item;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}; // locals
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// NOTE: Layout reubilds must be avoided whenever possible. In particular, be warned that this
Toshihiro Shimizu 890ddd
	// function may be invoked when signals emitted from this function are still "flying"...
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool clearLayout = m_editedStyle && !(editedStyle && typeid(*m_editedStyle) == typeid(*editedStyle));
Toshihiro Shimizu 890ddd
	bool buildLayout = editedStyle && !(m_editedStyle && typeid(*m_editedStyle) == typeid(*editedStyle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_editedStyle = editedStyle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (clearLayout)
Toshihiro Shimizu 890ddd
		locals::clearLayout(m_paramsLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (buildLayout) {
Toshihiro Shimizu 890ddd
		assert(m_paramsLayout->count() == 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Assign new settings widgets - one label/editor for each parameter
Toshihiro Shimizu 890ddd
		bool ret = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int p, pCount = editedStyle->getParamCount();
Toshihiro Shimizu 890ddd
		for (p = 0; p != pCount; ++p) {
Toshihiro Shimizu 890ddd
			// Assign label
Toshihiro Shimizu 890ddd
			QLabel *label = new QLabel(editedStyle->getParamNames(p));
Toshihiro Shimizu 890ddd
			m_paramsLayout->addWidget(label, p, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// Assign parameter
Toshihiro Shimizu 890ddd
			switch (editedStyle->getParamType(p)) {
Toshihiro Shimizu 890ddd
			case TColorStyle::BOOL: {
Toshihiro Shimizu 890ddd
				QCheckBox *checkBox = new QCheckBox;
Toshihiro Shimizu 890ddd
				m_paramsLayout->addWidget(checkBox, p, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				ret = QObject::connect(checkBox, SIGNAL(toggled(bool)), this, SLOT(onValueChanged())) && ret;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				CASE TColorStyle::INT:
Toshihiro Shimizu 890ddd
				{
Toshihiro Shimizu 890ddd
					DVGui::IntField *intField = new DVGui::IntField;
Toshihiro Shimizu 890ddd
					m_paramsLayout->addWidget(intField, p, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					int min, max;
Toshihiro Shimizu 890ddd
					m_editedStyle->getParamRange(p, min, max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					intField->setRange(min, max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					ret = QObject::connect(intField, SIGNAL(valueChanged(bool)), this, SLOT(onValueChanged(bool))) && ret;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				CASE TColorStyle::ENUM:
Toshihiro Shimizu 890ddd
				{
Toshihiro Shimizu 890ddd
					QComboBox *comboBox = new QComboBox;
Toshihiro Shimizu 890ddd
					m_paramsLayout->addWidget(comboBox, p, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					QStringList items;
Toshihiro Shimizu 890ddd
					m_editedStyle->getParamRange(p, items);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					comboBox->addItems(items);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					ret = QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onValueChanged())) && ret;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				CASE TColorStyle::DOUBLE:
Toshihiro Shimizu 890ddd
				{
Toshihiro Shimizu 890ddd
					DVGui::DoubleField *doubleField = new DVGui::DoubleField;
Toshihiro Shimizu 890ddd
					m_paramsLayout->addWidget(doubleField, p, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					double min, max;
Toshihiro Shimizu 890ddd
					m_editedStyle->getParamRange(p, min, max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					doubleField->setRange(min, max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					ret = QObject::connect(doubleField, SIGNAL(valueChanged(bool)), this, SLOT(onValueChanged(bool))) && ret;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				CASE TColorStyle::FILEPATH:
Toshihiro Shimizu 890ddd
				{
Toshihiro Shimizu 890ddd
					DVGui::FileField *fileField = new DVGui::FileField;
Toshihiro Shimizu 890ddd
					m_paramsLayout->addWidget(fileField, p, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					QStringList extensions;
Toshihiro Shimizu 890ddd
					m_editedStyle->getParamRange(p, extensions);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					fileField->setFileMode(QFileDialog::AnyFile);
Toshihiro Shimizu 890ddd
					fileField->setFilters(extensions);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					fileField->setPath(QString::fromStdWString(
Toshihiro Shimizu 890ddd
						editedStyle->getParamValue(TColorStyle::TFilePath_tag(), p).getWideString()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					ret = QObject::connect(fileField, SIGNAL(pathChanged()), this, SLOT(onValueChanged())) && ret;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			assert(ret);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateValues();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingsPage::updateValues()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_editedStyle)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	struct Updating {
Toshihiro Shimizu 890ddd
		SettingsPage *m_this;						// Prevent 'param changed' signals from being
Toshihiro Shimizu 890ddd
		~Updating() { m_this->m_updating = false; } // sent when updating editor widgets - this is
Toshihiro Shimizu 890ddd
	} updating = {(m_updating = true, this)};		// just a view REFRESH function.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Deal with the autofill
Toshihiro Shimizu 890ddd
	m_autoFillCheckBox->setChecked(m_editedStyle->getFlags() & 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int p, pCount = m_editedStyle->getParamCount();
Toshihiro Shimizu 890ddd
	for (p = 0; p != pCount; ++p) {
Toshihiro Shimizu 890ddd
		// Update editor values
Toshihiro Shimizu 890ddd
		switch (m_editedStyle->getParamType(p)) {
Toshihiro Shimizu 890ddd
		case TColorStyle::BOOL: {
Toshihiro Shimizu 890ddd
			QCheckBox *checkBox = static_cast<QCheckBox *>(
Toshihiro Shimizu 890ddd
				m_paramsLayout->itemAtPosition(p, 1)->widget());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			checkBox->setChecked(m_editedStyle->getParamValue(TColorStyle::bool_tag(), p));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			CASE TColorStyle::INT:
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				DVGui::IntField *intField = static_cast<DVGui::IntField *>(
Toshihiro Shimizu 890ddd
					m_paramsLayout->itemAtPosition(p, 1)->widget());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				intField->setValue(m_editedStyle->getParamValue(TColorStyle::int_tag(), p));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			CASE TColorStyle::ENUM:
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				QComboBox *comboBox = static_cast<QComboBox *>(
Toshihiro Shimizu 890ddd
					m_paramsLayout->itemAtPosition(p, 1)->widget());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				comboBox->setCurrentIndex(m_editedStyle->getParamValue(TColorStyle::int_tag(), p));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			CASE TColorStyle::DOUBLE:
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				DVGui::DoubleField *doubleField = static_cast<DVGui::DoubleField *>(
Toshihiro Shimizu 890ddd
					m_paramsLayout->itemAtPosition(p, 1)->widget());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				doubleField->setValue(m_editedStyle->getParamValue(TColorStyle::double_tag(), p));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			CASE TColorStyle::FILEPATH:
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				DVGui::FileField *fileField = static_cast<DVGui::FileField *>(
Toshihiro Shimizu 890ddd
					m_paramsLayout->itemAtPosition(p, 1)->widget());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				fileField->setPath(QString::fromStdWString(
Toshihiro Shimizu 890ddd
					m_editedStyle->getParamValue(TColorStyle::TFilePath_tag(), p).getWideString()));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingsPage::onAutofillChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_editedStyle->setFlags((unsigned int)(m_autoFillCheckBox->isChecked()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_updating)
Toshihiro Shimizu 890ddd
		emit paramStyleChanged(false); // Forward the signal to the style editor
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SettingsPage::onValueChanged(bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct Locals {
Toshihiro Shimizu 890ddd
		SettingsPage *m_this;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int paramIndex(const QWidget *widget)
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			int p, pCount = m_this->m_paramsLayout->rowCount();
Toshihiro Shimizu 890ddd
			for (p = 0; p != pCount; ++p)
Toshihiro Shimizu 890ddd
				if (m_this->m_paramsLayout->itemAtPosition(p, 1)->widget() == widget)
Toshihiro Shimizu 890ddd
					break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return p;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	} locals = {this};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_editedStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Extract the parameter index
Toshihiro Shimizu 890ddd
	QWidget *senderWidget = static_cast<QWidget *>(sender());
Toshihiro Shimizu 890ddd
	int p = locals.paramIndex(senderWidget);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0 <= p && p < m_editedStyle->getParamCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Update the style's parameter value
Toshihiro Shimizu 890ddd
	switch (m_editedStyle->getParamType(p)) {
Toshihiro Shimizu 890ddd
	case TColorStyle::BOOL:
Toshihiro Shimizu 890ddd
		m_editedStyle->setParamValue(p, static_cast<QCheckBox *>(senderWidget)->isChecked());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE TColorStyle::INT : m_editedStyle->setParamValue(p, static_cast<DVGui::IntField *>(senderWidget)->getValue());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE TColorStyle::ENUM : m_editedStyle->setParamValue(p, static_cast<QComboBox *>(senderWidget)->currentIndex());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE TColorStyle::DOUBLE : m_editedStyle->setParamValue(p, static_cast<DVGui::DoubleField *>(senderWidget)->getValue());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE TColorStyle::FILEPATH:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			const QString &string = static_cast<DVGui::FileField *>(senderWidget)->getPath();
Toshihiro Shimizu 890ddd
			m_editedStyle->setParamValue(p, TFilePath(string.toStdWString()));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Forward the signal to the style editor
Toshihiro Shimizu 890ddd
	if (!m_updating)
Toshihiro Shimizu 890ddd
		emit paramStyleChanged(isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QScrollArea *makeChooserPage(QWidget *chooser)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScrollArea *scrollArea = new QScrollArea();
Toshihiro Shimizu 890ddd
	scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Toshihiro Shimizu 890ddd
	scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
Toshihiro Shimizu 890ddd
	scrollArea->setWidgetResizable(true);
Toshihiro Shimizu 890ddd
	scrollArea->setWidget(chooser);
Toshihiro Shimizu 890ddd
	return scrollArea;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QScrollArea *makeChooserPageWithoutScrollBar(QWidget *chooser)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScrollArea *scrollArea = new QScrollArea();
Toshihiro Shimizu 890ddd
	scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Toshihiro Shimizu 890ddd
	scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Toshihiro Shimizu 890ddd
	scrollArea->setWidgetResizable(true);
Toshihiro Shimizu 890ddd
	scrollArea->setWidget(chooser);
Toshihiro Shimizu 890ddd
	return scrollArea;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    StyleEditor  implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StyleEditor::StyleEditor(PaletteController *paletteController, QWidget *parent)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_paletteController(paletteController), m_paletteHandle(paletteController->getCurrentPalette()), m_cleanupPaletteHandle(paletteController->getCurrentCleanupPalette()), m_toolBar(0), m_enabled(false), m_enabledOnlyFirstTab(false), m_enabledFirstAndLastTab(false), m_oldStyle(0), m_editedStyle(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	//TOGLIERE
Toshihiro Shimizu 890ddd
	TFilePath libraryPath = ToonzFolder::getLibraryFolder();
Toshihiro Shimizu 890ddd
	setRootPath(libraryPath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_styleBar = new TabBar(this);
Toshihiro Shimizu 890ddd
	m_styleBar->setDrawBase(false);
Toshihiro Shimizu 890ddd
	m_styleBar->setObjectName("StyleEditorTabBar");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// This widget is used to set the background color of the tabBar
Toshihiro Shimizu 890ddd
	// using the styleSheet.
Toshihiro Shimizu 890ddd
	// It is also used to take 6px on the left before the tabBar
Toshihiro Shimizu 890ddd
	// and to draw the two lines on the bottom size
Toshihiro Shimizu 890ddd
	m_tabBarContainer = new TabBarContainter(this);
Toshihiro Shimizu 890ddd
	m_colorParameterSelector = new ColorParameterSelector(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_plainColorPage = new PlainColorPage(0);
Toshihiro Shimizu 890ddd
	m_textureStylePage = new TextureStyleChooserPage(0);
Toshihiro Shimizu 890ddd
	m_specialStylePage = new SpecialStyleChooserPage(0);
Toshihiro Shimizu 890ddd
	m_customStylePage = new CustomStyleChooserPage(0);
Toshihiro Shimizu 890ddd
	m_vectorBrushesStylePage = new VectorBrushStyleChooserPage(0);
Toshihiro Shimizu 890ddd
	m_settingsPage = new SettingsPage(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QWidget *emptyPage = new StyleEditorPage(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_statusLabel = new QLabel("", this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// For the plainColorPage and the settingsPage
Toshihiro Shimizu 890ddd
	// I create a "fake" QScrollArea (without ScrollingBar
Toshihiro Shimizu 890ddd
	// in order to use the styleSheet to stylish its background
Toshihiro Shimizu 890ddd
	QScrollArea *plainArea = makeChooserPageWithoutScrollBar(m_plainColorPage);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QScrollArea *textureArea = makeChooserPage(m_textureStylePage);
Toshihiro Shimizu 890ddd
	QScrollArea *specialArea = makeChooserPage(m_specialStylePage);
Toshihiro Shimizu 890ddd
	QScrollArea *customArea = makeChooserPage(m_customStylePage);
Toshihiro Shimizu 890ddd
	QScrollArea *vectorBrushesArea = makeChooserPage(m_vectorBrushesStylePage);
Toshihiro Shimizu 890ddd
	QScrollArea *settingsArea = makeChooserPageWithoutScrollBar(m_settingsPage);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_styleChooser = new QStackedWidget(this);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(plainArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(textureArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(specialArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(customArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(vectorBrushesArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(settingsArea);
Toshihiro Shimizu 890ddd
	m_styleChooser->addWidget(makeChooserPageWithoutScrollBar(emptyPage));
Toshihiro Shimizu 890ddd
	m_styleChooser->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QFrame *bottomWidget = createBottomWidget();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_toolBar = new QToolBar(this);
Toshihiro Shimizu 890ddd
	m_toolBar->setMovable(false);
Toshihiro Shimizu 890ddd
	m_toolBar->setMaximumHeight(22);
Toshihiro Shimizu 890ddd
	m_toolBar->addWidget(m_colorParameterSelector);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_colorParameterSelector->setMinimumWidth(200);
Toshihiro Shimizu 890ddd
	m_colorParameterSelector->setFixedHeight(22);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------- layout ------- */
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout;
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(1);
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QHBoxLayout *hLayout = new QHBoxLayout;
Toshihiro Shimizu 890ddd
		hLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			hLayout->addSpacing(4);
Toshihiro Shimizu 890ddd
			hLayout->addWidget(m_styleBar);
Toshihiro Shimizu 890ddd
			hLayout->addStretch();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_tabBarContainer->setLayout(hLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_tabBarContainer, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_styleChooser, 1);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(bottomWidget, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_statusLabel, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_toolBar, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------- signal-slot connections ------- */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_styleBar, SIGNAL(currentChanged(int)), this, SLOT(setPage(int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_colorParameterSelector, SIGNAL(colorParamChanged()), this, SLOT(onColorParamChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_textureStylePage, SIGNAL(styleSelected(const TColorStyle &)),
Toshihiro Shimizu 890ddd
						 this, SLOT(selectStyle(const TColorStyle &)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_specialStylePage, SIGNAL(styleSelected(const TColorStyle &)),
Toshihiro Shimizu 890ddd
						 this, SLOT(selectStyle(const TColorStyle &)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_customStylePage, SIGNAL(styleSelected(const TColorStyle &)),
Toshihiro Shimizu 890ddd
						 this, SLOT(selectStyle(const TColorStyle &)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_vectorBrushesStylePage, SIGNAL(styleSelected(const TColorStyle &)),
Toshihiro Shimizu 890ddd
						 this, SLOT(selectStyle(const TColorStyle &)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_settingsPage, SIGNAL(paramStyleChanged(bool)), this, SLOT(onParamStyleChanged(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_plainColorPage, SIGNAL(colorChanged(const ColorModel &, bool)),
Toshihiro Shimizu 890ddd
						 this, SLOT(onColorChanged(const ColorModel &, bool)));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------- initial conditions ------- */
Toshihiro Shimizu 890ddd
	autoCheckChanged(false);
Toshihiro Shimizu 890ddd
	enable(false, false, false);
Toshihiro Shimizu 890ddd
	//set to the empty page
Toshihiro Shimizu 890ddd
	m_styleChooser->setCurrentIndex(6);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StyleEditor::~StyleEditor()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void StyleEditor::setPaletteHandle(TPaletteHandle* paletteHandle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if(m_paletteHandle != paletteHandle)
Toshihiro Shimizu 890ddd
		m_paletteHandle = paletteHandle;
Toshihiro Shimizu 890ddd
	onStyleSwitched();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QFrame *StyleEditor::createBottomWidget()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QFrame *bottomWidget = new QFrame(this);
Toshihiro Shimizu 890ddd
	m_autoButton = new QPushButton(tr("Auto  \nApply"));
Toshihiro Shimizu 890ddd
	m_oldColor = new StyleSample(this, 42, 20);
Toshihiro Shimizu 890ddd
	m_newColor = new StyleSample(this, 42, 20);
Toshihiro Shimizu 890ddd
	m_applyButton = new QPushButton(tr("Apply"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bottomWidget->setFrameStyle(QFrame::StyledPanel);
Toshihiro Shimizu 890ddd
	bottomWidget->setObjectName("bottomWidget");
Toshihiro Shimizu 890ddd
	bottomWidget->setContentsMargins(0, 0, 0, 0);
Toshihiro Shimizu 890ddd
	m_applyButton->setToolTip(tr("Apply changes to current style"));
Toshihiro Shimizu 890ddd
	m_applyButton->setDisabled(true);
Toshihiro Shimizu 890ddd
	m_applyButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_autoButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	m_autoButton->setToolTip(tr("Automatically update style changes"));
Toshihiro Shimizu 890ddd
	m_autoButton->setChecked(false);
Toshihiro Shimizu 890ddd
	m_autoButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_oldColor->setToolTip(tr("Return To Previous Style"));
Toshihiro Shimizu 890ddd
	m_oldColor->enableClick(true);
Toshihiro Shimizu 890ddd
	m_oldColor->setEnable(false);
Toshihiro Shimizu 890ddd
	m_newColor->setToolTip(tr("Current Style"));
Toshihiro Shimizu 890ddd
	m_newColor->setEnable(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------ layout ------ */
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout;
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(4);
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(10);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QHBoxLayout *hLayout = new QHBoxLayout;
Toshihiro Shimizu 890ddd
		hLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		hLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			hLayout->addWidget(m_autoButton);
Toshihiro Shimizu 890ddd
			hLayout->addSpacing(2);
Toshihiro Shimizu 890ddd
			hLayout->addWidget(m_newColor, 1);
Toshihiro Shimizu 890ddd
			hLayout->addWidget(m_oldColor, 1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(hLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QHBoxLayout *buttonsLayout = new QHBoxLayout;
Toshihiro Shimizu 890ddd
		buttonsLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		buttonsLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			buttonsLayout->addWidget(m_applyButton);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(buttonsLayout);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bottomWidget->setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------ signal-slot connections ------ */
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyButtonClicked()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_autoButton, SIGNAL(toggled(bool)), this, SLOT(autoCheckChanged(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_oldColor, SIGNAL(clicked(const TColorStyle &)), this, SLOT(onOldStyleClicked(const TColorStyle &)));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return bottomWidget;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::updateTabBar()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_styleBar->clearTabBar();
Toshihiro Shimizu 890ddd
	if (m_enabled && !m_enabledOnlyFirstTab && !m_enabledFirstAndLastTab) {
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Plain"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Texture"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Special"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Custom"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Vector Brush"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Settings"));
Toshihiro Shimizu 890ddd
	} else if (m_enabled && m_enabledOnlyFirstTab && !m_enabledFirstAndLastTab)
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Plain"));
Toshihiro Shimizu 890ddd
	else if (m_enabled && !m_enabledOnlyFirstTab && m_enabledFirstAndLastTab) {
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Plain"));
Toshihiro Shimizu 890ddd
		m_styleBar->addSimpleTab(tr("Settings"));
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_styleChooser->setCurrentIndex(6);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_tabBarContainer->layout()->update();
Toshihiro Shimizu 890ddd
	m_styleChooser->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::showEvent(QShowEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_autoButton->setChecked(m_paletteController->isColorAutoApplyEnabled());
Toshihiro Shimizu 890ddd
	onStyleSwitched();
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_paletteHandle, SIGNAL(colorStyleSwitched()), SLOT(onStyleSwitched()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_paletteHandle, SIGNAL(colorStyleChanged()), SLOT(onStyleChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_paletteHandle, SIGNAL(paletteSwitched()), this, SLOT(onStyleSwitched()));
Toshihiro Shimizu 890ddd
	if (m_cleanupPaletteHandle)
Toshihiro Shimizu 890ddd
		ret = ret && connect(m_cleanupPaletteHandle, SIGNAL(colorStyleChanged()), SLOT(onCleanupStyleChanged()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_paletteController, SIGNAL(colorAutoApplyEnabled(bool)),
Toshihiro Shimizu 890ddd
						 this, SLOT(enableColorAutoApply(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_paletteController, SIGNAL(colorSampleChanged(const TPixel32 &)),
Toshihiro Shimizu 890ddd
						 this, SLOT(setColorSample(const TPixel32 &)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::hideEvent(QHideEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	disconnect(m_paletteHandle);
Toshihiro Shimizu 890ddd
	if (m_cleanupPaletteHandle)
Toshihiro Shimizu 890ddd
		disconnect(m_cleanupPaletteHandle);
Toshihiro Shimizu 890ddd
	disconnect(m_paletteController);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onStyleSwitched()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!palette) {
Toshihiro Shimizu 890ddd
		//set the current page to empty
Toshihiro Shimizu 890ddd
		m_styleChooser->setCurrentIndex(6);
Toshihiro Shimizu 890ddd
		enable(false);
Toshihiro Shimizu 890ddd
		m_colorParameterSelector->clear();
Toshihiro Shimizu 890ddd
		m_oldStyle = TColorStyleP();
Toshihiro Shimizu 890ddd
		m_editedStyle = TColorStyleP();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_statusLabel->setText("- Style not Selected -");
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	setEditedStyleToStyle(palette->getStyle(styleIndex));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isStyleNull = setStyle(m_editedStyle.getPointer());
Toshihiro Shimizu 890ddd
	bool isColorInField = palette->getPaletteName() == toWideString("EmptyColorFieldPalette");
Toshihiro Shimizu 890ddd
	bool isValidIndex = styleIndex > 0 || isColorInField;
Toshihiro Shimizu 890ddd
	bool isCleanUpPalette = palette->isCleanupPalette();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ------ update the status text ------ */
Toshihiro Shimizu 890ddd
	if (!isStyleNull && isValidIndex) {
Toshihiro Shimizu 890ddd
		QString statusText;
Toshihiro Shimizu 890ddd
		//palette type
Toshihiro Shimizu 890ddd
		if (isCleanUpPalette)
Toshihiro Shimizu 890ddd
			statusText = "[CLEANUP]  ";
Toshihiro Shimizu 890ddd
		else if (palette->getGlobalName() != L"")
Toshihiro Shimizu 890ddd
			statusText = "[STUDIO]  ";
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			statusText = "[LEVEL]  ";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//palette name
Toshihiro Shimizu 890ddd
		statusText += QString::fromStdWString(L" Palette : " + palette->getPaletteName());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//style name
Toshihiro Shimizu 890ddd
		statusText += QString::fromStdWString(L" | Style#");
Toshihiro Shimizu 890ddd
		statusText += QString::number(styleIndex);
Toshihiro Shimizu 890ddd
		statusText += QString::fromStdWString(L" : " + m_editedStyle->getName());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_statusLabel->setText(statusText);
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		m_statusLabel->setText("- Style is Not Valid -");
Toshihiro Shimizu 890ddd
	enable(!isStyleNull && isValidIndex, isColorInField, isCleanUpPalette);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onStyleChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	assert(0 <= styleIndex && styleIndex < palette->getStyleCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setEditedStyleToStyle(palette->getStyle(styleIndex));
Toshihiro Shimizu 890ddd
	setOldStyleToStyle(m_editedStyle.getPointer()); //This line is needed for proper undo behavior
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_plainColorPage->setColor(*m_editedStyle, getColorParam());
Toshihiro Shimizu 890ddd
	m_colorParameterSelector->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
	m_settingsPage->setStyle(m_editedStyle);
Toshihiro Shimizu 890ddd
	m_newColor->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
	m_oldColor->setStyle(*m_oldStyle); //This line is needed for proper undo behavior
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onCleanupStyleChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_cleanupPaletteHandle)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	onStyleChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//TOGLIERE
Toshihiro Shimizu 890ddd
void StyleEditor::setRootPath(const TFilePath &rootPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_textureStylePage->setRootPath(rootPath);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::copyEditedStyleToPalette(bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	assert(palette);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	assert(0 <= styleIndex && styleIndex < palette->getStyleCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!(*m_oldStyle == *m_editedStyle) && (!isDragging || m_paletteController->isColorAutoApplyEnabled()) && m_editedStyle->getGlobalName() != L"" && m_editedStyle->getOriginalName() != L"") {
Toshihiro Shimizu 890ddd
		// If the adited style is linked to the studio palette, then activate the edited flag
Toshihiro Shimizu 890ddd
		m_editedStyle->setIsEditedFlag(true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	palette->setStyle(styleIndex, m_editedStyle->clone()); // Must be done *before* setting the eventual
Toshihiro Shimizu 890ddd
														   // palette keyframe
Toshihiro Shimizu 890ddd
	if (!isDragging) {
Toshihiro Shimizu 890ddd
		if (!(*m_oldStyle == *m_editedStyle)) {
Toshihiro Shimizu 890ddd
			//do not register undo if the edited color is special one (e.g. changing the ColorField in the fx settings)
Toshihiro Shimizu 890ddd
			if (palette->getPaletteName() != toWideString("EmptyColorFieldPalette"))
Toshihiro Shimizu 890ddd
				TUndoManager::manager()->add(new UndoPaletteChange(
Toshihiro Shimizu 890ddd
					m_paletteHandle, styleIndex, *m_oldStyle, *m_editedStyle));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		setOldStyleToStyle(m_editedStyle.getPointer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// In case the frame is a keyframe, update it
Toshihiro Shimizu 890ddd
		if (palette->isKeyframe(styleIndex, palette->getFrame()))  // here
Toshihiro Shimizu 890ddd
			palette->setKeyframe(styleIndex, palette->getFrame()); //
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		palette->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_paletteHandle->notifyColorStyleChanged(isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onColorChanged(const ColorModel &color, bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	if (styleIndex < 0 || styleIndex > palette->getStyleCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setEditedStyleToStyle(palette->getStyle(styleIndex)); // CLONES the argument
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_editedStyle) // Should be styleIndex's style at this point
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TPixel tColor = color.getTPixel();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_editedStyle->hasMainColor()) {
Toshihiro Shimizu 890ddd
			int index = getColorParam(),
Toshihiro Shimizu 890ddd
				count = m_editedStyle->getColorParamCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (0 <= index && index < count)
Toshihiro Shimizu 890ddd
				m_editedStyle->setColorParamValue(index, tColor);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				m_editedStyle->setMainColor(tColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			m_editedStyle->invalidateIcon();
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			// The argument has NO (main) COLOR. Since color data is being updated, a 'fake'
Toshihiro Shimizu 890ddd
			// solid style will be created and operated on.
Toshihiro Shimizu 890ddd
			TSolidColorStyle *style = new TSolidColorStyle(tColor);
Toshihiro Shimizu 890ddd
			style->assignNames(m_editedStyle.getPointer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			setEditedStyleToStyle(style); // CLONES the argument
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			delete style;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_newColor->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
		m_colorParameterSelector->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef STUDENT
Toshihiro Shimizu 890ddd
		if (m_autoButton->isChecked())
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			copyEditedStyleToPalette(isDragging);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::enable(bool enabled, bool enabledOnlyFirstTab, bool enabledFirstAndLastTab)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_enabled != enabled ||
Toshihiro Shimizu 890ddd
		m_enabledOnlyFirstTab != enabledOnlyFirstTab ||
Toshihiro Shimizu 890ddd
		m_enabledFirstAndLastTab != enabledFirstAndLastTab) {
Toshihiro Shimizu 890ddd
		m_enabled = enabled;
Toshihiro Shimizu 890ddd
		m_enabledOnlyFirstTab = enabledOnlyFirstTab;
Toshihiro Shimizu 890ddd
		m_enabledFirstAndLastTab = enabledFirstAndLastTab;
Toshihiro Shimizu 890ddd
		updateTabBar();
Toshihiro Shimizu 890ddd
		m_autoButton->setEnabled(enabled);
Toshihiro Shimizu 890ddd
		m_applyButton->setDisabled(!enabled || m_autoButton->isChecked());
Toshihiro Shimizu 890ddd
		m_oldColor->setEnable(enabled);
Toshihiro Shimizu 890ddd
		m_newColor->setEnable(enabled);
Toshihiro Shimizu 890ddd
		if (enabled == false) {
Toshihiro Shimizu 890ddd
			m_oldColor->setColor(TPixel32::Transparent);
Toshihiro Shimizu 890ddd
			m_newColor->setColor(TPixel32::Transparent);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// lock button behavior
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	if (palette && enabled) {
Toshihiro Shimizu 890ddd
		// when the palette is locked
Toshihiro Shimizu 890ddd
		if (palette->isLocked()) {
Toshihiro Shimizu 890ddd
			m_applyButton->setEnabled(false);
Toshihiro Shimizu 890ddd
			m_autoButton->setChecked(false);
Toshihiro Shimizu 890ddd
			m_autoButton->setEnabled(false);
Toshihiro Shimizu 890ddd
		} else // when the palette is unlocked
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			m_applyButton->setEnabled(true);
Toshihiro Shimizu 890ddd
			m_autoButton->setEnabled(true);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onOldStyleClicked(const TColorStyle &)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_enabled)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	selectStyle(*(m_oldColor->getStyle()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::setPage(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_enabledFirstAndLastTab) {
Toshihiro Shimizu 890ddd
		m_styleChooser->setCurrentIndex(index);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Se sono nel caso first and last page enable e index == 1 la pagina che voglio settare e' l'ultima!
Toshihiro Shimizu 890ddd
	if (index == 1)
Toshihiro Shimizu 890ddd
		index = m_styleChooser->count() - 2; //2 perche' alla fine c'e' una pagina vuota
Toshihiro Shimizu 890ddd
	m_styleChooser->setCurrentIndex(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::applyButtonClicked()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	if (!palette || styleIndex < 0 || styleIndex > palette->getStyleCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	copyEditedStyleToPalette(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::autoCheckChanged(bool value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef STUDENT
Toshihiro Shimizu 890ddd
	m_paletteController->enableColorAutoApply(!!value);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_enabled)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (value != 0)
Toshihiro Shimizu 890ddd
		m_applyButton->setDisabled(true);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_applyButton->setDisabled(false);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::enableColorAutoApply(bool enabled)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_autoButton->isChecked() != enabled) {
Toshihiro Shimizu 890ddd
		m_autoButton->setChecked(enabled);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::setColorSample(const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// m_colorParameterSelector->setColor(*style);
Toshihiro Shimizu 890ddd
	ColorModel cm;
Toshihiro Shimizu 890ddd
	cm.setTPixel(color);
Toshihiro Shimizu 890ddd
	onColorChanged(cm, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool StyleEditor::setStyle(TColorStyle *currentStyle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(currentStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isStyleNull = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString gname = QString::fromStdWString(currentStyle->getGlobalName());
Toshihiro Shimizu 890ddd
	//if(!gname.isEmpty() && gname == "ColorFieldSimpleColor")
Toshihiro Shimizu 890ddd
	//	isStyleNull = true;
Toshihiro Shimizu 890ddd
	//else
Toshihiro Shimizu 890ddd
	if (!gname.isEmpty() && gname[0] != L'-') {
Toshihiro Shimizu 890ddd
		currentStyle = 0;
Toshihiro Shimizu 890ddd
		isStyleNull = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (currentStyle) {
Toshihiro Shimizu 890ddd
		m_colorParameterSelector->setStyle(*currentStyle);
Toshihiro Shimizu 890ddd
		m_plainColorPage->setColor(*currentStyle, getColorParam());
Toshihiro Shimizu 890ddd
		m_oldColor->setStyle(*currentStyle);
Toshihiro Shimizu 890ddd
		m_newColor->setStyle(*currentStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		setOldStyleToStyle(currentStyle);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Va fatto anche se non c'e' lo style perche' svuota la pagina
Toshihiro Shimizu 890ddd
	m_settingsPage->setStyle(m_editedStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return isStyleNull;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::setEditedStyleToStyle(const TColorStyle *style)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (style == m_editedStyle.getPointer())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_editedStyle = TColorStyleP(style->clone());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::setOldStyleToStyle(const TColorStyle *style)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (style == m_oldStyle.getPointer())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_oldStyle = TColorStyleP(style->clone());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::selectStyle(const TColorStyle &newStyle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = m_paletteHandle->getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = m_paletteHandle->getStyleIndex();
Toshihiro Shimizu 890ddd
	if (styleIndex < 0 || palette->getStyleCount() <= styleIndex)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Register the new previous/edited style pairs
Toshihiro Shimizu 890ddd
	setOldStyleToStyle(palette->getStyle(styleIndex));
Toshihiro Shimizu 890ddd
	setEditedStyleToStyle(&newStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_editedStyle->assignNames(m_oldStyle.getPointer()); // Copy original name stored in the palette
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// For convenience's sake, copy the main color from the old color, if both have one
Toshihiro Shimizu 890ddd
	if (m_oldStyle && m_oldStyle->hasMainColor() &&
Toshihiro Shimizu 890ddd
		m_editedStyle && m_editedStyle->hasMainColor())
Toshihiro Shimizu 890ddd
		m_editedStyle->setMainColor(m_oldStyle->getMainColor());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef STUDENT
Toshihiro Shimizu 890ddd
	if (m_autoButton->isChecked())
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		// If the adited style is linked to the studio palette, then activate the edited flag
Toshihiro Shimizu 890ddd
		if (m_editedStyle->getGlobalName() != L"" && m_editedStyle->getOriginalName() != L"")
Toshihiro Shimizu 890ddd
			m_editedStyle->setIsEditedFlag(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Apply new style, if required
Toshihiro Shimizu 890ddd
		TUndoManager::manager()->add(new UndoPaletteChange(
Toshihiro Shimizu 890ddd
			m_paletteHandle, styleIndex, *m_oldStyle, *m_editedStyle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		palette->setStyle(styleIndex, m_editedStyle->clone());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_paletteHandle->notifyColorStyleChanged(false);
Toshihiro Shimizu 890ddd
		palette->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Update editor widgets
Toshihiro Shimizu 890ddd
	m_newColor->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
	m_plainColorPage->setColor(*m_editedStyle, getColorParam());
Toshihiro Shimizu 890ddd
	m_colorParameterSelector->setStyle(*m_editedStyle);
Toshihiro Shimizu 890ddd
	m_settingsPage->setStyle(m_editedStyle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onColorParamChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	if (styleIndex < 0 || palette->getStyleCount() <= styleIndex)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_paletteHandle->setStyleParamIndex(getColorParam());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (TColorStyle *currentStyle = palette->getStyle(styleIndex)) {
Toshihiro Shimizu 890ddd
		setEditedStyleToStyle(currentStyle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_plainColorPage->setColor(*m_editedStyle, getColorParam());
Toshihiro Shimizu 890ddd
		m_settingsPage->setStyle(m_editedStyle);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StyleEditor::onParamStyleChanged(bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPalette *palette = getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int styleIndex = getStyleIndex();
Toshihiro Shimizu 890ddd
	if (styleIndex < 0 || styleIndex > palette->getStyleCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_autoButton->isChecked())
Toshihiro Shimizu 890ddd
		copyEditedStyleToPalette(isDragging);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_editedStyle->invalidateIcon();	  // Refresh the new color icon
Toshihiro Shimizu 890ddd
	m_newColor->setStyle(*m_editedStyle); //
Toshihiro Shimizu 890ddd
}