root/branches/new_fx_rack_and_sample_fun/gui/src/PatternEditor/PatternEditorPanel.cpp @ 781

Revision 781, 28.4 KB (checked in by wolke, 4 years ago)

apply rec. button patch from pablomme and merge 772:780 from trunk

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include <hydrogen/Preferences.h>
24#include <hydrogen/hydrogen.h>
25#include <hydrogen/instrument.h>
26#include <hydrogen/Pattern.h>
27#include <hydrogen/audio_engine.h>
28#include <hydrogen/event_queue.h>
29using namespace H2Core;
30
31
32#include "HydrogenApp.h"
33#include "PatternEditorPanel.h"
34#include "PatternEditorInstrumentList.h"
35#include "PatternEditorRuler.h"
36#include "NotePropertiesRuler.h"
37#include "DrumPatternEditor.h"
38#include "PianoRollEditor.h"
39
40#include "../MainForm.h"
41#include "../widgets/Button.h"
42#include "../widgets/Fader.h"
43#include "../widgets/PixmapWidget.h"
44#include "../widgets/LCDCombo.h"
45
46#include "../Skin.h"
47#include "../SongEditor/SongEditorPanel.h"
48
49#include <cmath>
50
51#include <QtGui>
52
53
54void PatternEditorPanel::updateSLnameLabel( )
55{
56        QFont font;
57        font.setBold( true );
58        pSLlabel->setFont( font );
59        pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit  );
60}
61
62
63
64PatternEditorPanel::PatternEditorPanel( QWidget *pParent )
65 : QWidget( pParent )
66 , Object( "PatternEditorPanel" )
67 , m_pPattern( NULL )
68 , m_bEnablePatternResize( true )
69{
70        setAcceptDrops(true);
71
72        Preferences *pPref = Preferences::getInstance();
73       
74
75// Editor TOP
76        PixmapWidget *editor_top = new PixmapWidget(0);
77        editor_top->setPixmap("/patternEditor/editor_top.png", true);
78        editor_top->setFixedHeight(24);
79
80        PixmapWidget *editor_top_2 = new PixmapWidget(0);
81        editor_top_2->setPixmap("/patternEditor/editor_top.png", true);
82        editor_top_2->setFixedHeight(24);
83
84        QHBoxLayout *editor_top_hbox = new QHBoxLayout(editor_top);
85        editor_top_hbox->setSpacing(0);
86        editor_top_hbox->setMargin(0);
87        editor_top_hbox->setAlignment(Qt::AlignLeft);
88
89        QHBoxLayout *editor_top_hbox_2 = new QHBoxLayout(editor_top_2);
90        editor_top_hbox_2->setSpacing(0);
91        editor_top_hbox_2->setMargin(0);
92        editor_top_hbox_2->setAlignment(Qt::AlignLeft);
93
94
95        //soundlibrary name
96        pSLlabel = new QLabel( NULL );
97        pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit );
98        pSLlabel->setFixedSize( 170, 20 );
99        pSLlabel->move( 10, 3 );
100        pSLlabel->setToolTip( trUtf8("Loaded Soundlibrary") );
101        editor_top_hbox->addWidget( pSLlabel );
102
103//wolke some background images back_size_res
104        PixmapWidget *pSizeResol = new PixmapWidget( NULL );
105        pSizeResol->setFixedSize( 200, 20 );
106        pSizeResol->setPixmap( "/patternEditor/background_res-new.png" );
107        pSizeResol->move( 0, 3 );
108        editor_top_hbox_2->addWidget( pSizeResol );
109
110        // PATTERN size
111        __pattern_size_combo = new LCDCombo(pSizeResol, 4);
112        __pattern_size_combo->move( 34, 2 );
113        __pattern_size_combo->setToolTip( trUtf8("Select pattern size") );
114        for ( int i = 1; i <= 32; i++) {
115                __pattern_size_combo->addItem( QString( "%1" ).arg( i ) );
116        }
117        __pattern_size_combo->update();
118        connect(__pattern_size_combo, SIGNAL( valueChanged( QString ) ), this, SLOT( patternSizeChanged(QString) ) );
119        //editor_top_hbox->addWidget(__pattern_size_combo);
120
121
122        // GRID resolution
123        __resolution_combo = new LCDCombo( pSizeResol , 7);
124        __resolution_combo->setToolTip(trUtf8("Select grid resolution"));
125        __resolution_combo->addItem( "4" );
126        __resolution_combo->addItem( "8" );
127        __resolution_combo->addItem( "16" );
128        __resolution_combo->addItem( "32" );
129        __resolution_combo->addItem( "64" );
130        __resolution_combo->addSeparator();
131        __resolution_combo->addItem( "4T" );
132        __resolution_combo->addItem( "8T" );
133        __resolution_combo->addItem( "16T" );
134        __resolution_combo->addItem( "32T" );
135        __resolution_combo->addSeparator();
136        __resolution_combo->addItem( "off" );
137        __resolution_combo->update();
138        __resolution_combo->move( 121, 2 );
139        connect(__resolution_combo, SIGNAL(valueChanged(QString)), this, SLOT(gridResolutionChanged(QString)));
140        //editor_top_hbox->addWidget(__resolution_combo);
141
142
143        PixmapWidget *pRec = new PixmapWidget( NULL );
144        pRec->setFixedSize( 110, 20 );
145        pRec->setPixmap( "/patternEditor/background_rec-new.png" );
146        pRec->move( 0, 3 );
147        editor_top_hbox_2->addWidget( pRec );
148
149
150        // Hear notes btn
151        ToggleButton *hearNotesBtn = new ToggleButton(
152                        pRec,
153                        "/patternEditor/btn_hear_on.png",
154                        "/patternEditor/btn_hear_off.png",
155                        "/patternEditor/btn_hear_off.png",
156                        QSize(15, 13)
157        );
158        hearNotesBtn->move( 34, 3 );
159        hearNotesBtn->setToolTip( trUtf8( "Hear new notes" ) );
160        connect( hearNotesBtn, SIGNAL(clicked(Button*)), this, SLOT( hearNotesBtnClick(Button*)));
161        hearNotesBtn->setPressed( pPref->getHearNewNotes() );
162
163
164        // quantize
165        ToggleButton* quantizeEventsBtn = new ToggleButton(
166                        pRec,
167                        "/patternEditor/btn_quant_on.png",
168                        "/patternEditor/btn_quant_off.png",
169                        "/patternEditor/btn_quant_off.png",
170                        QSize(15, 13)
171        );
172        quantizeEventsBtn->move( 90, 3 );
173        quantizeEventsBtn->setPressed( pPref->getQuantizeEvents());
174        quantizeEventsBtn->setToolTip( trUtf8( "Quantize keyboard/midi events to grid" ) );
175        connect( quantizeEventsBtn, SIGNAL(clicked(Button*)), this, SLOT( quantizeEventsBtnClick(Button*)));
176
177
178        QComboBox *selInstrument = new QComboBox( NULL );
179        selInstrument->setFixedSize( 100, 20 );
180        selInstrument->move( 2, 1 );
181        selInstrument->addItem ( QString( "drumset" ));
182        selInstrument->addItem ( QString( "instrument" ));
183        selInstrument->setToolTip( trUtf8( "Midi keyboard or computer keys play whole drumset or single instruments" ) );
184        editor_top_hbox_2->addWidget( selInstrument );
185        connect( selInstrument, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( playselectedinstrument(QString) ) );
186
187        QComboBox *rightclickSelection = new QComboBox( NULL );
188        rightclickSelection->setFixedSize( 100, 20 );
189        rightclickSelection->move( 2, 1 );
190        rightclickSelection->addItem ( QString( "note length" ));
191        rightclickSelection->addItem ( QString( "note off" ));
192        rightclickSelection->setToolTip( trUtf8( "Right click into pattern editor add note-off-note or edit note-length" ) );
193        editor_top_hbox_2->addWidget( rightclickSelection );
194        connect( rightclickSelection, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( rightclickSelect(QString) ) );
195
196
197        // zoom-in btn
198        Button *zoom_in_btn = new Button(
199                        NULL,
200                        "/songEditor/btn_new_on.png",
201                        "/songEditor/btn_new_off.png",
202                        "/songEditor/btn_new_over.png",
203                        QSize(19, 13)
204        );
205//      zoom_in_btn->move( 51, 3 );
206//      zoom_in_btn->setText("+");
207        zoom_in_btn->setToolTip( trUtf8( "Zoom in" ) );
208        connect(zoom_in_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomInBtnClicked(Button*) ) );
209        //editor_top_hbox_2->addWidget(zoom_in_btn);
210
211
212        // zoom-out btn
213        Button *zoom_out_btn = new Button(
214                        NULL,
215                        "/songEditor/btn_minus_on.png",
216                        "/songEditor/btn_minus_off.png",
217                        "/songEditor/btn_minus_over.png",
218                        QSize(19, 13)
219        );
220//      zoom_out_btn->move( 2, 3 );
221        //zoom_out_btn->setText("-");
222        zoom_out_btn->setToolTip( trUtf8( "Zoom out" ) );
223        connect( zoom_out_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomOutBtnClicked(Button*) ) );
224        //editor_top_hbox_2->addWidget(zoom_out_btn);
225
226
227// End Editor TOP
228
229
230// RULER____________________________________
231
232        // Ruler ScrollView
233        m_pRulerScrollView = new QScrollArea( NULL );
234        m_pRulerScrollView->setFrameShape( QFrame::NoFrame );
235        m_pRulerScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
236        m_pRulerScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
237        m_pRulerScrollView->setFixedHeight( 25 );
238        // Ruler
239        m_pPatternEditorRuler = new PatternEditorRuler( m_pRulerScrollView->viewport() );
240
241        m_pRulerScrollView->setWidget( m_pPatternEditorRuler );
242
243//~ RULER
244
245
246// EDITOR _____________________________________
247        // Editor scrollview
248        m_pEditorScrollView = new QScrollArea( NULL );
249        m_pEditorScrollView->setFrameShape( QFrame::NoFrame );
250        m_pEditorScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
251        m_pEditorScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
252
253
254
255        // Editor
256        m_pDrumPatternEditor = new DrumPatternEditor( m_pEditorScrollView->viewport(), this );
257
258        m_pEditorScrollView->setWidget( m_pDrumPatternEditor );
259
260        connect( m_pEditorScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
261
262
263
264/*
265        m_pPianoRollScrollView = new QScrollArea( NULL );
266        m_pPianoRollScrollView->setFrameShape( QFrame::NoFrame );
267        m_pPianoRollScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
268        m_pPianoRollScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
269
270        m_pPianoRollEditor = new PianoRollEditor( m_pPianoRollScrollView->viewport() );
271        m_pPianoRollScrollView->setWidget( m_pPianoRollEditor );
272
273        connect( m_pPianoRollScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
274
275
276        m_pPianoRollScrollView->hide();
277*/
278//~ EDITOR
279
280
281
282
283
284
285// INSTRUMENT LIST
286        // Instrument list scrollview
287        m_pInstrListScrollView = new QScrollArea( NULL );
288        m_pInstrListScrollView->setFrameShape( QFrame::NoFrame );
289        m_pInstrListScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
290        m_pInstrListScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
291
292        // Instrument list
293        m_pInstrumentList = new PatternEditorInstrumentList( m_pInstrListScrollView->viewport(), this );
294        m_pInstrListScrollView->setWidget( m_pInstrumentList );
295        m_pInstrListScrollView->setFixedWidth( m_pInstrumentList->width() );
296
297        connect( m_pInstrListScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
298//~ INSTRUMENT LIST
299
300
301
302
303// NOTE_VELOCITY EDITOR
304        m_pNoteVelocityScrollView = new QScrollArea( NULL );
305        m_pNoteVelocityScrollView->setFrameShape( QFrame::NoFrame );
306        m_pNoteVelocityScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
307        m_pNoteVelocityScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
308        m_pNoteVelocityEditor = new NotePropertiesRuler( m_pNoteVelocityScrollView->viewport(), this, NotePropertiesRuler::VELOCITY );
309        m_pNoteVelocityScrollView->setWidget( m_pNoteVelocityEditor );
310        m_pNoteVelocityScrollView->setFixedHeight( 100 );
311//~ NOTE_VELOCITY EDITOR
312
313
314// NOTE_PAN EDITOR
315        m_pNotePanScrollView = new QScrollArea( NULL );
316        m_pNotePanScrollView->setFrameShape( QFrame::NoFrame );
317        m_pNotePanScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
318        m_pNotePanScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
319        m_pNotePanEditor = new NotePropertiesRuler( m_pNotePanScrollView->viewport(), this, NotePropertiesRuler::PAN );
320        m_pNotePanScrollView->setWidget( m_pNotePanEditor );
321        m_pNotePanScrollView->setFixedHeight( 100 );
322//~ NOTE_PAN EDITOR
323
324
325// NOTE_LEADLAG EDITOR
326        m_pNoteLeadLagScrollView = new QScrollArea( NULL );
327        m_pNoteLeadLagScrollView->setFrameShape( QFrame::NoFrame );
328        m_pNoteLeadLagScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
329        m_pNoteLeadLagScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
330        m_pNoteLeadLagEditor = new NotePropertiesRuler( m_pNoteLeadLagScrollView->viewport(), this, NotePropertiesRuler::LEADLAG );
331        m_pNoteLeadLagScrollView->setWidget( m_pNoteLeadLagEditor );
332        m_pNoteLeadLagScrollView->setFixedHeight( 100 );
333//~ NOTE_LEADLAG EDITOR
334
335
336// NOTE_NOTEKEY EDITOR
337
338
339        m_pNoteNoteKeyScrollView = new QScrollArea( NULL );
340        m_pNoteNoteKeyScrollView->setFrameShape( QFrame::NoFrame );
341        m_pNoteNoteKeyScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
342        m_pNoteNoteKeyScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
343        m_pNoteNoteKeyEditor = new NotePropertiesRuler( m_pNoteNoteKeyScrollView->viewport(), this, NotePropertiesRuler::NOTEKEY );
344        m_pNoteNoteKeyScrollView->setWidget( m_pNoteNoteKeyEditor );
345        m_pNoteNoteKeyScrollView->setFixedHeight( 210 );
346
347
348//~ NOTE_NOTEKEY EDITOR
349
350
351        // external horizontal scrollbar
352        m_pPatternEditorHScrollBar = new QScrollBar( Qt::Horizontal , NULL  );
353        connect( m_pPatternEditorHScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) );
354
355        // external vertical scrollbar
356        m_pPatternEditorVScrollBar = new QScrollBar( Qt::Vertical, NULL );
357        connect( m_pPatternEditorVScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) );
358
359        QHBoxLayout *pPatternEditorHScrollBarLayout = new QHBoxLayout();
360        pPatternEditorHScrollBarLayout->setSpacing( 0 );
361        pPatternEditorHScrollBarLayout->setMargin( 0 );
362        pPatternEditorHScrollBarLayout->addWidget( m_pPatternEditorHScrollBar );
363        pPatternEditorHScrollBarLayout->addWidget( zoom_in_btn );
364        pPatternEditorHScrollBarLayout->addWidget( zoom_out_btn );
365
366        QWidget *pPatternEditorHScrollBarContainer = new QWidget();
367        pPatternEditorHScrollBarContainer->setLayout( pPatternEditorHScrollBarLayout );
368
369
370        QPalette label_palette;
371        label_palette.setColor( QPalette::Foreground, QColor( 230, 230, 230 ) );
372
373        QFont boldFont;
374        boldFont.setBold( true );
375        m_pPatternNameLbl = new QLabel( NULL );
376        m_pPatternNameLbl->setFont( boldFont );
377        m_pPatternNameLbl->setText( "pattern name label" );
378        //m_pPatternNameLbl->setFixedWidth(200);
379        m_pPatternNameLbl->setPalette(label_palette);
380
381
382
383
384
385
386// NOTE_PROPERTIES BUTTONS
387        PixmapWidget *pPropertiesPanel = new PixmapWidget( NULL );
388        pPropertiesPanel->setColor( QColor( 58, 62, 72 ) );
389
390        pPropertiesPanel->setFixedSize( 181, 100 );
391
392        QVBoxLayout *pPropertiesVBox = new QVBoxLayout( pPropertiesPanel );
393        pPropertiesVBox->setSpacing( 0 );
394        pPropertiesVBox->setMargin( 0 );
395
396
397        LCDCombo* pPropertiesCombo = new LCDCombo( NULL, 20);
398        pPropertiesCombo->setToolTip(trUtf8("Select note properties"));
399        pPropertiesCombo->addItem( trUtf8("Velocity") );
400        pPropertiesCombo->addItem( trUtf8("Pan") );
401        pPropertiesCombo->addItem( trUtf8("Lead and Lag") );
402        pPropertiesCombo->addItem( trUtf8("NoteKey") );
403        pPropertiesCombo->update();
404        connect( pPropertiesCombo, SIGNAL(valueChanged(QString)), this, SLOT(propertiesComboChanged(QString)));
405
406        pPropertiesVBox->addWidget( pPropertiesCombo );
407
408
409//~ NOTE_PROPERTIES BUTTONS
410
411
412// LAYOUT
413        QWidget *pMainPanel = new QWidget();
414
415        QGridLayout *pGrid = new QGridLayout();
416        pGrid->setSpacing( 0 );
417        pGrid->setMargin( 0 );
418
419        pGrid->addWidget( editor_top, 0, 0);
420        pGrid->addWidget( editor_top_2, 0, 1, 1, 3);
421        pGrid->addWidget( m_pPatternNameLbl, 1, 0 );
422        pGrid->addWidget( m_pRulerScrollView, 1, 1 );
423
424        pGrid->addWidget( m_pInstrListScrollView, 2, 0 );
425
426        pGrid->addWidget( m_pEditorScrollView, 2, 1 );
427//      pGrid->addWidget( m_pPianoRollScrollView, 2, 1 );
428
429        pGrid->addWidget( m_pPatternEditorVScrollBar, 2, 2 );
430        pGrid->addWidget( pPatternEditorHScrollBarContainer, 10, 1 );
431        pGrid->addWidget( m_pNoteVelocityScrollView, 4, 1 );
432        pGrid->addWidget( m_pNotePanScrollView, 4, 1 );
433        pGrid->addWidget( m_pNoteLeadLagScrollView, 4, 1 );
434        pGrid->addWidget( m_pNoteNoteKeyScrollView, 4, 1 );
435
436        pGrid->addWidget( pPropertiesPanel, 4, 0 );
437        pGrid->setRowStretch( 2, 100 );
438        pMainPanel->setLayout( pGrid );
439
440
441
442
443
444        // restore grid resolution
445        int nIndex;
446        if ( pPref->isPatternEditorUsingTriplets() == false ) {
447                switch ( pPref->getPatternEditorGridResolution() ) {
448                        case 4:
449                                __resolution_combo->set_text( "4" );
450                                nIndex = 0;
451                                break;
452
453                        case 8:
454                                __resolution_combo->set_text( "8" );
455                                nIndex = 1;
456                                break;
457
458                        case 16:
459                                __resolution_combo->set_text( "16" );
460                                nIndex = 2;
461                                break;
462
463                        case 32:
464                                __resolution_combo->set_text( "32" );
465                                nIndex = 3;
466                                break;
467
468                        case 64:
469                                __resolution_combo->set_text( "64" );
470                                nIndex = 4;
471                                break;
472
473                        default:
474                                ERRORLOG( "Wrong grid resolution: " + to_string( pPref->getPatternEditorGridResolution() ) );
475                                __resolution_combo->set_text( "4" );
476                                nIndex = 0;
477                }
478        }
479        else {
480                switch ( pPref->getPatternEditorGridResolution() ) {
481                        case 8:
482                                __resolution_combo->set_text( "4T" );
483                                nIndex = 5;
484                                break;
485
486                        case 16:
487                                __resolution_combo->set_text( "8T" );
488                                nIndex = 6;
489                                break;
490
491                        case 32:
492                                __resolution_combo->set_text( "16T" );
493                                nIndex = 7;
494                                break;
495
496                        case 64:
497                                __resolution_combo->set_text( "32T" );
498                                nIndex = 8;
499                                break;
500
501                        default:
502                                ERRORLOG( "Wrong grid resolution: " + to_string( pPref->getPatternEditorGridResolution() ) );
503                                __resolution_combo->set_text( "4T" );
504                                nIndex = 5;
505                }
506        }
507        gridResolutionChanged(__resolution_combo->getText());
508
509
510
511
512
513
514        // LAYOUT
515        QVBoxLayout *pVBox = new QVBoxLayout();
516        pVBox->setSpacing( 0 );
517        pVBox->setMargin( 0 );
518        this->setLayout( pVBox );
519
520        pVBox->addWidget( pMainPanel );
521
522        HydrogenApp::getInstance()->addEventListener( this );
523
524        selectedPatternChangedEvent(); // force an update
525
526        pPropertiesCombo->set_text( trUtf8("Velocity"));
527}
528
529
530
531
532PatternEditorPanel::~PatternEditorPanel()
533{
534}
535
536
537
538void PatternEditorPanel::syncToExternalHorizontalScrollbar(int)
539{
540//      INFOLOG( "[syncToExternalHorizontalScrollbar]" );
541
542        // drum Editor
543        m_pEditorScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
544        m_pEditorScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
545
546        // piano roll Editor
547//      m_pPianoRollScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
548//      m_pPianoRollScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
549
550
551        // Ruler
552        m_pRulerScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
553
554        // Instrument list
555        m_pInstrListScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
556
557        // Velocity ruler
558        m_pNoteVelocityScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
559
560        // pan ruler
561        m_pNotePanScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
562
563        // leadlag ruler
564        m_pNoteLeadLagScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
565
566        // notekey ruler
567        m_pNoteNoteKeyScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
568}
569
570
571void PatternEditorPanel::on_patternEditorScroll(int nValue)
572{
573//      INFOLOG( "[on_patternEditorScroll]" );
574        m_pPatternEditorVScrollBar->setValue( nValue );
575}
576
577
578
579
580void PatternEditorPanel::gridResolutionChanged( QString str )
581{
582        int nResolution;
583        bool bUseTriplets = false;
584
585        if ( str.contains( "off" ) ) {
586                nResolution=MAX_NOTES;
587        }
588        else if ( str.contains( "T" ) ) {
589                bUseTriplets = true;
590                QString temp = str;
591                temp.chop( 1 );
592                nResolution = temp.toInt() * 2;
593        }
594        else {
595                nResolution = str.toInt();
596        }
597
598        //INFOLOG( to_string( nResolution ) );
599        m_pDrumPatternEditor->setResolution( nResolution, bUseTriplets );
600
601        Preferences::getInstance()->setPatternEditorGridResolution( nResolution );
602        Preferences::getInstance()->setPatternEditorUsingTriplets( bUseTriplets );
603}
604
605
606
607void PatternEditorPanel::selectedPatternChangedEvent()
608{
609        PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list();
610        int nSelectedPatternNumber = Hydrogen::get_instance()->getSelectedPatternNumber();
611
612        if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->get_size() ) ) {
613                // update pattern name text
614                m_pPattern = pPatternList->get( nSelectedPatternNumber );
615                QString sCurrentPatternName = m_pPattern->get_name();
616                this->setWindowTitle( ( trUtf8( "Pattern editor - %1").arg( sCurrentPatternName ) ) );
617                //m_pNameLCD->setText( sCurrentPatternName );
618                m_pPatternNameLbl->setText( sCurrentPatternName );
619
620                // update pattern size combobox
621                int nPatternSize = m_pPattern->get_lenght();
622                int nEighth = MAX_NOTES / 8;
623                for ( int i = 1; i <= 32; i++ ) {
624                        if ( nPatternSize == nEighth * i ) {
625                                __pattern_size_combo->set_text( QString( "%1" ).arg( i ) );
626                                break;
627                        }
628                }
629        }
630        else {
631                m_pPattern = NULL;
632
633                this->setWindowTitle( ( trUtf8( "Pattern editor - %1").arg(QString("No pattern selected.")) ) );
634                //m_pNameLCD->setText( trUtf8( "No pattern selected" ) );
635                m_pPatternNameLbl->setText( trUtf8( "No pattern selected" ) );
636        }
637
638        resizeEvent( NULL ); // force an update of the scrollbars
639}
640
641
642
643void PatternEditorPanel::hearNotesBtnClick(Button *ref)
644{
645        Preferences *pref = ( Preferences::getInstance() );
646        pref->setHearNewNotes( ref->isPressed() );
647
648        if (ref->isPressed() ) {
649                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Hear new notes = On" ), 2000 );
650        }
651        else {
652                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Hear new notes = Off" ), 2000 );
653        }
654
655}
656
657
658
659
660void PatternEditorPanel::quantizeEventsBtnClick(Button *ref)
661{
662        Preferences *pref = ( Preferences::getInstance() );
663        pref->setQuantizeEvents( ref->isPressed() );
664
665        if (ref->isPressed() ) {
666                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Quantize incoming keyboard/midi events = On" ), 2000 );
667        }
668        else {
669                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Quantize incoming keyboard/midi events = Off" ), 2000 );
670        }
671}
672
673
674
675
676void PatternEditorPanel::stateChangedEvent(int state)
677{
678        if ( state == STATE_READY) {
679                m_bEnablePatternResize = true;
680        }
681        else {
682                m_bEnablePatternResize = false;
683        }
684}
685
686
687
688void PatternEditorPanel::resizeEvent( QResizeEvent *ev )
689{
690        UNUSED( ev );
691        QScrollArea *pScrollArea = m_pEditorScrollView;
692
693/*
694        if ( m_pPianoRollScrollView->isVisible() ) {
695                pScrollArea = m_pPianoRollScrollView;
696        }
697        else {
698                pScrollArea = m_pEditorScrollView;
699        }
700*/
701
702        m_pPatternEditorHScrollBar->setMinimum( pScrollArea->horizontalScrollBar()->minimum() );
703        m_pPatternEditorHScrollBar->setMaximum( pScrollArea->horizontalScrollBar()->maximum() );
704        m_pPatternEditorHScrollBar->setSingleStep( pScrollArea->horizontalScrollBar()->singleStep() );
705        m_pPatternEditorHScrollBar->setPageStep( pScrollArea->horizontalScrollBar()->pageStep() );
706
707        m_pPatternEditorVScrollBar->setMinimum( pScrollArea->verticalScrollBar()->minimum() );
708        m_pPatternEditorVScrollBar->setMaximum( pScrollArea->verticalScrollBar()->maximum() );
709        m_pPatternEditorVScrollBar->setSingleStep( pScrollArea->verticalScrollBar()->singleStep() );
710        m_pPatternEditorVScrollBar->setPageStep( pScrollArea->verticalScrollBar()->pageStep() );
711}
712
713
714
715
716void PatternEditorPanel::showEvent ( QShowEvent *ev )
717{
718        UNUSED( ev );
719//      m_pPatternEditorVScrollBar->setValue( m_pPatternEditorVScrollBar->maximum() );
720}
721
722
723/// richiamato dall'uso dello scroll del mouse
724void PatternEditorPanel::contentsMoving(int dummy)
725{
726        UNUSED( dummy );
727        //INFOLOG( "contentsMoving" );
728        syncToExternalHorizontalScrollbar(0);
729}
730
731
732
733void PatternEditorPanel::selectedInstrumentChangedEvent()
734{
735  //m_pNoteVelocityEditor->updateEditor();
736  //m_pNotePanEditor->updateEditor();
737  //m_pNoteLeadLagEditor->updateEditor();
738
739        resizeEvent(NULL);      // force a scrollbar update
740}
741
742
743
744void PatternEditorPanel::showDrumEditorBtnClick(Button *ref)
745{
746        UNUSED( ref );
747        __show_drum_btn->setPressed( true );
748        __show_piano_btn->setPressed( false );
749
750
751//      m_pPianoRollScrollView->hide();
752        m_pEditorScrollView->show();
753        m_pInstrListScrollView->show();
754
755        m_pDrumPatternEditor->selectedInstrumentChangedEvent(); // force an update
756
757        // force a re-sync of extern scrollbars
758        resizeEvent( NULL );
759}
760
761
762
763void PatternEditorPanel::showPianoEditorBtnClick(Button *ref)
764{
765        UNUSED( ref );
766        __show_piano_btn->setPressed( true );
767        __show_drum_btn->setPressed( false );
768
769
770//      m_pPianoRollScrollView->show();
771        m_pEditorScrollView->hide();
772        m_pInstrListScrollView->hide();
773
774//      m_pPianoRollEditor->selectedInstrumentChangedEvent(); // force an update
775
776        // force a re-sync of extern scrollbars
777        resizeEvent( NULL );
778}
779
780
781
782
783void PatternEditorPanel::zoomInBtnClicked(Button *ref)
784{
785        if(m_pPatternEditorRuler->getGridWidth() >=24){
786                return;
787        }
788        UNUSED( ref );
789        m_pPatternEditorRuler->zoomIn();
790        m_pDrumPatternEditor->zoom_in();
791        m_pNoteVelocityEditor->zoomIn();
792        m_pNoteLeadLagEditor->zoomIn();
793        m_pNoteNoteKeyEditor->zoomIn();
794        m_pNotePanEditor->zoomIn();
795
796        resizeEvent( NULL );
797}
798
799
800
801void PatternEditorPanel::zoomOutBtnClicked(Button *ref)
802{
803        UNUSED( ref );
804        m_pPatternEditorRuler->zoomOut();
805        m_pDrumPatternEditor->zoom_out();
806        m_pNoteVelocityEditor->zoomOut();
807        m_pNoteLeadLagEditor->zoomOut();
808        m_pNoteNoteKeyEditor->zoomOut();
809        m_pNotePanEditor->zoomOut();
810
811        resizeEvent( NULL );
812}
813
814
815
816void PatternEditorPanel::patternSizeChanged( QString str )
817{
818        INFOLOG( "pattern size changed" );
819
820        uint nEighth = MAX_NOTES / 8;
821        int nSelected = str.toInt();
822
823        if ( !m_pPattern ) {
824                return;
825        }
826
827        if ( m_pPattern->get_lenght() == nEighth * nSelected ) {
828                // non e' necessario aggiornare
829                return;
830        }
831
832
833        if ( !m_bEnablePatternResize ) {
834                __pattern_size_combo->set_text(QString::number(m_pPattern->get_lenght() / nEighth ),false);
835                QMessageBox::information( this, "Hydrogen", trUtf8( "Is not possible to change the pattern size when playing." ) );
836                return;
837        }
838
839
840        if ( nSelected > 0 && nSelected <= 32 ) {
841                m_pPattern->set_lenght( nEighth * nSelected );
842                //m_pPatternSizeLCD->setText( QString( "%1" ).arg( nSelected ) );
843        }
844        else {
845                ERRORLOG( "[patternSizeChanged] Unhandled case " + to_string( nSelected ) );
846        }
847
848        m_pPatternEditorRuler->updateEditor( true );    // redraw all
849        m_pNoteVelocityEditor->updateEditor();
850        m_pNotePanEditor->updateEditor();
851        m_pNoteLeadLagEditor->updateEditor();
852        m_pNoteNoteKeyEditor->updateEditor();
853
854        resizeEvent( NULL );
855
856        EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 );
857}
858
859
860
861void PatternEditorPanel::moveUpBtnClicked(Button *)
862{
863        Hydrogen *engine = Hydrogen::get_instance();
864        int nSelectedInstrument = engine->getSelectedInstrumentNumber();
865
866        AudioEngine::get_instance()->lock( "PatternEditorPanel::moveUpBtnClicked" );
867
868        Song *pSong = engine->getSong();
869        InstrumentList *pInstrumentList = pSong->get_instrument_list();
870
871        if ( ( nSelectedInstrument - 1 ) >= 0 ) {
872                Instrument *pTemp = pInstrumentList->get( nSelectedInstrument - 1 );
873                pInstrumentList->replace( pInstrumentList->get( nSelectedInstrument ), nSelectedInstrument - 1 );
874                pInstrumentList->replace( pTemp, nSelectedInstrument );
875
876                AudioEngine::get_instance()->unlock();
877                engine->setSelectedInstrumentNumber( nSelectedInstrument - 1 );
878
879                pSong->__is_modified = true;
880        }
881        else {
882                AudioEngine::get_instance()->unlock();
883        }
884}
885
886
887
888void PatternEditorPanel::moveDownBtnClicked(Button *)
889{
890        Hydrogen *engine = Hydrogen::get_instance();
891        int nSelectedInstrument = engine->getSelectedInstrumentNumber();
892
893        AudioEngine::get_instance()->lock( "PatternEditorPanel::moveDownBtnClicked" );
894
895        Song *pSong = engine->getSong();
896        InstrumentList *pInstrumentList = pSong->get_instrument_list();
897
898        if ( ( nSelectedInstrument + 1 ) < (int)pInstrumentList->get_size() ) {
899                Instrument *pTemp = pInstrumentList->get( nSelectedInstrument + 1 );
900                pInstrumentList->replace( pInstrumentList->get( nSelectedInstrument ), nSelectedInstrument + 1 );
901                pInstrumentList->replace( pTemp, nSelectedInstrument );
902
903                AudioEngine::get_instance()->unlock();
904                engine->setSelectedInstrumentNumber( nSelectedInstrument + 1 );
905
906                pSong->__is_modified = true;
907        }
908        else {
909                AudioEngine::get_instance()->unlock();
910        }
911
912}
913
914
915
916
917void PatternEditorPanel::dragEnterEvent(QDragEnterEvent *event)
918{
919        m_pInstrumentList->dragEnterEvent( event );
920}
921
922
923
924void PatternEditorPanel::dropEvent(QDropEvent *event)
925{
926        m_pInstrumentList->dropEvent( event );
927}
928
929
930
931void PatternEditorPanel::propertiesComboChanged( QString text )
932{
933        if ( text == trUtf8( "Velocity" ) ) {
934                m_pNotePanScrollView->hide();
935                m_pNoteLeadLagScrollView->hide();
936                m_pNoteNoteKeyScrollView->hide();
937                m_pNoteVelocityScrollView->show();
938
939                m_pNoteVelocityEditor->updateEditor();
940        }
941        else if ( text == trUtf8( "Pan" ) ) {
942                m_pNoteVelocityScrollView->hide();
943                m_pNoteLeadLagScrollView->hide();
944                m_pNoteNoteKeyScrollView->hide();
945                m_pNotePanScrollView->show();
946
947                m_pNotePanEditor->updateEditor();
948        }
949        else if ( text == trUtf8( "Lead and Lag" ) ) {
950                m_pNoteVelocityScrollView->hide();
951                m_pNotePanScrollView->hide();
952                m_pNoteNoteKeyScrollView->hide();
953                m_pNoteLeadLagScrollView->show();
954 
955                m_pNoteLeadLagEditor->updateEditor();
956        }
957        else if ( text == trUtf8( "NoteKey" ) ) {
958                m_pNoteVelocityScrollView->hide();
959                m_pNotePanScrollView->hide();
960                m_pNoteLeadLagScrollView->hide();
961                m_pNoteNoteKeyScrollView->show();
962 
963                m_pNoteNoteKeyEditor->updateEditor();
964        }
965        else if ( text == trUtf8( "Cutoff" ) ) {
966        }
967        else if ( text == trUtf8( "Resonance" ) ) {
968        }
969        else {
970                ERRORLOG( "Unknown text: " + text );
971        }
972}
973
974
975
976void PatternEditorPanel::playselectedinstrument( QString text )
977{
978        if ( text == "drumset" ){
979                Preferences::getInstance()->__playselectedinstrument = false;
980        }else
981        {
982                Preferences::getInstance()->__playselectedinstrument = true;
983        }
984}
985
986
987void PatternEditorPanel::rightclickSelect( QString text )
988{
989        if ( text == "note length" ){
990                Preferences::getInstance()->__rightclickedpattereditor = false;
991        }else
992        {
993                Preferences::getInstance()->__rightclickedpattereditor = true;
994        }
995
996}
Note: See TracBrowser for help on using the browser.