Skip to content

Commit

Permalink
Merge pull request #376 from cbeck88/fixup_sliders
Browse files Browse the repository at this point in the history
fix bug #22984: sliders not adjustable with arrow keys
  • Loading branch information
cbeck88 committed Mar 5, 2015
2 parents 9b78a41 + 2d0a543 commit 263f51b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 21 deletions.
8 changes: 4 additions & 4 deletions src/display.cpp
Expand Up @@ -840,7 +840,7 @@ gui::button* display::find_menu_button(const std::string& id)
return NULL;
}

gui::slider* display::find_slider(const std::string& id)
gui::zoom_slider* display::find_slider(const std::string& id)
{
for (size_t i = 0; i < sliders_.size(); ++i) {
if(sliders_[i].id() == id) {
Expand All @@ -854,12 +854,12 @@ void display::create_buttons()
{
std::vector<gui::button> menu_work;
std::vector<gui::button> action_work;
std::vector<gui::slider> slider_work;
std::vector<gui::zoom_slider> slider_work;

DBG_DP << "creating sliders...\n";
const std::vector<theme::slider>& sliders = theme_.sliders();
for(std::vector<theme::slider>::const_iterator i = sliders.begin(); i != sliders.end(); ++i) {
gui::slider s(screen_, i->image(), i->black_line());
gui::zoom_slider s(screen_, i->image(), i->black_line());
DBG_DP << "drawing button " << i->get_id() << "\n";
s.set_id(i->get_id());
const SDL_Rect& loc = i->location(screen_area());
Expand All @@ -875,7 +875,7 @@ void display::create_buttons()
s.set_volatile(true);
}

gui::slider* s_prev = find_slider(s.id());
gui::zoom_slider* s_prev = find_slider(s.id());
if(s_prev) {
s.set_max(s_prev->max_value());
s.set_min(s_prev->min_value());
Expand Down
4 changes: 2 additions & 2 deletions src/display.hpp
Expand Up @@ -399,7 +399,7 @@ class display : public filter_context
*/
gui::button* find_action_button(const std::string& id);
gui::button* find_menu_button(const std::string& id);
gui::slider* find_slider(const std::string& id);
gui::zoom_slider* find_slider(const std::string& id);

gui::button::TYPE string_to_button_type(std::string type);
void create_buttons();
Expand Down Expand Up @@ -807,7 +807,7 @@ class display : public filter_context
#endif
std::map<std::string, config> reports_;
std::vector<gui::button> menu_buttons_, action_buttons_;
std::vector<gui::slider> sliders_;
std::vector<gui::zoom_slider> sliders_;
std::set<map_location> invalidated_;
std::set<map_location> previous_invalidated_;
#ifdef SDL_GPU
Expand Down
40 changes: 25 additions & 15 deletions src/widgets/slider.cpp
Expand Up @@ -242,11 +242,11 @@ void slider::mouse_down(const SDL_MouseButtonEvent& event)
return;

state_ = CLICKED;
set_focus(true);
if (sdl::point_in_rect(event.x, event.y, slider_area())) {
sound::play_UI_sound(game_config::sounds::button_press);
} else {
value_change_ = false;
set_focus(true);
set_slider_position(event.x);
if(value_change_) {
sound::play_UI_sound(game_config::sounds::slider_adjust);
Expand Down Expand Up @@ -334,20 +334,19 @@ void slider::handle_event(const SDL_Event& event)
if (!mouse_locked())
mouse_motion(event.motion);
break;
//TODO enable if you know how to fix the zoom slider bug
// case SDL_KEYDOWN:
// if(focus(&event)) {
// const SDL_keysym& key = reinterpret_cast<const SDL_KeyboardEvent&>(event).keysym;
// const int c = key.sym;
// if(c == SDLK_LEFT) {
// sound::play_UI_sound(game_config::sounds::slider_adjust);
// set_value(value_ - increment_);
// } else if(c == SDLK_RIGHT) {
// sound::play_UI_sound(game_config::sounds::slider_adjust);
// set_value(value_ + increment_);
// }
// }
// break;
case SDL_KEYDOWN:
if(focus(&event) && allow_key_events()) { //allow_key_events is used by zoom_sliders to disable left-right key press, which is buggy for them
const SDL_keysym& key = reinterpret_cast<const SDL_KeyboardEvent&>(event).keysym;
const int c = key.sym;
if(c == SDLK_LEFT) {
sound::play_UI_sound(game_config::sounds::slider_adjust);
set_value(value_ - increment_);
} else if(c == SDLK_RIGHT) {
sound::play_UI_sound(game_config::sounds::slider_adjust);
set_value(value_ + increment_);
}
}
break;
#if SDL_VERSION_ATLEAST(2,0,0)
case SDL_MOUSEWHEEL:
if (!mouse_locked())
Expand Down Expand Up @@ -420,4 +419,15 @@ template class list_slider< double >;
template class list_slider< int >;
template class list_slider< std::string >;

/***
*
* Zoom Slider
*
***/

zoom_slider::zoom_slider(CVideo &video, const std::string& image, bool black)
: slider(video, image, black)
{
}

} //end namespace gui
9 changes: 9 additions & 0 deletions src/widgets/slider.hpp
Expand Up @@ -51,6 +51,7 @@ class slider : public widget
bool requires_event_focus(const SDL_Event *event=NULL) const;
virtual void handle_event(const SDL_Event& event);
virtual void draw_contents();
virtual bool allow_key_events() { return true; }

private:
void mouse_motion(const SDL_MouseMotionEvent& event);
Expand Down Expand Up @@ -88,6 +89,14 @@ class list_slider : public slider
std::vector<T> items_;
};

// This is a different style of slider, which doesn't implement key left/right responses
class zoom_slider : public slider
{
public:
zoom_slider(CVideo &video, const std::string& image = "buttons/sliders/slider", bool black = false);
virtual bool allow_key_events() { return false; }
};

}

#endif

0 comments on commit 263f51b

Please sign in to comment.