49 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.2 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
 | |
| //
 | |
| #include "ui/widgets/fields/number_input.h"
 | |
| 
 | |
| namespace Ui {
 | |
| 
 | |
| NumberInput::NumberInput(
 | |
| 	QWidget *parent,
 | |
| 	const style::InputField &st,
 | |
| 	rpl::producer<QString> placeholder,
 | |
| 	const QString &value,
 | |
| 	int limit)
 | |
| : MaskedInputField(parent, st, std::move(placeholder), value)
 | |
| , _limit(limit) {
 | |
| 	if (!value.toInt() || (limit > 0 && value.toInt() > limit)) {
 | |
| 		setText(QString());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void NumberInput::correctValue(
 | |
| 		const QString &was,
 | |
| 		int wasCursor,
 | |
| 		QString &now,
 | |
| 		int &nowCursor) {
 | |
| 	QString newText;
 | |
| 	newText.reserve(now.size());
 | |
| 	auto newPos = nowCursor;
 | |
| 	for (auto i = 0, l = int(now.size()); i < l; ++i) {
 | |
| 		if (now.at(i).isDigit()) {
 | |
| 			newText.append(now.at(i));
 | |
| 		} else if (i < nowCursor) {
 | |
| 			--newPos;
 | |
| 		}
 | |
| 	}
 | |
| 	if (!newText.toInt()) {
 | |
| 		newText = QString();
 | |
| 		newPos = 0;
 | |
| 	} else if (_limit > 0 && newText.toInt() > _limit) {
 | |
| 		newText = was;
 | |
| 		newPos = wasCursor;
 | |
| 	}
 | |
| 	setCorrectedText(now, nowCursor, newText, newPos);
 | |
| }
 | |
| 
 | |
| } // namespace Ui
 | 
