void Loggable::log(shared_ptr<LogEntry> entry) { auto observer = m_logObserver.lock(); if (observer != nullptr) { observer->onLog(entry); } }
void CLogger::log(const string & message, const string & level, const string & category) { SLogElement element; element.message = message; element.level = level; element.category = category; element.time = ptime(from_time_t(time(0))); _logs.push_back(element); ++_logCount; if (hasEventHandler("onLog")) { CEvent event(this, boost::assign::map_list_of("logItem", (void*)&element)); onLog(event); } if (autoFlush > 0 && _logCount >= autoFlush && !_processing) { _processing = true; flush(autoDump); _processing = false; } }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), logNewMessages(0), logHasErrors(false), showNewLogNumber(true) { ui->setupUi(this); setWindowIcon(QIcon(c_icon_app)); setWindowTitle(c_qtau_name); setAcceptDrops(true); setContextMenuPolicy(Qt::NoContextMenu); //----------------------------------------- QLabel *meterLabel = new QLabel(QString("%1/%2") .arg(ns.notesInBar).arg(ns.noteLength), this); QLabel *tempoLabel = new QLabel(QString("%1 %2").arg(ns.tempo).arg(tr("bpm")), this); QHBoxLayout *bpmHBL = new QHBoxLayout(); bpmHBL->setContentsMargins(0,0,0,0); bpmHBL->addSpacing(5); bpmHBL->addWidget(meterLabel); bpmHBL->addWidget(tempoLabel); bpmHBL->addSpacing(5); QFrame *tempoPanel = new QFrame(this); tempoPanel->setMinimumSize(c_piano_min_width, c_meter_min_height); tempoPanel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); tempoPanel->setContentsMargins(1,0,1,1); tempoPanel->setFrameStyle(QFrame::Panel | QFrame::Raised); tempoPanel->setLayout(bpmHBL); meter = new qtauMeterBar(this); meter->setMinimumHeight(c_meter_min_height); meter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); meter->setContentsMargins(0,0,0,0); piano = new qtauPiano(ui->centralWidget); piano->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); piano->setMinimumSize(c_piano_min_width, c_piano_min_height); piano->setContentsMargins(0,0,0,0); zoom = new QSlider(Qt::Horizontal, ui->centralWidget); zoom->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); zoom->setRange(0, c_zoom_num - 1); zoom->setSingleStep(1); zoom->setPageStep(1); zoom->setValue(cdef_zoom_index); zoom->setMinimumWidth(c_piano_min_width); zoom->setGeometry(0,0,c_piano_min_width,10); zoom->setContentsMargins(0,0,0,0); noteEditor = new qtauNoteEditor(ui->centralWidget); noteEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); noteEditor->setContentsMargins(0,0,0,0); hscr = new QScrollBar(Qt::Horizontal, ui->centralWidget); vscr = new QScrollBar(Qt::Vertical, ui->centralWidget); hscr->setContentsMargins(0,0,0,0); vscr->setContentsMargins(0,0,0,0); hscr->setRange(0, ns.note.width() * ns.notesInBar * cdef_bars); vscr->setRange(0, ns.note.height() * 12 * ns.numOctaves); hscr->setSingleStep(ns.note.width()); vscr->setSingleStep(ns.note.height()); hscr->setContextMenuPolicy(Qt::NoContextMenu); vscr->setContextMenuPolicy(Qt::NoContextMenu); //---- vocal and music waveform panels, hidden until synthesized (vocal wave) and/or loaded (music wave) QScrollBar *dummySB = new QScrollBar(this); dummySB->setOrientation(Qt::Vertical); dummySB->setRange(0,0); dummySB->setEnabled(false); QFrame *vocalControls = new QFrame(this); vocalControls->setContentsMargins(0,0,0,0); vocalControls->setMinimumSize(c_piano_min_width, c_waveform_min_height); vocalControls->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); vocalControls->setFrameStyle(QFrame::Panel | QFrame::Raised); vocalWave = new qtauWaveform(this); vocalWave->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); vocalWave->setMinimumHeight(c_waveform_min_height); vocalWave->setContentsMargins(0,0,0,0); QHBoxLayout *vocalWaveL = new QHBoxLayout(); vocalWaveL->setContentsMargins(0,0,0,0); vocalWaveL->setSpacing(0); vocalWaveL->addWidget(vocalControls); vocalWaveL->addWidget(vocalWave); vocalWaveL->addWidget(dummySB); vocalWavePanel = new QWidget(this); vocalWavePanel->setContentsMargins(0,0,0,0); vocalWavePanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); vocalWavePanel->setLayout(vocalWaveL); vocalWavePanel->setVisible(false); //--------- QScrollBar *dummySB2 = new QScrollBar(this); dummySB2->setOrientation(Qt::Vertical); dummySB2->setRange(0,0); dummySB2->setEnabled(false); QFrame *musicControls = new QFrame(this); musicControls->setContentsMargins(0,0,0,0); musicControls->setMinimumSize(c_piano_min_width, c_waveform_min_height); musicControls->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); musicControls->setFrameStyle(QFrame::Panel | QFrame::Raised); musicWave = new qtauWaveform(this); musicWave->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); musicWave->setMinimumHeight(c_waveform_min_height); musicWave->setContentsMargins(0,0,0,0); QHBoxLayout *musicWaveL = new QHBoxLayout(); musicWaveL->setContentsMargins(0,0,0,0); musicWaveL->setSpacing(0); musicWaveL->addWidget(musicControls); musicWaveL->addWidget(musicWave); musicWaveL->addWidget(dummySB2); musicWavePanel = new QWidget(this); musicWavePanel->setContentsMargins(0,0,0,0); musicWavePanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); musicWavePanel->setLayout(musicWaveL); musicWavePanel->setVisible(false); //---- notes' dynamics setup area -------------- QGridLayout *dynBtnL = new QGridLayout(); QString btnNames[c_dynbuttons_num] = {"VEL", "DYN", "BRE", "BRI", "CLE", "OPE", "GEN", "POR", "PIT", "PBS"}; for (int i = 0; i < c_dynbuttons_num; ++i) { qtauDynLabel *l = new qtauDynLabel(btnNames[i], this); l->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); dynBtnL->addWidget(l, i / 2, i % 2, 1, 1); l->setStyleSheet(c_dynlbl_css_off); l->setFrameStyle(QFrame::Box); l->setLineWidth(1); connect(l, SIGNAL(leftClicked()), SLOT(dynBtnLClicked())); connect(l, SIGNAL(rightClicked()), SLOT(dynBtnRClicked())); } dynBtnL->setRowStretch(c_dynbuttons_num / 2, 100); QFrame *dynBtnPanel = new QFrame(this); dynBtnPanel->setContentsMargins(0,0,0,0); dynBtnPanel->setMinimumSize(c_piano_min_width, c_drawzone_min_height); dynBtnPanel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); dynBtnPanel->setFrameStyle(QFrame::Panel | QFrame::Raised); dynBtnPanel->setLayout(dynBtnL); drawZone = new qtauDynDrawer(ui->centralWidget); drawZone->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); drawZone->setMinimumHeight(c_drawzone_min_height); drawZone->setContentsMargins(0,0,0,0); QScrollBar *dummySB3 = new QScrollBar(this); dummySB3->setOrientation(Qt::Vertical); dummySB3->setRange(0,0); dummySB3->setEnabled(false); QHBoxLayout *singParamsL = new QHBoxLayout(); singParamsL->setContentsMargins(0,0,0,0); singParamsL->setSpacing(0); singParamsL->addWidget(dynBtnPanel); singParamsL->addWidget(drawZone); singParamsL->addWidget(dummySB3); drawZonePanel = new QWidget(this); drawZonePanel->setContentsMargins(0,0,0,0); drawZonePanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); drawZonePanel->setLayout(singParamsL); //---- Combining editor panels into hi-level layout ------ QGridLayout *gl = new QGridLayout(); gl->setContentsMargins(0,0,0,0); gl->setSpacing(0); gl->addWidget(tempoPanel, 0, 0, 1, 1); gl->addWidget(meter, 0, 1, 1, 1); gl->addWidget(piano, 1, 0, 1, 1); gl->addWidget(zoom, 2, 0, 1, 1); gl->addWidget(noteEditor, 1, 1, 1, 1); gl->addWidget(hscr, 2, 1, 1, 1); gl->addWidget(vscr, 1, 2, 1, 1); QWidget *editorUpperPanel = new QWidget(this); editorUpperPanel->setContentsMargins(0,0,0,0); editorUpperPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); editorUpperPanel->setMaximumSize(9000,9000); editorUpperPanel->setLayout(gl); editorSplitter = new QSplitter(Qt::Vertical, this); editorSplitter->setContentsMargins(0,0,0,0); editorSplitter->addWidget(editorUpperPanel); editorSplitter->addWidget(vocalWavePanel); editorSplitter->addWidget(musicWavePanel); editorSplitter->addWidget(drawZonePanel); editorSplitter->setStretchFactor(0, 1); editorSplitter->setStretchFactor(1, 0); editorSplitter->setStretchFactor(2, 0); editorSplitter->setStretchFactor(3, 0); QVBoxLayout *edVBL = new QVBoxLayout(); edVBL->setContentsMargins(0,0,0,0); edVBL->addWidget(editorSplitter); QWidget *editorPanel = new QWidget(this); editorPanel->setContentsMargins(0,0,0,0); editorPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); editorPanel->setMaximumSize(9000,9000); editorPanel->setLayout(edVBL); //---- Voicebank setup tab --------------------- QWidget *voicesPanel = new QWidget(this); voicesPanel->setContentsMargins(0,0,0,0); voicesPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); voicesPanel->setMaximumSize(9000,9000); //---- Plugins setup tab ----------------------- QWidget *pluginsPanel = new QWidget(this); pluginsPanel->setContentsMargins(0,0,0,0); pluginsPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); pluginsPanel->setMaximumSize(9000,9000); //---- Settings tab ---------------------------- QWidget *settingsPanel = new QWidget(this); settingsPanel->setContentsMargins(0,0,0,0); settingsPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); settingsPanel->setMaximumSize(9000,9000); //---- Documentation tab ----------------------- QWidget *docsPanel = new QWidget(this); docsPanel->setContentsMargins(0,0,0,0); docsPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); docsPanel->setMaximumSize(9000,9000); QTextEdit *docpad = new QTextEdit(this); docpad->setReadOnly(true); docpad->setUndoRedoEnabled(false); docpad->setContextMenuPolicy(Qt::NoContextMenu); QFile embeddedDocTxt(c_doc_txt); if (embeddedDocTxt.open(QFile::ReadOnly)) { QTextStream ts(&embeddedDocTxt); ts.setAutoDetectUnicode(true); ts.setCodec("UTF-8"); docpad->setText(ts.readAll()); embeddedDocTxt.close(); } QGridLayout *docL = new QGridLayout(); docL->setContentsMargins(0,0,0,0); docL->addWidget(docpad, 0, 0, 1, 1); docsPanel->setLayout(docL); //---- Log tab --------------------------------- QWidget *logPanel = new QWidget(this); logPanel->setContentsMargins(0,0,0,0); logPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); logPanel->setMaximumSize(9000,9000); logpad = new QTextEdit(this); logpad->setReadOnly(true); logpad->setUndoRedoEnabled(false); logpad->setContextMenuPolicy(Qt::NoContextMenu); logpad->setStyleSheet("p, pre { white-space: 1.2; }"); QGridLayout *logL = new QGridLayout(); logL->setContentsMargins(0,0,0,0); logL->addWidget(logpad, 0, 0, 1, 1); logPanel->setLayout(logL); //---- Combining tabs togeter ------------------ tabs = new QTabWidget(this); tabs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tabs->setContentsMargins(0,0,0,0); tabs->setMaximumSize(9000, 9000); tabs->setTabPosition(QTabWidget::South); tabs->setMovable(false); // just to be sure tabs->addTab(editorPanel, QIcon(c_icon_editor), tr("Editor")); tabs->addTab(voicesPanel, QIcon(c_icon_voices), tr("Voices")); tabs->addTab(pluginsPanel, QIcon(c_icon_plugins), tr("Plugins")); tabs->addTab(settingsPanel, QIcon(c_icon_settings), tr("Settings")); tabs->addTab(docsPanel, QIcon(c_icon_doc), tr("Documentation")); tabs->addTab(logPanel, QIcon(c_icon_log), tr("Log")); tabs->widget(0)->setContentsMargins(0,0,0,0); tabs->widget(1)->setContentsMargins(0,0,0,0); tabs->widget(2)->setContentsMargins(0,0,0,0); tabs->widget(3)->setContentsMargins(0,0,0,0); tabs->widget(4)->setContentsMargins(0,0,0,0); tabs->widget(5)->setContentsMargins(0,0,0,0); logTabTextColor = tabs->tabBar()->tabTextColor(5); connect(tabs, SIGNAL(currentChanged(int)), SLOT(onTabSelected(int))); QVBoxLayout *vbl = new QVBoxLayout(); vbl->setContentsMargins(0,0,0,0); vbl->addWidget(tabs); ui->centralWidget->setContentsMargins(0,0,0,0); ui->centralWidget->setLayout(vbl); //---- Toolbars -------------------------------- QToolBar *fileTB = new QToolBar("Fileops", this); QToolBar *playerTB = new QToolBar("Playback", this); QToolBar *toolsTB = new QToolBar("Toolset", this); fileTB ->setFloatable(false); playerTB->setFloatable(false); toolsTB ->setFloatable(false); fileTB->addAction(ui->actionSave); fileTB->addAction(ui->actionSave_audio_as); fileTB->addAction(ui->actionUndo); fileTB->addAction(ui->actionRedo); playerTB->addAction(ui->actionPlay); playerTB->addAction(ui->actionStop); playerTB->addAction(ui->actionBack); playerTB->addAction(ui->actionRepeat); volume = new QSlider(Qt::Horizontal, this); volume->setMaximum(100); volume->setSingleStep(1); volume->setPageStep(1); volume->setValue(settings.value(c_key_sound, 50).toInt()); volume->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); connect(playerTB, SIGNAL(orientationChanged(Qt::Orientation)), volume, SLOT(setOrientation(Qt::Orientation))); muteBtn = new QAction(QIcon(c_icon_sound), "", this); muteBtn->setCheckable(true); connect(muteBtn, SIGNAL(toggled(bool)), SLOT(onMute(bool))); playerTB->addWidget(volume); playerTB->addAction(muteBtn); QComboBox *quantizeCombo = new QComboBox(this); QComboBox *lengthCombo = new QComboBox(this); quantizeCombo->addItems(QStringList() << "Q/4" << "Q/8" << "Q/16" << "Q/32" << "Q/64"); lengthCombo ->addItems(QStringList() << "♪/4" << "♪/8" << "♪/16" << "♪/32" << "♪/64"); quantizeCombo->setCurrentIndex(3); lengthCombo ->setCurrentIndex(3); toolsTB->addAction(ui->actionEdit_Mode); toolsTB->addAction(ui->actionGrid_Snap); toolsTB->addSeparator(); toolsTB->addWidget(quantizeCombo); toolsTB->addWidget(lengthCombo); addToolBar(fileTB); addToolBar(playerTB); addToolBar(toolsTB); toolbars.append(fileTB); toolbars.append(playerTB); toolbars.append(toolsTB); //---------------------------------------------- connect(quantizeCombo, SIGNAL(currentIndexChanged(int)), SLOT(onQuantizeSelected(int))); connect(lengthCombo, SIGNAL(currentIndexChanged(int)), SLOT(onNotelengthSelected(int))); connect(vsLog::instance(), &vsLog::message, this, &MainWindow::onLog); connect(piano, &qtauPiano ::heightChanged, this, &MainWindow::onPianoHeightChanged); connect(noteEditor, &qtauNoteEditor ::widthChanged, this, &MainWindow::onNoteEditorWidthChanged); connect(meter, &qtauMeterBar ::scrolled, this, &MainWindow::notesHScrolled); connect(piano, &qtauPiano ::scrolled, this, &MainWindow::notesVScrolled); connect(drawZone, &qtauDynDrawer ::scrolled, this, &MainWindow::notesHScrolled); connect(noteEditor, &qtauNoteEditor ::vscrolled, this, &MainWindow::notesVScrolled); connect(noteEditor, &qtauNoteEditor ::hscrolled, this, &MainWindow::notesHScrolled); connect(vocalWave, &qtauWaveform ::scrolled, this, &MainWindow::notesHScrolled); connect(musicWave, &qtauWaveform ::scrolled, this, &MainWindow::notesHScrolled); connect(vscr, &QScrollBar ::valueChanged, this, &MainWindow::vertScrolled); connect(hscr, &QScrollBar ::valueChanged, this, &MainWindow::horzScrolled); connect(noteEditor, &qtauNoteEditor ::rmbScrolled, this, &MainWindow::onEditorRMBScrolled); connect(noteEditor, &qtauNoteEditor ::requestsOffset, this, &MainWindow::onEditorRequestOffset); connect(zoom, &QSlider ::valueChanged, this, &MainWindow::onZoomed); connect(meter, &qtauMeterBar ::zoomed, this, &MainWindow::onEditorZoomed); connect(noteEditor, &qtauNoteEditor ::zoomed, this, &MainWindow::onEditorZoomed); connect(drawZone, &qtauDynDrawer ::zoomed, this, &MainWindow::onEditorZoomed); connect(vocalWave, &qtauWaveform ::zoomed, this, &MainWindow::onEditorZoomed); connect(musicWave, &qtauWaveform ::zoomed, this, &MainWindow::onEditorZoomed); connect(ui->actionQuit, &QAction::triggered, [=]() { this->close(); }); connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::onOpenUST); connect(ui->actionSave, &QAction::triggered, this, &MainWindow::onSaveUST); connect(ui->actionSave_as, &QAction::triggered, this, &MainWindow::onSaveUSTAs); connect(ui->actionUndo, &QAction::triggered, this, &MainWindow::onUndo); connect(ui->actionRedo, &QAction::triggered, this, &MainWindow::onRedo); connect(ui->actionDelete, &QAction::triggered, this, &MainWindow::onDelete); connect(ui->actionEdit_Mode, &QAction::triggered, this, &MainWindow::onEditMode); connect(ui->actionGrid_Snap, &QAction::triggered, this, &MainWindow::onGridSnap); connect(ui->actionSave_audio_as, &QAction::triggered, this, &MainWindow::onSaveAudioAs); //---------------------------------------------- lastScoreDir = settings.value(c_key_dir_score, "").toString(); lastAudioDir = settings.value(c_key_dir_audio, "").toString(); audioExt = settings.value(c_key_audio_codec, "").toString(); showNewLogNumber = settings.value(c_key_show_lognum, true).toBool(); if (!settings.value(c_key_dynpanel_on, true).toBool()) { QList<int> panelSizes = editorSplitter->sizes(); panelSizes.last() = 0; editorSplitter->setSizes(panelSizes); } if (settings.value(c_key_win_max, false).toBool()) showMaximized(); else { QRect winGeom = geometry(); QRect setGeom = settings.value(c_key_win_size, QRect(winGeom.topLeft(), minimumSize())).value<QRect>(); if (setGeom.width() >= winGeom.width() && setGeom.height() >= setGeom.height()) setGeometry(setGeom); } //---------------------------------------------- vsLog::instance()->enableHistory(false); onLog(QString("\t%1 %2 @ %3").arg(tr("Launching QTau")).arg(c_qtau_ver).arg(__DATE__), ELog::success); onLog("\t---------------------------------------------", ELog::info); vsLog::r(); // print stored messages from program startup onLog("\t---------------------------------------------", ELog::info); vsLog::n(); }
void MqttClient::on_log(int level, const char *str) { emit onLog(level, QString(str)); }
void StreamProcessor::DispatchPacket<LogPacket>(const LogPacket &packet, const void *payloadData, size_t payloadSize) { onLog(m_streamThreadID, (LogPriority)packet.priority, TimestampToSeconds(packet.timestamp), (const char*)payloadData, payloadSize); }