guiscrollbar.h File Reference

Go to the documentation of this file. Source: include/ffw/gui/guiscrollbar.h

/* This file is part of FineFramework project */
#ifndef FFW_GUI_SCROLLBAR
#define FFW_GUI_SCROLLBAR
#include "guiwidget.h"
#include "guibutton.h"
#include "guislider.h"
namespace ffw {
    class FFW_API GuiScrollBar : public GuiWidget {
    public:
        class ButtonLeft: public GuiButton {
        public:
            struct Style {
                GuiButton::Style self;
            };
            ButtonLeft(GuiWindow* context);
            virtual ~ButtonLeft() = default;
            void setStyle(const ButtonLeft::Style* style, bool defaults = false);
        private:
            void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
            void eventRender(const ffw::Pointf& contentoffset, const ffw::Pointf& contentsize) override;
        };

        class ButtonRight : public GuiButton {
        public:
            struct Style {
                GuiButton::Style self;
            };
            ButtonRight(GuiWindow* context);
            virtual ~ButtonRight() = default;
            void setStyle(const ButtonRight::Style* style, bool defaults = false);
        private:
            void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
            void eventRender(const ffw::Pointf& contentoffset, const ffw::Pointf& contentsize) override;
        };

        class ButtonTop: public GuiButton {
        public:
            struct Style {
                GuiButton::Style self;
            };
            ButtonTop(GuiWindow* context);
            virtual ~ButtonTop() = default;
            void setStyle(const ButtonTop::Style* style, bool defaults = false);
        private:
            void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
            void eventRender(const ffw::Pointf& contentoffset, const ffw::Pointf& contentsize) override;
        };

        class ButtonBottom : public GuiButton {
        public:
            struct Style {
                GuiButton::Style self;
            };
            ButtonBottom(GuiWindow* context);
            virtual ~ButtonBottom() = default;
            void setStyle(const ButtonBottom::Style* style, bool defaults = false);
        private:
            void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
            void eventRender(const ffw::Pointf& contentoffset, const ffw::Pointf& contentsize) override;
        };

        class Scroll : public GuiSlider {
        public:
            struct Style {
                GuiSlider::Style self;
            };
            Scroll(GuiWindow* context, bool vertical);
            virtual ~Scroll() = default;
            void setStyle(const Scroll::Style* style, bool defaults = false);
        private:
            void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
        };

        struct Style {
            GuiScrollBar::ButtonLeft::Style buttonLeft;
            GuiScrollBar::ButtonRight::Style buttonRight;
            GuiScrollBar::ButtonTop::Style buttonTop;
            GuiScrollBar::ButtonBottom::Style buttonBottom;
            GuiScrollBar::Scroll::Style scroll;
            GuiWidget::Style self;
        };

        GuiScrollBar(GuiWindow* context, bool vertical);
        virtual ~GuiScrollBar() = default;
        inline bool isVertical() const {
            return slider->isVertical();
        }
        inline GuiButton* getButtonFirst() {
            return left;
        }
        inline const GuiButton* getButtonFirst() const {
            return left;
        }
        inline GuiButton* getButtonSecond() {
            return right;
        }
        inline const GuiButton* getButtonSecond() const {
            return right;
        }
        inline GuiSlider* getSlider() {
            return slider;
        }
        inline const GuiSlider* getSlider() const {
            return slider;
        }
        inline void setValue(const float val) {
            slider->setValue(val);
        }
        inline float getValue() const {
            return slider->getValue();
        }
        inline const ffw::Pointf& getRange() const {
            return slider->getRange();
        }
        inline void setRange(const float min, const float max) {
            slider->setRange(min, max);
        }
        inline void setInversed(const bool inversed) {
            slider->setInversed(inversed);
        }
        inline bool getInversed() const {
            return slider->getInversed();
        }
        inline void setIncrements(float inc) {
            increments = inc;
        }
        inline float getIncrements() const {
            return increments;
        }
        void setButtonLength(GuiUnits length);
        inline GuiUnits getButtonLength() const {
            if (slider->isVertical())return slider->getButtonSize().y;
            else return slider->getButtonSize().x;
        }
        ffw::Pointf getMinimumWrapSize() override;
        void setStyle(const GuiScrollBar::Style* style, bool defaults = false);
    private:
        void eventRender(const ffw::Pointf& contentoffset, const ffw::Pointf& contentsize) override;
        void eventSize(const ffw::Pointf& size) override;
        void eventThemeChanged(const GuiTheme* theme, bool defaults) override;
        void recalculate(const ffw::Pointf& size);
        void buttonCallback(ffw::GuiEvent e);
        GuiButton* left;
        GuiButton* right;
        Scroll* slider;
        float increments;
    };
}
#endif