115 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// This file is part of Desktop App Toolkit,
 | 
						|
// a set of libraries for developing nice desktop applications.
 | 
						|
//
 | 
						|
// For license and copyright information please follow this link:
 | 
						|
// https://github.com/desktop-app/legal/blob/master/LEGAL
 | 
						|
//
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "ui/rp_widget.h"
 | 
						|
#include "ui/effects/animations.h"
 | 
						|
 | 
						|
namespace style {
 | 
						|
struct FlatLabel;
 | 
						|
} // namespace style
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
 | 
						|
class NumbersAnimation {
 | 
						|
public:
 | 
						|
	NumbersAnimation(
 | 
						|
		const style::font &font,
 | 
						|
		Fn<void()> animationCallback);
 | 
						|
 | 
						|
	void setWidthChangedCallback(Fn<void()> callback) {
 | 
						|
		_widthChangedCallback = std::move(callback);
 | 
						|
	}
 | 
						|
	void setText(const QString &text, int value);
 | 
						|
	void setDuration(int duration);
 | 
						|
	void setDisabledMonospace(bool value);
 | 
						|
	void finishAnimating();
 | 
						|
 | 
						|
	void paint(QPainter &p, int x, int y, int outerWidth);
 | 
						|
	int countWidth() const;
 | 
						|
	int maxWidth() const;
 | 
						|
 | 
						|
private:
 | 
						|
	struct Digit {
 | 
						|
		QChar from = 0;
 | 
						|
		QChar to = 0;
 | 
						|
		int fromWidth = 0;
 | 
						|
		int toWidth = 0;
 | 
						|
	};
 | 
						|
 | 
						|
	void animationCallback();
 | 
						|
	void realSetText(QString text, int value);
 | 
						|
 | 
						|
	const style::font &_font;
 | 
						|
 | 
						|
	int _duration;
 | 
						|
 | 
						|
	QList<Digit> _digits;
 | 
						|
	int _digitWidth = 0;
 | 
						|
 | 
						|
	int _fromWidth = 0;
 | 
						|
	int _toWidth = 0;
 | 
						|
 | 
						|
	Ui::Animations::Simple _a_ready;
 | 
						|
	QString _delayedText;
 | 
						|
	int _delayedValue = 0;
 | 
						|
 | 
						|
	int _value = 0;
 | 
						|
	bool _growing = false;
 | 
						|
 | 
						|
	bool _disabledMonospace = false;
 | 
						|
 | 
						|
	Fn<void()> _animationCallback;
 | 
						|
	Fn<void()> _widthChangedCallback;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
struct StringWithNumbers {
 | 
						|
	static StringWithNumbers FromString(const QString &text) {
 | 
						|
		return { text };
 | 
						|
	}
 | 
						|
 | 
						|
	QString text;
 | 
						|
	int offset = -1;
 | 
						|
	int length = 0;
 | 
						|
};
 | 
						|
 | 
						|
class LabelWithNumbers : public Ui::RpWidget {
 | 
						|
public:
 | 
						|
	LabelWithNumbers(
 | 
						|
		QWidget *parent,
 | 
						|
		const style::FlatLabel &st,
 | 
						|
		int textTop,
 | 
						|
		const StringWithNumbers &value);
 | 
						|
 | 
						|
	void setValue(const StringWithNumbers &value);
 | 
						|
	void finishAnimating();
 | 
						|
 | 
						|
	int naturalWidth() const override {
 | 
						|
		return _beforeWidth + _numbers.maxWidth() + _afterWidth;
 | 
						|
	}
 | 
						|
 | 
						|
protected:
 | 
						|
	void paintEvent(QPaintEvent *e) override;
 | 
						|
 | 
						|
private:
 | 
						|
	static QString GetBefore(const StringWithNumbers &value);
 | 
						|
	static QString GetAfter(const StringWithNumbers &value);
 | 
						|
	static QString GetNumbers(const StringWithNumbers &value);
 | 
						|
 | 
						|
	const style::FlatLabel &_st;
 | 
						|
	int _textTop;
 | 
						|
	QString _before;
 | 
						|
	QString _after;
 | 
						|
	NumbersAnimation _numbers;
 | 
						|
	int _beforeWidth = 0;
 | 
						|
	int _afterWidth = 0;
 | 
						|
	Ui::Animations::Simple _beforeWidthAnimation;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Ui
 |