get/set clipboard, color hex value

This commit is contained in:
2019-06-24 23:46:55 +02:00
parent 2782d864ed
commit f9cf452af2
7 changed files with 129 additions and 0 deletions

View File

@@ -855,6 +855,15 @@
<slider-h id="rgb-b" width="10" grow="1" value="1"/>
</node>
</border>
<!--HEX-->
<border pad="5" color=".3" margin="10 0 0 0">
<node width="100%" pad="2" height="30" dir="row" align="center">
<node margin="0 10 0 0"><text text="Hex"/></node>
<text id="txt-hex" text="#FFFFFF" align="center" pad="5" grow="1" height="30" color="1"/>
<button id="btn-hex-copy" text="Copy" width="60" height="100%"/>
<button id="btn-hex-paste" text="Paste" width="60" height="100%"/>
</node>
</border>
</border>
<!--<node height="33" dir="row" align="flex-end" justify="flex-end">
<button id="btn-ok" text="Reset" width="60" height="30" margin="0 10 0 0"/>

View File

@@ -1510,6 +1510,7 @@ void Canvas::FloodData::apply()
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rtt.getWidth(), rtt.getHeight(),
GL_RGBA, GL_UNSIGNED_BYTE, rgb[plane].get());
rtt.unbindTexture();
layer->m_dirty_face[plane] = true;
}
}

View File

@@ -180,6 +180,47 @@ void win32_show_cursor(bool visible)
});
}
std::string win32_clipboard_get_text()
{
std::string ret;
if (OpenClipboard(hWnd))
{
if (HANDLE h = GetClipboardData(CF_TEXT))
{
if (char* s = (char*)GlobalLock(h))
{
ret = s;
GlobalUnlock(h);
}
}
CloseClipboard();
}
return ret;
}
bool win32_clipboard_set_text(const std::string& s)
{
bool success = false;
if (OpenClipboard(hWnd))
{
// owned by SetClipboardData
if (HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, s.size() + 1))
{
if (char* p = (char*)GlobalLock(h))
{
std::copy(s.begin(), s.end(), p);
p[s.size()] = 0; // string null-termination
GlobalUnlock(h);
success = true;
}
EmptyClipboard();
SetClipboardData(CF_TEXT, h);
}
CloseClipboard();
}
return success;
}
std::string win32_open_file(const char* filter)
{
OPENFILENAMEA ofn;

View File

@@ -84,6 +84,30 @@ void NodeColorPicker::init_controls()
m_color_old = find<NodeBorder>("color-old");
m_color_old1 = find<NodeBorder>("color-old1");
m_color_old2 = find<NodeBorder>("color-old2");
m_btn_copy = find<NodeButton>("btn-hex-copy");
m_btn_paste = find<NodeButton>("btn-hex-paste");
m_txt_hex = find<NodeText>("txt-hex");
m_btn_paste->on_click = [this](Node*)
{
std::string s = clipboard_get_text();
std::regex r("#([\\dabcdefABCDEF]{6})");
std::smatch m;
if (std::regex_search(s, m, r))
{
unsigned long ul = std::stoul(m[1].str(), nullptr, 16);
uint8_t b = (ul >> 0) & 0xFF;
uint8_t g = (ul >> 8) & 0xFF;
uint8_t r = (ul >> 16) & 0xFF;
auto rgb = glm::vec3(r, g, b) / 255.f;
set_color(rgb);
}
};
m_btn_copy->on_click = [this](Node*)
{
clipboard_set_text(m_txt_hex->m_text);
};
m_wheel->on_value_changed = [this](Node*, glm::vec3 hsv)
{
@@ -98,6 +122,7 @@ void NodeColorPicker::init_controls()
if (on_color_change)
on_color_change(this, rgb);
m_interacted = true;
update_hex(rgb);
};
auto hsv_setter = [this](Node* target, float v)
{
@@ -111,6 +136,7 @@ void NodeColorPicker::init_controls()
if (on_color_change)
on_color_change(this, rgb);
m_interacted = true;
update_hex(rgb);
};
m_slider_h->on_value_changed = hsv_setter;
m_slider_s->on_value_changed = hsv_setter;
@@ -128,12 +154,20 @@ void NodeColorPicker::init_controls()
if (on_color_change)
on_color_change(this, rgb);
m_interacted = true;
update_hex(rgb);
};
m_slider_r->on_value_changed = rgb_setter;
m_slider_g->on_value_changed = rgb_setter;
m_slider_b->on_value_changed = rgb_setter;
}
void NodeColorPicker::update_hex(glm::vec3 rgb)
{
char tmp[32];
ultoa(convert_rgb_long(rgb), tmp, 16);
m_txt_hex->set_text_format("#%s", tmp);
}
void NodeColorPicker::set_color(glm::vec3 rgb)
{
auto hsv = convert_rgb2hsv(rgb);
@@ -146,6 +180,7 @@ void NodeColorPicker::set_color(glm::vec3 rgb)
m_wheel->m_hsv = hsv;
m_color_cur->m_color = { rgb, 1 };
m_color_old->m_color = { rgb, 1 };
update_hex(rgb);
}
glm::vec3 NodeColorPicker::get_hsv() const

