/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "export/export_settings.h" #include "ui/rp_widget.h" #include "base/object_ptr.h" namespace Ui { class VerticalLayout; class Checkbox; class ScrollArea; class BoxContent; } // namespace Ui namespace Main { class Session; } // namespace Main namespace Export { namespace View { constexpr auto kSizeValueCount = 90; int SizeLimitByIndex(int index); class SettingsWidget : public Ui::RpWidget { public: SettingsWidget( QWidget *parent, not_null session, Settings data); rpl::producer value() const; rpl::producer changes() const; rpl::producer<> startClicks() const; rpl::producer<> cancelClicks() const; void setShowBoxCallback(Fn)> callback) { _showBoxCallback = std::move(callback); } private: using Type = Settings::Type; using Types = Settings::Types; using MediaType = MediaSettings::Type; using MediaTypes = MediaSettings::Types; using Format = Output::Format; void setupContent(); not_null setupButtons( not_null scroll, not_null wrap); void setupOptions(not_null container); void setupFullExportOptions(not_null container); void setupMediaOptions(not_null container); void setupOtherOptions(not_null container); void setupPathAndFormat(not_null container); void addHeader( not_null container, const QString &text); not_null addOption( not_null container, const QString &text, Types types); not_null addOptionWithAbout( not_null container, const QString &text, Types types, const QString &about); void addChatOption( not_null container, const QString &text, Types types); void addMediaOptions(not_null container); void addMediaOption( not_null container, const QString &text, MediaType type); void addSizeSlider(not_null container); void addLocationLabel( not_null container); void addFormatAndLocationLabel( not_null container); void addLimitsLabel( not_null container); void chooseFolder(); void chooseFormat(); void refreshButtons( not_null container, bool canStart); void editDateLimit( TimeId current, TimeId min, TimeId max, rpl::producer resetLabel, Fn done); const Settings &readData() const; template void changeData(Callback &&callback); const not_null _session; PeerId _singlePeerId = 0; Fn)> _showBoxCallback; // Use through readData / changeData wrappers. Settings _internal_data; struct Wrap { Wrap(rpl::producer<> value = nullptr) : value(std::move(value)) { } rpl::producer<> value; }; rpl::event_stream _changes; rpl::variable _startClicks; rpl::variable _cancelClicks; }; } // namespace View } // namespace Export