/* ** ClanLib SDK ** Copyright (c) 1997-2005 The ClanLib Team ** ** This software is provided 'as-is', without any express or implied ** warranty. In no event will the authors be held liable for any damages ** arising from the use of this software. ** ** Permission is granted to anyone to use this software for any purpose, ** including commercial applications, and to alter it and redistribute it ** freely, subject to the following restrictions: ** ** 1. The origin of this software must not be misrepresented; you must not ** claim that you wrote the original software. If you use this software ** in a product, an acknowledgment in the product documentation would be ** appreciated but is not required. ** 2. Altered source versions must be plainly marked as such, and must not be ** misrepresented as being the original software. ** 3. This notice may not be removed or altered from any source distribution. ** ** Note: Some of the libraries ClanLib may link to may have additional ** requirements or restrictions. ** ** File Author(s): ** ** Magnus Norddahl ** Kenneth Gangstų ** (if your name is missing here, please add it) */ #include "API/Display/display.h" #include "API/Display/surface.h" #include "API/Core/Resources/resource_manager.h" #include "API/GUIStyleSilver/scrollbar_silver.h" #include "API/GUIStyleSilver/button_silver.h" #include "API/GUIStyleSilver/stylemanager_silver.h" ///////////////////////////////////////////////////////////////////////////// // Construction: CL_ScrollBar_Silver::CL_ScrollBar_Silver( CL_ScrollBar *scrollbar, CL_StyleManager_Silver *style) : CL_ComponentStyle(scrollbar), timer_scroll(250), scrollbar(scrollbar), style(style) { CL_Component *client_area = scrollbar->get_client_area(); button_increase = new CL_Button("", scrollbar, style); button_decrease = new CL_Button("", scrollbar, style); slots.connect(client_area->sig_paint(), this, &CL_ScrollBar_Silver::on_paint); slots.connect(timer_scroll.sig_timer(), this, &CL_ScrollBar_Silver::on_timer_scroll); slots.connect(button_increase->sig_pressed(), this, &CL_ScrollBar_Silver::start_scroll, 1); slots.connect(button_decrease->sig_pressed(), this, &CL_ScrollBar_Silver::start_scroll, -1); slots.connect(button_increase->sig_released(), this, &CL_ScrollBar_Silver::stop_scroll); slots.connect(button_decrease->sig_released(), this, &CL_ScrollBar_Silver::stop_scroll); slots.connect(scrollbar->sig_resize(), this, &CL_ScrollBar_Silver::on_resize); slots.connect(scrollbar->sig_set_options(), this, &CL_ScrollBar_Silver::on_set_options); on_resize(0, 0); } CL_ScrollBar_Silver::~CL_ScrollBar_Silver() { delete button_increase; delete button_decrease; } ///////////////////////////////////////////////////////////////////////////// // Callbacks: void CL_ScrollBar_Silver::on_set_options(const CL_DomElement &options) { } void CL_ScrollBar_Silver::on_resize(int old_width, int old_height) { CL_Rect rect_decrease; CL_Rect rect_increase; CL_Rect rect_client; if (scrollbar->is_vertical()) { int button_size = scrollbar->get_width(); rect_decrease = CL_Rect(0, 0, button_size, button_size); rect_increase = CL_Rect(0, scrollbar->get_height() - button_size, button_size, scrollbar->get_height()); rect_client = CL_Rect(0, button_size, button_size, scrollbar->get_height() - button_size); } else { int button_size = scrollbar->get_height(); rect_decrease = CL_Rect(0, 0, button_size, button_size); rect_increase = CL_Rect(scrollbar->get_width() - button_size, 0, scrollbar->get_width(), button_size); rect_client = CL_Rect(button_size, 0, scrollbar->get_width() - button_size, button_size); } button_decrease->set_position(rect_decrease); button_increase->set_position(rect_increase); scrollbar->get_client_area()->set_position(rect_client); } void CL_ScrollBar_Silver::on_timer_scroll() { scrollbar->set_value(scrollbar->get_value() + scroll_delta); } void CL_ScrollBar_Silver::on_paint() { CL_Rect rect = scrollbar->get_screen_rect(); int offset_x = rect.left; int offset_y = rect.top; if (scrollbar->is_vertical()) { offset_y += button_decrease->get_height(); } else { offset_x += button_decrease->get_width(); } CL_Rectf slider_rect = scrollbar->get_slider_rect(); slider_rect.left += offset_x; slider_rect.top += offset_y; slider_rect.right += offset_x; slider_rect.bottom += offset_y; CL_Display::draw_rect( rect, CL_Color(128, 142, 159)); CL_Display::fill_rect( CL_Rect(rect.left + 1, rect.top, rect.right - 1, rect.bottom), CL_Color(203, 215, 227)); // Main border CL_Display::draw_rect( slider_rect, CL_Color(128, 142, 159)); // Outer gradient CL_Display::fill_rect( CL_Rectf(slider_rect.left + 1, slider_rect.top + 1, slider_rect.right - 1, slider_rect.bottom - 1), CL_Gradient(CL_Color::white, CL_Color::white, CL_Color(230, 235, 240), CL_Color(230, 235, 240))); // Inner gradient CL_Display::fill_rect( CL_Rectf(slider_rect.left + 3, slider_rect.top + 3, slider_rect.right - 3, slider_rect.bottom - 3), CL_Gradient(CL_Color(217, 222, 227), CL_Color(217, 222, 227), CL_Color::white, CL_Color::white)); /* CL_Display::draw_line( offset_x + slider_rect.left, offset_y + slider_rect.top + 1, offset_x + slider_rect.left, offset_y + slider_rect.bottom - 1, CL_Color(128, 142, 159)); CL_Display::draw_line( offset_x + slider_rect.right - 1, offset_y + slider_rect.top + 1, offset_x + slider_rect.right - 1, offset_y + slider_rect.bottom - 1, CL_Color(128, 142, 159)); CL_Display::draw_line( offset_x + slider_rect.left + 1, offset_y + slider_rect.top, offset_x + slider_rect.right - 1, offset_y + slider_rect.top, CL_Color(128, 142, 159)); CL_Display::draw_line( offset_x + slider_rect.left + 1, offset_y + slider_rect.bottom - 1, offset_x + slider_rect.right - 1, offset_y + slider_rect.bottom - 1, CL_Color(128, 142, 159)); CL_Display::fill_rect( CL_Rect( offset_x + slider_rect.left + 1, offset_y + slider_rect.top + 1, offset_x + slider_rect.right - 1, offset_y + slider_rect.bottom - 1), CL_Gradient( CL_Color::white, CL_Color(230, 235, 240), CL_Color::white, CL_Color(230, 235, 240))); */ CL_Display::draw_line( slider_rect.left + 5, slider_rect.top + slider_rect.get_height() / 2 - 2, slider_rect.right - 5, slider_rect.top + slider_rect.get_height() / 2 - 2, CL_Color(128, 142, 159)); CL_Display::draw_line( slider_rect.left + 5, slider_rect.top + slider_rect.get_height() / 2, slider_rect.right - 5, slider_rect.top + slider_rect.get_height() / 2, CL_Color(128, 142, 159)); CL_Display::draw_line( slider_rect.left + 5, slider_rect.top + slider_rect.get_height() / 2 + 2, slider_rect.right - 5, slider_rect.top + slider_rect.get_height() / 2 + 2, CL_Color(128, 142, 159)); } ///////////////////////////////////////////////////////////////////////////// // Implementation: void CL_ScrollBar_Silver::start_scroll(int delta) { scroll_delta = delta; timer_scroll.enable(); on_timer_scroll(); } void CL_ScrollBar_Silver::stop_scroll() { timer_scroll.disable(); }