teleport/client/tp-player/bar.cpp

651 lines
26 KiB
C++
Raw Normal View History

2019-10-31 17:45:17 +00:00
#include "bar.h"
2019-09-06 12:07:13 +00:00
#include <QPainter>
#include <QDebug>
#include "mainwindow.h"
#define FONT_SIZE_DEFAULT 12
#define FONT_SIZE_TIME 14
#define TEXT_COLOR QColor(255,255,255,153)
2019-09-09 12:15:53 +00:00
#define SPEED_BTN_WIDTH 42
#define CHKBOX_RIGHT_PADDING 6
#define PADDING_TIME_PROGRESS_BAR 10
#define SPEED_BTN_PADDING_TOP 8
#define SPEED_BTN_PADDING_RIGHT 8
#define SKIP_PADDING_TOP 10
#define BAR_ALIGN_TOP 10
#define BAR_PADDING_TOP 18
#define BAR_PADDING_LEFT 15
#define BAR_PADDING_RIGHT 15
typedef struct RES_MAP {
RES_ID id;
const char* name;
}RES_MAP;
static RES_MAP img_res[res__max] = {
{res_bg_left, "bg-left"},
{res_bg_mid, "bg-mid"},
{res_bg_right, "bg-right"},
2019-09-09 12:15:53 +00:00
{res_btn_normal_left, "btn-normal-left"},
{res_btn_normal_mid, "btn-normal-mid"},
{res_btn_normal_right, "btn-normal-right"},
{res_btn_sel_left, "btn-sel-left"},
{res_btn_sel_mid, "btn-sel-mid"},
{res_btn_sel_right, "btn-sel-right"},
{res_btn_hover_left, "btn-hover-left"},
{res_btn_hover_mid, "btn-hover-mid"},
{res_btn_hover_right, "btn-hover-right"},
{res_prgbarh_left, "prgbarh-left"},
{res_prgbarh_mid, "prgbarh-mid"},
{res_prgbar_mid, "prgbar-mid"},
{res_prgbar_right, "prgbar-right"},
{res_chkbox_normal, "chkbox-normal"},
{res_chkbox_hover, "chkbox-hover"},
{res_chkbox_sel_normal, "chkbox-sel-normal"},
{res_chkbox_sel_hover, "chkbox-sel-hover"},
};
typedef struct SPEED_MAP {
int id;
const char* title;
}SPEED_MAP;
static SPEED_MAP speed[speed_count] = {
{speed_1x, "1x"},
{speed_2x, "2x"},
{speed_4x, "4x"},
{speed_8x, "8x"},
};
static inline int min(int a, int b){
return a < b ? a : b;
}
static inline int max(int a, int b){
return a > b ? a : b;
}
2019-09-06 12:07:13 +00:00
Bar::Bar() {
m_img_ready = false;
m_width = 0;
m_height = 0;
m_str_total_time = "00:00";
m_str_passed_time = "00:00";
m_str_passed_time_last_draw = "--:--";
m_percent = 0;
m_percent_last_draw = -1;
2019-09-06 12:07:13 +00:00
m_play_hover = false;
2019-09-09 12:15:53 +00:00
m_playing = true; // false=paused
m_speed_selected = speed_1x;
m_speed_hover = speed_count; // speed_count=no-hover
2019-09-09 12:15:53 +00:00
m_skip_selected = false;
m_skip_hover = false;
2019-09-06 12:07:13 +00:00
}
Bar::~Bar() {
}
bool Bar::init(MainWindow* owner) {
2019-09-06 12:07:13 +00:00
m_owner = owner;
// 加载所需的图像资源
int i = 0;
for(i = 0; i < res__max; ++i) {
QString name;
name.sprintf(":/tp-player/res/bar/%s.png", img_res[i].name);
if(!m_res[i].load(name))
return false;
}
// 无需合成的图像
2019-09-09 12:15:53 +00:00
if(!m_img_btn_play[play_running][widget_normal].load(":/tp-player/res/bar/play-normal.png")
|| !m_img_btn_play[play_running][widget_hover].load(":/tp-player/res/bar/play-hover.png")
2019-09-09 12:15:53 +00:00
|| !m_img_btn_play[play_paused][widget_normal].load(":/tp-player/res/bar/pause-normal.png")
|| !m_img_btn_play[play_paused][widget_hover].load(":/tp-player/res/bar/pause-hover.png")
2019-09-09 12:15:53 +00:00
|| !m_img_progress_pointer[widget_normal].load(":/tp-player/res/bar/prgpt-normal.png")
|| !m_img_progress_pointer[widget_hover].load(":/tp-player/res/bar/prgpt-hover.png")
) {
2019-09-06 12:07:13 +00:00
return false;
}
2019-09-06 12:07:13 +00:00
m_height = m_res[res_bg_left].height();
2019-09-06 12:07:13 +00:00
return true;
}
2019-09-06 12:07:13 +00:00
void Bar::start(uint32_t total_ms, int width) {
bool is_first_start = (m_width == 0);
m_width = width;
2019-09-06 12:07:13 +00:00
m_total_ms = total_ms;
_ms_to_str(total_ms, m_str_total_time);
// 首次播放时调整位置左右居中距窗口顶部10点处。
if(is_first_start) {
_init_imgages();
QRect rc = m_owner->rect();
m_rc = QRect(0, 0, m_width, m_height);
2019-09-09 12:15:53 +00:00
m_rc.moveTo((rc.width() - m_width)/2, BAR_ALIGN_TOP);
}
}
void Bar::end() {
if(m_passed_ms != m_total_ms)
update_passed_time(m_total_ms);
m_playing = false;
m_owner->update(m_rc.left()+m_rc_btn_play.left(), m_rc.top()+m_rc_btn_play.top(), m_rc_btn_play.width(), m_rc_btn_play.height());
}
void Bar::_init_imgages() {
m_img_bg = QPixmap(m_width, m_height);
m_img_bg.fill(Qt::transparent);//用透明色填充
QPainter pp(&m_img_bg);
QFont font = pp.font();
// 合成背景图像
{
pp.drawPixmap(0, 0, m_res[res_bg_left].width(), m_res[res_bg_left].height(), m_res[res_bg_left]);
pp.drawPixmap(m_res[res_bg_left].width(), 0, m_width - m_res[res_bg_left].width() - m_res[res_bg_right].width(), m_height, m_res[res_bg_mid]);
pp.drawPixmap(m_width-m_res[res_bg_right].width(), 0, m_res[res_bg_right].width(), m_height, m_res[res_bg_right]);
}
{
2019-09-09 12:15:53 +00:00
m_rc_btn_play = QRect(BAR_PADDING_LEFT, (m_height - m_img_btn_play[play_running][widget_normal].height())/2 , m_img_btn_play[play_running][widget_normal].width(), m_img_btn_play[play_running][widget_normal].height());
}
// 合成速度按钮
{
2019-09-09 12:15:53 +00:00
int w = SPEED_BTN_WIDTH, h = m_res[res_btn_normal_left].height();
QRect rc(0, 0, w, h);
2019-09-09 12:15:53 +00:00
QPixmap btn[btnspd_state_count];
// 未选中状态
2019-09-09 12:15:53 +00:00
btn[btnspd_normal] = QPixmap(w, h);
btn[btnspd_normal].fill(Qt::transparent);//用透明色填充
QPainter pn(&btn[btnspd_normal]);
pn.drawPixmap(0, 0, m_res[res_btn_normal_left].width(), m_res[res_btn_normal_left].height(), m_res[res_btn_normal_left]);
pn.drawPixmap(m_res[res_btn_normal_left].width(), 0, w - m_res[res_btn_normal_left].width() - m_res[res_btn_normal_right].width(), h, m_res[res_btn_normal_mid]);
pn.drawPixmap(w-m_res[res_btn_normal_right].width(), 0, m_res[res_btn_normal_right].width(), h, m_res[res_btn_normal_right]);
// 选中状态
2019-09-09 12:15:53 +00:00
btn[btnspd_sel] = QPixmap(w, h);
btn[btnspd_sel].fill(Qt::transparent);//用透明色填充
QPainter ps(&btn[btnspd_sel]);
ps.drawPixmap(0, 0, m_res[res_btn_sel_left].width(), m_res[res_btn_sel_left].height(), m_res[res_btn_sel_left]);
ps.drawPixmap(m_res[res_btn_sel_left].width(), 0, w - m_res[res_btn_sel_left].width() - m_res[res_btn_sel_right].width(), h, m_res[res_btn_sel_mid]);
ps.drawPixmap(w-m_res[res_btn_sel_right].width(), 0, m_res[res_btn_sel_right].width(), h, m_res[res_btn_sel_right]);
// 鼠标滑过状态
btn[btnspd_hover] = QPixmap(w, h);
btn[btnspd_hover].fill(Qt::transparent);//用透明色填充
QPainter ph(&btn[btnspd_hover]);
ph.drawPixmap(0, 0, m_res[res_btn_hover_left].width(), m_res[res_btn_hover_left].height(), m_res[res_btn_hover_left]);
ph.drawPixmap(m_res[res_btn_hover_left].width(), 0, w - m_res[res_btn_hover_left].width() - m_res[res_btn_hover_right].width(), h, m_res[res_btn_hover_mid]);
ph.drawPixmap(w-m_res[res_btn_hover_right].width(), 0, m_res[res_btn_hover_right].width(), h, m_res[res_btn_hover_right]);
for(int i = 0; i < btnspd_state_count; ++i) {
for(int j = 0; j < speed_count; ++j) {
m_img_btn_speed[j][i] = QPixmap(w, h);
m_img_btn_speed[j][i].fill(Qt::transparent);
QPainter ps(&m_img_btn_speed[j][i]);
ps.setPen(TEXT_COLOR);
QFont font = ps.font();
font.setFamily("consolas");
font.setPixelSize(FONT_SIZE_DEFAULT);
ps.setFont(font);
ps.drawPixmap(0, 0, w, h, btn[i]);
ps.drawText(rc, Qt::AlignCenter, speed[j].title);
}
}
}
// 合成跳过无操作选项
{
// 计算显示跳过无操作选项字符串的宽高
font.setFamily("微软雅黑");
font.setBold(false);
font.setPixelSize(FONT_SIZE_DEFAULT);
pp.setFont(font);
QFontMetrics fm = pp.fontMetrics();
{
int h = fm.height();
2019-09-09 12:15:53 +00:00
if(h < m_res[res_chkbox_normal].height())
h = m_res[res_chkbox_normal].height();
2019-11-03 19:34:11 +00:00
m_rc_skip = QRect(0, 0, fm.width(LOCAL8BIT("无操作则跳过")) + CHKBOX_RIGHT_PADDING + m_res[res_chkbox_normal].width(), h);
}
int w = m_rc_skip.width();
int h = m_rc_skip.height();
2019-09-09 12:15:53 +00:00
int chkbox_top = (m_rc_skip.height() - m_res[res_chkbox_normal].height()) / 2;
int text_left = m_res[res_chkbox_normal].width() + CHKBOX_RIGHT_PADDING;
int text_top = (m_rc_skip.height() - fm.height()) / 2;
2019-09-09 12:15:53 +00:00
for(int i = 0; i < chkbox_state_count; ++i) {
for(int j = 0; j < widget_state_count; ++j) {
m_img_skip[i][j] = QPixmap(w,h);
m_img_skip[i][j].fill(Qt::transparent);
QPainter ps(&m_img_skip[i][j]);
ps.setPen(TEXT_COLOR);
QFont font = ps.font();
font.setFamily("微软雅黑");
font.setPixelSize(FONT_SIZE_DEFAULT);
ps.setFont(font);
2019-09-09 12:15:53 +00:00
QPixmap* img = nullptr;
if(i == chkbox_normal && j == widget_normal)
img = &m_res[res_chkbox_normal];
else if(i == chkbox_normal && j == widget_hover)
img = &m_res[res_chkbox_hover];
else if(i == chkbox_selected && j == widget_normal)
img = &m_res[res_chkbox_sel_normal];
else if(i == chkbox_selected && j == widget_hover)
img = &m_res[res_chkbox_sel_hover];
if(img == nullptr) {
qDebug("ERROR: can not load image for check-box.");
img = &m_res[res_chkbox_normal];
}
ps.drawPixmap(0, chkbox_top, img->width(), img->height(), *img);
2019-11-03 19:34:11 +00:00
ps.drawText(QRect(text_left, text_top, w-text_left, h-text_top), Qt::AlignCenter, LOCAL8BIT("无操作则跳过"));
2019-09-09 12:15:53 +00:00
}
}
}
2019-09-09 12:15:53 +00:00
// 定位进度条
{
// 计算显示时间所需的宽高
font.setFamily("consolas");
font.setBold(true);
font.setPixelSize(FONT_SIZE_TIME);
pp.setFont(font);
{
QFontMetrics fm = pp.fontMetrics();
m_rc_time_passed = QRect(0, 0, fm.width("00:00:00"), fm.height());
m_rc_time_total = m_rc_time_passed;
}
m_img_time_total = QPixmap(m_rc_time_total.width(), m_rc_time_total.height());
m_img_time_total.fill(Qt::transparent);
QPainter pp(&m_img_time_total);
pp.setPen(TEXT_COLOR);
QFont font = pp.font();
font.setFamily("consolas");
font.setBold(true);
font.setPixelSize(FONT_SIZE_TIME);
pp.setFont(font);
pp.drawText(m_rc_time_total, Qt::AlignLeft, m_str_total_time);
// 定位时间字符串的位置
2019-09-09 12:15:53 +00:00
m_rc_time_passed.moveTo(BAR_PADDING_LEFT+m_img_btn_play[play_running][widget_normal].width()+PADDING_TIME_PROGRESS_BAR, BAR_PADDING_TOP);
m_rc_time_total.moveTo(m_width - BAR_PADDING_RIGHT - m_rc_time_total.width(), BAR_PADDING_TOP);
2019-09-09 12:15:53 +00:00
int prog_width = m_rc_time_total.left() - PADDING_TIME_PROGRESS_BAR - PADDING_TIME_PROGRESS_BAR - m_rc_time_passed.right();
int prog_height = max(m_res[res_prgbarh_left].height(), m_img_progress_pointer->height());
m_rc_progress = QRect(0, 0, prog_width, prog_height);
m_rc_progress.moveTo(m_rc_time_passed.right() + PADDING_TIME_PROGRESS_BAR, m_rc_time_passed.top() + (m_rc_time_passed.height() - prog_height)/2);
}
// 定位速度按钮
{
2019-09-09 12:15:53 +00:00
int left = m_rc_time_passed.right() + PADDING_TIME_PROGRESS_BAR;
int top = m_rc_time_passed.bottom() + SPEED_BTN_PADDING_TOP;
for(int i = 0; i < speed_count; i++) {
m_rc_btn_speed[i] = QRect(left, top, m_img_btn_speed[i][widget_normal].width(), m_img_btn_speed[i][widget_normal].height());
2019-09-09 12:15:53 +00:00
left += m_img_btn_speed[i][widget_normal].width() + SPEED_BTN_PADDING_RIGHT;
}
}
// 定位跳过选项
{
2019-09-09 12:15:53 +00:00
int left = m_rc_time_total.left() - m_rc_skip.width() - PADDING_TIME_PROGRESS_BAR;
int top = m_rc_time_passed.bottom() + SKIP_PADDING_TOP;//m_rc_btn_speed[0].top() + (m_rc_btn_speed[0].height() - m_rc_skip.height())/2;
m_rc_skip.moveTo(left, top);
}
m_img_ready = true;
2019-09-06 12:07:13 +00:00
}
void Bar::_ms_to_str(uint32_t ms, QString& str) {
int h = 0, m = 0, s = 0;
s = ms / 1000;
if(ms % 1000 > 500)
s += 1;
h = s / 3600;
s = s % 3600;
m = s / 60;
s = s % 60;
if(h > 0)
str.sprintf("%02d:%02d:%02d", h, m, s);
else
str.sprintf("%02d:%02d", m, s);
2019-09-06 12:07:13 +00:00
}
void Bar::update_passed_time(uint32_t ms) {
QString str_passed;
_ms_to_str(ms, str_passed);
if(m_str_passed_time != str_passed)
{
m_str_passed_time = str_passed;
m_owner->update(m_rc.left()+m_rc_time_passed.left(), m_rc.top()+m_rc_time_passed.top(), m_rc_time_passed.width(), m_rc_time_passed.height());
}
int percent = 0;
if(ms > m_total_ms) {
percent = 100;
m_passed_ms = m_total_ms;
}
else {
m_passed_ms = ms;
percent = (int)(((double)m_passed_ms / (double)m_total_ms) * 100);
}
if(percent != m_percent) {
m_percent = percent;
m_owner->update(m_rc.left()+m_rc_progress.left(), m_rc.top()+m_rc_progress.top(), m_rc_progress.width(), m_rc_progress.height());
}
}
void Bar::onMouseMove(int x, int y) {
// 映射鼠标坐标点到本浮动窗内部的相对位置
QPoint pt(x-m_rc.left(), y-m_rc.top());
bool play_hover = m_rc_btn_play.contains(pt);
if(play_hover != m_play_hover) {
m_play_hover = play_hover;
m_owner->update(m_rc.left()+m_rc_btn_play.left(), m_rc.top()+m_rc_btn_play.top(), m_rc_btn_play.width(), m_rc_btn_play.height());
}
if(play_hover)
return;
int speed_hover = speed_count;
for(int i = 0; i < speed_count; ++i) {
if(m_rc_btn_speed[i].contains(pt)) {
speed_hover = i;
break;
}
}
if(m_speed_hover != speed_hover) {
if(m_speed_hover != speed_count) {
m_owner->update(m_rc.left()+m_rc_btn_speed[m_speed_hover].left(), m_rc.top()+m_rc_btn_speed[m_speed_hover].top(), m_rc_btn_speed[m_speed_hover].width(), m_rc_btn_speed[m_speed_hover].height());
}
m_speed_hover = speed_hover;
if(m_speed_hover != speed_count) {
m_owner->update(m_rc.left()+m_rc_btn_speed[m_speed_hover].left(), m_rc.top()+m_rc_btn_speed[m_speed_hover].top(), m_rc_btn_speed[m_speed_hover].width(), m_rc_btn_speed[m_speed_hover].height());
}
}
2019-09-09 12:15:53 +00:00
bool skip_hover = m_rc_skip.contains(pt);
if(skip_hover != m_skip_hover) {
m_skip_hover = skip_hover;
m_owner->update(m_rc.left()+m_rc_skip.left(), m_rc.top()+m_rc_skip.top(), m_rc_skip.width(), m_rc_skip.height());
}
if(skip_hover)
return;
// TODO: more hover detect.
}
void Bar::onMousePress(int x, int y) {
// 映射鼠标坐标点到本浮动窗内部的相对位置
QPoint pt(x-m_rc.left(), y-m_rc.top());
if(m_rc_btn_play.contains(pt)) {
if(m_playing)
m_owner->pause();
else
m_owner->resume();
m_playing = !m_playing;
m_owner->update(m_rc.left()+m_rc_btn_play.left(), m_rc.top()+m_rc_btn_play.top(), m_rc_btn_play.width(), m_rc_btn_play.height());
return;
}
int speed_sel = speed_count;
for(int i = 0; i < speed_count; ++i) {
if(m_rc_btn_speed[i].contains(pt)) {
speed_sel = i;
break;
}
}
if(m_speed_selected != speed_sel && speed_sel != speed_count) {
int old_sel = m_speed_selected;
m_speed_selected = speed_sel;
m_owner->set_speed(get_speed());
m_owner->update(m_rc.left()+m_rc_btn_speed[old_sel].left(), m_rc.top()+m_rc_btn_speed[old_sel].top(), m_rc_btn_speed[old_sel].width(), m_rc_btn_speed[old_sel].height());
m_owner->update(m_rc.left()+m_rc_btn_speed[m_speed_hover].left(), m_rc.top()+m_rc_btn_speed[m_speed_hover].top(), m_rc_btn_speed[m_speed_hover].width(), m_rc_btn_speed[m_speed_hover].height());
return;
}
if(m_rc_skip.contains(pt)) {
m_skip_selected = !m_skip_selected;
m_owner->update(m_rc.left()+m_rc_skip.left(), m_rc.top()+m_rc_skip.top(), m_rc_skip.width(), m_rc_skip.height());
return;
}
}
int Bar::get_speed() {
switch (m_speed_selected) {
case speed_1x:
return 1;
case speed_2x:
return 2;
case speed_4x:
return 4;
case speed_8x:
return 8;
default:
return 1;
}
}
void Bar::draw(QPainter& painter, const QRect& rc_draw){
if(!m_width)
return;
if(!rc_draw.intersects(m_rc))
return;
// 绘制背景
{
QRect rc(m_rc);
//rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
int from_x = max(rc_draw.left(), m_rc.left()) - m_rc.left();
int from_y = max(rc_draw.top(), m_rc.top()) - m_rc.top();
int w = min(m_rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(m_rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = m_rc.left() + from_x;
int to_y = m_rc.top() + from_y;
painter.drawPixmap(to_x, to_y, m_img_bg, from_x, from_y, w, h);
}
// 绘制播放按钮
{
QRect rc(m_rc_btn_play);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
if(rc_draw.intersects(rc)) {
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
if(m_playing){
if(m_play_hover)
painter.drawPixmap(to_x, to_y, m_img_btn_play[play_paused][widget_hover], from_x, from_y, w, h);
else
painter.drawPixmap(to_x, to_y, m_img_btn_play[play_paused][widget_normal], from_x, from_y, w, h);
} else {
if(m_play_hover)
painter.drawPixmap(to_x, to_y, m_img_btn_play[play_running][widget_hover], from_x, from_y, w, h);
else
painter.drawPixmap(to_x, to_y, m_img_btn_play[play_running][widget_normal], from_x, from_y, w, h);
}
}
}
// 绘制已播放时间
{
QRect rc(m_rc_time_passed);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
if(rc_draw.intersects(rc)) {
if(m_str_passed_time != m_str_passed_time_last_draw) {
m_img_time_passed = QPixmap(m_rc_time_passed.width(), m_rc_time_passed.height());
m_img_time_passed.fill(Qt::transparent);
QPainter pp(&m_img_time_passed);
pp.setPen(TEXT_COLOR);
QFont font = pp.font();
font.setFamily("consolas");
font.setBold(true);
font.setPixelSize(FONT_SIZE_TIME);
pp.setFont(font);
pp.drawText(QRect(0,0,m_rc_time_passed.width(), m_rc_time_passed.height()), Qt::AlignRight, m_str_passed_time);
m_str_passed_time_last_draw = m_str_passed_time;
}
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
painter.drawPixmap(to_x, to_y, m_img_time_passed, from_x, from_y, w, h);
}
}
// 绘制总时间
{
QRect rc(m_rc_time_total);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
if(rc_draw.intersects(rc)) {
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
painter.drawPixmap(to_x, to_y, m_img_time_total, from_x, from_y, w, h);
}
}
// 绘制进度条
{
QRect rc(m_rc_progress);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
if(rc_draw.intersects(rc)) {
if(m_percent_last_draw != m_percent) {
m_img_progress = QPixmap(m_rc_progress.width(), m_rc_progress.height());
m_img_progress.fill(Qt::transparent);
QPainter pp(&m_img_progress);
// 进度条
2019-09-09 12:15:53 +00:00
int top = (rc.height() - m_res[res_prgbarh_left].height())/2;
int passed_width = rc.width() * m_percent / 100; // 已经播放的进度条宽度
int remain_width = rc.width() - passed_width; // 剩下未播放的进度条宽度
2019-09-09 12:15:53 +00:00
if(passed_width >= m_res[res_prgbarh_left].width())
pp.drawPixmap(0, top , m_res[res_prgbarh_left].width(), m_res[res_prgbarh_left].height(), m_res[res_prgbarh_left]);
if(passed_width > 0) {
//pp.drawPixmap(m_res[res_pbh_left].width(), top, passed_width - m_res[res_pbh_left].width(), m_res[res_pbh_mid].height(), m_res[res_pbh_mid]);
2019-09-09 12:15:53 +00:00
if(remain_width > m_res[res_prgbar_right].width())
pp.drawPixmap(m_res[res_prgbarh_left].width(), top, passed_width - m_res[res_prgbarh_left].width(), m_res[res_prgbarh_mid].height(), m_res[res_prgbarh_mid]);
else
2019-09-09 12:15:53 +00:00
pp.drawPixmap(m_res[res_prgbarh_left].width(), top, passed_width - m_res[res_prgbarh_left].width() - m_res[res_prgbar_right].width(), m_res[res_prgbarh_mid].height(), m_res[res_prgbarh_mid]);
}
if(remain_width > 0)
2019-09-09 12:15:53 +00:00
pp.drawPixmap(passed_width, top, remain_width - m_res[res_prgbar_right].width(), m_res[res_prgbar_mid].height(), m_res[res_prgbar_mid]);
if(remain_width >= m_res[res_prgbar_right].width())
pp.drawPixmap(rc.width() - m_res[res_prgbar_right].width(), top , m_res[res_prgbar_right].width(), m_res[res_prgbar_right].height(), m_res[res_prgbar_right]);
// 进度位置指示
int left = passed_width - m_img_progress_pointer->width() / 2;
if(left < 0)
left = 0;
if(left + m_img_progress_pointer->width() > rc.width())
left = rc.width() - m_img_progress_pointer->width();
top = (rc.height() - m_img_progress_pointer[widget_normal].height())/2;
pp.drawPixmap(left, top , m_img_progress_pointer[widget_normal].width(), m_img_progress_pointer[widget_normal].height(), m_img_progress_pointer[widget_normal]);
m_percent_last_draw = m_percent;
}
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
painter.drawPixmap(to_x, to_y, m_img_progress, from_x, from_y, w, h);
}
}
// 绘制速度按钮
{
for(int i = 0; i < speed_count; i++) {
QRect rc(m_rc_btn_speed[i]);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
if(rc_draw.intersects(rc)) {
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
2019-09-09 12:15:53 +00:00
if(m_speed_hover == i)
painter.drawPixmap(to_x, to_y, m_img_btn_speed[i][btnspd_hover], from_x, from_y, w, h);
else if(m_speed_selected == i)
painter.drawPixmap(to_x, to_y, m_img_btn_speed[i][btnspd_sel], from_x, from_y, w, h);
else
2019-09-09 12:15:53 +00:00
painter.drawPixmap(to_x, to_y, m_img_btn_speed[i][btnspd_normal], from_x, from_y, w, h);
}
}
}
// 绘制跳过选项
{
QRect rc(m_rc_skip);
rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
2019-09-09 12:15:53 +00:00
// painter.fillRect(rc, QColor(255, 255, 255));
if(rc_draw.intersects(rc)) {
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_x = rc.left() + from_x;
int to_y = rc.top() + from_y;
//qDebug("skip (%d,%d), (%d,%d)/(%d,%d)", to_x, to_y, from_x, from_y, w, h);
2019-09-09 12:15:53 +00:00
if(m_skip_selected) {
if(m_skip_hover)
painter.drawPixmap(to_x, to_y, m_img_skip[chkbox_selected][widget_hover], from_x, from_y, w, h);
else
painter.drawPixmap(to_x, to_y, m_img_skip[chkbox_selected][widget_normal], from_x, from_y, w, h);
}
else {
if(m_skip_hover)
painter.drawPixmap(to_x, to_y, m_img_skip[chkbox_normal][widget_hover], from_x, from_y, w, h);
else
painter.drawPixmap(to_x, to_y, m_img_skip[chkbox_normal][widget_normal], from_x, from_y, w, h);
}
}
}
}