App-Music-ChordPro

 view release on metacpan or  search on metacpan

lib/ChordPro/Wx/Config.pm  view on Meta::CPAN

		   wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ),

    # Sans serif
    Wx::Font->new( FONTSIZE, wxFONTFAMILY_SWISS,
		   wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ),
    # Modern
    Wx::Font->new( FONTSIZE, wxFONTFAMILY_MODERN,
		   wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ),
  );

my %prefs =
  (
   # (Old) config version.
   settings_version => SETTINGS_VERSION - 1,

   # Skip default (system, user, song) configs.
   skipstdcfg  => 1,
   # Skip legacy (un-classified) configs.
   skipoldcfg  => 0,

   # Presets.

lib/ChordPro/Wx/Config.pm  view on Meta::CPAN

    $preferences{settings_version} = SETTINGS_VERSION;
}

# Load all data from the persistent data store into %state.
# Adds information collected from the environment (e.g. config files).
# Try to compensate for incompatibilities (legacy).

method Load :common {
    use Hash::Util qw( lock_keys unlock_keys );
    unlock_keys(%preferences);
    %preferences = ( %prefs );
    while ( my ( $k, $v ) = each %prefs ) {
	next unless $k =~ /^(editcolour)_(\w+)_(\w+)/;
	$preferences{$1}{$2}{$3} = $v;
    }
    while ( my ( $k, $v ) = each %preferences ) {
	delete $preferences{$k} if $k =~ /^(editcolour)_/;
    }
    %state = ( preferences => \%preferences,
	       recents => [],
	     );

    $cb->SetPath($config_root);
    my ( $ggoon, $group, $gindex ) = $cb->GetFirstGroup;
    my %pp = $ggoon ? %prefs : ();
    while ( $ggoon ) {
	my $cp = $cb->GetPath;
	$cb->SetPath($group);

	$state{$group} = [] if $group eq "recents";

	my ( $goon, $entry, $index ) = $cb->GetFirstEntry;
	while ( $goon ) {
	    my $value = $cb->Read($entry);
	    # printf STDERR ( "$group.$entry:\t%s\n", $value );

lib/ChordPro/Wx/Editor.pm  view on Meta::CPAN

package ChordPro::Wx::STCEditor;

use parent qw( -norequire Wx::StyledTextCtrl );
#use parent qw( -norequire Wx::Scintilla::TextCtrl );

use Wx ':everything';
use ChordPro::Wx::Config;
use ChordPro::Wx::Utils;


sub refresh( $self, $prefs = undef ) {
    my $stc = $self;

    $prefs //= \%preferences;

    # RTI loading is currently too slow.
    # $state{rti} = ChordPro::runtime_info();
    $state{rti}->{directive_abbrevs} = ChordPro::Song::_directive_abbrevs();

    $stc->SetLexer(wxSTC_LEX_CONTAINER);
    $stc->SetKeyWords(0,
		      [qw( album arranger artist capo chord chorus
			   column_break columns comment comment_box
			   comment_italic composer copyright define

lib/ChordPro/Wx/Editor.pm  view on Meta::CPAN

			   start_of_verse subtitle tempo time title
			   titles transpose year )
		      ]);

    Wx::Event::EVT_STC_STYLENEEDED( $stc, wxID_ANY,
				    sub { OnStyleNeeded($self, $_[1]) } );
    Wx::Event::EVT_STC_CHANGE( $stc, wxID_ANY,
			       sub { OnChanged($self, $_[1]) } );
    $self->SetModEventMask(0x01|0x02|0x10);
    my $theme = $state{editortheme};
    my $c = $prefs->{editcolour}{$theme};
    my $fg = Wx::Colour->new($c->{fg});
    my $bg = Wx::Colour->new($c->{bg});

    $stc->SetBackgroundColour($bg);
    $stc->SetCaretForeground($fg);

    $stc->StyleSetForeground( wxSTC_STYLE_DEFAULT, $fg );
    $stc->StyleSetBackground( wxSTC_STYLE_DEFAULT, $bg );
    $stc->StyleClearAll;

lib/ChordPro/Wx/Editor.pm  view on Meta::CPAN

    $stc->StyleSetForeground( wxSTC_STYLE_LINENUMBER,
			      Wx::Colour->new( $c->{numfg} ) );
    $stc->StyleSetBackground( wxSTC_STYLE_LINENUMBER,
			      Wx::Colour->new( $c->{numbg} ) );

    # For annotations.
    $self->{astyle} //= 1 + wxSTC_STYLE_LASTPREDEFINED;
    $stc->StyleSetBackground( $self->{astyle}, Wx::Colour->new($c->{annbg}) );
    $stc->StyleSetForeground( $self->{astyle}, Wx::Colour->new($c->{annfg}) );

    $stc->SetFont( Wx::Font->new($prefs->{editfont}) );

    # Wrapping.
    if ( $prefs->{editorwrap} ) {
	$stc->SetWrapMode(3); # wxSTC_WRAP_WHITESPACE );
	$stc->SetWrapStartIndent( $prefs->{editorwrapindent} );
    }
    else {
	$stc->SetWrapMode(0); # wxSTC_WRAP_NONE );
    }

    $self->style_text;
    # Expert...
    $stc->SetViewEOL( $state{vieweol} );
    $stc->SetViewWhiteSpace( $state{viewws} );
    $stc->SetViewLineNumbers(1);

lib/ChordPro/Wx/Editor.pm  view on Meta::CPAN


sub new( $class, $parent, $id=undef ) {

    my $self = $class->SUPER::new( $parent, wxID_ANY, "",
				   wxDefaultPosition, wxDefaultSize,
				   wxHSCROLL|wxTE_MULTILINE );

    return $self;
}

sub refresh( $self, $prefs = undef ) {
    my $ctrl = $self;
    $prefs //= \%preferences;

    my $mod = $self->IsModified;

    # TextCtrl only supports background colour and font.
    my $theme = $prefs->{editortheme};
    my $c = $prefs->{editcolour}{$theme};
    my $bgcol = Wx::Colour->new( $c->{bg} );
    my $fgcol = Wx::Colour->new( $c->{fg} );
    $ctrl->SetBackgroundColour($bgcol);
    $ctrl->SetStyle( 0, $ctrl->GetLastPosition,
		     Wx::TextAttr->new( $fgcol, $bgcol ) );
    $ctrl->SetFont( Wx::Font->new($prefs->{editfont}) );

    $ctrl->SetModified($mod);
}

sub AddText( $self, $text ) {
    $self->WriteText($text);
}

sub GetLineCount( $self ) {
    $self->GetNumberOfLines;

lib/ChordPro/Wx/Main.pm  view on Meta::CPAN

      );

    return $msg;
}

method check_saved() {
    for ( panels ) {
	return unless $self->{$_}->check_source_saved;
	return unless $self->{$_}->check_preview_saved;
    }
    # Panels may save prefs to preferences.
    $self->{$_}->save_preferences for panels;
    1;
}

method setup_statusbar() {
    # Add statusbar.
    return unless $preferences{expert};
    $self->{f_main_statusbar} = $self->CreateStatusBar(1);
    $self->{f_main_statusbar}->SetStatusWidths(-1);
}

lib/ChordPro/Wx/Main.pm  view on Meta::CPAN

	$state{ffilters},
	wxFD_OPEN|wxFD_FILE_MUST_EXIST );
    my $ret = $fd->ShowModal;
    if ( $ret == wxID_OK ) {
	$self->select_mode("editor")->openfile( $fd->GetPath, 1 );
    }
    $fd->Destroy;
}

method OnPreferences($event) {
    unless ( $self->{d_prefs} ) {
	require ChordPro::Wx::SettingsDialog;
	$self->{d_prefs} = ChordPro::Wx::SettingsDialog->new
	  ( $self, wxID_ANY, "Settings" );
	restorewinpos( $self->{d_prefs}, "prefs" );
    }
    else {
	$self->{d_prefs}->refresh;
    }

    # The Settings dialog operates on the current $preferences.
    my $ret = $self->{d_prefs}->ShowModal;
    savewinpos( $self->{d_prefs}, "prefs" );
    $state{panel}->set_focus unless $state{mode} eq "initial";
    return unless $ret == wxID_OK;

    # $preferences may have changed.
    $self->save_preferences;

    # Update the requestor.
    $state{panel}->update_preferences unless $state{mode} eq "initial";

    $self->setup_menubar;

lib/ChordPro/Wx/RenderDialog.pm  view on Meta::CPAN

	my $index = 0;
	for my $task ( sort keys %{$state{presets}{tasks}} ) {
	    my $id = Wx::NewId();
	    $self->{sz_customtasks}->Add
	      ( $self->{"cb_customtask_$index"} = Wx::CheckBox->new
		($self, $id, $state{presets}{tasks}{$task}->{title} ),
		0, 0, 0 );
	    $index++;
	}
	$self->{sz_customtasks}->Layout;
	$self->{sz_prefs_inner}->Fit($self);
    }
    $state{"xpose_$_"} ||= 0
      for qw( enabled semitones accidentals );

    $self->refresh;
    $self;
}

