1 /**
2  * File name: RkButtonImpl.cpp
3  * Project: Redkite (A small GUI toolkit)
4  *
5  * Copyright (C) 2020 Iurie Nistor <http://geontime.com>
6  *
7  * This file is part of Redkite.
8  *
9  * Redkite is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22  */
23 
24 #include "RkButtonImpl.h"
25 
RkButtonImpl(RkButton * interface,RkWidget * parent)26 RkButton::RkButtonImpl::RkButtonImpl(RkButton *interface, RkWidget *parent)
27     : RkWidgetImpl(static_cast<RkWidget*>(interface), parent)
28     , inf_ptr{interface}
29     , buttonType{ButtonType::ButtonUncheckable}
30     , is_pressed{false}
31     , buttonState{RkButton::State::Unpressed}
32     , isEmphasizeEnabled{false}
33 {
34 }
35 
setText(const RkString & text)36 void RkButton::RkButtonImpl::setText(const RkString &text)
37 {
38         buttonText = text;
39 }
40 
text() const41 RkString RkButton::RkButtonImpl::text() const
42 {
43         return buttonText;
44 }
45 
setImage(const RkImage & img,RkButton::State state)46 void RkButton::RkButtonImpl::setImage(const RkImage &img, RkButton::State state)
47 {
48         buttonImages[static_cast<size_t>(state)] = img;
49         if (state == RkButton::State::Unpressed)
50                 inf_ptr->setSize(img.size());
51 }
52 
isPressed() const53 bool RkButton::RkButtonImpl::isPressed() const
54 {
55         return is_pressed;
56 }
57 
setPressed(bool pressed)58 void RkButton::RkButtonImpl::setPressed(bool pressed)
59 {
60         is_pressed = pressed;
61         isEmphasizeEnabled = false;
62         updateButtonState();
63 }
64 
setType(RkButton::ButtonType type)65 void RkButton::RkButtonImpl::setType(RkButton::ButtonType type)
66 {
67         buttonType = type;
68         updateButtonState();
69 }
70 
type(void) const71 RkButton::ButtonType RkButton::RkButtonImpl::type(void) const
72 {
73         return buttonType;
74 }
75 
drawButton(RkPainter & painter)76 void RkButton::RkButtonImpl::drawButton(RkPainter &painter)
77 {
78         if (isPressed()) {
79                 if (!buttonImages[static_cast<size_t>(buttonState)].isNull())
80                         painter.drawImage(buttonImages[static_cast<size_t>(buttonState)], 0, 0);
81                 else if (!buttonImages[static_cast<size_t>(RkButton::State::Pressed)].isNull())
82                         painter.drawImage(buttonImages[static_cast<size_t>(RkButton::State::Pressed)], 0, 0);
83                 else if (!buttonImages[static_cast<size_t>(RkButton::State::Unpressed)].isNull())
84                         painter.drawImage(buttonImages[static_cast<size_t>(RkButton::State::Unpressed)], 0, 0);
85         } else if (!buttonImages[static_cast<size_t>(RkButton::State::Unpressed)].isNull()) {
86                 if (!buttonImages[static_cast<size_t>(buttonState)].isNull())
87                         painter.drawImage(buttonImages[static_cast<size_t>(buttonState)], 0, 0);
88                 else
89                         painter.drawImage(buttonImages[static_cast<size_t>(RkButton::State::Unpressed)], 0, 0);
90         } else if (!buttonImages[static_cast<size_t>(RkButton::State::Unpressed)].isNull()) {
91                 painter.drawImage(buttonImages[static_cast<size_t>(RkButton::State::Unpressed)], 0, 0);
92         }
93 
94         if (!buttonText.empty()) {
95                 auto pen = painter.pen();
96                 pen.setColor(textColor());
97                 painter.setPen(pen);
98                 painter.drawText(inf_ptr->rect(), buttonText);
99         }
100 }
101 
setEmphasize(bool b)102 void RkButton::RkButtonImpl::setEmphasize(bool b)
103 {
104         isEmphasizeEnabled = b;
105         updateButtonState();
106 }
107 
updateButtonState()108 void RkButton::RkButtonImpl::updateButtonState()
109 {
110         if (isPressed()) {
111                 if (isEmphasizeEnabled)
112                         buttonState = RkButton::State::PressedHover;
113                 else
114                         buttonState = RkButton::State::Pressed;
115         } else {
116                 if (isEmphasizeEnabled)
117                         buttonState = RkButton::State::UnpressedHover;
118                 else
119                         buttonState = RkButton::State::Unpressed;
120         }
121 }
122 
123