void ManageMetronomeDialog::slotResolutionChanged(int depth) { m_metronomeBeatVely->setEnabled(depth > 1); m_metronomeSubBeatVely->setEnabled(depth > 2); slotSetModified(); }
/** * Class constructor. * @param pDoc The document object associated with this page * @param pMenu A Cscope queries popup menu to use with the editor * @param pParent The parent widget * @param szName The widget's name */ EditorPage::EditorPage(KTextEditor::Document* pDoc, QPopupMenu* pMenu, QTabWidget* pParent, const char* szName) : QHBox(pParent, szName), m_pParentTab(pParent), m_pDoc(pDoc), m_bOpen(false), m_bNewFile(false), m_sName(""), m_bWritable(true), /* new documents are writable by default */ m_bModified(false), m_nLine(0), m_bSaveNewSizes(false) { KTextEditor::PopupMenuInterface* pMenuIf; KTextEditor::ViewCursorInterface* pCursorIf; // Create code-completion objects (will be deleted by QObject destructor) m_pCompletion = new SymbolCompletion(this, this); // Set read-only mode, if required if (Config().getReadOnlyMode()) m_pDoc->setReadWrite(false); // Create the child widgets m_pSplit = new QSplitter(this); m_pCtagsList = new CtagsList(m_pSplit); m_pView = m_pDoc->createView(m_pSplit); m_pSplit->setResizeMode(m_pCtagsList, QSplitter::KeepSize); // Perform tasks only when the document has been loaded completely connect(m_pDoc, SIGNAL(completed()), this, SLOT(slotFileOpened())); // Be notified when the text in the editor changes connect(m_pDoc, SIGNAL(textChanged()), this, SLOT(slotSetModified())); connect(m_pDoc, SIGNAL(undoChanged()), this, SLOT(slotUndoChanged())); // Store the sizes of the child windows when the tag list is resized // (since it may imply a move of the splitter divider) connect(m_pCtagsList, SIGNAL(resized()), this, SLOT(slotChildResized())); // Go to a symbol's line if it is selected in the tag list connect(m_pCtagsList, SIGNAL(lineRequested(uint)), this, SLOT(slotGotoLine(uint))); // Add Ctag records to the tag list connect(&m_ctags, SIGNAL(dataReady(FrontendToken*)), m_pCtagsList, SLOT(slotDataReady(FrontendToken*))); // Monitor Ctags' operation connect(&m_ctags, SIGNAL(finished(uint)), m_pCtagsList, SLOT(slotCtagsFinished(uint))); // Set the context menu pMenuIf = dynamic_cast<KTextEditor::PopupMenuInterface*>(m_pView); if (pMenuIf) pMenuIf->installPopup(pMenu); // Emit a signal whenever the cursor's position changes pCursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>(m_pView); if (pCursorIf) { connect(m_pView, SIGNAL(cursorPositionChanged()), this, SLOT(slotCursorPosChange())); } }
ManageMetronomeDialog::ManageMetronomeDialog(QWidget *parent, RosegardenDocument *doc) : QDialog(parent), m_doc(doc), m_buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Close)) { setModal(true); setWindowTitle(tr("Metronome")); QGridLayout *metagrid = new QGridLayout; setLayout(metagrid); QWidget *hbox = new QWidget(this); QHBoxLayout *hboxLayout = new QHBoxLayout; hboxLayout->setMargin(0); metagrid->addWidget(hbox, 0, 0); QWidget *vbox = new QWidget(hbox); QVBoxLayout *vboxLayout = new QVBoxLayout; vboxLayout->setMargin(0); hboxLayout->addWidget(vbox); QGroupBox *deviceBox = new QGroupBox( tr("Metronome Instrument"), vbox ); deviceBox->setContentsMargins(10, 10, 10, 10); QGridLayout *deviceBoxLayout = new QGridLayout(deviceBox); deviceBoxLayout->setSpacing(5); vboxLayout->addWidget(deviceBox); deviceBoxLayout->addWidget(new QLabel(tr("Device"), deviceBox), 0, 0); m_metronomeDevice = new QComboBox(deviceBox); m_metronomeDevice->setToolTip(tr("<qt>Choose the device you want to use to play the metronome</qt>")); deviceBoxLayout->addWidget(m_metronomeDevice, 0, 1); DeviceList *devices = doc->getStudio().getDevices(); DeviceListConstIterator it; Studio &studio = m_doc->getStudio(); DeviceId deviceId = studio.getMetronomeDevice(); for (it = devices->begin(); it != devices->end(); it++) { Device *dev = *it; bool hasConnection = false; if (!isSuitable(dev, &hasConnection)) continue; QString label = QObject::tr(dev->getName().c_str()); // connections imply some untranslatable external string QString connection = RosegardenSequencer::getInstance()->getConnection (dev->getId()); if (hasConnection && connection != "") { label = tr("%1 - %2").arg(label).arg(connection); } else if (!hasConnection) { label = tr("%1 - No connection").arg(label); } m_metronomeDevice->addItem(label); if (dev->getId() == deviceId) { m_metronomeDevice->setCurrentIndex(m_metronomeDevice->count() - 1); } } deviceBoxLayout->addWidget(new QLabel(tr("Instrument"), deviceBox), 1, 0); m_metronomeInstrument = new QComboBox(deviceBox); m_metronomeInstrument->setToolTip(tr("<qt>Choose the instrument you want to use to play the metronome (typically #10)</qt>")); connect(m_metronomeInstrument, SIGNAL(activated(int)), this, SLOT(slotSetModified())); deviceBoxLayout->addWidget(m_metronomeInstrument, 1, 1); deviceBox->setLayout(deviceBoxLayout); QGroupBox *beatBox = new QGroupBox( tr("Beats"), vbox ); beatBox->setContentsMargins(10, 10, 10, 10); QGridLayout *beatBoxLayout = new QGridLayout(beatBox); beatBoxLayout->setSpacing(5); vboxLayout->addWidget(beatBox); beatBoxLayout->addWidget(new QLabel(tr("Resolution"), beatBox), 0, 0); m_metronomeResolution = new QComboBox(beatBox); m_metronomeResolution->setToolTip(tr("<qt>The metronome can sound bars only, bars and beats, or bars, beats and sub-beats. The latter mode can be particularly useful for playing in compound time signatures like 12/8.</qt>")); m_metronomeResolution->addItem(tr("None")); m_metronomeResolution->addItem(tr("Bars only")); m_metronomeResolution->addItem(tr("Bars and beats")); m_metronomeResolution->addItem(tr("Bars, beats, and sub-beats")); connect(m_metronomeResolution, SIGNAL(activated(int)), this, SLOT(slotResolutionChanged(int))); beatBoxLayout->addWidget(m_metronomeResolution, 0, 1); beatBoxLayout->addWidget(new QLabel(tr("Bar velocity"), beatBox), 1, 0); m_metronomeBarVely = new QSpinBox(beatBox); m_metronomeBarVely->setToolTip(tr("<qt>Controls how forcefully the bar division notes will be struck. (These are typically the loudest of all.)</qt>")); m_metronomeBarVely->setMinimum(0); m_metronomeBarVely->setMaximum(127); connect(m_metronomeBarVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified())); beatBoxLayout->addWidget(m_metronomeBarVely, 1, 1); beatBoxLayout->addWidget(new QLabel(tr("Beat velocity"), beatBox), 2, 0); m_metronomeBeatVely = new QSpinBox(beatBox); m_metronomeBeatVely->setToolTip(tr("<qt>Controls how forcefully the beat division notes will be struck. (These are typically more quiet than beat division notes.)</qt>")); m_metronomeBeatVely->setMinimum(0); m_metronomeBeatVely->setMaximum(127); connect(m_metronomeBeatVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified())); beatBoxLayout->addWidget(m_metronomeBeatVely, 2, 1); beatBoxLayout->addWidget(new QLabel(tr("Sub-beat velocity"), beatBox), 3, 0); m_metronomeSubBeatVely = new QSpinBox(beatBox); m_metronomeSubBeatVely->setToolTip(tr("<qt>Controls how forcefully the sub-beat division notes will be struck. (These are typically the most quiet of all, and are not heard unless you are working in compound time.)</qt>")); m_metronomeSubBeatVely->setMinimum(0); m_metronomeSubBeatVely->setMaximum(127); connect(m_metronomeSubBeatVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified())); beatBoxLayout->addWidget(m_metronomeSubBeatVely, 3, 1); beatBox->setLayout(beatBoxLayout); vbox->setLayout(vboxLayout); vbox = new QWidget(hbox); vboxLayout = new QVBoxLayout; vboxLayout->setMargin(0); hboxLayout->addWidget(vbox); hbox->setLayout(hboxLayout); m_metronomePitch = new PitchChooser(tr("Pitch"), vbox , 60); m_metronomePitch->setToolTip(tr("<qt>It is typical to use a percussion instrument for the metronome, so the pitch normally controls which sort of drum will sound for each tick. You may configure a different pitch for each of the bar, beat, and sub-beat ticks.</qt>")); vboxLayout->addWidget(m_metronomePitch); connect(m_metronomePitch, SIGNAL(pitchChanged(int)), this, SLOT(slotPitchChanged(int))); connect(m_metronomePitch, SIGNAL(preview(int)), this, SLOT(slotPreviewPitch(int))); m_metronomePitchSelector = new QComboBox(); m_metronomePitchSelector->addItem(tr("for Bar")); m_metronomePitchSelector->addItem(tr("for Beat")); m_metronomePitchSelector->addItem(tr("for Sub-beat")); m_metronomePitch->addWidgetToLayout(m_metronomePitchSelector); connect(m_metronomePitchSelector, SIGNAL(activated(int)), this, SLOT(slotPitchSelectorChanged(int))); QGroupBox *enableBox = new QGroupBox( tr("Metronome Activated"), vbox ); QVBoxLayout *enableBoxLayout = new QVBoxLayout; vboxLayout->addWidget(enableBox); m_playEnabled = new QCheckBox(tr("Playing"), enableBox); enableBoxLayout->addWidget(m_playEnabled); m_recordEnabled = new QCheckBox(tr("Recording"), enableBox); enableBoxLayout->addWidget(m_recordEnabled); connect(m_playEnabled, SIGNAL(clicked()), this, SLOT(slotSetModified())); connect(m_recordEnabled, SIGNAL(clicked()), this, SLOT(slotSetModified())); enableBox->setLayout(enableBoxLayout); vbox->setLayout(vboxLayout); // populate the dialog populate(m_metronomeDevice->currentIndex()); // connect up the device list connect(m_metronomeDevice, SIGNAL(activated(int)), this, SLOT(populate(int))); // connect up the device list connect(m_metronomeDevice, SIGNAL(activated(int)), this, SLOT(slotSetModified())); metagrid->addWidget(m_buttonBox, 1, 0); metagrid->setRowStretch(0, 10); connect(m_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); setModified(false); }