mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 14:25:07 +00:00

Previously, only the color from the selected layer would be picked. Now, we allow the user to select if they want to sample the color from all layers.
63 lines
1.6 KiB
C++
63 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2021, Mustafa Quraish <mustafa@cs.toronto.edu>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "PickerTool.h"
|
|
#include "ImageEditor.h"
|
|
#include "Layer.h"
|
|
#include <LibGUI/BoxLayout.h>
|
|
#include <LibGUI/CheckBox.h>
|
|
|
|
namespace PixelPaint {
|
|
|
|
PickerTool::PickerTool()
|
|
{
|
|
}
|
|
|
|
PickerTool::~PickerTool()
|
|
{
|
|
}
|
|
|
|
void PickerTool::on_mousedown(Layer* layer, MouseEvent& event)
|
|
{
|
|
auto& position = event.layer_event().position();
|
|
|
|
Color color;
|
|
if (m_sample_all_layers) {
|
|
color = m_editor->image().color_at(position);
|
|
} else {
|
|
if (!layer || !layer->rect().contains(position))
|
|
return;
|
|
color = layer->bitmap().get_pixel(position);
|
|
}
|
|
|
|
// We picked a transparent pixel, do nothing.
|
|
if (!color.alpha())
|
|
return;
|
|
|
|
if (event.layer_event().button() == GUI::MouseButton::Left)
|
|
m_editor->set_primary_color(color);
|
|
else if (event.layer_event().button() == GUI::MouseButton::Right)
|
|
m_editor->set_secondary_color(color);
|
|
}
|
|
|
|
GUI::Widget* PickerTool::get_properties_widget()
|
|
{
|
|
if (!m_properties_widget) {
|
|
m_properties_widget = GUI::Widget::construct();
|
|
m_properties_widget->set_layout<GUI::VerticalBoxLayout>();
|
|
|
|
auto& sample_checkbox = m_properties_widget->add<GUI::CheckBox>("Sample all layers");
|
|
sample_checkbox.set_checked(m_sample_all_layers);
|
|
sample_checkbox.on_checked = [&](bool value) {
|
|
m_sample_all_layers = value;
|
|
};
|
|
}
|
|
|
|
return m_properties_widget.ptr();
|
|
}
|
|
|
|
}
|