abgeleitet von dem ersten Design Mod (volle Ausnutzung des Displays für das Menü) habe ich eine 2. Version erstellt, die zusätzlich noch ein paar kleine Design Verbesserungen enthält. Dies sind zum Beispiel Wahl der Menüüberschriftsschrift/hintergundfarbe (tolles Wort ) bzw. Wahl der Cursorschrift/hintergundfarbe über die Anzeigeeinstellungen. Als weiteres goody wird das Menü nun immer horizontal und vertikal Zentriert dargestellt.
[center]
Font download
[/center]
Um den Mod zu übernehmen müsst ihn folgende Dateien umändern: (ca. 20min)
1.)
core/conf.c
(Zeile: ca. 249, an das Ende der Konstantendeklaration einfügen. Nummer hier 127 muss gegebenenfalls verändert werden, es muss eine fortlaufende Reihe enstehen)
- Code: Alles auswählen
CONF_INFO(127, conf.menu_title_color, CONF_DEF_VALUE, cl:MAKE_COLOR(COLOR_WHITE, COLOR_BLACK), NULL),
2.)
core/gui.c
(Zeilen: ca. 381/382)
suchen:
- Code: Alles auswählen
{LANG_MENU_VIS_MENU_BKG, MENUITEM_COLOR_BG, (int*)&conf.menu_color },
danach einfügen:
- Code: Alles auswählen
{LANG_MENU_VIS_MENU_TITLE_TEXT, MENUITEM_COLOR_FG, (int*)&conf.menu_title_color },
{LANG_MENU_VIS_MENU_TITLE_BKG, MENUITEM_COLOR_BG, (int*)&conf.menu_title_color },
(Zeile: ca. 1059 löschen)
suchen und löschen:
- Code: Alles auswählen
draw_txt_string(20, 14, "<CNF>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
(Zeile: ca. 1676)
suchen:
- Code: Alles auswählen
draw_filled_rect(x, y, x+w, y+h, cl);
ersetzen durch:
- Code: Alles auswählen
draw_filled_round_rect(x, y, x+w, y+h, cl);
3.)
core/gui_draw.h
(Zeile: ca. 37)
suchen:
- Code: Alles auswählen
extern void draw_rect(coord x1, coord y1, coord x2, coord y2, color cl);
danach einfügen:
- Code: Alles auswählen
extern void draw_round_rect(coord x1, coord y1, coord x2, coord y2, color cl);
(Zeile:ca. 40)
suchen:
- Code: Alles auswählen
extern void draw_filled_rect(coord x1, coord y1, coord x2, coord y2, color cl);
danach einfügen:
- Code: Alles auswählen
extern void draw_filled_round_rect(coord x1, coord y1, coord x2, coord y2, color cl);
4.)
core/gui_draw.c
(ab ca. Zeile 112 Funktion einfügen)
- Code: Alles auswählen
void draw_round_rect(coord x1, coord y1, coord x2, coord y2, color cl) {
unsigned int xMin, yMin, xMax, yMax, x, y;
if (x1>x2) {
xMax=x1; xMin=x2;
} else {
xMin=x1; xMax=x2;
}
if (y1>y2) {
yMax=y1; yMin=y2;
} else {
yMin=y1; yMax=y2;
}
if (xMax>=screen_width) xMax=screen_width-1;
if (xMin>=screen_width) xMin=screen_width-1;
if (yMax>=screen_height) yMax=screen_height-1;
if (yMin>=screen_height) yMin=screen_height-1;
for (y=yMin+2; y<=yMax-2; ++y) {
draw_pixel(xMin, y, cl);
draw_pixel(xMax, y, cl);
}
for (x=xMin+2; x<=xMax-2; ++x) {
draw_pixel(x, yMin, cl);
draw_pixel(x, yMax, cl);
}
}
//-------------------------------------------------------------------
(ab ca. Zeile 164 Funktion einfügen)
- Code: Alles auswählen
void draw_filled_round_rect(coord x1, coord y1, coord x2, coord y2, color cl) {
unsigned int xMin, yMin, xMax, yMax, x, y;
if (x1>x2) {
xMax=x1; xMin=x2;
} else {
xMin=x1; xMax=x2;
}
if (y1>y2) {
yMax=y1; yMin=y2;
} else {
yMin=y1; yMax=y2;
}
if (xMax>=screen_width) xMax=screen_width-1;
if (xMin>=screen_width) xMin=screen_width-1;
if (yMax>=screen_height) yMax=screen_height-1;
if (yMin>=screen_height) yMin=screen_height-1;
draw_round_rect(x1, y1, x2, y2, cl>>8);
for (y=yMin+1; y<=yMax-1; ++y) {
for (x=xMin+1; x<=xMax-1; ++x) {
draw_pixel(x, y, cl>>8);
}
}
}
//-------------------------------------------------------------------
5.)
core/gui_lang.h
(Zeilen: ca. 361/362), am ende einfügen, Index hochzählen und GUI_LANG_ITEMS um 2 erhöhen (277))
suchen (Zahl 275 ist nur ein Beispiel):
- Code: Alles auswählen
#define GUI_LANG_ITEMS 275
ersetzen durch (Zahl 275 um 2 erhöhen = 277)
- Code: Alles auswählen
#define GUI_LANG_ITEMS 277
und davor einfügen (Achtung auch hier muss eine Fortlaufende liste enstehen, es dürfen keine doppelten Zahlen vorkommen):
- Code: Alles auswählen
#define LANG_MENU_VIS_MENU_TITLE_TEXT 276
#define LANG_MENU_VIS_MENU_TITLE_BKG 277
6.)
core/gui_lang.c
(Zeilen: ca. 354/355, hier dieselben Zahlen aus 5.) verwenden)
suchen: Erstes Semikolon (";")
davor einfügen:
- Code: Alles auswählen
"276 \"Menu Title & Cursor Text\"\n"
"277 \"Menu Title & Cursor Background\"\n"
Zusatz: Gegebenenfalls noch die Deutsche Sprachdatei ergänzen.
7.)
core/gui_menu.c
(Zeile: ca. 53 ersetzen)
suchen:
- Code: Alles auswählen
num_lines = (screen_height-26-16)/rbf_font_height()-2;
ersetzen durch:
- Code: Alles auswählen
num_lines = screen_height/rbf_font_height()-1;
(Zeile: ca. 56 löschen)
- Code: Alles auswählen
y = ((screen_height-num_lines*rbf_font_height())>>1);
(Funktion ab Zeile ca. 320 ersetzen)
- Code: Alles auswählen
void gui_menu_draw_initial() {
color cl=conf.menu_title_color>>8;
unsigned char wplus=0;
for (count=0; curr_menu->menu[count].text; ++count);
if (count>num_lines) {
y = ((screen_height-(num_lines-1)*rbf_font_height())>>1);
wplus=8;
// scrollbar background
draw_filled_rect((x+w), y, (x+w)+wplus, y+num_lines*rbf_font_height()-1, MAKE_COLOR((conf.menu_color>>8)&0xFF, (conf.menu_color>>8)&0xFF));
} else y = (screen_height-(count-1)*rbf_font_height())>>1;
rbf_draw_string_center_len(x, y-rbf_font_height(), w+wplus, lang_str(curr_menu->title), conf.menu_title_color);
if (cl!=COLOR_FG)
draw_line(x,y-1,x+w-1+wplus,y-1,COLOR_FG);
}
(Zeile: ca. 351 ersetzen)
suchen:
- Code: Alles auswählen
cl = (gui_menu_curr_item==imenu)?MAKE_COLOR(COLOR_SELECTED_BG, COLOR_SELECTED_FG):conf.menu_color;
ersetzen durch:
- Code: Alles auswählen
cl = (gui_menu_curr_item==imenu)?conf.menu_title_color:conf.menu_color;
(Funktionsnamen "draw_filled_rect" ersetzten durch "draw_filled_round_rect". In Zeilen (ca. 407, 429, 431, 433)
(Zeile: ca. 407)
suchen:
- Code: Alles auswählen
draw_filled_rect(x+w-1-cl_rect-2-len_space, yy+2, x+w-1-2-len_space, yy+rbf_font_height()-1-2,
Funktionsnamen (draw_filled_rect) ersetzten durch:
- Code: Alles auswählen
draw_filled_round_rect
(Zeile: ca. 429)
suchen:
- Code: Alles auswählen
draw_filled_rect((x+w)+2, y+1,
Funktionsnamen (draw_filled_rect) ersetzten durch:
- Code: Alles auswählen
draw_filled_round_rect
(Zeile: ca. 431)
suchen:
- Code: Alles auswählen
draw_filled_rect((x+w)+2, y+i+j,
Funktionsnamen (draw_filled_rect) ersetzten durch:
- Code: Alles auswählen
draw_filled_round_rect
(Zeile: ca. 433)
suchen:
- Code: Alles auswählen
draw_filled_rect((x+w)+2, y+1+i,
Funktionsnamen (draw_filled_rect) ersetzten durch:
- Code: Alles auswählen
draw_filled_round_rect
8.)
include/conf.h
(Zeile: ca. 67)
suchen:
- Code: Alles auswählen
color menu_color;
danach einfügen:
- Code: Alles auswählen
color menu_title_color;
9.)
include/font.h
(Zeile: ca.34 einfügen)
suchen:
- Code: Alles auswählen
extern int rbf_draw_string_right_len(int x, int y, int len, const char *str, color cl);
danach einfügen:
- Code: Alles auswählen
extern int rbf_draw_string_center_len(int x, int y, int len, const char *str, color cl);
10.)
lib/font/rbf_font.c
(Zeile: ca. 271)
Funktion am Ende einfügen:
- Code: Alles auswählen
int rbf_draw_string_center_len(int x, int y, int len, const char *str, color cl) {
int l=0, strLen=0, i, yy, rund=2;
const char *s=str;
while (*s && l+rbf_char_width(*s)<=len)
l+=rbf_char_width(*s++);
strLen=l;
l=(len-strLen)/2;
for (i=l; i>=0; --i) {
for (yy=y+rund; yy<y+rbf_font.height; ++yy) {
draw_pixel(x+l-i, yy, cl>>8);
draw_pixel(x+i+strLen+l-1, yy, cl>>8);
}
if (rund>0) rund--;
}
while (*str && l+rbf_char_width(*str)<=len)
l+=rbf_draw_char(x+l, y, *str++, cl);
return l;
}
//-------------------------------------------------------------------
So das wär’s gewesen. Ich hoffe es ist verständlich, sonst einfach noch mal nachfragen. Würde mich über weitere Verbesserungsvorschläge freuen. Es ist auch denkbar ein neues Konzept eines grafischen Menüs in Zukunft umzusetzen. Doch ich hab noch keine zündende Idee. Wenn jemand eine Vorstellung hat kann er sie ja mal posten.
Anhang:
Weitere geeignete Cursorhintergrundfarben: 0x34, 0x42, 0x54, 0x74, 0xE8 und viele weitere (einfach was Schönes aussuchen)
Beispielbilder:
[center]
[/center]
CHDKLover