Skip to content

Commit cd61df2

Browse files
committed
Add option to show alpha channel and reset color selection
1 parent c30ecaa commit cd61df2

File tree

14 files changed

+120
-42
lines changed

14 files changed

+120
-42
lines changed

.github/workflows/build.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ on:
66
pull_request:
77
branches: [ master ]
88

9-
env:
10-
BUILD_TYPE: Release
11-
129
jobs:
1310
build:
1411
runs-on: ubuntu-latest

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.5)
2-
project(kColorPicker LANGUAGES CXX VERSION 0.1.6)
2+
project(kColorPicker LANGUAGES CXX VERSION 0.2.0)
33

44
set(QT_MIN_VERSION "5.9.4")
55

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# kColorPicker [![Build Status][github-badge]][github-url]
22
QToolButton with color popup menu with lets you select a color. The popup features a color dialog button which can be used to add custom colors to the popup menu.
33

4-
Version 0.1.6
4+
Version 0.2.0
55

66
![kColorPicker](https://i.imgur.com/VkhUvFa.png "kColorPicker")
77

88
### Building from source
9-
1. Get latest release from GitHub by cloning the repo:
9+
1. Get the latest release from GitHub by cloning the repo:
1010
`$ git clone https://github.com/ksnip/kColorPicker`
1111
2. Change to repo directory:
1212
`$ cd kColorPicker`

example/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int main(int argc, char **argv)
3030
widget->setFixedWidth(200);
3131
widget->setFixedHeight(200);
3232
auto layout = new QVBoxLayout();
33-
auto colorPicker = new KColorPicker();
33+
auto colorPicker = new KColorPicker(true);
3434
colorPicker->setColor(QColor(Qt::red));
3535
layout->addWidget(colorPicker);
3636
widget->setLayout(layout);

include/kColorPicker/KColorPicker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ Q_OBJECT
3737
Q_DECLARE_PRIVATE(KColorPicker)
3838

3939
public:
40-
explicit KColorPicker();
40+
explicit KColorPicker(bool showAlphaChannel = false, QWidget *parent = nullptr);
4141
~KColorPicker() override;
4242
void setFixedSize(const QSize &size);
4343
void setFixedSize(int width, int height);
4444
QColor color() const;
45+
void resetColors(bool showAlphaChannel = false);
4546

4647
public Q_SLOTS:
4748
void setColor(const QColor &color);

src/IconCreator.cpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,41 @@ namespace kColorPicker {
2323

2424
QIcon IconCreator::createIcon(const QColor &color, const QSize &size)
2525
{
26-
QPixmap pixmap(size);
27-
pixmap.fill(color);
28-
QPainter painter(&pixmap);
26+
auto background = getBackgroundBrush(size);
27+
28+
QPixmap pixmap(size);
29+
QPainter painter(&pixmap);
30+
31+
// Paint background
32+
painter.setPen(Qt::NoPen);
33+
painter.setBrush(background);
34+
painter.drawRect(0, 0, size.width(), size.height());
35+
36+
// Paint color
37+
painter.setBrush(color);
38+
painter.drawRect(0, 0, size.width(), size.height());
39+
40+
// Paint border
2941
auto penWidth = painter.pen().width();
3042
painter.setPen(QColor(Qt::gray));
3143
painter.drawRect(0, 0, size.width() - penWidth, size.height() - penWidth);
3244

33-
return QIcon(pixmap);
45+
return { pixmap };
46+
}
47+
48+
QImage IconCreator::getBackgroundBrush(const QSize &size)
49+
{
50+
auto halfWidth = size.width() / 2;
51+
auto halfHeight = size.height() / 2;
52+
auto background = QImage(size, QImage::Format_ARGB32_Premultiplied);
53+
background.fill(Qt::white);
54+
QPainter painter(&background);
55+
painter.setPen(Qt::NoPen);
56+
painter.setBrush(Qt::gray);
57+
painter.drawRect(0, 0, halfWidth, halfHeight);
58+
painter.drawRect(halfWidth, halfHeight, size.width(), size.height());
59+
60+
return background;
3461
}
3562

3663
} // namespace kColorPicker

src/IconCreator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <QIcon>
2424
#include <QColor>
2525
#include <QPainter>
26+
#include <QImage>
2627

2728
namespace kColorPicker {
2829

@@ -32,6 +33,7 @@ class IconCreator
3233
explicit IconCreator() = delete;
3334
~IconCreator() = delete;
3435
static QIcon createIcon(const QColor &color, const QSize &size);
36+
static QImage getBackgroundBrush(const QSize &size);
3537
};
3638

3739
} // namespace kColorPicker

