~s-cecilio/lenmus/v5.3

« back to all changes in this revision

Viewing changes to src/app/toolbox/ToolClef.cpp

  • Committer: cecilios
  • Date: 2009-10-26 18:35:09 UTC
  • Revision ID: svn-v4:2587a929-2f0e-0410-ae78-fe6f687d5efe:trunk:541
Some changes to restructure and complete toolbox ('Data entry modes' changed to 'Mouse modes'. Tool page 'Clefs' changed to use mouse mode). Toolbox info displayed in status bar. Small clefs position fixed. Some ScoreCanvas methods changed to avoid code particularized for note/rest entry in mouse mode and use a more general solution.

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
#include "ToolsBox.h"
42
42
#include "ToolClef.h"
43
43
#include "ToolGroup.h"
 
44
#include "ToolBoxEvents.h"
44
45
#include "../ArtProvider.h"         //to use ArtProvider for managing icons
45
46
#include "../TheApp.h"              //to use GetMainFrame()
46
47
#include "../MainFrame.h"           //to get active lmScoreCanvas
55
56
#define lmSPACING 5
56
57
 
57
58
//event IDs
 
59
#define lm_NUM_CLEF_BUTTONS  8
 
60
 
58
61
enum {
59
 
    lmID_CLEF_LIST = 2600,
60
 
    lmID_CLEF_ADD,
 
62
        lmID_BT_ClefType = 2600,
 
63
    lmID_CLEF_LIST = lmID_BT_ClefType + lm_NUM_CLEF_BUTTONS,
61
64
 
62
65
    // Time signature group
63
 
    lmID_BT_TimeType = lmID_CLEF_ADD + 1,
 
66
    lmID_BT_TimeType = lmID_CLEF_LIST + 1,
64
67
 
65
68
    // Key signature group
66
69
    lmID_KEY_TYPE = lmID_BT_TimeType + lmGrpTimeType::lm_NUM_BUTTONS,
67
70
    lmID_KEY_LIST = lmID_KEY_TYPE + 2,
68
 
    lmID_KEY_ADD,
69
71
};
70
72
 
71
73
 
85
87
void lmToolPageClefs::Create(wxWindow* parent)
86
88
{
87
89
    //base class
88
 
    lmToolPage::Create(parent);
 
90
    lmToolPage::CreatePage(parent, lmPAGE_CLEFS);
89
91
 
90
92
    //initialize data
91
93
    m_sPageToolTip = _("Edit tools for clefs, keys and time signatures");
126
128
    m_pGrpKeyType = new lmGrpKeyType(this, pMainSizer);
127
129
    
128
130
        CreateLayout();
 
131
 
 
132
    //Select clef group
 
133
    m_pGrpClefType->SetSelected(true);
 
134
    m_pGrpTimeType->SetSelected(false);
 
135
    m_pGrpKeyType->SetSelected(false);
 
136
    this->Refresh();
 
137
    m_nCurGroupID = lmGRP_ClefType;
 
138
    m_nCurToolID = lmTOOL_NONE;
 
139
 
 
140
    m_fGroupsCreated = true;
 
141
}
 
142
 
 
143
bool lmToolPageClefs::DeselectRelatedGroups(lmEToolGroupID nGroupID)
 
144
{
 
145
    //When there are several groups in the same tool page (i.e, clefs, keys and
 
146
    //time signatures) the groups will behave as if they where a single 'logical
 
147
    //group', that is, selecting a tool in a group will deselect any tool on the
 
148
    //other related groups. To achieve this behaviour the group will call this
 
149
    //method to inform the owner page.
 
150
    //This method must deselect tools in any related groups to the one received
 
151
    //as parameter, and must return 'true' if that group is a tool group of
 
152
    //'false' if it is an options group.
 
153
 
 
154
    switch(nGroupID)
 
155
    {
 
156
        case lmGRP_ClefType:
 
157
            m_pGrpClefType->SetSelected(true);
 
158
            m_pGrpTimeType->SetSelected(false);
 
159
            m_pGrpKeyType->SetSelected(false);
 
160
            this->Refresh();
 
161
            return true;        //clef is a tool group
 
162
 
 
163
        case lmGRP_TimeType:
 
164
            m_pGrpClefType->SetSelected(false);
 
165
            m_pGrpTimeType->SetSelected(true);
 
166
            m_pGrpKeyType->SetSelected(false);
 
167
            this->Refresh();
 
168
            return true;        //time is a tool group
 
169
 
 
170
        case lmGRP_KeyType:
 
171
            m_pGrpClefType->SetSelected(false);
 
172
            m_pGrpTimeType->SetSelected(false);
 
173
            m_pGrpKeyType->SetSelected(true);
 
174
            this->Refresh();
 
175
            return true;        //key is a tool group
 
176
 
 
177
        default:
 
178
            wxASSERT(false);
 
179
    }
 
180
    return false;      //compiler happy
 
181
}
 
