get/set clipboard, color hex value
This commit is contained in:
@@ -855,6 +855,15 @@
|
|||||||
<slider-h id="rgb-b" width="10" grow="1" value="1"/>
|
<slider-h id="rgb-b" width="10" grow="1" value="1"/>
|
||||||
</node>
|
</node>
|
||||||
</border>
|
</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>
|
</border>
|
||||||
<!--<node height="33" dir="row" align="flex-end" justify="flex-end">
|
<!--<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"/>
|
<button id="btn-ok" text="Reset" width="60" height="30" margin="0 10 0 0"/>
|
||||||
|
|||||||
@@ -1510,6 +1510,7 @@ void Canvas::FloodData::apply()
|
|||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rtt.getWidth(), rtt.getHeight(),
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rtt.getWidth(), rtt.getHeight(),
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, rgb[plane].get());
|
GL_RGBA, GL_UNSIGNED_BYTE, rgb[plane].get());
|
||||||
rtt.unbindTexture();
|
rtt.unbindTexture();
|
||||||
|
layer->m_dirty_face[plane] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
41
src/main.cpp
41
src/main.cpp
@@ -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)
|
std::string win32_open_file(const char* filter)
|
||||||
{
|
{
|
||||||
OPENFILENAMEA ofn;
|
OPENFILENAMEA ofn;
|
||||||
|
|||||||
@@ -84,6 +84,30 @@ void NodeColorPicker::init_controls()
|
|||||||
m_color_old = find<NodeBorder>("color-old");
|
m_color_old = find<NodeBorder>("color-old");
|
||||||
m_color_old1 = find<NodeBorder>("color-old1");
|
m_color_old1 = find<NodeBorder>("color-old1");
|
||||||
m_color_old2 = find<NodeBorder>("color-old2");
|
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)
|
m_wheel->on_value_changed = [this](Node*, glm::vec3 hsv)
|
||||||
{
|
{
|
||||||
@@ -98,6 +122,7 @@ void NodeColorPicker::init_controls()
|
|||||||
if (on_color_change)
|
if (on_color_change)
|
||||||
on_color_change(this, rgb);
|
on_color_change(this, rgb);
|
||||||
m_interacted = true;
|
m_interacted = true;
|
||||||
|
update_hex(rgb);
|
||||||
};
|
};
|
||||||
auto hsv_setter = [this](Node* target, float v)
|
auto hsv_setter = [this](Node* target, float v)
|
||||||
{
|
{
|
||||||
@@ -111,6 +136,7 @@ void NodeColorPicker::init_controls()
|
|||||||
if (on_color_change)
|
if (on_color_change)
|
||||||
on_color_change(this, rgb);
|
on_color_change(this, rgb);
|
||||||
m_interacted = true;
|
m_interacted = true;
|
||||||
|
update_hex(rgb);
|
||||||
};
|
};
|
||||||
m_slider_h->on_value_changed = hsv_setter;
|
m_slider_h->on_value_changed = hsv_setter;
|
||||||
m_slider_s->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)
|
if (on_color_change)
|
||||||
on_color_change(this, rgb);
|
on_color_change(this, rgb);
|
||||||
m_interacted = true;
|
m_interacted = true;
|
||||||
|
update_hex(rgb);
|
||||||
};
|
};
|
||||||
m_slider_r->on_value_changed = rgb_setter;
|
m_slider_r->on_value_changed = rgb_setter;
|
||||||
m_slider_g->on_value_changed = rgb_setter;
|
m_slider_g->on_value_changed = rgb_setter;
|
||||||
m_slider_b->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)
|
void NodeColorPicker::set_color(glm::vec3 rgb)
|
||||||
{
|
{
|
||||||
auto hsv = convert_rgb2hsv(rgb);
|
auto hsv = convert_rgb2hsv(rgb);
|
||||||
@@ -146,6 +180,7 @@ void NodeColorPicker::set_color(glm::vec3 rgb)
|
|||||||
m_wheel->m_hsv = hsv;
|
m_wheel->m_hsv = hsv;
|
||||||
m_color_cur->m_color = { rgb, 1 };
|
m_color_cur->m_color = { rgb, 1 };
|
||||||
m_color_old->m_color = { rgb, 1 };
|
m_color_old->m_color = { rgb, 1 };
|
||||||
|
update_hex(rgb);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 NodeColorPicker::get_hsv() const
|
glm::vec3 NodeColorPicker::get_hsv() const
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ public:
|
|||||||
NodeBorder* m_color_old;
|
NodeBorder* m_color_old;
|
||||||
NodeBorder* m_color_old1;
|
NodeBorder* m_color_old1;
|
||||||
NodeBorder* m_color_old2;
|
NodeBorder* m_color_old2;
|
||||||
|
NodeButton* m_btn_copy;
|
||||||
|
NodeButton* m_btn_paste;
|
||||||
|
NodeText* m_txt_hex;
|
||||||
glm::vec3 m_rgb;
|
glm::vec3 m_rgb;
|
||||||
glm::vec3 m_hsv;
|
glm::vec3 m_hsv;
|
||||||
|
|
||||||
@@ -35,6 +38,7 @@ public:
|
|||||||
virtual kEventResult handle_event(Event* e) override;
|
virtual kEventResult handle_event(Event* e) override;
|
||||||
virtual void added(Node* parent) override;
|
virtual void added(Node* parent) override;
|
||||||
void init_controls();
|
void init_controls();
|
||||||
|
void update_hex(glm::vec3 rgb);
|
||||||
void set_color(glm::vec3 rgb);
|
void set_color(glm::vec3 rgb);
|
||||||
glm::vec3 get_hsv() const;
|
glm::vec3 get_hsv() const;
|
||||||
glm::vec3 get_rgb() const;
|
glm::vec3 get_rgb() const;
|
||||||
|
|||||||
34
src/util.cpp
34
src/util.cpp
@@ -485,6 +485,22 @@ glm::vec4 rand_color()
|
|||||||
return { r, g, b, 1.f };
|
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::vec3 convert_hsv2rgb(const glm::vec3 c)
|
||||||
{
|
{
|
||||||
glm::vec4 K = glm::vec4(1.0f, 2.0f / 3.0f, 1.0f / 3.0f, 3.0f);
|
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;
|
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)
|
static const char* gl2str(GLenum err)
|
||||||
{
|
{
|
||||||
switch (err)
|
switch (err)
|
||||||
|
|||||||
@@ -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(const std::vector<glm::vec2>& points);
|
||||||
std::vector<vertex_t> triangulate_simple(const std::vector<vertex_t>& vertices);
|
std::vector<vertex_t> triangulate_simple(const std::vector<vertex_t>& vertices);
|
||||||
glm::vec4 rand_color();
|
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_hsv2rgb(const glm::vec3 c);
|
||||||
glm::vec3 convert_rgb2hsv(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);
|
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);
|
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 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_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);
|
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);
|
void check_OpenGLError(const char* stmt, const char* fname, int line);
|
||||||
|
|||||||
Reference in New Issue
Block a user