src/KColorPicker.cpp

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,19 @@ class KColorPickerPrivate
3535

3636
Q_DECLARE_PUBLIC(KColorPicker)
3737

38-
explicit KColorPickerPrivate(KColorPicker *kColorPicker);
38+
explicit KColorPickerPrivate(KColorPicker *kColorPicker, bool showAlphaChannel = false, QWidget *parent = nullptr);
3939

4040
KColorPicker *const q_ptr;
4141
QSize mIconSize;
42-
PopupMenu mPopupMenu;
42+
PopupMenu *mPopupMenu;
4343
QColor mSelectedColor;
4444
};
4545

46-
KColorPicker::KColorPicker() : d_ptr(new KColorPickerPrivate(this))
47-
{}
46+
KColorPicker::KColorPicker(bool showAlphaChannel, QWidget *parent) : d_ptr(new KColorPickerPrivate(this, showAlphaChannel, parent))
47+
{
48+
// Default Colors
49+
resetColors(showAlphaChannel);
50+
}
4851

4952
KColorPicker::~KColorPicker()
5053
{}
@@ -54,7 +57,7 @@ void KColorPicker::setColor(const QColor &color)
5457
Q_D(KColorPicker);
5558
d->mSelectedColor = color;
5659
setColorIcon(color);
57-
d->mPopupMenu.selectColor(color);
60+
d->mPopupMenu->selectColor(color);
5861
}
5962

6063
void KColorPicker::colorSelected(const QColor &color)
@@ -87,6 +90,28 @@ QColor KColorPicker::color() const
8790
return d->mSelectedColor;
8891
}
8992

93+
void KColorPicker::resetColors(bool showAlphaChannel)
94+
{
95+
Q_D(const KColorPicker);
96+
d->mPopupMenu->removeColors();
97+
98+
d->mPopupMenu->addColor(QColor(Qt::red));
99+
d->mPopupMenu->addColor(QColor(Qt::green));
100+
d->mPopupMenu->addColor(QColor(Qt::blue));
101+
d->mPopupMenu->addColor(QColor(Qt::yellow));
102+
d->mPopupMenu->addColor(QColor(Qt::magenta));
103+
d->mPopupMenu->addColor(QColor(Qt::cyan));
104+
d->mPopupMenu->addColor(QColor(Qt::white));
105+
d->mPopupMenu->addColor(QColor(Qt::black));
106+
107+
if(showAlphaChannel) {
108+
d->mPopupMenu->addColor(QColor(0, 255, 255, 100));
109+
d->mPopupMenu->addColor(QColor(255, 0, 255, 100));
110+
d->mPopupMenu->addColor(QColor(255, 255, 0, 100));
111+
d->mPopupMenu->addColor(QColor(255, 255, 255, 100));
112+
}
113+
}
114+
90115
void KColorPicker::setIconSize(const QSize &size)
91116
{
92117
Q_D(KColorPicker);
@@ -107,25 +132,16 @@ void KColorPicker::setColorIcon(const QColor &color)
107132
// KColorPickerPrivate
108133
//
109134

110-
KColorPickerPrivate::KColorPickerPrivate(KColorPicker *kColorPicker) : q_ptr(kColorPicker)
135+
KColorPickerPrivate::KColorPickerPrivate(KColorPicker *kColorPicker, bool showAlphaChannel, QWidget *parent) :
136+
q_ptr(kColorPicker),
137+
mPopupMenu(new PopupMenu(showAlphaChannel, parent))
111138
{
112139
initResource();
113140

114141
mIconSize = QSize(25, 25);
115142
kColorPicker->setPopupMode(QToolButton::InstantPopup);
116-
kColorPicker->setMenu(&mPopupMenu);
117-
kColorPicker->connect(&mPopupMenu, &PopupMenu::colorChanged, kColorPicker, &KColorPicker::colorSelected);
118-
119-
// Default Colors
120-
mPopupMenu.addColor(QColor(Qt::red));
121-
mPopupMenu.addColor(QColor(Qt::green));
122-
mPopupMenu.addColor(QColor(Qt::blue));
123-
mPopupMenu.addColor(QColor(Qt::yellow));
124-
mPopupMenu.addColor(QColor(Qt::magenta));
125-
mPopupMenu.addColor(QColor(Qt::cyan));
126-
mPopupMenu.addColor(QColor(Qt::white));
127-
mPopupMenu.addColor(QColor(Qt::black));
128-
143+
kColorPicker->setMenu(mPopupMenu);
144+
kColorPicker->connect(mPopupMenu, &PopupMenu::colorChanged, kColorPicker, &KColorPicker::colorSelected);
129145
}
130146

131147
} // namespace kColorPicker