View File

@@ -24,6 +24,9 @@ public:
NodeBorder* m_color_old;
NodeBorder* m_color_old1;
NodeBorder* m_color_old2;
NodeButton* m_btn_copy;
NodeButton* m_btn_paste;
NodeText* m_txt_hex;
glm::vec3 m_rgb;
glm::vec3 m_hsv;
@@ -35,6 +38,7 @@ public:
virtual kEventResult handle_event(Event* e) override;
virtual void added(Node* parent) override;
void init_controls();
void update_hex(glm::vec3 rgb);
void set_color(glm::vec3 rgb);
glm::vec3 get_hsv() const;
glm::vec3 get_rgb() const;

View File

@@ -485,6 +485,22 @@ glm::vec4 rand_color()
return { r, g, b, 1.f };
}
glm::vec3 convert_long_rgb(unsigned long hex)
{
uint8_t b = (hex >> 0) & 0xFF;
uint8_t g = (hex >> 8) & 0xFF;
uint8_t r = (hex >> 16) & 0xFF;
return glm::vec3(r, g, b) / 255.f;
}
unsigned long convert_rgb_long(glm::vec3 rgb)
{
uint8_t r = (uint8_t)(rgb.r * 255.f);
uint8_t g = (uint8_t)(rgb.g * 255.f);
uint8_t b = (uint8_t)(rgb.b * 255.f);
return (r << 16) + (g << 8) + b;
}
glm::vec3 convert_hsv2rgb(const glm::vec3 c)
{
glm::vec4 K = glm::vec4(1.0f, 2.0f / 3.0f, 1.0f / 3.0f, 3.0f);
@@ -594,6 +610,24 @@ std::string str_replace(const std::string& string, const std::string& search, co
return ret;
}
std::string clipboard_get_text()
{
#if _WIN32
extern std::string win32_clipboard_get_text();
return win32_clipboard_get_text();
#elif _IOS_
#endif
}
bool clipboard_set_text(const std::string& s)
{
#if _WIN32
extern bool win32_clipboard_set_text(const std::string & s);
return win32_clipboard_set_text(s);
#elif _IOS_
#endif
}
static const char* gl2str(GLenum err)
{
switch (err)

View File

@@ -71,6 +71,8 @@ std::vector<vertex_t> triangulate(const std::vector<vertex_t>& points);
std::vector<vertex_t> triangulate(const std::vector<glm::vec2>& points);
std::vector<vertex_t> triangulate_simple(const std::vector<vertex_t>& vertices);
glm::vec4 rand_color();
glm::vec3 convert_long_rgb(unsigned long hex);
unsigned long convert_rgb_long(glm::vec3 rgb);
glm::vec3 convert_hsv2rgb(const glm::vec3 c);
glm::vec3 convert_rgb2hsv(const glm::vec3 c);
std::vector<std::string> split(const std::string& subject, char d, int max_split = 0);
@@ -80,6 +82,9 @@ std::string wstr2str(const std::wstring& wstr);
bool str_iequals(const std::string& a, const std::string& b);
std::string str_replace(const std::string& string, const std::string& search, const std::string& replace);
std::string clipboard_get_text();
bool clipboard_set_text(const std::string& s);
size_t curl_data_handler(void *contents, size_t size, size_t nmemb, void *userp);
size_t curl_data_write(void *ptr, size_t size, size_t nmemb, FILE *stream);
void check_OpenGLError(const char* stmt, const char* fname, int line);