void OnClick(Point pt, int widget, int click_count) { switch (widget) { case WID_BC_OK: if (pt.y <= (int)GetWidget<NWidgetViewport>(WID_BC_OK)->current_y / 2) { ConfirmPlacingObject(); ToolbarSelectLastTool(); } else { ResetObjectToPlace(); } break; } HideBuildConfirmationWindow(); // this == NULL after this call }
/** * Show build confirmation window under the mouse cursor */ void ShowBuildConfirmationWindow() { HideBuildConfirmationWindow(); if (!_settings_client.gui.build_confirmation || _shift_pressed) { ConfirmPlacingObject(); ToolbarSelectLastTool(); return; } BuildConfirmationWindow *w = new BuildConfirmationWindow(&_build_confirmation_desc); int old_left = w->left; int old_top = w->top; w->left = _cursor.pos.x - w->width / 2; w->top = _cursor.pos.y - w->height / 4; w->viewport->left += w->left - old_left; w->viewport->top += w->top - old_top; w->SetDirty(); SetDirtyBlocks(0, 0, _screen.width, _screen.height); // I don't know what does this do, but it looks important }
virtual EventState OnHotkey(int hotkey) { if (hotkey == GHK_QUIT) { HandleExitGameRequest(); return ES_HANDLED; } /* Disable all key shortcuts, except quit shortcuts when * generating the world, otherwise they create threading * problem during the generating, resulting in random * assertions that are hard to trigger and debug */ if (HasModalProgress()) return ES_NOT_HANDLED; switch (hotkey) { case GHK_ABANDON: /* No point returning from the main menu to itself */ if (_game_mode == GM_MENU) return ES_HANDLED; if (_settings_client.gui.autosave_on_exit) { DoExitSave(); _switch_mode = SM_MENU; } else { AskExitToGameMenu(); } return ES_HANDLED; case GHK_CONSOLE: IConsoleSwitch(); return ES_HANDLED; case GHK_BOUNDING_BOXES: ToggleBoundingBoxes(); return ES_HANDLED; case GHK_DIRTY_BLOCKS: ToggleDirtyBlocks(); return ES_HANDLED; } if (_game_mode == GM_MENU) return ES_NOT_HANDLED; switch (hotkey) { case GHK_CENTER: case GHK_CENTER_ZOOM: { Point pt = GetTileBelowCursor(); if (pt.x != -1) { bool instant = (hotkey == GHK_CENTER_ZOOM && this->viewport->zoom != _settings_client.gui.zoom_min); if (hotkey == GHK_CENTER_ZOOM) MaxZoomInOut(ZOOM_IN, this); ScrollMainWindowTo(pt.x, pt.y, -1, instant); } break; } case GHK_RESET_OBJECT_TO_PLACE: ResetObjectToPlace(); ToolbarSelectLastTool(); break; case GHK_DELETE_WINDOWS: DeleteNonVitalWindows(); break; case GHK_DELETE_NONVITAL_WINDOWS: DeleteAllNonVitalWindows(); break; case GHK_REFRESH_SCREEN: MarkWholeScreenDirty(); break; case GHK_CRASH: // Crash the game *(volatile byte *)0 = 0; break; case GHK_MONEY: // Gimme money /* You can only cheat for money in single player. */ if (!_networking) DoCommandP(0, 10000000, 0, CMD_MONEY_CHEAT); break; case GHK_UPDATE_COORDS: // Update the coordinates of all station signs UpdateAllVirtCoords(); break; case GHK_TOGGLE_TRANSPARENCY: case GHK_TOGGLE_TRANSPARENCY + 1: case GHK_TOGGLE_TRANSPARENCY + 2: case GHK_TOGGLE_TRANSPARENCY + 3: case GHK_TOGGLE_TRANSPARENCY + 4: case GHK_TOGGLE_TRANSPARENCY + 5: case GHK_TOGGLE_TRANSPARENCY + 6: case GHK_TOGGLE_TRANSPARENCY + 7: case GHK_TOGGLE_TRANSPARENCY + 8: /* Transparency toggle hot keys */ ToggleTransparency((TransparencyOption)(hotkey - GHK_TOGGLE_TRANSPARENCY)); MarkWholeScreenDirty(); break; case GHK_TOGGLE_INVISIBILITY: case GHK_TOGGLE_INVISIBILITY + 1: case GHK_TOGGLE_INVISIBILITY + 2: case GHK_TOGGLE_INVISIBILITY + 3: case GHK_TOGGLE_INVISIBILITY + 4: case GHK_TOGGLE_INVISIBILITY + 5: case GHK_TOGGLE_INVISIBILITY + 6: case GHK_TOGGLE_INVISIBILITY + 7: /* Invisibility toggle hot keys */ ToggleInvisibilityWithTransparency((TransparencyOption)(hotkey - GHK_TOGGLE_INVISIBILITY)); MarkWholeScreenDirty(); break; case GHK_TRANSPARENCY_TOOLBAR: ShowTransparencyToolbar(); break; case GHK_TRANSPARANCY: ResetRestoreAllTransparency(); break; #ifdef ENABLE_NETWORK case GHK_CHAT: // smart chat; send to team if any, otherwise to all if (_networking) { const NetworkClientInfo *cio = NetworkClientInfo::GetByClientID(_network_own_client_id); if (cio == NULL) break; ShowNetworkChatQueryWindow(NetworkClientPreferTeamChat(cio) ? DESTTYPE_TEAM : DESTTYPE_BROADCAST, cio->client_playas); } break; case GHK_CHAT_ALL: // send text message to all clients if (_networking) ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0); break; case GHK_CHAT_COMPANY: // send text to all team mates if (_networking) { const NetworkClientInfo *cio = NetworkClientInfo::GetByClientID(_network_own_client_id); if (cio == NULL) break; ShowNetworkChatQueryWindow(DESTTYPE_TEAM, cio->client_playas); } break; case GHK_CHAT_SERVER: // send text to the server if (_networking && !_network_server) { ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, CLIENT_ID_SERVER); } break; #endif default: return ES_NOT_HANDLED; } return ES_HANDLED; }