Auto update and codes ("loadlang" etc) supported in the new Settings.
This commit is contained in:
		
							parent
							
								
									fdab386178
								
							
						
					
					
						commit
						afab21372b
					
				
					 12 changed files with 318 additions and 17 deletions
				
			
		|  | @ -326,7 +326,7 @@ public: | ||||||
| 	} | 	} | ||||||
| 	lambda_wrap &operator=(const lambda_wrap &other) { | 	lambda_wrap &operator=(const lambda_wrap &other) { | ||||||
| 		auto temp = other; | 		auto temp = other; | ||||||
| 		other.swap(*this); | 		temp.swap(*this); | ||||||
| 		return *this; | 		return *this; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -650,6 +650,9 @@ struct Data { | ||||||
| 	bool TryIPv6 = (cPlatform() == dbipWindows) ? false : true; | 	bool TryIPv6 = (cPlatform() == dbipWindows) ? false : true; | ||||||
| 	ProxyData ConnectionProxy; | 	ProxyData ConnectionProxy; | ||||||
| 	base::Observable<void> ConnectionTypeChanged; | 	base::Observable<void> ConnectionTypeChanged; | ||||||
|  | 
 | ||||||
|  | 	base::Observable<void> ChooseCustomLang; | ||||||
|  | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace internal
 | } // namespace internal
 | ||||||
|  | @ -752,4 +755,6 @@ DefineVar(Global, bool, TryIPv6); | ||||||
| DefineVar(Global, ProxyData, ConnectionProxy); | DefineVar(Global, ProxyData, ConnectionProxy); | ||||||
| DefineRefVar(Global, base::Observable<void>, ConnectionTypeChanged); | DefineRefVar(Global, base::Observable<void>, ConnectionTypeChanged); | ||||||
| 
 | 
 | ||||||
|  | DefineRefVar(Global, base::Observable<void>, ChooseCustomLang); | ||||||
|  | 
 | ||||||
| } // namespace Global
 | } // namespace Global
 | ||||||
|  |  | ||||||
|  | @ -316,6 +316,8 @@ DeclareVar(bool, TryIPv6); | ||||||
| DeclareVar(ProxyData, ConnectionProxy); | DeclareVar(ProxyData, ConnectionProxy); | ||||||
| DeclareRefVar(base::Observable<void>, ConnectionTypeChanged); | DeclareRefVar(base::Observable<void>, ConnectionTypeChanged); | ||||||
| 
 | 
 | ||||||
|  | DeclareRefVar(base::Observable<void>, ChooseCustomLang); | ||||||
|  | 
 | ||||||
| } // namespace Global
 | } // namespace Global
 | ||||||
| 
 | 
 | ||||||
