summaryrefslogtreecommitdiff
path: root/fluid/Fl_Widget_Type.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2023-12-14 23:37:05 +0100
committerMatthias Melcher <github@matthiasm.com>2023-12-14 23:37:10 +0100
commit14f4dec0b98bb72d9b65edc09b922e752e9e2074 (patch)
treea3704786075102d84618d733b2aa14722fde397c /fluid/Fl_Widget_Type.cxx
parent33d071875623dc90e8da00d0491f97bc2558c861 (diff)
FLUID: Adds image scaling to widget dialog
Diffstat (limited to 'fluid/Fl_Widget_Type.cxx')
-rw-r--r--fluid/Fl_Widget_Type.cxx82
1 files changed, 72 insertions, 10 deletions
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 9a5c3251a..f11c7f968 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -151,8 +151,17 @@ void Fl_Widget_Type::setimage(Fluid_Image *i) {
if (image) image->decrement();
if (i) i->increment();
image = i;
- if (i) i->image(o);
- else o->image(0);
+ if (i) {
+ i->image(o);
+ if (o->image() && (scale_image_w_ || scale_image_h_)) {
+ int iw = scale_image_w_>0 ? scale_image_w_ : o->image()->data_w();
+ int ih = scale_image_h_>0 ? scale_image_h_ : o->image()->data_h();
+ o->image()->scale(iw, ih, 0, 1);
+ }
+ } else {
+ o->image(0);
+ //scale_image_w_ = scale_image_h_ = 0;
+ }
redraw();
}
@@ -161,8 +170,17 @@ void Fl_Widget_Type::setinactive(Fluid_Image *i) {
if (inactive) inactive->decrement();
if (i) i->increment();
inactive = i;
- if (i) i->deimage(o);
- else o->deimage(0);
+ if (i) {
+ i->deimage(o);
+ if (o->deimage()) {
+ int iw = scale_deimage_w_>0 ? scale_deimage_w_ : o->deimage()->data_w();
+ int ih = scale_deimage_h_>0 ? scale_deimage_h_ : o->deimage()->data_h();
+ o->deimage()->scale(iw, ih, 0, 1);
+ }
+ } else {
+ o->deimage(0);
+ //scale_deimage_w_ = scale_deimage_h_ = 0;
+ }
redraw();
}
@@ -188,6 +206,10 @@ Fl_Widget_Type::Fl_Widget_Type()
compress_image_ = 1;
bind_deimage_ = 0;
compress_deimage_ = 1;
+ scale_image_w_ = 0;
+ scale_image_h_ = 0;
+ scale_deimage_w_ = 0;
+ scale_deimage_h_ = 0;
}
Fl_Widget_Type::~Fl_Widget_Type() {
@@ -457,7 +479,7 @@ void image_browse_cb(Fl_Button* b, void *v) {
}
}
-void bind_image_cb(Fl_Button* b, void *v) {
+void bind_image_cb(Fl_Check_Button* b, void *v) {
if (v == LOAD) {
if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
b->activate();
@@ -477,7 +499,7 @@ void bind_image_cb(Fl_Button* b, void *v) {
}
}
-void compress_image_cb(Fl_Button* b, void *v) {
+void compress_image_cb(Fl_Check_Button* b, void *v) {
if (v == LOAD) {
if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
b->activate();
@@ -539,7 +561,7 @@ void inactive_browse_cb(Fl_Button* b, void *v) {
}
}
-void bind_deimage_cb(Fl_Button* b, void *v) {
+void bind_deimage_cb(Fl_Check_Button* b, void *v) {
if (v == LOAD) {
if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
b->activate();
@@ -559,7 +581,7 @@ void bind_deimage_cb(Fl_Button* b, void *v) {
}
}
-void compress_deimage_cb(Fl_Button* b, void *v) {
+void compress_deimage_cb(Fl_Check_Button* b, void *v) {
if (v == LOAD) {
if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
b->activate();
@@ -3109,8 +3131,34 @@ void Fl_Widget_Type::write_widget_code(Fd_Code_Writer& f) {
write_color(f, "color", o->color());
if (o->selection_color() != tplate->selection_color() || subclass())
write_color(f, "selection_color", o->selection_color());
- if (image) image->write_code(f, bind_image_, var);
- if (inactive) inactive->write_code(f, bind_deimage_, var, 1);
+ if (image) {
+ image->write_code(f, bind_image_, var);
+ if (scale_image_w_ || scale_image_h_) {
+ f.write_c("%s%s->image()->scale(", f.indent(), var);
+ if (scale_image_w_>0)
+ f.write_c("%d, ", scale_image_w_);
+ else
+ f.write_c("%s->image()->data_w(), ", var);
+ if (scale_image_h_>0)
+ f.write_c("%d, 0, 1);\n", scale_image_h_);
+ else
+ f.write_c("%s->image()->data_h(), 0, 1);\n", var);
+ }
+ }
+ if (inactive) {
+ inactive->write_code(f, bind_deimage_, var, 1);
+ if (scale_deimage_w_ || scale_deimage_h_) {
+ f.write_c("%s%s->deimage()->scale(", f.indent(), var);
+ if (scale_deimage_w_>0)
+ f.write_c("%d, ", scale_deimage_w_);
+ else
+ f.write_c("%s->deimage()->data_w(), ", var);
+ if (scale_deimage_h_>0)
+ f.write_c("%d, 0, 1);\n", scale_deimage_h_);
+ else
+ f.write_c("%s->deimage()->data_h(), 0, 1);\n", var);
+ }
+ }
if (o->labeltype() != tplate->labeltype() || subclass())
f.write_c("%s%s->labeltype(FL_%s);\n", f.indent(), var,
item_name(labeltypemenu, o->labeltype()));
@@ -3232,12 +3280,16 @@ void Fl_Widget_Type::write_properties(Fd_Project_Writer &f) {
f.write_word(tooltip());
}
if (image_name() && *image_name()) {
+ if (scale_image_w_ || scale_image_h_)
+ f.write_string("scale_image {%d %d}", scale_image_w_, scale_image_h_);
f.write_string("image");
f.write_word(image_name());
f.write_string("compress_image %d", compress_image_);
}
if (bind_image_) f.write_string("bind_image 1");
if (inactive_name() && *inactive_name()) {
+ if (scale_deimage_w_ || scale_deimage_h_)
+ f.write_string("scale_deimage {%d %d}", scale_deimage_w_, scale_deimage_h_);
f.write_string("deimage");
f.write_word(inactive_name());
f.write_string("compress_deimage %d", compress_deimage_);
@@ -3361,6 +3413,11 @@ void Fl_Widget_Type::read_property(Fd_Project_Reader &f, const char *c) {
}
} else if (!strcmp(c,"tooltip")) {
tooltip(f.read_word());
+ } else if (!strcmp(c,"scale_image")) {
+ if (sscanf(f.read_word(),"%d %d",&w,&h) == 2) {
+ scale_image_w_ = w;
+ scale_image_h_ = h;
+ }
} else if (!strcmp(c,"image")) {
image_name(f.read_word());
// starting in 2023, `image` is always followed by `compress_image`
@@ -3374,6 +3431,11 @@ void Fl_Widget_Type::read_property(Fd_Project_Reader &f, const char *c) {
bind_image_ = (int)atol(f.read_word());
} else if (!strcmp(c,"compress_image")) {
compress_image_ = (int)atol(f.read_word());
+ } else if (!strcmp(c,"scale_deimage")) {
+ if (sscanf(f.read_word(),"%d %d",&w,&h) == 2) {
+ scale_deimage_w_ = w;
+ scale_deimage_h_ = h;
+ }
} else if (!strcmp(c,"deimage")) {
inactive_name(f.read_word());
// starting in 2023, `deimage` is always followed by `compress_deimage`