Blob Blame Raw


#include "casmconfigpanel.h"
#include "filebrowserpopup.h"
#include "application.h"

#include "tw/mainshell.h"
#include "tw/textfield.h"
#include "tw/label.h"
#include "tw/optionmenu.h"
#include "tw/button.h"
#include "tw/checkbox.h"

#include "tconvert.h"
#include "util.h"
#include "tsystem.h"

#include "tw/message.h"

//==============================================================================

CasmTask::CasmTask()
{
	setdefaultValue();
}

//------------------------------------------------------------------------------

CasmTask::CasmTask(const string &s, const string &setupFilePath)
	: m_setupFile(setupFilePath)
{
	setCommandLine(s);
}

//------------------------------------------------------------------------------

void CasmTask::setdefaultValue()
{
	m_taskChunksize = 1;
	m_start = 0;
	m_end = 9999;
	m_step = 1;
	m_casmFile = "";
	m_outname = "";
	m_firstFrame = 0;
	m_lastFrame = 0;
	m_reduction = 1;
	m_moveType = M_BG_FRACMOVE;
	m_prec = 32;
	m_renderTile = 1.;
	m_memChunk = 4.;
	m_multimedia = false;
	m_logfile = false;
	m_cf = false;
	m_restype = RES_TYPE_STANDARD;
	m_noOverwrite = false;
	m_clap = false;
	m_mprocess = false;
	m_numColumn = -1;
	m_lineart = -1;
	m_edgeAliasing = -1;
	m_gamma = -1.;
	m_bcScript = "";
	m_acScript = "";
	m_outputScript = "";
	m_outputScriptArgument = "";
	m_setupFile = "";
	xsize = 0;
	ysize = 0;
}

//------------------------------------------------------------------------------

string CasmTask::getCommandLine() const
{
	string qualifiers, prgname, dirname, biname;

	if (m_reduction != 1)
		qualifiers += " -shrink " + toString(m_reduction) + " ";

	if (m_moveType != moveType::M_BG_FRACMOVE)
		qualifiers += (m_moveType == moveType::M_FRACMOVE) ? " -fracmove " : " -intmove ";
	if (m_prec == 64)
		qualifiers += " -64bit";
	else
		qualifiers += " -32bit";

	qualifiers += " -tile " + toString(m_renderTile) + " ";

	qualifiers += " -mem " + toString(m_memChunk) + " ";

	if (m_multimedia) {
		if (m_numColumn < 0)
			qualifiers += " -mm ";
		else
			qualifiers += " -mmsingle " + toString(m_numColumn) + " ";
	}

	if (m_logfile)
		qualifiers += " -logfile +output/casm_batches.log ";

	if (m_lineart > -1)
		qualifiers += " -lineart " + toString(m_lineart) + " ";
	if (m_edgeAliasing > -1)
		qualifiers += " -edgealiasing " + toString(m_edgeAliasing) + " ";
	if (m_gamma > -1.0)
		qualifiers += " -gamma " + toString(m_gamma) + " ";

	switch (m_restype) {
		CASE RES_TYPE_STANDARD : qualifiers += " -sq ";
		CASE RES_TYPE_IMPROVED : qualifiers += " -iq ";
		CASE RES_TYPE_HIGH : qualifiers += " -hq ";
	}

	if (m_cf)
		qualifiers += " -cf ";

	if (m_noOverwrite)
		qualifiers += " -no_overwrite ";

	if (m_clap)
		qualifiers += " -clap ";

	if (m_bcScript != "")
		qualifiers += " -bc " + m_bcScript + " ";

	if (m_acScript != "" && m_outputScript == "")
		qualifiers += " -ac " + m_acScript + " ";

	if (m_outputScript != "") {
		bool outputToDdr = (m_outputScript ==
							DDR_OUTPUTSCRIPT_FILENAME);

		if (!outputToDdr)
			qualifiers += " -ac " + m_outputScript + " ";
		if (m_outputScriptArgument != "") {
			string entry_point = m_outputScriptArgument;
			string parity = "odd";
			int i;
			i = entry_point.size();
			if (i > 0 && entry_point[i - 1] == '+') {
				parity = "even";
				entry_point[i - 1] = '\0';
			}
			//convert_timecode_to_frame (entry_point);//??????
			if (outputToDdr)
				qualifiers += " -ddr " + entry_point + " ";
			else {
				string app;
#ifdef WIN32
				app = " -ac_args \"$filename $count " + entry_point;
				app += " " + parity;
				app += " $total\" ";
				qualifiers += app;
#else
				app = " -ac_args '$filename $count " + entry_point;
				app += " " + parity;
				app += " $total' ";
				qualifiers += " app;
#endif
			}
		} else {
			if (outputToDdr)
				qualifiers += " -ddr " + toString(0) + " ";
			else
#ifdef WIN32
				qualifiers += " -ac_args \"$filename $count $total\" ";
#else
				qualifiers += " -ac_args '$filename $count $total' ";
#endif
		}
	}

	qualifiers += "  -step " + toString(m_step);

	if (m_start > m_firstFrame || m_end < m_lastFrame)
		qualifiers += " -range " + toString(m_start) + " " + toString(m_end) + " ";

	//qualifiers += " -chunk "+toString(m_taskChunksize)+" ";

	return qualifiers;
}

