summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Williams <pfaedit@users.sourceforge.net>2011-03-18 14:40:39 -0700
committerGeorge Williams <pfaedit@users.sourceforge.net>2011-03-18 14:40:39 -0700
commit5343046c12667623cd496a75698577a820428781 (patch)
tree3b4a7d46f62c4d93be8264e703479feb72ac5023
parentc852d958c10cfb1d7fe9f7014fc89774d2b14dc8 (diff)
On my mac, when displaying a contextual chaining lookup, the => glyph seems to float out of line with the rest of the text. This causes us to need a huge line spacing which we did not expect.
So... go through various kludges to make things look pretty.
-rw-r--r--fontforge/contextchain.c2
-rw-r--r--gdraw/ggadgetP.h1
-rw-r--r--gdraw/gmatrixedit.c190
3 files changed, 122 insertions, 71 deletions
diff --git a/fontforge/contextchain.c b/fontforge/contextchain.c
index 7292e792..e6802b1e 100644
--- a/fontforge/contextchain.c
+++ b/fontforge/contextchain.c
@@ -585,6 +585,7 @@ return;
md = GMatrixEditGet(list,&len);
free(md[ccd->row_being_edited].u.md_str);
md[ccd->row_being_edited].u.md_str = ret;
+ GMatrixEditSet(list,md,len,false);
ccd->aw = aw_classrules;
GDrawSetVisible(ccd->classnumber,false);
GDrawSetVisible(ccd->classrules,true);
@@ -624,6 +625,7 @@ return;
md = GMatrixEditGet(list,&len);
free(md[ccd->row_being_edited].u.md_str);
md[ccd->row_being_edited].u.md_str = ret;
+ GMatrixEditSet(list,md,len,false);
ccd->aw = aw_grules;
GDrawSetVisible(ccd->glyphs,false);
GDrawSetVisible(ccd->grules,true);
diff --git a/gdraw/ggadgetP.h b/gdraw/ggadgetP.h
index 88353607..35bb6a0a 100644
--- a/gdraw/ggadgetP.h
+++ b/gdraw/ggadgetP.h
@@ -433,6 +433,7 @@ typedef struct gmatrixedit {
int pressed_col; /* For changing column spacing */
struct matrix_data *data;
int16 as, fh;
+ int16 font_as, font_fh;
FontInstance *font;
FontInstance *titfont;
GGadget *tf;
diff --git a/gdraw/gmatrixedit.c b/gdraw/gmatrixedit.c
index 31edc25b..c5460805 100644
--- a/gdraw/gmatrixedit.c
+++ b/gdraw/gmatrixedit.c
@@ -609,11 +609,11 @@ static int GMatrixEdit_Expose(GWindow pixmap, GGadget *g, GEvent *event) {
GBoxDrawBorder(pixmap,&g->r,g->box,g->state,false);
if ( gme->has_titles ) {
r = gme->g.inner;
- r.height = gme->fh;
+ r.height = gme->font_fh;
r.width = gme->hsb->r.width;
GDrawPushClip(pixmap,&r,&older);
GDrawFillRect(pixmap,&r,gmatrixedit_title_bg);
- y = r.y + gme->as;
+ y = r.y + gme->font_as;
GDrawSetFont(pixmap,gme->titfont);
for ( lastc = gme->cols-1; lastc>0 && gme->col_data[lastc].hidden; --lastc );
for ( c=0; c<gme->cols; ++c ) {
@@ -662,13 +662,92 @@ static void GMatrixEdit_Redraw(GGadget *g ) {
_ggadget_redraw(g);
}
+static char *MD_Text(GMatrixEdit *gme,int r, int c ) {
+ char buffer[20], *str= NULL;
+ struct matrix_data *d = &gme->data[r*gme->cols+c];
+
+ switch ( gme->col_data[c].me_type ) {
+ case me_enum:
+ /* Fall through into next case */
+ case me_int:
+ sprintf( buffer,"%d",(int) d->u.md_ival );
+ str = buffer;
+ break;
+ case me_hex:
+ sprintf( buffer,"0x%x",(int) d->u.md_ival );
+ str = buffer;
+ break;
+ case me_uhex:
+ sprintf( buffer,"U+%04X",(int) d->u.md_ival );
+ str = buffer;
+ break;
+ case me_addr:
+ sprintf( buffer,"%p", d->u.md_addr );
+ str = buffer;
+ break;
+ case me_real:
+ sprintf( buffer,"%g",d->u.md_real );
+ str = buffer;
+ break;
+ case me_string: case me_bigstr:
+ case me_funcedit:
+ case me_onlyfuncedit:
+ case me_button:
+ case me_stringchoice: case me_stringchoicetrans: case me_stringchoicetag:
+ str = d->u.md_str;
+ break;
+ case me_func:
+ str = d->u.md_str;
+ if ( str==NULL )
+return( (gme->col_data[c].func)(&gme->g,r,c) );
+ break;
+ }
+return( copy(str));
+}
+
+static int GME_RecalcFH(GMatrixEdit *gme) {
+ int r,c, as, ds;
+ char *str;
+ GTextBounds bounds;
+ GMenuItem *mi;
+
+ GDrawSetFont(gme->nested,gme->font);
+ as = gme->font_as; ds = gme->font_fh-as;
+ for ( r=0; r<gme->rows; ++r ) for ( c=0; c<gme->cols; ++c ) {
+ switch ( gme->col_data[c].me_type ) {
+ case me_enum:
+ mi = FindMi(gme->col_data[c].enum_vals,gme->data[r*gme->cols+c].u.md_ival);
+ if ( mi==NULL )
+ continue;
+ str = copy( (char *)mi->ti.text );
+ break;
+ default:
+ str = MD_Text(gme,r,c);
+ break;
+ }
+ GDrawGetBiText8Bounds(gme->nested, str, -1, NULL, &bounds);
+ free(str);
+ if ( bounds.as>as )
+ as = bounds.as;
+ if ( bounds.ds>ds )
+ ds = bounds.ds;
+ }
+ if ( as!=gme->as || as+ds!=gme->fh ) {
+ gme->fh = as+ds;
+ gme->as = as;
+return( true );
+ }
+return( false );
+}
+
static void GMatrixEdit_SetFont(GGadget *g,FontInstance *new) {
GMatrixEdit *gme = (GMatrixEdit *) g;
int as, ds, ld;
gme->font = new;
GDrawWindowFontMetrics(g->base,gme->font,&as, &ds, &ld);
- gme->as = as;
- gme->fh = as+ds;
+ gme->font_as = gme->as = as;
+ gme->font_fh = gme->fh = as+ds;
+ GME_RecalcFH(gme);
GME_FixScrollBars(gme);
GDrawRequestExpose(gme->nested,NULL,false);
}
@@ -892,6 +971,10 @@ return( false );
gme->edit_active = false;
GGadgetSetVisible(gme->tf,false);
GME_AdjustCol(gme,gme->active_col);
+ if ( GME_RecalcFH(gme) ) {
+ GME_FixScrollBars(gme);
+ GDrawRequestExpose(gme->nested,NULL,false);
+ }
gme->wasnew = false;
return( true );
@@ -1249,49 +1332,6 @@ static void GME_StringChoices(GMatrixEdit *gme,GEvent *event,int r,int c) {
_GMenuCreatePopupMenu(gme->nested,event, mi, GME_FinishChoice);
}
-static char *MD_Text(GMatrixEdit *gme,int r, int c ) {
- char buffer[20], *str= NULL;
- struct matrix_data *d = &gme->data[r*gme->cols+c];
-
- switch ( gme->col_data[c].me_type ) {
- case me_enum:
- /* Fall through into next case */
- case me_int:
- sprintf( buffer,"%d",(int) d->u.md_ival );
- str = buffer;
- break;
- case me_hex:
- sprintf( buffer,"0x%x",(int) d->u.md_ival );
- str = buffer;
- break;
- case me_uhex:
- sprintf( buffer,"U+%04X",(int) d->u.md_ival );
- str = buffer;
- break;
- case me_addr:
- sprintf( buffer,"%p", d->u.md_addr );
- str = buffer;
- break;
- case me_real:
- sprintf( buffer,"%g",d->u.md_real );
- str = buffer;
- break;
- case me_string: case me_bigstr:
- case me_funcedit:
- case me_onlyfuncedit:
- case me_button:
- case me_stringchoice: case me_stringchoicetrans: case me_stringchoicetag:
- str = d->u.md_str;
- break;
- case me_func:
- str = d->u.md_str;
- if ( str==NULL )
-return( (gme->col_data[c].func)(&gme->g,r,c) );
- break;
- }
-return( copy(str));
-}
-
static void GMatrixEdit_StartSubGadgets(GMatrixEdit *gme,int r, int c,GEvent *event) {
int i, markpos, lastc;
struct matrix_data *d;
@@ -1508,7 +1548,7 @@ static void GMatrixEdit_SubExpose(GMatrixEdit *gme,GWindow pixmap,GEvent *event)
++r ) {
int y, lastc;
clip.y = r*(gme->fh+gme->vpad);
- y = clip.y + gme->as;
+ y = clip.y + gme->font_as; /* I know this looks odd, but it seems to work when we grab a glyph from another font with cairo */
clip.height = gme->fh;
for ( lastc = gme->cols-1; lastc>0 && gme->col_data[lastc].hidden; --lastc );
/* Compensate for the top border line */
@@ -1920,8 +1960,8 @@ GGadget *GMatrixEditCreate(struct gwindow *base, GGadgetData *gd,void *data) {
gme->font = gmatrixedit_font;
gme->titfont = gmatrixedit_titfont;
GDrawWindowFontMetrics(base,gme->font,&as, &ds, &ld);
- gme->fh = as+ds;
- gme->as = as;
+ gme->font_as = gme->as = as;
+ gme->font_fh = gme->fh = as+ds;
gme->rows = matrix->initial_row_cnt; gme->cols = matrix->col_cnt;
gme->row_max = gme->rows;
@@ -2045,6 +2085,7 @@ GGadget *GMatrixEditCreate(struct gwindow *base, GGadgetData *gd,void *data) {
gme->hsb = GScrollBarCreate(base,&sub_gd,gme);
gme->hsb->contained = true;
+ GME_RecalcFH(gme);
{
static GBox small = { 0 };
static unichar_t nullstr[1] = { 0 };
@@ -2074,31 +2115,38 @@ void GMatrixEditSet(GGadget *g,struct matrix_data *data, int rows, int copy_it)
GMatrixEdit *gme = (GMatrixEdit *) g;
int r,c;
- MatrixDataFree(gme);
-
- gme->rows = gme->row_max = rows;
- if ( !copy_it ) {
- gme->data = data;
+ if ( data==gme->data ) {
+ if ( rows<gme->rows )
+ gme->rows = rows;
+ GME_RecalcFH(gme);
} else {
- gme->data = gcalloc(rows*gme->cols,sizeof(struct matrix_data));
- memcpy(gme->data,data,rows*gme->cols*sizeof(struct matrix_data));
- for ( c=0; c<gme->cols; ++c ) {
- enum me_type me_type = gme->col_data[c].me_type;
- if ( me_type==me_string || me_type==me_bigstr || me_type==me_func ||
- me_type==me_button || me_type==me_onlyfuncedit ||
- me_type==me_funcedit || me_type==me_stringchoice ||
- me_type==me_stringchoicetrans || me_type==me_stringchoicetag ) {
- for ( r=0; r<rows; ++r )
- gme->data[r*gme->cols+c].u.md_str = copy(gme->data[r*gme->cols+c].u.md_str);
+ MatrixDataFree(gme);
+
+ gme->rows = gme->row_max = rows;
+ if ( !copy_it ) {
+ gme->data = data;
+ } else {
+ gme->data = gcalloc(rows*gme->cols,sizeof(struct matrix_data));
+ memcpy(gme->data,data,rows*gme->cols*sizeof(struct matrix_data));
+ for ( c=0; c<gme->cols; ++c ) {
+ enum me_type me_type = gme->col_data[c].me_type;
+ if ( me_type==me_string || me_type==me_bigstr || me_type==me_func ||
+ me_type==me_button || me_type==me_onlyfuncedit ||
+ me_type==me_funcedit || me_type==me_stringchoice ||
+ me_type==me_stringchoicetrans || me_type==me_stringchoicetag ) {
+ for ( r=0; r<rows; ++r )
+ gme->data[r*gme->cols+c].u.md_str = copy(gme->data[r*gme->cols+c].u.md_str);
+ }
}
}
- }
+ GME_RecalcFH(gme);
- gme->active_row = gme->active_col = -1;
- GME_EnableDelete(gme);
- if ( !GME_AdjustCol(gme,-1)) {
- GME_FixScrollBars(gme);
- GDrawRequestExpose(gme->nested,NULL,false);
+ gme->active_row = gme->active_col = -1;
+ GME_EnableDelete(gme);
+ if ( !GME_AdjustCol(gme,-1)) {
+ GME_FixScrollBars(gme);
+ GDrawRequestExpose(gme->nested,NULL,false);
+ }
}
}