Changeset 3041 for trunk/gui/src
- Timestamp:
- Jun 14, 2012 2:30:43 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/src/RpCanvHotspot.c
r3040 r3041 34 34 #include "tk.h" 35 35 36 #define SEGMENT_T YPE_TEXT 037 #define SEGMENT_ TYPE_VARIABLE 138 #define SEGMENT_ TYPE_HOTSPOT236 #define SEGMENT_TEXT 0 37 #define SEGMENT_VALUE 1 38 #define SEGMENT_ICON 2 39 39 #define VAR_FLAGS (TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS) 40 40 … … 42 42 #define LAYOUT_PENDING (1<<1) 43 43 #define SUBSTITUTIONS_PENDING (1<<2) 44 45 #define TRUE 1 46 #define FALSE 0 44 47 45 48 #undef ROUND … … 108 111 * rectangle enclosing the entire 109 112 * hotspot item. */ 110 Tk_3DBorder activeValueBorder; /* If non-NULL, background color of111 * active substituted values. */112 113 int borderWidth; /* 3D border width (drawn under 113 114 * -outline) */ … … 139 140 short int maxImageWidth, maxImageHeight; 140 141 int numLines; 142 int showIcons; /* Indicates whether to draw icons. */ 141 143 }; 142 144 … … 155 157 Tk_Offset(HotspotItem, activeValue), TK_CONFIG_NULL_OK}, 156 158 {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}, 159 160 {TK_CONFIG_BORDER, "-background", (char *)NULL, (char*)NULL, 160 161 "", Tk_Offset(HotspotItem, border), TK_CONFIG_NULL_OK}, 161 162 {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}, 163 164 {TK_CONFIG_BORDER, "-fill", (char *)NULL, (char*)NULL, 164 165 "", Tk_Offset(HotspotItem, border), TK_CONFIG_NULL_OK}, … … 167 168 {TK_CONFIG_COLOR, "-foreground", "foreground", (char*)NULL, 168 169 "black", Tk_Offset(HotspotItem, textColor), 0}, 169 {TK_CONFIG_COLOR, "-activevalue background", (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}, 171 172 {TK_CONFIG_FONT, "-valuefont", (char*)NULL, (char*)NULL, 172 173 "helvetica -12 bold", Tk_Offset(HotspotItem, valueFont), 0}, … … 178 179 "", Tk_Offset(HotspotItem, outlineColor), TK_CONFIG_NULL_OK}, 179 180 {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}, 181 184 {TK_CONFIG_CUSTOM, "-tags", (char*)NULL, (char*)NULL, 182 185 (char*)NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, … … 543 546 segPtr->itemPtr = itemPtr; 544 547 segPtr->lineNum = itemPtr->numLines; 545 segPtr->type = SEGMENT_T YPE_TEXT;548 segPtr->type = SEGMENT_TEXT; 546 549 strncpy(segPtr->text, text, length); 547 550 segPtr->text[length] = '\0'; … … 570 573 segPtr->itemPtr = itemPtr; 571 574 segPtr->lineNum = itemPtr->numLines; 572 segPtr->type = SEGMENT_ TYPE_VARIABLE;575 segPtr->type = SEGMENT_VALUE; 573 576 strncpy(segPtr->text, varName, length); 574 577 segPtr->text[length] = '\0'; … … 602 605 segPtr->itemPtr = itemPtr; 603 606 segPtr->lineNum = itemPtr->numLines; 604 segPtr->type = SEGMENT_ TYPE_HOTSPOT;607 segPtr->type = SEGMENT_ICON; 605 608 strncpy(segPtr->text, varName, length); 606 609 segPtr->text[length] = '\0'; … … 628 631 Tk_FreeTextLayout(segPtr->layout); 629 632 } 630 if (segPtr->type == SEGMENT_ TYPE_VARIABLE) {633 if (segPtr->type == SEGMENT_VALUE) { 631 634 Tcl_UntraceVar(itemPtr->interp, segPtr->text, VAR_FLAGS, TraceVarProc, 632 635 itemPtr); … … 664 667 const char *value; 665 668 666 if (segPtr->type != SEGMENT_ TYPE_VARIABLE) {669 if (segPtr->type != SEGMENT_VALUE) { 667 670 continue; 668 671 } … … 702 705 Tk_FreeTextLayout(segPtr->layout); 703 706 } 707 w = h = 0; 704 708 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 } 707 713 break; 708 case SEGMENT_ TYPE_VARIABLE:714 case SEGMENT_VALUE: 709 715 tkFont = (itemPtr->valueFont != NULL) ? 710 716 itemPtr->valueFont : itemPtr->font; … … 712 718 -1, wrapLength, justify, flags, &w, &h); 713 719 break; 714 case SEGMENT_T YPE_TEXT:720 case SEGMENT_TEXT: 715 721 segPtr->layout = Tk_ComputeTextLayout(itemPtr->font, 716 722 segPtr->text, -1, wrapLength, justify, flags, … … 787 793 for (q = varName; q != '\0'; q++) { 788 794 if (*q == '}') { 795 AddHotspotSegment(itemPtr, varName, q- varName); 789 796 AddVariableSegment(itemPtr, varName, q - varName); 790 AddHotspotSegment(itemPtr, varName, q- varName);791 797 p = q; 792 798 start = p + 1; … … 850 856 } 851 857 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)); 853 861 /* 854 862 * Carry out initialization that is needed in order to clean up after … … 862 870 itemPtr->tkwin = tkwin; 863 871 itemPtr->valueInterp = interp; 864 itemPtr->border = NULL; 865 itemPtr->activeValueBorder = NULL; 872 itemPtr->showIcons = TRUE; 866 873 867 874 /* Process the arguments to fill in the item record. */ … … 1019 1026 itemPtr->valueGC = newGC; 1020 1027 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 1021 1042 itemPtr->maxImageWidth = itemPtr->maxImageHeight = 0; 1022 1043 /* Normal hotspot image. */ … … 1129 1150 if (itemPtr->normalGC != None) { 1130 1151 Tk_FreeGC(display, itemPtr->normalGC); 1152 } 1153 if (itemPtr->activeGC != None) { 1154 Tk_FreeGC(display, itemPtr->activeGC); 1131 1155 } 1132 1156 if (itemPtr->outlineGC != None) { … … 1245 1269 1246 1270 itemPtr = segPtr->itemPtr; 1247 if (segPtr->type == SEGMENT_ TYPE_HOTSPOT) {1271 if (segPtr->type == SEGMENT_ICON) { 1248 1272 Tk_Image tkImage; 1249 1273 int w, h; 1250 1274 1275 if (!itemPtr->showIcons) { 1276 return; 1277 } 1251 1278 tkImage = NULL; 1252 1279 if ((itemPtr->activeValue != NULL) && … … 1258 1285 } 1259 1286 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, 1261 1288 y + segPtr->y + IMAGE_PAD); 1262 } else {1289 } else if (segPtr->type == SEGMENT_VALUE) { 1263 1290 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 } 1267 1299 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, 1268 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); 1269 1305 } 1270 1306 } … … 1346 1382 { 1347 1383 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; 1358 1390 } else { 1359 1391 dx = 0; 1360 1392 } 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; 1365 1397 } else { 1366 1398 dy = 0; … … 1393 1425 HotspotItem *itemPtr = (HotspotItem *)canvItemPtr; 1394 1426 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)) { 1399 1429 return -1; 1400 1430 } 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)) { 1405 1433 return 1; 1406 1434 } … … 1652 1680 Identify(Tcl_Interp *interp, HotspotItem *itemPtr, double x, double y) 1653 1681 { 1654 double tx, ty;1655 short drawX, drawY;1656 1682 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; 1666 1686 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)) { 1670 1691 continue; 1671 1692 } 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))) { 1679 1695 return segPtr->text; 1680 1696 } … … 1727 1743 for (segPtr = itemPtr->firstPtr; segPtr != NULL; 1728 1744 segPtr = segPtr->nextPtr) { 1729 if (segPtr->type == SEGMENT_ TYPE_VARIABLE) {1745 if (segPtr->type == SEGMENT_VALUE) { 1730 1746 Tcl_Obj *objPtr; 1731 1747
Note: See TracChangeset
for help on using the changeset viewer.