182
 
 
183
wxString lmToolPageClefs::GetToolShortDescription()
 
184
{
 
185
    //returns a short description of the selected tool. This description is used to
 
186
    //be displayed in the status bar
 
187
 
 
188
    wxString sDescr;
 
189
    switch( GetCurrentGroupID() )
 
190
    {
 
191
        case lmGRP_ClefType:
 
192
            sDescr = _("Add clef");
 
193
            break;
 
194
 
 
195
        case lmGRP_TimeType:
 
196
            sDescr = _("Add time signature");
 
197
            break;
 
198
 
 
199
        case lmGRP_KeyType:
 
200
            sDescr = _("Add key signature");
 
201
            break;
 
202
 
 
203
        default:
 
204
            sDescr = _T("");
 
205
    }
 
206
    return sDescr;
129
207
}
130
208
 
131
209
 
134
212
// lmGrpClefType implementation
135
213
//--------------------------------------------------------------------------------
136
214
 
137
 
BEGIN_EVENT_TABLE(lmGrpClefType, lmToolGroup)
138
 
    EVT_BUTTON      (lmID_CLEF_ADD, lmGrpClefType::OnAddClef)
139
 
END_EVENT_TABLE()
 
215
//aux. class to contain clefs data
 
216
class lmClefData
 
217
{
 
218
public:
 
219
    lmClefData() {}
 
220
    lmClefData(lmEClefType type, wxString name, wxString sBmp) 
 
221
        : sClefName(name), nClefType(type), sButtonBmp(sBmp) {}
 
222
 
 
223
    lmEClefType         nClefType;
 
224
    wxString            sClefName;
 
225
    wxString        sButtonBmp;
 
226
};
140
227
 
