Improved mask also work on erase. Improved shaders for layer opacity, now when drawing doesn't change opacity. Improved layers panel layout to be similar to PS. Added layer blending option and visibility. Added custom icons to checkboxes and fixed the combobox items.

This commit is contained in:
2019-01-05 12:41:21 +01:00
parent f823451546
commit e4fe0cffed
23 changed files with 255 additions and 93 deletions

View File

@@ -1,6 +1,8 @@
#include "pch.h"
#include "log.h"
#include "node_panel_layer.h"
#include "canvas.h"
#include "node_combobox.h"
Node* NodeLayer::clone_instantiate() const
{
@@ -31,7 +33,6 @@ void NodeLayer::init()
m_thinkness = m_template->m_thinkness;
m_label = find<NodeText>("label");
m_visibility = find<NodeCheckBox>("cb");
m_opacity = find<NodeSliderH>("sl-opacity");
}
void NodeLayer::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* attr)
@@ -54,10 +55,6 @@ void NodeLayer::loaded()
NodeBorder::loaded();
if (!m_label_text.empty())
m_label->set_text(m_label_text.c_str());
m_opacity->on_value_changed = [this](Node*, float value) {
if (on_opacity_changed)
on_opacity_changed(this, value);
};
m_visibility->on_value_changed = [this](Node*, bool checked) {
if (on_visibility_changed)
on_visibility_changed(this, checked);
@@ -159,6 +156,18 @@ void NodePanelLayer::init()
on_layer_order(this, old_idx, new_idx);
}
};
m_opacity = find<NodeSliderH>("opacity");
m_opacity->on_value_changed = [this](Node*, float value) {
handle_layer_opacity(m_current_layer, value);
};
m_alpha_lock = find<NodeCheckBox>("alpha-lock");
m_alpha_lock->on_value_changed = [this](Node*, bool locked) {
handle_layer_alpha_lock(m_current_layer, locked);
};
m_blend_mode = find<NodeComboBox>("blend-mode");
m_blend_mode->on_select = [this](Node*, int index) {
handle_layer_blend_mode(m_current_layer, index);
};
LOG("done init");
}
@@ -170,8 +179,8 @@ NodeLayer* NodePanelLayer::add_layer(const char* name)
l->create();
l->loaded();
l->set_name(name);
l->m_visibility->set_value(true);
l->on_selected = std::bind(&NodePanelLayer::handle_layer_selected, this, std::placeholders::_1);
l->on_opacity_changed = std::bind(&NodePanelLayer::handle_layer_opacity, this, std::placeholders::_1, std::placeholders::_2);
l->on_visibility_changed = std::bind(&NodePanelLayer::handle_layer_visibility, this, std::placeholders::_1, std::placeholders::_2);
l->on_highlight = std::bind(&NodePanelLayer::handle_layer_highlight, this, std::placeholders::_1, std::placeholders::_2);
if (m_current_layer)
@@ -179,6 +188,7 @@ NodeLayer* NodePanelLayer::add_layer(const char* name)
m_current_layer = l;
m_current_layer->m_selected = true;
m_layers.push_back(l);
update_attributes();
return l;
}
@@ -208,6 +218,7 @@ void NodePanelLayer::remove_layer(NodeLayer* layer)
on_layer_delete(this, old_idx);
if (on_layer_change)
on_layer_change(this, -1, i);
update_attributes();
}
void NodePanelLayer::handle_layer_opacity(NodeLayer* target, float value)
@@ -228,6 +239,18 @@ void NodePanelLayer::handle_layer_visibility(NodeLayer* target, bool visible)
on_layer_visibility_changed(this, m_layers_container->get_child_index(target), visible);
}
void NodePanelLayer::handle_layer_alpha_lock(NodeLayer* target, bool locked)
{
if (on_layer_alpha_lock_changed)
on_layer_alpha_lock_changed(this, m_layers_container->get_child_index(target), locked);
}
void NodePanelLayer::handle_layer_blend_mode(NodeLayer* target, int mode)
{
if (on_layer_blend_mode_changed)
on_layer_blend_mode_changed(this, m_layers_container->get_child_index(target), mode);
}
void NodePanelLayer::handle_layer_selected(NodeLayer* target)
{
if (m_current_layer)
@@ -236,6 +259,7 @@ void NodePanelLayer::handle_layer_selected(NodeLayer* target)
m_current_layer->m_selected = true;
if (on_layer_change)
on_layer_change(this, -1, m_layers_container->get_child_index(m_current_layer));
update_attributes();
}
void NodePanelLayer::clear()
@@ -244,3 +268,11 @@ void NodePanelLayer::clear()
m_layers.clear();
m_current_layer = nullptr;
}
void NodePanelLayer::update_attributes()
{
auto& l = Canvas::I->m_layers[Canvas::I->m_current_layer_idx];
m_opacity->set_value(l.m_opacity);
m_alpha_lock->set_value(l.m_alpha_locked);
m_blend_mode->set_index(l.m_blend_mode);
}