campo-sirio/include/colors.cpp

318 lines
8.4 KiB
C++
Raw Normal View History

#include <colmask.h>
#include <config.h>
#include <diction.h>
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue)
{
COLOR def = XVT_MAKE_COLOR(red, green, blue);
if (def == 0) def = COLOR_BLACK; // Per non confonderlo col colore 0, default per XI
return def;
}
COLOR choose_color(COLOR col, WINDOW win)
{
COLOR def = xvt_dm_post_choose_color(win, col);
if (def == 0) def = COLOR_BLACK; // Per non confonderlo col colore 0, default per XI
return def;
}
COLOR blend_colors(COLOR col1, COLOR col2, double perc)
{
const unsigned int r1 = XVT_COLOR_GET_RED(col1);
const unsigned int g1 = XVT_COLOR_GET_GREEN(col1);
const unsigned int b1 = XVT_COLOR_GET_BLUE(col1);
const unsigned int r2 = XVT_COLOR_GET_RED(col2);
const unsigned int g2 = XVT_COLOR_GET_GREEN(col2);
const unsigned int b2 = XVT_COLOR_GET_BLUE(col2);
const byte r = byte(r1 * perc + r2*(1.0-perc));
const byte g = byte(g1 * perc + g2*(1.0-perc));
const byte b = byte(b1 * perc + b2*(1.0-perc));
return RGB2COLOR(r, g, b);
}
COLOR grayed_color(COLOR col)
{
const unsigned int r = XVT_COLOR_GET_RED(col);
const unsigned int g = XVT_COLOR_GET_GREEN(col);
const unsigned int b = XVT_COLOR_GET_BLUE(col);
const unsigned int k = (unsigned int)(0.299 * r + 0.587 * g + 0.114 * b);
return RGB2COLOR(k, k, k);
}
class TColor_row_mask : public TMask
{
public:
virtual void update();
TColor_row_mask();
virtual ~TColor_row_mask() { }
};
///////////////////////////////////////////////////////////
// TColor_row_mask
///////////////////////////////////////////////////////////
TColor_row_mask::TColor_row_mask() : TMask("bagn007", 1)
{ }
void TColor_row_mask::update()
{
TSheet_field* s = get_sheet();
if (s == NULL)
return;
TSelect_color_mask& m = (TSelect_color_mask&)s->mask();
COLOR back, fore;
m.get_cur_colors(back, fore);
_pixmap = TRUE;
set_pen(COLOR_BLACK);
RCT rct; field(100).get_rect(rct);
set_brush(back);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
field(99).get_rect(rct);
set_brush(fore);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
_pixmap = FALSE;
}
///////////////////////////////////////////////////////////
// TColor_object_props
///////////////////////////////////////////////////////////
class TColor_object_props : public TObject
{
TString _key;
TString _prompt;
COLOR _back;
COLOR _fore;
COLOR _back_def;
COLOR _fore_def;
protected:
public:
void set_key(const char * key) { _key = key; }
void set_prompt(const char * prompt) { _prompt = prompt; }
void set_back(COLOR back) { _back = back; }
void set_fore(COLOR fore) { _fore = fore; }
void set_back_def(COLOR back) { _back_def = back; }
void set_fore_def(COLOR fore) { _fore_def = fore; }
const TString & get_key() const { return _key; }
const TString & get_prompt() const { return _prompt; }
COLOR get_back() const { return _back; }
COLOR get_fore() const { return _fore; }
COLOR get_back_def() const { return _back_def; }
COLOR get_fore_def() const { return _fore_def; }
TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore);
virtual ~TColor_object_props() {}
};
TColor_object_props::TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore)
: _key(key), _prompt(prompt), _back(back), _fore(fore), _back_def(back), _fore_def(fore)
{
}
///////////////////////////////////////////////////////////
// TSelect_color_mask
///////////////////////////////////////////////////////////
bool TSelect_color_mask::color_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TMask& m = f.mask();
TSelect_color_mask& cm = (TSelect_color_mask&)m.get_sheet()->mask();
TSheet_field& s = cm.sfield(101);
const int cur = s.selected();
TColor_object_props & p = *cm.row(cur);
const bool use_back = f.dlg() == 100;
COLOR col = use_back ? p.get_back() : p.get_fore();
col = choose_color(col, m.win());
if (col != COLOR_INVALID)
{
if (use_back)
p.set_back(col);
else
p.set_fore(col);
xvt_dwin_invalidate_rect(f.parent(), NULL);
m.set_focus();
s.set_back_and_fore_color(p.get_back(), p.get_fore(), cur);
s.force_update();
}
}
return TRUE;
}
bool TSelect_color_mask::reset_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE && f.yesno_box(TR("Si desidera azzerare tutti i colori?")))
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
TSheet_field& s = cm.sfield(101);
const int items = cm.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *cm.row(i);
const COLOR back = p.get_back_def();
const COLOR fore = p.get_fore_def();
p.set_back(back);
p.set_fore(fore);
s.set_back_and_fore_color(back, fore, i);
}
s.force_update();
}
if (k == K_ENTER)
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
cm.save();
}
return TRUE;
}
int TSelect_color_mask::add_color_def(const char* key, const char* prompt, COLOR back, COLOR fore)
{
TColor_object_props * p = new TColor_object_props(key, prompt, back, fore);
TSheet_field& s = sfield(101);
const int row = _color_defs.add(p);
TToken_string& riga = s.row(-1);
riga << p->get_prompt();
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
tmp = p->get_key();
if (conf.exist(tmp))
p->set_fore(conf.get_color(tmp));
tmp << "_Bg";
if (conf.exist(tmp))
p->set_back(conf.get_color(tmp));
s.set_back_and_fore_color(p->get_back(), p->get_fore(), row);
return row;
}
void TSelect_color_mask::get_color_def(const char * key, COLOR & back, COLOR & fore) const
{
const int pos = key2pos(key);
if (pos >= 0)
{
back = get_back_color(pos);
fore = get_fore_color(pos);
}
else
{
back = NORMAL_BACK_COLOR;
fore = NORMAL_COLOR;
}
}
int TSelect_color_mask::key2pos(const char * key) const
{
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
if (((TColor_object_props &) _color_defs[i]).get_key() == key)
return i;
return -1;
}
COLOR TSelect_color_mask::get_back_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_back();
}
COLOR TSelect_color_mask::get_fore_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_fore();
}
TMask * TSelect_color_mask::get_mask(int, TMask& m)
{
return ((TSelect_color_mask &) m.get_sheet()->mask())._sheet_mask;
}
void TSelect_color_mask::get_cur_colors(COLOR & back, COLOR & fore) const
{
TSheet_field& s = sfield(101);
int cur = s.selected();
TColor_object_props & p = *row(cur);
back = p.get_back();
fore = p.get_fore();
}
void TSelect_color_mask::init(const char * mask_name, const char * para)
{
set_handler(102, reset_handler);
_sheet_mask = new TColor_row_mask;
_sheet_mask->set_handler(99, color_handler);
_sheet_mask->set_handler(100, color_handler);
TVariable_sheet_field& s = (TVariable_sheet_field&) sfield(101);
s.set_getmask(get_mask);
_mask_name = mask_name;
_mask_name.ext("");
_paragraph = para;
}
TSelect_color_mask::TSelect_color_mask(const TSheet_field & field)
: TVariable_mask("bagn007")
{
const TMask& m = field.mask();
TString16 para("Colors");
const int num = field.sheet_mask().number() - 1;
if (num > 0)
para << num;
init(m.source_file(), para);
}
void TSelect_color_mask::save() const
{
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *row(i);
tmp = p.get_key();
if (p.get_fore() == p.get_fore_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_fore());
tmp << "_Bg";
if (p.get_back() == p.get_back_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_back());
}
}
TSelect_color_mask::TSelect_color_mask(const char * mask_name, const char * para)
: TVariable_mask("bagn007")
{
init(mask_name, para);
}
TSelect_color_mask::~TSelect_color_mask()
{
delete _sheet_mask;
}