141
228
enum {
142
229
    lm_eNUM_CLEFS = 8,
145
232
static lmClefData m_tClefs[lm_eNUM_CLEFS];
146
233
static bool m_fStringsInitialized = false;
147
234
 
 
235
 
 
236
#if lmUSE_CLEF_COMBO
 
237
//--------------------------------------------------------------------------------
 
238
 
 
239
BEGIN_EVENT_TABLE(lmGrpClefType, lmToolGroup)
 
240
    EVT_COMBOBOX    (lmID_CLEF_LIST, lmGrpClefType::OnClefList)
 
241
END_EVENT_TABLE()
 
242
 
148
243
lmGrpClefType::lmGrpClefType(lmToolPage* pParent, wxBoxSizer* pMainSizer)
149
244
        : lmToolGroup(pParent, pParent->GetColors())
150
245
{
153
248
    if (!m_fStringsInitialized)
154
249
    {
155
250
        //AWARE: When addign more clefs, update lm_eNUM_CLEFS;
156
 
        m_tClefs[0] = lmClefData( _("G clef on 2nd line"), lmE_Sol );
157
 
        m_tClefs[1] = lmClefData( _("F clef on 4th line"), lmE_Fa4 );
158
 
        m_tClefs[2] = lmClefData( _("F clef on 3rd line"), lmE_Fa3 );
159
 
        m_tClefs[3] = lmClefData( _("C clef on 1st line"), lmE_Do1 );
160
 
        m_tClefs[4] = lmClefData( _("C clef on 2nd line"), lmE_Do2 );
161
 
        m_tClefs[5] = lmClefData( _("C clef on 3rd line"), lmE_Do3 );
162
 
        m_tClefs[6] = lmClefData( _("C clef on 4th line"), lmE_Do4 );
163
 
        m_tClefs[7] = lmClefData( _("Percussion clef"), lmE_Percussion );
164
 
        //
 
251
        m_tClefs[0] = lmClefData(lmE_Sol, _("G clef on 2nd line"), _T("clef_g") );
 
252
        m_tClefs[1] = lmClefData(lmE_Fa4, _("F clef on 4th line"), _T("clef_g") );
 
253
        m_tClefs[2] = lmClefData(lmE_Fa3, _("F clef on 3rd line"), _T("clef_g") );
 
254
        m_tClefs[3] = lmClefData(lmE_Do1, _("C clef on 1st line"), _T("clef_g") );
 
255
        m_tClefs[4] = lmClefData(lmE_Do2, _("C clef on 2nd line"), _T("clef_g") );
 
256
        m_tClefs[5] = lmClefData(lmE_Do3, _("C clef on 3rd line"), _T("clef_g") );
 
257
        m_tClefs[6] = lmClefData(lmE_Do4, _("C clef on 4th line"), _T("clef_g") );
 
258
        m_tClefs[7] = lmClefData(lmE_Percussion, _("Percussion clef"), _T("clef_g") );
 
259
        //// other clefs not yet available
 
260
        //lmE_Do5,
 
261
        //lmE_Fa5,
 
262
        //lmE_Sol1,
 
263
        //lmE_8Sol,       //8 above
 
264
        //lmE_Sol8,       //8 below
 
265
        //lmE_8Fa,        //8 above
 
266
        //lmE_Fa8,        //8 below
 
267
        //lmE_15Sol,      //15 above
 
268
        //lmE_Sol15,      //15 below
 
269
        //lmE_15Fa,       //15 above
 
270
        //lmE_Fa15,       //15 below
165
271
        m_fStringsInitialized = true;
166
272
    }
167
273
 
171
277
void lmGrpClefType::CreateControls(wxBoxSizer* pMainSizer)
172
278
{
173
279
    //create the common controls for a group
174
 
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Add clef"));
 
280
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Clef"));
175
281
 
176
282
    //bitmap combo box to select the clef
177
283
    m_pClefList = new wxBitmapComboBox();
180
286
 
181
287
        pCtrolsSizer->Add( m_pClefList, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
182
288
 
183
 
    //button to add the clef
184
 
    m_pBtnAddClef = new wxButton(this, lmID_CLEF_ADD, _("Add clef"), wxDefaultPosition, wxDefaultSize, 0 );
185
 
        pCtrolsSizer->Add( m_pBtnAddClef, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
186
 
 
187
289
    LoadClefList();
188
290
        this->Layout();
189
291
}
190
292
 
191
 
void lmGrpClefType::OnAddClef(wxCommandEvent& event)
 
293
void lmGrpClefType::OnClefList(wxCommandEvent& event)
192
294
{
193
 
    //insert selected key
194
 
        WXUNUSED(event);
195
 
        int iC = m_pClefList->GetSelection();
196
 
    lmController* pSC = GetMainFrame()->GetActiveController();
197
 
    if (pSC)
198
 
    {
199
 
        pSC->InsertClef(m_tClefs[iC].nClefType);
 
295
    //Notify owner page about the tool change
 
296
    WXUNUSED(event);
200
297
 
201
 
        //return focus to active view
202
 
        GetMainFrame()->SetFocusOnActiveView();
203
 
    }
 
298
    ((lmToolPage*)m_pParent)->OnToolChanged(this->GetToolGroupID(),
 
299
                                            (lmEToolID)m_pClefList->GetSelection() );
204
300
}
205
301
 
206
302
void lmGrpClefType::LoadClefList()
215
311
    m_pClefList->SetSelection(0);
216
312
}
217
313
 
 
314
lmEClefType lmGrpClefType::GetSelectedClef()
 
315
{
 
316
    return (lmEClefType)m_pClefList->GetSelection();
 
317
}
 
318
 
 
319
 
 
320
 
 
321
#else   //USE BUTTONS FOR CLEFS
 
322
//--------------------------------------------------------------------------------
 
323
 
 
324
lmGrpClefType::lmGrpClefType(lmToolPage* pParent, wxBoxSizer* pMainSizer)
 
325
        : lmToolButtonsGroup(pParent, lm_NUM_CLEF_BUTTONS, lmTBG_ONE_SELECTED, pMainSizer,
 
326
                             lmID_BT_ClefType, lmTOOL_NONE, pParent->GetColors())
 
327
{
 
328
    //load language dependent strings. Can not be statically initiallized because
 
329
    //then they do not get translated
 
330
    if (!m_fStringsInitialized)
 
331
    {
 
332
        //AWARE: When addign more clefs, update lm_eNUM_CLEFS;
 
333
        m_tClefs[0] = lmClefData(lmE_Sol, _("G clef on 2nd line"), _T("clef_g") );
 
334
        m_tClefs[1] = lmClefData(lmE_Fa4, _("F clef on 4th line"), _T("clef_g") );
 
335
        m_tClefs[2] = lmClefData(lmE_Fa3, _("F clef on 3rd line"), _T("clef_g") );
 
336
        m_tClefs[3] = lmClefData(lmE_Do1, _("C clef on 1st line"), _T("clef_g") );
 
337
        m_tClefs[4] = lmClefData(lmE_Do2, _("C clef on 2nd line"), _T("clef_g") );
 
338
        m_tClefs[5] = lmClefData(lmE_Do3, _("C clef on 3rd line"), _T("clef_g") );
 
339
        m_tClefs[6] = lmClefData(lmE_Do4, _("C clef on 4th line"), _T("clef_g") );
 
340
        m_tClefs[7] = lmClefData(lmE_Percussion, _("Percussion clef"), _T("clef_g") );
 
341
        //// other clefs not yet available
 
342
        //lmE_Do5,
 
343
        //lmE_Fa5,
 
344
        //lmE_Sol1,
 
345
        //lmE_8Sol,       //8 above
 
346
        //lmE_Sol8,       //8 below
 
347
        //lmE_8Fa,        //8 above
 
348
        //lmE_Fa8,        //8 below
 
349
        //lmE_15Sol,      //15 above
 
350
        //lmE_Sol15,      //15 below
 
351
        //lmE_15Fa,       //15 above
 
352
        //lmE_Fa15,       //15 below
 
353
        m_fStringsInitialized = true;
 
354
    }
 
355
 
 
356
    CreateControls(pMainSizer);
 
357
}
 
358
 
 
359
void lmGrpClefType::CreateControls(wxBoxSizer* pMainSizer)
 
360
{
 
361
    //create the common controls for a group
 
362
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Clef"));
 
363
 
 
364
    wxBoxSizer* pButtonsSizer;
 
365
    wxSize btSize(32, 48);
 
366
        for (int iB=0; iB < lm_NUM_CLEF_BUTTONS; iB++)
 
367
        {
 
368
                if (iB % 4 == 0) {
 
369
                        pButtonsSizer = new wxBoxSizer(wxHORIZONTAL);
 
370
                        pCtrolsSizer->Add(pButtonsSizer);
 
371
                }
 
372
 
 
373
                m_pButton[iB] = new lmCheckButton(this, lmID_BT_ClefType+iB, wxBitmap(32, 48));
 
374
        m_pButton[iB]->SetBitmapUp(m_tClefs[iB].sButtonBmp, _T(""), btSize);
 
375
        m_pButton[iB]->SetBitmapDown(m_tClefs[iB].sButtonBmp, _T("button_selected_flat"), btSize);
 
376
        m_pButton[iB]->SetBitmapOver(m_tClefs[iB].sButtonBmp, _T("button_over_flat"), btSize);
 
377
        m_pButton[iB]->SetToolTip(m_tClefs[iB].sClefName);
 
378
                pButtonsSizer->Add(m_pButton[iB], wxSizerFlags(0).Border(wxALL, 2) );
 
379
        }
 
380
        this->Layout();
 
381
 
 
382
        SelectButton(0);        //select G clef
 
383
}
 
384
 
 
385
lmEClefType lmGrpClefType::GetSelectedClef()
 
386
{
 
387
    return (lmEClefType)m_nSelButton;
 
388
}
 
389
 
 
390
#endif  //lmUSE_CLEF_COMBO
218
391
 
219
392
 
220
393
 
243
416
 
244
417
lmGrpTimeType::lmGrpTimeType(lmToolPage* pParent, wxBoxSizer* pMainSizer)
245
418
        : lmToolGroup(pParent, pParent->GetColors())
 
419
        , m_nSelButton(-1)  //none selected
246
420
{
247
421
    wxASSERT(sizeof(m_tButtons) / sizeof(lmButton) == lm_NUM_BUTTONS);
248
422
    CreateControls(pMainSizer);
251
425
void lmGrpTimeType::CreateControls(wxBoxSizer* pMainSizer)
252
426
{
253
427
    //create the common controls for a group
254
 
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Add a time signature"));
 
428
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Time signature"));
255
429
 
256
430
    //create the specific controls for this group
257
431
    wxBoxSizer* pButtonsSizer;
272
446
 
273
447
void lmGrpTimeType::OnButton(wxCommandEvent& event)
274
448
{
275
 
        int iB = event.GetId() - lmID_BT_TimeType;
276
 
    lmController* pSC = GetMainFrame()->GetActiveController();
277
 
    if (pSC)
278
 
        pSC->InsertTimeSignature(m_tButtons[iB].nBeats, m_tButtons[iB].nBeatType);
279
 
}
280
 
 
281
 
 
 
449
    //Notify owner page about the tool change
 
450
 
 
451
        m_nSelButton = event.GetId() - lmID_BT_TimeType;
 
452
    ((lmToolPage*)m_pParent)->OnToolChanged(this->GetToolGroupID(), (lmEToolID)m_nSelButton );
 
453
}
 
454
 
 
455
int lmGrpTimeType::GetTimeBeats()
 
456
{
 
457
    //Returns 0 if no button selected
 
458
 
 
459
    if (m_nSelButton != -1)
 
460
        return m_tButtons[m_nSelButton].nBeats;
 
461
    else
 
462
        return 0;
 
463
}
 
464
 
 
465
int lmGrpTimeType::GetTimeBeatType()
 
466
{
 
467
    //Returns 0 if no button selected
 
468
 
 
469
    if (m_nSelButton != -1)
 
470
        return m_tButtons[m_nSelButton].nBeatType;
 
471
    else
 
472
        return 0;
 
473
}
282
474
 
283
475
 
284
476
 
290
482
    EVT_RADIOBUTTON (lmID_KEY_TYPE, lmGrpKeyType::OnKeyType)
291
483
    EVT_RADIOBUTTON (lmID_KEY_TYPE+1, lmGrpKeyType::OnKeyType)
292
484
    EVT_COMBOBOX    (lmID_KEY_LIST, lmGrpKeyType::OnKeyList)
293
 
    EVT_BUTTON      (lmID_KEY_ADD, lmGrpKeyType::OnAddKey)
294
485
END_EVENT_TABLE()
295
486
 
296
487
#define lmMAX_MINOR_KEYS    lmMAX_MINOR_KEY - lmMIN_MINOR_KEY + 1
325
516
void lmGrpKeyType::CreateControls(wxBoxSizer* pMainSizer)
326
517
{
327
518
    //create the common controls for a group
328
 
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Add a key signature"));
 
519
    wxBoxSizer* pCtrolsSizer = CreateGroup(pMainSizer, _("Key signature"));
329
520
 
330
521
    //create the specific controls for this group
331
522
 
344
535
 
345
536
        pCtrolsSizer->Add( m_pKeyList, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
346
537
 
347
 
    //button to add the key
348
 
    m_pBtnAddKey = new wxButton(this, lmID_KEY_ADD, _("Add key"), wxDefaultPosition, wxDefaultSize, 0 );
349
 
        pCtrolsSizer->Add( m_pBtnAddKey, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
350
 
        
351
538
    //load initial data
352
539
    m_pKeyRad[0]->SetValue(true);
353
540
    m_pKeyRad[1]->SetValue(false);
368
555
 
369
556
void lmGrpKeyType::OnKeyList(wxCommandEvent& event)
370
557
{
 
558
    //An item has been selected in keys combo. Notify owner page about the tool change
 
559
 
371
560
    WXUNUSED(event);
372
 
}
373
 
 
374
 
void lmGrpKeyType::OnAddKey(wxCommandEvent& event)
375
 
{
376
 
    //insert selected key
377
 
        WXUNUSED(event);
378
 
        int iK = m_pKeyList->GetSelection();
379
 
    bool fMajor = m_pKeyRad[0]->GetValue();
380
 
    int nFifths = 0;
381
 
    if (fMajor)
382
 
        nFifths = m_tMajorKeys[iK].nFifths;
 
561
    NotifyToolChange();
 
562
}
 
563
 
 
564
void lmGrpKeyType::NotifyToolChange()
 
565
{
 
566
    //Notify owner page about the tool change
 
567
 
 
568
    ((lmToolPage*)m_pParent)->OnToolChanged(this->GetToolGroupID(),
 
569
                                            (lmEToolID)m_pKeyList->GetSelection() );
 
570
}
 
571
 
 
572
bool lmGrpKeyType::IsMajorKeySignature()
 
573
{
 
574
    return m_pKeyRad[0]->GetValue();
 
575
}
 
576
 
 
577
int lmGrpKeyType::GetFifths()
 
578
{
 
579
    int iK = m_pKeyList->GetSelection();
 
580
    if (m_pKeyRad[0]->GetValue())       //if is major key signature
 
581
        return m_tMajorKeys[iK].nFifths;
383
582
    else
384
 
        nFifths = m_tMinorKeys[iK].nFifths;
385
 
 
386
 
    lmController* pSC = GetMainFrame()->GetActiveController();
387
 
    if (pSC)
388
 
    {
389
 
        pSC->InsertKeySignature(nFifths, fMajor);
390
 
 
391
 
        //return focus to active view
392
 
        GetMainFrame()->SetFocusOnActiveView();
393
 
    }
 
583
        return m_tMinorKeys[iK].nFifths;
394
584
}
395
585
 
396
586
void lmGrpKeyType::LoadKeyList(int nType)
418
608
        }
419
609
    }
420
610
    m_pKeyList->SetSelection(0);
 
611
    NotifyToolChange();
421
612
}
422
613