ukui-clock/baseverticalscroll.cpp

204 lines
6.8 KiB
C++
Raw Normal View History

2022-06-08 13:42:09 +08:00
/*
* Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd.
*
* 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, or (at your option)
* 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 <http://www.gnu.org/licenses/&gt;.
*
*/
#include "baseverticalscroll.h"
#include <QWheelEvent>
#include <QDebug>
#include <QThread>
#include <QStyleOption>
#include "theme.h"
BaseVerticalScroll::BaseVerticalScroll(int currentValue, int minRange, int maxRange, QWidget *parent) : QWidget(parent),
m_currentValue(currentValue),
m_minRange(minRange),
m_maxRange(maxRange),
isDragging(false),
m_deviation(0), //默认偏移量为0 // The default offset is 0
m_numSize(TIME_SCROLL_NUM_SIZE),
interval(1), //间隔默认1 // Interval default 1
devide(4) //默认分成4格 // Divided into 4 grids by default
{
m_priManager = new PrimaryManager();
settingsStyle();
}
void BaseVerticalScroll::setWheelSpeed(int wheelSpeed)
{
m_wheelSpeed = wheelSpeed;
}
void BaseVerticalScroll::settingsStyle()
{
subject = GsettingSubject::getInstance();
connect(subject,&GsettingSubject::mouseWheelChanged, this,[=](int speed){
if(m_priManager->checkWayland()){
this->setWheelSpeed(speed);
}
});
subject->iniMouseWheel();
}
void BaseVerticalScroll::homing()
{
if ( m_deviation > height() / 10) {
homingAni->setStartValue( ( height() - 1 ) / 8 - m_deviation);
homingAni->setEndValue(0);
m_currentValue = calculateCurrentValue(m_currentValue,-interval);
} else if ( m_deviation > -height() / 10 ) {
homingAni->setStartValue(m_deviation);
homingAni->setEndValue(0);
} else if ( m_deviation < -height() / 10 ) {
homingAni->setStartValue(-(height() - 1) / 8 - m_deviation);
homingAni->setEndValue(0);
m_currentValue = calculateCurrentValue(m_currentValue,interval);
}
emit currentValueChanged(m_currentValue);
homingAni->start();
}
int BaseVerticalScroll::calculateCurrentValue(int current,int offsetValue)
{
if ( current == m_minRange && offsetValue<0 ) {
current = m_maxRange+offsetValue+1;
} else if( current == m_maxRange && offsetValue>0 ) {
current = m_minRange+offsetValue-1;
}else{
current+=offsetValue;
}
return current;
}
void BaseVerticalScroll::paintNum(QPainter &painter, int num, int deviation)
{
int Width = width() - 1;
int Height = height() - 1;
int size = (Height - qAbs(deviation)) / (m_numSize*1.5); //偏移量越大,数字越小
//The larger the offset, the smaller the number
int transparency = Utils::handelColorRange(255 - 255 * qAbs(deviation) / Height);
int height = Height / devide;
int y = Height / 2 + deviation - height / 2;
QFont font;
font.setPixelSize(size);
painter.setFont(font);
painter.setPen(QColor(255,255,255,transparency));
QStyleOption opt;
opt.init(this);
//偏移量越大颜色越浅
if(theme::themetype==0)
{
painter.setPen(QColor(Utils::handelColorRange(34+(qAbs(deviation)*2)),
Utils::handelColorRange(34+(qAbs(deviation)*2)),
Utils::handelColorRange(34+(qAbs(deviation)*2)),transparency));
}else{
painter.setPen(QColor(Utils::handelColorRange(255-(qAbs(deviation)*2)),
Utils::handelColorRange(255-(qAbs(deviation)*2)),
Utils::handelColorRange(255-(qAbs(deviation)*2)),transparency));
}
QLinearGradient linearGradient(QPointF(5, 10), QPointF(7, 15));
linearGradient.setColorAt(0.2, Qt::white);
linearGradient.setColorAt(0.6, Qt::green);
linearGradient.setColorAt(1.0, Qt::black);
painter.setBrush(QBrush(linearGradient));
if ( y >= 0 && y + height < Height) {
painter.drawText(QRectF(0, y, Width, height),
Qt::AlignCenter,
change_NUM_to_str(num));
}
}
QString BaseVerticalScroll::change_NUM_to_str(int alarmHour)
{
QString str;
if (alarmHour < 10) {
QString hours_str = QString::number(alarmHour);
str = "0"+hours_str;
} else {
str = QString::number(alarmHour);
}
return str;
}
void BaseVerticalScroll::commonCalcValue(int height)
{
if ( m_deviation >= height / devide ) {
m_mouseSrcPos += height / devide;
m_deviation -= height / devide;
m_currentValue = calculateCurrentValue(m_currentValue,-interval);
}
if ( m_deviation <= -height / devide ) {
m_mouseSrcPos -= height / devide;
m_deviation += height / devide;
m_currentValue = calculateCurrentValue(m_currentValue,interval);
}
}
//鼠标滑轮滚动,数值滚动
// Mouse wheel scrolling, numerical scrolling
void BaseVerticalScroll::wheelEvent(QWheelEvent *event)
{
//wayland下没有初次进入触发两次wheelEvent问题
if(m_priManager->checkWayland()){
m_isFirstFocus=false;
}
if(m_isFirstFocus){
event->ignore();
m_isFirstFocus = false;
}else{
for (int i=0;i<m_wheelSpeed;i++) {
if (event->delta() > 0){
if (m_currentValue <= m_minRange)
m_currentValue = m_maxRange;
else
m_currentValue-=1;
} else {
if (m_currentValue >= m_maxRange)
m_currentValue = m_minRange;
else
m_currentValue+=1;
}
// update();
repaint();
QThread::msleep(20);
}
event->accept();
}
}
void BaseVerticalScroll::mouseMoveEvent(QMouseEvent *e)
{
if (isDragging) {
// if ( m_currentValue == m_minRange && e->pos().y() >= m_mouseSrcPos ) {
// m_currentValue = m_maxRange;
// } else if( m_currentValue == m_maxRange && e->pos().y() <= m_mouseSrcPos ) {
// m_currentValue = m_minRange;
// }
m_deviation = e->pos().y() - m_mouseSrcPos;
//若移动速度过快,则进行限制
// If the movement speed is too fast, limit it
if (m_deviation > (height() - 1) / devide) {
m_deviation = (height() - 1) / devide;
} else if (m_deviation < -(height() - 1) / devide) {
m_deviation = -( height() - 1) / devide;
}
emit deviationChange((int)m_deviation / ((height() - 1) / devide));
repaint();
}
}