//------------------------------------------------------------------------------

static bool is_num(string word)
{
	string::iterator it = word.begin();
	while (it != word.end()) {
		if ((*it < '0' || *it > '9') && *it != '.')
			return false;
		it++;
	}
	return true;
}

//------------------------------------------------------------------------------

static string cpy_word(string &word, string s)
{
	/* salto gli spazi bianchi iniziali */
	string::iterator it = s.begin();
	word = "";
	string::iterator it2 = word.begin();
	while (s[0] == ' ' || s[0] == '\t')
		it++;
	if (s[0] == '\'' || s[0] == '\"') {
		/* argomento fra virgolette */
		char quote = *it++;
		while (*it && *it != '\n') {
			if (*it == '\\') {
				it++;
				if (*it == '\0' || *it == '\n')
					break;
				switch (*it) {
					CASE '\\' : *it2++ = '\\';
				DEFAULT:
					*it2++ = *it;
				}
				it++;
			} else if (*it == quote) {
				it++;
				break;
			} else
				*it2++ = *it++;
		}
	} else {
		/* argomento senza virgolette */
		while (*it && *it != ' ' && *it != '\t' && *it != '\n')
			*it2++ = *it++;
	}
	//*word = '\0';

	/* salto gli spazi bianchi finali */
	while (*it == ' ' || *it == '\t')
		it++;
	return s.erase(s.begin(), it);
}

//------------------------------------------------------------------------------

void CasmTask::setCommandLine(const string &cmdLine)
{
	if (cmdLine.empty())
		return;

	setdefaultValue();
	string s = cmdLine;
	string::iterator it = s.begin();
	string word;
	while (it != s.end()) {
		s = cpy_word(word, s);

		if (word == "-64bit")
			m_prec = 64;
		else if (word == "-32bit")
			m_prec = 32;
		else if (word == "-sq")
			m_restype = RES_TYPE_STANDARD;
		else if (word == "-iq")
			m_restype = RES_TYPE_IMPROVED;
		else if (word == "-hq")
			m_restype = RES_TYPE_HIGH;
		else if (word == "-step") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_step = atoi(word.c_str());
		} else if (word == "-range") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_start = atoi(word.c_str());
			s = cpy_word(word, s);
			if (is_num(word))
				m_end = atoi(word.c_str());
		} else if (word == "-shrink") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_reduction = atoi(word.c_str());
		} else if (word == "-fracmove") {
			m_moveType = M_FRACMOVE;
		} else if (word == "-intmove") {
			m_moveType = M_INTMOVE;
		}
		/*     else
     if (STR_EQ(word, "-64bit"))
        task->prec = 64;
     else 
     if (STR_EQ(word, "-32bit"))
        task->prec = 32;*/
		else if (word == "-tile") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_renderTile = atof(word.c_str());
		} else if (word == "-mem") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_taskChunksize = atoi(word.c_str());
		} else if (word == "-chunk") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_memChunk = atof(word.c_str());
		} else if (word == "-mm") {
			m_multimedia = true;
			m_numColumn = -1;
		} else if (word == "-mmsingle") {
			m_multimedia = true;
			s = cpy_word(word, s);
			if (is_num(word))
				m_numColumn = atoi(word.c_str());
		} else if (word == "-lineart") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_lineart = atoi(word.c_str());
		} else if (word == "-edgealiasing") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_edgeAliasing = atoi(word.c_str());
		} else if (word == "-gamma") {
			s = cpy_word(word, s);
			if (is_num(word))
				m_gamma = atof(word.c_str());
		} else if (word == "-cf") {
			m_cf = true;
		} else if (word == "-no_overwrite") {
			m_noOverwrite = true;
		} else if (word == "-clap") {
			m_clap = true;
		} else if (word == "-bc") {
			s = cpy_word(word, s);
			m_bcScript = word;
		} else if (word == "-ac") {
			s = cpy_word(word, s);
			m_outputScript = word;
		} else if (word == "-ac_args") { /*
       char output_script_argument[1024];
       s = cpy_word(word, s);
       if(parse_ac_args(output_script_argument, word))
         task->output_script_argument = strsave(output_script_argument);*/
		} else if (word == "-logfile") {
			s = cpy_word(word, s);
			m_logfile = true;
		}
		/*     else
     if (!word.compare("-range"))
      {
	s = cpy_word(word, s);
        if (is_num(word))
	   task->start = atoi(word);
	else
         {
           delete_job((TASK *)task);
           return NULL;
         }
       s = cpy_word(word, s);
       if (is_num(word))
          task->end = atoi(word);
       else
        {
          delete_job((TASK *)task);
          return NULL;
        }
      }*/
		/*     else
     if (*word!='\n' && *word!='\0')
      {
        t = tim_get_type(word);
        if (*t == '.') t++;
        if (FILESTR_NE(t, "casm")) 
         {
           delete_job((TASK *)task);
//           return NULL;
         }
        else
         {
	   TCALLOC(task->casm_file, strlen(word)+1);
	   strcpy(task->casm_file, word);
	   compute_casm_range(task->casm_file, &(task->first_frame), &(task->last_frame), &dummy); 
	   if (task->start<task->first_frame) 
	      task->start=task->first_frame;
	   if (task->end>task->last_frame) 
	      task->end=task->last_frame;
           task->xsize = task->ysize = 0;
           casm_camera_size(task->casm_file, &task->xsize, &task->ysize);
  

         }
      }*/
		it = s.begin();
	}
}

