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.
 
 
 
 
 
 

85 lines
2.4 KiB

#include "FillTransparencyDialog.h"
FillTransparencyDialog::FillTransparencyDialog(GladeSearchpath* gladeSearchPath, int alpha)
: GladeGui(gladeSearchPath, "fillTransparency.glade", "fillTransparencyDialog"),
resultAlpha(-1)
{
XOJ_INIT_TYPE(FillTransparencyDialog);
GtkWidget* scaleAlpha = get("scaleAlpha");
gtk_range_set_value(GTK_RANGE(scaleAlpha), alpha / 255.0 * 100);
setPreviewImage(alpha);
g_signal_connect(scaleAlpha, "change-value", G_CALLBACK(
+[](GtkRange* range, GtkScrollType scroll, gdouble value, FillTransparencyDialog* self)
{
XOJ_CHECK_TYPE_OBJ(self, FillTransparencyDialog);
self->setPreviewImage((int)(value / 100 * 255));
}), this);
}
FillTransparencyDialog::~FillTransparencyDialog()
{
XOJ_RELEASE_TYPE(FillTransparencyDialog);
}
const int PREVIEW_WIDTH = 70;
const int PREVIEW_HEIGTH = 50;
const int PREVIEW_BORDER = 10;
void FillTransparencyDialog::setPreviewImage(int alpha)
{
cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, PREVIEW_WIDTH, PREVIEW_HEIGTH);
cairo_t* cr = cairo_create(surface);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgb(cr, 255, 255, 255);
cairo_rectangle(cr, 0, 0, PREVIEW_WIDTH, PREVIEW_WIDTH);
cairo_fill(cr);
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
cairo_set_source_rgba(cr, 0, 0x80 / 255.0, 0, alpha / 255.0);
cairo_rectangle(cr, PREVIEW_BORDER, PREVIEW_BORDER, PREVIEW_WIDTH - PREVIEW_BORDER * 2, PREVIEW_HEIGTH - PREVIEW_BORDER * 2);
cairo_fill(cr);
cairo_set_line_width(cr, 5);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgb(cr, 0, 0x80 / 255.0, 0);
cairo_rectangle(cr, PREVIEW_BORDER, PREVIEW_BORDER, PREVIEW_WIDTH - PREVIEW_BORDER * 2, PREVIEW_HEIGTH - PREVIEW_BORDER * 2);
cairo_stroke(cr);
cairo_destroy(cr);
GtkWidget* preview = get("imgPreview");
gtk_image_set_from_surface(GTK_IMAGE(preview), surface);
}
int FillTransparencyDialog::getResultAlpha()
{
XOJ_CHECK_TYPE(FillTransparencyDialog);
return resultAlpha;
}
void FillTransparencyDialog::show(GtkWindow* parent)
{
XOJ_CHECK_TYPE(FillTransparencyDialog);
gtk_window_set_transient_for(GTK_WINDOW(this->window), parent);
int result = gtk_dialog_run(GTK_DIALOG(this->window));
gtk_widget_hide(this->window);
// OK Button
if (result == 1)
{
GtkWidget* scaleAlpha = get("scaleAlpha");
resultAlpha = gtk_range_get_value(GTK_RANGE(scaleAlpha));
}
else
{
resultAlpha = -1;
}
}