Aggiunta gestione colori
git-svn-id: svn://10.65.10.50/trunk@3249 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
4f621ab513
commit
b9491fffe5
349
ba/ba0.cpp
349
ba/ba0.cpp
@ -11,6 +11,12 @@
|
||||
#include <utility.h>
|
||||
#include <urldefid.h>
|
||||
|
||||
#if XVT_OS == XVT_OS_WIN
|
||||
#define STRICT
|
||||
#include <windows.h>
|
||||
#include <commdlg.h>
|
||||
#endif
|
||||
|
||||
#include <nditte.h>
|
||||
|
||||
#include "ba0.h"
|
||||
@ -47,10 +53,253 @@ void TPicture_mask::update()
|
||||
const short maxx = cli.left;
|
||||
const short maxy = short((long)maxx*_image.height()/_image.width());
|
||||
RCT dst; xvt_rect_set(&dst, 1, 1, maxx, maxy);
|
||||
_image.draw(win(), dst);
|
||||
|
||||
if (xvt_dwin_is_update_needed(win(), &dst))
|
||||
_image.draw(win(), dst);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Color Mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TColor_mask : public TMask
|
||||
{
|
||||
TAssoc_array _color;
|
||||
|
||||
protected: // TMask
|
||||
virtual void update();
|
||||
static bool color_handler(TMask_field& f, KEY k);
|
||||
static bool azzera_handler(TMask_field& f, KEY k);
|
||||
|
||||
COLOR get_color(const char* c) const;
|
||||
void set_color_entry(const char* name, COLOR col);
|
||||
const char* cid2name(short cid) const;
|
||||
COLOR cid2color(short cid) const;
|
||||
|
||||
public:
|
||||
void save_colors();
|
||||
|
||||
TColor_mask();
|
||||
virtual ~TColor_mask() { }
|
||||
};
|
||||
|
||||
TColor_mask::TColor_mask()
|
||||
: TMask("ba0200a")
|
||||
{
|
||||
TConfig color(CONFIG_USER, "Colors");
|
||||
_color = color.list_variables();
|
||||
|
||||
for (int f = fields()-1; f >= 0; f--)
|
||||
{
|
||||
TMask_field& mf = fld(f);
|
||||
if (mf.is_kind_of(CLASS_BUTTON_FIELD))
|
||||
{
|
||||
if (mf.dlg() > DLG_USER)
|
||||
mf.set_handler(color_handler);
|
||||
else
|
||||
if (mf.dlg() == DLG_USER)
|
||||
mf.set_handler(azzera_handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TColor_mask::save_colors()
|
||||
{
|
||||
TConfig colors(CONFIG_USER, "Colors");
|
||||
_color.restart();
|
||||
for (THash_object* h = _color.get_hashobj(); h; h = _color.get_hashobj())
|
||||
{
|
||||
const TString& k = h->key();
|
||||
const TString& s = (const TString&)h->obj();
|
||||
colors.set(k, s);
|
||||
}
|
||||
}
|
||||
|
||||
COLOR TColor_mask::get_color(const char* name) const
|
||||
{
|
||||
COLOR c = COLOR_INVALID;
|
||||
const TObject* s = ((TColor_mask*)this)->_color.objptr(name);
|
||||
if (s)
|
||||
{
|
||||
TToken_string colore(*(TString*)s, ',');
|
||||
const byte r = (byte)colore.get_int();
|
||||
const byte g = (byte)colore.get_int();
|
||||
const byte b = (byte)colore.get_int();
|
||||
c = RGB2COLOR(r, g, b);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void TColor_mask::set_color_entry(const char* name, COLOR col)
|
||||
{
|
||||
TString* s = (TString*)_color.objptr(name);
|
||||
if (s == NULL)
|
||||
{
|
||||
s = new TString(16);
|
||||
_color.add(name, s);
|
||||
}
|
||||
s->format("%d,%d,%d", XVT_COLOR_GET_RED(col), XVT_COLOR_GET_GREEN(col), XVT_COLOR_GET_BLUE(col));
|
||||
}
|
||||
|
||||
const char* TColor_mask::cid2name(short cid) const
|
||||
{
|
||||
const char* name[] = { "MaskBack", "MaskLight", "MaskDark",
|
||||
"Normal", "NormalBack",
|
||||
"Focus", "FocusBack",
|
||||
"Disabled", "DisabledBack" };
|
||||
const int i = cid - 101;
|
||||
CHECK(i >= 0 && i < 9, "Invalid color id");
|
||||
return name[i];
|
||||
}
|
||||
|
||||
COLOR TColor_mask::cid2color(short cid) const
|
||||
{
|
||||
COLOR color[] = { COLOR_DKCYAN, COLOR_CYAN, COLOR_GRAY,
|
||||
COLOR_BLACK, COLOR_WHITE,
|
||||
COLOR_BLACK, COLOR_CYAN,
|
||||
COLOR_GRAY, COLOR_DKCYAN };
|
||||
|
||||
const int i = cid - 101;
|
||||
CHECK(i >= 0 && i < 9, "Invalid color id");
|
||||
return color[i];
|
||||
}
|
||||
|
||||
#if XVT_OS == XVT_OS_WIN
|
||||
|
||||
inline COLORREF COLOR2RGB(COLOR c)
|
||||
{
|
||||
return RGB(XVT_COLOR_GET_RED(c), XVT_COLOR_GET_GREEN(c), XVT_COLOR_GET_BLUE(c));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
bool TColor_mask::color_handler(TMask_field& f, KEY k)
|
||||
{
|
||||
bool ok = TRUE;
|
||||
|
||||
if (k == K_SPACE)
|
||||
{
|
||||
TColor_mask& m = (TColor_mask&)f.mask();
|
||||
const char* name = m.cid2name(f.dlg());
|
||||
COLOR col = m.get_color(name);
|
||||
|
||||
#if XVT_OS == XVT_OS_WIN
|
||||
CHOOSECOLOR cc;
|
||||
memset(&cc, 0, sizeof(cc));
|
||||
|
||||
HWND hwnd = (HWND)xvt_vobj_get_attr(m.win(), ATTR_NATIVE_WINDOW);
|
||||
HDC hdc = GetDC(hwnd);
|
||||
|
||||
PALETTEENTRY* pe = NULL;
|
||||
int max_entries = 0;
|
||||
if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
max_entries = GetDeviceCaps(hdc, SIZEPALETTE);
|
||||
pe = new PALETTEENTRY[max_entries];
|
||||
GetSystemPaletteEntries(hdc, 0, max_entries, pe);
|
||||
}
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
||||
unsigned long custom_colors[16];
|
||||
for (int c = 0; c < 16; c++)
|
||||
{
|
||||
if (pe)
|
||||
{
|
||||
const PALETTEENTRY& e = pe[c < 8 ? c : max_entries - 16 + c];
|
||||
custom_colors[c] = RGB(e.peRed, e.peGreen, e.peBlue);
|
||||
}
|
||||
else
|
||||
{
|
||||
const byte val = (c & 0x8) ? 255 : 127;
|
||||
const byte red = (c & 0x1) ? val : 0;
|
||||
const byte green = (c & 0x2) ? val : 0;
|
||||
const byte blue = (c & 0x4) ? val : 0;
|
||||
custom_colors[c] = RGB(red, green, blue);
|
||||
}
|
||||
}
|
||||
if (pe)
|
||||
{
|
||||
delete pe;
|
||||
pe = NULL;
|
||||
}
|
||||
|
||||
cc.lStructSize = sizeof(cc);
|
||||
cc.hwndOwner = hwnd;
|
||||
cc.rgbResult = COLOR2RGB(col);
|
||||
cc.lpCustColors = custom_colors;
|
||||
cc.Flags = CC_RGBINIT;
|
||||
|
||||
ok = ChooseColor(&cc) != 0;
|
||||
col = RGB2COLOR(GetRValue(cc.rgbResult), GetGValue(cc.rgbResult), GetBValue(cc.rgbResult));
|
||||
#endif
|
||||
|
||||
if (ok)
|
||||
{
|
||||
m.set_color_entry(name, col);
|
||||
m.force_update();
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TColor_mask::azzera_handler(TMask_field& f, KEY k)
|
||||
{
|
||||
if (k == K_SPACE)
|
||||
{
|
||||
TColor_mask& cm = (TColor_mask&)f.mask();
|
||||
for (int i = cm.fields()-1; i >= 0; i--)
|
||||
{
|
||||
TMask_field& mf = cm.fld(i);
|
||||
if (mf.dlg() > DLG_USER && mf.is_kind_of(CLASS_BUTTON_FIELD))
|
||||
{
|
||||
const char* name = cm.cid2name(mf.dlg());
|
||||
const COLOR color = cm.cid2color(mf.dlg());
|
||||
cm.set_color_entry(name, color);
|
||||
}
|
||||
}
|
||||
cm.update();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void TColor_mask::update()
|
||||
{
|
||||
COLOR p, b;
|
||||
|
||||
set_pen(COLOR_BLACK);
|
||||
set_brush(b = get_color("MaskBack"));
|
||||
frame(1, 10, 33, 19, 0);
|
||||
|
||||
set_pen(p = get_color("MaskLight"));
|
||||
line(2, 10, 31, 10);
|
||||
line(2, 10, 2, 18);
|
||||
|
||||
set_pen(p = get_color("MaskDark"));
|
||||
line( 2, 18, 31, 18);
|
||||
line(31, 18, 31, 10);
|
||||
|
||||
set_opaque_text(FALSE);
|
||||
set_pen(p = COLOR_BLACK);
|
||||
set_brush(b = get_color("NormalBack"));
|
||||
frame(4, 12, 30, 13, 0);
|
||||
set_color(get_color("Normal"), b);
|
||||
stringat(5, 12, "Campo normale");
|
||||
|
||||
set_pen(p = get_color("Focus"));
|
||||
set_brush(b = get_color("FocusBack"));
|
||||
frame(4, 14, 30, 15, 0);
|
||||
set_color(p, b);
|
||||
stringat(5, 14, "Campo attivo");
|
||||
|
||||
set_pen(p = COLOR_BLACK);
|
||||
set_brush(b = get_color("DisabledBack"));
|
||||
frame(4, 16, 30, 17, 0);
|
||||
set_color(get_color("Disabled"), b);
|
||||
stringat(5, 16, "Campo disabilitato");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Menu application
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -66,7 +315,8 @@ class TMenu_application : public TApplication
|
||||
TArray _modules, _images;
|
||||
|
||||
int _level, _max;
|
||||
|
||||
TPicture_mask* _mask;
|
||||
|
||||
static int _last_button;
|
||||
static bool _find_button;
|
||||
|
||||
@ -77,6 +327,7 @@ protected: // TApplication
|
||||
virtual bool build_firm_data(long cod, bool flagcom = FALSE);
|
||||
|
||||
protected:
|
||||
bool main_loop();
|
||||
void test_temp();
|
||||
void load_menu();
|
||||
int do_level();
|
||||
@ -86,10 +337,14 @@ protected:
|
||||
static bool menu_find_handler(TMask_field&f, KEY k);
|
||||
bool module_enabled(const char * program) const;
|
||||
bool module_enabled(int module) const { return has_module(module);}
|
||||
|
||||
bool choose_colors();
|
||||
|
||||
public:
|
||||
TMenu_application(const char* name) : _name(name) {}
|
||||
virtual ~TMenu_application() {}
|
||||
public:
|
||||
void reload_images();
|
||||
|
||||
TMenu_application(const char* name) : _name(name), _mask(NULL) { }
|
||||
virtual ~TMenu_application() { }
|
||||
};
|
||||
|
||||
int TMenu_application::_last_button = 0;
|
||||
@ -165,7 +420,7 @@ bool TMenu_application::build_firm_data(long codditta, bool flagcom)
|
||||
dir.put(LF_DIR, _nordir, _sysdirop);
|
||||
rec.zero();
|
||||
}
|
||||
TString80 mess("Generazione archivi della ditta "); mess << codditta;
|
||||
TString mess("Generazione archivi della ditta "); mess << codditta;
|
||||
TProgind p(maxeod0 ? maxeod0 : 1, mess, FALSE, TRUE, 70);
|
||||
|
||||
for (int i = LF_DIR + 1; i <= maxeod0; i++)
|
||||
@ -288,7 +543,7 @@ void TMenu_application::load_menu()
|
||||
|
||||
int TMenu_application::find_menu(const char* s) const
|
||||
{
|
||||
TString80 str(s); str.upper();
|
||||
TString str(s); str.upper();
|
||||
int found = -1;
|
||||
|
||||
for (int i = 0; i < _menu.items(); i++)
|
||||
@ -299,7 +554,7 @@ int TMenu_application::find_menu(const char* s) const
|
||||
const int m = l.get_int(0);
|
||||
if (m != _level)
|
||||
{
|
||||
TString80 v(l.get()); v.upper();
|
||||
TString v(l.get()); v.upper();
|
||||
|
||||
if (v.find(str) >= 0)
|
||||
{
|
||||
@ -350,8 +605,23 @@ bool TMenu_application::menu_find_handler(TMask_field&f, KEY k)
|
||||
}
|
||||
|
||||
|
||||
int TMenu_application::do_level()
|
||||
void TMenu_application::reload_images()
|
||||
{
|
||||
for (int id = _images.last(); id >= 0; id--)
|
||||
{
|
||||
TImage* i = (TImage*)_images.objptr(id);
|
||||
if (i)
|
||||
{
|
||||
TString n(16); n.format("ba%02d.bmp", id);
|
||||
i->load(n);
|
||||
i->convert_transparent_color();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int TMenu_application::do_level()
|
||||
{
|
||||
const int first = _first[_level];
|
||||
const int last = _first[_level+1];
|
||||
TToken_string& row = (TToken_string&)_menu[first];
|
||||
@ -372,8 +642,9 @@ int TMenu_application::do_level()
|
||||
image->convert_transparent_color();
|
||||
_images.add(image, id);
|
||||
}
|
||||
|
||||
|
||||
TPicture_mask menu(head, width, height, (TImage&)_images[id]);
|
||||
_mask = &menu;
|
||||
|
||||
const int x = width / 2;
|
||||
int y = 1;
|
||||
@ -390,8 +661,8 @@ int TMenu_application::do_level()
|
||||
if (!_enabled[i]) menu.disable(id);
|
||||
}
|
||||
menu.add_static(-1, 0, "Cerca", 1,-3);
|
||||
menu.add_string(99, 0, "", -12, -3, 50, "", bwidth+1);
|
||||
menu.set_handler(99, menu_find_handler);
|
||||
menu.add_string(DLG_USER, 0, "", -12, -3, 50, "", bwidth+1);
|
||||
menu.set_handler(DLG_USER, menu_find_handler);
|
||||
|
||||
menu.add_button(first ? DLG_CANCEL : DLG_QUIT, 0,
|
||||
first ? "Menu precedente" : "Fine", -22, -1, bwidth, 2);
|
||||
@ -404,14 +675,18 @@ int TMenu_application::do_level()
|
||||
_last_button = _find_button = 0;
|
||||
|
||||
const int k = menu.run();
|
||||
_mask = NULL;
|
||||
|
||||
int m = 0;
|
||||
switch (k)
|
||||
{
|
||||
case K_ESC:
|
||||
m = -1; break;
|
||||
m = -1;
|
||||
break;
|
||||
case K_QUIT:
|
||||
menu.reset();
|
||||
m = -2; break;
|
||||
m = -2;
|
||||
break;
|
||||
default:
|
||||
if (_find_button)
|
||||
m = -1;
|
||||
@ -513,7 +788,9 @@ bool TMenu_application::check_user()
|
||||
{
|
||||
users.put("CONNECTED", "X");
|
||||
users.rewrite();
|
||||
|
||||
|
||||
enable_menu_item(M_FONT);
|
||||
|
||||
customize_colors(); // Aggiorna set di colori
|
||||
xvt_dwin_invalidate_rect(TASK_WIN, NULL); // Ridisegna sfondo
|
||||
}
|
||||
@ -552,12 +829,12 @@ bool TMenu_application::create()
|
||||
_modules.add(scanner.token());
|
||||
|
||||
load_menu();
|
||||
dispatch_e_menu(BAR_ITEM(1));
|
||||
dispatch_e_menu(MENU_ITEM(1));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TMenu_application::destroy()
|
||||
{
|
||||
{
|
||||
TLocalisamfile users(LF_USER);
|
||||
users.put("USERNAME", user());
|
||||
int err = users.read(_isequal, _lock);
|
||||
@ -570,7 +847,7 @@ bool TMenu_application::destroy()
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TMenu_application::menu(MENU_TAG)
|
||||
bool TMenu_application::main_loop()
|
||||
{
|
||||
int refarray[256];
|
||||
memset(refarray, 0, sizeof(refarray));
|
||||
@ -681,10 +958,44 @@ bool TMenu_application::menu(MENU_TAG)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TMenu_application::choose_colors()
|
||||
{
|
||||
TColor_mask cm;
|
||||
if (cm.run() == K_ENTER)
|
||||
{
|
||||
cm.save_colors(); // Aggiorna config
|
||||
customize_colors(); // Aggiorna set di colori
|
||||
|
||||
reload_images(); // Aggiorna bitmaps del menu
|
||||
|
||||
// Ridisegna sfondo
|
||||
TTemp_window tw(TASK_WIN);
|
||||
tw.force_update();
|
||||
|
||||
// Provoca chiusura forzata del menu
|
||||
if (_mask != NULL)
|
||||
{
|
||||
_last_button = 100;
|
||||
_mask->stop_run(K_AUTO_ENTER);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TMenu_application::menu(MENU_TAG mt)
|
||||
{
|
||||
bool ok = TRUE;
|
||||
switch (mt)
|
||||
{
|
||||
case MENU_ITEM(1): ok = main_loop(); break;
|
||||
case MENU_ITEM(2): choose_colors(); break;
|
||||
default: break;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char** argv)
|
||||
|
85
ba/ba0200a.uml
Executable file
85
ba/ba0200a.uml
Executable file
@ -0,0 +1,85 @@
|
||||
PAGE "Colori" -1 -1 50 16
|
||||
|
||||
GROUPBOX DLG_NULL 48 3
|
||||
BEGIN
|
||||
PROMPT 1 0 "Maschera"
|
||||
END
|
||||
|
||||
BUTTON 101 12
|
||||
BEGIN
|
||||
PROMPT 2 1 "Normale"
|
||||
END
|
||||
|
||||
BUTTON 102 12
|
||||
BEGIN
|
||||
PROMPT 18 1 "Chiaro"
|
||||
END
|
||||
|
||||
BUTTON 103 12
|
||||
BEGIN
|
||||
PROMPT 34 1 "Scuro"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 14 4
|
||||
BEGIN
|
||||
PROMPT 1 3 "Normale"
|
||||
END
|
||||
|
||||
BUTTON 104 10
|
||||
BEGIN
|
||||
PROMPT 2 4 "Testo"
|
||||
END
|
||||
|
||||
BUTTON 105 10
|
||||
BEGIN
|
||||
PROMPT 2 5 "Sfondo"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 14 4
|
||||
BEGIN
|
||||
PROMPT 18 3 "Attivo"
|
||||
END
|
||||
|
||||
BUTTON 106 10
|
||||
BEGIN
|
||||
PROMPT 19 4 "Testo"
|
||||
END
|
||||
|
||||
BUTTON 107 10
|
||||
BEGIN
|
||||
PROMPT 19 5 "Sfondo"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 14 4
|
||||
BEGIN
|
||||
PROMPT 35 3 "Disabilitato"
|
||||
END
|
||||
|
||||
BUTTON 108 10
|
||||
BEGIN
|
||||
PROMPT 36 4 "Testo"
|
||||
END
|
||||
|
||||
BUTTON 109 10
|
||||
BEGIN
|
||||
PROMPT 36 5 "Sfondo"
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 "Conferma"
|
||||
END
|
||||
|
||||
BUTTON DLG_USER 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 "~Azzera"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 "Annulla"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user