//==============================================================================
enum numFieldType {
	M_FROM = 0,
	M_TO,
	M_STEP,
	M_SHRINK,
	M_RTILE,
	M_MCHUNK,
	M_COLUMN,
	M_THICK,
	M_GAMMA,
	M_CHUNKSIZE
};

class NumFieldChanger : public TNumField::Action
{
	CasmConfigPanel *m_ccp;
	numFieldType m_typeField;

public:
	NumFieldChanger(CasmConfigPanel *ccp, numFieldType type)
		: m_ccp(ccp), m_typeField(type)
	{
	}

	void sendCommand(const TNumField::Event &ev)
	{
		m_ccp->onNumField(ev.m_value, m_typeField);
	}
};

class ColumnFieldChanger : public TTextField::Action
{
	CasmConfigPanel *m_ccp;

public:
	ColumnFieldChanger(CasmConfigPanel *ccp)
		: m_ccp(ccp)
	{
	}

	void sendCommand(std::wstring value)
	{
		m_ccp->onColumnField(value);
	}
};

class NumFieldChanger2 : public TNumField::Action
{
public:
	NumFieldChanger2(CasmConfigPanel *ccp, double CasmTask::*)
	{
	}

	void sendCommand(double value)
	{
		//*m_member = value;
	}

	double CasmTask::*m_member;
};

//==============================================================================

