// // This file is part of Kepka, // an unofficial desktop version of Telegram messaging app, // see https://github.com/procxx/kepka // // Kepka 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/procxx/kepka/blob/master/LICENSE // Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org // Copyright (c) 2017- Kepka Contributors, https://github.com/procxx // #pragma once #include "styles/style_widgets.h" #include "ui/animation.h" #include class Painter; namespace Ui { class RoundCheckbox { public: RoundCheckbox(const style::RoundCheckbox &st, Fn updateCallback); void paint(Painter &p, TimeMs ms, int x, int y, int outerWidth, double masterScale = 1.); void setDisplayInactive(bool displayInactive); bool checked() const { return _checked; } enum class SetStyle { Animated, Fast, }; void setChecked(bool newChecked, SetStyle speed = SetStyle::Animated); void invalidateCache(); private: struct Icon { Animation fadeIn; Animation fadeOut; QPixmap wideCheckCache; }; void removeFadeOutedIcons(); void prepareWideCheckIconCache(Icon *icon); void prepareInactiveCache(); QRect cacheDestRect(int x, int y, double scale) const; const style::RoundCheckbox &_st; Fn _updateCallback; bool _checked = false; std::vector _icons; bool _displayInactive = false; QPixmap _inactiveCacheBg, _inactiveCacheFg; // Those pixmaps are shared among all checkboxes that have the same style. QPixmap _wideCheckBgCache, _wideCheckFullCache; }; class RoundImageCheckbox { public: using PaintRoundImage = Fn; RoundImageCheckbox(const style::RoundImageCheckbox &st, Fn updateCallback, PaintRoundImage &&paintRoundImage); void paint(Painter &p, TimeMs ms, int x, int y, int outerWidth); double checkedAnimationRatio() const; bool checked() const { return _check.checked(); } using SetStyle = RoundCheckbox::SetStyle; void setChecked(bool newChecked, SetStyle speed = SetStyle::Animated); void invalidateCache() { _check.invalidateCache(); } private: void prepareWideCache(); const style::RoundImageCheckbox &_st; Fn _updateCallback; PaintRoundImage _paintRoundImage; QPixmap _wideCache; Animation _selection; RoundCheckbox _check; }; } // namespace Ui