diff options
-rw-r--r-- | src/openttd.cpp | 88 | ||||
-rw-r--r-- | src/saveload.cpp | 4 | ||||
-rw-r--r-- | src/viewport.cpp | 30 | ||||
-rw-r--r-- | src/window.cpp | 57 |
4 files changed, 91 insertions, 88 deletions
diff --git a/src/openttd.cpp b/src/openttd.cpp index 1ece64737..bd386f5bf 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -23,10 +23,7 @@ #include "gui.h" #include "mixer.h" #include "sound_func.h" -#include "viewport_func.h" #include "window_func.h" -#include "window_gui.h" -#include "zoom_func.h" #include "debug.h" #include "saveload.h" @@ -341,8 +338,6 @@ static void LoadIntroGame() _pause_game = 0; SetLocalPlayer(PLAYER_FIRST); - /* Make sure you can't scroll in the menu */ - _scrolling_viewport = 0; _cursor.fix_at = false; MarkWholeScreenDirty(); @@ -1070,53 +1065,6 @@ static void DoAutosave() } } -static void ScrollMainViewport(int x, int y) -{ - if (_game_mode != GM_MENU) { - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - assert(w); - - w->viewport->dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom); - w->viewport->dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom); - } -} - -/** - * Describes all the different arrow key combinations the game allows - * when it is in scrolling mode. - * The real arrow keys are bitwise numbered as - * 1 = left - * 2 = up - * 4 = right - * 8 = down - */ -static const int8 scrollamt[16][2] = { - { 0, 0}, ///< no key specified - {-2, 0}, ///< 1 : left - { 0, -2}, ///< 2 : up - {-2, -1}, ///< 3 : left + up - { 2, 0}, ///< 4 : right - { 0, 0}, ///< 5 : left + right = nothing - { 2, -1}, ///< 6 : right + up - { 0, -2}, ///< 7 : right + left + up = up - { 0 ,2}, ///< 8 : down - {-2 ,1}, ///< 9 : down + left - { 0, 0}, ///< 10 : down + up = nothing - {-2, 0}, ///< 11 : left + up + down = left - { 2, 1}, ///< 12 : down + right - { 0, 2}, ///< 13 : left + right + down = down - { 2, 0}, ///< 14 : right + up + down = right - { 0, 0}, ///< 15 : left + up + right + down = nothing -}; - -static void HandleKeyScrolling() -{ - if (_dirkeys && !_no_scroll) { - int factor = _shift_pressed ? 50 : 10; - ScrollMainViewport(scrollamt[_dirkeys][0] * factor, scrollamt[_dirkeys][1] * factor); - } -} - void GameLoop() { ProcessAsyncSaveFinish(); @@ -1128,9 +1076,6 @@ void GameLoop() RedrawAutosave(); } - /* handle scrolling of the main window */ - HandleKeyScrolling(); - /* make a screenshot? */ if (IsScreenshotRequested()) ShowScreenshotResult(MakeScreenshot()); @@ -1143,12 +1088,6 @@ void GameLoop() IncreaseSpriteLRU(); InteractiveRandom(); - if (_scroller_click_timeout > 3) { - _scroller_click_timeout -= 3; - } else { - _scroller_click_timeout = 0; - } - _caret_timer += 3; _palette_animation_counter += 8; CursorTick(); @@ -1182,17 +1121,6 @@ void GameLoop() MusicLoop(); } -void BeforeSaveGame() -{ - const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - - if (w != NULL) { - _saved_scrollpos_x = w->viewport->scrollpos_x; - _saved_scrollpos_y = w->viewport->scrollpos_y; - _saved_scrollpos_zoom = w->viewport->zoom; - } -} - static void ConvertTownOwner() { for (TileIndex tile = 0; tile != MapSize(); tile++) { @@ -1298,20 +1226,8 @@ static bool InitializeWindowsAndCaches() ResetWindowSystem(); SetupColorsAndInitialWindow(); - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - - w->viewport->scrollpos_x = _saved_scrollpos_x; - w->viewport->scrollpos_y = _saved_scrollpos_y; - w->viewport->dest_scrollpos_x = _saved_scrollpos_x; - w->viewport->dest_scrollpos_y = _saved_scrollpos_y; - - ViewPort *vp = w->viewport; - vp->zoom = min(_saved_scrollpos_zoom, ZOOM_LVL_MAX); - vp->virtual_width = ScaleByZoom(vp->width, vp->zoom); - vp->virtual_height = ScaleByZoom(vp->height, vp->zoom); - - DoZoomInOutWindow(ZOOM_NONE, w); // update button status - MarkWholeScreenDirty(); + extern void ResetViewportAfterLoadGame(); + ResetViewportAfterLoadGame(); /* Update coordinates of the signs. */ UpdateAllStationVirtCoord(); diff --git a/src/saveload.cpp b/src/saveload.cpp index 76267236a..83bec4e77 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -1473,7 +1473,7 @@ static const SaveLoadFormat *GetSavegameFormat(const char *s) /* actual loader/saver function */ void InitializeGame(uint size_x, uint size_y, bool reset_date); extern bool AfterLoadGame(); -extern void BeforeSaveGame(); +extern void SaveViewportBeforeSaveGame(); extern bool LoadOldSaveGame(const char *file); /** Small helper function to close the to be loaded savegame an signal error */ @@ -1673,7 +1673,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb) _sl_version = SAVEGAME_VERSION; - BeforeSaveGame(); + SaveViewportBeforeSaveGame(); SlSaveChunks(); SlWriteFill(); // flush the save buffer diff --git a/src/viewport.cpp b/src/viewport.cpp index 51eee159e..bbc029446 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2756,3 +2756,33 @@ void ResetObjectToPlace() { SetObjectToPlace(SPR_CURSOR_MOUSE, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0); } + + +void SaveViewportBeforeSaveGame() +{ + const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + + if (w != NULL) { + _saved_scrollpos_x = w->viewport->scrollpos_x; + _saved_scrollpos_y = w->viewport->scrollpos_y; + _saved_scrollpos_zoom = w->viewport->zoom; + } +} + +void ResetViewportAfterLoadGame() +{ + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + + w->viewport->scrollpos_x = _saved_scrollpos_x; + w->viewport->scrollpos_y = _saved_scrollpos_y; + w->viewport->dest_scrollpos_x = _saved_scrollpos_x; + w->viewport->dest_scrollpos_y = _saved_scrollpos_y; + + ViewPort *vp = w->viewport; + vp->zoom = min(_saved_scrollpos_zoom, ZOOM_LVL_MAX); + vp->virtual_width = ScaleByZoom(vp->width, vp->zoom); + vp->virtual_height = ScaleByZoom(vp->height, vp->zoom); + + DoZoomInOutWindow(ZOOM_NONE, w); // update button status + MarkWholeScreenDirty(); +} diff --git a/src/window.cpp b/src/window.cpp index 33fe7d1a0..c79b436ec 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1021,6 +1021,7 @@ void InitWindowSystem() _last_z_window = _z_windows; _mouseover_last_w = NULL; _no_scroll = 0; + _scrolling_viewport = 0; } /** @@ -1707,6 +1708,55 @@ enum MouseClick { extern void UpdateTileSelection(); extern bool VpHandlePlaceSizingDrag(); +static void ScrollMainViewport(int x, int y) +{ + if (_game_mode != GM_MENU) { + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + assert(w); + + w->viewport->dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom); + w->viewport->dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom); + } +} + +/** + * Describes all the different arrow key combinations the game allows + * when it is in scrolling mode. + * The real arrow keys are bitwise numbered as + * 1 = left + * 2 = up + * 4 = right + * 8 = down + */ +static const int8 scrollamt[16][2] = { + { 0, 0}, ///< no key specified + {-2, 0}, ///< 1 : left + { 0, -2}, ///< 2 : up + {-2, -1}, ///< 3 : left + up + { 2, 0}, ///< 4 : right + { 0, 0}, ///< 5 : left + right = nothing + { 2, -1}, ///< 6 : right + up + { 0, -2}, ///< 7 : right + left + up = up + { 0 ,2}, ///< 8 : down + {-2 ,1}, ///< 9 : down + left + { 0, 0}, ///< 10 : down + up = nothing + {-2, 0}, ///< 11 : left + up + down = left + { 2, 1}, ///< 12 : down + right + { 0, 2}, ///< 13 : left + right + down = down + { 2, 0}, ///< 14 : right + up + down = right + { 0, 0}, ///< 15 : left + up + right + down = nothing +}; + +static bool HandleKeyScrolling() +{ + if (_dirkeys && !_no_scroll) { + int factor = _shift_pressed ? 50 : 10; + ScrollMainViewport(scrollamt[_dirkeys][0] * factor, scrollamt[_dirkeys][1] * factor); + return false; + } + return true; +} + void MouseLoop(MouseClick click, int mousewheel) { DecreaseWindowCounters(); @@ -1718,6 +1768,7 @@ void MouseLoop(MouseClick click, int mousewheel) if (!HandleScrollbarScrolling()) return; if (!HandleViewportScroll()) return; if (!HandleMouseOver()) return; + if (!HandleKeyScrolling()) return; bool scrollwheel_scrolling = _settings.gui.scrollwheel_scrolling == 1 && (_cursor.v_wheel != 0 || _cursor.h_wheel != 0); if (click == MC_NONE && mousewheel == 0 && !scrollwheel_scrolling) return; @@ -1979,6 +2030,12 @@ void InvalidateWindowClassesData(WindowClass cls, int data) */ void CallWindowTickEvent() { + if (_scroller_click_timeout > 3) { + _scroller_click_timeout -= 3; + } else { + _scroller_click_timeout = 0; + } + for (Window * const *wz = _last_z_window; wz != _z_windows;) { (*--wz)->OnTick(); } |