src/PopupMenu.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@
2121

2222
namespace kColorPicker {
2323

24-
PopupMenu::PopupMenu() :
25-
mButtonGroup(new QButtonGroup()),
26-
mLayout(new QGridLayout()),
27-
mColorDialogButton(new ColorDialogButton(QIcon(QLatin1String(":/icons/ellipsis"))))
24+
PopupMenu::PopupMenu(bool showAlphaChannel, QWidget *parent) :
25+
QMenu(parent),
26+
mButtonGroup(new QButtonGroup(this)),
27+
mLayout(new QGridLayout(this)),
28+
mColorDialogButton(new ColorDialogButton(QIcon(QLatin1String(":/icons/ellipsis")), showAlphaChannel))
2829
{
29-
3030
mLayout->setSpacing(0);
3131
mLayout->setMargin(5);
3232
setLayout(mLayout);
@@ -36,7 +36,7 @@ PopupMenu::PopupMenu() :
3636

3737
PopupMenu::~PopupMenu()
3838
{
39-
delete mButtonGroup;
39+
qDeleteAll(mColorButtons);
4040
delete mColorDialogButton;
4141
}
4242

@@ -47,6 +47,20 @@ void PopupMenu::addColor(const QColor &color)
4747
}
4848
}
4949

50+
void PopupMenu::removeColors()
51+
{
52+
for (auto button : mColorButtons) {
53+
mButtonGroup->removeButton(button);
54+
mLayout->removeWidget(button);
55+
disconnect(button, &AbstractPopupMenuButton::colorSelected, this, &PopupMenu::colorSelected);
56+
}
57+
58+
qDeleteAll(mColorButtons);
59+
mColorButtons.clear();
60+
61+
generateGrid();
62+
}
63+
5064
void PopupMenu::selectColor(const QColor &color)
5165
{
5266
addColor(color);

src/PopupMenu.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ class PopupMenu : public QMenu
3434
{
3535
Q_OBJECT
3636
public:
37-
PopupMenu();
37+
PopupMenu(bool showAlphaChannel, QWidget *parent);
3838
~PopupMenu() override;
3939
void addColor(const QColor &color);
40+
void removeColors();
4041
void selectColor(const QColor &color);
4142
QSize sizeHint() const;
4243

@@ -60,4 +61,5 @@ private slots:
6061
};
6162

6263
} // namespace kColorPicker
64+
6365
#endif //KCOLORPICKER_POPUPMENU_H

0 commit comments

Comments
 (0)