view release on metacpan or search on metacpan
0.974
Show filename in window title.
Show asterisk if file is modified.
Disable Undo/Redo menu entries if t_source cannot do it.
0.972
Fix missing Eb in prefs dialog.
Add scandinavian notes.
0.97
Better handling of errors and exceptions.
Add support for multiple configs, notation systems and transcoding.
Add setting of editor font and size.
0.96
0.84 Sep 22 2017
Add checkbox to suppress user and legacy config files.
Fix problem with (custom) config (needed prefs dialog to be picked up).
0.84 Jul 31 2017
Bump.
0.83 Jul 24 2017
Rework preferences to allow selection of preset configs.
0.79 Jul 12 2017
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
'',
wxCONFIG_USE_LOCAL_FILE,
));
}
$self->{_verbose} = $options->{verbose};
$self->{_trace} = $options->{trace};
$self->{_debug} = $options->{debug};
$self->GetPreferences;
my $font = $fonts[$self->{prefs_editfont}]->{font};
$font->SetPointSize($self->{prefs_editsize});
$self->{t_source}->SetFont($font);
# Disable menu items if we cannot.
$self->{main_menubar}->FindItem(wxID_UNDO)
->Enable($self->{t_source}->CanUndo);
$self->{main_menubar}->FindItem(wxID_REDO)
->Enable($self->{t_source}->CanRedo);
Wx::Log::SetTimestamp(' ');
if ( @ARGV && -s $ARGV[0] ) {
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
$self->{_currentfile} = $file;
if ( $self->{t_source}->GetValue =~ /^\{\s*t(?:itle)[: ]+([^\}]*)\}/m ) {
my $n = $self->{t_source}->GetNumberOfLines;
Wx::LogStatus("Loaded: $1 ($n line" .
( $n == 1 ? "" : "s" ) .
")");
$self->{sz_source}->GetStaticBox->SetLabel($1);
}
$self->SetTitle( $self->{_windowtitle} = $file);
$self->{prefs_xpose} = 0;
$self->{prefs_xposesharp} = 0;
}
sub newfile {
my ( $self ) = @_;
undef $self->{_currentfile};
$self->{t_source}->SetValue( <<EOD );
{title: New Song}
EOD
Wx::LogStatus("New file");
$self->{prefs_xpose} = 0;
$self->{prefs_xposesharp} = 0;
}
my ( $preview_cho, $preview_pdf );
my ( $msgs, $fatal, $died );
sub _warn {
Wx::LogWarning(@_);
$msgs++;
}
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
@ARGV = (); # just to make sure
$::__EMBEDDED__ = 1;
$msgs = $fatal = $died = 0;
$SIG{__WARN__} = \&_warn;
# $SIG{__DIE__} = \&_die;
my $haveconfig;
push( @ARGV, '--nosysconfig', '--nouserconfig', '--nolegacyconfig' )
if $self->{prefs_skipstdcfg};
if ( $self->{prefs_cfgpreset} ) {
$haveconfig++;
foreach ( @{ $self->{prefs_cfgpreset} } ) {
if ( $_ eq "custom" ) {
push( @ARGV, '--config', $self->{prefs_configfile} );
}
else {
push( @ARGV, '--config', $_ );
}
}
}
if ( $self->{prefs_xcode} ) {
$haveconfig++;
push( @ARGV, '--transcode', $self->{prefs_xcode} );
}
if ( $self->{prefs_notation} ) {
$haveconfig++;
push( @ARGV, '--config', 'notes:' . $self->{prefs_notation} );
}
push( @ARGV, '--noconfig' ) unless $haveconfig;
push( @ARGV, '--output', $preview_pdf );
push( @ARGV, '--generate', "PDF" );
push( @ARGV, '--transpose', $self->{prefs_xpose} )
if $self->{prefs_xpose};
push( @ARGV, $preview_cho );
if ( $self->{_trace} || $self->{_debug}
|| $self->{_verbose} && $self->{_verbose} > 1 ) {
warn( "Command line: @ARGV\n" );
warn( "$_\n" ) for split( /\n+/, _aboutmsg() );
}
my $options;
eval {
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
$options->{silent} = 1;
eval {
App::Music::ChordPro::main($options)
};
_die($@), goto ERROR if $@ && !$died;
if ( -e $preview_pdf ) {
Wx::LogStatus("Output generated, starting previewer");
if ( my $cmd = $self->{prefs_pdfviewer} ) {
if ( $cmd =~ s/\%f/$preview_pdf/g ) {
}
elsif ( $cmd =~ /\%u/ ) {
my $u = _makeurl($preview_pdf);
$cmd =~ s/\%u/$u/g;
}
else {
$cmd .= " \"$preview_pdf\"";
}
Wx::ExecuteCommand($cmd);
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
my ( $self, $file ) = @_;
$self->{t_source}->SaveFile($file);
$self->SetTitle( $self->{_windowtitle} = $file);
Wx::LogStatus( "Saved." );
}
sub GetPreferences {
my ( $self ) = @_;
my $conf = Wx::ConfigBase::Get;
for ( keys( %$prefctl ) ) {
$self->{"prefs_$_"} = $conf->Read( "preferences/$_", $prefctl->{$_} );
}
# Find config setting.
my $p = lc( $self->{prefs_cfgpreset} ) || $prefctl->{cfgpreset};
if ( ",$p" =~ quotemeta( "," . _T("Custom") ) ) {
$self->{_cfgpresetfile} = $self->{prefs_configfile};
}
my @presets;
foreach ( @{stylelist()} ) {
if ( ",$p" =~ quotemeta( "," . $_ ) ) {
push( @presets, $_ );
}
}
$self->{prefs_cfgpreset} = \@presets;
# Find transcode setting.
$p = lc $self->{prefs_xcode} || $prefctl->{xcode};
if ( $p ) {
if ( $p eq lc(_T("-----")) ) {
$p = $prefctl->{xcode};
}
else {
my $n = "";
for ( @{ $self->notationlist } ) {
next unless $_ eq $p;
$n = $p;
last;
}
$p = $n;
}
}
$self->{prefs_xcode} = $p;
}
sub SavePreferences {
my ( $self ) = @_;
return unless $self;
my $conf = Wx::ConfigBase::Get;
local $self->{prefs_cfgpreset} = join( ",", @{$self->{prefs_cfgpreset}} );
for ( keys( %$prefctl ) ) {
$conf->Write( "preferences/$_", $self->{"prefs_$_"} );
}
$conf->Flush;
}
################ Event handlers ################
# Event handlers override the subs generated by wxGlade in the _wxg class.
sub OnOpen {
my ( $self, $event, $create ) = @_;
lib/App/Music/ChordPro/Wx/Main.pm view on Meta::CPAN
return unless $self->checksaved;
$self->openfile( getresource( "examples/swinglow.cho" ) );
undef $self->{_currentfile};
$self->{t_source}->SetModified(1);
}
sub OnPreferences {
my ($self, $event) = @_;
use App::Music::ChordPro::Wx::PreferencesDialog;
$self->{d_prefs} ||= App::Music::ChordPro::Wx::PreferencesDialog->new($self, -1, "Preferences");
my $ret = $self->{d_prefs}->ShowModal;
$self->SavePreferences if $ret == wxID_OK;
}
sub _aboutmsg {
my ( $self ) = @_;
my $firstyear = 2016;
my $year = 1900 + (localtime(time))[5];
if ( $year != $firstyear ) {
$year = "$firstyear,$year";
lib/App/Music/ChordPro/Wx/PreferencesDialog.pm view on Meta::CPAN
"latin" => "Do, Re, Mi, Fa, Sol, ...",
"scandinavian" => "C, ... A, A#/Bb, H",
"solfege" => "Do, Re, Mi, Fa, So, ...",
"solfège" => "Do, Re, Mi, Fa, So, ...",
"nashville" => "1, 2, 3, ...",
"roman" => "I, II, III, ...",
};
sub get_configfile {
my ( $self ) = @_;
# warn("CF: ", $self->GetParent->{prefs_configfile} || "");
$self->GetParent->{prefs_configfile} || ""
}
sub __set_properties {
my ( $self ) = @_;
$self->SUPER::__set_properties;
my $parent = $self->GetParent;
$self->{t_configfiledialog}->SetValue($parent->{prefs_configfile})
if $parent->{prefs_configfile};
$self->{t_pdfviewer}->SetValue($parent->{prefs_pdfviewer})
if $parent->{prefs_pdfviewer};
$self->{cb_skipstdcfg}->SetValue($parent->{prefs_skipstdcfg});
my $ctl = $self->{ch_config};
$ctl->Clear;
for ( @{ $parent->stylelist } ) {
my $t = ucfirst(lc($_));
$t =~ s/_/ /g;
$t =~ s/ (.)/" ".uc($1)/eg;
$ctl->Append($t);
}
my $p = $parent->{prefs_cfgpreset};
foreach ( @$p ) {
my $t = ucfirst(lc($_));
$t =~ s/_/ /g;
$t =~ s/ (.)/" ".uc($1)/eg;
my $n = $ctl->FindString($t);
unless ( $n == wxNOT_FOUND ) {
$ctl->Check( $n, 1 );
}
}
$self->_enablecustom;
$ctl = $self->{ch_editfont};
$ctl->SetSelection( $parent->{prefs_editfont} );
$ctl = $self->{sp_editfont};
$ctl->SetValue( $parent->{prefs_editsize} );
$ctl = $self->{ch_notation};
$ctl->Clear;
my $n = 0;
my $check = 0;
for ( @{ $parent->notationlist } ) {
my $s = ucfirst($_);
$check = $n if $_ eq lc $parent->{prefs_notation};
$s .= " (" . $notdesc->{lc($s)} .")" if $notdesc->{lc($s)};
$ctl->Append($s);
$ctl->SetClientData( $n, $_);
$n++;
}
$ctl->SetSelection($check);
$ctl = $self->{ch_transcode};
$ctl->Clear;
$ctl->Append("-----");
$n = 1;
for ( @{ $parent->notationlist } ) {
my $s = ucfirst($_);
$check = $n if $_ eq lc $parent->{prefs_xcode};
$s .= " (" . $notdesc->{lc($s)} .")" if $notdesc->{lc($s)};
$ctl->Append($s);
$ctl->SetClientData( $n, $_);
$n++;
}
$ctl->SetSelection($check);
}
sub _enablecustom {
my ( $self ) = @_;
lib/App/Music/ChordPro/Wx/PreferencesDialog.pm view on Meta::CPAN
$enablecustom++;
}
}
$self->_enablecustom($enablecustom);
}
sub OnConfigFileDialog {
my ( $self, $event ) = @_;
my $fd = Wx::FileDialog->new
($self, _T("Choose config file"),
"", $self->GetParent->{prefs_configfile} || "",
"Config files (*.cfg,*.json)|*.cfg;*.json|All files|*.*",
0|wxFD_OPEN,
wxDefaultPosition);
my $ret = $fd->ShowModal;
if ( $ret == wxID_OK ) {
my $file = $fd->GetPath;
if ( -f $file ) {
$self->{t_configfiledialog}->SetValue($file);
}
else {
lib/App/Music/ChordPro/Wx/PreferencesDialog.pm view on Meta::CPAN
my $ctl = $self->{ch_config};
my $cnt = $ctl->GetCount;
my @p;
my $styles = $self->GetParent->stylelist;
for ( my $n = 0; $n < $cnt; $n++ ) {
next unless $ctl->IsChecked($n);
push( @p, $styles->[$n] );
if ( $n == $cnt - 1 ) {
$self->GetParent->{_cfgpresetfile} =
$self->GetParent->{prefs_configfile} =
$self->{t_configfiledialog}->GetValue;
}
}
$self->GetParent->{prefs_skipstdcfg} =
$self->{cb_skipstdcfg}->IsChecked ? 1 : 0;
$self->GetParent->{prefs_cfgpreset} = \@p;
my $n = $self->{ch_notation}->GetSelection;
if ( $n > 0 ) {
$self->GetParent->{prefs_notation} =
$self->{ch_notation}->GetClientData($n);
}
else {
$self->GetParent->{prefs_notation} = "";
}
$self->GetParent->{prefs_pdfviewer} = $self->{t_pdfviewer}->GetValue;
$n = $xpmap[$self->{ch_xpose_to}->GetSelection]
- $xpmap[$self->{ch_xpose_from}->GetSelection];
$n += 12 if $n < 0;
$n = $n - 12 if $self->{rb_xpose_flat }->GetValue;
$self->GetParent->{prefs_xpose} = $n;
$n = $self->{ch_transcode}->GetSelection;
if ( $n > 0 ) {
$self->GetParent->{prefs_xcode} =
$self->{ch_transcode}->GetClientData($n);
}
else {
$self->GetParent->{prefs_xcode} = "";
}
$event->Skip;
}
sub OnCancel {
my ( $self, $event ) = @_;
$event->Skip;
}
lib/App/Music/ChordPro/Wx/PreferencesDialog.pm view on Meta::CPAN
my $n = $self->{ch_transcode}->GetSelection;
$event->Skip;
}
sub OnChEditFont {
my ($self, $event) = @_;
my $p = $self->GetParent;
my $n = $self->{ch_editfont}->GetSelection;
my $ctl = $p->{t_source};
my $font = $p->fonts->[$n]->{font};
$font->SetPointSize($p->{prefs_editsize});
$ctl->SetFont($font);
$p->{prefs_editfont} = $n;
$event->Skip;
}
sub OnSpEditFont {
my ($self, $event) = @_;
my $p = $self->GetParent;
my $n = $self->{sp_editfont}->GetValue;
my $ctl = $p->{t_source};
my $font = $ctl->GetFont;
$font->SetPointSize($n);
$ctl->SetFont($font);
$p->{prefs_editsize} = $n;
$event->Skip;
}
1;
lib/App/Music/ChordPro/Wx/PreferencesDialog.wxg view on Meta::CPAN
<?xml version="1.0"?>
<!-- generated by wxGlade 0.9.0pre on Mon Oct 8 17:05:34 2018 -->
<application encoding="UTF-8" for_version="2.8" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="perl" mark_blocks="1" option="0" overwrite="1" path="PreferencesDialog_wxg.pm" source_extension=".cpp" top_window=...
<object class="App::Music::ChordPro::Wx::PreferencesDialog_wxg" name="d_prefs" base="EditDialog">
<title>Preferences</title>
<style>wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER</style>
<object class="wxBoxSizer" name="sz_prefs_outer" base="EditBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>1</option>
<border>0</border>
<flag>wxLEFT|wxRIGHT|wxTOP|wxEXPAND</flag>
<object class="wxBoxSizer" name="sz_prefs_inner" base="EditBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>1</option>
<border>5</border>
<object class="wxFlexGridSizer" name="sizer_2" base="EditFlexGridSizer">
<rows>10</rows>
<cols>2</cols>
<vgap>5</vgap>
<hgap>5</hgap>
<growable_rows>0</growable_rows>
lib/App/Music/ChordPro/Wx/PreferencesDialog.wxg view on Meta::CPAN
<flag>wxEXPAND</flag>
<object class="spacer" name="spacer" base="EditSpacer">
<width>1</width>
<height>1</height>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>5</border>
<flag>wxALL|wxEXPAND</flag>
<object class="wxBoxSizer" name="sz_prefs_buttons" base="EditBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>1</option>
<border>0</border>
<flag>wxEXPAND</flag>
<object class="spacer" name="spacer" base="EditSpacer">
<width>5</width>
<height>1</height>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<object class="wxButton" name="b_prefs_cancel" base="EditButton">
<events>
<handler event="EVT_BUTTON">OnCancel</handler>
</events>
<label>&Cancel</label>
<stockitem>CANCEL</stockitem>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>5</border>
<flag>wxLEFT</flag>
<object class="wxButton" name="b_prefs_ok" base="EditButton">
<events>
<handler event="EVT_BUTTON">OnAccept</handler>
</events>
<label>&OK</label>
<default>1</default>
<stockitem>OK</stockitem>
</object>
</object>
</object>
</object>
lib/App/Music/ChordPro/Wx/PreferencesDialog_wxg.pm view on Meta::CPAN
$self->{l_xpose_from} = Wx::StaticText->new($self, wxID_ANY, _T("From"));
$self->{ch_xpose_from} = Wx::Choice->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, [_T("C"), _T("C#"), _T("Db"), _T("D"), _T("D#"), _T("Eb"), _T("E"), _T("F"), _T("F#"), _T("Gb"), _T("G"), _T("G#"), _T("Ab"), _T("A"), _T("A#"), _T("Bb"),...
$self->{l_xpose_to} = Wx::StaticText->new($self, wxID_ANY, _T("To"));
$self->{ch_xpose_to} = Wx::Choice->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, [_T("C"), _T("C#"), _T("Db"), _T("D"), _T("D#"), _T("Eb"), _T("E"), _T("F"), _T("F#"), _T("Gb"), _T("G"), _T("G#"), _T("Ab"), _T("A"), _T("A#"), _T("Bb"), _...
$self->{rb_xpose_sharp} = Wx::RadioButton->new($self, wxID_ANY, _T("Sharp"));
$self->{rb_xpose_flat} = Wx::RadioButton->new($self, wxID_ANY, _T("Flat"));
$self->{l_transcode} = Wx::StaticText->new($self, wxID_ANY, _T("Transcode to"));
$self->{ch_transcode} = Wx::Choice->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, [_T("-----"), _T("Common (C, D, E, F, G, A, B)"), _T("German (C, D, E, F, G, A, H)"), _T("Latin (Do, Re, Mi, Fa, Sol, ...)"), _T("Solf\N{U+00e8}ge (Do, Re,...
$self->{l_pdfviewer} = Wx::StaticText->new($self, wxID_ANY, _T("PDF previewer"));
$self->{t_pdfviewer} = Wx::TextCtrl->new($self, wxID_ANY, "");
$self->{b_prefs_cancel} = Wx::Button->new($self, wxID_CANCEL, "");
$self->{b_prefs_ok} = Wx::Button->new($self, wxID_OK, "");
$self->__set_properties();
$self->__do_layout();
Wx::Event::EVT_CHECKLISTBOX($self, $self->{ch_config}->GetId, $self->can('OnChConfig'));
Wx::Event::EVT_CHECKBOX($self, $self->{cb_skipstdcfg}->GetId, $self->can('OnSkipStdCfg'));
Wx::Event::EVT_BUTTON($self, $self->{b_configfiledialog}->GetId, $self->can('OnConfigFileDialog'));
Wx::Event::EVT_CHOICE($self, $self->{ch_editfont}->GetId, $self->can('OnChEditFont'));
Wx::Event::EVT_SPINCTRL($self, $self->{sp_editfont}->GetId, $self->can('OnSpEditFont'));
Wx::Event::EVT_CHOICE($self, $self->{ch_notation}->GetId, $self->can('OnChNotation'));
Wx::Event::EVT_CHOICE($self, $self->{ch_xpose_from}->GetId, $self->can('OnXposeFrom'));
Wx::Event::EVT_CHOICE($self, $self->{ch_xpose_to}->GetId, $self->can('OnXposeTo'));
Wx::Event::EVT_RADIOBUTTON($self, $self->{rb_xpose_sharp}->GetId, $self->can('OnXposeSharp'));
Wx::Event::EVT_RADIOBUTTON($self, $self->{rb_xpose_flat}->GetId, $self->can('onXposeFlat'));
Wx::Event::EVT_CHOICE($self, $self->{ch_transcode}->GetId, $self->can('OnChTranscode'));
Wx::Event::EVT_BUTTON($self, $self->{b_prefs_cancel}->GetId, $self->can('OnCancel'));
Wx::Event::EVT_BUTTON($self, $self->{b_prefs_ok}->GetId, $self->can('OnAccept'));
# end wxGlade
return $self;
}
sub __set_properties {
my $self = shift;
# begin wxGlade: App::Music::ChordPro::Wx::PreferencesDialog_wxg::__set_properties
lib/App/Music/ChordPro/Wx/PreferencesDialog_wxg.pm view on Meta::CPAN
$self->{t_configfiledialog}->SetToolTipString(_T("Select a custom config file by pressing the [...] button."));
$self->{b_configfiledialog}->SetMinSize($self->{b_configfiledialog}->ConvertDialogSizeToPixels(Wx::Size->new(38, 14)));
$self->{ch_editfont}->SetSelection(0);
$self->{ch_notation}->SetSelection(0);
$self->{ch_xpose_from}->SetSelection(0);
$self->{ch_xpose_to}->SetSelection(0);
$self->{rb_xpose_sharp}->SetToolTipString(_T("Use sharp chords"));
$self->{rb_xpose_flat}->SetToolTipString(_T("Use flat chords"));
$self->{ch_transcode}->SetSelection(0);
$self->{t_pdfviewer}->SetToolTipString(_T("Alternative PDF previewer.\n %f will be replaced by the file name\n %u will be replaced by the file URL\nLeave empty to use the system default viewer."));
$self->{b_prefs_ok}->SetDefault();
# end wxGlade
}
sub __do_layout {
my $self = shift;
# begin wxGlade: App::Music::ChordPro::Wx::PreferencesDialog_wxg::__do_layout
$self->{sz_prefs_outer} = Wx::BoxSizer->new(wxVERTICAL);
$self->{sz_prefs_buttons} = Wx::BoxSizer->new(wxHORIZONTAL);
$self->{sz_prefs_inner} = Wx::BoxSizer->new(wxVERTICAL);
$self->{sizer_2} = Wx::FlexGridSizer->new(10, 2, 5, 5);
$self->{sz_xpose} = Wx::BoxSizer->new(wxHORIZONTAL);
$self->{sizer_3} = Wx::BoxSizer->new(wxHORIZONTAL);
$self->{sizer_1} = Wx::BoxSizer->new(wxHORIZONTAL);
$self->{sizer_2}->Add($self->{l_config}, 1, wxLEFT|wxTOP, 5);
$self->{sizer_2}->Add($self->{ch_config}, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxTOP, 5);
$self->{sizer_2}->Add(5, 5, 0, wxEXPAND, 0);
$self->{sizer_2}->Add($self->{cb_skipstdcfg}, 0, wxALIGN_CENTER_VERTICAL, 0);
$self->{sizer_2}->Add($self->{l_cfgfile}, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5);
$self->{sizer_1}->Add($self->{t_configfiledialog}, 1, wxEXPAND, 0);
lib/App/Music/ChordPro/Wx/PreferencesDialog_wxg.pm view on Meta::CPAN
$self->{sz_xpose}->Add($self->{ch_xpose_to}, 0, 0, 0);
$self->{sz_xpose}->Add($self->{rb_xpose_sharp}, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
$self->{sz_xpose}->Add($self->{rb_xpose_flat}, 0, wxALIGN_CENTER_VERTICAL, 0);
$self->{sizer_2}->Add($self->{sz_xpose}, 1, wxEXPAND|wxRIGHT, 5);
$self->{sizer_2}->Add($self->{l_transcode}, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5);
$self->{sizer_2}->Add($self->{ch_transcode}, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT, 5);
$self->{sizer_2}->Add($self->{l_pdfviewer}, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5);
$self->{sizer_2}->Add($self->{t_pdfviewer}, 0, wxEXPAND|wxRIGHT, 5);
$self->{sizer_2}->AddGrowableRow(0);
$self->{sizer_2}->AddGrowableCol(1);
$self->{sz_prefs_inner}->Add($self->{sizer_2}, 1, 0, 5);
$self->{sz_prefs_outer}->Add($self->{sz_prefs_inner}, 1, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 0);
$self->{sz_prefs_outer}->Add(1, 1, 0, wxEXPAND, 0);
$self->{sz_prefs_buttons}->Add(5, 1, 1, wxEXPAND, 0);
$self->{sz_prefs_buttons}->Add($self->{b_prefs_cancel}, 0, 0, 0);
$self->{sz_prefs_buttons}->Add($self->{b_prefs_ok}, 0, wxLEFT, 5);
$self->{sz_prefs_outer}->Add($self->{sz_prefs_buttons}, 0, wxALL|wxEXPAND, 5);
$self->SetSizer($self->{sz_prefs_outer});
$self->{sz_prefs_outer}->Fit($self);
$self->Layout();
# end wxGlade
}
sub OnChConfig {
my ($self, $event) = @_;
# wxGlade: App::Music::ChordPro::Wx::PreferencesDialog_wxg::OnChConfig <event_handler>
warn "Event handler (OnChConfig) not implemented";
$event->Skip;
# end wxGlade