| namespace Adaptive { | namespace Adaptive { | ||||||
|  | @ -339,7 +341,7 @@ inline bool Wide() { | ||||||
| namespace DebugLogging { | namespace DebugLogging { | ||||||
| 
 | 
 | ||||||
| inline bool FileLoader() { | inline bool FileLoader() { | ||||||
| 	return (Global::DebugLoggingFlags() | FileLoaderFlag) != 0; | 	return (Global::DebugLoggingFlags() & FileLoaderFlag) != 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace DebugLogging
 | } // namespace DebugLogging
 | ||||||
|  |  | ||||||
|  | @ -136,3 +136,5 @@ settingsSliderLabelFg: #1485c2; | ||||||
| settingsSliderDuration: 200; | settingsSliderDuration: 200; | ||||||
| 
 | 
 | ||||||
| settingsBackgroundSize: 120px; | settingsBackgroundSize: 120px; | ||||||
|  | 
 | ||||||
|  | settingsUpdateFg: #999999; | ||||||
|  |  | ||||||
|  | @ -29,10 +29,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| #include "localstorage.h" | #include "localstorage.h" | ||||||
| #include "pspecific.h" | #include "pspecific.h" | ||||||
| #include "mainwindow.h" | #include "mainwindow.h" | ||||||
|  | #include "application.h" | ||||||
| #include "boxes/languagebox.h" | #include "boxes/languagebox.h" | ||||||
| #include "boxes/confirmbox.h" | #include "boxes/confirmbox.h" | ||||||
| #include "ui/filedialog.h" | #include "ui/filedialog.h" | ||||||
| #include "langloaderplain.h" | #include "langloaderplain.h" | ||||||
|  | #include "autoupdater.h" | ||||||
| 
 | 
 | ||||||
| namespace Settings { | namespace Settings { | ||||||
| namespace { | namespace { | ||||||
|  | @ -50,9 +52,125 @@ QString currentVersion() { | ||||||
| 
 | 
 | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
|  | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
|  | UpdateStateRow::UpdateStateRow(QWidget *parent) : TWidget(parent) | ||||||
|  | , _check(this, lang(lng_settings_check_now)) | ||||||
|  | , _restart(this, lang(lng_settings_update_now)) { | ||||||
|  | 	connect(_check, SIGNAL(clicked()), this, SLOT(onCheck())); | ||||||
|  | 	connect(_restart, SIGNAL(clicked()), this, SIGNAL(restart())); | ||||||
|  | 
 | ||||||
|  | 	Sandbox::connect(SIGNAL(updateChecking()), this, SLOT(onChecking())); | ||||||
|  | 	Sandbox::connect(SIGNAL(updateLatest()), this, SLOT(onLatest())); | ||||||
|  | 	Sandbox::connect(SIGNAL(updateProgress(qint64, qint64)), this, SLOT(onDownloading(qint64, qint64))); | ||||||
|  | 	Sandbox::connect(SIGNAL(updateFailed()), this, SLOT(onFailed())); | ||||||
|  | 	Sandbox::connect(SIGNAL(updateReady()), this, SLOT(onReady())); | ||||||
|  | 
 | ||||||
|  | 	switch (Sandbox::updatingState()) { | ||||||
|  | 	case Application::UpdatingDownload: | ||||||
|  | 		setState(State::Download, true); | ||||||
|  | 		setDownloadProgress(Sandbox::updatingReady(), Sandbox::updatingSize()); | ||||||
|  | 	break; | ||||||
|  | 	case Application::UpdatingReady: setState(State::Ready, true); break; | ||||||
|  | 	default: setState(State::None, true); break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int UpdateStateRow::resizeGetHeight(int newWidth) { | ||||||
|  | 	auto labelWidth = [](const QString &label) { | ||||||
|  | 		return st::linkFont->width(label) + st::linkFont->spacew; | ||||||
|  | 	}; | ||||||
|  | 	auto checkLeft = (_state == State::Latest) ? labelWidth(lang(lng_settings_latest_installed)) : 0; | ||||||
|  | 	auto restartLeft = labelWidth(lang(lng_settings_update_ready)); | ||||||
|  | 
 | ||||||
|  | 	_check->resizeToWidth(qMin(newWidth, _check->naturalWidth())); | ||||||
|  | 	_check->moveToLeft(checkLeft, 0); | ||||||
|  | 
 | ||||||
|  | 	_restart->resizeToWidth(qMin(newWidth, _restart->naturalWidth())); | ||||||
|  | 	_restart->moveToLeft(restartLeft, 0); | ||||||
|  | 
 | ||||||
|  | 	return _check->height(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::paintEvent(QPaintEvent *e) { | ||||||
|  | 	Painter p(this); | ||||||
|  | 
 | ||||||
|  | 	auto text = ([this]() -> QString { | ||||||
|  | 		switch (_state) { | ||||||
|  | 		case State::Check: return lang(lng_settings_update_checking); | ||||||
|  | 		case State::Latest: return lang(lng_settings_latest_installed); | ||||||
|  | 		case State::Download: return _downloadText; | ||||||
|  | 		case State::Ready: return lang(lng_settings_update_ready); | ||||||
|  | 		case State::Fail: return lang(lng_settings_update_fail); | ||||||
|  | 		default: return QString(); | ||||||
|  | 		} | ||||||
|  | 	})(); | ||||||
|  | 	p.setFont(st::linkFont); | ||||||
|  | 	p.setPen(st::settingsUpdateFg); | ||||||
|  | 	p.drawTextLeft(0, 0, width(), text); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onCheck() { | ||||||
|  | 	if (!cAutoUpdate()) return; | ||||||
|  | 
 | ||||||
|  | 	cSetLastUpdateCheck(0); | ||||||
|  | 	Sandbox::startUpdateCheck(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::setState(State state, bool force) { | ||||||
|  | 	if (_state != state || force) { | ||||||
|  | 		_state = state; | ||||||
|  | 		switch (state) { | ||||||
|  | 		case State::None: | ||||||
|  | 		case State::Latest: _check->show(); _restart->hide(); break; | ||||||
|  | 		case State::Ready: _check->hide(); _restart->show(); break; | ||||||
|  | 		case State::Check: | ||||||
|  | 		case State::Download: | ||||||
|  | 		case State::Fail: _check->hide(); _restart->hide(); break; | ||||||
|  | 		} | ||||||
|  | 		resizeToWidth(width()); | ||||||
|  | 		sendSynteticMouseEvent(this, QEvent::MouseMove, Qt::NoButton); | ||||||
|  | 		update(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::setDownloadProgress(qint64 ready, qint64 total) { | ||||||
|  | 	auto readyTenthMb = (ready * 10 / (1024 * 1024)), totalTenthMb = (total * 10 / (1024 * 1024)); | ||||||
|  | 	auto readyStr = QString::number(readyTenthMb / 10) + '.' + QString::number(readyTenthMb % 10); | ||||||
|  | 	auto totalStr = QString::number(totalTenthMb / 10) + '.' + QString::number(totalTenthMb % 10); | ||||||
|  | 	auto result = lng_settings_downloading(lt_ready, readyStr, lt_total, totalStr); | ||||||
|  | 	if (_downloadText != result) { | ||||||
|  | 		_downloadText = result; | ||||||
|  | 		update(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onChecking() { | ||||||
|  | 	setState(State::Check); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onLatest() { | ||||||
|  | 	setState(State::Latest); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onDownloading(qint64 ready, qint64 total) { | ||||||
|  | 	setState(State::Download); | ||||||
|  | 	setDownloadProgress(ready, total); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onReady() { | ||||||
|  | 	setState(State::Ready); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateStateRow::onFailed() { | ||||||
|  | 	setState(State::Fail); | ||||||
|  | } | ||||||
|  | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
|  | 
 | ||||||
| GeneralWidget::GeneralWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_general)) | GeneralWidget::GeneralWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_general)) | ||||||
| , _changeLanguage(this, lang(lng_settings_change_lang)) { | , _changeLanguage(this, lang(lng_settings_change_lang)) { | ||||||
| 	connect(_changeLanguage, SIGNAL(clicked()), this, SLOT(onChangeLanguage())); | 	connect(_changeLanguage, SIGNAL(clicked()), this, SLOT(onChangeLanguage())); | ||||||
|  | 	subscribe(Global::RefChooseCustomLang(), [this]() { chooseCustomLang(); }); | ||||||
|  | 	FileDialog::registerObserver(this, &GeneralWidget::notifyFileQueryUpdated); | ||||||
| 	refreshControls(); | 	refreshControls(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -70,7 +188,8 @@ void GeneralWidget::refreshControls() { | ||||||
| #ifndef TDESKTOP_DISABLE_AUTOUPDATE | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
| 	addChildRow(_updateAutomatically, marginSub, lng_settings_update_automatically(lt_version, currentVersion()), SLOT(onUpdateAutomatically()), cAutoUpdate()); | 	addChildRow(_updateAutomatically, marginSub, lng_settings_update_automatically(lt_version, currentVersion()), SLOT(onUpdateAutomatically()), cAutoUpdate()); | ||||||
| 	style::margins marginLink(st::defaultCheckbox.textPosition.x(), 0, 0, st::settingsSkip); | 	style::margins marginLink(st::defaultCheckbox.textPosition.x(), 0, 0, st::settingsSkip); | ||||||
| 	addChildRow(_checkForUpdates, marginLink, lang(lng_settings_check_now), SLOT(onCheckForUpdates())); | 	addChildRow(_updateRow, marginLink, slidedPadding); | ||||||
|  | 	connect(_updateRow->entity(), SIGNAL(restart()), this, SLOT(onRestart())); | ||||||
| #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
| 
 | 
 | ||||||
| 	if (cPlatform() == dbipWindows || cSupportTray()) { | 	if (cPlatform() == dbipWindows || cSupportTray()) { | ||||||
|  | @ -132,17 +251,36 @@ void GeneralWidget::onSaveTestLanguage() { | ||||||
| 	cSetLangFile(_testLanguage); | 	cSetLangFile(_testLanguage); | ||||||
| 	cSetLang(languageTest); | 	cSetLang(languageTest); | ||||||
| 	Local::writeSettings(); | 	Local::writeSettings(); | ||||||
|  | 	onRestart(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeneralWidget::onRestart() { | ||||||
|  | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
|  | 	checkReadyUpdate(); | ||||||
|  | 	if (_updateRow->entity()->isUpdateReady()) { | ||||||
|  | 		cSetRestartingUpdate(true); | ||||||
|  | 	} else { | ||||||
|  | 		cSetRestarting(true); | ||||||
|  | 		cSetRestartingToSettings(true); | ||||||
|  | 	} | ||||||
|  | #else | ||||||
| 	cSetRestarting(true); | 	cSetRestarting(true); | ||||||
|  | 	cSetRestartingToSettings(true); | ||||||
|  | #endif | ||||||
| 	App::quit(); | 	App::quit(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifndef TDESKTOP_DISABLE_AUTOUPDATE | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
| void GeneralWidget::onUpdateAutomatically() { | void GeneralWidget::onUpdateAutomatically() { | ||||||
| 
 | 	cSetAutoUpdate(_updateAutomatically->checked()); | ||||||
| } | 	Local::writeSettings(); | ||||||
| 
 | 	if (cAutoUpdate()) { | ||||||
| void GeneralWidget::onCheckForUpdates() { | 		_updateRow->slideDown(); | ||||||
| 
 | 		Sandbox::startUpdateCheck(); | ||||||
|  | 	} else { | ||||||
|  | 		_updateRow->slideUp(); | ||||||
|  | 		Sandbox::stopUpdate(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -33,6 +33,55 @@ class WidgetSlideWrap; | ||||||
| 
 | 
 | ||||||
| namespace Settings { | namespace Settings { | ||||||
| 
 | 
 | ||||||
|  | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
|  | class UpdateStateRow : public TWidget { | ||||||
|  | 	Q_OBJECT | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	UpdateStateRow(QWidget *parent); | ||||||
|  | 
 | ||||||
|  | 	bool isUpdateReady() const { | ||||||
|  | 		return (_state == State::Ready); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	int resizeGetHeight(int newWidth) override; | ||||||
|  | 
 | ||||||
|  | 	void paintEvent(QPaintEvent *e) override; | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  | 	void restart(); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 	void onCheck(); | ||||||
|  | 
 | ||||||
|  | 	void onChecking(); | ||||||
|  | 	void onLatest(); | ||||||
|  | 	void onDownloading(qint64 ready, qint64 total); | ||||||
|  | 	void onReady(); | ||||||
|  | 	void onFailed(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	enum class State { | ||||||
|  | 		None, | ||||||
|  | 		Check, | ||||||
|  | 		Latest, | ||||||
|  | 		Download, | ||||||
|  | 		Fail, | ||||||
|  | 		Ready | ||||||
|  | 	}; | ||||||
|  | 	void setState(State state, bool force = false); | ||||||
|  | 	void setDownloadProgress(qint64 ready, qint64 total); | ||||||
|  | 
 | ||||||
|  | 	ChildWidget<LinkButton> _check; | ||||||
|  | 	ChildWidget<LinkButton> _restart; | ||||||
|  | 
 | ||||||
|  | 	State _state = State::None; | ||||||
|  | 	QString _downloadText; | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
|  | 
 | ||||||
| class GeneralWidget : public BlockWidget { | class GeneralWidget : public BlockWidget { | ||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 
 | 
 | ||||||
|  | @ -48,7 +97,6 @@ private slots: | ||||||
| 
 | 
 | ||||||
| #ifndef TDESKTOP_DISABLE_AUTOUPDATE | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
| 	void onUpdateAutomatically(); | 	void onUpdateAutomatically(); | ||||||
| 	void onCheckForUpdates(); |  | ||||||
| #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
| 
 | 
 | ||||||
| 	void onEnableTrayIcon(); | 	void onEnableTrayIcon(); | ||||||
|  | @ -58,6 +106,8 @@ private slots: | ||||||
| 	void onStartMinimized(); | 	void onStartMinimized(); | ||||||
| 	void onAddInSendTo(); | 	void onAddInSendTo(); | ||||||
| 
 | 
 | ||||||
|  | 	void onRestart(); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
| 	void refreshControls(); | 	void refreshControls(); | ||||||
| 	void updateWorkmode(); | 	void updateWorkmode(); | ||||||
|  | @ -67,7 +117,7 @@ private: | ||||||
| 	ChildWidget<LinkButton> _changeLanguage; | 	ChildWidget<LinkButton> _changeLanguage; | ||||||
| #ifndef TDESKTOP_DISABLE_AUTOUPDATE | #ifndef TDESKTOP_DISABLE_AUTOUPDATE | ||||||
| 	ChildWidget<Checkbox> _updateAutomatically = { nullptr }; | 	ChildWidget<Checkbox> _updateAutomatically = { nullptr }; | ||||||
| 	ChildWidget<LinkButton> _checkForUpdates = { nullptr }; | 	ChildWidget<Ui::WidgetSlideWrap<UpdateStateRow>> _updateRow = { nullptr }; | ||||||
| #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | #endif // TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
| 	ChildWidget<Checkbox> _enableTrayIcon = { nullptr }; | 	ChildWidget<Checkbox> _enableTrayIcon = { nullptr }; | ||||||
| 	ChildWidget<Checkbox> _enableTaskbarIcon = { nullptr }; | 	ChildWidget<Checkbox> _enableTaskbarIcon = { nullptr }; | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| 
 | 
 | ||||||
| #include "styles/style_settings.h" | #include "styles/style_settings.h" | ||||||
| #include "lang.h" | #include "lang.h" | ||||||
|  | #include "boxes/sessionsbox.h" | ||||||
| 
 | 
 | ||||||
| namespace Settings { | namespace Settings { | ||||||
| 
 | 
 | ||||||
|  | @ -49,7 +50,7 @@ void PrivacyWidget::onEditPassword() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PrivacyWidget::onShowSessions() { | void PrivacyWidget::onShowSessions() { | ||||||
| 
 | 	Ui::showLayer(new SessionsBox()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace Settings
 | } // namespace Settings
 | ||||||
|  |  | ||||||
|  | @ -24,6 +24,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| 
 | 
 | ||||||
| namespace Settings { | namespace Settings { | ||||||
| 
 | 
 | ||||||
|  | class LocalPasscodeState : public TWidget { | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class CloudPasswordState : public TWidget { | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| class PrivacyWidget : public BlockWidget { | class PrivacyWidget : public BlockWidget { | ||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 
 | 
 | ||||||
|  | @ -38,6 +44,9 @@ private slots: | ||||||
| private: | private: | ||||||
| 	void refreshControls(); | 	void refreshControls(); | ||||||
| 
 | 
 | ||||||
|  | 	//ChildWidget<LocalPasscodeState> _localPasscodeState = { nullptr };
 | ||||||
|  | 	//ChildWidget<Ui::WidgetSlideWrap<LabeledLink>> _autoLock = { nullptr };
 | ||||||
|  | 	//ChildWidget<CloudPasswordState> _cloudPasswordState = { nullptr };
 | ||||||
| 	ChildWidget<LinkButton> _editPasscode = { nullptr }; | 	ChildWidget<LinkButton> _editPasscode = { nullptr }; | ||||||
| 	ChildWidget<LinkButton> _editPassword = { nullptr }; | 	ChildWidget<LinkButton> _editPassword = { nullptr }; | ||||||
| 	ChildWidget<LinkButton> _showAllSessions = { nullptr }; | 	ChildWidget<LinkButton> _showAllSessions = { nullptr }; | ||||||
|  |  | ||||||
|  | @ -26,8 +26,94 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| #include "styles/style_settings.h" | #include "styles/style_settings.h" | ||||||
| #include "ui/scrollarea.h" | #include "ui/scrollarea.h" | ||||||
| #include "mainwindow.h" | #include "mainwindow.h" | ||||||
|  | #include "localstorage.h" | ||||||
|  | #include "boxes/confirmbox.h" | ||||||
|  | #include "application.h" | ||||||
| 
 | 
 | ||||||
| namespace Settings { | namespace Settings { | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | QString SecretText; | ||||||
|  | QMap<QString, base::lambda_wrap<void()>> Codes; | ||||||
|  | 
 | ||||||
|  | void fillCodes() { | ||||||
|  | 	Codes.insert(qsl("debugmode"), []() { | ||||||
|  | 		QString text = cDebug() ? qsl("Do you want to disable DEBUG logs?") : qsl("Do you want to enable DEBUG logs?\n\nAll network events will be logged."); | ||||||
|  | 		ConfirmBox *box = new ConfirmBox(text); | ||||||
|  | 		box->connect(box, SIGNAL(confirmed()), App::app(), SLOT(onSwitchDebugMode())); | ||||||
|  | 		Ui::showLayer(box); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("testmode"), []() { | ||||||
|  | 		QString text = cTestMode() ? qsl("Do you want to disable TEST mode?") : qsl("Do you want to enable TEST mode?\n\nYou will be switched to test cloud."); | ||||||
|  | 		ConfirmBox *box = new ConfirmBox(text); | ||||||
|  | 		box->connect(box, SIGNAL(confirmed()), App::app(), SLOT(onSwitchTestMode())); | ||||||
|  | 		Ui::showLayer(box); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("loadlang"), []() { | ||||||
|  | 		Global::RefChooseCustomLang().notify(); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("debugfiles"), []() { | ||||||
|  | 		if (!cDebug()) return; | ||||||
|  | 		if (DebugLogging::FileLoader()) { | ||||||
|  | 			Global::RefDebugLoggingFlags() &= ~DebugLogging::FileLoaderFlag; | ||||||
|  | 		} else { | ||||||
|  | 			Global::RefDebugLoggingFlags() |= DebugLogging::FileLoaderFlag; | ||||||
|  | 		} | ||||||
|  | 		Ui::showLayer(new InformBox(DebugLogging::FileLoader() ? qsl("Enabled file download logging") : qsl("Disabled file download logging"))); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("crashplease"), []() { | ||||||
|  | 		t_assert(!"Crashed in Settings!"); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("workmode"), []() { | ||||||
|  | 		auto text = Global::DialogsModeEnabled() ? qsl("Disable work mode?") : qsl("Enable work mode?"); | ||||||
|  | 		auto box = std_::make_unique<ConfirmBox>(text); | ||||||
|  | 		box->connect(box.get(), SIGNAL(confirmed()), App::app(), SLOT(onSwitchWorkMode())); | ||||||
|  | 		Ui::showLayer(box.release()); | ||||||
|  | 	}); | ||||||
|  | 	Codes.insert(qsl("moderate"), []() { | ||||||
|  | 		auto text = Global::ModerateModeEnabled() ? qsl("Disable moderate mode?") : qsl("Enable moderate mode?"); | ||||||
|  | 		auto box = std_::make_unique<ConfirmBox>(text); | ||||||
|  | 		box->setConfirmedCallback([]() { | ||||||
|  | 			Global::SetModerateModeEnabled(!Global::ModerateModeEnabled()); | ||||||
|  | 			Local::writeUserSettings(); | ||||||
|  | 			Ui::hideLayer(); | ||||||
|  | 		}); | ||||||
|  | 		Ui::showLayer(box.release()); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void codesFeedString(const QString &text) { | ||||||
|  | 	if (Codes.isEmpty()) fillCodes(); | ||||||
|  | 
 | ||||||
|  | 	SecretText += text.toLower(); | ||||||
|  | 	int size = SecretText.size(), from = 0; | ||||||
|  | 	while (size > from) { | ||||||
|  | 		auto piece = SecretText.midRef(from); | ||||||
|  | 		auto found = false; | ||||||
|  | 		for (auto i = Codes.cbegin(), e = Codes.cend(); i != e; ++i) { | ||||||
|  | 			if (piece == i.key()) { | ||||||
|  | 				(*i)(); | ||||||
|  | 				from = size; | ||||||
|  | 				found = true; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if (found) break; | ||||||
|  | 
 | ||||||
|  | 		for (auto i = Codes.cbegin(), e = Codes.cend(); i != e; ++i) { | ||||||
|  | 			if (i.key().startsWith(piece)) { | ||||||
|  | 				found = true; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if (found) break; | ||||||
|  | 
 | ||||||
|  | 		++from; | ||||||
|  | 	} | ||||||
|  | 	SecretText = (size > from) ? SecretText.mid(from) : QString(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
| 
 | 
 | ||||||
| Widget::Widget() : LayerWidget() | Widget::Widget() : LayerWidget() | ||||||
| , _scroll(this, st::setScroll) | , _scroll(this, st::setScroll) | ||||||
|  | @ -127,4 +213,9 @@ void Widget::resizeEvent(QResizeEvent *e) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Widget::keyPressEvent(QKeyEvent *e) { | ||||||
|  | 	codesFeedString(e->text()); | ||||||
|  | 	return LayerWidget::keyPressEvent(e); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Settings
 | } // namespace Settings
 | ||||||
|  |  | ||||||
|  | @ -39,6 +39,7 @@ public: | ||||||
| protected: | protected: | ||||||
| 	void paintEvent(QPaintEvent *e) override; | 	void paintEvent(QPaintEvent *e) override; | ||||||
| 	void resizeEvent(QResizeEvent *e) override; | 	void resizeEvent(QResizeEvent *e) override; | ||||||
|  | 	void keyPressEvent(QKeyEvent *e) override; | ||||||
| 
 | 
 | ||||||
| private slots: | private slots: | ||||||
| 	void onInnerHeightUpdated(); | 	void onInnerHeightUpdated(); | ||||||
|  |  | ||||||
|  | @ -121,9 +121,10 @@ void ToggleableShadow::paintEvent(QPaintEvent *e) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void sendSynteticMouseEvent(QWidget *widget, QEvent::Type type, Qt::MouseButton button, const QPoint &globalPoint) { | void sendSynteticMouseEvent(QWidget *widget, QEvent::Type type, Qt::MouseButton button, const QPoint &globalPoint) { | ||||||
| 	auto windowHandle = widget->window()->windowHandle(); | 	if (auto windowHandle = widget->window()->windowHandle()) { | ||||||
| 	auto localPoint = windowHandle->mapFromGlobal(globalPoint); | 		auto localPoint = windowHandle->mapFromGlobal(globalPoint); | ||||||
| 	QMouseEvent ev(type, localPoint, localPoint, globalPoint, button, QGuiApplication::mouseButtons() | button, QGuiApplication::keyboardModifiers(), Qt::MouseEventSynthesizedByApplication); | 		QMouseEvent ev(type, localPoint, localPoint, globalPoint, button, QGuiApplication::mouseButtons() | button, QGuiApplication::keyboardModifiers(), Qt::MouseEventSynthesizedByApplication); | ||||||
| 	ev.setTimestamp(getms()); | 		ev.setTimestamp(getms()); | ||||||
| 	QGuiApplication::sendEvent(windowHandle, &ev); | 		QGuiApplication::sendEvent(windowHandle, &ev); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -118,7 +118,8 @@ public: | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	int naturalWidth() const override { | 	int naturalWidth() const override { | ||||||
| 		return _padding.top() + _entity->naturalWidth() + _padding.bottom(); | 		auto inner = _entity->naturalWidth(); | ||||||
|  | 		return (inner < 0) ? inner : (_padding.left() + inner + _padding.right()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 John Preston
						John Preston