Ignore:
Timestamp:
Jun 15, 2012, 11:14:10 AM (12 years ago)
Author:
gah
Message:

fixes for drawingentry

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/src/RpCanvHotspot.c

    r3041 r3042  
    3636#define SEGMENT_TEXT    0
    3737#define SEGMENT_VALUE   1
    38 #define SEGMENT_ICON    2
    3938#define VAR_FLAGS (TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS)
    4039
     
    4544#define TRUE            1
    4645#define FALSE           0
     46#undef MAX
     47#define MAX(a,b)        (((a)>(b))?(a):(b))
    4748
    4849#undef ROUND
     
    5051
    5152#define IMAGE_PAD       3
     53#define TEXT_PADX       3
     54#define TEXT_PADY       1
    5255
    5356typedef struct _ItemSegment ItemSegment;
     
    105108    XColor *textColor;                  /* Color for normal text */
    106109    XColor *valueColor;                 /* Color for substitututed values. */
    107     XColor *activeValueColor;           /* Color for active substitututed
     110    XColor *activeColor;                /* Color for active substitututed
    108111                                         * values */
     112    Tk_3DBorder activeBorder;           /* Background color for active
     113                                         * substitututed values */
    109114    XColor *outlineColor;               /* Color for outline of rectangle */
    110115    Tk_3DBorder border;                 /* If non-NULL, background color of
     
    152157
    153158static Tk_ConfigSpec configSpecs[] = {
     159    {TK_CONFIG_BORDER, "-activebackground", (char *)NULL, (char*)NULL,
     160        "white", Tk_Offset(HotspotItem, activeBorder), TK_CONFIG_NULL_OK},
     161    {TK_CONFIG_COLOR, "-activeforeground", (char*)NULL, (char*)NULL,
     162        "cyan4", Tk_Offset(HotspotItem, activeColor), 0},
    154163    {TK_CONFIG_STRING, "-activeimage", "activeImage", (char*)NULL, (char*)NULL,
    155164        Tk_Offset(HotspotItem, activeImageName), TK_CONFIG_NULL_OK},
     
    168177    {TK_CONFIG_COLOR, "-foreground", "foreground", (char*)NULL,
    169178        "black", Tk_Offset(HotspotItem, textColor), 0},
    170     {TK_CONFIG_COLOR, "-activevalueforeground", (char*)NULL, (char*)NULL,
    171         "red3", Tk_Offset(HotspotItem, activeValueColor), 0},
    172179    {TK_CONFIG_FONT, "-valuefont", (char*)NULL, (char*)NULL,
    173180        "helvetica -12 bold", Tk_Offset(HotspotItem, valueFont), 0},
     
    181188        "flat", Tk_Offset(HotspotItem, relief), TK_CONFIG_DONT_SET_DEFAULT},
    182189    {TK_CONFIG_BOOLEAN, "-showicons", (char*)NULL, (char*)NULL,
    183         "", Tk_Offset(HotspotItem, showIcons), TK_CONFIG_DONT_SET_DEFAULT},
     190        "0", Tk_Offset(HotspotItem, showIcons), TK_CONFIG_DONT_SET_DEFAULT},
    184191    {TK_CONFIG_CUSTOM, "-tags", (char*)NULL, (char*)NULL,
    185192        (char*)NULL, 0, TK_CONFIG_NULL_OK, &tagsOption},
     
    564571
    565572static void
    566 AddVariableSegment(HotspotItem *itemPtr, const char *varName, int length)
     573AddValueSegment(HotspotItem *itemPtr, const char *varName, int length)
    567574{
    568575    ItemSegment *segPtr;
     
    597604
    598605static void
    599 AddHotspotSegment(HotspotItem *itemPtr, const char *varName, int length)
    600 {
    601     ItemSegment *segPtr;
    602 
    603     segPtr = (ItemSegment *)Tcl_Alloc(sizeof(ItemSegment) + length + 1);
    604     memset(segPtr, 0, sizeof(ItemSegment));
    605     segPtr->itemPtr = itemPtr;
    606     segPtr->lineNum = itemPtr->numLines;
    607     segPtr->type = SEGMENT_ICON;
    608     strncpy(segPtr->text, varName, length);
    609     segPtr->text[length] = '\0';
    610     segPtr->length = length;
    611     segPtr->x = segPtr->y = 0;
    612     segPtr->nextPtr = NULL;
    613     if (itemPtr->firstPtr == NULL) {
    614         itemPtr->firstPtr = segPtr;
    615     }
    616     if (itemPtr->lastPtr == NULL) {
    617         itemPtr->lastPtr = segPtr;
    618     } else {
    619         itemPtr->lastPtr->nextPtr = segPtr;
    620         itemPtr->lastPtr = segPtr;
    621     }
    622 }
    623 
    624 static void
    625606DestroySegment(ItemSegment *segPtr)
    626607{
     
    690671    int imgWidth, imgHeight;
    691672    int maxWidth, maxHeight;
    692     Tk_Font tkFont;
    693673    int justify;
    694674    int wrapLength;
     
    699679    flags = 0;
    700680    /* Collect the individual segment sizes. */
    701     imgWidth = itemPtr->maxImageWidth + 2 * IMAGE_PAD;
     681    imgWidth = itemPtr->maxImageWidth + IMAGE_PAD;
    702682    imgHeight = itemPtr->maxImageHeight + 2 * IMAGE_PAD;
    703683    for (segPtr = itemPtr->firstPtr; segPtr != NULL; segPtr = segPtr->nextPtr) {
     
    707687        w = h = 0;
    708688        switch (segPtr->type) {
    709         case SEGMENT_ICON:
     689        case SEGMENT_VALUE:
     690            segPtr->layout = Tk_ComputeTextLayout(itemPtr->valueFont,
     691                        segPtr->value, -1, wrapLength, justify, flags, &w, &h);
     692            w += TEXT_PADX * 2;
     693            h += TEXT_PADY * 2;
    710694            if (itemPtr->showIcons) {
    711                 w = imgWidth, h = imgHeight;
     695                w += imgWidth, h = MAX(h, imgHeight);
    712696            }
    713697            break;
    714         case SEGMENT_VALUE:
    715             tkFont = (itemPtr->valueFont != NULL) ?
    716                 itemPtr->valueFont : itemPtr->font;
    717             segPtr->layout = Tk_ComputeTextLayout(tkFont, segPtr->value,
    718                 -1, wrapLength, justify, flags, &w, &h);
    719             break;
    720698        case SEGMENT_TEXT:
    721             segPtr->layout = Tk_ComputeTextLayout(itemPtr->font,
    722                 segPtr->text, -1, wrapLength, justify, flags,
    723                 &w, &h);
     699            segPtr->layout = Tk_ComputeTextLayout(itemPtr->font, segPtr->text,
     700                        -1, wrapLength, justify, flags, &w, &h);
     701            w += TEXT_PADX * 2;
     702            h += TEXT_PADY * 2;
    724703            break;
    725704        default:
     
    745724        startPtr = segPtr;
    746725        x = 0;
     726
    747727        while ((segPtr != NULL) && (segPtr->lineNum == lineNum)) {
    748728            if (segPtr->height > maxHeight) {
     
    793773            for (q = varName; q != '\0'; q++) {
    794774                if (*q == '}') {
    795                     AddHotspotSegment(itemPtr, varName, q- varName);
    796                     AddVariableSegment(itemPtr, varName, q - varName);
     775                    AddValueSegment(itemPtr, varName, q - varName);
    797776                    p = q;
    798777                    start = p + 1;
     
    870849    itemPtr->tkwin = tkwin;
    871850    itemPtr->valueInterp = interp;
    872     itemPtr->showIcons = TRUE;
     851    itemPtr->showIcons = FALSE;
    873852
    874853    /* Process the arguments to fill in the item record. */
     
    1010989    /* Substituted value GC. */
    1011990    mask = GCFont | GCForeground;
    1012     if (itemPtr->valueFont != NULL) {
    1013         gcValues.font = Tk_FontId(itemPtr->valueFont);
    1014     } else {
    1015         gcValues.font = Tk_FontId(itemPtr->font);
    1016     }
    1017     if (itemPtr->valueColor != NULL) {
    1018         gcValues.foreground = itemPtr->valueColor->pixel;
    1019     } else {
    1020         gcValues.foreground = itemPtr->textColor->pixel;
    1021     }
     991    gcValues.font = Tk_FontId(itemPtr->valueFont);
     992    gcValues.foreground = itemPtr->valueColor->pixel;
    1022993    newGC = Tk_GetGC(tkwin, mask, &gcValues);
    1023994    if (itemPtr->valueGC != None) {
     
    1028999    /* Active substituted value GC. */
    10291000    mask = GCFont | GCForeground;
    1030     if (itemPtr->valueFont != NULL) {
    1031         gcValues.font = Tk_FontId(itemPtr->valueFont);
    1032     } else {
    1033         gcValues.font = Tk_FontId(itemPtr->font);
    1034     }
    1035     gcValues.foreground = itemPtr->activeValueColor->pixel;
     1001    gcValues.font = Tk_FontId(itemPtr->valueFont);
     1002    gcValues.foreground = itemPtr->activeColor->pixel;
    10361003    newGC = Tk_GetGC(tkwin, mask, &gcValues);
    10371004    if (itemPtr->activeGC != None) {
     
    11241091        Tk_FreeColor(itemPtr->valueColor);
    11251092    }
     1093    if (itemPtr->activeColor != NULL) {
     1094        Tk_FreeColor(itemPtr->activeColor);
     1095    }
    11261096    if (itemPtr->outlineColor != NULL) {
    11271097        Tk_FreeColor(itemPtr->outlineColor);
     1098    }
     1099    if (itemPtr->border != NULL) {
     1100        Tk_Free3DBorder(itemPtr->border);
     1101    }
     1102    if (itemPtr->activeBorder != NULL) {
     1103        Tk_Free3DBorder(itemPtr->activeBorder);
    11281104    }
    11291105    if (itemPtr->text != NULL) {
     
    12671243{
    12681244    HotspotItem *itemPtr;
     1245    GC gc;
     1246    int isActive;
    12691247
    12701248    itemPtr = segPtr->itemPtr;
    1271     if (segPtr->type == SEGMENT_ICON) {
     1249    if (segPtr->type == SEGMENT_TEXT) {
     1250        Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable,
     1251                itemPtr->normalGC, segPtr->layout, x + segPtr->x + TEXT_PADX,
     1252                y + segPtr->y + TEXT_PADY, 0, -1);
     1253        return;
     1254    }
     1255    isActive = ((itemPtr->activeValue != NULL) &&
     1256                (strcmp(itemPtr->activeValue, segPtr->text) == 0));
     1257       
     1258    if ((itemPtr->activeBorder != NULL) && (isActive)) {
     1259        Tk_Fill3DRectangle(itemPtr->tkwin, drawable, itemPtr->activeBorder,
     1260                x + segPtr->x, y + segPtr->y, segPtr->width, segPtr->height,
     1261                1, TK_RELIEF_SOLID);
     1262    }
     1263    if (itemPtr->showIcons) {
    12721264        Tk_Image tkImage;
    12731265        int w, h;
    1274 
    1275         if (!itemPtr->showIcons) {
    1276             return;
    1277         }
    1278         tkImage = NULL;
    1279         if ((itemPtr->activeValue != NULL) &&
    1280             (strcmp(itemPtr->activeValue, segPtr->text) == 0)) {
    1281             tkImage = itemPtr->activeImage;
    1282         }
    1283         if (tkImage == NULL) {
    1284             tkImage = itemPtr->image;
    1285         }
     1266        int ix, iy, ih, iw;
     1267
     1268        ih = itemPtr->maxImageHeight * 2 * IMAGE_PAD;
     1269        iw = itemPtr->maxImageWidth + IMAGE_PAD;
     1270        ix = x + segPtr->x + IMAGE_PAD;
     1271        iy = y + segPtr->y + IMAGE_PAD;
     1272        if (segPtr->height > ih) {
     1273            iy += (segPtr->height - ih) / 2;
     1274        }
     1275        tkImage = (isActive) ? itemPtr->activeImage : itemPtr->image;
    12861276        Tk_SizeOfImage(tkImage, &w, &h);
    1287         Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, x + segPtr->x + IMAGE_PAD,
    1288                 y + segPtr->y + IMAGE_PAD);
    1289     } else if (segPtr->type == SEGMENT_VALUE) {
    1290         GC gc;
    1291        
    1292         gc = itemPtr->valueGC;
    1293         if ((itemPtr->activeValue != NULL) &&
    1294             (strcmp(itemPtr->activeValue, segPtr->text) == 0)) {
    1295             gc = itemPtr->activeGC;
    1296             Tk_UnderlineTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc,
    1297                 segPtr->layout, x + segPtr->x, y + segPtr->y, -1);
    1298         }
    1299         Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc,
    1300                 segPtr->layout, x + segPtr->x, y + segPtr->y, 0, -1);
    1301     } else {
    1302         Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable,
    1303                 itemPtr->normalGC, segPtr->layout, x + segPtr->x,
    1304                 y + segPtr->y, 0, -1);
    1305     }
     1277        Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, ix, iy);
     1278        x += iw;
     1279    }
     1280    gc = (isActive) ? itemPtr->activeGC : itemPtr->valueGC;
     1281    Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, segPtr->layout,
     1282         x + segPtr->x + TEXT_PADX, y + segPtr->y + TEXT_PADY, 0, -1);
    13061283}
    13071284
     
    16881665            continue;                   /* Ignore text segments. */
    16891666        }
    1690         if ((segPtr->type == SEGMENT_ICON) && (!itemPtr->showIcons)) {
    1691             continue;
    1692         }
    16931667        if ((x >= segPtr->x) && (x < (segPtr->x + segPtr->width)) &&
    16941668            (y >= segPtr->y) && (y < (segPtr->y + segPtr->height))) {
Note: See TracChangeset for help on using the changeset viewer.