/* * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. * * Author: sbw * * Maintainer: sbw * * 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 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "volumeslider.h" #include #include #include VolumeSlider::VolumeSlider(QWidget *parent) : DSlider(Qt::Horizontal, parent), m_pressed(false), m_timer(new QTimer(this)) { setPageStep(50); m_timer->setInterval(100); connect(m_timer, &QTimer::timeout, this, &VolumeSlider::onTimeout); } void VolumeSlider::setValue(const int value) { if (m_pressed) return; blockSignals(true); DSlider::setValue(value); blockSignals(false); } void VolumeSlider::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { if (!rect().contains(e->pos())) return; m_pressed = true; DSlider::setValue(maximum() * e->x() / rect().width()); } } void VolumeSlider::mouseMoveEvent(QMouseEvent *e) { const int value = minimum() + (double((maximum()) - minimum()) * e->x() / rect().width()); const int normalized = std::max(std::min(maximum(), value), 0); DSlider::setValue(normalized); blockSignals(true); emit valueChanged(normalized); blockSignals(false); } void VolumeSlider::mouseReleaseEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { m_pressed = false; emit requestPlaySoundEffect(); } } void VolumeSlider::wheelEvent(QWheelEvent *e) { e->accept(); m_timer->start(); DSlider::setValue(value() + (e->angleDelta().y() > 0 ? 2 : -2)); } void VolumeSlider::onTimeout() { m_timer->stop(); emit requestPlaySoundEffect(); }