📄 trackbuttons.cpp
字号:
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: *//* Rosegarden A MIDI and audio sequencer and musical notation editor. This program is Copyright 2000-2007 Guillaume Laurent <glaurent@telegraph-road.org>, Chris Cannam <cannam@all-day-breakfast.com>, Richard Bown <richard.bown@ferventsoftware.com> The moral rights of Guillaume Laurent, Chris Cannam, and Richard Bown to claim authorship of this work have been asserted. Other copyrights also apply to some parts of this work. Please see the AUTHORS file and individual file headers for details. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information.*/#include "TrackButtons.h"#include <qlayout.h>#include <klocale.h>#include <kstddirs.h>#include "misc/Debug.h"#include "misc/Strings.h"#include "base/AudioPluginInstance.h"#include "base/Composition.h"#include "base/Device.h"#include "base/Instrument.h"#include "base/MidiProgram.h"#include "base/Studio.h"#include "base/Track.h"#include "commands/segment/RenameTrackCommand.h"#include "document/RosegardenGUIDoc.h"#include "document/MultiViewCommandHistory.h"#include "gui/application/RosegardenGUIApp.h"#include "gui/general/GUIPalette.h"#include "gui/kdeext/KLedButton.h"#include "sound/AudioFileManager.h"#include "sound/PluginIdentifier.h"#include "TrackLabel.h"#include "TrackVUMeter.h"#include <kglobal.h>#include <kled.h>#include <kmessagebox.h>#include <qcursor.h>#include <qframe.h>#include <qiconset.h>#include <qlabel.h>#include <qobject.h>#include <qpixmap.h>#include <qpopupmenu.h>#include <qsignalmapper.h>#include <qstring.h>#include <qtimer.h>#include <qwidget.h>#include <qwidgetstack.h>#include <qtooltip.h>namespace Rosegarden{TrackButtons::TrackButtons(RosegardenGUIDoc* doc, unsigned int trackCellHeight, unsigned int trackLabelWidth, bool showTrackLabels, int overallHeight, QWidget* parent, const char* name, WFlags f) : QFrame(parent, name, f), m_doc(doc), m_layout(new QVBoxLayout(this)), m_recordSigMapper(new QSignalMapper(this)), m_muteSigMapper(new QSignalMapper(this)), m_clickedSigMapper(new QSignalMapper(this)), m_instListSigMapper(new QSignalMapper(this)), m_tracks(doc->getComposition().getNbTracks()), m_offset(4), m_cellSize(trackCellHeight), m_borderGap(1), m_trackLabelWidth(trackLabelWidth), m_popupItem(0), m_lastSelected( -1){ setFrameStyle(Plain); // when we create the widget, what are we looking at? if (showTrackLabels) m_trackInstrumentLabels = TrackLabel::ShowTrack; else m_trackInstrumentLabels = TrackLabel::ShowInstrument; // Set the spacing between vertical elements // m_layout->setSpacing(m_borderGap); // Now draw the buttons and labels and meters // makeButtons(); m_layout->addStretch(20); connect(m_recordSigMapper, SIGNAL(mapped(int)), this, SLOT(slotToggleRecordTrack(int))); connect(m_muteSigMapper, SIGNAL(mapped(int)), this, SLOT(slotToggleMutedTrack(int))); // connect signal mappers connect(m_instListSigMapper, SIGNAL(mapped(int)), this, SLOT(slotInstrumentSelection(int))); connect(m_clickedSigMapper, SIGNAL(mapped(int)), this, SIGNAL(trackSelected(int))); // // Populate instrument popup menu just once at start-up // // // populateInstrumentPopup(); // We have to force the height for the moment // setMinimumHeight(overallHeight);}TrackButtons::~TrackButtons(){}voidTrackButtons::makeButtons(){ if (!m_doc) return ; // Create a horizontal box for each track // plus the two buttons // unsigned int nbTracks = m_doc->getComposition().getNbTracks(); for (unsigned int i = 0; i < nbTracks; ++i) { Track *track = m_doc->getComposition().getTrackByPosition(i); if (track) { QFrame *trackHBox = makeButton(track->getId()); if (trackHBox) { m_layout->addWidget(trackHBox); m_trackHBoxes.push_back(trackHBox); } } } populateButtons();}void TrackButtons::setButtonMapping(QObject* obj, TrackId trackId){ m_clickedSigMapper->setMapping(obj, trackId); m_instListSigMapper->setMapping(obj, trackId);}voidTrackButtons::populateButtons(){ Instrument *ins = 0; Track *track; for (unsigned int i = 0; i < m_trackLabels.size(); ++i) { track = m_doc->getComposition().getTrackByPosition(i); if (track) { ins = m_doc->getStudio().getInstrumentById(track->getInstrument()); // Set mute button from track // if (track->isMuted()) m_muteLeds[i]->off(); else m_muteLeds[i]->on(); // Set record button from track // bool recording = m_doc->getComposition().isTrackRecording(track->getId()); setRecordTrack(track->getPosition(), recording); // reset track tokens m_trackLabels[i]->setId(track->getId()); setButtonMapping(m_trackLabels[i], track->getId()); m_trackLabels[i]->setPosition(i); } if (ins) { m_trackLabels[i]->getInstrumentLabel()->setText (strtoqstr(ins->getPresentationName())); if (ins->sendsProgramChange()) { m_trackLabels[i]->setAlternativeLabel(strtoqstr(ins->getProgramName())); } } else { m_trackLabels[i]->getInstrumentLabel()->setText(i18n("<no instrument>")); } m_trackLabels[i]->update(); }}std::vector<int>TrackButtons::mutedTracks(){ std::vector<int> mutedTracks; for (TrackId i = 0; i < m_tracks; i++) { if (m_muteLeds[i]->state() == KLed::Off) mutedTracks.push_back(i); } return mutedTracks;}voidTrackButtons::slotToggleMutedTrack(int mutedTrackPos){ RG_DEBUG << "TrackButtons::slotToggleMutedTrack(" << mutedTrackPos << ")\n"; if (mutedTrackPos < 0 || mutedTrackPos > (int)m_tracks ) return ; Track *track = m_doc->getComposition().getTrackByPosition(mutedTrackPos); emit muteButton(track->getId(), !track->isMuted()); // will set the value}voidTrackButtons::removeButtons(unsigned int position){ RG_DEBUG << "TrackButtons::removeButtons - " << "deleting track button at position " << position << endl; if (position >= m_trackHBoxes.size()) { RG_DEBUG << "%%%%%%%%% BIG PROBLEM : TrackButtons::removeButtons() was passed a non-existing index\n"; return ; } std::vector<TrackLabel*>::iterator tit = m_trackLabels.begin(); tit += position; m_trackLabels.erase(tit); std::vector<TrackVUMeter*>::iterator vit = m_trackMeters.begin(); vit += position; m_trackMeters.erase(vit); std::vector<KLedButton*>::iterator mit = m_muteLeds.begin(); mit += position; m_muteLeds.erase(mit); mit = m_recordLeds.begin(); mit += position; m_recordLeds.erase(mit); delete m_trackHBoxes[position]; // deletes all child widgets (button, led, label...) std::vector<QFrame*>::iterator it = m_trackHBoxes.begin(); it += position; m_trackHBoxes.erase(it);}voidTrackButtons::slotUpdateTracks(){ Composition &comp = m_doc->getComposition(); unsigned int newNbTracks = comp.getNbTracks(); Track *track = 0; if (newNbTracks < m_tracks) { for (unsigned int i = m_tracks; i > newNbTracks; --i) removeButtons(i - 1); } else if (newNbTracks > m_tracks) { for (unsigned int i = m_tracks; i < newNbTracks; ++i) { track = m_doc->getComposition().getTrackByPosition(i); if (track) { QFrame *trackHBox = makeButton(track->getId()); if (trackHBox) { trackHBox->show(); m_layout->insertWidget(i, trackHBox); m_trackHBoxes.push_back(trackHBox); } } else RG_DEBUG << "TrackButtons::slotUpdateTracks - can't find TrackId for position " << i << endl; } } // Renumber all the labels // for (unsigned int i = 0; i < m_trackLabels.size(); ++i) { track = comp.getTrackByPosition(i); if (track) { m_trackLabels[i]->setId(track->getId()); QLabel *trackLabel = m_trackLabels[i]->getTrackLabel(); if (track->getLabel() == std::string("")) { Instrument *ins = m_doc->getStudio().getInstrumentById(track->getInstrument()); if (ins && ins->getType() == Instrument::Audio) { trackLabel->setText(i18n("<untitled audio>")); } else { trackLabel->setText(i18n("<untitled>")); } } else { trackLabel->setText(strtoqstr(track->getLabel())); } // RG_DEBUG << "TrackButtons::slotUpdateTracks - set button mapping at pos " // << i << " to track id " << track->getId() << endl; setButtonMapping(m_trackLabels[i], track->getId()); } } m_tracks = newNbTracks; // Set record status and colour for (unsigned int i = 0; i < m_trackLabels.size(); ++i) { track = comp.getTrackByPosition(i); if (track) { setRecordTrack(i, comp.isTrackRecording(track->getId())); Instrument *ins = m_doc->getStudio().getInstrumentById(track->getInstrument()); if (ins && ins->getType() == Instrument::Audio) { m_recordLeds[i]->setColor (GUIPalette::getColour (GUIPalette::RecordAudioTrackLED)); } else { m_recordLeds[i]->setColor (GUIPalette::getColour (GUIPalette::RecordMIDITrackLED)); } } } // repopulate the buttons populateButtons();}voidTrackButtons::slotToggleRecordTrack(int position){ Composition &comp = m_doc->getComposition(); Track *track = comp.getTrackByPosition(position); bool state = !comp.isTrackRecording(track->getId());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -