Changeset 3041 for trunk/gui/src


Ignore:
Timestamp:
Jun 14, 2012 2:30:43 PM (12 years ago)
Author:
gah
Message:

fixes for drawing

File:
1 edited

Legend:

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

    r3040 r3041  
    3434#include "tk.h"
    3535
    36 #define SEGMENT_TYPE_TEXT       0
    37 #define SEGMENT_TYPE_VARIABLE   1
    38 #define SEGMENT_TYPE_HOTSPOT    2
     36#define SEGMENT_TEXT    0
     37#define SEGMENT_VALUE   1
     38#define SEGMENT_ICON    2
    3939#define VAR_FLAGS (TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS)
    4040
     
    4242#define LAYOUT_PENDING          (1<<1)
    4343#define SUBSTITUTIONS_PENDING   (1<<2)
     44
     45#define TRUE            1
     46#define FALSE           0
    4447
    4548#undef ROUND
     
    108111                                         * rectangle enclosing the entire
    109112                                         * hotspot item. */
    110     Tk_3DBorder activeValueBorder;      /* If non-NULL, background color of
    111                                          * active substituted values. */
    112113    int borderWidth;                    /* 3D border width (drawn under
    113114                                         * -outline) */
     
    139140    short int maxImageWidth, maxImageHeight;
    140141    int numLines;
     142    int showIcons;                      /* Indicates whether to draw icons. */
    141143};
    142144
     
    155157        Tk_Offset(HotspotItem, activeValue), TK_CONFIG_NULL_OK},
    156158    {TK_CONFIG_ANCHOR, "-anchor", "anchor", (char*)NULL,
    157         "center", Tk_Offset(HotspotItem, anchor),
    158         TK_CONFIG_DONT_SET_DEFAULT},
     159        "center", Tk_Offset(HotspotItem, anchor), TK_CONFIG_DONT_SET_DEFAULT},
    159160    {TK_CONFIG_BORDER, "-background", (char *)NULL, (char*)NULL,
    160161        "", Tk_Offset(HotspotItem, border), TK_CONFIG_NULL_OK},
    161162    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", (char*)NULL,
    162         "0", Tk_Offset(HotspotItem, borderWidth), 0},
     163        "0", Tk_Offset(HotspotItem, borderWidth), TK_CONFIG_DONT_SET_DEFAULT},
    163164    {TK_CONFIG_BORDER, "-fill", (char *)NULL, (char*)NULL,
    164165        "", Tk_Offset(HotspotItem, border), TK_CONFIG_NULL_OK},
     
    167168    {TK_CONFIG_COLOR, "-foreground", "foreground", (char*)NULL,
    168169        "black", Tk_Offset(HotspotItem, textColor), 0},
    169     {TK_CONFIG_COLOR, "-activevaluebackground", (char*)NULL, (char*)NULL,
    170         "blue", Tk_Offset(HotspotItem, activeValueBorder), 0},
     170    {TK_CONFIG_COLOR, "-activevalueforeground", (char*)NULL, (char*)NULL,
     171        "red3", Tk_Offset(HotspotItem, activeValueColor), 0},
    171172    {TK_CONFIG_FONT, "-valuefont", (char*)NULL, (char*)NULL,
    172173        "helvetica -12 bold", Tk_Offset(HotspotItem, valueFont), 0},
     
    178179        "", Tk_Offset(HotspotItem, outlineColor), TK_CONFIG_NULL_OK},
    179180    {TK_CONFIG_RELIEF, "-relief", (char*)NULL, (char*)NULL,
    180         "flat", Tk_Offset(HotspotItem, relief), 0},
     181        "flat", Tk_Offset(HotspotItem, relief), TK_CONFIG_DONT_SET_DEFAULT},
     182    {TK_CONFIG_BOOLEAN, "-showicons", (char*)NULL, (char*)NULL,
     183        "", Tk_Offset(HotspotItem, showIcons), TK_CONFIG_DONT_SET_DEFAULT},
    181184    {TK_CONFIG_CUSTOM, "-tags", (char*)NULL, (char*)NULL,
    182185        (char*)NULL, 0, TK_CONFIG_NULL_OK, &tagsOption},
     
    543546    segPtr->itemPtr = itemPtr;
    544547    segPtr->lineNum = itemPtr->numLines;
    545     segPtr->type = SEGMENT_TYPE_TEXT;
     548    segPtr->type = SEGMENT_TEXT;
    546549    strncpy(segPtr->text, text, length);
    547550    segPtr->text[length] = '\0';
     
    570573    segPtr->itemPtr = itemPtr;
    571574    segPtr->lineNum = itemPtr->numLines;
    572     segPtr->type = SEGMENT_TYPE_VARIABLE;
     575    segPtr->type = SEGMENT_VALUE;
    573576    strncpy(segPtr->text, varName, length);
    574577    segPtr->text[length] = '\0';
     
    602605    segPtr->itemPtr = itemPtr;
    603606    segPtr->lineNum = itemPtr->numLines;
    604     segPtr->type = SEGMENT_TYPE_HOTSPOT;
     607    segPtr->type = SEGMENT_ICON;
    605608    strncpy(segPtr->text, varName, length);
    606609    segPtr->text[length] = '\0';
     
    628631        Tk_FreeTextLayout(segPtr->layout);
    629632    }
    630     if (segPtr->type == SEGMENT_TYPE_VARIABLE) {
     633    if (segPtr->type == SEGMENT_VALUE) {
    631634        Tcl_UntraceVar(itemPtr->interp, segPtr->text, VAR_FLAGS, TraceVarProc,
    632635                itemPtr);
     
    664667        const char *value;
    665668
    666         if (segPtr->type != SEGMENT_TYPE_VARIABLE) {
     669        if (segPtr->type != SEGMENT_VALUE) {
    667670            continue;
    668671        }
     
    702705            Tk_FreeTextLayout(segPtr->layout);
    703706        }
     707        w = h = 0;
    704708        switch (segPtr->type) {
    705         case SEGMENT_TYPE_HOTSPOT:
    706             w = imgWidth, h = imgHeight;
     709        case SEGMENT_ICON:
     710            if (itemPtr->showIcons) {
     711                w = imgWidth, h = imgHeight;
     712            }
    707713            break;
    708         case SEGMENT_TYPE_VARIABLE:
     714        case SEGMENT_VALUE:
    709715            tkFont = (itemPtr->valueFont != NULL) ?
    710716                itemPtr->valueFont : itemPtr->font;
     
    712718                -1, wrapLength, justify, flags, &w, &h);
    713719            break;
    714         case SEGMENT_TYPE_TEXT:
     720        case SEGMENT_TEXT:
    715721            segPtr->layout = Tk_ComputeTextLayout(itemPtr->font,
    716722                segPtr->text, -1, wrapLength, justify, flags,
     
    787793            for (q = varName; q != '\0'; q++) {
    788794                if (*q == '}') {
     795                    AddHotspotSegment(itemPtr, varName, q- varName);
    789796                    AddVariableSegment(itemPtr, varName, q - varName);
    790                     AddHotspotSegment(itemPtr, varName, q- varName);
    791797                    p = q;
    792798                    start = p + 1;
     
    850856    }
    851857
    852     memset((char *)itemPtr + sizeof(Tk_Item), 0, sizeof(HotspotItem) - sizeof(Tk_Item));
     858    /* Initialize all HotspotItem fields, expect for the the base. */
     859    memset((char *)itemPtr + sizeof(Tk_Item), 0,
     860           sizeof(HotspotItem) - sizeof(Tk_Item));
    853861    /*
    854862     * Carry out initialization that is needed in order to clean up after
     
    862870    itemPtr->tkwin = tkwin;
    863871    itemPtr->valueInterp = interp;
    864     itemPtr->border = NULL;
    865     itemPtr->activeValueBorder = NULL;
     872    itemPtr->showIcons = TRUE;
    866873
    867874    /* Process the arguments to fill in the item record. */
     
    10191026    itemPtr->valueGC = newGC;
    10201027
     1028    /* Active substituted value GC. */
     1029    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;
     1036    newGC = Tk_GetGC(tkwin, mask, &gcValues);
     1037    if (itemPtr->activeGC != None) {
     1038        Tk_FreeGC(Tk_Display(tkwin), itemPtr->activeGC);
     1039    }
     1040    itemPtr->activeGC = newGC;
     1041
    10211042    itemPtr->maxImageWidth = itemPtr->maxImageHeight = 0;
    10221043    /* Normal hotspot image. */
     
    11291150    if (itemPtr->normalGC != None) {
    11301151        Tk_FreeGC(display, itemPtr->normalGC);
     1152    }
     1153    if (itemPtr->activeGC != None) {
     1154        Tk_FreeGC(display, itemPtr->activeGC);
    11311155    }
    11321156    if (itemPtr->outlineGC != None) {
     
    12451269
    12461270    itemPtr = segPtr->itemPtr;
    1247     if (segPtr->type == SEGMENT_TYPE_HOTSPOT) {
     1271    if (segPtr->type == SEGMENT_ICON) {
    12481272        Tk_Image tkImage;
    12491273        int w, h;
    12501274
     1275        if (!itemPtr->showIcons) {
     1276            return;
     1277        }
    12511278        tkImage = NULL;
    12521279        if ((itemPtr->activeValue != NULL) &&
     
    12581285        }
    12591286        Tk_SizeOfImage(tkImage, &w, &h);
    1260         Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, x + segPtr->x + IMAGE_PAD, 
     1287        Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, x + segPtr->x + IMAGE_PAD,
    12611288                y + segPtr->y + IMAGE_PAD);
    1262     } else {
     1289    } else if (segPtr->type == SEGMENT_VALUE) {
    12631290        GC gc;
    1264 
    1265         gc = (segPtr->type == SEGMENT_TYPE_VARIABLE) ?
    1266             itemPtr->valueGC : itemPtr->normalGC;
     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        }
    12671299        Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc,
    12681300                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);
    12691305    }
    12701306}
     
    13461382{
    13471383    HotspotItem *itemPtr = (HotspotItem *)canvItemPtr;
    1348     double x1, y1, x2, y2, dx, dy;
    1349 
    1350     x1 = itemPtr->x;
    1351     y1 = itemPtr->y;
    1352     x2 = itemPtr->x + itemPtr->width;
    1353     y2 = itemPtr->y + itemPtr->height;
    1354     if (pointPtr[0] < x1) {
    1355         dx = x1 - pointPtr[0];
    1356     } else if (pointPtr[0] >= x2)  {
    1357         dx = pointPtr[0] + 1 - x2;
     1384    double dx, dy;
     1385
     1386    if (pointPtr[0] < itemPtr->x1) {
     1387        dx = itemPtr->x1 - pointPtr[0];
     1388    } else if (pointPtr[0] >= itemPtr->x2)  {
     1389        dx = pointPtr[0] + 1 - itemPtr->x2;
    13581390    } else {
    13591391        dx = 0;
    13601392    }
    1361     if (pointPtr[1] < y1) {
    1362         dy = y1 - pointPtr[1];
    1363     } else if (pointPtr[1] >= y2)  {
    1364         dy = pointPtr[1] + 1 - y2;
     1393    if (pointPtr[1] < itemPtr->y1) {
     1394        dy = itemPtr->y1 - pointPtr[1];
     1395    } else if (pointPtr[1] >= itemPtr->y2)  {
     1396        dy = pointPtr[1] + 1 - itemPtr->y2;
    13651397    } else {
    13661398        dy = 0;
     
    13931425    HotspotItem *itemPtr = (HotspotItem *)canvItemPtr;
    13941426
    1395     if ((rectPtr[2] <= itemPtr->base.x1) ||
    1396         (rectPtr[0] >= itemPtr->base.x2) ||
    1397         (rectPtr[3] <= itemPtr->base.y1) ||
    1398         (rectPtr[1] >= itemPtr->base.y2)) {
     1427    if ((rectPtr[2] <= itemPtr->x1) || (rectPtr[0] >= itemPtr->x2) ||
     1428        (rectPtr[3] <= itemPtr->y1) || (rectPtr[1] >= itemPtr->y2)) {
    13991429        return -1;
    14001430    }
    1401     if ((rectPtr[0] <= itemPtr->base.x1) &&
    1402         (rectPtr[1] <= itemPtr->base.y1) &&
    1403         (rectPtr[2] >= itemPtr->base.x2) &&
    1404         (rectPtr[3] >= itemPtr->base.y2)) {
     1431    if ((rectPtr[0] <= itemPtr->x1) && (rectPtr[1] <= itemPtr->y1) &&
     1432        (rectPtr[2] >= itemPtr->x2) && (rectPtr[3] >= itemPtr->y2)) {
    14051433        return 1;
    14061434    }
     
    16521680Identify(Tcl_Interp *interp, HotspotItem *itemPtr, double x, double y)
    16531681{
    1654     double tx, ty;
    1655     short drawX, drawY;
    16561682    ItemSegment *segPtr;
    1657     int xOffset, yOffset;
    1658 
    1659     tx = itemPtr->x, ty = itemPtr->y;
    1660     TranslateAnchor(itemPtr, &tx, &ty);
    1661 
    1662     /* Convert canvas coordinates to drawable coordinates. */
    1663     Tk_CanvasDrawableCoords(itemPtr->canvas, tx, ty, &drawX, &drawY);
    1664     xOffset = ROUND(tx), yOffset = ROUND(ty);
    1665    
     1683
     1684    x -= itemPtr->x1;
     1685    y -= itemPtr->y1;
    16661686    for (segPtr = itemPtr->firstPtr; segPtr != NULL; segPtr = segPtr->nextPtr) {
    1667         int x1, x2, y1, y2;
    1668 
    1669         if (segPtr->type == SEGMENT_TYPE_TEXT) {
     1687        if (segPtr->type == SEGMENT_TEXT) {
     1688            continue;                   /* Ignore text segments. */
     1689        }
     1690        if ((segPtr->type == SEGMENT_ICON) && (!itemPtr->showIcons)) {
    16701691            continue;
    16711692        }
    1672         x1 = xOffset + segPtr->x;
    1673         x2 = xOffset + segPtr->x + segPtr->width;
    1674         y1 = yOffset + segPtr->y;
    1675         y2 = yOffset + segPtr->y + segPtr->height;
    1676         fprintf(stderr, "x=%g y=%g x1=%d x2=%d y1=%d y2=%d xOff=%d yOff=%d ix=%g iy=%g tx=%g ty=%g\n",
    1677                 x, y, x1, x2, y1, y2, xOffset, yOffset, itemPtr->x, itemPtr->y, tx, ty);
    1678         if ((x >= x1) && (x < x2) && (y >= y1) && (y < y2)) {
     1693        if ((x >= segPtr->x) && (x < (segPtr->x + segPtr->width)) &&
     1694            (y >= segPtr->y) && (y < (segPtr->y + segPtr->height))) {
    16791695            return segPtr->text;
    16801696        }
     
    17271743        for (segPtr = itemPtr->firstPtr; segPtr != NULL;
    17281744             segPtr = segPtr->nextPtr) {
    1729             if (segPtr->type == SEGMENT_TYPE_VARIABLE) {
     1745            if (segPtr->type == SEGMENT_VALUE) {
    17301746                Tcl_Obj *objPtr;
    17311747
Note: See TracChangeset for help on using the changeset viewer.