sub refresh {
    my ( $self ) = @_;

lib/ChordPro/Wx/RenderDialog.wxg  view on Meta::CPAN

<?xml version="1.0"?>
<!-- generated by wxGlade 1.1.1 on Mon Mar 16 09:12:52 2026 -->

<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="RenderDialog_wxg.pm" source_extension=".cpp" top_window="d_pr...
    <object class="ChordPro::Wx::RenderDialog_wxg" name="d_prefs" base="EditDialog">
        <extracode_pre>use ChordPro::Wx::Utils;</extracode_pre>
        <title>Preview Tasks</title>
        <style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
        <affirmative>b_ok</affirmative>
        <escape>b_cancel</escape>
        <object class="wxBoxSizer" name="sz_prefs_outer" base="EditBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
                <option>0</option>
                <border>5</border>
                <flag>wxALL|wxEXPAND</flag>
                <object class="wxStaticText" name="label_3" base="EditStaticText">
                    <foreground>#0068d9</foreground>
                    <font>
                        <size>18</size>
                        <family>default</family>

lib/ChordPro/Wx/RenderDialog.wxg  view on Meta::CPAN

                        <face />
                    </font>
                    <style>wxALIGN_CENTER_HORIZONTAL</style>
                    <label>Preview Tasks</label>
                </object>
            </object>
            <object class="sizeritem">
                <option>0</option>
                <border>5</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>
                        <flag>wxEXPAND</flag>
                        <object class="wxGridBagSizer" name="sizer_2" base="EditGridBagSizer">
                            <rows>4</rows>
                            <cols>2</cols>
                            <vgap>5</vgap>
                            <hgap>5</hgap>

lib/ChordPro/Wx/RenderDialog_wxg.pm  view on Meta::CPAN

    $name   = ""                 unless defined $name;

    # begin wxGlade: ChordPro::Wx::RenderDialog_wxg::new
    use ChordPro::Wx::Utils;
    $style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER
        unless defined $style;

    $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name );
    $self->SetTitle(_T("Preview Tasks"));
    
    $self->{sz_prefs_outer} = Wx::BoxSizer->new(wxVERTICAL);
    
    my $label_3 = Wx::StaticText->new($self, wxID_ANY, _T("Preview Tasks"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
    $label_3->SetForegroundColour(Wx::Colour->new(0, 104, 217));
    $label_3->SetFont(Wx::Font->new(18, wxDEFAULT, wxNORMAL, wxNORMAL, 0, ""));
    $self->{sz_prefs_outer}->Add($label_3, 0, wxALL|wxEXPAND, 5);
    
    $self->{sz_prefs_inner} = Wx::BoxSizer->new(wxVERTICAL);
    $self->{sz_prefs_outer}->Add($self->{sz_prefs_inner}, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5);
    
    $self->{sizer_2} = Wx::GridBagSizer->new(5, 5);
    $self->{sz_prefs_inner}->Add($self->{sizer_2}, 1, wxEXPAND, 5);
    
    my $label_1 = Wx::StaticText->new($self, wxID_ANY, _T("Tasks"));
    $self->{sizer_2}->Add($label_1, Wx::GBPosition->new(0, 0), Wx::GBSpan->new(1, 1), wxLEFT|wxTOP, 5);
    
    $self->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL);
    $self->{sizer_2}->Add($self->{sizer_1}, Wx::GBPosition->new(0, 1), Wx::GBSpan->new(1, 1), wxEXPAND|wxTOP, 5);
    
    $self->{cb_task_no_diagrams} = Wx::CheckBox->new($self, wxID_ANY, _T("Suppress the chord diagrams"));
    $self->{cb_task_no_diagrams}->SetToolTipString(_T("Do not include the chord diagrams"));
    $self->{sizer_1}->Add($self->{cb_task_no_diagrams}, 0, 0, 0);

lib/ChordPro/Wx/RenderDialog_wxg.pm  view on Meta::CPAN

    $self->{ch_xpose_dir}->SetSelection(0);
    $self->{sz_xpose}->Add($self->{ch_xpose_dir}, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5);
    
    $self->{sz_xpose}->Add(10, 2, 1, wxEXPAND, 0);
    
    $self->{ch_acc} = Wx::Choice->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, [_T("Sharps when transposing up, flats when down"), _T("Always use sharps"), _T("Always use flats"), _T("Use song key")], );
    $self->{ch_acc}->SetToolTipString(_T("How to treat chords that need accidentals after transposition.\nAuto is to use sharps when transposing up, and flats when transposing down. Key uses the transposed key of the song."));
    $self->{ch_acc}->SetSelection(0);
    $self->{sz_xpose}->Add($self->{ch_acc}, 0, wxEXPAND, 5);
    
    $self->{sz_prefs_outer}->Add(1, 5, 1, wxEXPAND, 0);
    
    my $static_line_1 = Wx::StaticLine->new($self, wxID_ANY);
    $self->{sz_prefs_outer}->Add($static_line_1, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 10);
    
    $self->{sz_tasks_buttons} = Wx::StdDialogButtonSizer->new();
    $self->{sz_prefs_outer}->Add($self->{sz_tasks_buttons}, 0, wxALL|wxEXPAND, 5);
    
    $self->{b_cancel} = Wx::Button->new($self, wxID_CANCEL, "");
    $self->{b_cancel}->SetToolTipString(_T("Close the dialog without doing anything"));
    $self->{sz_tasks_buttons}->AddButton($self->{b_cancel});
    
    $self->{b_ok} = Wx::Button->new($self, wxID_OK, "");
    $self->{b_ok}->SetToolTipString(_T("Generate the preview"));
    $self->{b_ok}->SetDefault();
    $self->{sz_tasks_buttons}->AddButton($self->{b_ok});
    
    $self->{sz_tasks_buttons}->Realize();
    
    $self->{sizer_2}->AddGrowableRow(1);
    $self->{sizer_2}->AddGrowableCol(1);
    
    $self->SetSizer($self->{sz_prefs_outer});
    $self->{sz_prefs_outer}->Fit($self);
    
    $self->SetAffirmativeId($self->{b_ok}->GetId());
    $self->SetEscapeId($self->{b_cancel}->GetId());
    
    $self->Layout();
    Wx::Event::EVT_CHECKBOX($self, $self->{cb_xpose}->GetId, $self->can('OnCbTranspose'));
    Wx::Event::EVT_BUTTON($self, $self->{b_cancel}->GetId, $self->can('OnCancel'));
    Wx::Event::EVT_BUTTON($self, $self->{b_ok}->GetId, $self->can('OnAccept'));

    # end wxGlade

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