CasmConfigPanel::CasmConfigPanel(TWidget *parent)
	: TWidget(parent)
{
	m_task = new CasmTask();

	m_chunkSizeLabel = new TLabel(this);
	m_chunkSizeLabel->setText("Task Chunk Size:");
	m_chunkSize = new TNumField(this);
	m_chunkSize->setIsInteger(true);
	m_chunkSize->setRange(1, std::numeric_limits<int>::max());
	m_chunkSize->addAction(new NumFieldChanger(this, M_CHUNKSIZE));

	m_setupLabel = new TLabel(this);
	m_setupLabel->setText("Setup Path:");
	m_setupTextField = new TTextField(this);
	m_setupBrowseBtn = new TButton(this);
	m_setupBrowseBtn->setTitle("...");
	tconnect(*m_setupBrowseBtn, this, &CasmConfigPanel::browseSetupFiles);

	m_fromLabel = new TLabel(this);
	m_fromLabel->setText("From:");
	m_from = new TNumField(this);
	m_from->setIsInteger(true);
	m_from->addAction(new NumFieldChanger(this, M_FROM));

	m_toLabel = new TLabel(this);
	m_toLabel->setText("To:");
	m_to = new TNumField(this);
	m_to->setIsInteger(true);
	m_to->addAction(new NumFieldChanger(this, M_TO));

	m_stepLabel = new TLabel(this);
	m_stepLabel->setText("Step:");
	m_step = new TNumField(this);
	m_step->setIsInteger(true);
	m_step->addAction(new NumFieldChanger(this, M_STEP));

	m_shrinkLabel = new TLabel(this);
	m_shrinkLabel->setText("Shrink:");
	m_shrink = new TNumField(this);
	m_shrink->setIsInteger(true);
	m_shrink->addAction(new NumFieldChanger(this, M_SHRINK));

	m_renderTileLabel = new TLabel(this);
	m_renderTileLabel->setText("Render Tile:");
	m_renderTile = new TNumField(this);
	m_renderTile->setIsInteger(true);
	m_renderTile->addAction(new NumFieldChanger(this, M_RTILE));

	m_memChunkLabel = new TLabel(this);
	m_memChunkLabel->setText("Mem Chunk:");
	m_memChunk = new TNumField(this);
	m_memChunk->setIsInteger(true);
	m_memChunk->addAction(new NumFieldChanger(this, M_MCHUNK));

	m_subPixelMoveLabel = new TLabel(this);
	m_subPixelMoveLabel->setText("Subpixel Move:");
	m_subPixelMove = new TOptionMenu(this);
	m_subPixelMove->addOption("None");
	m_subPixelMove->addOption("RGB");
	m_subPixelMove->addOption("All");
	m_subPixelMove->setAction(new TOptionMenuAction<CasmConfigPanel>(this, &CasmConfigPanel::onSubPixelMove));

	m_processingLabel = new TLabel(this);
	m_processingLabel->setText("Processing:");
	m_processing = new TOptionMenu(this);
	m_processing->addOption("32 Bit");
	m_processing->addOption("64 Bit");
	m_processing->setAction(new TOptionMenuAction<CasmConfigPanel>(this, &CasmConfigPanel::onProcessing));

	m_resampleQualityLabel = new TLabel(this);
	m_resampleQualityLabel->setText("Resample Quality:");
	m_resampleQuality = new TOptionMenu(this);
	m_resampleQuality->addOption("Standard");
	m_resampleQuality->addOption("Improved");
	m_resampleQuality->addOption("High");
	m_resampleQuality->setAction(new TOptionMenuAction<CasmConfigPanel>(this, &CasmConfigPanel::onResampleQuality));

	m_focus = new TCheckBox(this, "Constant Focus");
	tconnect<CasmConfigPanel>(*m_focus, this, onConstantFocus);
	m_noOverwrite = new TCheckBox(this, "No Overwrite");
	tconnect<CasmConfigPanel>(*m_noOverwrite, this, onOverwrite);
	m_multimedia = new TCheckBox(this, "Multimedia");
	tconnect<CasmConfigPanel>(*m_multimedia, this, onMultimedia);

	m_column = new TTextField(this);
	m_column->setText("All");
	m_column->disable();
	m_column->addAction(new ColumnFieldChanger(this));
	m_lineart = new TCheckBox(this, "Lineart");
	m_lineart->disable();
	tconnect<CasmConfigPanel>(*m_lineart, this, onLineart);
	m_edgeAliasing = new TCheckBox(this, "Edge Aliasing");
	m_edgeAliasing->disable();
	tconnect<CasmConfigPanel>(*m_edgeAliasing, this, onEdgeAliasing);
	m_thickness = new TNumField(this);
	m_thickness->setIsInteger(true);
	m_thickness->setRange(0, 15);
	m_thickness->setValue(8);
	m_thickness->disable();
	m_thickness->addAction(new NumFieldChanger(this, M_THICK));

	m_gamma = new TCheckBox(this, "Gamma");
	tconnect<CasmConfigPanel>(*m_gamma, this, onGamma);
	m_gammaValue = new TNumField(this);
	m_gammaValue->setValue(0);
	m_gammaValue->disable();
	m_gammaValue->addAction(new NumFieldChanger(this, M_GAMMA));

	m_clap = new TCheckBox(this, "Add Clap");
	//tconnect<CasmConfigPanel>(*m_clap, this, onClap);
	/*
  m_outputScriptLabel = new TLabel(this);
  m_outputScriptLabel->setText("Output Script:");
  m_outputScript = new TOptionMenu(this);
  m_outputScript->addOption("None");
  //m_subPixelMove->setAction(new TOptionMenuAction<CasmConfigPanel>(this, &CasmConfigPanel::onOutputScript));
  m_entryPointLabel = new TLabel(this);
  m_entryPointLabel->setText("Entry Point:");
  m_entryPoint = new TTextField(this);
  m_entryPoint->setText("");
  */
}

