hildon updates and packaging files
Tux text draws new Sfx and Speak mini-buttons above Tux, when in Stamp mode. Sfx and Speak buttons (re)-play stamp sounds and stamp descriptions. ALT+S (mute/unmute) now draws Tux text (to make Sfx and Speak buttons appear/disappear) Improved Stamp tool description in docs. Added screenshot of Stamp size, mirror, flip controls in docs. Documented Left/Right stamp category controls, with screenshot in docs. Documented Sfx and Speak buttons, with screenshot in docs.
This commit is contained in:
parent
bccb269062
commit
6d1dbef521
5 changed files with 220 additions and 43 deletions
|
|
@ -9,7 +9,7 @@ http://www.newbreedsoftware.com/tuxpaint/
|
|||
$Id$
|
||||
|
||||
|
||||
2007.June.5 (0.9.17)
|
||||
2007.June.7 (0.9.17)
|
||||
|
||||
* Interface Improvements:
|
||||
-----------------------
|
||||
|
|
@ -30,6 +30,10 @@ $Id$
|
|||
Note: override previously-set option with "--orient=landscape" or
|
||||
"orient=landscape".
|
||||
|
||||
* Stamp sound effects and stamp descriptive sounds can be re-played
|
||||
using small buttons that appear over Tux, at the lower lefthand corner.
|
||||
(They disappear/reappear when sound is muted/unmuted via [Alt]+[S].)
|
||||
|
||||
* Tool Improvements:
|
||||
------------------
|
||||
* Input Method Framework, with implementations of Korean (Hangul 2-Bul)
|
||||
|
|
@ -134,11 +138,18 @@ $Id$
|
|||
* Tweaks to allow it to run on the One Laptop Per Child (OLPC) "XO".
|
||||
Albert Cahalan <albert@users.sf.net>
|
||||
|
||||
* Updates for improved Nokia 770 and N800 (Maemo) support
|
||||
* Updates for improved Nokia 770 and N800 (Maemo) Internet tablet support
|
||||
(added icon to task manager when Home button is pressed,
|
||||
hid on-screen mouse cursor, disabled Print and Text tools)
|
||||
Alessandro Pasotti <apasotti@gmail.com>
|
||||
|
||||
* Added more Nokia Maemo-specific files to the "hildon" folder
|
||||
(DEBIAN package files, updated .desktop and Tux Paint configuration
|
||||
files, D-BUS service file), to make packaging a Tux Paint .deb for
|
||||
Nokia 770 and N800 devices easier. (Note: Makefile needs updating
|
||||
and/or a compile-and-package script needs to be created.)
|
||||
Alessandro Pasotti <apasotti@gmail.com>
|
||||
|
||||
* Lockfile (that prevents multiple launches) is now stored
|
||||
in the user's local temporary directory on Windows
|
||||
(usually 'C:\Documents and Settings\{username}\Local Settings\Temp').
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
bill@newbreedsoftware.com
|
||||
http://www.tuxpaint.org/
|
||||
|
||||
June 14, 2002 - May 2, 2007
|
||||
June 14, 2002 - June 7, 2007
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
|
|
@ -198,20 +198,33 @@ Available Tools
|
|||
|
||||
Stamp (Rubber Stamp)
|
||||
|
||||
The Stamp tool is like a rubber stamp, or stickers. It lets
|
||||
you paste pre-drawn or photographic images (like a picture
|
||||
of a horse, or a tree, or the moon) in your picture.
|
||||
The Stamp tool is like a set of rubber stamps or stickers.
|
||||
It lets you paste pre-drawn or photographic images (like a
|
||||
picture of a horse, or a tree, or the moon) in your picture.
|
||||
|
||||
As you move the mouse around, an outline follows the mouse,
|
||||
showing where the stamp will be placed.
|
||||
As you move the mouse around the canvas, an outline follows
|
||||
the mouse, showing where the stamp will be placed, and how
|
||||
big it will be.
|
||||
|
||||
Different stamps can have different sound effects. Some
|
||||
stamps can be colored or tinted.
|
||||
There can be numerous categories of stamps (e.g., animals,
|
||||
plants, outer space, vehicles, people, etc.). Use the Left
|
||||
and Right arrows to cycle through the collections.
|
||||
|
||||
Some stamps can be colored or tinted. If the color palette
|
||||
below the canvas is activated, you can click the colors to
|
||||
change the tint or color of the stamp before placing it in
|
||||
the picture.
|
||||
|
||||
Stamps can be shrunk and expanded, and many stamps can be
|
||||
flipped vertically, or displayed as a mirror-image, using
|
||||
controls at the bottom right of the screen.
|
||||
|
||||
Different stamps can have different sound effects and/or
|
||||
descriptive (spoken) sounds. Buttons at the lower left (near
|
||||
Tux, the Linux penguin) allow you to re-play the sound
|
||||
effects and descriptive sounds for the currently-selected
|
||||
stamp.
|
||||
|
||||
(NOTE: If the "nostampcontrols" option is set, Tux Paint
|
||||
won't display the Mirror, Flip, Shrink and Grow controls for
|
||||
stamps. See the "Options" documentation.)
|
||||
|
|
|
|||
|
|
@ -25,9 +25,7 @@ New Breed Software</p>
|
|||
|
||||
<p>June 14, 2002 -
|
||||
|
||||
|
||||
May 2, 2007</p>
|
||||
|
||||
June 7, 2007</p>
|
||||
|
||||
</center>
|
||||
|
||||
|
|
@ -284,31 +282,47 @@ May 2, 2007</p>
|
|||
<dd>
|
||||
<img src="images/tool_stamp.png" width=48 height=48 alt="" align=right>
|
||||
|
||||
<p>The Stamp tool is like a rubber stamp, or stickers. It lets you
|
||||
paste pre-drawn or photographic images (like a picture of a horse,
|
||||
or a tree, or the moon) in your picture.</p>
|
||||
<p>The Stamp tool is like a set of rubber stamps or stickers.
|
||||
It lets you paste pre-drawn or photographic images (like a picture
|
||||
of a horse, or a tree, or the moon) in your picture.</p>
|
||||
|
||||
<p>As you move the mouse around, an outline follows the
|
||||
mouse, showing where the stamp will be placed.</p>
|
||||
<p>As you move the mouse around the canvas, an outline follows the
|
||||
mouse, showing where the stamp will be placed, and how big it will
|
||||
be.</p>
|
||||
|
||||
<p>Different stamps can have different sound effects.
|
||||
Some stamps can be colored or tinted.</p>
|
||||
<p align=center><img src="images/ex_stamps.png" width=182 height=156
|
||||
alt=""></p>
|
||||
|
||||
<img src="images/tool_stamp_categories.png" width=96 height=48 alt=""
|
||||
align=right>
|
||||
<p>There can be numerous categories of stamps (e.g., animals,
|
||||
plants, outer space, vehicles, people, etc.). Use the
|
||||
Left and Right arrows to cycle through the collections.</p>
|
||||
|
||||
<p>Some stamps can be colored or tinted. If the color palette
|
||||
below the canvas is activated, you can click the colors to change
|
||||
the tint or color of the stamp before placing it in the picture.</p>
|
||||
|
||||
<p>Stamps can be shrunk and expanded, and many stamps can be
|
||||
flipped vertically, or displayed as a mirror-image, using
|
||||
controls at the bottom right of the screen.</p>
|
||||
|
||||
|
||||
<p align=center>
|
||||
<img src="images/tool_stamp_controls.png" width=96 height=96 alt="">
|
||||
</p>
|
||||
|
||||
<img src="images/tool_sfx.png" width=48 height=24 alt="" align=right>
|
||||
<p>Different stamps can have different sound effects and/or
|
||||
descriptive (spoken) sounds. Buttons at the lower left
|
||||
(near Tux, the Linux penguin) allow you to re-play the sound effects
|
||||
and descriptive sounds for the currently-selected stamp.</p>
|
||||
|
||||
<p>(NOTE: If the "<code>nostampcontrols</code>" option is set,
|
||||
Tux Paint won't display the Mirror, Flip, Shrink and Grow
|
||||
controls for stamps.
|
||||
See the "<a href="OPTIONS.html"><i>Options</i></a>"
|
||||
documentation.)</p>
|
||||
|
||||
<br clear=all>
|
||||
|
||||
<p align=center><img src="images/ex_stamps.png" width=182 height=156
|
||||
alt=""></p>
|
||||
|
||||
<hr size=1>
|
||||
</dd>
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
#
|
||||
# Bill Kendrick <bill@newbreedsoftware.com>
|
||||
# Default distribution version last modified:
|
||||
# October 24, 2004
|
||||
# January 21, 2007
|
||||
|
||||
|
||||
# The variables described below are initially commented out.
|
||||
|
|
@ -39,17 +39,20 @@ fullscreen=yes
|
|||
# windowed=yes
|
||||
|
||||
|
||||
### Window size / screen resolution. (640x480 is the default.)
|
||||
### Window size / screen resolution. (800x600 is the default.)
|
||||
### (Any size 640-or-wider by 480-or-taller should work.)
|
||||
### NOTE: This affects canvas (drawing area) size.
|
||||
### -----------------------------------------------------------
|
||||
#
|
||||
# windowsize=1600x1200
|
||||
# windowsize=1400x1050
|
||||
# windowsize=1280x1024
|
||||
# windowsize=1024x768
|
||||
# windowsize=800x600
|
||||
# windowsize=640x480
|
||||
windowsize=800x480
|
||||
|
||||
### Window / screen orientation. (Landscape (no rotation) is the default.)
|
||||
### -----------------------------------------------------------------------
|
||||
#
|
||||
# orient=portrait
|
||||
# orient=landscape
|
||||
|
||||
|
||||
### Disable sound effects?
|
||||
### ----------------------
|
||||
|
|
@ -92,13 +95,13 @@ noprint=yes
|
|||
|
||||
### Use a different print command?
|
||||
### ------------------------------
|
||||
### Note: The command should expect a PNG file on its STDIN (standard-in)
|
||||
### Note: The command should expect PostScript on its STDIN (standard-in)
|
||||
###
|
||||
### For example, to convert the image to greyscale before converting
|
||||
### to PostScript, use "pngtopnm | ppmtopgm | pnmtops | lpr" as the command
|
||||
### to PostScript, use "pstopnm | ppmtopgm | pnmtops | lpr" as the command
|
||||
#
|
||||
# printcommand={COMMAND}
|
||||
# printcommand=pngtopnm | pnmtops | lpr
|
||||
# printcommand=lpr
|
||||
|
||||
|
||||
### Use the simpler shape tool? (No rotating)
|
||||
|
|
@ -139,8 +142,8 @@ noprint=yes
|
|||
### Don't use special mouse pointer (cursor) shapes?
|
||||
### ------------------------------------------------
|
||||
#
|
||||
nofancycursors=yes
|
||||
# fancycursors=yes
|
||||
# nofancycursors=yes
|
||||
fancycursors=yes
|
||||
|
||||
|
||||
### Use the keyboard to control the mouse pointer (cursor)?
|
||||
|
|
|
|||
146
src/tuxpaint.c
146
src/tuxpaint.c
|
|
@ -22,7 +22,7 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
(See COPYING.txt)
|
||||
|
||||
June 14, 2002 - May 16, 2007
|
||||
June 14, 2002 - June 7, 2007
|
||||
$Id$
|
||||
*/
|
||||
|
||||
|
|
@ -510,6 +510,7 @@ typedef struct
|
|||
//static SDL_Rect r_screen; // was 640x480 @ 0,0 -- but this isn't so useful
|
||||
static SDL_Rect r_canvas; // was 448x376 @ 96,0
|
||||
static SDL_Rect r_tools; // was 96x336 @ 0,40
|
||||
static SDL_Rect r_sfx;
|
||||
static SDL_Rect r_toolopt; // was 96x336 @ 544,40
|
||||
static SDL_Rect r_colors; // was 544x48 @ 96,376
|
||||
static SDL_Rect r_ttools; // was 96x40 @ 0,0 (title for tools, "Tools")
|
||||
|
|
@ -526,6 +527,7 @@ static int color_button_h; // was 48
|
|||
// Define button grid dimensions. (in button units)
|
||||
// These are the maximum slots -- some may be unused.
|
||||
static grid_dims gd_tools; // was 2x7
|
||||
static grid_dims gd_sfx;
|
||||
static grid_dims gd_toolopt; // was 2x7
|
||||
//static grid_dims gd_open; // was 4x4
|
||||
static grid_dims gd_colors; // was 17x1
|
||||
|
|
@ -599,6 +601,14 @@ static void setup_normal_screen_layout(void)
|
|||
r_tuxarea.y = r_colors.y + r_colors.h;
|
||||
r_tuxarea.h = WINDOW_HEIGHT - r_tuxarea.y;
|
||||
|
||||
r_sfx.x = r_tuxarea.x;
|
||||
r_sfx.y = r_tuxarea.y;
|
||||
r_sfx.w = button_w; // Two half-sized buttons across
|
||||
r_sfx.h = button_h >> 1; // One half-sized button down
|
||||
|
||||
gd_sfx.rows = 1;
|
||||
gd_sfx.cols = 2;
|
||||
|
||||
r_tools.x = 0;
|
||||
r_tools.y = r_ttools.h + r_ttools.y;
|
||||
r_tools.w = gd_tools.cols * button_w;
|
||||
|
|
@ -832,10 +842,12 @@ static int cur_undo, oldest_undo, newest_undo;
|
|||
|
||||
static SDL_Surface *img_title, *img_title_credits, *img_title_tuxpaint;
|
||||
static SDL_Surface *img_btn_up, *img_btn_down, *img_btn_off;
|
||||
static SDL_Surface *img_btnsm_up, *img_btnsm_off;
|
||||
static SDL_Surface *img_prev, *img_next;
|
||||
static SDL_Surface *img_dead40x40;
|
||||
static SDL_Surface *img_black, *img_grey;
|
||||
static SDL_Surface *img_yes, *img_no;
|
||||
static SDL_Surface *img_sfx, *img_speak;
|
||||
static SDL_Surface *img_open, *img_erase, *img_back, *img_trash;
|
||||
static SDL_Surface *img_slideshow, *img_play, *img_select_digits;
|
||||
static SDL_Surface *img_printer, *img_printer_wait, *img_save_over;
|
||||
|
|
@ -1688,6 +1700,11 @@ static void mainloop(void)
|
|||
{
|
||||
mute = !mute;
|
||||
Mix_HaltChannel(-1);
|
||||
|
||||
if (mute)
|
||||
draw_tux_text(TUX_BORED, gettext("Sound muted."), 0);
|
||||
else
|
||||
draw_tux_text(TUX_BORED, gettext("Sound unmuted."), 0);
|
||||
}
|
||||
}
|
||||
else if (key == SDLK_ESCAPE &&
|
||||
|
|
@ -1987,6 +2004,7 @@ static void mainloop(void)
|
|||
"", img_mouse, img_mouse_click, NULL, 1);
|
||||
if (cur_tool == TOOL_TEXT)
|
||||
do_render_cur_text(0);
|
||||
draw_tux_text(TUX_BORED, "", 0);
|
||||
}
|
||||
}
|
||||
else if ((event.type == SDL_MOUSEBUTTONDOWN ||
|
||||
|
|
@ -2251,9 +2269,11 @@ static void mainloop(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
cur_tool = old_tool;
|
||||
|
||||
draw_tux_text(tool_tux[TUX_DEFAULT], TIP_NEW_ABORT, 1);
|
||||
|
||||
if (old_tool == TOOL_TEXT)
|
||||
if (cur_tool == TOOL_TEXT)
|
||||
do_render_cur_text(0);
|
||||
}
|
||||
|
||||
|
|
@ -2303,6 +2323,7 @@ static void mainloop(void)
|
|||
|
||||
cur_tool = old_tool;
|
||||
draw_toolbar();
|
||||
draw_tux_text(TUX_BORED, "", 0);
|
||||
update_screen_rect(&r_tools);
|
||||
}
|
||||
else if (cur_tool == TOOL_QUIT)
|
||||
|
|
@ -2989,6 +3010,30 @@ static void mainloop(void)
|
|||
|
||||
button_down = 1;
|
||||
}
|
||||
else if (HIT(r_sfx) && valid_click(event.button.button))
|
||||
{
|
||||
/* A sound player button on the lower left has been pressed! */
|
||||
|
||||
if (cur_tool == TOOL_STAMP && use_sound && !mute)
|
||||
{
|
||||
which = GRIDHIT_GD(r_sfx, gd_sfx);
|
||||
|
||||
if (which == 0 &&
|
||||
!stamp_data[stamp_group][cur_stamp[stamp_group]]->no_sound)
|
||||
{
|
||||
/* Re-play sound effect: */
|
||||
|
||||
Mix_ChannelFinished(NULL);
|
||||
Mix_PlayChannel(2, stamp_data[stamp_group][cur_thing]->ssnd, 0);
|
||||
}
|
||||
else if (which == 1 &&
|
||||
!stamp_data[stamp_group][cur_stamp[stamp_group]]->no_descsound)
|
||||
{
|
||||
Mix_ChannelFinished(NULL);
|
||||
Mix_PlayChannel(2, stamp_data[stamp_group][cur_thing]->sdesc, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.type == SDL_MOUSEBUTTONDOWN &&
|
||||
wheely && event.button.button >= 4 && event.button.button <= 5)
|
||||
|
|
@ -3276,6 +3321,23 @@ static void mainloop(void)
|
|||
do_setcursor(cursor_arrow);
|
||||
}
|
||||
}
|
||||
else if (HIT(r_sfx))
|
||||
{
|
||||
/* Sound player buttons: */
|
||||
|
||||
if (cur_tool == TOOL_STAMP && use_sound && !mute &&
|
||||
((GRIDHIT_GD(r_sfx, gd_sfx) == 0 &&
|
||||
!stamp_data[stamp_group][cur_stamp[stamp_group]]->no_sound) ||
|
||||
(GRIDHIT_GD(r_sfx, gd_sfx) == 1 &&
|
||||
!stamp_data[stamp_group][cur_stamp[stamp_group]]->no_descsound)))
|
||||
{
|
||||
do_setcursor(cursor_hand);
|
||||
}
|
||||
else
|
||||
{
|
||||
do_setcursor(cursor_arrow);
|
||||
}
|
||||
}
|
||||
else if (HIT(r_colors))
|
||||
{
|
||||
/* Color picker: */
|
||||
|
|
@ -7294,6 +7356,12 @@ static void setup(int argc, char *argv[])
|
|||
img_btn_down = loadimage(DATA_PREFIX "images/ui/btn_down.png");
|
||||
img_btn_off = loadimage(DATA_PREFIX "images/ui/btn_off.png");
|
||||
|
||||
img_btnsm_up = loadimage(DATA_PREFIX "images/ui/btnsm_up.png");
|
||||
img_btnsm_off = loadimage(DATA_PREFIX "images/ui/btnsm_off.png");
|
||||
|
||||
img_sfx = loadimage(DATA_PREFIX "images/tools/sfx.png");
|
||||
img_speak = loadimage(DATA_PREFIX "images/tools/speak.png");
|
||||
|
||||
img_black = SDL_CreateRGBSurface(SDL_SRCALPHA | SDL_SWSURFACE,
|
||||
img_btn_off->w, img_btn_off->h,
|
||||
img_btn_off->format->BitsPerPixel,
|
||||
|
|
@ -9845,6 +9913,9 @@ static void draw_tux_text_ex(int which_tux, const char *const str,
|
|||
{
|
||||
SDL_Rect dest;
|
||||
SDL_Color black = { 0, 0, 0, 0 };
|
||||
int w;
|
||||
SDL_Surface * btn;
|
||||
|
||||
|
||||
/* Remove any text-changing timer if one is running: */
|
||||
control_drawtext_timer(0, "", 0);
|
||||
|
|
@ -9860,13 +9931,64 @@ static void draw_tux_text_ex(int which_tux, const char *const str,
|
|||
if (dest.y < r_tuxarea.y)
|
||||
dest.y = r_tuxarea.y;
|
||||
|
||||
// Don't let sfx and speak buttons cover the top of Tux, either:
|
||||
if (cur_tool == TOOL_STAMP && use_sound && !mute)
|
||||
{
|
||||
if (dest.y < r_sfx.y + r_sfx.h)
|
||||
dest.y = r_sfx.y + r_sfx.h;
|
||||
}
|
||||
|
||||
SDL_BlitSurface(img_tux[which_tux], NULL, screen, &dest);
|
||||
|
||||
// Wide enough for Tux, or two stamp sound buttons (whichever's wider) */
|
||||
|
||||
w = max(img_tux[which_tux]->w, img_btnsm_up->w) + 5;
|
||||
|
||||
wordwrap_text_ex(str, black,
|
||||
img_tux[which_tux]->w + 5,
|
||||
r_tuxarea.y, r_tuxarea.w, want_right_to_left,
|
||||
w, r_tuxarea.y, r_tuxarea.w, want_right_to_left,
|
||||
locale_text);
|
||||
|
||||
|
||||
/* Draw 'sound effect' and 'speak' buttons, if we're in the Stamp tool */
|
||||
|
||||
if (cur_tool == TOOL_STAMP && use_sound && !mute)
|
||||
{
|
||||
/* Sound effect: */
|
||||
|
||||
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->no_sound)
|
||||
btn = img_btnsm_off;
|
||||
else
|
||||
btn = img_btnsm_up;
|
||||
|
||||
dest.x = 0;
|
||||
dest.y = r_tuxarea.y;
|
||||
|
||||
SDL_BlitSurface(btn, NULL, screen, &dest);
|
||||
|
||||
dest.x = (img_btnsm_up->w - img_sfx->w) / 2;
|
||||
dest.y = r_tuxarea.y + ((img_btnsm_up->h - img_sfx->h) / 2);
|
||||
|
||||
SDL_BlitSurface(img_sfx, NULL, screen, &dest);
|
||||
|
||||
|
||||
/* Speak: */
|
||||
|
||||
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->no_descsound)
|
||||
btn = img_btnsm_off;
|
||||
else
|
||||
btn = img_btnsm_up;
|
||||
|
||||
dest.x = img_btnsm_up->w;
|
||||
dest.y = r_tuxarea.y;
|
||||
|
||||
SDL_BlitSurface(btn, NULL, screen, &dest);
|
||||
|
||||
dest.x = img_btnsm_up->w + ((img_btnsm_up->w - img_speak->w) / 2);
|
||||
dest.y = r_tuxarea.y + ((img_btnsm_up->h - img_speak->h) / 2);
|
||||
|
||||
SDL_BlitSurface(img_speak, NULL, screen, &dest);
|
||||
}
|
||||
|
||||
update_screen_rect(&r_tuxarea);
|
||||
}
|
||||
|
||||
|
|
@ -11469,6 +11591,12 @@ static void cleanup(void)
|
|||
free_surface(&img_btn_down);
|
||||
free_surface(&img_btn_off);
|
||||
|
||||
free_surface(&img_btnsm_up);
|
||||
free_surface(&img_btnsm_off);
|
||||
|
||||
free_surface(&img_sfx);
|
||||
free_surface(&img_speak);
|
||||
|
||||
free_surface(&img_cursor_up);
|
||||
free_surface(&img_cursor_down);
|
||||
|
||||
|
|
@ -12445,7 +12573,7 @@ static void get_new_file_id(void)
|
|||
|
||||
static int do_quit(int tool)
|
||||
{
|
||||
int done;
|
||||
int done, tmp_tool;
|
||||
|
||||
done = do_prompt_snd(PROMPT_QUIT_TXT,
|
||||
PROMPT_QUIT_YES, PROMPT_QUIT_NO, SND_AREYOUSURE);
|
||||
|
|
@ -12473,6 +12601,14 @@ static int do_quit(int tool)
|
|||
{
|
||||
if (tool == TOOL_TEXT)
|
||||
do_render_cur_text(0);
|
||||
|
||||
/* Bring back stamp sound effects and speak buttons, if we were in
|
||||
Stamps tool: */
|
||||
|
||||
tmp_tool = cur_tool;
|
||||
cur_tool = tool;
|
||||
draw_tux_text(TUX_BORED, "", 0);
|
||||
cur_tool = tmp_tool;
|
||||
}
|
||||
|
||||
return (done);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue