I was initially considering a second widget, but it makes actually much
more sense to make the editability a property of the GimpLabelColor. It
also mean it can be switched on or off depending on situations.
… GimpProcedureDialog.
Technically I added:
- New gimp_prop_color_select_new() property widget to create a
GimpColorButton for a given GimpRGB property.
- gimp_procedure_dialog_get_widget() now supports a GimpRGB property and
will create a GimpColorArea by default.
- When the default doesn't suit you, a new function
gimp_procedure_dialog_get_color_widget() allows to create either a
GimpColorArea or a GimpColorButton (editable = TRUE), as well as
choose the area type (small or large checks, as well as flat area,
i.e. no alpha support).
… gimp_label_spin_set_digits() and deleted gimp_prop_opacity_entry_new()
- The "digits" argument for the number of decimal places in
gimp_prop_scale_entry_new() is now mostly useless since GimpLabelSpin
(hence GimpScaleEntry too) got a nice estimation algorithm of sensible
values.
- Add gimp_label_spin_set_digits() function to manually set the digits
property when we don't like the estimated value.
- Also add a new "factor" argument to gimp_prop_scale_entry_new(). Its
role is to allow a GimpScaleEntry showing a factored range, typically
a [0, 100] range for some types of [0, 1] properties.
- Remove gimp_prop_opacity_entry_new() which was basically a
special-case of gimp_prop_scale_entry_new() and which can now be
easily reproduced by simply set factor=100.0.
- Update all usage of gimp_prop_scale_entry_new() in app/ and plug-ins/
with updated arguments. It is interesting to note that all existing
usage were either integers (digits=1) or when double, the estimated
decimal places are the same as the ones which were manually set (hence
showing the generic estimation is not too bad). So the new function
gimp_label_spin_set_digits() was not even needed once in current code.
There is currently no property widget which just creates a
GimpSpinButton with a label. Just as the GimpScaleEntry was needed, this
one is as well.
I am creating a GimpLabeled abstract class which will represent various
widgets with a label. While this may seem a bit over-engineered for such
a basic feature, this will actually bring some consistency and a common
parent. In particular this can be used to get the GtkLabel with a common
interface to add them all in a common GtkSizeGroup when generating
dialogs automatically, hence make dialogs with properly aligned labels
and edition widgets.
Instead of setting always manually the step and page increments when
creating a GimpScaleEntry, let's just generate some common cases
automatically. Indeed the increments are rarely something you want to
care about. The algorithm used is:
- For a range under 1.0, use a hundredth and a tenth (typically a [0,
1.0] range will step-increment of 0.01 and page-increment of 0.1).
- For small ranges (under 40), step-increment by 1, page-increment by 2.
- For bigger ranges, step-increment by 1, page-increment by 10.
For use cases when you absolutely want specific increment values, I add
the gimp_scale_entry_set_increments() function. It is much better to
have a small and understandable constructor call followed by
configuration calls (only when needed) rather than a constructor with a
crazy amount of parameters. Hence gimp_scale_entry_new() went from 17
arguments (absolutely unreadable calls) to now 5.
Instead of the gimp_scale_entry_new() which creates several bound yet
independant widgets, and in the same time pack them into an existing
grid and return a GtkAdjustment (while heavily relying on GObject data
to link widgets), let's have a proper custom widget with its own clean
API.
This also simplifies the gimp_prop_scale_entry_new() property widget
variant.
First advantage is that we don't force the usage of a grid to use this
widget (there are a few pieces of code which create a GtkGrid with only
this inside just to be able to use this feature).
Second thing is that I am creating a much simpler API.
gimp_scale_entry_new() had 17 parameters! How crazy is that? So I
removed all the grid packing related parameters. Also I moved the spin
button/scale unconstraining parameters into their separate function,
because the constrained behavior is the most common use case, so it's
stupid to add 3 permanent dummy parameters for most calls. Instead the
few times where we'll want different ranges for the spin button and the
scale, we'll call the separate API gimp_scale_entry_set_range().
Thirdly the tooltip can be set directly with gimp_help_set_help_data()
since this is now its own widget. No need to have dedicated logics
anymore, better stay generic. Similarly no need of a custom function to
switch sensitivitivy (instead of generic gtk_widget_set_sensitive()).
Fourth thing is that we should not use macros for the public API, but
proper functions, because macros are not properly introspected for
binding.
For future improvements, maybe we could even make this widget implement
GtkOrientable interface, in order to be able to use it vertically.
Note: right now, I created a separate gimp_scale_entry_new2() and only
modified the property widget API to use this new code. Eventually I will
remove fully the old gimp_scale_entry_new() function (and the new code
will replace it).
Use a GType for the PROP_SYMMETRY property of GimpImage, and create
a default "identity" symmetry for an image.
I still use a GimpIntComboBox but store the property value in the
user-data column because gpointer isn't a subset of gint.
Adds in libgimpwidgets:
- gimp_int_combo_box_set_active_by_user_data()
- gimp_int_combo_box_get_active_user_data()
- gimp_int_store_lookup_by_user_data()
- gimp_prop_pointer_combo_box_new() to create a GimpIntComboBox and
attach it to a gpointer property.
Thanks Massimo and Mitch for reviewing my code.
This only helps to maintain proper includes in app/ and shouldn't
affect plug-ins at all, because these are supposed to only include the
main headers from libgimp/ since the beginning of time.
The gimpfootypes.h files do not have these guards, so we can continue
to maintain app/'s include policy that is very likely to error out if
wrong things are included.
Add gimp_prop_unit_combo_box_new() and adapt all places using the
prop_unit_menu. Some things are broken now, like there are no pixel
digits set, resolution unit menus show "pixels" and warn badly when
pixels is selected, and file-pdf-load is not built right now.
More fixes to come...
2009-01-17 Michael Natterer <mitch@gimp.org>
* all files with a GPL header and all COPYING files:
Change licence to GPLv3 (and to LGPLv3 for libgimp).
Cleaned up some copyright headers and regenerated the parsers in
the ImageMap plugin.
svn path=/trunk/; revision=27913
2007-10-14 Michael Natterer <mitch@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch] (gimp_prop_size_entry_new):
added parameter "gboolean property_is_pixel" which indicates that
the stored property value is always in pixels and not in the
selected unit.
* app/tools/gimptextoptions.c
* app/widgets/gimpstrokeeditor.c: pass FALSE to keep the old
behavior.
* app/tools/gimprectangleoptions.c (gimp_rectangle_options_gui):
added property "fixed-unit" which is used for all fixed values
now. Perhaps we need separate units for width/height/size. Enable
the unit menu on the "Width" and "Height" size entries of the
"Fixed" section and configure them to store the value in
pixels. This was the easy part, some other widgets still need unit
support.
* app/tools/gimprectangletool.c (gimp_rectangle_tool_start): set
the image's resolution on the size entries changed above.
svn path=/trunk/; revision=23821
2007-03-08 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch]: gimp_prop_string_combo_box_new()
takes a GtkTreeModel, not a GtkTreeStore.
svn path=/trunk/; revision=22071
2007-02-12 Sven Neumann <sven@gimp.org>
* libgimpwidgets/Makefile.am
* libgimpwidgets/gimpwidgetstypes.h
* libgimpwidgets/gimpwidgets.h
* libgimpwidgets/gimpstringcombobox.[ch]: added GimpStringComboBox.
* libgimpwidgets/gimppropwidgets.[ch]: added a prop widget
constructor that uses the new widget.
* libgimpwidgets/gimpwidgets.def: updated.
* app/widgets/gimpcontrollereditor.c: use a GimpStringComboBox if
the module specifies a tree model with string values.
* modules/gimpinputdevicestore.c: minor cleanup.
* modules/controller_linux_input.c: keep a pointer to the input
device store and unref it in the finalizer.
svn path=/trunk/; revision=21900
2006-12-18 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch]
* libgimpwidgets/gimpwidgets.def: added new function
gimp_prop_file_chooser_button_new_with_dialog().
* libgimpwidgets/gimppropwidgets.[ch]: added
gimp_prop_toggle_button_new(), and re-implemented
gimp_prop_check_button_new() in terms of it, as basically
a convenience function now.
2006-06-09 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimpfileentry.[ch]: deprecate the GimpFileEntry
widget, use GtkFileChooserButton instead.
* libgimpwidgets/gimppatheditor.c: undef GIMP_DISABLE_DEPRECATED
as long as we are still using GimpFileEntry here.
* libgimpwidgets/gimppropwidgets.[ch]: removed
gimp_prop_file_entry_new(); use gimp_prop_file_chooser_button_new()
instead.
2005-08-06 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch]
* libgimpwidgets/gimpwidgets.def: added gimp_prop_hscale_new().
* app/tools/gimpforegroundselectoptions.c: added a control for the
stroke width.
* app/tools/gimpforegroundselecttool.c: cancel the tool if the
active drawable or the image size changes.
* app/widgets/gimpcontrollerlist.c: fixed signedness warning.
2005-06-25 Sven Neumann <sven@gimp.org>
* libgimpwidgets/Makefile.am
* libgimpwidgets/gimpwidgets.h
* libgimpwidgets/gimpwidgetstypes.h
* libgimpwidgets/gimpenumlabel.[ch]: added new widget GimpEnumLabel.
* libgimpwidgets/gimppropwidgets.[ch]: added
gimp_prop_enum_label_new().
* libgimpwidgets/gimpwidgets.def: updated.
* modules/cdisplay_lcms.c (cdisplay_lcms_configure): started to
add a view on the current color managment configuration.
2005-03-25 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch]: added
gimp_prop_file_chooser_button_new(), a convenience constructor for
GtkFileChooserButton.
* libgimpwidgets/gimpwidgets.def: updated.
* app/dialogs/preferences-dialog.c: use the new prop widget on the
color management page.
2005-01-22 Sven Neumann <sven@gimp.org>
* app/widgets/gimppropwidgets.[ch]: added gimp_prop_expander_new().
* app/paint/gimppaintoptions.[ch]: added a property to track the
state of the "Pressure sensitivity" expander.
* app/tools/gimppaintoptions-gui.c: use gimp_prop_expander_new()
to create the "Pressure sensitivity" expander.
2004-12-08 Michael Natterer <mitch@gimp.org>
* app/widgets/gimppropwidgets.[ch]: added new prop_widget
gimp_prop_int_combo_box_new() which takes a pre-built GimpIntStore
and allows to create views on int properties with arbitrary sets
of values (not just enums).
* app/widgets/gimpcontrollereditor.c
(gimp_controller_editor_constructor): added support for generic
combo boxes controlled exclusively by controller properties: if an
int property "foo" is followed by an object property "foo-values"
and the contained object is a GimpIntStore, use that store as
model for selecting "foo"'s values using
gimp_prop_int_combo_box_new().
(Allows for more flexible controller configuration, the actual use
case in the midi controller is still work in progress).
2004-05-03 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimpframe.c: if the label_widget is a button, set
the button label as bold. Cache the indentation instead of
calculating it over and over again.
* themes/Default/gtkrc: set HIG-compliant spacing for the
action_area.
* app/widgets/gimppropwidgets.[ch]: added
gimp_prop_enum_radio_box_new() for a radio group that is no
embedded in a frame.
* app/widgets/gimpstrokeeditor.c: use a frame-less radio box for
the Stroke style.
* app/gui/file-new-dialog.c
* app/gui/grid-dialog.c
* app/gui/stroke-dialog.c: HIG-compliant spacings.
2004-01-28 Michael Natterer <mitch@gimp.org>
Added infrastructure to make sure we don't write to the global
brush, pattern etc. directories. Needed to make this configurable
because we can't rely on the global directories being read-only,
having certain names or being otherwise detectable at runtime in a
sane way. Fixes bug #132214.
* libgimpbase/gimpdatafiles.[ch]: added "const gchar *dirname" to
the GimpDataFileData struct so callbacks don't need to call
g_path_get_dirname() for each file.
* libgimpwidgets/gimpfileentry.c: made it work with non UTF-8
encoded filenames.
* libgimpwidgets/gimppatheditor.[ch]: ditto. Added GUI and API for
setting/getting a second "writable_path". The widget makes sure
that the writable_path is always a subset of the path.
* app/config/gimpconfig-utils.[ch]: added new function
gimp_config_build_writable_path().
* app/config/gimpcoreconfig.[ch]: added separate properties for
the writable brush, pattern, gradient, palette and font paths.
* app/config/gimprc-blurbs.h: added (still empty) blurbs for the
new properties.
* app/core/gimpdata.[ch] (gimp_data_set_filename): added parameter
"gboolean writable". Set data->writable to FALSE by default. If
"writable" is passed as TRUE, still check if we can write to the
file before setting data->writable to TRUE.
(gimp_data_create_filename): changed "data_path" parameter to
"dest_dir" and assume dest_dir is writable.
(gimp_data_duplicate): set data->dirty to TRUE to make sure
duplicated things will be saved.
* app/core/gimpbrush.c
* app/core/gimpbrushgenerated.c
* app/core/gimpbrushpipe.c
* app/core/gimpgradient.c
* app/core/gimppalette.c
* app/core/gimppattern.c: don't set the data's filename and don't
touch data->dirty in the _load() functions because that's done by
the data factory now. Don't touch data->dirty in the _duplicate()
functions because that's done by gimp_data_duplicate() itself now.
* app/core/gimpdatafactory.[ch] (gimp_data_factory_new): added
"writable_property_name" and remember it.
Added utility function gimp_data_factory_get_save_dir() which
determines the directory to save new datas to.
Added public function gimp_data_factory_data_save_single() which
saves a single data object.
Make sure new things get saved to the first writable directory
as specified in preferences.
* app/core/gimp.c (gimp_real_initialize): pass the writable_paths'
property names to gimp_data_factory_new().
* app/widgets/gimpdataeditor.c (gimp_data_editor_save_dirty): use
gimp_data_factory_data_save_single() instead of implementing
saving here.
* app/widgets/gimppropwidgets.[ch] (gimp_prop_path_editor_new):
added "const gchar *writable_property_name" parameter (can be
NULL).
Added the needed callbacks to handle the writable_path and made
the path_editor and file_entry code aware of non UTF-8 filename
encodings. Some general cleanup.
* app/gui/preferences-dialog.c: changed accordingly.
2003-11-05 Sven Neumann <sven@gimp.org>
* app/app_procs.c: register a log handler for the Gimp-Text domain.
* app/text/gimpfont.c: code cosmetics.
* app/text/gimptext-compat.c: removed debugging output.
Let GIMP work w/o any fonts. Of course you won't get any text
functionality then:
* app/text/gimpfontlist.c: don't install any font aliases if no
fonts were found.
* app/text/gimptextlayer.c: refuse to render any text layers when
the GIMP fonts list is empty.
* app/tools/gimptexttool.c: removed redundant includes.
* app/tools/gimptextoptions.c: removed the font selection widget.
This is a temporary regression that will be cured by improving the
GimpFontView widget.
* app/widgets/Makefile.am
* app/widgets/gimpfontselection-dialog.[ch]
* app/widgets/gimpfontselection.[ch]
* app/widgets/gimppropwidgets.[ch]: removed the font selection and
all references to it. Fixes bug #119267.
2003-10-23 Sven Neumann <sven@gimp.org>
* app/widgets/gimppropwidgets.[ch] (gimp_prop_size_entry_new): take
the boundaries from the GParamSpec instead of hardcoding them.
Added a utility function to reduce code duplication.
2003-10-01 Sven Neumann <sven@gimp.org>
* app/widgets/gimppropwidgets.[ch]: renamed
gimp_prop_size_entry_connect() to gimp_prop_coordinates_connect().
Added a new property widget that is a single GimpSizeEntry and is
connected to size and unit properties.
* app/widgets/gimptemplateeditor.c: changed accordingly.
* app/widgets/gimpstrokeeditor.c: added a "resolution" property
and use the new property widget.
* app/gui/stroke-dialog.c: pass the image resolution to
gimp_stroke_editor_new().
2003-07-07 Michael Natterer <mitch@gimp.org>
* app/gui/Makefile.am
* app/gui/device-status-dialog.[ch]: removed...
* app/widgets/Makefile.am
* app/widgets/widgets-types.h
* app/widgets/gimpdevicestatus.[ch]: ...added here as widget. The
thing is narrower now but not nicer and needs some polishing.
* app/widgets/gimppropwidgets.[ch]: added gimp_prop_color_area_new()
and gimp_prop_stock_image_new() (the latter is still unused).
* app/gui/dialogs-constructors.[ch]
* app/gui/dialogs.c: made the device status a dockable.
* app/gui/dialogs-menu.c
* app/gui/image-menu.c
* app/gui/toolbox-menu.c: changed accordingly.
* app/gui/gui.c: update the device status dialog indirectly now
using the new gui_device_change_notify() callback.
2003-04-03 Michael Natterer <mitch@gimp.org>
Added preliminary support for image templates. Not finished
yet. Addresses bug #96059. Now we need a volunteer to create
a nice collection of default templates...
* app/core/Makefile.am
* app/core/core-types.h
* app/core/gimptemplate.[ch]
* app/core/gimp-templates.[ch]: new files implementing the new
GimpTemplate object and the list of available image templates.
* app/core/gimp.[ch]: keep a container of templates around.
* app/core/gimpimage-new.[ch]: ported to use GimpTemplate. Removed
struct GimpImageNewValues.
* app/widgets/gimpcontainermenuimpl.c: changed to show the
"(none)" item for a NULL selection also, not only for an empty
container.
* app/widgets/gimppropwidgets.[ch]: added
gimp_prop_size_entry_connect() which connects an externally
created GimpSizeEntry to object properties. Fixed the size entry
code to actually work.
* app/gui/image-menu.c
* app/gui/file-commands.[ch]: added "Save as Template" which
creates a new template from any image's properties.
* app/gui/file-new-dialog.c: use prop_widgets and GimpTemplate.
Offer the available templates in a menu at the top of the dialog.