1 /***************************************************************
2  * Name:      wxGuitarMain.cpp
3  * Purpose:   Code for Application Frame
4  * Author:    Ivnish (INDT) (indt@mail.ru)
5  * Created:   2009-07-21
6  * Copyright: (c) 2009 Ivnish (INDT)
7  * License:   GPLv3
8  **************************************************************/
9 
10 #include "wxGuitarMain.h"
11 #include <wx/msgdlg.h>
12 #include <wx/aboutdlg.h>
13 
14 //(*InternalHeaders(wxGuitarFrame)
15 #include <wx/bitmap.h>
16 #include <wx/intl.h>
17 #include <wx/image.h>
18 #include <wx/string.h>
19 //*)
20 
21 wxString    szWavName;      // Имя звукового файла, передается функции PlayWav
22 
23 // Путь к ресурсам (на этапе разработки использую cвой путь,
24 // чтобы не копировать ресурсы в /usr/share)
25 //#define PATHTORES "/home/ivnish/Develop/Release/wxGuitar/data"
26 #define PATHTORES "/usr/local/share/wxguitar"
27 
28 //(*IdInit(wxGuitarFrame)
29 const long wxGuitarFrame::ID_BUTTON1 = wxNewId();
30 const long wxGuitarFrame::ID_BUTTON2 = wxNewId();
31 const long wxGuitarFrame::ID_BUTTON3 = wxNewId();
32 const long wxGuitarFrame::ID_BUTTON4 = wxNewId();
33 const long wxGuitarFrame::ID_BUTTON5 = wxNewId();
34 const long wxGuitarFrame::ID_BUTTON6 = wxNewId();
35 const long wxGuitarFrame::ID_STATICBITMAP1 = wxNewId();
36 const long wxGuitarFrame::ID_CHECKBOX1 = wxNewId();
37 const long wxGuitarFrame::ID_SPINCTRL1 = wxNewId();
38 const long wxGuitarFrame::ID_STATICTEXT1 = wxNewId();
39 const long wxGuitarFrame::idMenuQuit = wxNewId();
40 const long wxGuitarFrame::idMenuAbout = wxNewId();
41 const long wxGuitarFrame::ID_TIMER1 = wxNewId();
42 //*)
43 
BEGIN_EVENT_TABLE(wxGuitarFrame,wxFrame)44 BEGIN_EVENT_TABLE(wxGuitarFrame,wxFrame)
45     //(*EventTable(wxGuitarFrame)
46     //*)
47 END_EVENT_TABLE()
48 
49 wxGuitarFrame::wxGuitarFrame(wxWindow* parent,wxWindowID id)
50 {
51     // Создаем локаль
52     wxLocale *m_Locale = new wxLocale();
53     // Инициализируем ее дефо параметрами
54     m_Locale->Init();
55     // И добавляем домен
56     m_Locale->AddCatalog(_("wxguitar"));
57 
58     //(*Initialize(wxGuitarFrame)
59     wxMenuItem* MenuItem2;
60     wxMenuItem* MenuItem1;
61     wxFlexGridSizer* FlexGridSizer2;
62     wxBoxSizer* BoxSizer2;
63     wxMenu* Menu1;
64     wxBoxSizer* BoxSizer1;
65     wxMenuBar* MenuBar1;
66     wxFlexGridSizer* FlexGridSizer1;
67     wxMenu* Menu2;
68 
69     Create(parent, id, _("wxGuitar 1.01"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX, _T("id"));
70     {
71     	wxIcon FrameIcon;
72     	FrameIcon.CopyFromBitmap(wxBitmap(wxImage(_T(PATHTORES"/pixmaps/gitara_icon_64.ico"))));
73     	SetIcon(FrameIcon);
74     }
75     BoxSizer1 = new wxBoxSizer(wxVERTICAL);
76     BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
77     FlexGridSizer2 = new wxFlexGridSizer(6, 0, 8, 0);
78     Button1 = new wxButton(this, ID_BUTTON1, _("E"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
79     FlexGridSizer2->Add(Button1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
80     Button2 = new wxButton(this, ID_BUTTON2, _("H"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
81     FlexGridSizer2->Add(Button2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
82     Button3 = new wxButton(this, ID_BUTTON3, _("G"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3"));
83     FlexGridSizer2->Add(Button3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
84     Button4 = new wxButton(this, ID_BUTTON4, _("D"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4"));
85     FlexGridSizer2->Add(Button4, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
86     Button5 = new wxButton(this, ID_BUTTON5, _("A"), wxPoint(0,0), wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5"));
87     FlexGridSizer2->Add(Button5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
88     Button6 = new wxButton(this, ID_BUTTON6, _("E"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6"));
89     FlexGridSizer2->Add(Button6, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
90     BoxSizer2->Add(FlexGridSizer2, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 12);
91     StaticBitmap1 = new wxStaticBitmap(this, ID_STATICBITMAP1, wxNullBitmap, wxDefaultPosition, wxSize(190,327), 0, _T("ID_STATICBITMAP1"));
92     BoxSizer2->Add(StaticBitmap1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
93     BoxSizer1->Add(BoxSizer2, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 3);
94     FlexGridSizer1 = new wxFlexGridSizer(0, 3, 0, 0);
95     CheckBox1 = new wxCheckBox(this, ID_CHECKBOX1, _("repeat every"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX1"));
96     CheckBox1->SetValue(false);
97     FlexGridSizer1->Add(CheckBox1, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
98     SpinCtrl1 = new wxSpinCtrl(this, ID_SPINCTRL1, _T("3"), wxDefaultPosition, wxSize(58,27), 0, 3, 10, 3, _T("ID_SPINCTRL1"));
99     SpinCtrl1->SetValue(_T("3"));
100     FlexGridSizer1->Add(SpinCtrl1, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
101     StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("seconds"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
102     FlexGridSizer1->Add(StaticText1, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
103     BoxSizer1->Add(FlexGridSizer1, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
104     SetSizer(BoxSizer1);
105     MenuBar1 = new wxMenuBar();
106     Menu1 = new wxMenu();
107     MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), wxEmptyString, wxITEM_NORMAL);
108     Menu1->Append(MenuItem1);
109     MenuBar1->Append(Menu1, _("&File"));
110     Menu2 = new wxMenu();
111     MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), wxEmptyString, wxITEM_NORMAL);
112     Menu2->Append(MenuItem2);
113     MenuBar1->Append(Menu2, _("Help"));
114     SetMenuBar(MenuBar1);
115     Timer1.SetOwner(this, ID_TIMER1);
116     BoxSizer1->Fit(this);
117     BoxSizer1->SetSizeHints(this);
118     Center();
119 
120     Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton1Click);
121     Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton2Click);
122     Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton3Click);
123     Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton4Click);
124     Connect(ID_BUTTON5,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton5Click);
125     Connect(ID_BUTTON6,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxGuitarFrame::OnButton6Click);
126     Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxGuitarFrame::OnQuit);
127     Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxGuitarFrame::OnAbout);
128     Connect(ID_TIMER1,wxEVT_TIMER,(wxObjectEventFunction)&wxGuitarFrame::OnTimer1Trigger);
129     //*)
130 
131     // Загружаем изображение гитары
132     StaticBitmap1->SetBitmap(wxBitmap(_T(PATHTORES"/pixmaps/gitara.png"),wxBITMAP_TYPE_PNG));
133 }
134 ////////////////////////////////////////////////////////////////////////////////////////////////////////
135 
~wxGuitarFrame()136 wxGuitarFrame::~wxGuitarFrame()
137 {
138     //(*Destroy(wxGuitarFrame)
139     //*)
140 }
141 ////////////////////////////////////////////////////////////////////////////////////////////////////////
142 
143 // Обработчик пункта меню "Выход"
OnQuit(wxCommandEvent & event)144 void wxGuitarFrame::OnQuit(wxCommandEvent& event)
145 {
146     Close();
147 }
148 ////////////////////////////////////////////////////////////////////////////////////////////////////////
149 
150 // Обработчик пункта меню "О программе"
OnAbout(wxCommandEvent & event)151 void wxGuitarFrame::OnAbout(wxCommandEvent& event)
152 {
153     wxAboutDialogInfo info;
154     info.SetName(_T("wxGuitar"));
155     info.SetVersion(_T("1.01"));
156     info.SetDescription(_("Simple program to help to tune your guitar."));
157     info.SetCopyright(_T("Copyright (c) 2009 Andrey \"Ivnish\" Ivnitsky"));
158     info.AddDeveloper(_T("Andrey \"Ivnish\" Ivnitsky <indt@mail.ru>"));
159     info.AddTranslator(_T("Andrey \"Ivnish\" Ivnitsky <indt@mail.ru>"));
160     wxAboutBox(info);
161 }
162 ////////////////////////////////////////////////////////////////////////////////////////////////////////
163 
164 // Функция воспроизводит переданный ей файл
PlayWav(wxString szWavName)165 void PlayWav(wxString szWavName)
166 {
167     wxString szBuf = _T("wavplay -q ")+szWavName;
168     char szAnsi[255];
169     wxMBConvUTF8 conv;
170     conv.WC2MB(szAnsi,szBuf.wc_str(),255);
171     system(szAnsi);
172 }
173 /////////////////////////////////////////////////////////////////////////////////////////
174 
175 // Функция проверяет поставлен ли чекбокс и если да,
176 // то запускает таймер (останавливать таймер перед этим необязательно,
177 // в документации говорят, что это делается автоматом)
178 // Если же таймер уже запущен, чекбокс снят, то таймер останавливается
PlayAndCheckTimer()179 void wxGuitarFrame::PlayAndCheckTimer()
180 {
181     PlayWav(szWavName);
182 
183     if (CheckBox1->IsChecked())
184         Timer1.Start(SpinCtrl1->GetValue()*1000);
185     else
186     if (Timer1.IsRunning())
187         Timer1.Stop();
188 }
189 ////////////////////////////////////////////////////////////////////////////////////////////////////////
190 
191 // Обработчик таймера
OnTimer1Trigger(wxTimerEvent & event)192 void wxGuitarFrame::OnTimer1Trigger(wxTimerEvent& event)
193 {
194     PlayWav(szWavName); // Повторяем звук струны
195 }
196 ////////////////////////////////////////////////////////////////////////////////////////////////////////
197 
198 // Обработчик кнопки первой струны
OnButton1Click(wxCommandEvent & event)199 void wxGuitarFrame::OnButton1Click(wxCommandEvent& event)
200 {
201     szWavName = _T(PATHTORES"/sounds/E1.wav");
202     PlayAndCheckTimer();
203 }
204 ////////////////////////////////////////////////////////////////////////////////////////////////////////
205 
206 // Обработчик кнопки второй струны
OnButton2Click(wxCommandEvent & event)207 void wxGuitarFrame::OnButton2Click(wxCommandEvent& event)
208 {
209     szWavName = _T(PATHTORES"/sounds/H1.wav");
210     PlayAndCheckTimer();
211 }
212 ////////////////////////////////////////////////////////////////////////////////////////////////////////
213 
214 // Обработчик кнопки третьей струны
OnButton3Click(wxCommandEvent & event)215 void wxGuitarFrame::OnButton3Click(wxCommandEvent& event)
216 {
217     szWavName = _T(PATHTORES"/sounds/G1.wav");
218     PlayAndCheckTimer();
219 }
220 ////////////////////////////////////////////////////////////////////////////////////////////////////////
221 
222 // Обработчик кнопки четвертой струны
OnButton4Click(wxCommandEvent & event)223 void wxGuitarFrame::OnButton4Click(wxCommandEvent& event)
224 {
225     szWavName = _T(PATHTORES"/sounds/D1.wav");
226     PlayAndCheckTimer();
227 }
228 ////////////////////////////////////////////////////////////////////////////////////////////////////////
229 
230 // Обработчик кнопки пятой струны
OnButton5Click(wxCommandEvent & event)231 void wxGuitarFrame::OnButton5Click(wxCommandEvent& event)
232 {
233     szWavName = _T(PATHTORES"/sounds/A1.wav");
234     PlayAndCheckTimer();
235 }
236 ////////////////////////////////////////////////////////////////////////////////////////////////////////
237 
238 // Обработчик кнопки шестой струны
OnButton6Click(wxCommandEvent & event)239 void wxGuitarFrame::OnButton6Click(wxCommandEvent& event)
240 {
241     szWavName = _T(PATHTORES"/sounds/E2.wav");
242     PlayAndCheckTimer();
243 }
244 ////////////////////////////////////////////////////////////////////////////////////////////////////////
245