//------------------------------------------------------------------------------

void CasmConfigPanel::configureNotify(const TDimension &d)
{
	int x0 = 20;
	int y = d.ly - 1 - 10;

	int x = x0;

	m_setupLabel->setGeometry(x, y - 15, x + 100, y);
	m_setupTextField->setGeometry(x + 104, y - 15, x + 650, y);
	m_setupBrowseBtn->setGeometry(x + 660, y - 15, x + 680, y);

	y -= 60;

	m_chunkSizeLabel->setGeometry(x, y - 15, x + 100, y);
	m_chunkSize->setGeometry(x + 110, y - 15, x + 156, y);

	y -= 40;

	m_fromLabel->setGeometry(x, y - 15, x + 50, y);
	m_from->setGeometry(x + 54, y - 15, x + 100, y);
	x += 120;

	m_toLabel->setGeometry(x, y - 15, x + 80, y);
	m_to->setGeometry(x + 84, y - 15, x + 130, y);
	x += 150;

	m_stepLabel->setGeometry(x, y - 15, x + 80, y);
	m_step->setGeometry(x + 84, y - 15, x + 130, y);

	///
	x = x0;
	y -= 40;

	m_shrinkLabel->setGeometry(x, y - 15, x + 50, y);
	m_shrink->setGeometry(x + 54, y - 15, x + 100, y);
	x += 120;

	m_renderTileLabel->setGeometry(x, y - 15, x + 80, y);
	m_renderTile->setGeometry(x + 84, y - 15, x + 130, y);
	x += 150;

	m_memChunkLabel->setGeometry(x, y - 15, x + 80, y);
	m_memChunk->setGeometry(x + 84, y - 15, x + 130, y);

	x = x0;
	y -= 40;

	m_subPixelMoveLabel->setGeometry(x, y - 15, x + 94, y);
	m_subPixelMove->setGeometry(x + 98, y - 15, x + 160, y);
	x += 180;

	m_processingLabel->setGeometry(x, y - 15, x + 74, y);
	m_processing->setGeometry(x + 78, y - 15, x + 140, y);
	x += 160;

	m_resampleQualityLabel->setGeometry(x, y - 15, x + 114, y);
	m_resampleQuality->setGeometry(x + 118, y - 15, x + 200, y);

	x = x0;
	y -= 40;

	m_focus->setGeometry(x, y - 15, x + 90, y);
	x += 120;
	m_noOverwrite->setGeometry(x, y - 15, x + 80, y);
	x += 110;
	m_multimedia->setGeometry(x, y - 15, x + 80, y);
	x += 90;
	m_column->setGeometry(x, y - 15, x + 20, y);
	x += 30;
	m_lineart->setGeometry(x, y - 15, x + 60, y);
	x += 65;
	m_edgeAliasing->setGeometry(x, y - 15, x + 80, y);
	x += 90;
	m_thickness->setGeometry(x, y - 15, x + 30, y);
	x += 50;
	m_gamma->setGeometry(x, y - 15, x + 60, y);
	x += 70;
	m_gammaValue->setGeometry(x, y - 15, x + 30, y);

	x = x0;
	y -= 40;

	m_clap->setGeometry(x, y - 15, x + 90, y);
	/*
  x += 120;
  m_outputScriptLabel->setGeometry(x, y-15, x+94, y);
  m_outputScript->setGeometry(x+98, y-15, x+160, y);
  x +=180;

  m_entryPointLabel->setGeometry(x, y-15, x+94, y);
  m_entryPoint->setGeometry(x+98, y-15, x+160, y);
  */
}

//------------------------------------------------------------------------------

