From b84aed1f555acfb5f28bdcb18534e5d8daaa08e4 Mon Sep 17 00:00:00 2001 From: hawkeyexp Date: Wed, 19 Sep 2018 19:35:34 +0200 Subject: [PATCH] Add folder select and scan --- assets/coverlogo.png | Bin 0 -> 28227 bytes assets/mp3-hot.png | Bin 0 -> 3749 bytes assets/resources.qrc | 2 + assets/skin-hot.png | Bin .../f1x/openauto/autoapp/UI/MainWindow.hpp | 15 +- src/autoapp/UI/MainWindow.cpp | 258 +++- src/autoapp/UI/mainwindow.ui | 1366 +++++++++++------ 7 files changed, 1094 insertions(+), 547 deletions(-) create mode 100644 assets/coverlogo.png create mode 100644 assets/mp3-hot.png mode change 100755 => 100644 assets/skin-hot.png diff --git a/assets/coverlogo.png b/assets/coverlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..95ed3323283378dc009352e6f2f02865a42f4fc1 GIT binary patch literal 28227 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 P00000NkvXXu0mjfH%a^8 literal 0 HcmV?d00001 diff --git a/assets/resources.qrc b/assets/resources.qrc index 0e76303..d93c1d1 100644 --- a/assets/resources.qrc +++ b/assets/resources.qrc @@ -26,6 +26,8 @@ bug-hot.png eye-hot.png skin-hot.png + mp3-hot.png + coverlogo.png black.png Roboto-Regular.ttf diff --git a/assets/skin-hot.png b/assets/skin-hot.png old mode 100755 new mode 100644 diff --git a/include/f1x/openauto/autoapp/UI/MainWindow.hpp b/include/f1x/openauto/autoapp/UI/MainWindow.hpp index 4d17974..914f37b 100644 --- a/include/f1x/openauto/autoapp/UI/MainWindow.hpp +++ b/include/f1x/openauto/autoapp/UI/MainWindow.hpp @@ -25,13 +25,18 @@ #include #include +#include #include +#include +#include #include #include #include #include +#include + namespace Ui { class MainWindow; @@ -111,10 +116,17 @@ private slots: void on_horizontalSliderVolumePlayer_sliderMoved(int position); void on_pushButtonPlayerPlay_clicked(); void on_pushButtonPlayerStop_clicked(); + void on_pushButtonPlayerPause_clicked(); void on_positionChanged(qint64 position); void on_durationChanged(qint64 position); void on_mp3List_itemClicked(QListWidgetItem *item); void metaDataChanged(); + void stateChanged(); + void on_pushButtonScanFolder_clicked(); + void on_pushButtonSelectFolder_clicked(); + void on_pushButtonPlayerPlayList_clicked(); + void on_pushButtonPlayerPrev_clicked(); + void on_pushButtonPlayerNext_clicked(); private: Ui::MainWindow* ui_; @@ -156,7 +168,8 @@ private: QString custom_button_color_c8 = "186,189,192"; QString selectedMp3file; - QString folderMp3 = "/media/CSSTORAGE/Music"; + QString musicfolder = "/media/CSSTORAGE/Music"; + QMediaPlaylist *playlist; bool customBrightnessControl = false; diff --git a/src/autoapp/UI/MainWindow.cpp b/src/autoapp/UI/MainWindow.cpp index 8beffe6..efb28b5 100644 --- a/src/autoapp/UI/MainWindow.cpp +++ b/src/autoapp/UI/MainWindow.cpp @@ -165,6 +165,7 @@ MainWindow::MainWindow(configuration::IConfiguration::Pointer configuration, QWi connect(ui_->pushButtonWifi, &QPushButton::clicked, this, &MainWindow::openConnectDialog); connect(ui_->pushButtonWifi2, &QPushButton::clicked, this, &MainWindow::openConnectDialog); connect(ui_->pushButtonMusic, &QPushButton::clicked, this, &MainWindow::playerShow); + connect(ui_->pushButtonMusic2, &QPushButton::clicked, this, &MainWindow::playerShow); connect(ui_->pushButtonBack, &QPushButton::clicked, this, &MainWindow::playerHide); // by default hide bluetooth button on init @@ -247,13 +248,14 @@ MainWindow::MainWindow(configuration::IConfiguration::Pointer configuration, QWi } // as default hide brightness slider - ui_->horizontalSliderBrightness->hide(); - ui_->brightnessValueLabel->hide(); + ui_->BrightnessSliderControl->hide(); // as default hide alpha slider and button - ui_->horizontalSliderAlpha->hide(); - ui_->alphaValueLabel->hide(); - ui_->pushButtonAlpha->show(); + ui_->pushButtonAlpha->hide(); + ui_->AlphaSliderControl->hide(); + + // as default hide volume slider player + ui_->VolumeSliderControlPlayer->hide(); // as default hide power buttons ui_->pushButtonShutdown->hide(); @@ -559,8 +561,8 @@ MainWindow::MainWindow(configuration::IConfiguration::Pointer configuration, QWi } // hide alpha controls if enabled in settings - if (configuration->hideAlpha()) { - ui_->pushButtonAlpha->hide(); + if (!configuration->hideAlpha()) { + ui_->pushButtonAlpha->show(); } // init alpha values @@ -568,9 +570,14 @@ MainWindow::MainWindow(configuration::IConfiguration::Pointer configuration, QWi MainWindow::on_horizontalSliderAlpha_valueChanged(int(configuration->getAlphaTrans())); player = new QMediaPlayer(this); + playlist = new QMediaPlaylist(this); connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::on_positionChanged); connect(player, &QMediaPlayer::durationChanged, this, &MainWindow::on_durationChanged); connect(player, &QMediaPlayer::metaDataAvailableChanged, this, &MainWindow::metaDataChanged); + connect(player, &QMediaPlayer::stateChanged, this, &MainWindow::stateChanged); + ui_->id3TagInfo->hide(); + + MainWindow::on_pushButtonScanFolder_clicked(); } MainWindow::~MainWindow() @@ -650,14 +657,9 @@ void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonBrightness_clicked() this->brightnessFileAlt->close(); } } - ui_->horizontalSliderBrightness->show(); - ui_->brightnessValueLabel->show(); - ui_->horizontalSliderVolume->hide(); - ui_->volumeValueLabel->hide(); - ui_->pushButtonMute->hide(); - ui_->pushButtonUnMute->hide(); - ui_->horizontalSliderAlpha->hide(); - ui_->alphaValueLabel->hide(); + ui_->BrightnessSliderControl->show(); + ui_->VolumeSliderControl->hide(); + ui_->AlphaSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonBrightness2_clicked() @@ -687,14 +689,9 @@ void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonBrightness2_clicked() this->brightnessFileAlt->close(); } } - ui_->horizontalSliderBrightness->show(); - ui_->brightnessValueLabel->show(); - ui_->horizontalSliderVolume->hide(); - ui_->volumeValueLabel->hide(); - ui_->pushButtonMute->hide(); - ui_->pushButtonUnMute->hide(); - ui_->horizontalSliderAlpha->hide(); - ui_->alphaValueLabel->hide(); + ui_->BrightnessSliderControl->show(); + ui_->VolumeSliderControl->hide(); + ui_->AlphaSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonVolume_clicked() @@ -706,10 +703,10 @@ void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonVolume_clicked() } else { ui_->pushButtonMute->show(); } - ui_->horizontalSliderBrightness->hide(); - ui_->brightnessValueLabel->hide(); - ui_->horizontalSliderAlpha->hide(); - ui_->alphaValueLabel->hide(); + ui_->VolumeSliderControl->show(); + ui_->BrightnessSliderControl->hide(); + ui_->AlphaSliderControl->hide(); + } void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonVolume2_clicked() @@ -721,22 +718,16 @@ void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonVolume2_clicked() } else { ui_->pushButtonMute->show(); } - ui_->horizontalSliderBrightness->hide(); - ui_->brightnessValueLabel->hide(); - ui_->horizontalSliderAlpha->hide(); - ui_->alphaValueLabel->hide(); + ui_->VolumeSliderControl->show(); + ui_->BrightnessSliderControl->hide(); + ui_->AlphaSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonAlpha_clicked() { - ui_->horizontalSliderAlpha->show(); - ui_->alphaValueLabel->show(); - ui_->horizontalSliderVolume->hide(); - ui_->volumeValueLabel->hide(); - ui_->pushButtonMute->hide(); - ui_->pushButtonUnMute->hide(); - ui_->horizontalSliderBrightness->hide(); - ui_->brightnessValueLabel->hide(); + ui_->AlphaSliderControl->show(); + ui_->VolumeSliderControl->hide(); + ui_->BrightnessSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::on_horizontalSliderBrightness_valueChanged(int value) @@ -886,6 +877,10 @@ void f1x::openauto::autoapp::ui::MainWindow::playerShow() ui_->oldmenuWidget->hide(); } ui_->mediaWidget->show(); + ui_->VolumeSliderControlPlayer->show(); + ui_->VolumeSliderControl->hide(); + ui_->BrightnessSliderControl->hide(); + ui_->AlphaSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::playerHide() @@ -896,6 +891,10 @@ void f1x::openauto::autoapp::ui::MainWindow::playerHide() ui_->oldmenuWidget->show(); } ui_->mediaWidget->hide(); + ui_->VolumeSliderControl->show(); + ui_->VolumeSliderControlPlayer->hide(); + ui_->BrightnessSliderControl->hide(); + ui_->AlphaSliderControl->hide(); } void f1x::openauto::autoapp::ui::MainWindow::toggleExit() @@ -1178,42 +1177,39 @@ void f1x::openauto::autoapp::ui::MainWindow::showTime() ui_->pushButtonDummyCamWifi->hide(); } } - - // handle dummys in classic menu - int button_count = 0; - if (ui_->pushButtonCameraShow2->isVisible() == true) { - button_count = button_count + 1; - } - if (ui_->pushButtonToggleGUI2->isVisible() == true) { - button_count = button_count + 1; - } - if (ui_->pushButtonWifi2->isVisible() == true) { - button_count = button_count + 1; - } - if (ui_->pushButtonDebug2->isVisible() == true) { - button_count = button_count + 1; - } - if (button_count >= 3) { - ui_->pushButtonDummyClassic1->hide(); - ui_->pushButtonDummyClassic2->hide(); - ui_->pushButtonDummyClassic3->hide(); - } - if (button_count == 2) { - ui_->pushButtonDummyClassic1->show(); - ui_->pushButtonDummyClassic2->hide(); - ui_->pushButtonDummyClassic3->hide(); - } - if (button_count == 1) { - ui_->pushButtonDummyClassic1->show(); - ui_->pushButtonDummyClassic2->show(); - ui_->pushButtonDummyClassic3->hide(); - } - if (button_count == 0) { - ui_->pushButtonDummyClassic1->show(); - ui_->pushButtonDummyClassic2->show(); - ui_->pushButtonDummyClassic3->show(); - } } + + // handle dummys in classic menu + int button_count = 0; + if (ui_->pushButtonCameraShow2->isVisible() == true) { + button_count = button_count + 1; + } + if (ui_->pushButtonToggleGUI2->isVisible() == true) { + button_count = button_count + 1; + } + if (ui_->pushButtonWifi2->isVisible() == true) { + button_count = button_count + 1; + } + if (ui_->pushButtonDebug2->isVisible() == true) { + button_count = button_count + 1; + } + if (button_count >= 3) { + ui_->pushButtonDummyClassic1->hide(); + ui_->pushButtonDummyClassic2->hide(); + } + if (button_count == 2) { + ui_->pushButtonDummyClassic1->hide(); + ui_->pushButtonDummyClassic2->hide(); + } + if (button_count == 1) { + ui_->pushButtonDummyClassic1->show(); + ui_->pushButtonDummyClassic2->hide(); + } + if (button_count == 0) { + ui_->pushButtonDummyClassic1->show(); + ui_->pushButtonDummyClassic2->show(); + } + ui_->Digital_clock->setText(time_text); ui_->bigClock->setText(time_text); } @@ -1227,11 +1223,14 @@ void f1x::openauto::autoapp::ui::MainWindow::on_horizontalSliderProgressPlayer_s void f1x::openauto::autoapp::ui::MainWindow::on_horizontalSliderVolumePlayer_sliderMoved(int position) { player->setVolume(position); + ui_->volumeValueLabelPlayer->setText(QString::number(position) + "%"); } void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerPlay_clicked() { - player->setMedia(QMediaContent(QUrl::fromLocalFile(this->folderMp3 + "/" + this->selectedMp3file))); + QString path = this->musicfolder + "/" + this->selectedMp3file; + ui_->labelFolderpath->setText(path); + player->setMedia(QMediaContent(QUrl::fromLocalFile(path))); player->play(); //qDebug() << player->errorString(); } @@ -1239,17 +1238,66 @@ void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerPlay_clicked() void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerStop_clicked() { player->stop(); + ui_->pushButtonBack->setIcon(QPixmap("://coverlogo.png")); +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerPause_clicked() +{ + { + if(player->state() == QMediaPlayer::PlayingState){ + player->pause(); + ui_->pushButtonPlayerPause->setStyleSheet( "background-color: rgb(218, 143, 143); border-radius: 4px; border: 2px solid rgba(255,255,255,0.5); color: rgb(0,0,0);"); + }else{ + ui_->pushButtonPlayerPause->setStyleSheet( "background-color: rgb(186, 189, 182); border-radius: 4px; border: 2px solid rgba(255,255,255,0.5); color: rgb(0,0,0);"); + player->play(); + player->setPosition(player->position()); + } + + } } void f1x::openauto::autoapp::ui::MainWindow::on_positionChanged(qint64 position) { ui_->horizontalSliderProgressPlayer->setValue(position); + + //Setting the time + QString time_elapsed, time_total; + + int total_seconds, total_minutes; + + total_seconds = (player->duration()/1000) % 60; + total_minutes = (player->duration()/1000) / 60; + + if(total_minutes >= 60){ + int total_hours = (total_minutes/60); + total_minutes = total_minutes - (total_hours*60); + time_total = QString("%1").arg(total_hours, 2,10,QChar('0')) + ':' + QString("%1").arg(total_minutes, 2,10,QChar('0')) + ':' + QString("%1").arg(total_seconds, 2,10,QChar('0')); + + }else{ + time_total = QString("%1").arg(total_minutes, 2,10,QChar('0')) + ':' + QString("%1").arg(total_seconds, 2,10,QChar('0')); + + } + + //calculate time elapsed + int seconds, minutes; + + seconds = (position/1000) % 60; + minutes = (position/1000) / 60; + + //if minutes is over 60 then we should really display hours + if(minutes >= 60){ + int hours = (minutes/60); + minutes = minutes - (hours*60); + time_elapsed = QString("%1").arg(hours, 2,10,QChar('0')) + ':' + QString("%1").arg(minutes, 2,10,QChar('0')) + ':' + QString("%1").arg(seconds, 2,10,QChar('0')); + }else{ + time_elapsed = QString("%1").arg(minutes, 2,10,QChar('0')) + ':' + QString("%1").arg(seconds, 2,10,QChar('0')); + } + ui_->playerPositionTime->setText(time_elapsed + " / " + time_total); } void f1x::openauto::autoapp::ui::MainWindow::on_durationChanged(qint64 position) { ui_->horizontalSliderProgressPlayer->setMaximum(position); - ui_->valueId3length->setText(QString::number(position)); } void f1x::openauto::autoapp::ui::MainWindow::on_mp3List_itemClicked(QListWidgetItem *item) @@ -1266,6 +1314,60 @@ void f1x::openauto::autoapp::ui::MainWindow::metaDataChanged() ui_->valueId3Genre->setText(player->metaData(QMediaMetaData::Genre).toString()); ui_->valueId3Year->setText(player->metaData(QMediaMetaData::Year).toString()); QImage img = player->metaData(QMediaMetaData::CoverArtImage).value(); - QImage imgscaled = img.scaled(300,300); - ui_->labelCover->setPixmap(QPixmap::fromImage(imgscaled)); + QImage imgscaled = img.scaled(270,270,Qt::IgnoreAspectRatio); + ui_->pushButtonBack->setIcon(QPixmap::fromImage(imgscaled)); + ui_->labelCurrentPlaying->setText(player->metaData(QMediaMetaData::Title).toString() + " - " + player->metaData(QMediaMetaData::AlbumArtist).toString()); +} + +void f1x::openauto::autoapp::ui::MainWindow::stateChanged() +{ + if (player->StoppedState) { + ui_->pushButtonBack->setIcon(QPixmap("://coverlogo.png")); + } +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonScanFolder_clicked() +{ + int cleaner = ui_->mp3List->count(); + while (cleaner > -1) { + ui_->mp3List->takeItem(cleaner); + cleaner--; + } + this->playlist->clear(); + + QDirIterator dir(this->musicfolder, QStringList() << "*.mp3", QDir::NoFilter, QDirIterator::Subdirectories); + QList content; + + while (dir.hasNext()) { + QFile f(dir.next()); + QString filename = f.fileName(); + // make path relative to musicfolder + ui_->mp3List->addItem(filename.replace(this->musicfolder + "/","")); + content.push_back(QMediaContent(QUrl::fromLocalFile(f.fileName()))); + } + this->playlist->addMedia(content); +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonSelectFolder_clicked() +{ + this->musicfolder = QFileDialog::getExistingDirectory(this, tr("Select Album"), this->musicfolder, QFileDialog::ShowDirsOnly); + f1x::openauto::autoapp::ui::MainWindow::on_pushButtonScanFolder_clicked(); +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerPlayList_clicked() +{ + QString path = this->musicfolder + "/" + this->selectedMp3file; + ui_->labelFolderpath->setText(path); + player->setPlaylist(this->playlist); + player->play(); +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerPrev_clicked() +{ + playlist->previous(); +} + +void f1x::openauto::autoapp::ui::MainWindow::on_pushButtonPlayerNext_clicked() +{ + playlist->next(); } diff --git a/src/autoapp/UI/mainwindow.ui b/src/autoapp/UI/mainwindow.ui index 53ee6ab..ab65ba2 100644 --- a/src/autoapp/UI/mainwindow.ui +++ b/src/autoapp/UI/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 800 - 1268 + 808 + 1316 @@ -1110,7 +1110,18 @@ border-radius: 4px; border: 2px solid rgba(255,255,255,0.5); - MP3 + + + + + :/mp3-hot.png + + + + + 64 + 64 + @@ -1734,6 +1745,33 @@ border: 2px solid rgba(255,255,255,0.5); + + + + + 0 + 0 + + + + background-color: rgba(136, 138, 133, 0.5); + + + + + + + :/mp3-hot.png + + + + + 50 + 50 + + + + @@ -1790,28 +1828,6 @@ border: 2px solid rgba(255,255,255,0.5); - - - - - 0 - 0 - - - - - 62 - 0 - - - - background-color: rgba(136, 138, 133, 0.5); - - - - - - @@ -1996,9 +2012,12 @@ border: 2px solid rgba(255,255,255,0.5); Qt::LeftToRight - background-color: rgba(0, 0, 0, 0.8); + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(9, 41, 4, 255), stop:0.085 rgba(2, 79, 0, 255), stop:0.19 rgba(50, 147, 22, 255), stop:0.275 rgba(236, 191, 49, 255), stop:0.39 rgba(243, 61, 34, 255), stop:0.555 rgba(135, 81, 60, 255), stop:0.667 rgba(121, 75, 255, 255), stop:0.825 rgba(164, 255, 244, 255), stop:0.885 rgba(104, 222, 71, 255), stop:1 rgba(93, 128, 0, 255)); + + 4 + 0 @@ -2009,7 +2028,7 @@ border: 2px solid rgba(255,255,255,0.5); 0 - 4 + 6 @@ -2021,9 +2040,13 @@ border: 2px solid rgba(255,255,255,0.5); border: 0px; +background-color: rgba(0, 0, 0, 0); + + 0 + 0 @@ -2037,7 +2060,97 @@ border: 2px solid rgba(255,255,255,0.5); 0 - + + + + 0 + 0 + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 20 + + + + background-color: rgba(85, 87, 83, 0.7); +color: rgb(255, 255, 255); +border: 2px solid rgba(255,255,255,0.5); + + + + + + + + + + + 75 + true + + + + Qt::LeftToRight + + + background-color: rgba(85, 87, 83, 0.7); +color: rgb(255, 255, 255); +border-bottom: 2px solid rgba(255,255,255,0.5); +border-left: 2px solid rgba(255,255,255,0.5); +border-right: 2px solid rgba(255,255,255,0.5); + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + false + + + true + + + + + + + + 0 @@ -2046,40 +2159,39 @@ border: 2px solid rgba(255,255,255,0.5); - 200 - 0 + 280 + 280 - 200 - 16777215 + 280 + 280 - - - 75 - true - - - - Qt::LeftToRight - - background-color: rgb(85, 87, 83); + background-color: rgba(0, 0, 0, 0); color: rgb(255, 255, 255); -border: 2px solid rgba(255,255,255,0.5); +border: 2px solid rgba(255,255,255,0.5); + + + + + + + + :/coverlogo.png + + + + + 270 + 270 + + + + false - - - test.mp3 - - - - - test2.mp3 - - @@ -2092,12 +2204,18 @@ border: 2px solid rgba(255,255,255,0.5); - 0 - 0 + 260 + 280 + + + + + 16777215 + 280 - background-color: rgb(46, 52, 54); + background-color: rgba(85, 87, 83, 0.7); color: rgb(255, 255, 255); border: 2px solid rgba(255,255,255,0.5); @@ -2197,6 +2315,40 @@ border: no-border; color: rgb(255, 255, 255); background-color: rgba(0, 0, 0, 0); +border: no-border; + + + + + + + + + + + 8 + + + + color: rgb(255, 255, 255); +background-color: rgba(0, 0, 0, 0); +border: no-border; + + + Genre + + + + + + + + 8 + + + + color: rgb(255, 255, 255); +background-color: rgba(0, 0, 0, 0); border: no-border; @@ -2265,74 +2417,6 @@ border: no-border; color: rgb(255, 255, 255); background-color: rgba(0, 0, 0, 0); -border: no-border; - - - - - - - - - - - 8 - - - - color: rgb(255, 255, 255); -background-color: rgba(0, 0, 0, 0); -border: no-border; - - - Genre - - - - - - - - 8 - - - - color: rgb(255, 255, 255); -background-color: rgba(0, 0, 0, 0); -border: no-border; - - - - - - - - - - - 8 - - - - color: rgb(255, 255, 255); -background-color: rgba(0, 0, 0, 0); -border: no-border; - - - Length - - - - - - - - 8 - - - - color: rgb(255, 255, 255); -background-color: rgba(0, 0, 0, 0); border: no-border; @@ -2343,93 +2427,165 @@ border: no-border; - - - - - 0 - 0 - - - - - 300 - 0 - - - - - 75 - true - - - - background-color: rgb(46, 52, 54); -color: rgb(255, 255, 255); -border: 2px solid rgba(255,255,255,0.5); - - - QFrame::NoFrame - - - Cover - - - Qt::AlignCenter - - - - + + + + 0 + 0 + + 0 - 10 + 20 - - Qt::LeftToRight + + + 16777215 + 20 + + + + + 12 + 75 + true + true + - QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} -QSlider::handle:horizontal { background: rgb(255, 255, 255); height: 52px; width: 52px; margin: 0 0;}; + background-color: rgba(0, 0, 0, 0); +color: rgb(255, 255, 255); - - Qt::Horizontal + + + + + Qt::AlignCenter - - + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + Qt::LeftToRight + + + false + + + QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} +QSlider::handle:horizontal { background: rgb(255, 255, 255); height: 52px; width: 52px; margin: 0 0;}; + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 140 + 30 + + + + + 140 + 30 + + + + + 75 + true + + + + color: rgb(255, 255, 255); +background-color: #6d6d6d; + + + 00:00 / 00:00 + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + - 0 - 30 + 20 + 0 - - Qt::LeftToRight - - - QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} -QSlider::handle:horizontal { background: rgb(64, 191, 191); height: 52px; width: 52px; margin: 0 0;}; - - - 100 - - - 100 - - - Qt::Horizontal - - + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + background-color: rgb(186, 189, 182); +border-radius: 4px; +border: 2px solid rgba(255,255,255,0.5); + + + Prev + + + @@ -2444,6 +2600,12 @@ QSlider::handle:horizontal { background: rgb(64, 191, 191); height: 52px; width: 30 + + + 16777215 + 30 + + background-color: rgb(186, 189, 182); border-radius: 4px; @@ -2455,7 +2617,7 @@ border: 2px solid rgba(255,255,255,0.5); - + 0 @@ -2468,13 +2630,19 @@ border: 2px solid rgba(255,255,255,0.5); 30 + + + 16777215 + 30 + + background-color: rgb(186, 189, 182); border-radius: 4px; border: 2px solid rgba(255,255,255,0.5); - Pause + Play All @@ -2492,6 +2660,12 @@ border: 2px solid rgba(255,255,255,0.5); 30 + + + 16777215 + 30 + + background-color: rgb(186, 189, 182); border-radius: 4px; @@ -2503,7 +2677,7 @@ border: 2px solid rgba(255,255,255,0.5); - + 0 @@ -2516,20 +2690,80 @@ border: 2px solid rgba(255,255,255,0.5); 30 + + + 16777215 + 30 + + background-color: rgb(186, 189, 182); border-radius: 4px; border: 2px solid rgba(255,255,255,0.5); - Back + Next - + + + + + + + 0 + 0 + + + - 50 - 50 + 0 + 30 + + + 16777215 + 30 + + + + background-color: rgb(186, 189, 182); +border-radius: 4px; +border: 2px solid rgba(255,255,255,0.5); + + + Pause + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + background-color: rgb(186, 189, 182); +border-radius: 4px; +border: 2px solid rgba(255,255,255,0.5); + + + Folder + @@ -2573,290 +2807,486 @@ color: rgb(0, 0, 0); - - - - - - 0 - 0 - - - - - 80 - 30 - - - - - 80 - 30 - - - - color: rgb(255, 255, 255); + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 80 + 30 + + + + + 80 + 30 + + + + color: rgb(255, 255, 255); background-color: rgb(164, 0, 0); - - - Muted - - - - - - - - 0 - 0 - - - - - 80 - 30 - - - - - 80 - 30 - - - - color: rgb(255, 255, 255); + + + Muted + + + + + + + + 0 + 0 + + + + + 80 + 30 + + + + + 80 + 30 + + + + color: rgb(255, 255, 255); background-color: #6d6d6d; - - - Mute - - - false - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} + + + Mute + + + false + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} QSlider::handle:horizontal { background: rgb(64, 191, 191); height: 52px; width: 52px; margin: 0 0;}; - - - 100 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 40 - 30 - - - - - 40 - 16777215 - - - - - 75 - true - - - - color: rgb(255, 255, 255); + + + 100 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 30 + + + + + 40 + 16777215 + + + + + 75 + true + + + + color: rgb(255, 255, 255); background-color: #6d6d6d; - - - - - - - Qt::AlignCenter - - - - + + + - + + + Qt::AlignCenter + + + + + - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - - - - - - QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 30 + + + + Qt::LeftToRight + + + QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} +QSlider::handle:horizontal { background: rgb(64, 191, 191); height: 52px; width: 52px; margin: 0 0;}; + + + 100 + + + 100 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 30 + + + + + 40 + 16777215 + + + + + 75 + true + + + + color: rgb(255, 255, 255); +background-color: #6d6d6d; + + + 100% + + + Qt::AlignCenter + + + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + + + + QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} QSlider::handle:horizontal { background: rgb(245, 121, 0); height: 52px; width: 52px; margin: 0 0;}; - - - 30 - - - 255 - - - 25 - - - 30 - - - 30 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 40 - 30 - - - - - 40 - 16777215 - - - - - 75 - true - - - - color: rgb(255, 255, 255); + + + 30 + + + 255 + + + 25 + + + 30 + + + 30 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 30 + + + + + 40 + 16777215 + + + + + 75 + true + + + + color: rgb(255, 255, 255); background-color: #6d6d6d; - - - - - - - Qt::AlignCenter - - - - + + + - + + + Qt::AlignCenter + + + + + - - - - - - 0 - 30 - - - - QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 30 + + + + QSlider::groove:horizontal { background: #6d6d6d; height: 32px;} QSlider::handle:horizontal { background: rgb(173, 127, 168); height: 52px; width: 52px; margin: 0 0;}; - - - 1 - - - 100 - - - 1 - - - 50 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 40 - 30 - - - - - 40 - 16777215 - - - - - 75 - true - - - - color: rgb(255, 255, 255); + + + 1 + + + 100 + + + 1 + + + 50 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 30 + + + + + 40 + 16777215 + + + + + 75 + true + + + + color: rgb(255, 255, 255); background-color: #6d6d6d; - - - 0.5 - - - Qt::AlignCenter - - - - + + + 0.5 + + + Qt::AlignCenter + + + + +