Earlier I claimed that drawing would work now because we make sure
that buffer and layout are always in sync. This was nonsense. In fact,
we constantly ran into the sutiation where the buffer was modified,
and we were drawing with the previous layout. It's unclear why this
didn't cause drawing artifacts, but it did cause e.g. the cursor
temporarily jumping to the next position while editing in the middle
of text (especially visible at line ends).
Several underlying problems existed: first, we now modify the buffer
from outside the text tool (from GimpTextStyleEditor) where we can't
pause the tool; second, proxy changes are handled asymetrically
(property changes are queued and processed all together in an idle
function) so we can't pause/resume drawing across the entire operation
because it has many beginnings and only one end.
Therefore:
- add gimp_text_tool_block_drawing()/unblock_drawing(), where block()
can be called as many times as needed, and a single unblock()
enables drawing again. block() also clears the layout, because it
served its purpose (it was just used to pause drawing, and we know
the buffer will change, so kill it).
- connect to GtkTextBuffer::begin-user-action and call block() from
the callback, so we undraw stuff and kill the cached layout before
any buffer change happens.
- call unblock() at the end of gimp_text_tool_apply() because then
the text and the buffer are in sync again, the tool is undrawn and
we can safely create the layout again to draw our stuff.
- also call block()/unblock() from some other places, like when a
new text layer is created.
- get rid of *all* calls to draw_tool_pause()/resume() around buffer
modifications, they are not needed any longer.
- add calls to begin/end_user_action() where they were missing.
- create a GimpTextStyleEditor on the canvas when editing text.
- sync "text" and "markup" between proxy and text, not only "text.
- connect to chages to text marks on the buffer.
Pull all text buffer utility functions as methods and use
GimpTextBuffer all over the place instead of GtkTextBuffer.
Some actually usefuly features coming soon...
Switch to a completely new PangoLayout managing stategy: The drawing
code relies on text_tool->layout being a view on text_tool->text_buffer,
if they get out of sync, drawing is b0rk.
Therefore, split the update_layout() function into clear_layout()
(which kill the layout) and ensure_layout() (which creates the layout
if it doesn't exist).
Whenever the buffer gets modified, pause the draw tool before the
modification so the old cursor/selection undraw, then clear the
layout. Resuming the draw tool will automatically re-create the layout
for the buffer's new contents.
Also switch off any clipping for cursor and selection, so we can at
least see that our input has some effect, even if we don't actually
see the edited text because it's out-of-layer.
This has several advantages:
- it's always readable, no matter how sick font/colors are.
- it does not mess up the buffer, which is a model that should not
contain temporary edit states.
- preediting does not clutter undo.
- it fixes the remaining bugs in the old preediting code because that
code is completely gone now.
* app/widgets/gimptextproxy.c: also swallow the "toggle-overwrite"
signal.
* app/tools/gimpdrawtool. [ch] (gimp_draw_tool_draw_text_cursor): add
"gboolean overwrite" which causes the cursor to be drawn as block.
* app/tools/gimptexttool.[ch]: implement overwriting, toggling it,
and changing the text cursor accordingly.
Change public text tool API to gimp_text_tool_delete_selection() and
move delete and backspace code to their own handlers in preparation of
handling all text deletion types.
* app/core/gimpmarshal.list: add marshallers needed for the binding
singnals.
* app/tools/gimptexttool.[ch]: add binding signals "move-cursor",
"delete-from-cursor" and "backspace" and hijack GtkTextView's
binding set to invoke them. Move code from the key_press() handler
to the signals' default handlers. This is how it should work. In
fact that code is #ifdef'ed away and we need an evil proxy
GtkTextView to invoke the bindings on because of reasons stated in
comments in the code. Ugly but works just fine.
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
2008-11-01 Michael Natterer <mitch@gimp.org>
* app/tools/gimprectangletool.c
(gimp_rectangle_tool_cursor_update): set the MOVE cursor when we
are in MOVING mode.
* app/tools/gimptexttool.[ch]: remove members x1,x2,y1,y2 and use
the rectangle tool's bounding box for creating the text layer (x2
and y2) were unused anyway. Add boolean member "moving". Implement
oper_update() and set the tool to moving mode when ALT is pressed.
Changed button_press(), button_release() and motion() accordingly.
Some more cleanup and removal of comented out code.
svn path=/trunk/; revision=27519
2008-10-27 Michael Natterer <mitch@gimp.org>
* menus/text-tool-menu.xml
* app/actions/text-tool-actions.c
* app/actions/text-tool-commands.[ch]: add "Text along Path" to the
text tool context menu.
* app/tools/gimptextoptions.[ch]: remove the text along path
button here.
* app/tools/gimptexttool.c: changed accordingly.
* app/tools/gimptexttool.[ch]: move public functions together,
move all virtual function implementations together and put them in
order, made the text along path function public, factor out
gimp_text_tool_xy_to_offset() instead of duplicaing this code
three times, remove gimp_rectangle_tool_frame_item() because it
doesn't belong here.
* app/tools/gimprectangletool.[ch]: add
gimp_rectangle_tool_frame_item() here. Enselic, please process ;)
svn path=/trunk/; revision=27444
2008-10-27 Michael Natterer <mitch@gimp.org>
* app/tools/gimptexttool.h: add integer x_pos member to remember
the x cursor position when moving up and down across shorter
lines.
* app/tools/gimptexttool.c (gimp_text_tool_key_press): implement
moving the cursor up and down. The x_pos probably needs to be
reset in a few more places but it seems to work pretty nicely
already.
svn path=/trunk/; revision=27430
2008-10-26 Michael Natterer <mitch@gimp.org>
* app/tools/gimptexttool.[ch]: some general formatting cleanup.
(gimp_text_tool_key_press): implement ctrl-moving the cursor by
words, handle Delete.
(gimp_text_tool_delete_text): add boolean "backspace" parameter
and delete forward when it's FALSE.
* app/actions/text-tool-commands.c: pass an arbitrary TRUE to
gimp_text_tool_delete_text() (it's not used because when called
from here, there is always a selection).
svn path=/trunk/; revision=27423
2008-10-26 Michael Natterer <mitch@gimp.org>
Merge on-canvas GSoC project:
* configure.in: check for pangocairo.
* app/Makefile.am
* app/text/Makefile.am: add its CFLAGS and LIBS.
* app/text/gimptext-bitmap.[ch]
* app/text/gimptext-private.h
* app/text/gimptext-vectors.[ch]
* app/text/gimptextlayer.c
* app/text/gimptextlayout-render.c
* app/text/gimptextlayout.c: port to pangocairo.
* menus/Makefile.am
* menus/text-tool-menu.xml
* app/menus/menus.c
* app/actions/Makefile.am
* app/actions/actions.c
* app/actions/text-tool-actions.[ch]
* app/actions/text-tool-commands.[ch]: add a context menu for the
text tool similar to GtkEntry's context menu.
* app/tools/gimprectangletool.[ch]: add "narrow-mode" property.
* app/tools/gimptextoptions.[ch]
* app/widgets/gimptexteditor.[ch]: take a text buffer for the
standalone text editor window instead of creating one internally.
* app/tools/gimptexttool.[ch]: all the new wonderful on-canvas
text editing logic. Wheee!
svn path=/trunk/; revision=27419
2008-05-02 Martin Nordholts <martinn@svn.gnome.org>
* gimptexttool.c
* gimptexttool.h:
* gimprectangletool.c
* gimprectangletool.h
* gimprectangleselecttool.c: Renamed the "rectangle-changed"
signal to "rectangle-change-complete" which is much better name
since the signal is not emited when the rectangle is changed, but
when the change is complete.
svn path=/trunk/; revision=25557
* app/text/gimptextlayout.c
* app/tools/gimptexttool.[ch]
* app/tools/gimprectangletool.[ch]
* app/tools/gimptextoptions.c: allow resizing of text
box. This is work in progress, and needs some tweaks
and fixes. See bug #122707.
svn path=/trunk/; revision=25344
2006-09-05 Michael Natterer <mitch@gimp.org>
* app/tools/gimptool.[ch]: added gimp_tool_get_options() so tools
don't need to incude "core/gimptoolinfo.h" just to get to
their options.
* app/tools/gimp*tool.h: added macros GIMP_FOO_TOOL_GET_OPTIONS()
which return specific tool options types and do all casting
themselves.
* app/tools/*.c: use the new macros and don't include
"core/gimptoolinfo.h" in most files.
* app/tools/gimpcolorpickertool.c (gimp_color_picker_tool_register):
make it use the parent context's FG and BG.
* app/tools/gimpcolortool.c (gimp_color_tool_real_picked): set the
color on the tool's options, not on the user context.
2004-03-22 Sven Neumann <sven@gimp.org>
* app/tools/gimptexttool.[ch]: preserve the text tool on image
changes. Instead connect to the text layer's "notify::modified"
signal and disconnect from the layer when it is modified.
Fixes bug #137890.
2004-03-19 Sven Neumann <sven@gimp.org>
* app/tools/gimptexttool.[ch]: added a confirmation dialog that is
shown when the user attempts to modify a modified text layer.
2004-03-14 Sven Neumann <sven@gimp.org>
* app/text/gimptextlayer.[ch]: removed all idle handling here.
Changes to the text-layer's text object all applied synchronously.
* app/display/gimpdisplayshell-dnd.c
* app/text/gimptextlayer-transform.c: removed now obsolete calls
to gimp_text_layer_flush().
* app/tools/gimptexttool.[ch]: queue up changes to the proxy text
object and apply them in one go from a low-priority idle handler.
This is basically what GimpTextLayer used to do.
2004-03-14 Sven Neumann <sven@gimp.org>
* app/tools/gimptextoptions.[ch]
* app/tools/gimptexttool.[ch]: introduced a proxy GimpText object
that is tied to the GimpTextOptions for the lifetime of the text
tool. Brings us one step closer to text undo...
2004-03-13 Sven Neumann <sven@gimp.org>
* app/tools/gimptexttool.[ch]: keep a pointer on the active text
layer and let the tool follow the active layer. Fixes bug #124970.
* app/gui/layers-commands.c: changed accordingly.
2004-02-12 Sven Neumann <sven@gimp.org>
* app/tools/gimptexttool.[ch]: derive the text tool from GimpTool
directly. Doesn't look like we are going to use draw_tool
functionality for 2.0.
2004-01-19 Michael Natterer <mitch@gimp.org>
* app/tools/gimptexttool.c (gimp_text_tool_create_layer): if there
is a floating selection, anchor it before adding the text layer.
Fixes bug #127451.
Also fixed some issues with undo. Addresses, but does not fix
bug #124969 and bug #130985.
2004-01-13 Michael Natterer <mitch@gimp.org>
Allow invoking the text tool by double clicking a text layer in
the layers dialog, just like the path tool is invoked when double
clicking a path.
* app/tools/gimptexttool.[ch]: added empty
gimp_text_tool_set_layer() stub. Sven, your turn...
* app/gui/layers-commands.[ch]: added layers_text_tool() which
invokes the text tool on text layers and falls back to
layers_edit_layer_query() otherwise.
Added layers_text_tool_cmd_callback() for the layers menu.
* app/gui/layers-menu.c: added "Text Tool" menu item and hide
it for layers which are no text layers.
* app/gui/dialogs-constructors.c (dialogs_layer_list_view_new):
use layers_text_tool() as "activate" function.
2003-07-24 Sven Neumann <sven@gimp.org>
* app/tools/gimptexttool.c (gimp_text_tool_create_vectors): set
the vectors offset from the text layer's offset.
* app/text/gimptext-vectors.c: removed debugging output.
2003-03-11 Sven Neumann <sven@gimp.org>
* app/display/gimpdisplayshell-callbacks.c
* app/display/gimpdisplayshell.[ch]
* app/gui/image-menu.c
* app/gui/view-commands.[ch]: added a fullscreen mode for the
image display by means of gtk_window_fullscreen/unfullscreen.
Depends on the window manager implementing _NET_WM_STATE_FULLSCREEN.
* app/tools/gimpcroptool.c: made gimp_crop_tool_draw() static.
* app/tools/gimptexttool.[ch]: derive from GimpDrawTool, no real
changes yet.
2003-02-01 Sven Neumann <sven@gimp.org>
* app/config/gimpconfig.[ch]
* app/config/gimpconfig-utils.[ch]: added a reset method to
GimpConfigInterface. Added the new function gimp_config_reset()
* app/text/gimptext.c: added a GimpConfigInterface to GimpText.
* app/widgets/Makefile.am
* app/widgets/gimptexteditor.[ch]: new files that hold the simple
text editor dialog used by the text tool.
* app/widgets/gimppropwidgets.[ch]: added new widget constructor
gimp_prop_scale_entry_new().
* app/tools/gimptexttool.[ch]: replaced old-style ToolOptions with
a GimpText object. Connect text layers to the text tool by means
of their GimpText objects. Still work in progress ...
2003-01-31 Sven Neumann <sven@gimp.org>
* app/text/gimptextlayer.c: don't use gimp_drawable_configure() to
resize the text layer, it should only ever be called once. Take
the logical rectangle into account when calculating the layer size
and text position.
* app/tools/gimptexttool.[ch]: added basic text editing
functionality. Needs more work ...
* themes/Default/images/Makefile.am
* themes/Default/images/stock-gravity-east-24.png
* themes/Default/images/stock-gravity-north-24.png
* themes/Default/images/stock-gravity-north-east-24.png
* themes/Default/images/stock-gravity-north-west-24.png
* themes/Default/images/stock-gravity-south-24.png
* themes/Default/images/stock-gravity-south-east-24.png
* themes/Default/images/stock-gravity-south-west-24.png
* themes/Default/images/stock-gravity-west-24.png: added new icons
for yet-to-written GimpGravityChooser(?) widget. Artwork
shamelessly taken from Jimmac's XFree cursors.
* libgimpwidgets/gimpstock.[ch]: added stock items for the new icons.