Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Color Clipboard #3100

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
10 changes: 6 additions & 4 deletions src/gui/item_action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,19 @@

#include "gui/item_action.hpp"

ItemAction::ItemAction(const std::string& text, int id, std::function<void()> callback) :
MenuItem(text, id),
ItemAction::ItemAction(const std::string& text, int id, std::function<void()> callback, const Color& text_color) :
MenuItem(text, id, text_color),
m_callback(std::move(callback))
{
}

void
ItemAction::process_action(const MenuAction& action)
{
if (action == MenuAction::HIT) {
if (m_callback) {
if (action == MenuAction::HIT)
{
if (m_callback)
{
m_callback();
}
}
bruhmoent marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
2 changes: 1 addition & 1 deletion src/gui/item_action.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
class ItemAction final : public MenuItem
{
public:
ItemAction(const std::string& text, int id = -1, std::function<void()> callback = {});
ItemAction(const std::string& text, int id = -1, std::function<void()> callback = {}, const Color& text_color = Color(1.f, 1.f, 1.f));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we have a Color::WHITE constant somewhere?


virtual void process_action(const MenuAction& action) override;

Expand Down
12 changes: 12 additions & 0 deletions src/gui/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,18 @@ Menu::add_entry(const std::string& text, const std::function<void()>& callback)
return add_item<ItemAction>(text, -1, callback);
}

ItemAction&
Menu::add_entry(int id, const std::string& text, const Color& text_color)
{
return add_item<ItemAction>(text, id, [](){}, text_color);
}

ItemAction&
Menu::add_entry(const std::string& text, const std::function<void()>& callback, const Color& text_color)
{
return add_item<ItemAction>(text, -1, callback, text_color);
}

ItemInactive&
Menu::add_inactive(const std::string& text, bool default_color)
{
Expand Down
2 changes: 2 additions & 0 deletions src/gui/menu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ class Menu
ItemHorizontalLine& add_hl();
ItemLabel& add_label(const std::string& text);
ItemAction& add_entry(int id, const std::string& text);
ItemAction& add_entry(int id, const std::string& text, const Color& text_color);
ItemAction& add_entry(const std::string& text, const std::function<void()>& callback);
ItemAction& add_entry(const std::string& text, const std::function<void()>& callback, const Color& text_color);
ItemToggle& add_toggle(int id, const std::string& text, bool* toggled, bool center_text = false);
ItemToggle& add_toggle(int id, const std::string& text,
const std::function<bool()>& get_func,
Expand Down
83 changes: 78 additions & 5 deletions src/gui/menu_color.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// SuperTux
// Copyright (C) 2015 Hume2 <[email protected]>
// 2024 bruhmoent
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Expand All @@ -14,8 +15,12 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

#include <regex>
#include <sstream>

#include "gui/menu_color.hpp"
#include "menu_item.hpp"
#include "../util/log.hpp"

#include "util/gettext.hpp"

Expand All @@ -33,11 +38,14 @@ ColorMenu::ColorMenu(Color* color_) :
add_color_display(color);

add_hl();
add_item(std::make_unique<MenuItem>(_("Copy"), MNID_COPY));
add_item(std::make_unique<MenuItem>(
_("Paste"),
MNID_PASTE,
Color::s_clipboard_color ? std::make_optional(*Color::s_clipboard_color) : std::nullopt));
add_entry(MNID_COPY, _("Copy"));
if (Color::s_clipboard_color != nullptr)
add_entry(MNID_PASTE, _("Paste"), *Color::s_clipboard_color);
else
add_entry(MNID_PASTE, _("Paste"), Color(1.f, 1.f, 1.f));

add_hl();
add_entry(MNID_PASTE_CLIPBOARD, _("Paste clipboard"));
bruhmoent marked this conversation as resolved.
Show resolved Hide resolved

add_hl();
add_back(_("OK"));
Expand All @@ -60,6 +68,71 @@ ColorMenu::menu_action(MenuItem& item)
if (Color::s_clipboard_color)
*color = *Color::s_clipboard_color;
}
else if (item.get_id() == MNID_PASTE_CLIPBOARD)
{
if (!SDL_HasClipboardText())
return;

const char* clipboard_text = SDL_GetClipboardText();
if (!clipboard_text)
return;

const std::string text(clipboard_text);
SDL_free((void*)clipboard_text);

Color new_color;
bool is_valid_format = false;

// rgb(r,g,b)
const std::regex rgb_format(R"(^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$)");
std::smatch rgb_matches;

if (std::regex_match(text, rgb_matches, rgb_format))
{
const int r = std::stoi(rgb_matches[1].str());
const int g = std::stoi(rgb_matches[2].str());
const int b = std::stoi(rgb_matches[3].str());

if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255)
bruhmoent marked this conversation as resolved.
Show resolved Hide resolved
{
new_color = Color(r/255.0f, g/255.0f, b/255.0f, 1.0f);
is_valid_format = true;
}
}
else
{
// #rrggbb
const std::regex hex_format(R"(^\s*#([A-Fa-f0-9]{6})\s*$)");
std::smatch hex_matches;

if (std::regex_match(text, hex_matches, hex_format))
{
const std::string hex_value = hex_matches[1].str();
unsigned int hex_color;
std::stringstream ss;
ss << std::hex << hex_value;
ss >> hex_color;

const float r = ((hex_color >> 16) & 0xFF)/255.0f;
const float g = ((hex_color >> 8) & 0xFF)/255.0f;
const float b = (hex_color & 0xFF)/255.0f;

new_color = Color(r, g, b, 1.0f);
is_valid_format = true;
}
}

if (is_valid_format)
{
*color = new_color;

Color::s_clipboard_color = std::make_unique<Color>(new_color);
MenuItem& menu_paste_item = get_item_by_id(MNID_PASTE);
menu_paste_item.set_text_color(new_color);
}
else
log_warning << "Invalid color format: " << text << ". Supported formats: rgb(r,g,b) and #rrggbb" << std::endl;
}
}

/* EOF */
3 changes: 2 additions & 1 deletion src/gui/menu_color.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ class ColorMenu final : public Menu
enum MenuIDs
{
MNID_COPY = 1,
MNID_PASTE
MNID_PASTE,
MNID_PASTE_CLIPBOARD
};
};

Expand Down
Loading