gimpmybrushoptions.c 6.87 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* GIMP - The GNU Image Manipulation Program
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * 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
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
15
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
16 17 18 19 20 21 22 23 24 25 26 27 28
 */

#include "config.h"

#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gegl.h>

#include "libgimpconfig/gimpconfig.h"

#include "paint-types.h"

#include "core/gimp.h"
#include "core/gimpdrawable.h"
29
#include "core/gimpmybrush.h"
30 31 32 33 34 35 36 37 38 39 40
#include "core/gimppaintinfo.h"

#include "gimpmybrushoptions.h"

#include "gimp-intl.h"


enum
{
  PROP_0,
  PROP_RADIUS,
41
  PROP_OPAQUE,
42
  PROP_HARDNESS,
43 44
  PROP_ERASER,
  PROP_NO_ERASING
45 46
};

47

48
static void   gimp_mybrush_options_config_iface_init (GimpConfigInterface *config_iface);
49 50 51 52 53 54 55 56 57 58 59 60

static void   gimp_mybrush_options_set_property     (GObject      *object,
                                                     guint         property_id,
                                                     const GValue *value,
                                                     GParamSpec   *pspec);
static void   gimp_mybrush_options_get_property     (GObject      *object,
                                                     guint         property_id,
                                                     GValue       *value,
                                                     GParamSpec   *pspec);

static void    gimp_mybrush_options_mybrush_changed (GimpContext  *context,
                                                     GimpMybrush  *brush);
61

62 63
static void    gimp_mybrush_options_reset           (GimpConfig   *config);

64

65 66 67 68
G_DEFINE_TYPE_WITH_CODE (GimpMybrushOptions, gimp_mybrush_options,
                         GIMP_TYPE_PAINT_OPTIONS,
                         G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
                                                gimp_mybrush_options_config_iface_init))
69

70
static GimpConfigInterface *parent_config_iface = NULL;
71

72

73 74 75
static void
gimp_mybrush_options_class_init (GimpMybrushOptionsClass *klass)
{
76 77
  GObjectClass     *object_class  = G_OBJECT_CLASS (klass);
  GimpContextClass *context_class = GIMP_CONTEXT_CLASS (klass);
78

79 80 81 82
  object_class->set_property     = gimp_mybrush_options_set_property;
  object_class->get_property     = gimp_mybrush_options_get_property;

  context_class->mybrush_changed = gimp_mybrush_options_mybrush_changed;
83

84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
  GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_RADIUS,
                           "radius",
                           _("Radius"),
                           NULL,
                           -2.0, 6.0, 1.0,
                           GIMP_PARAM_STATIC_STRINGS);

  GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_OPAQUE,
                           "opaque",
                           _("Base Opacity"),
                           NULL,
                           0.0, 2.0, 1.0,
                           GIMP_PARAM_STATIC_STRINGS);

  GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_HARDNESS,
                           "hardness",
                           _("Hardness"),
                           NULL,
                           0.0, 1.0, 1.0,
                           GIMP_PARAM_STATIC_STRINGS);

  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_ERASER,
                            "eraser",
                            _("Erase with this brush"),
                            NULL,
                            FALSE,
                            GIMP_PARAM_STATIC_STRINGS);
111 112 113 114 115 116 117

  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_NO_ERASING,
                            "no-erasing",
                            _("No erasing effect"),
                            _("Never decrease alpha of existing pixels"),
                            FALSE,
                            GIMP_PARAM_STATIC_STRINGS);
118 119
}

120 121 122 123 124
static void
gimp_mybrush_options_config_iface_init (GimpConfigInterface *config_iface)
{
  parent_config_iface = g_type_interface_peek_parent (config_iface);

125
  config_iface->reset = gimp_mybrush_options_reset;
126 127
}

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
static void
gimp_mybrush_options_init (GimpMybrushOptions *options)
{
}

static void
gimp_mybrush_options_set_property (GObject      *object,
                                   guint         property_id,
                                   const GValue *value,
                                   GParamSpec   *pspec)
{
  GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (object);

  switch (property_id)
    {
    case PROP_RADIUS:
      options->radius = g_value_get_double (value);
      break;
    case PROP_HARDNESS:
      options->hardness = g_value_get_double (value);
      break;
149 150 151
    case PROP_OPAQUE:
      options->opaque = g_value_get_double (value);
      break;
152 153 154
    case PROP_ERASER:
      options->eraser = g_value_get_boolean (value);
      break;
155 156 157
    case PROP_NO_ERASING:
      options->no_erasing = g_value_get_boolean (value);
      break;
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
    }
}

static void
gimp_mybrush_options_get_property (GObject    *object,
                                   guint       property_id,
                                   GValue     *value,
                                   GParamSpec *pspec)
{
  GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (object);

  switch (property_id)
    {
    case PROP_RADIUS:
      g_value_set_double (value, options->radius);
      break;
178 179 180
    case PROP_OPAQUE:
      g_value_set_double (value, options->opaque);
      break;
181 182 183
    case PROP_HARDNESS:
      g_value_set_double (value, options->hardness);
      break;
184 185 186
    case PROP_ERASER:
      g_value_set_boolean (value, options->eraser);
      break;
187 188 189
    case PROP_NO_ERASING:
      g_value_set_boolean (value, options->no_erasing);
      break;
190 191 192 193 194 195

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
    }
}
196

197 198 199
static void
gimp_mybrush_options_mybrush_changed (GimpContext *context,
                                      GimpMybrush *brush)
200
{
201 202 203 204 205
  if (brush)
    g_object_set (context,
                  "radius",   gimp_mybrush_get_radius (brush),
                  "opaque",   gimp_mybrush_get_opaque (brush),
                  "hardness", gimp_mybrush_get_hardness (brush),
206
                  "eraser",   gimp_mybrush_get_is_eraser (brush),
207
                  NULL);
208
}
209 210

static void
211
gimp_mybrush_options_reset (GimpConfig *config)
212
{
213
  GimpContext *context = GIMP_CONTEXT (config);
214 215
  GimpMybrush *brush   = gimp_context_get_mybrush (context);

216 217
  parent_config_iface->reset (config);

218
  gimp_mybrush_options_mybrush_changed (context, brush);
219
}