From 01277adea1d2fcdebaec08d8ca818cf1958c4c3f Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 21 Jul 2017 19:13:57 +1100 Subject: [PATCH] Mouse Handler Base: formatting cleanup --- src/mouse_handler_base.cpp | 208 ++++++++++++++++--------------------- src/mouse_handler_base.hpp | 168 ++++++++++++++++++------------ 2 files changed, 189 insertions(+), 187 deletions(-) diff --git a/src/mouse_handler_base.cpp b/src/mouse_handler_base.cpp index 6b2f4eae005e..dcb5fa685af9 100644 --- a/src/mouse_handler_base.cpp +++ b/src/mouse_handler_base.cpp @@ -19,14 +19,14 @@ #include "display.hpp" #include "log.hpp" #include "preferences/general.hpp" -#include "tooltips.hpp" #include "sdl/rect.hpp" +#include "tooltips.hpp" static lg::log_domain log_display("display"); #define WRN_DP LOG_STREAM(warn, log_display) -namespace events { - +namespace events +{ command_disabler::command_disabler() { ++commands_disabled; @@ -37,31 +37,31 @@ command_disabler::~command_disabler() --commands_disabled; } -int commands_disabled= 0; +int commands_disabled = 0; static bool command_active() { #ifdef __APPLE__ - return (SDL_GetModState()&KMOD_CTRL) != 0; + return (SDL_GetModState() & KMOD_CTRL) != 0; #else return false; #endif } -mouse_handler_base::mouse_handler_base() : - simple_warp_(false), - minimap_scrolling_(false), - dragging_left_(false), - dragging_started_(false), - dragging_right_(false), - drag_from_x_(0), - drag_from_y_(0), - drag_from_hex_(), - last_hex_(), - show_menu_(false), - scroll_start_x_(0), - scroll_start_y_(0), - scroll_started_(false) +mouse_handler_base::mouse_handler_base() + : simple_warp_(false) + , minimap_scrolling_(false) + , dragging_left_(false) + , dragging_started_(false) + , dragging_right_(false) + , drag_from_x_(0) + , drag_from_y_(0) + , drag_from_hex_() + , last_hex_() + , show_menu_(false) + , scroll_start_x_(0) + , scroll_start_y_(0) + , scroll_started_(false) { } @@ -72,13 +72,13 @@ bool mouse_handler_base::is_dragging() const void mouse_handler_base::mouse_motion_event(const SDL_MouseMotionEvent& event, const bool browse) { - mouse_motion(event.x,event.y, browse); + mouse_motion(event.x, event.y, browse); } void mouse_handler_base::mouse_update(const bool browse, map_location loc) { int x, y; - SDL_GetMouseState(&x,&y); + SDL_GetMouseState(&x, &y); mouse_motion(x, y, browse, true, loc); } @@ -91,40 +91,49 @@ bool mouse_handler_base::mouse_motion_default(int x, int y, bool /*update*/) } if(minimap_scrolling_) { - //if the game is run in a window, we could miss a LMB/MMB up event + // if the game is run in a window, we could miss a LMB/MMB up event // if it occurs outside our window. // thus, we need to check if the LMB/MMB is still down - minimap_scrolling_ = ((SDL_GetMouseState(nullptr,nullptr) & (SDL_BUTTON(1) | SDL_BUTTON(2))) != 0); + minimap_scrolling_ = ((SDL_GetMouseState(nullptr, nullptr) & (SDL_BUTTON(1) | SDL_BUTTON(2))) != 0); + if(minimap_scrolling_) { - const map_location& loc = gui().minimap_location_on(x,y); + const map_location& loc = gui().minimap_location_on(x, y); if(loc.valid()) { if(loc != last_hex_) { last_hex_ = loc; - gui().scroll_to_tile(loc,display::WARP,false); + gui().scroll_to_tile(loc, display::WARP, false); } } else { // clicking outside of the minimap will end minimap scrolling minimap_scrolling_ = false; } } - if(minimap_scrolling_) return true; + + if(minimap_scrolling_) { + return true; + } } // Fire the drag & drop only after minimal drag distance // While we check the mouse buttons state, we also grab fresh position data. int mx = drag_from_x_; // some default value to prevent unlikely SDL bug int my = drag_from_y_; - if (is_dragging() && !dragging_started_) { - if ((dragging_left_ && (SDL_GetMouseState(&mx,&my) & SDL_BUTTON_LEFT) != 0) - || (dragging_right_ && (SDL_GetMouseState(&mx,&my) & SDL_BUTTON_RIGHT) != 0)) { - const double drag_distance = std::pow(static_cast(drag_from_x_- mx), 2) - + std::pow(static_cast(drag_from_y_- my), 2); - if (drag_distance > drag_threshold()*drag_threshold()) { + + if(is_dragging() && !dragging_started_) { + if((dragging_left_ && (SDL_GetMouseState(&mx, &my) & SDL_BUTTON_LEFT) != 0) || + (dragging_right_ && (SDL_GetMouseState(&mx, &my) & SDL_BUTTON_RIGHT) != 0)) + { + const double drag_distance = + std::pow(static_cast(drag_from_x_ - mx), 2) + + std::pow(static_cast(drag_from_y_ - my), 2); + + if(drag_distance > drag_threshold() * drag_threshold()) { dragging_started_ = true; cursor::set_dragging(true); } } } + return false; } @@ -133,94 +142,82 @@ void mouse_handler_base::mouse_press(const SDL_MouseButtonEvent& event, const bo if(is_middle_click(event) && !preferences::middle_click_scrolls()) { simple_warp_ = true; } + show_menu_ = false; - map_location loc = gui().hex_clicked_on(event.x,event.y); + map_location loc = gui().hex_clicked_on(event.x, event.y); mouse_update(browse, loc); - if (is_left_click(event)) { - if (event.state == SDL_PRESSED) { + if(is_left_click(event)) { + if(event.state == SDL_PRESSED) { cancel_dragging(); init_dragging(dragging_left_); left_click(event.x, event.y, browse); - } else if (event.state == SDL_RELEASED) { + } else if(event.state == SDL_RELEASED) { minimap_scrolling_ = false; clear_dragging(event, browse); left_mouse_up(event.x, event.y, browse); } - } else if (is_right_click(event)) { - if (event.state == SDL_PRESSED) { + } else if(is_right_click(event)) { + if(event.state == SDL_PRESSED) { cancel_dragging(); init_dragging(dragging_right_); right_click(event.x, event.y, browse); - } else if (event.state == SDL_RELEASED) { + } else if(event.state == SDL_RELEASED) { minimap_scrolling_ = false; clear_dragging(event, browse); right_mouse_up(event.x, event.y, browse); } - } else if (is_middle_click(event)) { - if (event.state == SDL_PRESSED) { + } else if(is_middle_click(event)) { + if(event.state == SDL_PRESSED) { set_scroll_start(event.x, event.y); scroll_started_ = true; - map_location minimap_loc = gui().minimap_location_on(event.x,event.y); + map_location minimap_loc = gui().minimap_location_on(event.x, event.y); minimap_scrolling_ = false; if(minimap_loc.valid()) { simple_warp_ = false; minimap_scrolling_ = true; last_hex_ = minimap_loc; - gui().scroll_to_tile(minimap_loc,display::WARP,false); + gui().scroll_to_tile(minimap_loc, display::WARP, false); } else if(simple_warp_) { // middle click not on minimap, check gamemap instead if(loc.valid()) { last_hex_ = loc; - gui().scroll_to_tile(loc,display::WARP,false); + gui().scroll_to_tile(loc, display::WARP, false); } } - } else if (event.state == SDL_RELEASED) { + } else if(event.state == SDL_RELEASED) { minimap_scrolling_ = false; simple_warp_ = false; scroll_started_ = false; } } - if (!dragging_left_ && !dragging_right_ && dragging_started_) { + + if(!dragging_left_ && !dragging_right_ && dragging_started_) { dragging_started_ = false; cursor::set_dragging(false); } + mouse_update(browse, loc); } -bool mouse_handler_base::is_left_click( - const SDL_MouseButtonEvent& event) const +bool mouse_handler_base::is_left_click(const SDL_MouseButtonEvent& event) const { return event.button == SDL_BUTTON_LEFT && !command_active(); } -bool mouse_handler_base::is_middle_click( - const SDL_MouseButtonEvent& event) const +bool mouse_handler_base::is_middle_click(const SDL_MouseButtonEvent& event) const { return event.button == SDL_BUTTON_MIDDLE; } -bool mouse_handler_base::is_right_click( - const SDL_MouseButtonEvent& event) const +bool mouse_handler_base::is_right_click(const SDL_MouseButtonEvent& event) const { - return event.button == SDL_BUTTON_RIGHT - || (event.button == SDL_BUTTON_LEFT && command_active()); -} - -bool mouse_handler_base::allow_mouse_wheel_scroll(int /*x*/, int /*y*/) -{ - return true; -} - -bool mouse_handler_base::right_click_show_menu(int /*x*/, int /*y*/, const bool /*browse*/) -{ - return true; + return event.button == SDL_BUTTON_RIGHT || (event.button == SDL_BUTTON_LEFT && command_active()); } bool mouse_handler_base::left_click(int x, int y, const bool /*browse*/) { - if(gui().view_locked()) { return false; } @@ -231,15 +228,11 @@ bool mouse_handler_base::left_click(int x, int y, const bool /*browse*/) if(loc.valid()) { minimap_scrolling_ = true; last_hex_ = loc; - gui().scroll_to_tile(loc,display::WARP, false); + gui().scroll_to_tile(loc, display::WARP, false); return true; } - return false; -} -void mouse_handler_base::move_action(const bool /*browse*/) -{ - // Overridden with unit move code elsewhere + return false; } void mouse_handler_base::left_drag_end(int /*x*/, int /*y*/, const bool browse) @@ -247,10 +240,6 @@ void mouse_handler_base::left_drag_end(int /*x*/, int /*y*/, const bool browse) move_action(browse); } -void mouse_handler_base::left_mouse_up(int /*x*/, int /*y*/, const bool /*browse*/) -{ -} - void mouse_handler_base::mouse_wheel(int scrollx, int scrolly, bool browse) { int x, y; @@ -264,67 +253,43 @@ void mouse_handler_base::mouse_wheel(int scrollx, int scrolly, bool browse) return; } - if (movex != 0 || movey != 0) { + if(movex != 0 || movey != 0) { CKey pressed; // Alt + mousewheel do an 90° rotation on the scroll direction - if (pressed[SDLK_LALT] || pressed[SDLK_RALT]) { - gui().scroll(-movey,-movex); + if(pressed[SDLK_LALT] || pressed[SDLK_RALT]) { + gui().scroll(-movey, -movex); } else { - gui().scroll(-movex,-movey); + gui().scroll(-movex, -movey); } } - if (scrollx < 0) { + if(scrollx < 0) { mouse_wheel_left(x, y, browse); - } else if (scrollx > 0) { + } else if(scrollx > 0) { mouse_wheel_right(x, y, browse); } - if (scrolly < 0) { + if(scrolly < 0) { mouse_wheel_down(x, y, browse); - } else if (scrolly > 0) { + } else if(scrolly > 0) { mouse_wheel_up(x, y, browse); } } -void mouse_handler_base::mouse_wheel_up(int /*x*/, int /*y*/, const bool /*browse*/) -{ -} - -void mouse_handler_base::mouse_wheel_down(int /*x*/, int /*y*/, const bool /*browse*/) -{ -} - -void mouse_handler_base::mouse_wheel_left(int /*x*/, int /*y*/, const bool /*browse*/) -{ -} - -void mouse_handler_base::mouse_wheel_right(int /*x*/, int /*y*/, const bool /*browse*/) -{ -} - bool mouse_handler_base::right_click(int x, int y, const bool browse) { - if (right_click_show_menu(x, y, browse)) { - const theme::menu* const m = gui().get_theme().context_menu(); - if (m != nullptr) { - show_menu_ = true; - } else { - WRN_DP << "no context menu found..." << std::endl; - } - return true; + if(!right_click_show_menu(x, y, browse)) { + return false; } - return false; -} -void mouse_handler_base::right_drag_end(int /*x*/, int /*y*/, const bool /*browse*/) -{ - //FIXME: This is called when we select an option in context-menu, - // which is bad because that was not a real dragging -} + const theme::menu* const m = gui().get_theme().context_menu(); + if(m != nullptr) { + show_menu_ = true; + } else { + WRN_DP << "no context menu found..." << std::endl; + } -void mouse_handler_base::right_mouse_up(int /*x*/, int /*y*/, const bool /*browse*/) -{ + return true; } void mouse_handler_base::init_dragging(bool& dragging_flag) @@ -348,13 +313,15 @@ void mouse_handler_base::clear_dragging(const SDL_MouseButtonEvent& event, bool // because they may take time to return, and we // could have started other drag&drop before that cursor::set_dragging(false); - if (dragging_started_) { + + if(dragging_started_) { dragging_started_ = false; - if (dragging_left_) { + if(dragging_left_) { dragging_left_ = false; left_drag_end(event.x, event.y, browse); } - if (dragging_right_) { + + if(dragging_right_) { dragging_right_ = false; right_drag_end(event.x, event.y, browse); } @@ -364,5 +331,4 @@ void mouse_handler_base::clear_dragging(const SDL_MouseButtonEvent& event, bool } } - -} //end namespace events +} // end namespace events diff --git a/src/mouse_handler_base.hpp b/src/mouse_handler_base.hpp index 17af34b3e993..41582259cf7d 100644 --- a/src/mouse_handler_base.hpp +++ b/src/mouse_handler_base.hpp @@ -16,12 +16,13 @@ #pragma once #include "map/location.hpp" + #include class display; -namespace events { - +namespace events +{ struct command_disabler { command_disabler(); @@ -30,10 +31,14 @@ struct command_disabler extern int commands_disabled; -class mouse_handler_base { +class mouse_handler_base +{ public: mouse_handler_base(); - virtual ~mouse_handler_base() {} + + virtual ~mouse_handler_base() + { + } /** * Reference to the used display objects. Derived classes should ensure @@ -41,9 +46,7 @@ class mouse_handler_base { */ virtual display& gui() = 0; - /** - * Const version. - */ + /** Const version of @ref gui */ virtual const display& gui() const = 0; /** @@ -51,15 +54,21 @@ class mouse_handler_base { */ bool is_dragging() const; - //minimum dragging distance to fire the drag&drop - virtual int drag_threshold() const {return 0;} + /** Minimum dragging distance to fire the drag&drop */ + virtual int drag_threshold() const + { + return 0; + } void mouse_motion_event(const SDL_MouseMotionEvent& event, const bool browse); - /** update the mouse with a fake mouse motion */ + /** Update the mouse with a fake mouse motion */ void mouse_update(const bool browse, map_location loc); - bool get_show_menu() const { return show_menu_; } + bool get_show_menu() const + { + return show_menu_; + } /** * This handles minimap scrolling and click-drag. @@ -72,16 +81,16 @@ class mouse_handler_base { * Called when a mouse motion event takes place. Derived classes must provide an * implementation, possibly using mouse_motion_default(). */ - virtual void mouse_motion(int x, int y, const bool browse, bool update=false, map_location new_loc = map_location::null_location()) = 0; + virtual void mouse_motion( + int x, int y, const bool browse, bool update = false, map_location new_loc = map_location::null_location()) + = 0; virtual void mouse_press(const SDL_MouseButtonEvent& event, const bool browse); bool is_left_click(const SDL_MouseButtonEvent& event) const; bool is_middle_click(const SDL_MouseButtonEvent& event) const; bool is_right_click(const SDL_MouseButtonEvent& event) const; - /** - * Called when scrolling with the mouse wheel. - */ + /** Called when scrolling with the mouse wheel. */ virtual void mouse_wheel(int xscroll, int yscroll, bool browse); /** @@ -89,36 +98,40 @@ class mouse_handler_base { * some circumstances, e.g. when the mouse wheel controls something else, * but the event is also received by this class */ - virtual bool allow_mouse_wheel_scroll(int x, int y); + virtual bool allow_mouse_wheel_scroll(int /*x*/, int /*y*/) + { + return true; + } /** * Overridden in derived classes, called on a left click (mousedown). * Defaults to process (initiate) minimap scrolling. + * * @returns true when the click should not process the event further. * This means do not treat the call as a start of drag movement. * FIXME: This return value is currently ignored */ virtual bool left_click(int x, int y, const bool browse); - /** - * Overridden in derived class. Called on drag+drop movements. - */ - virtual void move_action(bool browse); + /** Overridden in derived class. Called on drag + drop movements. */ + virtual void move_action(bool /*browse*/) + { + // Overridden with unit move code elsewhere + } - /** - * Called whenever the left mouse drag has "ended". - */ - virtual void left_drag_end(int x, int y, const bool browse); + /** Called whenever the left mouse drag has "ended". */ + virtual void left_drag_end(int /*x*/, int /*y*/, const bool /*browse*/); - /** - * Called when the left mouse button is up - */ - virtual void left_mouse_up(int x, int y, const bool browse); + /** Called when the left mouse button is up */ + virtual void left_mouse_up(int /*x*/, int /*y*/, const bool /*browse*/) + { + } /** * Overridden in derived classes, called on a right click (mousedown). * Defaults to displaying the menu (by setting the appropriate flag) * if right_click_show_menu returns true. + * * @returns true when the click should not process the event further. * This means do not treat the call as a start of drag movement. */ @@ -128,47 +141,63 @@ class mouse_handler_base { * Called in the default right_click when the context menu is about to * be shown, can be used for preprocessing and preventing the menu from * being displayed without rewriting the right click function. + * * @returns true when the menu should be displayed and false otherwise * FIXME: This return value is currently ignored */ - virtual bool right_click_show_menu(int x, int y, const bool browse); - - /** - * Called whenever the right mouse drag has "ended". - */ - virtual void right_drag_end(int x, int y, const bool browse); - - /** - * Called when the right mouse button is up - */ - virtual void right_mouse_up(int x, int y, const bool browse); - - /** - * Called when the mouse wheel is scrolled up - */ - virtual void mouse_wheel_up(int x, int y, const bool browse); - - /** - * Called when the mouse wheel is scrolled down - */ - virtual void mouse_wheel_down(int x, int y, const bool browse); - - /** - * Called when the mouse wheel is scrolled left - */ - virtual void mouse_wheel_left(int x, int y, const bool browse); - - /** - * Called when the mouse wheel is scrolled right - */ - virtual void mouse_wheel_right(int x, int y, const bool browse); - - /** - * Called when the middle click scrolling - */ - void set_scroll_start (int x, int y) { scroll_start_x_ = x; scroll_start_y_ = y; } - const SDL_Point get_scroll_start() const { return{ scroll_start_x_, scroll_start_y_ }; } - bool scroll_started() const { return scroll_started_; } + virtual bool right_click_show_menu(int /*x*/, int /*y*/, const bool /*browse*/) + { + return true; + } + + /** Called whenever the right mouse drag has "ended". */ + virtual void right_drag_end(int /*x*/, int /*y*/, const bool /*browse*/) + { + // FIXME: This is called when we select an option in context-menu, + // which is bad because that was not a real dragging + } + + /** Called when the right mouse button is up. */ + virtual void right_mouse_up(int /*x*/, int /*y*/, const bool /*browse*/) + { + } + + /** Called when the mouse wheel is scrolled up. */ + virtual void mouse_wheel_up(int /*x*/, int /*y*/, const bool /*browse*/) + { + } + + /** Called when the mouse wheel is scrolled down. */ + virtual void mouse_wheel_down(int /*x*/, int /*y*/, const bool /*browse*/) + { + } + + /** Called when the mouse wheel is scrolled left. */ + virtual void mouse_wheel_left(int /*x*/, int /*y*/, const bool /*browse*/) + { + } + + /** Called when the mouse wheel is scrolled right. */ + virtual void mouse_wheel_right(int /*x*/, int /*y*/, const bool /*browse*/) + { + } + + /** Called when the middle click scrolling. */ + void set_scroll_start(int x, int y) + { + scroll_start_x_ = x; + scroll_start_y_ = y; + } + + const SDL_Point get_scroll_start() const + { + return {scroll_start_x_, scroll_start_y_}; + } + + bool scroll_started() const + { + return scroll_started_; + } protected: void cancel_dragging(); @@ -177,18 +206,25 @@ class mouse_handler_base { /** MMB click (on game map) state flag */ bool simple_warp_; + /** minimap scrolling (scroll-drag) state flag */ bool minimap_scrolling_; + /** LMB drag init flag */ bool dragging_left_; + /** Actual drag flag */ bool dragging_started_; + /** RMB drag init flag */ bool dragging_right_; + /** Drag start position x */ int drag_from_x_; + /** Drag start position y */ int drag_from_y_; + /** Drag start map location */ map_location drag_from_hex_;