void CasmConfigPanel::setTask(CasmTask *task)
{
	m_task = task;

	m_chunkSize->setValue(m_task->m_taskChunksize);
	m_from->setValue(m_task->m_start);
	m_to->setValue(m_task->m_end);
	m_step->setValue(m_task->m_step);

	m_shrink->setValue(m_task->m_reduction);
	m_renderTile->setValue(m_task->m_renderTile);
	m_memChunk->setValue(m_task->m_memChunk);

	string move;
	if (m_task->m_moveType == CasmTask::M_INTMOVE)
		move = "None";
	else if (m_task->m_moveType == CasmTask::M_BG_FRACMOVE)
		move = "RGB";
	else
		move = "All";
	m_subPixelMove->setText(move);

	string bits;
	if (m_task->m_prec == 32)
		bits = "32 Bit";
	else
		bits = "64 Bit";
	m_processing->setText(bits);

	string quality = "";
	if (m_task->m_restype == CasmTask::RES_TYPE_STANDARD)
		quality = "Standard";
	else if (m_task->m_restype == CasmTask::RES_TYPE_IMPROVED)
		quality = "Improved";
	else if (m_task->m_restype == CasmTask::RES_TYPE_HIGH)
		quality = "High";
	m_resampleQuality->setText(quality);

	m_focus->select(m_task->m_cf);
	m_noOverwrite->select(m_task->m_noOverwrite);
	m_multimedia->select(m_task->m_multimedia);

	if (m_task->m_numColumn < 0)
		m_column->setText("All");
	else
		m_column->setText(toString(m_task->m_numColumn));

	if (m_task->m_lineart < 0) {
		m_lineart->disable();
		m_lineart->select(false);
	} else {
		m_lineart->enable();
		m_lineart->select(true);
	}

	if (m_task->m_edgeAliasing < 0) {
		m_edgeAliasing->disable();
		m_edgeAliasing->select(false);
	} else {
		m_edgeAliasing->enable();
		m_edgeAliasing->select(true);
	}
	if (m_task->m_edgeAliasing >= 0 || m_task->m_lineart >= 0)
		m_thickness->setValue(tmax(m_task->m_edgeAliasing, m_task->m_lineart));
	else
		m_thickness->setValue(8);

	if (m_task->m_gamma < 0.) {
		m_gamma->select(false);
		m_gammaValue->setValue(0.0);
		m_gammaValue->disable();
	} else {
		m_gamma->select(true);
		m_gammaValue->setValue(m_task->m_gamma);
		m_gammaValue->enable();
	}
}

//------------------------------------------------------------------------------

