HMENU CreateGraphicsWindowMenus(void) { HMENU top = CreateMenu(); HMENU m = 0; int i; int subMenu = 0; for(i = 0; SS.GW.menu[i].level >= 0; i++) { char label[100] = { '\0' }; if(SS.GW.menu[i].label) { char accelbuf[40]; const char *sep = MakeAcceleratorLabel(SS.GW.menu[i].accel, accelbuf) ? "\t" : ""; sprintf(label, "%s%s%s", SS.GW.menu[i].label, sep, accelbuf); } if(SS.GW.menu[i].level == 0) { m = CreateMenu(); AppendMenu(top, MF_STRING | MF_POPUP, (UINT_PTR)m, label); if(subMenu >= (int)arraylen(SubMenus)) oops(); SubMenus[subMenu] = m; subMenu++; } else if(SS.GW.menu[i].level == 1) { if(SS.GW.menu[i].id == GraphicsWindow::MNU_OPEN_RECENT) { RecentOpenMenu = CreateMenu(); AppendMenu(m, MF_STRING | MF_POPUP, (UINT_PTR)RecentOpenMenu, label); } else if(SS.GW.menu[i].id == GraphicsWindow::MNU_GROUP_RECENT) { RecentImportMenu = CreateMenu(); AppendMenu(m, MF_STRING | MF_POPUP, (UINT_PTR)RecentImportMenu, label); } else if(SS.GW.menu[i].label) { AppendMenu(m, MF_STRING, SS.GW.menu[i].id, label); } else { AppendMenu(m, MF_SEPARATOR, SS.GW.menu[i].id, ""); } } else oops(); } RefreshRecentMenus(); return top; }
bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, bool paint, int *menuHit) { int i; int x = 17, y = (int)(height - 52); int fudge = 8; int h = 32*15 + 3*16 + fudge; int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; bool withinToolbar = (mx >= aleft && mx <= aright && my <= atop && my >= abot); if(!paint && !withinToolbar) { // This gets called every MouseMove event, so return quickly. return false; } if(paint) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glTranslated(-1, -1, 0); glScaled(2.0/width, 2.0/height, 0); glDisable(GL_LIGHTING); double c = 30.0/255; glColor4d(c, c, c, 1.0); ssglAxisAlignedQuad(aleft, aright, atop, abot); } struct { bool show; const char *str; } toolTip = { false, NULL }; bool leftpos = true; for(i = 0; Toolbar[i].image; i++) { if(Toolbar[i].image == SPACER) { if(!leftpos) { leftpos = true; y -= 32; x -= 32; } y -= 16; if(paint) { // Draw a separator bar in a slightly different color. int divw = 30, divh = 2; glColor4d(0.17, 0.17, 0.17, 1); x += 16; y += 24; ssglAxisAlignedQuad(x+divw, x-divw, y+divh, y-divh); x -= 16; y -= 24; } continue; } if(paint) { glRasterPos2i(x - 12, y - 12); glDrawPixels(24, 24, GL_RGB, GL_UNSIGNED_BYTE, Toolbar[i].image); if(toolbarHovered == Toolbar[i].menu) { // Highlight the hovered or pending item. glColor4d(1, 1, 0, 0.3); int boxhw = 15; ssglAxisAlignedQuad(x+boxhw, x-boxhw, y+boxhw, y-boxhw); } if(toolbarTooltipped == Toolbar[i].menu) { // Display the tool tip for this item; postpone till later // so that no one draws over us. Don't need position since // that's just wherever the mouse is. toolTip.show = true; toolTip.str = Toolbar[i].tip; } } else { int boxhw = 16; if(mx < (x+boxhw) && mx > (x - boxhw) && my < (y+boxhw) && my > (y - boxhw)) { if(menuHit) *menuHit = Toolbar[i].menu; } } if(leftpos) { x += 32; leftpos = false; } else { x -= 32; y -= 32; leftpos = true; } } if(paint) { // Do this last so that nothing can draw over it. if(toolTip.show) { ssglCreateBitmapFont(); char str[1024]; if(strlen(toolTip.str) >= 200) oops(); strcpy(str, toolTip.str); for(i = 0; SS.GW.menu[i].level >= 0; i++) { if(toolbarTooltipped == SS.GW.menu[i].id) { char accelbuf[40]; if(MakeAcceleratorLabel(SS.GW.menu[i].accel, accelbuf)) { sprintf(str+strlen(str), " (%s)", accelbuf); } break; } } int tw = (int)strlen(str)*SS.TW.CHAR_WIDTH + 10, th = SS.TW.LINE_HEIGHT + 2; double ox = toolbarMouseX + 3, oy = toolbarMouseY + 3; glLineWidth(1); glColor4d(1.0, 1.0, 0.6, 1.0); ssglAxisAlignedQuad(ox, ox+tw, oy, oy+th); glColor4d(0.0, 0.0, 0.0, 1.0); ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+th); glColor4d(0, 0, 0, 1); glPushMatrix(); glTranslated(ox+5, oy+3, 0); glScaled(1, -1, 1); ssglBitmapText(str, Vector::From(0, 0, 0)); glPopMatrix(); } ssglDepthRangeLockToFront(false); } return withinToolbar; }
bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, bool paint, Command *menuHit) { int i; int x = 17, y = (int)(height - 52); int fudge = 8; int h = 32*16 + 3*16 + fudge; int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; bool withinToolbar = (mx >= aleft && mx <= aright && my <= atop && my >= abot); if(!paint && !withinToolbar) { // This gets called every MouseMove event, so return quickly. return false; } if(paint) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glTranslated(-1, -1, 0); glScaled(2.0/width, 2.0/height, 0); glDisable(GL_LIGHTING); double c = 30.0/255; glColor4d(c, c, c, 1.0); ssglAxisAlignedQuad(aleft, aright, atop, abot); } struct { bool show; const char *str; } toolTip = { false, NULL }; bool leftpos = true; for(ToolIcon &icon : Toolbar) { if(icon.name == "") { // spacer if(!leftpos) { leftpos = true; y -= 32; x -= 32; } y -= 16; if(paint) { // Draw a separator bar in a slightly different color. int divw = 30, divh = 2; glColor4d(0.17, 0.17, 0.17, 1); x += 16; y += 24; ssglAxisAlignedQuad(x+divw, x-divw, y+divh, y-divh); x -= 16; y -= 24; } continue; } if(icon.pixmap.IsEmpty()) { icon.pixmap = LoadPNG("icons/graphics-window/" + icon.name + ".png"); } if(paint) { glColor4d(0, 0, 0, 1.0); Point2d o = { (double)(x - icon.pixmap.width / 2), (double)(y - icon.pixmap.height / 2) }; ssglDrawPixmap(icon.pixmap, o, /*flip=*/true); if(toolbarHovered == icon.command || (pending.operation == Pending::COMMAND && pending.command == icon.command)) { // Highlight the hovered or pending item. glColor4d(1, 1, 0, 0.3); int boxhw = 15; ssglAxisAlignedQuad(x+boxhw, x-boxhw, y+boxhw, y-boxhw); } if(toolbarTooltipped == icon.command) { // Display the tool tip for this item; postpone till later // so that no one draws over us. Don't need position since // that's just wherever the mouse is. toolTip.show = true; toolTip.str = icon.tooltip.c_str(); } } else { int boxhw = 16; if(mx < (x+boxhw) && mx > (x - boxhw) && my < (y+boxhw) && my > (y - boxhw)) { if(menuHit) *menuHit = icon.command; } } if(leftpos) { x += 32; leftpos = false; } else { x -= 32; y -= 32; leftpos = true; } } if(paint) { // Do this last so that nothing can draw over it. if(toolTip.show) { ssglInitializeBitmapFont(); std::string str = toolTip.str; for(i = 0; SS.GW.menu[i].level >= 0; i++) { if(toolbarTooltipped == SS.GW.menu[i].id) { std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel); if(!accel.empty()) { str += ssprintf(" (%s)", accel.c_str()); } break; } } int tw = str.length() * (SS.TW.CHAR_WIDTH - 1) + 10, th = SS.TW.LINE_HEIGHT + 2; double ox = toolbarMouseX + 3, oy = toolbarMouseY + 3; glLineWidth(1); glColor4d(1.0, 1.0, 0.6, 1.0); ssglAxisAlignedQuad(ox, ox+tw, oy, oy+th); glColor4d(0.0, 0.0, 0.0, 1.0); ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+th); glColor4d(0, 0, 0, 1); glPushMatrix(); glTranslated(ox+5, oy+3, 0); glScaled(1, -1, 1); ssglBitmapText(str, Vector::From(0, 0, 0)); glPopMatrix(); } ssglDepthRangeLockToFront(false); } return withinToolbar; }