117 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
This file is part of Telegram Desktop,
 | 
						|
the official desktop version of Telegram messaging app, see https://telegram.org
 | 
						|
 | 
						|
Telegram Desktop is free software: you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation, either version 3 of the License, or
 | 
						|
(at your option) any later version.
 | 
						|
 | 
						|
It is distributed in the hope that it will be useful,
 | 
						|
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
						|
GNU General Public License for more details.
 | 
						|
 | 
						|
In addition, as a special exception, the copyright holders give permission
 | 
						|
to link the code of portions of this program with the OpenSSL library.
 | 
						|
 | 
						|
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
 | 
						|
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
 | 
						|
*/
 | 
						|
#pragma once
 | 
						|
 | 
						|
namespace Profile {
 | 
						|
 | 
						|
class CoverWidget;
 | 
						|
class BlockWidget;
 | 
						|
class SectionMemento;
 | 
						|
 | 
						|
class InnerWidget final : public TWidget {
 | 
						|
	Q_OBJECT
 | 
						|
 | 
						|
public:
 | 
						|
	InnerWidget(QWidget *parent, PeerData *peer);
 | 
						|
 | 
						|
	PeerData *peer() const {
 | 
						|
		return _peer;
 | 
						|
	}
 | 
						|
 | 
						|
	void resizeToWidth(int newWidth, int minHeight) {
 | 
						|
		_minHeight = minHeight;
 | 
						|
		return TWidget::resizeToWidth(newWidth);
 | 
						|
	}
 | 
						|
 | 
						|
	// Updates the area that is visible inside the scroll container.
 | 
						|
	void setVisibleTopBottom(int visibleTop, int visibleBottom) override;
 | 
						|
 | 
						|
	// Profile fixed top bar should use this flag to decide
 | 
						|
	// if it shows "Share contact" button or not.
 | 
						|
	// It should show it only if it is hidden in the cover.
 | 
						|
	bool shareContactButtonShown() const;
 | 
						|
 | 
						|
	void saveState(gsl::not_null<SectionMemento*> memento);
 | 
						|
	void restoreState(gsl::not_null<SectionMemento*> memento);
 | 
						|
 | 
						|
	void showFinished();
 | 
						|
 | 
						|
signals:
 | 
						|
	void cancelled();
 | 
						|
 | 
						|
private slots:
 | 
						|
	void onBlockHeightUpdated();
 | 
						|
 | 
						|
protected:
 | 
						|
	void paintEvent(QPaintEvent *e) override;
 | 
						|
	void keyPressEvent(QKeyEvent *e) override;
 | 
						|
 | 
						|
	// Resizes content and counts natural widget height for the desired width.
 | 
						|
	int resizeGetHeight(int newWidth) override;
 | 
						|
 | 
						|
private:
 | 
						|
	void createBlocks();
 | 
						|
 | 
						|
	// Counts the natural widget height after resizing of child widgets.
 | 
						|
	int countHeight() const;
 | 
						|
 | 
						|
	enum class Mode {
 | 
						|
		OneColumn,
 | 
						|
		TwoColumn,
 | 
						|
	};
 | 
						|
	int countBlocksLeft(int newWidth) const;
 | 
						|
	Mode countBlocksMode(int newWidth) const;
 | 
						|
	int countLeftColumnWidth(int newWidth) const;
 | 
						|
	int countBlocksHeight(RectPart countSide) const;
 | 
						|
	void resizeBlocks(int newWidth);
 | 
						|
	void refreshBlocksPositions();
 | 
						|
 | 
						|
	// Sometimes height of this widget is larger than it is required
 | 
						|
	// so that it is allowed to scroll down to the desired position.
 | 
						|
	// When resizing with scroll moving up the additional height may be decreased.
 | 
						|
	void decreaseAdditionalHeight(int removeHeight);
 | 
						|
 | 
						|
	PeerData *_peer;
 | 
						|
 | 
						|
	// Height that we added to the natural height so that it is allowed
 | 
						|
	// to scroll down to the desired position.
 | 
						|
	int _addedHeight = 0;
 | 
						|
	int _minHeight = 0;
 | 
						|
	int _visibleTop = 0;
 | 
						|
	int _visibleBottom = 0;
 | 
						|
 | 
						|
	object_ptr<CoverWidget> _cover;
 | 
						|
 | 
						|
	int _blocksLeft = 0; // Caching countBlocksLeft() result.
 | 
						|
	int _blocksTop = 0;
 | 
						|
	int _columnDivider = 0;
 | 
						|
	int _leftColumnWidth = 0; // Caching countLeftColumnWidth() result.
 | 
						|
	struct Block {
 | 
						|
		BlockWidget *block;
 | 
						|
		RectPart side;
 | 
						|
	};
 | 
						|
	QList<Block> _blocks;
 | 
						|
 | 
						|
	Mode _mode = Mode::OneColumn;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Profile
 |