From eb013918c17ac19b21845ded977aeee26bdf8275 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 16 Apr 2014 11:23:46 +0200 Subject: New tabbed workflow with 'auto' preview functionality. --- dgedit/canvastoolselections.cc | 101 ++++++++++---- dgedit/canvastoolselections.h | 12 +- dgedit/mainwindow.cc | 289 ++++++++++++++++++++++++++--------------- dgedit/mainwindow.h | 15 ++- 4 files changed, 284 insertions(+), 133 deletions(-) diff --git a/dgedit/canvastoolselections.cc b/dgedit/canvastoolselections.cc index 30f8970..d0aa481 100644 --- a/dgedit/canvastoolselections.cc +++ b/dgedit/canvastoolselections.cc @@ -34,8 +34,9 @@ #define unmapX(x) canvas->unmapX(x) #define unmapY(x) canvas->unmapY(x) -CanvasToolSelections::CanvasToolSelections(Canvas *c, Selections &s) - : selections(s) +CanvasToolSelections::CanvasToolSelections(Canvas *c, Selections &s, + Selections &p) + : selections(s), selections_preview(p) { threshold = 0.5; // Default from CanvasToolThreshold @@ -48,7 +49,8 @@ CanvasToolSelections::CanvasToolSelections(Canvas *c, Selections &s) colSel = QColor(255, 0, 0, 160); colActiveSelBg = QColor(255, 255, 0, 60); colActiveSel = QColor(255, 255, 0, 160); - + colPreviewSelBg = QColor(0, 0, 255, 60); + colPreviewSel = QColor(0, 0, 255, 160); } bool CanvasToolSelections::mouseMoveEvent(QMouseEvent *event) @@ -162,29 +164,54 @@ void CanvasToolSelections::paintEvent(QPaintEvent *event, QPainter &painter) int pos = unmapX(event->rect().x()); int width = unmapX(event->rect().width()); - QVector ids = selections.ids(); - QVector::iterator i = ids.begin(); - while(i != ids.end()) { - Selection sel = selections.get(*i); - int from = sel.from; - int to = sel.to; - int fadein = sel.fadein; - int fadeout = sel.fadeout; - if(from > pos + width || to + width < pos) { i++; continue; } - if(selections.active() == *i) { - painter.setBrush(colActiveSelBg); - painter.setPen(colActiveSel); - } else { - painter.setBrush(colSelBg); - painter.setPen(colSel); + { + QVector ids = selections.ids(); + QVector::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections.get(*i); + int from = sel.from; + int to = sel.to; + int fadein = sel.fadein; + int fadeout = sel.fadeout; + if(from > pos + width || to + width < pos) { i++; continue; } + if(selections.active() == *i) { + painter.setBrush(colActiveSelBg); + painter.setPen(colActiveSel); + } else { + painter.setBrush(colSelBg); + painter.setPen(colSel); + } + painter.drawRect(mapX(from), mapY(-1.0), + mapX(to) - mapX(from), mapY(1.0) - mapY(-1.0)); + painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(-1.0)); + painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(1.0)); + painter.drawLine(mapX(to - fadeout), mapY(-1.0), mapX(to), mapY(0.0)); + painter.drawLine(mapX(to - fadeout), mapY(1.0), mapX(to), mapY(0.0)); + i++; + } + } + + if(show_preview) { + QVector ids = selections_preview.ids(); + QVector::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections_preview.get(*i); + int from = sel.from; + int to = sel.to; + int fadein = sel.fadein; + int fadeout = sel.fadeout; + if(from > pos + width || to + width < pos) { i++; continue; } + painter.setBrush(colPreviewSelBg); + painter.setPen(colPreviewSel); + + painter.drawRect(mapX(from), mapY(-1.0), + mapX(to) - mapX(from), mapY(1.0) - mapY(-1.0)); + painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(-1.0)); + painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(1.0)); + painter.drawLine(mapX(to - fadeout), mapY(-1.0), mapX(to), mapY(0.0)); + painter.drawLine(mapX(to - fadeout), mapY(1.0), mapX(to), mapY(0.0)); + i++; } - painter.drawRect(mapX(from), mapY(-1.0), - mapX(to) - mapX(from), mapY(1.0) - mapY(-1.0)); - painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(-1.0)); - painter.drawLine(mapX(from), mapY(0.0), mapX(from + fadein), mapY(1.0)); - painter.drawLine(mapX(to - fadeout), mapY(-1.0), mapX(to), mapY(0.0)); - painter.drawLine(mapX(to - fadeout), mapY(1.0), mapX(to), mapY(0.0)); - i++; } } @@ -213,10 +240,22 @@ void CanvasToolSelections::fadeoutChanged(int t) } void CanvasToolSelections::autoCreateSelections() +{ + doAutoCreateSelections(false); +} + +void CanvasToolSelections::autoCreateSelectionsPreview() +{ + doAutoCreateSelections(true); +} + +void CanvasToolSelections::doAutoCreateSelections(bool preview) { float *data = canvas->data; size_t size = canvas->size; + if(preview) selections_preview.clear(); + for(size_t i = 0; i < size; i++) { if(fabs(data[i]) > fabs(threshold)) { int from = i; @@ -247,7 +286,11 @@ void CanvasToolSelections::autoCreateSelections() } Selection s(from, to, 2, ((to - from) / 3) * fadeout); - selections.add(s); + if(preview) { + selections_preview.add(s); + } else { + selections.add(s); + } i = to+1; } @@ -263,3 +306,9 @@ void CanvasToolSelections::clearSelections() canvas->setCursor(Qt::ArrowCursor); canvas->update(); } + +void CanvasToolSelections::setShowPreview(bool s) +{ + show_preview = s; + canvas->update(); +} diff --git a/dgedit/canvastoolselections.h b/dgedit/canvastoolselections.h index 8b877de..59786a7 100644 --- a/dgedit/canvastoolselections.h +++ b/dgedit/canvastoolselections.h @@ -38,7 +38,8 @@ class CanvasToolSelections : public CanvasTool { Q_OBJECT public: - CanvasToolSelections(Canvas *canvas, Selections &selections); + CanvasToolSelections(Canvas *canvas, Selections &selections, + Selections &selections_preview); QString name() { return "Selections"; } bool mouseMoveEvent(QMouseEvent *event); @@ -55,12 +56,16 @@ signals: public slots: void autoCreateSelections(); + void autoCreateSelectionsPreview(); void clearSelections(); void thresholdChanged(double threshold); void noiseFloorChanged(int t); void fadeoutChanged(int t); + void setShowPreview(bool show_preview); private: + void doAutoCreateSelections(bool preview); + bool selection_is_moving_left; bool selection_is_moving_right; @@ -74,8 +79,13 @@ private: QColor colSel; QColor colActiveSelBg; QColor colActiveSel; + QColor colPreviewSelBg; + QColor colPreviewSel; Selections &selections; + Selections &selections_preview; + + bool show_preview; }; #endif/*__DRUMGIZMO_CANVASTOOLSELECTIONS_H__*/ diff --git a/dgedit/mainwindow.cc b/dgedit/mainwindow.cc index 70b6f78..b64d710 100644 --- a/dgedit/mainwindow.cc +++ b/dgedit/mainwindow.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include @@ -64,36 +65,41 @@ static void addTool(QToolBar *toolbar, Canvas *canvas, CanvasTool *tool) static CanvasToolListen *g_listen; MainWindow::MainWindow() { + { + int start = 44100 * 60; + Selection p(start, start + 44100 * 60, 0, 0); // one minute selection + selections_preview.add(p); + } + QWidget *central = new QWidget(); QHBoxLayout *lh = new QHBoxLayout(); QVBoxLayout *lv = new QVBoxLayout(); central->setLayout(lv); setCentralWidget(central); - extractor = new AudioExtractor(session, this); + extractor = new AudioExtractor(selections, this); canvas = new Canvas(this); - player.start(); - QToolBar *toolbar = addToolBar("Tools"); g_listen = new CanvasToolListen(canvas, player); CanvasTool *listen = g_listen; addTool(toolbar, canvas, listen); - CanvasTool *threshold = new CanvasToolThreshold(canvas); + threshold = new CanvasToolThreshold(canvas); addTool(toolbar, canvas, threshold); - selections = new CanvasToolSelections(canvas, session); + tool_selections = new CanvasToolSelections(canvas, selections, + selections_preview); connect(threshold, SIGNAL(thresholdChanged(double)), - selections, SLOT(thresholdChanged(double))); - connect(&session, SIGNAL(activeChanged(sel_id_t)), + tool_selections, SLOT(thresholdChanged(double))); + connect(&selections, SIGNAL(activeChanged(sel_id_t)), canvas, SLOT(update())); - addTool(toolbar, canvas, selections); + addTool(toolbar, canvas, tool_selections); QMenu *fileMenu = menuBar()->addMenu("&File"); QAction *act_quit = new QAction("&Quit", this); fileMenu->addAction(act_quit); connect(act_quit, SIGNAL(triggered()), this, SLOT(close())); - QWidget *dock = new QWidget(); + // QWidget *dock = new QWidget(); yoffset = new QScrollBar(Qt::Vertical); yoffset->setRange(0, MAXVAL); yoffset->setPageStep(PAGESTEP); @@ -118,12 +124,13 @@ MainWindow::MainWindow() xoffset->setSingleStep(SINGLESTEP); connect(xoffset, SIGNAL(valueChanged(int)), this, SLOT(setXOffset(int))); - sorter = new SampleSorter(session); - connect(&session, SIGNAL(added(sel_id_t)), + sorter = new SampleSorter(selections); + connect(&selections, SIGNAL(added(sel_id_t)), sorter, SLOT(addSelection(sel_id_t))); - connect(&session, SIGNAL(updated(sel_id_t)), sorter, SLOT(relayout())); - connect(&session, SIGNAL(removed(sel_id_t)), sorter, SLOT(relayout())); - connect(&session, SIGNAL(activeChanged(sel_id_t)), sorter, SLOT(relayout())); + connect(&selections, SIGNAL(updated(sel_id_t)), sorter, SLOT(relayout())); + connect(&selections, SIGNAL(removed(sel_id_t)), sorter, SLOT(relayout())); + connect(&selections, SIGNAL(activeChanged(sel_id_t)), + sorter, SLOT(relayout())); QPushButton *btn_playsamples = new QPushButton("Play samples"); connect(btn_playsamples, SIGNAL(clicked()), this, SLOT(playSamples())); @@ -142,33 +149,145 @@ MainWindow::MainWindow() lv->addWidget(btn_playsamples); lv->addWidget(sb_playsamples); + + + + // under tab widget + + /* + attribs_layout->addWidget(new QLabel("Player volume:"), 7, 1, 1, 2); + lineed_slider4 = new QLineEdit(); + lineed_slider4->setReadOnly(true); + lineed_slider4->setValidator(new QIntValidator(0, 1000000, lineed_slider4)); + attribs_layout->addWidget(lineed_slider4, 8, 1); + QSlider *slider4 = new QSlider(Qt::Horizontal); + slider4->setRange(0, 1000000); + connect(slider4, SIGNAL(sliderMoved(int)), + this, SLOT(setVolumeLineEd(int))); + connect(slider4, SIGNAL(sliderMoved(int)), + listen, SLOT(setVolume(int))); + slider4->setValue(100000); + lineed_slider4->setText("100000"); + attribs_layout->addWidget(slider4, 8, 2); + + configs->addLayout(attribs_layout); + */ + + + + QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this); + dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + + QTabWidget *tabs = new QTabWidget(this); + tabs->addTab(createFilesTab(), "Files"); + generateTabId = tabs->addTab(createGenerateTab(), "Generate"); + tabs->addTab(createEditTab(), "Edit"); + tabs->addTab(createExportTab(), "Export"); + connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); + + dockWidget->setWidget(tabs); + addDockWidget(Qt::LeftDockWidgetArea, dockWidget); + // dock->setLayout(configs); + + yscale->setValue(MAXVAL); + yoffset->setValue(MAXVAL/2); + xscale->setValue(0); + xoffset->setValue(0); + + loadSettings(); + + QSettings settings("presets.ini", QSettings::IniFormat); + QStringList list = settings.childGroups(); + for(int i = 0; i != list.size(); i++) { + QString presetname = list.at(i); + Preset p; + settings.beginGroup(presetname); + p.prefix = settings.value("prefix", "unknown").toString(); + p.attacklength = settings.value("attacklength", 0).toInt(); + p.falloff = settings.value("falloff", 0).toInt(); + p.fadelength = settings.value("fadelength", 0).toInt(); + settings.endGroup(); + QVariant v; + v.setValue(p); + presets->addItem(presetname, v); + } + + statusBar()->showMessage("Ready"); +} + +MainWindow::~MainWindow() +{ +} + +void MainWindow::tabChanged(int tabid) +{ + tool_selections->setShowPreview(tabid == generateTabId); +} + +QWidget *MainWindow::createFilesTab() +{ + QWidget *w = new QWidget(); + QVBoxLayout *l = new QVBoxLayout(); + w->setLayout(l); + + l->addWidget(new QLabel("Files: (double-click to set as master)")); + QPushButton *loadbtn = new QPushButton(); + loadbtn->setText("Add files..."); + l->addWidget(loadbtn); + + filelist = new FileList(); + connect(filelist, SIGNAL(masterFileChanged(QString)), + this, SLOT(loadFile(QString))); + connect(loadbtn, SIGNAL(clicked()), filelist, SLOT(addFiles())); + connect(filelist, SIGNAL(fileAdded(QString, QString)), + extractor, SLOT(addFile(QString, QString))); + connect(filelist, SIGNAL(fileRemoved(QString, QString)), + extractor, SLOT(removeFile(QString, QString))); + connect(filelist, SIGNAL(nameChanged(QString, QString)), + extractor, SLOT(changeName(QString, QString))); + l->addWidget(filelist); + + return w; +} + +QWidget *MainWindow::createEditTab() +{ + return new QWidget(); +} + +QWidget *MainWindow::createGenerateTab() +{ + QWidget *w = new QWidget(); + QVBoxLayout *l = new QVBoxLayout(); + w->setLayout(l); + QHBoxLayout *btns = new QHBoxLayout(); QPushButton *autosel = new QPushButton(); - autosel->setText("Auto"); - connect(autosel, SIGNAL(clicked()), selections, SLOT(clearSelections())); - connect(autosel, SIGNAL(clicked()), selections, SLOT(autoCreateSelections())); + autosel->setText("Generate"); + connect(autosel, SIGNAL(clicked()), + tool_selections, SLOT(clearSelections())); + connect(autosel, SIGNAL(clicked()), + tool_selections, SLOT(autoCreateSelections())); + + connect(threshold, SIGNAL(thresholdChanged(double)), + tool_selections, SLOT(autoCreateSelectionsPreview())); QPushButton *clearsel = new QPushButton(); clearsel->setText("Clear"); - connect(clearsel, SIGNAL(clicked()), selections, SLOT(clearSelections())); - - QPushButton *exportsel = new QPushButton(); - exportsel->setText("Export"); - connect(exportsel, SIGNAL(clicked()), this, SLOT(doExport())); + connect(clearsel, SIGNAL(clicked()), + tool_selections, SLOT(clearSelections())); btns->addWidget(autosel); btns->addWidget(clearsel); - btns->addWidget(exportsel); - - QVBoxLayout *configs = new QVBoxLayout(); - configs->addLayout(btns); + l->addLayout(btns); - configs->addWidget(new QLabel("Presets:")); + l->addWidget(new QLabel("Presets:")); presets = new QComboBox(); - connect(presets, SIGNAL(currentIndexChanged(int)), this, SLOT(setPreset(int))); - configs->addWidget(presets); + connect(presets, SIGNAL(currentIndexChanged(int)), + this, SLOT(setPreset(int))); + l->addWidget(presets); QGridLayout *attribs_layout = new QGridLayout(); @@ -184,6 +303,9 @@ MainWindow::MainWindow() this, SLOT(setAttackLengthLineEd(int))); connect(slider_attacklength, SIGNAL(sliderMoved(int)), sorter, SLOT(setAttackLength(int))); + connect(slider_attacklength, SIGNAL(sliderMoved(int)), + tool_selections, SLOT(autoCreateSelectionsPreview())); + slider_attacklength->setValue(666); attribs_layout->addWidget(slider_attacklength, 2, 2); @@ -197,7 +319,10 @@ MainWindow::MainWindow() connect(slider_falloff, SIGNAL(sliderMoved(int)), this, SLOT(setFalloffLineEd(int))); connect(slider_falloff, SIGNAL(sliderMoved(int)), - selections, SLOT(noiseFloorChanged(int))); + tool_selections, SLOT(noiseFloorChanged(int))); + connect(slider_falloff, SIGNAL(sliderMoved(int)), + tool_selections, SLOT(autoCreateSelectionsPreview())); + slider_falloff->setValue(666); attribs_layout->addWidget(slider_falloff, 4, 2); @@ -212,34 +337,33 @@ MainWindow::MainWindow() connect(slider_fadelength, SIGNAL(sliderMoved(int)), this, SLOT(setFadeLengthLineEd(int))); connect(slider_fadelength, SIGNAL(sliderMoved(int)), - selections, SLOT(fadeoutChanged(int))); + tool_selections, SLOT(fadeoutChanged(int))); + connect(slider_fadelength, SIGNAL(sliderMoved(int)), + tool_selections, SLOT(autoCreateSelectionsPreview())); + slider_fadelength->setValue(666); attribs_layout->addWidget(slider_fadelength, 6, 2); - attribs_layout->addWidget(new QLabel("Player volume:"), 7, 1, 1, 2); - lineed_slider4 = new QLineEdit(); - lineed_slider4->setReadOnly(true); - lineed_slider4->setValidator(new QIntValidator(0, 1000000, lineed_slider4)); - attribs_layout->addWidget(lineed_slider4, 8, 1); - QSlider *slider4 = new QSlider(Qt::Horizontal); - slider4->setRange(0, 1000000); - connect(slider4, SIGNAL(sliderMoved(int)), - this, SLOT(setVolumeLineEd(int))); - connect(slider4, SIGNAL(sliderMoved(int)), - listen, SLOT(setVolume(int))); - slider4->setValue(100000); - lineed_slider4->setText("100000"); - attribs_layout->addWidget(slider4, 8, 2); + l->addLayout(attribs_layout); - configs->addLayout(attribs_layout); + l->addStretch(); - configs->addWidget(new QLabel("Prefix:")); + return w; +} + +QWidget *MainWindow::createExportTab() +{ + QWidget *w = new QWidget(); + QVBoxLayout *l = new QVBoxLayout(); + w->setLayout(l); + + l->addWidget(new QLabel("Prefix:")); prefix = new QLineEdit(); connect(prefix, SIGNAL(textChanged(const QString &)), extractor, SLOT(setOutputPrefix(const QString &))); - configs->addWidget(prefix); + l->addWidget(prefix); - configs->addWidget(new QLabel("Export path:")); + l->addWidget(new QLabel("Export path:")); QHBoxLayout *lo_exportp = new QHBoxLayout(); lineed_exportp = new QLineEdit(); connect(lineed_exportp, SIGNAL(textChanged(const QString &)), @@ -249,59 +373,16 @@ MainWindow::MainWindow() connect(btn_browse, SIGNAL(clicked()), this, SLOT(browse())); lo_exportp->addWidget(btn_browse); - configs->addLayout(lo_exportp); - - configs->addWidget(new QLabel("Files: (double-click to set as master)")); - QPushButton *loadbtn = new QPushButton(); - loadbtn->setText("Add files..."); - configs->addWidget(loadbtn); + l->addLayout(lo_exportp); - filelist = new FileList(); - connect(filelist, SIGNAL(masterFileChanged(QString)), - this, SLOT(loadFile(QString))); - connect(loadbtn, SIGNAL(clicked()), filelist, SLOT(addFiles())); - connect(filelist, SIGNAL(fileAdded(QString, QString)), - extractor, SLOT(addFile(QString, QString))); - connect(filelist, SIGNAL(fileRemoved(QString, QString)), - extractor, SLOT(removeFile(QString, QString))); - connect(filelist, SIGNAL(nameChanged(QString, QString)), - extractor, SLOT(changeName(QString, QString))); - configs->addWidget(filelist); - - QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this); - dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - dockWidget->setWidget(dock); - addDockWidget(Qt::LeftDockWidgetArea, dockWidget); - dock->setLayout(configs); - - yscale->setValue(MAXVAL); - yoffset->setValue(MAXVAL/2); - xscale->setValue(0); - xoffset->setValue(0); - - loadSettings(); - - QSettings settings("presets.ini", QSettings::IniFormat); - QStringList list = settings.childGroups(); - for(int i = 0; i != list.size(); i++) { - QString presetname = list.at(i); - Preset p; - settings.beginGroup(presetname); - p.prefix = settings.value("prefix", "unknown").toString(); - p.attacklength = settings.value("attacklength", 0).toInt(); - p.falloff = settings.value("falloff", 0).toInt(); - p.fadelength = settings.value("fadelength", 0).toInt(); - settings.endGroup(); - QVariant v; - v.setValue(p); - presets->addItem(presetname, v); - } + QPushButton *exportsel = new QPushButton(); + exportsel->setText("Export"); + connect(exportsel, SIGNAL(clicked()), this, SLOT(doExport())); + l->addWidget(exportsel); - statusBar()->showMessage("Ready"); -} + l->addStretch(); -MainWindow::~MainWindow() -{ + return w; } void MainWindow::setAttackLengthLineEd(int value) @@ -329,12 +410,12 @@ void MainWindow::playSamples() { //unsigned int length = 44100 / 4; // 0.25 seconds in 44k1Hz - QVector ids = session.ids(); + QVector ids = selections.ids(); for(int v1 = 0; v1 < ids.size(); v1++) { for(int v2 = 0; v2 < ids.size(); v2++) { - Selection sel1 = session.get(ids[v1]); - Selection sel2 = session.get(ids[v2]); + Selection sel1 = selections.get(ids[v1]); + Selection sel2 = selections.get(ids[v2]); if(sel1.energy < sel2.energy) { sel_id_t vtmp = ids[v1]; @@ -346,7 +427,7 @@ void MainWindow::playSamples() QVector::iterator i = ids.begin(); while(i != ids.end()) { - Selection sel = session.get(*i); + Selection sel = selections.get(*i); unsigned int length = sb_playsamples->value() * 44100 / 1000; @@ -358,7 +439,7 @@ void MainWindow::playSamples() if(sample_length > length) to = sel.from + length; else sleep = length - sample_length; - session.setActive(*i); + selections.setActive(*i); g_listen->playRange(sel.from, to); usleep(1000000 * sleep / 44100); diff --git a/dgedit/mainwindow.h b/dgedit/mainwindow.h index cd13132..620c116 100644 --- a/dgedit/mainwindow.h +++ b/dgedit/mainwindow.h @@ -39,6 +39,7 @@ #include "samplesorter.h" #include "filelist.h" #include "canvastoolselections.h" +#include "canvastoolthreshold.h" #include "selection.h" #include "player.h" @@ -67,6 +68,7 @@ public slots: void playSamples(); void setPreset(int); void browse(); + void tabChanged(int tabid); protected: void closeEvent(QCloseEvent*); @@ -75,9 +77,17 @@ private: void loadSettings(); void saveSettings(); + QWidget *createFilesTab(); + QWidget *createEditTab(); + QWidget *createGenerateTab(); + QWidget *createExportTab(); + + int generateTabId; + SampleSorter *sorter; Canvas *canvas; - CanvasToolSelections *selections; + CanvasToolSelections *tool_selections; + CanvasToolThreshold *threshold; AudioExtractor *extractor; FileList *filelist; QScrollBar *yoffset; @@ -97,7 +107,8 @@ private: QLineEdit *lineed_exportp; // Session state information: - Selections session; + Selections selections; + Selections selections_preview; Player player; private slots: -- cgit v1.2.3