CasmTask *CasmConfigPanel::getTask() const
{
	return m_task;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onNumField(double v, int type)
{
	switch (type) {
	case M_FROM:
		m_task->m_start = (int)v;
		break;
	case M_TO:
		m_task->m_end = (int)v;
		break;
	case M_STEP:
		m_task->m_step = (int)v;
		break;
	case M_SHRINK:
		m_task->m_reduction = (int)v;
		break;
	case M_RTILE:
		m_task->m_renderTile = (int)v;
		break;
	case M_MCHUNK:
		m_task->m_memChunk = (int)v;
		break;
	case M_THICK:
		if (m_lineart->isSelected())
			m_task->m_lineart = (int)v;
		if (m_edgeAliasing->isSelected())
			m_task->m_edgeAliasing = (int)v;
		break;
	case M_GAMMA:
		m_task->m_gamma = v;
		break;
	case M_CHUNKSIZE:
		m_task->m_taskChunksize = (int)v;
		break;
	}
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onColumnField(std::wstring value)
{
	if (value == toWideString("") ||
		value == toWideString("ALL") ||
		value == toWideString("All") ||
		value == toWideString("all") ||
		value == toWideString("AL") ||
		value == toWideString("Al") ||
		value == toWideString("a") ||
		value == toWideString("A"))
		m_task->m_numColumn = -1;
	else if (is_num(toString(value)))
		m_task->m_numColumn = atoi(toString(value).c_str());
	else {
		m_task->m_numColumn = -1;
		m_column->setText("All");
		TMessage::error("Only \"All\" or a number is a valid argument");
	}
}

//------------------------------------------------------------------------------

void CasmConfigPanel::browseSetupFiles()
{
	static FileBrowserPopup *popup = 0;

	if (!popup) {
		CasmConfigPanel *csp = this;
		vector<string> fileTypes;
		fileTypes.push_back("setup");
		popup = new FileBrowserPopup(csp, fileTypes);

		popup->setOkAction(
			new TFileBrowserPopupAction<CasmConfigPanel>(csp, &CasmConfigPanel::loadSetup));
	}

	if (!popup)
		return;

	TFilePath fp = Application::instance()->getCurrentFolder();
	if (fp != TFilePath())
		popup->setCurrentDir(fp);

	TDimension d = TMainshell::getMainshell()->getSize();
#ifdef WIN32
	HDC hdc = GetDC(0);
	d.lx = GetDeviceCaps(hdc, HORZRES);
	d.ly = GetDeviceCaps(hdc, VERTRES);
	ReleaseDC(0, hdc);
#endif

	d -= popup->getSize();
	//TDimension d = TMainshell::getMainshell()->getSize() - popup->getSize();
	popup->popup(TPoint(d.lx / 2, d.ly / 2));
	popup->setCaption("Load Setup");
}

//------------------------------------------------------------------------------

void CasmConfigPanel::loadSetup(const TFilePath &fp)
{
	if (!TFileStatus(fp).doesExist()) {
		string msg = toString(fp.getWideString()) + "\n";
		msg += "File not found\n";
		msg += "Please verify that the path and file name are correct";
		m_setupTextField->setText("");
		TMessage::error(msg);
		return;
	}
	Application::instance()->setCurrentFolder(fp.getParentDir());

	string uncString = convertToUncString(fp);

	m_setupTextField->setText(uncString);

#ifdef WIN32
	int x = uncString.find("\\", 2);
	while (x != string::npos) {
		uncString.replace(x, 1, "/", 0, 1);
		x = uncString.find("\\", x + 1);
	}
#endif

	m_task->m_setupFile = uncString;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onMultimedia(TCheckBox *box, bool on)
{
	if (on) {
		m_task->m_multimedia = true;
		m_column->enable();
		m_lineart->enable();
		m_edgeAliasing->enable();
		if (m_lineart->isSelected() || m_edgeAliasing->isSelected())
			m_thickness->enable();
		else
			m_thickness->disable();
	} else {
		m_task->m_multimedia = false;
		m_column->disable();
		m_lineart->disable();
		m_lineart->select(false);
		m_edgeAliasing->disable();
		m_edgeAliasing->select(false);
		m_thickness->setValue(8);
		m_thickness->disable();
		m_task->m_lineart = m_task->m_edgeAliasing = -1;
	}
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onLineart(TCheckBox *box, bool on)
{
	if (on) {
		m_task->m_lineart = (int)m_thickness->getValue();
		m_task->m_edgeAliasing = -1;
		m_lineart->enable();
		m_edgeAliasing->disable();
		m_thickness->enable();
	} else {
		m_task->m_lineart = -1;
		m_lineart->enable();
		m_edgeAliasing->enable();
		m_thickness->disable();
	}
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onEdgeAliasing(TCheckBox *box, bool on)
{
	if (on) {
		m_task->m_edgeAliasing = (int)m_thickness->getValue();
		m_task->m_lineart = -1;
		m_lineart->disable();
		m_edgeAliasing->enable();
		m_thickness->enable();
	} else {
		m_task->m_edgeAliasing = -1;
		m_lineart->enable();
		m_edgeAliasing->enable();
		m_thickness->disable();
	}
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onConstantFocus(TCheckBox *box, bool on)
{
	m_task->m_cf = on;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onOverwrite(TCheckBox *box, bool on)
{
	m_task->m_noOverwrite = on;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onGamma(TCheckBox *box, bool on)
{
	if (on)
		m_task->m_gamma = m_gammaValue->getValue();
	else
		m_task->m_gamma = -1.;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onSubPixelMove(string move)
{
	if (move == "None")
		m_task->m_moveType = CasmTask::M_INTMOVE;
	else if (move == "RGB")
		m_task->m_moveType = CasmTask::M_BG_FRACMOVE;
	else
		m_task->m_moveType = CasmTask::M_FRACMOVE;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onProcessing(string bits)
{
	if (bits == "32 Bit")
		m_task->m_prec = 32;
	else
		m_task->m_prec = 64;
}

//------------------------------------------------------------------------------

void CasmConfigPanel::onResampleQuality(string quality)
{
	if (quality == "Standard")
		m_task->m_restype = CasmTask::RES_TYPE_STANDARD;
	else if (quality == "Improved")
		m_task->m_restype = CasmTask::RES_TYPE_IMPROVED;
	else if (quality == "High")
		m_task->m_restype = CasmTask::RES_TYPE_HIGH;
	else
		m_task->m_restype = CasmTask::RES_TYPE_NONE;
}