mirror of https://github.com/procxx/kepka.git
				
				
				
			Forward bar and unread counter added to top bar in OneColumn layout.
This commit is contained in:
		
							parent
							
								
									d12177befd
								
							
						
					
					
						commit
						b3d1602354
					
				|  | @ -817,6 +817,7 @@ contactsScroll: flatScroll(boxScroll) { | ||||||
| 
 | 
 | ||||||
| simpleCloseIcon: icon {{ "simple_close", #c7c7c7 }}; | simpleCloseIcon: icon {{ "simple_close", #c7c7c7 }}; | ||||||
| simpleCloseIconOver: icon {{ "simple_close", #a3a3a3 }}; | simpleCloseIconOver: icon {{ "simple_close", #a3a3a3 }}; | ||||||
|  | dialogsForwardCancelIcon: icon {{ "simple_close", dialogsForwardFg }}; | ||||||
| 
 | 
 | ||||||
| boxPhotoPadding: margins(28px, 28px, 28px, 18px); | boxPhotoPadding: margins(28px, 28px, 28px, 18px); | ||||||
| boxPhotoCompressedPadding: margins(0px, 2px, 0px, 22px); | boxPhotoCompressedPadding: margins(0px, 2px, 0px, 22px); | ||||||
|  |  | ||||||
|  | @ -143,6 +143,8 @@ dialogsVerifiedIconFgActive: dialogsVerifiedIconFgOver; | ||||||
| dialogsSendingIconFgActive: dialogsSendingIconFgOver; | dialogsSendingIconFgActive: dialogsSendingIconFgOver; | ||||||
| dialogsSentIconFgActive: dialogsSentIconFgOver; | dialogsSentIconFgActive: dialogsSentIconFgOver; | ||||||
| 
 | 
 | ||||||
|  | dialogsForwardFg: #ffffff; | ||||||
|  | 
 | ||||||
| // history | // history | ||||||
| topBarBg: windowBg; | topBarBg: windowBg; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 178 B After Width: | Height: | Size: 124 B | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 176 B | 
|  | @ -115,6 +115,7 @@ dialogsVerifiedIconBgActive: dialogsVerifiedIconBgOver; | ||||||
| dialogsVerifiedIconFgActive: dialogsVerifiedIconFgOver; | dialogsVerifiedIconFgActive: dialogsVerifiedIconFgOver; | ||||||
| dialogsSendingIconFgActive: dialogsSendingIconFgOver; | dialogsSendingIconFgActive: dialogsSendingIconFgOver; | ||||||
| dialogsSentIconFgActive: dialogsSentIconFgOver; | dialogsSentIconFgActive: dialogsSentIconFgOver; | ||||||
|  | dialogsForwardFg: #ffffff; | ||||||
| topBarBg: windowBg; | topBarBg: windowBg; | ||||||
| emojiPanBg: windowBg; | emojiPanBg: windowBg; | ||||||
| emojiPanCategories: #f7f7f7; // windowBg; | emojiPanCategories: #f7f7f7; // windowBg; | ||||||
|  |  | ||||||
|  | @ -932,9 +932,7 @@ void AppClass::call_handleHistoryUpdate() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AppClass::call_handleUnreadCounterUpdate() { | void AppClass::call_handleUnreadCounterUpdate() { | ||||||
| 	if (auto w = App::wnd()) { | 	Global::RefUnreadCounterUpdate().notify(true); | ||||||
| 		w->updateUnreadCounter(); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AppClass::call_handleFileDialogQueue() { | void AppClass::call_handleFileDialogQueue() { | ||||||
|  |  | ||||||
|  | @ -184,3 +184,19 @@ dialogsUpdateButton: flatButton { | ||||||
| 	font: semiboldFont; | 	font: semiboldFont; | ||||||
| 	overFont: semiboldFont; | 	overFont: semiboldFont; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | dialogsForwardHeight: 32px; | ||||||
|  | dialogsForwardTextLeft: 35px; | ||||||
|  | dialogsForwardTextTop: 6px; | ||||||
|  | dialogsForwardCancel: IconButton { | ||||||
|  | 	width: 34px; | ||||||
|  | 	height: dialogsForwardHeight; | ||||||
|  | 
 | ||||||
|  | 	icon: dialogsForwardCancelIcon; | ||||||
|  | 	iconOver: dialogsForwardCancelIcon; | ||||||
|  | 
 | ||||||
|  | 	iconPosition: point(12px, 11px); | ||||||
|  | 	iconPositionDown: point(12px, 11px); | ||||||
|  | } | ||||||
|  | dialogsForwardFont: semiboldFont; | ||||||
|  | dialogsForwardBg: windowActiveFill; | ||||||
|  |  | ||||||
|  | @ -1695,6 +1695,8 @@ DialogsWidget::DialogsWidget(QWidget *parent) : TWidget(parent) | ||||||
| 	onCheckUpdateStatus(); | 	onCheckUpdateStatus(); | ||||||
| #endif // !TDESKTOP_DISABLE_AUTOUPDATE
 | #endif // !TDESKTOP_DISABLE_AUTOUPDATE
 | ||||||
| 
 | 
 | ||||||
|  | 	subscribe(Adaptive::Changed(), [this] { updateForwardBar(); }); | ||||||
|  | 
 | ||||||
| 	_cancelSearch->setClickedCallback([this] { onCancelSearch(); }); | 	_cancelSearch->setClickedCallback([this] { onCancelSearch(); }); | ||||||
| 	_lockUnlock->setVisible(Global::LocalPasscode()); | 	_lockUnlock->setVisible(Global::LocalPasscode()); | ||||||
| 	subscribe(Global::RefLocalPasscodeChanged(), [this] { updateLockUnlockVisibility(); }); | 	subscribe(Global::RefLocalPasscodeChanged(), [this] { updateLockUnlockVisibility(); }); | ||||||
|  | @ -1767,17 +1769,24 @@ void DialogsWidget::dialogsToUp() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void DialogsWidget::showFast() { | ||||||
|  | 	show(); | ||||||
|  | 	updateForwardBar(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void DialogsWidget::showAnimated(Window::SlideDirection direction, const Window::SectionSlideParams ¶ms) { | void DialogsWidget::showAnimated(Window::SlideDirection direction, const Window::SectionSlideParams ¶ms) { | ||||||
| 	if (App::app()) App::app()->mtpPause(); | 	if (App::app()) App::app()->mtpPause(); | ||||||
| 
 | 
 | ||||||
| 	_cacheUnder = params.oldContentCache; | 	_cacheUnder = params.oldContentCache; | ||||||
| 	show(); | 	show(); | ||||||
|  | 	updateForwardBar(); | ||||||
| 	_cacheOver = App::main()->grabForShowAnimation(params); | 	_cacheOver = App::main()->grabForShowAnimation(params); | ||||||
| 
 | 
 | ||||||
| 	_a_show.stop(); | 	_a_show.stop(); | ||||||
| 
 | 
 | ||||||
| 	_scroll->hide(); | 	_scroll->hide(); | ||||||
| 	_mainMenuToggle->hide(); | 	_mainMenuToggle->hide(); | ||||||
|  | 	if (_forwardCancel) _forwardCancel->hide(); | ||||||
| 	_filter->hide(); | 	_filter->hide(); | ||||||
| 	_cancelSearch->hide(); | 	_cancelSearch->hide(); | ||||||
| 	_lockUnlock->hide(); | 	_lockUnlock->hide(); | ||||||
|  | @ -1809,6 +1818,7 @@ void DialogsWidget::step_show(float64 ms, bool timer) { | ||||||
| 
 | 
 | ||||||
| 		_scroll->show(); | 		_scroll->show(); | ||||||
| 		_mainMenuToggle->show(); | 		_mainMenuToggle->show(); | ||||||
|  | 		if (_forwardCancel) _forwardCancel->show(); | ||||||
| 		_filter->show(); | 		_filter->show(); | ||||||
| 		updateLockUnlockVisibility(); | 		updateLockUnlockVisibility(); | ||||||
| 		_a_show.stop(); | 		_a_show.stop(); | ||||||
|  | @ -2378,20 +2388,26 @@ void DialogsWidget::updateLockUnlockVisibility() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DialogsWidget::updateControlsGeometry() { | void DialogsWidget::updateControlsGeometry() { | ||||||
|  | 	auto filterTop = 0; | ||||||
|  | 	if (_forwardCancel) { | ||||||
|  | 		_forwardCancel->moveToLeft(0, filterTop); | ||||||
|  | 		filterTop += st::dialogsForwardHeight; | ||||||
|  | 	} | ||||||
| 	auto filterLeft = st::dialogsFilterPadding.x() * 2 + _mainMenuToggle->width(); | 	auto filterLeft = st::dialogsFilterPadding.x() * 2 + _mainMenuToggle->width(); | ||||||
| 	auto filterWidth = width() - 2 * st::dialogsFilterPadding.x(); | 	auto filterWidth = width() - 2 * st::dialogsFilterPadding.x(); | ||||||
| 	filterWidth -= st::dialogsFilterPadding.x() + _mainMenuToggle->width(); | 	filterWidth -= st::dialogsFilterPadding.x() + _mainMenuToggle->width(); | ||||||
| 	if (Global::LocalPasscode()) { | 	if (Global::LocalPasscode()) { | ||||||
| 		filterWidth -= st::dialogsFilterPadding.x() + _lockUnlock->width(); | 		filterWidth -= st::dialogsFilterPadding.x() + _lockUnlock->width(); | ||||||
| 	} | 	} | ||||||
| 	_filter->setGeometryToLeft(filterLeft, st::dialogsFilterPadding.y(), filterWidth, _filter->height()); | 	filterTop += st::dialogsFilterPadding.y(); | ||||||
|  | 	_filter->setGeometryToLeft(filterLeft, filterTop, filterWidth, _filter->height()); | ||||||
| 	_mainMenuToggle->moveToLeft(st::dialogsFilterPadding.x(), _filter->y()); | 	_mainMenuToggle->moveToLeft(st::dialogsFilterPadding.x(), _filter->y()); | ||||||
| 	_lockUnlock->moveToRight(st::dialogsFilterPadding.x(), _filter->y()); | 	_lockUnlock->moveToRight(st::dialogsFilterPadding.x(), _filter->y()); | ||||||
| 	_cancelSearch->moveToLeft(filterLeft + filterWidth - _cancelSearch->width(), _filter->y()); | 	_cancelSearch->moveToLeft(filterLeft + filterWidth - _cancelSearch->width(), _filter->y()); | ||||||
| 
 | 
 | ||||||
| 	auto addToScroll = App::main() ? App::main()->contentScrollAddToY() : 0; | 	auto addToScroll = App::main() ? App::main()->contentScrollAddToY() : 0; | ||||||
| 	auto newScrollTop = _scroll->scrollTop() + addToScroll; | 	auto newScrollTop = _scroll->scrollTop() + addToScroll; | ||||||
| 	auto scrollTop = _filter->height() + 2 * st::dialogsFilterPadding.y(); | 	auto scrollTop = filterTop + _filter->height() + st::dialogsFilterPadding.y(); | ||||||
| 	auto scrollHeight = height() - scrollTop; | 	auto scrollHeight = height() - scrollTop; | ||||||
| 	if (_updateTelegram) { | 	if (_updateTelegram) { | ||||||
| 		auto updateHeight = _updateTelegram->height(); | 		auto updateHeight = _updateTelegram->height(); | ||||||
|  | @ -2414,6 +2430,23 @@ void DialogsWidget::updateMainMenuGeometry() { | ||||||
| 	_mainMenu->moveToLeft(st::dialogsMenuPosition.x(), st::dialogsMenuPosition.y()); | 	_mainMenu->moveToLeft(st::dialogsMenuPosition.x(), st::dialogsMenuPosition.y()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void DialogsWidget::updateForwardBar() { | ||||||
|  | 	auto selecting = App::main()->selectingPeer(); | ||||||
|  | 	auto oneColumnSelecting = (Adaptive::OneColumn() && selecting); | ||||||
|  | 	if (!oneColumnSelecting == !_forwardCancel) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	if (oneColumnSelecting) { | ||||||
|  | 		_forwardCancel.create(this, st::dialogsForwardCancel); | ||||||
|  | 		_forwardCancel->setClickedCallback([] { Global::RefPeerChooseCancel().notify(true); }); | ||||||
|  | 		if (!_a_show.animating()) _forwardCancel->show(); | ||||||
|  | 	} else { | ||||||
|  | 		_forwardCancel.destroyDelayed(); | ||||||
|  | 	} | ||||||
|  | 	updateControlsGeometry(); | ||||||
|  | 	update(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void DialogsWidget::keyPressEvent(QKeyEvent *e) { | void DialogsWidget::keyPressEvent(QKeyEvent *e) { | ||||||
| 	if (e->key() == Qt::Key_Escape) { | 	if (e->key() == Qt::Key_Escape) { | ||||||
| 		e->ignore(); | 		e->ignore(); | ||||||
|  | @ -2464,11 +2497,19 @@ void DialogsWidget::paintEvent(QPaintEvent *e) { | ||||||
| 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), _cacheOver.height() / retina)); | 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), _cacheOver.height() / retina)); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	QRect above(0, 0, width(), _scroll->y()); | 	auto aboveTop = 0; | ||||||
|  | 	if (_forwardCancel) { | ||||||
|  | 		p.fillRect(0, aboveTop, width(), st::dialogsForwardHeight, st::dialogsForwardBg); | ||||||
|  | 		p.setPen(st::dialogsForwardFg); | ||||||
|  | 		p.setFont(st::dialogsForwardFont); | ||||||
|  | 		p.drawTextLeft(st::dialogsForwardTextLeft, st::dialogsForwardTextTop, width(), lang(lng_forward_choose)); | ||||||
|  | 		aboveTop += st::dialogsForwardHeight; | ||||||
|  | 	} | ||||||
|  | 	auto above = QRect(0, aboveTop, width(), _scroll->y()); | ||||||
| 	if (above.intersects(r)) { | 	if (above.intersects(r)) { | ||||||
| 		p.fillRect(above.intersected(r), st::dialogsBg); | 		p.fillRect(above.intersected(r), st::dialogsBg); | ||||||
| 	} | 	} | ||||||
| 	QRect below(0, _scroll->y() + qMin(_scroll->height(), _inner->height()), width(), height()); | 	auto below = QRect(0, _scroll->y() + qMin(_scroll->height(), _inner->height()), width(), height()); | ||||||
| 	if (below.intersects(r)) { | 	if (below.intersects(r)) { | ||||||
| 		p.fillRect(below.intersected(r), st::dialogsBg); | 		p.fillRect(below.intersected(r), st::dialogsBg); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -253,6 +253,7 @@ public: | ||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
| 	void showAnimated(Window::SlideDirection direction, const Window::SectionSlideParams ¶ms); | 	void showAnimated(Window::SlideDirection direction, const Window::SectionSlideParams ¶ms); | ||||||
|  | 	void showFast(); | ||||||
| 	void step_show(float64 ms, bool timer); | 	void step_show(float64 ms, bool timer); | ||||||
| 
 | 
 | ||||||
| 	void destroyData(); | 	void destroyData(); | ||||||
|  | @ -307,6 +308,7 @@ private: | ||||||
| 	void updateLockUnlockVisibility(); | 	void updateLockUnlockVisibility(); | ||||||
| 	void updateControlsGeometry(); | 	void updateControlsGeometry(); | ||||||
| 	void updateMainMenuGeometry(); | 	void updateMainMenuGeometry(); | ||||||
|  | 	void updateForwardBar(); | ||||||
| 
 | 
 | ||||||
| 	bool _dragInScroll = false; | 	bool _dragInScroll = false; | ||||||
| 	bool _dragForward = false; | 	bool _dragForward = false; | ||||||
|  | @ -325,6 +327,7 @@ private: | ||||||
| 	mtpRequestId _dialogsRequest = 0; | 	mtpRequestId _dialogsRequest = 0; | ||||||
| 	mtpRequestId _contactsRequest = 0; | 	mtpRequestId _contactsRequest = 0; | ||||||
| 
 | 
 | ||||||
|  | 	ChildWidget<Ui::IconButton> _forwardCancel = { nullptr }; | ||||||
| 	ChildWidget<Ui::IconButton> _mainMenuToggle; | 	ChildWidget<Ui::IconButton> _mainMenuToggle; | ||||||
| 	ChildWidget<Ui::DropdownMenu> _mainMenu = { nullptr }; | 	ChildWidget<Ui::DropdownMenu> _mainMenu = { nullptr }; | ||||||
| 	ChildWidget<FlatInput> _filter; | 	ChildWidget<FlatInput> _filter; | ||||||
|  |  | ||||||
|  | @ -666,6 +666,8 @@ struct Data { | ||||||
| 	base::Observable<void> LocalPasscodeChanged; | 	base::Observable<void> LocalPasscodeChanged; | ||||||
| 
 | 
 | ||||||
| 	base::Observable<HistoryItem*> ItemRemoved; | 	base::Observable<HistoryItem*> ItemRemoved; | ||||||
|  | 	base::Observable<void> UnreadCounterUpdate; | ||||||
|  | 	base::Observable<void> PeerChooseCancel; | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -781,5 +783,7 @@ DefineVar(Global, bool, LocalPasscode); | ||||||
| DefineRefVar(Global, base::Observable<void>, LocalPasscodeChanged); | DefineRefVar(Global, base::Observable<void>, LocalPasscodeChanged); | ||||||
| 
 | 
 | ||||||
| DefineRefVar(Global, base::Observable<HistoryItem*>, ItemRemoved); | DefineRefVar(Global, base::Observable<HistoryItem*>, ItemRemoved); | ||||||
|  | DefineRefVar(Global, base::Observable<void>, UnreadCounterUpdate); | ||||||
|  | DefineRefVar(Global, base::Observable<void>, PeerChooseCancel); | ||||||
| 
 | 
 | ||||||
| } // namespace Global
 | } // namespace Global
 | ||||||
|  |  | ||||||
|  | @ -355,6 +355,8 @@ DeclareVar(bool, LocalPasscode); | ||||||
| DeclareRefVar(base::Observable<void>, LocalPasscodeChanged); | DeclareRefVar(base::Observable<void>, LocalPasscodeChanged); | ||||||
| 
 | 
 | ||||||
| DeclareRefVar(base::Observable<HistoryItem*>, ItemRemoved); | DeclareRefVar(base::Observable<HistoryItem*>, ItemRemoved); | ||||||
|  | DeclareRefVar(base::Observable<void>, UnreadCounterUpdate); | ||||||
|  | DeclareRefVar(base::Observable<void>, PeerChooseCancel); | ||||||
| 
 | 
 | ||||||
| } // namespace Global
 | } // namespace Global
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2701,6 +2701,7 @@ HistoryHider::HistoryHider(MainWidget *parent, const QString &url, const QString | ||||||
| void HistoryHider::init() { | void HistoryHider::init() { | ||||||
| 	connect(_send, SIGNAL(clicked()), this, SLOT(forward())); | 	connect(_send, SIGNAL(clicked()), this, SLOT(forward())); | ||||||
| 	connect(_cancel, SIGNAL(clicked()), this, SLOT(startHide())); | 	connect(_cancel, SIGNAL(clicked()), this, SLOT(startHide())); | ||||||
|  | 	subscribe(Global::RefPeerChooseCancel(), [this] { startHide(); }); | ||||||
| 
 | 
 | ||||||
| 	_chooseWidth = st::forwardFont->width(lang(_botAndQuery.isEmpty() ? lng_forward_choose : lng_inline_switch_choose)); | 	_chooseWidth = st::forwardFont->width(lang(_botAndQuery.isEmpty() ? lng_forward_choose : lng_inline_switch_choose)); | ||||||
| 
 | 
 | ||||||
|  | @ -6240,7 +6241,7 @@ void HistoryWidget::onForwardHere() { | ||||||
| 	App::forward(_peer->id, ForwardContextMessage); | 	App::forward(_peer->id, ForwardContextMessage); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void HistoryWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | bool HistoryWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | ||||||
| 	if (_a_show.animating()) { | 	if (_a_show.animating()) { | ||||||
| 		int retina = cIntRetinaFactor(); | 		int retina = cIntRetinaFactor(); | ||||||
| 		if (a_coordOver.current() > 0) { | 		if (a_coordOver.current() > 0) { | ||||||
|  | @ -6252,10 +6253,10 @@ void HistoryWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | ||||||
| 		p.drawPixmap(QRect(a_coordOver.current(), 0, _cacheOver.width() / retina, st::topBarHeight), _cacheOver, QRect(0, 0, _cacheOver.width(), st::topBarHeight * retina)); | 		p.drawPixmap(QRect(a_coordOver.current(), 0, _cacheOver.width() / retina, st::topBarHeight), _cacheOver, QRect(0, 0, _cacheOver.width(), st::topBarHeight * retina)); | ||||||
| 		p.setOpacity(a_progress.current()); | 		p.setOpacity(a_progress.current()); | ||||||
| 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), st::topBarHeight)); | 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), st::topBarHeight)); | ||||||
| 		return; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!_history) return; | 	if (!_history) return false; | ||||||
| 
 | 
 | ||||||
| 	int increaseLeft = (Adaptive::OneColumn() || !App::main()->stackIsEmpty()) ? (st::topBarArrowPadding.left() - st::topBarArrowPadding.right()) : 0; | 	int increaseLeft = (Adaptive::OneColumn() || !App::main()->stackIsEmpty()) ? (st::topBarArrowPadding.left() - st::topBarArrowPadding.right()) : 0; | ||||||
| 	decreaseWidth += increaseLeft; | 	decreaseWidth += increaseLeft; | ||||||
|  | @ -6275,7 +6276,9 @@ void HistoryWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | ||||||
| 	if (Adaptive::OneColumn() || !App::main()->stackIsEmpty()) { | 	if (Adaptive::OneColumn() || !App::main()->stackIsEmpty()) { | ||||||
| 		p.setOpacity(st::topBarForwardAlpha + (1 - st::topBarForwardAlpha) * over); | 		p.setOpacity(st::topBarForwardAlpha + (1 - st::topBarForwardAlpha) * over); | ||||||
| 		st::topBarBackward.paint(p, (st::topBarArrowPadding.left() - st::topBarBackward.width()) / 2, (st::topBarHeight - st::topBarBackward.height()) / 2, width()); | 		st::topBarBackward.paint(p, (st::topBarArrowPadding.left() - st::topBarBackward.width()) / 2, (st::topBarHeight - st::topBarBackward.height()) / 2, width()); | ||||||
|  | 		p.setOpacity(1.); | ||||||
| 	} | 	} | ||||||
|  | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| QRect HistoryWidget::getMembersShowAreaGeometry() const { | QRect HistoryWidget::getMembersShowAreaGeometry() const { | ||||||
|  |  | ||||||
|  | @ -441,7 +441,7 @@ private: | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class HistoryHider : public TWidget { | class HistoryHider : public TWidget, private base::Subscriber { | ||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  | @ -559,7 +559,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	void updateTopBarSelection(); | 	void updateTopBarSelection(); | ||||||
| 
 | 
 | ||||||
| 	void paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | 	bool paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | ||||||
| 	QRect getMembersShowAreaGeometry() const; | 	QRect getMembersShowAreaGeometry() const; | ||||||
| 	void setMembersShowAreaActive(bool active); | 	void setMembersShowAreaActive(bool active); | ||||||
| 	void topBarClick(); | 	void topBarClick(); | ||||||
|  |  | ||||||
|  | @ -2264,7 +2264,7 @@ void MainWidget::ui_showPeerHistory(quint64 peerId, qint32 showAtMsgId, Ui::Show | ||||||
| 			if (!animationParams.oldContentCache.isNull()) { | 			if (!animationParams.oldContentCache.isNull()) { | ||||||
| 				_dialogs->showAnimated(back ? Window::SlideDirection::FromLeft : Window::SlideDirection::FromRight, animationParams); | 				_dialogs->showAnimated(back ? Window::SlideDirection::FromLeft : Window::SlideDirection::FromRight, animationParams); | ||||||
| 			} else { | 			} else { | ||||||
| 				_dialogs->show(); | 				_dialogs->showFast(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -2820,7 +2820,7 @@ void MainWidget::showAll() { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if (selectingPeer()) { | 		if (selectingPeer()) { | ||||||
| 			_dialogs->show(); | 			_dialogs->showFast(); | ||||||
| 			_history->hide(); | 			_history->hide(); | ||||||
| 			if (_overview) _overview->hide(); | 			if (_overview) _overview->hide(); | ||||||
| 			if (_wideSection) _wideSection->hide(); | 			if (_wideSection) _wideSection->hide(); | ||||||
|  | @ -2833,7 +2833,7 @@ void MainWidget::showAll() { | ||||||
| 			_history->show(); | 			_history->show(); | ||||||
| 			_history->updateControlsGeometry(); | 			_history->updateControlsGeometry(); | ||||||
| 		} else { | 		} else { | ||||||
| 			_dialogs->show(); | 			_dialogs->showFast(); | ||||||
| 			_history->hide(); | 			_history->hide(); | ||||||
| 		} | 		} | ||||||
| 		if (!selectingPeer()) { | 		if (!selectingPeer()) { | ||||||
|  | @ -2854,7 +2854,7 @@ void MainWidget::showAll() { | ||||||
| 				_forwardConfirm = 0; | 				_forwardConfirm = 0; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		_dialogs->show(); | 		_dialogs->showFast(); | ||||||
| 		if (_overview) { | 		if (_overview) { | ||||||
| 			_overview->show(); | 			_overview->show(); | ||||||
| 		} else if (_wideSection) { | 		} else if (_wideSection) { | ||||||
|  | @ -2972,12 +2972,13 @@ bool MainWidget::needBackButton() { | ||||||
| 	return _overview || _wideSection || _history->peer(); | 	return _overview || _wideSection || _history->peer(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void MainWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | bool MainWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | ||||||
| 	if (_overview) { | 	if (_overview) { | ||||||
| 		_overview->paintTopBar(p, over, decreaseWidth); | 		return _overview->paintTopBar(p, over, decreaseWidth); | ||||||
| 	} else if (!_wideSection) { | 	} else if (!_wideSection) { | ||||||
| 		_history->paintTopBar(p, over, decreaseWidth); | 		return _history->paintTopBar(p, over, decreaseWidth); | ||||||
| 	} | 	} | ||||||
|  | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| QRect MainWidget::getMembersShowAreaGeometry() const { | QRect MainWidget::getMembersShowAreaGeometry() const { | ||||||
|  |  | ||||||
|  | @ -144,7 +144,7 @@ public: | ||||||
| 	bool needBackButton(); | 	bool needBackButton(); | ||||||
| 
 | 
 | ||||||
| 	// Temporary methods, while top bar was not done inside HistoryWidget / OverviewWidget.
 | 	// Temporary methods, while top bar was not done inside HistoryWidget / OverviewWidget.
 | ||||||
| 	void paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | 	bool paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | ||||||
| 	QRect getMembersShowAreaGeometry() const; | 	QRect getMembersShowAreaGeometry() const; | ||||||
| 	void setMembersShowAreaActive(bool active); | 	void setMembersShowAreaActive(bool active); | ||||||
| 	Window::TopBarWidget *topBar(); | 	Window::TopBarWidget *topBar(); | ||||||
|  |  | ||||||
|  | @ -103,6 +103,7 @@ MainWindow::MainWindow() { | ||||||
| 			Notify::unreadCounterUpdated(); | 			Notify::unreadCounterUpdated(); | ||||||
| 		} | 		} | ||||||
| 	}); | 	}); | ||||||
|  | 	subscribe(Global::RefUnreadCounterUpdate(), [this] { updateUnreadCounter(); }); | ||||||
| 
 | 
 | ||||||
| 	resize(st::windowDefaultWidth, st::windowDefaultHeight); | 	resize(st::windowDefaultWidth, st::windowDefaultHeight); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -144,8 +144,6 @@ public: | ||||||
| 	bool isActive(bool cached = true) const; | 	bool isActive(bool cached = true) const; | ||||||
| 	void hideMediaview(); | 	void hideMediaview(); | ||||||
| 
 | 
 | ||||||
| 	void updateUnreadCounter(); |  | ||||||
| 
 |  | ||||||
| 	QImage iconWithCounter(int size, int count, const style::color &bg, const style::color &fg, bool smallIcon); | 	QImage iconWithCounter(int size, int count, const style::color &bg, const style::color &fg, bool smallIcon); | ||||||
| 
 | 
 | ||||||
| 	bool contentOverlapped(const QRect &globalRect); | 	bool contentOverlapped(const QRect &globalRect); | ||||||
|  | @ -217,6 +215,7 @@ private slots: | ||||||
| 	void onWindowActiveChanged(); | 	void onWindowActiveChanged(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | 	void updateUnreadCounter(); | ||||||
| 	void showConnecting(const QString &text, const QString &reconnect = QString()); | 	void showConnecting(const QString &text, const QString &reconnect = QString()); | ||||||
| 	void hideConnecting(); | 	void hideConnecting(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1969,7 +1969,7 @@ void OverviewWidget::scrollReset() { | ||||||
| 	_scroll.scrollToY((type() == OverviewMusicFiles || type() == OverviewVoiceFiles) ? _scroll.scrollTopMax() : 0); | 	_scroll.scrollToY((type() == OverviewMusicFiles || type() == OverviewVoiceFiles) ? _scroll.scrollTopMax() : 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void OverviewWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | bool OverviewWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) { | ||||||
| 	if (_a_show.animating()) { | 	if (_a_show.animating()) { | ||||||
| 		int retina = cIntRetinaFactor(); | 		int retina = cIntRetinaFactor(); | ||||||
| 		if (a_coordOver.current() > 0) { | 		if (a_coordOver.current() > 0) { | ||||||
|  | @ -1981,13 +1981,15 @@ void OverviewWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) | ||||||
| 		p.drawPixmap(QRect(a_coordOver.current(), 0, _cacheOver.width() / retina, st::topBarHeight), _cacheOver, QRect(0, 0, _cacheOver.width(), st::topBarHeight * retina)); | 		p.drawPixmap(QRect(a_coordOver.current(), 0, _cacheOver.width() / retina, st::topBarHeight), _cacheOver, QRect(0, 0, _cacheOver.width(), st::topBarHeight * retina)); | ||||||
| 		p.setOpacity(a_progress.current()); | 		p.setOpacity(a_progress.current()); | ||||||
| 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), st::topBarHeight)); | 		st::slideShadow.fill(p, QRect(a_coordOver.current() - st::slideShadow.width(), 0, st::slideShadow.width(), st::topBarHeight)); | ||||||
| 		return; | 		return false; | ||||||
| 	} | 	} | ||||||
| 	p.setOpacity(st::topBarBackAlpha + (1 - st::topBarBackAlpha) * over); | 	p.setOpacity(st::topBarBackAlpha + (1 - st::topBarBackAlpha) * over); | ||||||
| 	st::topBarBack.paint(p, (st::topBarArrowPadding.left() - st::topBarBack.width()) / 2, (st::topBarHeight - st::topBarBack.height()) / 2, width()); | 	st::topBarBack.paint(p, (st::topBarArrowPadding.left() - st::topBarBack.width()) / 2, (st::topBarHeight - st::topBarBack.height()) / 2, width()); | ||||||
| 	p.setFont(st::topBarBackFont); | 	p.setFont(st::topBarBackFont); | ||||||
| 	p.setPen(st::topBarBackColor); | 	p.setPen(st::topBarBackColor); | ||||||
| 	p.drawText(st::topBarArrowPadding.left(), (st::topBarHeight - st::topBarBackFont->height) / 2 + st::topBarBackFont->ascent, _header); | 	p.drawText(st::topBarArrowPadding.left(), (st::topBarHeight - st::topBarBackFont->height) / 2 + st::topBarBackFont->ascent, _header); | ||||||
|  | 	p.setOpacity(1.); | ||||||
|  | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void OverviewWidget::topBarClick() { | void OverviewWidget::topBarClick() { | ||||||
|  |  | ||||||
|  | @ -279,7 +279,7 @@ public: | ||||||
| 	void scrollBy(int32 add); | 	void scrollBy(int32 add); | ||||||
| 	void scrollReset(); | 	void scrollReset(); | ||||||
| 
 | 
 | ||||||
| 	void paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | 	bool paintTopBar(Painter &p, float64 over, int32 decreaseWidth); | ||||||
| 	void topBarClick(); | 	void topBarClick(); | ||||||
| 
 | 
 | ||||||
| 	PeerData *peer() const; | 	PeerData *peer() const; | ||||||
|  |  | ||||||
|  | @ -724,8 +724,8 @@ void MainWindow::psUpdateWorkmode() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void MainWindow::psUpdateCounter() { | void MainWindow::psUpdateCounter() { | ||||||
| 	int32 counter = App::histories().unreadBadge(); | 	auto counter = App::histories().unreadBadge(); | ||||||
| 	bool muted = App::histories().unreadOnlyMuted(); | 	auto muted = App::histories().unreadOnlyMuted(); | ||||||
| 
 | 
 | ||||||
| 	auto iconSizeSmall = QSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); | 	auto iconSizeSmall = QSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); | ||||||
| 	auto iconSizeBig = QSize(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); | 	auto iconSizeBig = QSize(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ profileTopBarHeight: topBarHeight; | ||||||
| profileTopBarBackIconPosition: point(12px, 20px); | profileTopBarBackIconPosition: point(12px, 20px); | ||||||
| profileTopBarBackFont: font(14px); | profileTopBarBackFont: font(14px); | ||||||
| profileTopBarBackFg: #1485c2; | profileTopBarBackFg: #1485c2; | ||||||
| profileTopBarBackPosition: point(32px, 17px); | profileTopBarBackPosition: point(39px, 17px); | ||||||
| profileFixedBarButton: topBarButton; | profileFixedBarButton: topBarButton; | ||||||
| 
 | 
 | ||||||
| profileMarginTop: 13px; | profileMarginTop: 13px; | ||||||
|  |  | ||||||
|  | @ -22,19 +22,24 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| #include "profile/profile_fixed_bar.h" | #include "profile/profile_fixed_bar.h" | ||||||
| 
 | 
 | ||||||
| #include "styles/style_profile.h" | #include "styles/style_profile.h" | ||||||
|  | #include "styles/style_window.h" | ||||||
| #include "ui/buttons/round_button.h" | #include "ui/buttons/round_button.h" | ||||||
| #include "lang.h" | #include "lang.h" | ||||||
| #include "mainwidget.h" | #include "mainwidget.h" | ||||||
| #include "boxes/addcontactbox.h" | #include "boxes/addcontactbox.h" | ||||||
| #include "boxes/confirmbox.h" | #include "boxes/confirmbox.h" | ||||||
| #include "observer_peer.h" | #include "observer_peer.h" | ||||||
|  | #include "window/top_bar_widget.h" | ||||||
| 
 | 
 | ||||||
| namespace Profile { | namespace Profile { | ||||||
| 
 | 
 | ||||||
| class BackButton final : public Button { | class BackButton final : public Button, private base::Subscriber { | ||||||
| public: | public: | ||||||
| 	BackButton(QWidget *parent) : Button(parent) { | 	BackButton(QWidget *parent) : Button(parent) { | ||||||
| 		setCursor(style::cur_pointer); | 		setCursor(style::cur_pointer); | ||||||
|  | 
 | ||||||
|  | 		subscribe(Adaptive::Changed(), [this] { updateAdaptiveLayout(); }); | ||||||
|  | 		updateAdaptiveLayout(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|  | @ -50,6 +55,8 @@ protected: | ||||||
| 		p.setFont(st::profileTopBarBackFont); | 		p.setFont(st::profileTopBarBackFont); | ||||||
| 		p.setPen(st::profileTopBarBackFg); | 		p.setPen(st::profileTopBarBackFg); | ||||||
| 		p.drawTextLeft(st::profileTopBarBackPosition.x(), st::profileTopBarBackPosition.y(), width(), lang(lng_menu_back)); | 		p.drawTextLeft(st::profileTopBarBackPosition.x(), st::profileTopBarBackPosition.y(), width(), lang(lng_menu_back)); | ||||||
|  | 
 | ||||||
|  | 		Window::TopBarWidget::paintUnreadCounter(p, width()); | ||||||
| 	} | 	} | ||||||
| 	void onStateChanged(int oldState, ButtonStateChangeSource source) override { | 	void onStateChanged(int oldState, ButtonStateChangeSource source) override { | ||||||
| 		if ((_state & Button::StateDown) && !(oldState & Button::StateDown)) { | 		if ((_state & Button::StateDown) && !(oldState & Button::StateDown)) { | ||||||
|  | @ -58,6 +65,17 @@ protected: | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | 	void updateAdaptiveLayout() { | ||||||
|  | 		if (!Adaptive::OneColumn()) { | ||||||
|  | 			unsubscribe(base::take(_unreadCounterSubscription)); | ||||||
|  | 		} else if (!_unreadCounterSubscription) { | ||||||
|  | 			_unreadCounterSubscription = subscribe(Global::RefUnreadCounterUpdate(), [this] { | ||||||
|  | 				rtlupdate(0, 0, st::titleUnreadCounterRight, st::titleUnreadCounterTop); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int _unreadCounterSubscription = 0; | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| #include "window/top_bar_widget.h" | #include "window/top_bar_widget.h" | ||||||
| 
 | 
 | ||||||
| #include "styles/style_history.h" | #include "styles/style_history.h" | ||||||
|  | #include "styles/style_window.h" | ||||||
| #include "boxes/addcontactbox.h" | #include "boxes/addcontactbox.h" | ||||||
| #include "boxes/confirmbox.h" | #include "boxes/confirmbox.h" | ||||||
| #include "mainwidget.h" | #include "mainwidget.h" | ||||||
|  | @ -33,6 +34,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org | ||||||
| #include "ui/buttons/icon_button.h" | #include "ui/buttons/icon_button.h" | ||||||
| #include "ui/widgets/dropdown_menu.h" | #include "ui/widgets/dropdown_menu.h" | ||||||
| #include "ui/flatbutton.h" | #include "ui/flatbutton.h" | ||||||
|  | #include "dialogs/dialogs_layout.h" | ||||||
| 
 | 
 | ||||||
| namespace Window { | namespace Window { | ||||||
| 
 | 
 | ||||||
|  | @ -57,6 +59,11 @@ TopBarWidget::TopBarWidget(MainWidget *w) : TWidget(w) | ||||||
| 	_menuToggle->setClickedCallback([this] { showMenu(); }); | 	_menuToggle->setClickedCallback([this] { showMenu(); }); | ||||||
| 
 | 
 | ||||||
| 	subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); | 	subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); | ||||||
|  | 	if (Adaptive::OneColumn()) { | ||||||
|  | 		_unreadCounterSubscription = subscribe(Global::RefUnreadCounterUpdate(), [this] { | ||||||
|  | 			rtlupdate(0, 0, st::titleUnreadCounterRight, st::titleUnreadCounterTop); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	setCursor(style::cur_pointer); | 	setCursor(style::cur_pointer); | ||||||
| 	showAll(); | 	showAll(); | ||||||
|  | @ -171,8 +178,27 @@ void TopBarWidget::paintEvent(QPaintEvent *e) { | ||||||
| 		if (!_search->isHidden()) { | 		if (!_search->isHidden()) { | ||||||
| 			decreaseWidth += _search->width(); | 			decreaseWidth += _search->width(); | ||||||
| 		} | 		} | ||||||
| 		main()->paintTopBar(p, a_over.current(), decreaseWidth); | 		auto paintCounter = main()->paintTopBar(p, a_over.current(), decreaseWidth); | ||||||
| 		p.restore(); | 		p.restore(); | ||||||
|  | 
 | ||||||
|  | 		if (paintCounter) { | ||||||
|  | 			paintUnreadCounter(p, width()); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TopBarWidget::paintUnreadCounter(Painter &p, int outerWidth) { | ||||||
|  | 	if (!Adaptive::OneColumn()) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	if (auto counter = App::histories().unreadBadge()) { | ||||||
|  | 		auto counterText = (counter > 99) ? qsl("..%1").arg(counter % 100) : QString::number(counter); | ||||||
|  | 		Dialogs::Layout::UnreadBadgeStyle unreadSt; | ||||||
|  | 		unreadSt.muted = App::histories().unreadOnlyMuted(); | ||||||
|  | 		auto unreadRight = st::titleUnreadCounterRight; | ||||||
|  | 		if (rtl()) unreadRight = outerWidth - st::titleUnreadCounterRight; | ||||||
|  | 		auto unreadTop = st::titleUnreadCounterTop; | ||||||
|  | 		Dialogs::Layout::paintUnreadCount(p, counterText, unreadRight, unreadTop, unreadSt); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -316,6 +342,13 @@ void TopBarWidget::showSelected(uint32 selCount, bool canDelete) { | ||||||
| void TopBarWidget::updateAdaptiveLayout() { | void TopBarWidget::updateAdaptiveLayout() { | ||||||
| 	updateMembersShowArea(); | 	updateMembersShowArea(); | ||||||
| 	showAll(); | 	showAll(); | ||||||
|  | 	if (!Adaptive::OneColumn()) { | ||||||
|  | 		unsubscribe(base::take(_unreadCounterSubscription)); | ||||||
|  | 	} else if (!_unreadCounterSubscription) { | ||||||
|  | 		_unreadCounterSubscription = subscribe(Global::RefUnreadCounterUpdate(), [this] { | ||||||
|  | 			rtlupdate(0, 0, st::titleUnreadCounterRight, st::titleUnreadCounterTop); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Ui::RoundButton *TopBarWidget::mediaTypeButton() { | Ui::RoundButton *TopBarWidget::mediaTypeButton() { | ||||||
|  |  | ||||||
|  | @ -56,6 +56,8 @@ public: | ||||||
| 
 | 
 | ||||||
| 	Ui::RoundButton *mediaTypeButton(); | 	Ui::RoundButton *mediaTypeButton(); | ||||||
| 
 | 
 | ||||||
|  | 	static void paintUnreadCounter(Painter &p, int outerWidth); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	bool eventFilter(QObject *obj, QEvent *e) override; | 	bool eventFilter(QObject *obj, QEvent *e) override; | ||||||
| 
 | 
 | ||||||
|  | @ -94,6 +96,8 @@ private: | ||||||
| 
 | 
 | ||||||
| 	ChildWidget<TWidget> _membersShowArea = { nullptr }; | 	ChildWidget<TWidget> _membersShowArea = { nullptr }; | ||||||
| 
 | 
 | ||||||
|  | 	int _unreadCounterSubscription = 0; | ||||||
|  | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Window
 | } // namespace Window
 | ||||||
|  |  | ||||||
|  | @ -82,6 +82,11 @@ notifySendReply: IconButton { | ||||||
| 	iconPositionDown: point(0px, 1px); | 	iconPositionDown: point(0px, 1px); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | titleUnreadCounterTop: 5px; | ||||||
|  | titleUnreadCounterRight: 35px; | ||||||
|  | 
 | ||||||
|  | // Windows specific title | ||||||
|  | 
 | ||||||
| titleHeight: 21px; | titleHeight: 21px; | ||||||
| titleButtonMinimize: IconButton { | titleButtonMinimize: IconButton { | ||||||
| 	width: 24px; | 	width: 24px; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue