#!/usr/bin/env ruby begin require 'rubygems' rescue LoadError end require 'wx' # Demonstrating the use of evt_update_ui to keep menu items and controls # in sync in being enabled/disabled, checked/uncheked class UpdateUIFrame < Wx::Frame def initialize super(nil, :title => 'Update UI example', :size => [ 400, 300 ]) @edit_mode = false # First, set up the menus self.menu_bar = Wx::MenuBar.new menu_edit = Wx::Menu.new # Toggle case-change menu item menu_edit.append_check_item(Wx::ID_EDIT, 'Allow case change') evt_menu(Wx::ID_EDIT) { @edit_mode = ! @edit_mode } evt_update_ui(Wx::ID_EDIT) { | evt | evt.check(@edit_mode) } # Upcase menu item up_case = menu_edit.append('Upper case') evt_menu(up_case) { @txt.value = @txt.value.upcase } evt_update_ui(up_case) { | evt | evt.enable(@edit_mode) } # Lowercase menu item up_case = menu_edit.append('Lower case') evt_menu(up_case) { @txt.value = @txt.value.downcase } evt_update_ui(up_case) { | evt | evt.enable(@edit_mode) } menu_bar.append(menu_edit, "&Edit") # Second, the frame contents self.sizer = Wx::BoxSizer.new(Wx::VERTICAL) # A text control @txt = Wx::TextCtrl.new( self, :value => 'Welcome to wxRuby', :style => Wx::TE_MULTILINE ) sizer.add(@txt, 1, Wx::GROW|Wx::ALL, 5) # A checkbox, use the Wx::ID_EDIT id to share evt code with the # corresponding menu item @cbx = Wx::CheckBox.new( self, :id => Wx::ID_EDIT, :label => 'Allow case change') evt_checkbox(@cbx) { @edit_mode = ! @edit_mode } sizer.add(@cbx, 0, Wx::RIGHT|Wx::ALL, 5) sizer.layout end end Wx::App.run { UpdateUIFrame.new.show }