You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
4.6 KiB

#include "ColorToolItem.h"
#include <config.h>
#include "control/ToolEnums.h"
#include "gui/toolbarMenubar/icon/ColorSelectImage.h"
#include "model/ToolbarColorNames.h"
#include "StringUtils.h"
#include "Util.h"
#include "i18n.h"
bool ColorToolItem::inUpdate = false;
ColorToolItem::ColorToolItem(ActionHandler* handler, ToolHandler* toolHandler, GtkWindow* parent, Color color,
bool selektor):
AbstractToolItem("", handler, selektor ? ACTION_SELECT_COLOR_CUSTOM : ACTION_SELECT_COLOR),
color(color),
toolHandler(toolHandler),
parent(parent) {
this->group = GROUP_COLOR;
updateName();
}
ColorToolItem::~ColorToolItem() { freeIcons(); }
/**
* Free the allocated icons
*/
void ColorToolItem::freeIcons() {
delete this->icon;
this->icon = nullptr;
}
auto ColorToolItem::isSelector() -> bool { return this->action == ACTION_SELECT_COLOR_CUSTOM; }
void ColorToolItem::updateName() {
if (this->action == ACTION_SELECT_COLOR_CUSTOM) {
this->name = _("Select color");
} else {
this->name = ToolbarColorNames::getInstance().getColorName(this->color);
}
}
void ColorToolItem::actionSelected(ActionGroup group, ActionType action) {
inUpdate = true;
if (this->group == group && this->item) {
if (isSelector()) {
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(this->item), isSelector());
}
enableColor(toolHandler->getColor());
}
inUpdate = false;
}
void ColorToolItem::enableColor(Color color) {
if (isSelector()) {
if (this->icon) {
this->icon->setColor(color);
}
this->color = color;
if (GTK_IS_TOGGLE_BUTTON(this->item)) {
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(this->item), false);
}
} else {
if (this->item) {
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(this->item), this->color == color);
}
}
}
auto ColorToolItem::getColor() const -> Color { return this->color; }
auto ColorToolItem::getId() -> string {
if (isSelector()) {
return "COLOR_SELECT";
}
char buffer[64];
sprintf(buffer, "COLOR(0x%06x)", uint32_t{this->color});
string id = buffer;
return id;
}
/**
* Show colochooser to select a custom color
*/
void ColorToolItem::showColorchooser() {
GtkWidget* dialog = gtk_color_chooser_dialog_new(_("Select color"), parent);
gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), false);
int response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_OK) {
GdkRGBA color;
gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &color);
this->color = Util::GdkRGBA_to_argb(color);
}
gtk_widget_destroy(dialog);
}
/**
* Enable / Disable the tool item
*/
void ColorToolItem::enable(bool enabled) {
if (!enabled && !toolHandler->hasCapability(TOOL_CAP_COLOR, ToolPointer::current) &&
toolHandler->hasCapability(TOOL_CAP_COLOR, ToolPointer::toolbar)) {
if (this->icon && toolHandler->triggeredByButton) {
// allow changes if currentTool has no colour capability
// and mainTool has Colour capability
icon->setState(COLOR_ICON_STATE_PEN);
AbstractToolItem::enable(true);
} else {
// disallow changes in color
icon->setState(COLOR_ICON_STATE_DISABLED);
AbstractToolItem::enable(false);
}
return;
}
AbstractToolItem::enable(enabled);
if (this->icon) {
if (enabled) {
icon->setState(COLOR_ICON_STATE_ENABLED);
} else {
icon->setState(COLOR_ICON_STATE_DISABLED);
}
}
}
void ColorToolItem::activated(GdkEvent* event, GtkMenuItem* menuitem, GtkToolButton* toolbutton) {
if (inUpdate) {
return;
}
inUpdate = true;
if (isSelector()) {
showColorchooser();
}
toolHandler->setColor(this->color, true);
inUpdate = false;
}
auto ColorToolItem::newItem() -> GtkToolItem* {
this->icon = new ColorSelectImage(this->color, !isSelector());
GtkToolItem* it = gtk_toggle_tool_button_new();
const gchar* name = this->name.c_str();
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(it), name);
gtk_tool_button_set_label(GTK_TOOL_BUTTON(it), name);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(it), this->icon->getWidget());
return it;
}
auto ColorToolItem::getToolDisplayName() -> string { return this->name; }
auto ColorToolItem::getNewToolIcon() -> GtkWidget* {
return ColorSelectImage::newColorIcon(this->color, 16, !isSelector());
}