use ChordPro::Files;
use ChordPro::Paths;
use ChordPro::Wx::Config;
use ChordPro::Wx::Utils;
use File::Basename;
use Ref::Util qw( is_arrayref );
use List::Util qw( first );

BUILD ( $parent, $id, $title ) {
    $self->refresh;
    $self->{sz_prefs_outer}->Fit($self);
    $self->Layout;
    Wx::Event::EVT_SYS_COLOUR_CHANGED( $self,
				       $self->can("OnSysColourChanged") );

    Wx::Event::EVT_ENTER_WINDOW( $self->{ch_stylemods},
				 $self->{ch_stylemods}->can("OnEnter") );
    Wx::Event::EVT_LEAVE_WINDOW( $self->{ch_stylemods},
				 $self->{ch_stylemods}->can("OnLeave") );
    Wx::Event::EVT_MOTION( $self->{ch_stylemods},
				 $self->{ch_stylemods}->can("OnMotion") );

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    unless ( has_appearance() ) {
	$self->{ch_theme}->Delete(2); # Follow System
    }

    $self;
}

my $checkpfx = "✔ ";

method refresh() {
    $self->fetch_prefs;
    $self->{t_editor}->refresh;
    $self->{t_editor}->SetText(<<EOD);
{title: St. James Infirmary Blues}
{subtitle: Traditional}

# Song starts here.
I went [Em]down to the [Am]St James In[Em]firmary
I found my [Am]baby [B7]there
EOD
}

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

	      if $_ eq lc($preferences{preset_xcodes}[0]->{title});
	    $check //= $n
	      if $state{presets}{notations}->{$_}->{default};
	    $n++;
	}

	$ctl->SetSelection($check);
    }
}

