void Arranger::rasterChanged(int index) { _raster = gArrangerRasterTable[index]; // Set the audio record part snapping. MusEGlobal::song->setArrangerRaster(_raster); canvas->redraw(); focusCanvas(); }
TopWin::TopWin(ToplevelType t, QWidget* parent, const char* name, Qt::WindowFlags f) : QMainWindow(parent, f) { _initalizing = true; _isDeleting = false; if (initInited==false) initConfiguration(); _type=t; setObjectName(QString(name)); //setDockNestingEnabled(true); // Allow multiple rows. Tim. setIconSize(ICON_SIZE); subwinAction=new QAction(tr("As subwindow"), this); subwinAction->setCheckable(true); connect(subwinAction, SIGNAL(toggled(bool)), SLOT(setIsMdiWin(bool))); shareAction=new QAction(tr("Shares tools and menu"), this); shareAction->setCheckable(true); connect(shareAction, SIGNAL(toggled(bool)), SLOT(shareToolsAndMenu(bool))); fullscreenAction=new QAction(tr("Fullscreen"), this); fullscreenAction->setCheckable(true); fullscreenAction->setChecked(false); fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key); connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool))); mdisubwin=NULL; if (!MusEGlobal::unityWorkaround) _sharesToolsAndMenu=_defaultSubwin[_type] ? _sharesWhenSubwin[_type] : _sharesWhenFree[_type]; else _sharesToolsAndMenu=false; if (_defaultSubwin[_type] && !MusEGlobal::unityWorkaround) { setIsMdiWin(true); _savedToolbarState=_toolbarNonsharedInit[_type]; } if (_sharesToolsAndMenu) menuBar()->hide(); subwinAction->setChecked(isMdiWin()); shareAction->setChecked(_sharesToolsAndMenu); if (MusEGlobal::unityWorkaround) { shareAction->setEnabled(false); subwinAction->setEnabled(false); } fullscreenAction->setEnabled(!isMdiWin()); if (mdisubwin) mdisubwin->resize(_widthInit[_type], _heightInit[_type]); else resize(_widthInit[_type], _heightInit[_type]); QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools")); undo_tools->setObjectName("Undo/Redo tools"); undo_tools->addActions(MusEGlobal::undoRedo->actions()); QToolBar* panic_toolbar = addToolBar(tr("Panic")); panic_toolbar->setObjectName("panic"); panic_toolbar->addAction(MusEGlobal::panicAction); QToolBar* metronome_toolbar = addToolBar(tr("Metronome")); metronome_toolbar->setObjectName("metronome"); metronome_toolbar->addAction(MusEGlobal::metronomeAction); QToolBar* transport_toolbar = addToolBar(tr("Transport")); transport_toolbar->setObjectName("transport"); transport_toolbar->addActions(MusEGlobal::transportAction->actions()); QToolBar* songpos_tb; songpos_tb = addToolBar(tr("Song Position")); songpos_tb->setObjectName("Song Position"); songpos_tb->addWidget(new MusEGui::SongPosToolbarWidget(songpos_tb)); songpos_tb->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); songpos_tb->setContextMenuPolicy(Qt::PreventContextMenu); QToolBar* tempo_tb; tempo_tb = addToolBar(tr("Tempo")); tempo_tb->setObjectName("Tempo"); MusEGui::TempoToolbarWidget* tw = new MusEGui::TempoToolbarWidget(tempo_tb); tempo_tb->addWidget(tw); QToolBar* sig_tb; sig_tb = addToolBar(tr("Signature")); sig_tb->setObjectName("Signature"); MusEGui::SigToolbarWidget* sw = new MusEGui::SigToolbarWidget(tempo_tb); sig_tb->addWidget(sw); connect(tw, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(tw, SIGNAL(escapePressed()), SLOT(focusCanvas())); connect(sw, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(sw, SIGNAL(escapePressed()), SLOT(focusCanvas())); }
Arranger::Arranger(ArrangerView* parent, const char* name) : QWidget(parent) { setObjectName(name); _raster = 0; // measure selected = 0; showTrackinfoFlag = true; cursVal = INT_MAX; _parentWin=parent; setFocusPolicy(Qt::NoFocus); //--------------------------------------------------- // ToolBar // create toolbar in toplevel widget //--------------------------------------------------- parent->addToolBarBreak(); QToolBar* toolbar = parent->addToolBar(tr("Arranger")); toolbar->setObjectName("ArrangerToolbar"); QLabel* label = new QLabel(tr("Cursor")); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); toolbar->addWidget(label); cursorPos = new PosLabel(0); cursorPos->setEnabled(false); cursorPos->setFixedHeight(22); toolbar->addWidget(cursorPos); label = new QLabel(tr("Snap")); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); toolbar->addWidget(label); _rasterCombo = new QComboBox(); for (int i = 0; i < 6; i++) _rasterCombo->insertItem(i, tr(gArrangerRasterStrings[i]), gArrangerRasterTable[i]); _rasterCombo->setCurrentIndex(1); // Set the audio record part snapping. Set to 0 (bar), the same as this combo box intial raster. MusEGlobal::song->setArrangerRaster(0); toolbar->addWidget(_rasterCombo); connect(_rasterCombo, SIGNAL(activated(int)), SLOT(rasterChanged(int))); _rasterCombo->setFocusPolicy(Qt::TabFocus); // Song len label = new QLabel(tr("Len")); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); toolbar->addWidget(label); // song length is limited to 10000 bars; the real song len is limited // by overflows in tick computations lenEntry = new SpinBox(1, 10000, 1); lenEntry->setFocusPolicy(Qt::StrongFocus); lenEntry->setValue(MusEGlobal::song->len()); lenEntry->setToolTip(tr("song length - bars")); lenEntry->setWhatsThis(tr("song length - bars")); toolbar->addWidget(lenEntry); connect(lenEntry, SIGNAL(valueChanged(int)), SLOT(songlenChanged(int))); label = new QLabel(tr("Pitch")); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); toolbar->addWidget(label); globalPitchSpinBox = new SpinBox(-127, 127, 1); globalPitchSpinBox->setFocusPolicy(Qt::StrongFocus); globalPitchSpinBox->setValue(MusEGlobal::song->globalPitchShift()); globalPitchSpinBox->setToolTip(tr("midi pitch")); globalPitchSpinBox->setWhatsThis(tr("global midi pitch shift")); toolbar->addWidget(globalPitchSpinBox); connect(globalPitchSpinBox, SIGNAL(valueChanged(int)), SLOT(globalPitchChanged(int))); label = new QLabel(tr("Tempo")); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); toolbar->addWidget(label); globalTempoSpinBox = new SpinBox(50, 200, 1, toolbar); globalTempoSpinBox->setFocusPolicy(Qt::StrongFocus); globalTempoSpinBox->setSuffix(QString("%")); globalTempoSpinBox->setValue(MusEGlobal::tempomap.globalTempo()); globalTempoSpinBox->setToolTip(tr("midi tempo")); globalTempoSpinBox->setWhatsThis(tr("midi tempo")); toolbar->addWidget(globalTempoSpinBox); connect(globalTempoSpinBox, SIGNAL(valueChanged(int)), SLOT(globalTempoChanged(int))); QToolButton* tempo50 = new QToolButton(); tempo50->setText(QString("50%")); tempo50->setFocusPolicy(Qt::NoFocus); toolbar->addWidget(tempo50); connect(tempo50, SIGNAL(clicked()), SLOT(setTempo50())); QToolButton* tempo100 = new QToolButton(); tempo100->setText(tr("N")); tempo100->setFocusPolicy(Qt::NoFocus); toolbar->addWidget(tempo100); connect(tempo100, SIGNAL(clicked()), SLOT(setTempo100())); QToolButton* tempo200 = new QToolButton(); tempo200->setText(QString("200%")); tempo200->setFocusPolicy(Qt::NoFocus); toolbar->addWidget(tempo200); connect(tempo200, SIGNAL(clicked()), SLOT(setTempo200())); QVBoxLayout* box = new QVBoxLayout(this); box->setContentsMargins(0, 0, 0, 0); box->setSpacing(0); box->addWidget(MusECore::hLine(this), Qt::AlignTop); //--------------------------------------------------- // Tracklist //--------------------------------------------------- int xscale = -100; int yscale = 1; split = new Splitter(Qt::Horizontal, this, "split"); split->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); box->addWidget(split, 1000); tracklist = new QWidget(split); split->setStretchFactor(split->indexOf(tracklist), 0); QSizePolicy tpolicy = QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); tpolicy.setHorizontalStretch(0); tpolicy.setVerticalStretch(100); tracklist->setSizePolicy(tpolicy); editor = new QWidget(split); split->setStretchFactor(split->indexOf(editor), 1); QSizePolicy epolicy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); epolicy.setHorizontalStretch(255); epolicy.setVerticalStretch(100); editor->setSizePolicy(epolicy); //--------------------------------------------------- // Track Info //--------------------------------------------------- infoScroll = new ScrollBar(Qt::Vertical, true, tracklist); infoScroll->setObjectName("infoScrollBar"); //genTrackInfo(tracklist); // Moved below // Track-Info Button ib = new QToolButton(tracklist); ib->setText(tr("TrackInfo")); ib->setCheckable(true); ib->setChecked(showTrackinfoFlag); ib->setFocusPolicy(Qt::NoFocus); connect(ib, SIGNAL(toggled(bool)), SLOT(showTrackInfo(bool))); // set up the header header = new Header(tracklist, "header"); header->setFixedHeight(30); QFontMetrics fm1(header->font()); int fw = 11; header->setColumnLabel(tr("R"), COL_RECORD, fm1.width('R')+fw); header->setColumnLabel(tr("M"), COL_MUTE, fm1.width('M')+fw); header->setColumnLabel(tr("S"), COL_SOLO, fm1.width('S')+fw); header->setColumnLabel(tr("C"), COL_CLASS, fm1.width('C')+fw); header->setColumnLabel(tr("Track"), COL_NAME, 100); header->setColumnLabel(tr("Port"), COL_OPORT, 60); header->setColumnLabel(tr("Ch"), COL_OCHANNEL, 30); header->setColumnLabel(tr("T"), COL_TIMELOCK, fm1.width('T')+fw); header->setColumnLabel(tr("Automation"), COL_AUTOMATION, 75); header->setColumnLabel(tr("Clef"), COL_CLEF, 75); for (unsigned i=0;i<custom_columns.size();i++) header->setColumnLabel(custom_columns[i].name, COL_CUSTOM_MIDICTRL_OFFSET+i, MAX(fm1.width(custom_columns[i].name)+fw, 30)); header->setSectionResizeMode(COL_RECORD, QHeaderView::Fixed); header->setSectionResizeMode(COL_MUTE, QHeaderView::Fixed); header->setSectionResizeMode(COL_SOLO, QHeaderView::Fixed); header->setSectionResizeMode(COL_CLASS, QHeaderView::Fixed); header->setSectionResizeMode(COL_NAME, QHeaderView::Interactive); header->setSectionResizeMode(COL_OPORT, QHeaderView::Interactive); header->setSectionResizeMode(COL_OCHANNEL, QHeaderView::Fixed); header->setSectionResizeMode(COL_TIMELOCK, QHeaderView::Fixed); header->setSectionResizeMode(COL_AUTOMATION, QHeaderView::Interactive); header->setSectionResizeMode(COL_CLEF, QHeaderView::Interactive); for (unsigned i=0;i<custom_columns.size();i++) header->setSectionResizeMode(COL_CUSTOM_MIDICTRL_OFFSET+i, QHeaderView::Interactive); setHeaderToolTips(); setHeaderWhatsThis(); header->setSectionsMovable (true); header->restoreState(header_state); list = new TList(header, tracklist, "tracklist"); // Do this now that the list is available. genTrackInfo(tracklist); connect(list, SIGNAL(selectionChanged(MusECore::Track*)), SLOT(trackSelectionChanged())); connect(list, SIGNAL(selectionChanged(MusECore::Track*)), SIGNAL(selectionChanged())); connect(list, SIGNAL(selectionChanged(MusECore::Track*)), midiTrackInfo, SLOT(setTrack(MusECore::Track*))); connect(header, SIGNAL(sectionResized(int,int,int)), list, SLOT(redraw())); connect(header, SIGNAL(sectionMoved(int,int,int)), list, SLOT(redraw())); // tracklist: // // 0 1 2 // +-----------+--------+---------+ // | Trackinfo | scroll | Header | 0 // | | bar +---------+ // | | | TList | 1 // +-----------+--------+---------+ // | hline | 2 // +-----+------------------------+ // | ib | | 3 // +-----+------------------------+ connect(infoScroll, SIGNAL(valueChanged(int)), SLOT(trackInfoScroll(int))); tgrid = new TLLayout(tracklist); // layout manager for this tgrid->wadd(0, trackInfo); tgrid->wadd(1, infoScroll); tgrid->wadd(2, header); tgrid->wadd(3, list); tgrid->wadd(4, MusECore::hLine(tracklist)); tgrid->wadd(5, ib); //--------------------------------------------------- // Editor //--------------------------------------------------- int offset = AL::sigmap.ticksMeasure(0); hscroll = new ScrollScale(-2000, -5, xscale, MusEGlobal::song->len(), Qt::Horizontal, editor, -offset); hscroll->setFocusPolicy(Qt::NoFocus); ib->setFixedHeight(hscroll->sizeHint().height()); vscroll = new QScrollBar(editor); vscroll->setMinimum(0); vscroll->setMaximum(20*20); vscroll->setSingleStep(5); vscroll->setPageStep(25); // FIXME: too small steps here for me (flo), better control via window height? vscroll->setValue(0); vscroll->setOrientation(Qt::Vertical); list->setScroll(vscroll); QList<int> vallist; vallist.append(tgrid->maximumSize().width()); split->setSizes(vallist); QGridLayout* egrid = new QGridLayout(editor); egrid->setColumnStretch(0, 50); egrid->setRowStretch(2, 50); egrid->setContentsMargins(0, 0, 0, 0); egrid->setSpacing(0); time = new MTScale(&_raster, editor, xscale); time->setOrigin(-offset, 0); canvas = new PartCanvas(&_raster, editor, xscale, yscale); canvas->setBg(MusEGlobal::config.partCanvasBg); canvas->setCanvasTools(arrangerTools); canvas->setOrigin(-offset, 0); canvas->setFocus(); list->setFocusProxy(canvas); // Make it easy for track list popup line editor to give focus back to canvas. connect(canvas, SIGNAL(setUsedTool(int)), this, SIGNAL(setUsedTool(int))); connect(canvas, SIGNAL(trackChanged(MusECore::Track*)), list, SLOT(selectTrack(MusECore::Track*))); connect(list, SIGNAL(keyPressExt(QKeyEvent*)), canvas, SLOT(redirKeypress(QKeyEvent*))); connect(canvas, SIGNAL(selectTrackAbove()), list, SLOT(selectTrackAbove())); connect(canvas, SIGNAL(selectTrackBelow()), list, SLOT(selectTrackBelow())); connect(canvas, SIGNAL(editTrackNameSig()), list, SLOT(editTrackNameSlot())); connect(canvas, SIGNAL(muteSelectedTracks()), list, SLOT(muteSelectedTracksSlot())); connect(canvas, SIGNAL(soloSelectedTracks()), list, SLOT(soloSelectedTracksSlot())); connect(canvas, SIGNAL(horizontalZoom(bool, const QPoint&)), SLOT(horizontalZoom(bool, const QPoint&))); connect(canvas, SIGNAL(horizontalZoom(int, const QPoint&)), SLOT(horizontalZoom(int, const QPoint&))); connect(lenEntry, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(lenEntry, SIGNAL(escapePressed()), SLOT(focusCanvas())); connect(globalPitchSpinBox, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(globalPitchSpinBox, SIGNAL(escapePressed()), SLOT(focusCanvas())); connect(globalTempoSpinBox, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(globalTempoSpinBox, SIGNAL(escapePressed()), SLOT(focusCanvas())); connect(midiTrackInfo, SIGNAL(returnPressed()), SLOT(focusCanvas())); connect(midiTrackInfo, SIGNAL(escapePressed()), SLOT(focusCanvas())); //connect(this, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*))); connect(list, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*))); connect(trackInfo, SIGNAL(redirectWheelEvent(QWheelEvent*)), infoScroll, SLOT(redirectedWheelEvent(QWheelEvent*))); egrid->addWidget(time, 0, 0, 1, 2); egrid->addWidget(MusECore::hLine(editor), 1, 0, 1, 2); egrid->addWidget(canvas, 2, 0); egrid->addWidget(vscroll, 2, 1); egrid->addWidget(hscroll, 3, 0, Qt::AlignBottom); connect(vscroll, SIGNAL(valueChanged(int)), canvas, SLOT(setYPos(int))); connect(hscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setXPos(int))); connect(hscroll, SIGNAL(scaleChanged(int)), canvas, SLOT(setXMag(int))); connect(vscroll, SIGNAL(valueChanged(int)), list, SLOT(setYPos(int))); connect(hscroll, SIGNAL(scrollChanged(int)), time, SLOT(setXPos(int))); connect(hscroll, SIGNAL(scaleChanged(int)), time, SLOT(setXMag(int))); connect(canvas, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned))); connect(canvas, SIGNAL(verticalScroll(unsigned)),SLOT(verticalScrollSetYpos(unsigned))); connect(canvas, SIGNAL(horizontalScroll(unsigned)),hscroll, SLOT(setPos(unsigned))); connect(canvas, SIGNAL(horizontalScrollNoLimit(unsigned)),hscroll, SLOT(setPosNoLimit(unsigned))); connect(time, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned))); connect(list, SIGNAL(verticalScrollSetYpos(int)), vscroll, SLOT(setValue(int))); connect(canvas, SIGNAL(tracklistChanged()), list, SLOT(tracklistChanged())); connect(canvas, SIGNAL(dclickPart(MusECore::Track*)), SIGNAL(editPart(MusECore::Track*))); connect(canvas, SIGNAL(startEditor(MusECore::PartList*,int)), SIGNAL(startEditor(MusECore::PartList*, int))); connect(MusEGlobal::song, SIGNAL(songChanged(MusECore::SongChangedFlags_t)), SLOT(songChanged(MusECore::SongChangedFlags_t))); connect(canvas, SIGNAL(followEvent(int)), hscroll, SLOT(setOffset(int))); connect(canvas, SIGNAL(selectionChanged()), SIGNAL(selectionChanged())); connect(canvas, SIGNAL(dropSongFile(const QString&)), SIGNAL(dropSongFile(const QString&))); connect(canvas, SIGNAL(dropMidiFile(const QString&)), SIGNAL(dropMidiFile(const QString&))); connect(canvas, SIGNAL(toolChanged(int)), SIGNAL(toolChanged(int))); connect(MusEGlobal::song, SIGNAL(controllerChanged(MusECore::Track*, int)), SLOT(controllerChanged(MusECore::Track*, int))); configChanged(); // set configuration values if(canvas->part()) midiTrackInfo->setTrack(canvas->part()->track()); showTrackInfo(showTrackinfoFlag); // Take care of some tabbies! setTabOrder(tempo200, trackInfo); setTabOrder(trackInfo, infoScroll); setTabOrder(infoScroll, list); setTabOrder(list, canvas); //setTabOrder(canvas, ib); //setTabOrder(ib, hscroll); }