#!/usr/bin/env ruby # wxRuby2 Sample Code. Copyright (c) 2004-2008 wxRuby development team # Freely reusable code: see SAMPLES-LICENSE.TXT for details begin require 'rubygems' rescue LoadError end require 'wx' # Example demonstrating the use of Wx::ScrolledWindow and the # ScrollWinEvents class ScrollFrame < Wx::Frame def initialize(title) super(nil, -1, 'Thumb Scrolling Test', Wx::DEFAULT_POSITION, Wx::Size.new(400, 300), Wx::SYSTEM_MENU|Wx::CAPTION|Wx::RESIZE_BORDER| Wx::MAXIMIZE_BOX|Wx::MINIMIZE_BOX|Wx::CLOSE_BOX) @scroll_win = Wx::ScrolledWindow.new(self, -1) # Set the interior size (pixels) of the scrolling window @scroll_win.set_virtual_size(1000, 1500) # Set the number of pixels moved per 'line' / click on the scrollbars @scroll_win.set_scroll_rate(5, 5) @button = Wx::Button.new(@scroll_win, -1, 'Press Me', Wx::Point.new(200,200), Wx::Size.new(125, 20)) # NOTE that all ScrollWin event hooks do not take an id - i.e. they # are only generated from the originating Window itself - in this # case, the ScrollWindow. So, we need to do: # @scroll_win.evt_scrollwin_xxx { ... # AND NOT # evt_scrollwin_xxx(@scroll_win.get_id) { ... @scroll_win.evt_scrollwin_linedown() { | e | on_line(e, 'down') } @scroll_win.evt_scrollwin_lineup() { | e | on_line(e,'up') } @scroll_win.evt_scrollwin_thumbtrack() { | e | on_thumb(e, 'track') } @scroll_win.evt_scrollwin_thumbrelease() { | e | on_thumb(e, 'release') } @scroll_win.evt_scrollwin_pagedown() { | e | on_page(e, 'down') } @scroll_win.evt_scrollwin_pageup() { | e | on_page(e, 'up') } # not sure how these are meant to be generated @scroll_win.evt_scrollwin_top() { | e | on_top(e) } @scroll_win.evt_scrollwin_bottom() { | e | on_bottom(e) } @scroll_win.evt_scrollwin { | e | p e } end # Handle scrolling by page - typically done by clicking on the # scrollbar itself, above or below the thumb position # +direction+ is either 'up' (= left, if dealing with a horizontal # scrollbar) or 'down' (= right) - WxRuby generates different events # for these. def on_page(event, direction) pos = event.get_position orient = event.get_orientation == Wx::VERTICAL ? 'VERTICAL' : 'HORIZONTAL' puts "#{orient} scrollbar page #{direction} @ #{pos}" event.skip() # allow default scrolling action end # Handle scrolling by line - typically done by clicking the up/down # (or left/right) scroll buttons at the end of the scrollbar. # +direction+ is either 'up' (= left, if dealing with a horizontal # scrollbar) or 'down' (= right) def on_line(event, direction) orient = event.get_orientation == Wx::VERTICAL ? 'VERTICAL' : 'HORIZONTAL' pos = event.get_position puts "#{orient} scrollbar line #{direction} @ #{pos}" event.skip() # allow default action end # Handle scrolling done by click-dragging the 'thumb' within a scrollbar. # +action+ contains either 'track' for thumbtrack drag events, or 'release' # for thumb-release def on_thumb(event, action) pos = event.get_position if event.get_orientation == Wx::VERTICAL puts "VERTICAL thumb #{action} @ #{pos}" else puts "HORIZONTAL thumb #{action} @ #{pos}" end event.skip() end # (Assuming this should be triggered when the End key is pressed)? def on_bottom(event) puts "bottom" end # (Assuming this should be triggered when the Home/Begin key is pressed)? def on_top(event) puts "top" end end class ScrollingApp < Wx::App def on_init frame = ScrollFrame.new('') frame.show(TRUE) end end app = ScrollingApp.new app.main_loop()