method fetch_prefs() {

    # Transfer preferences to the dialog.

    # Skip default (system, user, song) configs.
    $self->{cb_usestdcfg}->SetValue(!$preferences{skipstdcfg});

    if ( is_arrayref($preferences{preset_instruments})
	 && @{$preferences{preset_instruments}} ) {
	for ( $self->{ch_instrument} ) {
	    my $n = $_->FindString($preferences{preset_instruments}[0]);

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    # New song template.
    $self->{cb_tmplfile}->SetValue($preferences{enable_tmplfile});
    $self->{fp_tmplfile}->SetPath($preferences{tmplfile})
      if $preferences{tmplfile};

    # Preferred filename extension.
    $self->{t_prefext}->SetValue( $preferences{chordproext} );

    # Editor.
    $self->{fp_editor}->SetSelectedFont( Wx::Font->new($preferences{editfont}) );
    $self->prefs2colours;
    $self->{cb_editorwrap}->SetValue($preferences{editorwrap});
    $self->{sp_editorwrap}->SetValue($preferences{editorwrapindent});

    # Messages.
    $self->{fp_messages}->SetSelectedFont( Wx::Font->new($preferences{msgsfont}) );

    # Transcode.
    $self->{cb_xcode}->SetValue( $preferences{enable_xcode} );
    $self->OnCbTranscode(undef);

    # PDF Viewer.
    $self->{cb_pdfviewer}->SetValue($preferences{enable_pdfviewer});
    $self->{t_pdfviewer}->SetValue($preferences{pdfviewer})
      if $preferences{pdfviewer};
    $self->{t_pdfviewer}->Enable($self->{cb_pdfviewer}->IsChecked);

    # HTML Viewer.
    $self->{cb_htmlviewer}->SetValue($preferences{enable_htmlviewer});

    $self->enablecustom;
    $state{_prefs} = clone(\%preferences);

    # use DDP; p %preferences, as => "Fetched";
}

#               C      D      E  F      G      A        B C
my @xpmap = qw( 0 1  1 2 3  3 4  5 6  6 7 8  8 9 10 10 11 12 );
my @sfmap = qw( 0 7 -5 2 9 -3 4 -1 6 -6 1 8 -4 3 10 -2  5 0  );

method store_prefs() {

    # Transfer all preferences to the state.

    my $parent = $self->GetParent;

    # Skip default (system, user, song) configs.
    $preferences{skipstdcfg}  = !$self->{cb_usestdcfg}->IsChecked;

    # Preset instrument.
    my $n = $self->{ch_instrument}->GetSelection;

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    # New song template.
    $preferences{enable_tmplfile} = $self->{cb_tmplfile}->IsChecked;
    $preferences{tmplfile}        = $self->{fp_tmplfile}->GetPath;
    $preferences{enable_tmplfile} = 0 if $preferences{tmplfile} eq "";

    # Preferred filename extension.
    $preferences{chordproext} = $self->{t_prefext}->GetValue;

    # Editor.
    $preferences{editfont} = $self->{fp_editor}->GetSelectedFont->GetNativeFontInfoDesc;
    $self->colours2prefs;
    $preferences{editorwrap} = $self->{cb_editorwrap}->IsChecked;
    $preferences{editorwrapindent} = $self->{sp_editorwrap}->GetValue;

    # Messages.
    $preferences{msgsfont} = $self->{fp_messages}->GetSelectedFont->GetNativeFontInfoDesc;

    # Notation.
    $n = $self->{ch_notation}->GetSelection;
    if ( $n != wxNOT_FOUND ) {
	$preferences{preset_notations} =

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    # PDF Viewer.
    $preferences{enable_pdfviewer} = $self->{cb_pdfviewer}->IsChecked;
    $preferences{pdfviewer} = $self->{t_pdfviewer}->GetValue;

    # HTML Viewer.
    $preferences{enable_htmlviewer} = $self->{cb_htmlviewer}->IsChecked;

    # use DDP; p %preferences, as => "Stored";
}

method restore_prefs() {
    %preferences = %{ $state{_prefs} };
    # use DDP; p %preferences, as => "Restored";
}

method reload() {
    # Temporary store dialog values into preferences.
    local $preferences{skipstdcfg} = !$self->{cb_usestdcfg}->IsChecked;
    local $preferences{customlib} = $self->{dp_customlibrary}->GetPath;
    local $preferences{enable_customlib} = $self->{cb_customlib}->IsChecked;

    # Rebuild the lists of config styles.

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN


method get_selected_theme() {
    (qw(light dark auto))[$self->{ch_theme}->GetSelection];
}

method set_selected_theme($theme) {
    $self->{ch_theme}->SetSelection
      ( $theme eq "light" ? 0 : $theme eq "dark" ? 1 : 2 );
}

method colours2prefs {
    my $theme = $state{editortheme};
    $self->GetParent->init_theme;
    die("INTERNAL ERROR: invalid theme1\n")
      unless $theme eq "light" || $theme eq "dark";
    $preferences{editcolour}{$theme}{fg} = $self->{cp_fg}->GetAsHTML;
    $preferences{editcolour}{$theme}{bg} = $self->{cp_bg}->GetAsHTML;
    if ( $state{have_stc} ) {
	$preferences{editcolour}{$theme}{"s$_"} = $self->{"cp_s$_"}->GetAsHTML for 1..6;
	$preferences{editcolour}{$theme}{annfg} = $self->{cp_annfg}->GetAsHTML;
	$preferences{editcolour}{$theme}{annbg} = $self->{cp_annbg}->GetAsHTML;
    }
    $self->{t_editor}->refresh;
}

method prefs2colours() {

    $self->set_selected_theme( $preferences{editortheme} );
    if ( $preferences{editortheme} eq "auto" ) {
	$self->GetParent->init_theme;
	$self->{l_theme}->SetLabel( ucfirst $state{editortheme} );
    }
    else {
	$state{editortheme} = $preferences{editortheme};
	$self->{l_theme}->SetLabel("");
    }

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

	}
    }
    $self->{t_editor}->refresh;
}

################ Event handlers ################

#### General.

method OnAccept($event) {
    $self->store_prefs;
    $event->Skip;
}

method OnCancel($event) {
    $self->restore_prefs;
    $event->Skip;
}

# Only required for custom button.
# method OnIBDismiss($e) {
#     $self->{w_infobar}->Dismiss;
# }

#### Configs etc.

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    $self->reload;
}

method OnPresets($event) {
#    $self->{ch_presets}->Enable( $self->{cb_presets}->GetValue );
    $event->Skip;
}

method OnPrefExtChanged($event) {
    $preferences{chordproext} = $self->{t_prefext}->GetValue;
    $preferences{chordproext} =~ s;^\.*(\w+)?$;sprintf(".%s",$1//substr($state{_prefs}{chordproext},1));e
      && $self->{t_prefext}->ChangeValue($preferences{chordproext});
    ChordPro::Wx::Config::setup_filters();
    $event->Skip;
}

#### Notations and Transcode.

method OnChNotation($event) {
    my $n = $self->{ch_notation}->GetSelection;
    $event->Skip;

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

method OnColourAnnFGChanged( $event ) {
    $self->colourchanged("annfg");
}

method OnColourAnnBGChanged( $event ) {
    $self->colourchanged("annbg");
}

method OnThemeChanged( $event ) {
    $preferences{editortheme} = $self->get_selected_theme;
    $self->prefs2colours;
}

method OnEditorWrap( $event ) {
    $self->{$_}->Enable( $self->{cb_editorwrap}->IsChecked )
      for qw( l_editorwrap sp_editorwrap );
    $preferences{editorwrap} = $self->{cb_editorwrap}->IsChecked;
    $preferences{editorwrapindent} = $self->{sp_editorwrap}->GetValue;
    $self->{t_editor}->refresh;
}

lib/ChordPro/Wx/SettingsDialog.pm  view on Meta::CPAN

    $self->{l_stylemods_desc}->SetLabel($desc);
#    $self->{l_stylemods_desc}->Wrap(($self->{ch_stylemods}->GetSizeWH)[0]);
}

method set_instrument_desc( $desc ) {
    $self->{l_instrument_desc}->SetLabel($desc);
#    $self->{l_instrument_desc}->Wrap(($self->{ch_instrument}->GetSizeWH)[0]);
}

method colourchanged($index) {
    $self->colours2prefs;
}

method setnomod( $ctl, $code ) {
    Carp::confess("WHOAH!") unless $ctl;
    my $mod = $ctl->IsModified;
    $code->($self, $ctl);
    $ctl->SetModified($mod);
}

1;

lib/ChordPro/Wx/SettingsDialog.wxg  view on Meta::CPAN

<?xml version="1.0"?>
<!-- generated by wxGlade 1.1.1 on Thu Nov 20 08:12:14 2025 -->

<application encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="perl" mark_blocks="1" option="0" overwrite="1" path="SettingsDialog_wxg.pm" source_extension=".cpp" top_window="d_...
    <object class="ChordPro::Wx::SettingsDialog_wxg" name="d_prefs" base="EditDialog">
        <title>Settings</title>
        <style>wxDEFAULT_DIALOG_STYLE</style>
        <sizehints>1</sizehints>
        <object class="wxBoxSizer" name="sz_main" base="EditBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
                <option>1</option>
                <border>0</border>
                <flag>wxEXPAND</flag>
                <object class="wxBoxSizer" name="sz_prefs_outer" base="EditBoxSizer">
                    <orient>wxVERTICAL</orient>
                    <object class="sizeritem">
                        <option>1</option>
                        <border>5</border>
                        <flag>wxLEFT|wxRIGHT|wxEXPAND</flag>
                        <object class="wxNotebook" name="nb_preferences" base="EditNotebook">
                            <style>wxNB_TOP</style>
                            <tabs>
                                <tab window="nb_config">Presets</tab>
                                <tab window="nb_notations">Notations</tab>

lib/ChordPro/Wx/SettingsDialog.wxg  view on Meta::CPAN

                        <flag>wxTOP|wxEXPAND</flag>
                        <object class="spacer" name="spacer" base="EditSpacer">
                            <width>20</width>
                            <height>5</height>
                        </object>
                    </object>
                    <object class="sizeritem">
                        <option>0</option>
                        <border>5</border>
                        <flag>wxBOTTOM|wxALIGN_RIGHT</flag>
                        <object class="wxStdDialogButtonSizer" name="sz_prefs_buttons" base="EditStdDialogButtonSizer">
                            <orient>wxHORIZONTAL</orient>
                            <object class="sizeritem">
                                <option>0</option>
                                <border>0</border>
                                <flag>wxALIGN_CENTER_VERTICAL</flag>
                                <object class="wxButton" name="b_prefs_cancel" base="EditButton">
                                    <events>
                                        <handler event="EVT_BUTTON">OnCancel</handler>
                                    </events>
                                    <tooltip>Close the dialog, discarding changes</tooltip>
                                    <label>&amp;Cancel</label>
                                    <stockitem>CANCEL</stockitem>
                                </object>
                            </object>
                            <object class="sizeritem">
                                <option>0</option>
                                <border>0</border>
                                <flag>wxALIGN_CENTER_VERTICAL</flag>
                                <object class="wxButton" name="b_prefs_ok" base="EditButton">
                                    <events>
                                        <handler event="EVT_BUTTON">OnAccept</handler>
                                    </events>
                                    <tooltip>Apply the changes and close the dialog</tooltip>
                                    <label>&amp;OK</label>
                                    <default>1</default>
                                    <stockitem>OK</stockitem>
                                </object>
                            </object>
                        </object>

lib/ChordPro/Wx/SettingsDialog_wxg.pm  view on Meta::CPAN


    # begin wxGlade: ChordPro::Wx::SettingsDialog_wxg::new
    $style = wxDEFAULT_DIALOG_STYLE
        unless defined $style;

    $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name );
    $self->SetTitle(_T("Settings"));
    
    $self->{sz_main} = Wx::BoxSizer->new(wxVERTICAL);
    
    $self->{sz_prefs_outer} = Wx::BoxSizer->new(wxVERTICAL);
    $self->{sz_main}->Add($self->{sz_prefs_outer}, 1, wxEXPAND, 0);
    
    $self->{nb_preferences} = Wx::Notebook->new($self, wxID_ANY);
    $self->{sz_prefs_outer}->Add($self->{nb_preferences}, 1, wxEXPAND|wxLEFT|wxRIGHT, 5);
    
    $self->{nb_config} = Wx::Panel->new($self->{nb_preferences}, wxID_ANY);
    $self->{nb_preferences}->AddPage($self->{nb_config}, _T("Presets"));
    
    $self->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL);
    
    my $label_1 = Wx::StaticText->new($self->{nb_config}, wxID_ANY, _T("Instrument and Style Presets"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
    $label_1->SetMinSize(Wx::Size->new(-1, 35));
    $label_1->SetForegroundColour(Wx::Colour->new(0, 104, 217));
    $label_1->SetFont(Wx::Font->new(18, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, 0, ""));

lib/ChordPro/Wx/SettingsDialog_wxg.pm  view on Meta::CPAN

    $self->{sizer_7}->Add($self->{sizer_14}, 0, wxEXPAND|wxLEFT|wxRIGHT, 15);
    
    $self->{cb_htmlviewer} = Wx::CheckBox->new($self->{nb_html_preview}, wxID_ANY, _T("Preview with HTML"));
    $self->{cb_htmlviewer}->SetToolTip(_T("Use HTML viewer"));
    $self->{sizer_14}->Add($self->{cb_htmlviewer}, Wx::GBPosition->new(0, 0), Wx::GBSpan->new(1, 1), wxALIGN_CENTER_VERTICAL, 0);
    
    my $label_10 = Wx::StaticText->new($self->{nb_html_preview}, wxID_ANY, _T("This is experimental, under development, incomplete, buggy, and so on.\n\nIn other words, do not use it."), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
    $label_10->Wrap(750);
    $self->{sizer_7}->Add($label_10, 0, wxALL|wxEXPAND, 15);
    
    $self->{sz_prefs_outer}->Add(20, 5, 0, wxEXPAND|wxTOP, 0);
    
    $self->{sz_prefs_buttons} = Wx::StdDialogButtonSizer->new();
    $self->{sz_prefs_outer}->Add($self->{sz_prefs_buttons}, 0, wxALIGN_RIGHT|wxBOTTOM, 5);
    
    $self->{b_prefs_cancel} = Wx::Button->new($self, wxID_CANCEL, "");
    $self->{b_prefs_cancel}->SetToolTip(_T("Close the dialog, discarding changes"));
    $self->{sz_prefs_buttons}->AddButton($self->{b_prefs_cancel});
    
    $self->{b_prefs_ok} = Wx::Button->new($self, wxID_OK, "");
    $self->{b_prefs_ok}->SetToolTip(_T("Apply the changes and close the dialog"));
    $self->{b_prefs_ok}->SetDefault();
    $self->{sz_prefs_buttons}->AddButton($self->{b_prefs_ok});
    
    $self->{sz_prefs_buttons}->Realize();
    
    $self->{nb_html_preview}->SetSizer($self->{sizer_7});
    
    $self->{sizer_12}->AddGrowableCol(1);
    
    $self->{nb_pdf_preview}->SetSizer($self->{sizer_3});
    
    $self->{sizer_11}->AddGrowableCol(1);
    
    $self->{nb_messages}->SetSizer($self->{sizer_4});

lib/ChordPro/Wx/SettingsDialog_wxg.pm  view on Meta::CPAN

    Wx::Event::EVT_COLOURPICKER_CHANGED($self, $self->{cp_s4}->GetId, $self->can('OnColourS4Changed'));
    Wx::Event::EVT_COLOURPICKER_CHANGED($self, $self->{cp_s5}->GetId, $self->can('OnColourS5Changed'));
    Wx::Event::EVT_COLOURPICKER_CHANGED($self, $self->{cp_s6}->GetId, $self->can('OnColourS6Changed'));
    Wx::Event::EVT_COLOURPICKER_CHANGED($self, $self->{cp_annfg}->GetId, $self->can('OnColourAnnFGChanged'));
    Wx::Event::EVT_COLOURPICKER_CHANGED($self, $self->{cp_annbg}->GetId, $self->can('OnColourAnnBGChanged'));
    Wx::Event::EVT_TEXT($self, $self->{t_prefext}->GetId, $self->can('OnPrefExtChanged'));
    Wx::Event::EVT_CHECKBOX($self, $self->{cb_tmplfile}->GetId, $self->can('OnCbTmplFile'));
    Wx::Event::EVT_FONTPICKER_CHANGED($self, $self->{fp_messages}->GetId, $self->can('OnMessagesFontPickerChanged'));
    Wx::Event::EVT_CHECKBOX($self, $self->{cb_pdfviewer}->GetId, $self->can('OnPDFViewer'));
    Wx::Event::EVT_CHECKBOX($self, $self->{cb_htmlviewer}->GetId, $self->can('OnHTMLViewer'));
    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 OnChangeInstrument {
    my ($self, $event) = @_;
    # wxGlade: ChordPro::Wx::SettingsDialog_wxg::OnChangeInstrument <event_handler>



( run in 0.764 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )