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