From 2d5e2dc7d7ebce95933f8b6d62e008253dda5807 Mon Sep 17 00:00:00 2001 From: David Capello Date: Sun, 28 Mar 2010 17:28:38 -0300 Subject: [PATCH] Modified state-bar to show the stack of layers. Removed the sprite & undo size indicators (completely useless). --- src/commands/cmd_new_layer.cpp | 5 +++ src/commands/cmd_remove_layer.cpp | 14 ++++++ src/widgets/statebar.cpp | 73 ++++++++++++++++++++++--------- 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/commands/cmd_new_layer.cpp b/src/commands/cmd_new_layer.cpp index 5e1bba66a..bbb992c76 100644 --- a/src/commands/cmd_new_layer.cpp +++ b/src/commands/cmd_new_layer.cpp @@ -27,6 +27,7 @@ #include "raster/sprite.h" #include "undoable.h" #include "sprite_wrappers.h" +#include "widgets/statebar.h" ////////////////////////////////////////////////////////////////////// // new_layer @@ -84,6 +85,10 @@ void NewLayerCommand::execute(Context* context) } layer->set_name(name); update_screen_for_sprite(sprite); + + app_get_statusbar()->dirty(); + statusbar_show_tip(app_get_statusbar(), 1000, + _("Layer `%s' created"), name); } } diff --git a/src/commands/cmd_remove_layer.cpp b/src/commands/cmd_remove_layer.cpp index c467ff69c..9792fea2a 100644 --- a/src/commands/cmd_remove_layer.cpp +++ b/src/commands/cmd_remove_layer.cpp @@ -18,12 +18,17 @@ #include "config.h" +#include "jinete/jwidget.h" + +#include "app.h" #include "commands/command.h" #include "modules/gui.h" +#include "raster/layer.h" #include "raster/sprite.h" #include "raster/undo.h" #include "undoable.h" #include "sprite_wrappers.h" +#include "widgets/statebar.h" ////////////////////////////////////////////////////////////////////// // remove_layer @@ -56,13 +61,22 @@ bool RemoveLayerCommand::enabled(Context* context) void RemoveLayerCommand::execute(Context* context) { + std::string layer_name; CurrentSpriteWriter sprite(context); { Undoable undoable(sprite, "Remove Layer"); + + layer_name = sprite->layer->get_name(); + undoable.remove_layer(sprite->layer); undoable.commit(); } update_screen_for_sprite(sprite); + + app_get_statusbar()->dirty(); + statusbar_show_tip(app_get_statusbar(), 1000, + _("Layer `%s' removed"), + layer_name.c_str()); } ////////////////////////////////////////////////////////////////////// diff --git a/src/widgets/statebar.cpp b/src/widgets/statebar.cpp index 918d1c4ec..f8386595d 100644 --- a/src/widgets/statebar.cpp +++ b/src/widgets/statebar.cpp @@ -291,6 +291,7 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) break; case JM_DRAW: { + SkinneableTheme* theme = static_cast(widget->theme); int text_color = ji_color_foreground(); int face_color = ji_color_face(); JRect rc = jwidget_get_rect(widget); @@ -307,15 +308,15 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) rc->x2 -= 2*jguiscale(); rc->y2 -= 2*jguiscale(); - /* status bar text */ + // Status bar text if (widget->getText()) { textout_ex(doublebuffer, widget->getFont(), widget->getText(), - rc->x1+2, + rc->x1+4*jguiscale(), (rc->y1+rc->y2)/2-text_height(widget->getFont())/2, text_color, -1); } - /* draw progress bar */ + // Draw progress bar if (!jlist_empty(statusbar->progress)) { int width = 64; int y1, y2; @@ -335,34 +336,66 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) x -= width+4; } } - /* draw current sprite size in memory */ else { - char buf[1024]; + // Available width for layers buttons + int width = jrect_w(rc)/4; + + // Draw layers try { const CurrentSpriteReader sprite(UIContext::instance()); if (sprite) { - ustrcpy(buf, "Sprite:"); - get_pretty_memsize(sprite_get_memsize(sprite), - buf+ustrsize(buf), - sizeof(buf)-ustrsize(buf)); + LayerFolder* folder = sprite->get_folder(); + LayerIterator it = folder->get_layer_begin(); + LayerIterator end = folder->get_layer_end(); + size_t count = folder->get_layers_count(); + char buf[256]; - ustrcat(buf, " Undo:"); - get_pretty_memsize(undo_get_memsize(sprite->undo), - buf+ustrsize(buf), - sizeof(buf)-ustrsize(buf)); + for (size_t c=0; it != end; ++it, ++c) { + int x1 = rc->x2-width + c*width/count; + int x2 = rc->x2-width + (c+1)*width/count; + bool hot = (*it == sprite->layer); + + { + BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack + ji_screen = doublebuffer; + theme->draw_bounds(x1, rc->y1, x2, rc->y2, + hot ? PART_TOOLBUTTON_HOT_NW: + PART_TOOLBUTTON_NORMAL_NW, + hot ? theme->get_button_hot_face_color(): + theme->get_button_normal_face_color()); + ji_screen = old_ji_screen; + } + + usprintf(buf, "%d", c); + textout_centre_ex(doublebuffer, widget->getFont(), buf, + (x1+x2)/2, + (rc->y1+rc->y2)/2-text_height(widget->getFont())/2, + hot ? theme->get_button_hot_text_color(): + theme->get_button_normal_text_color(), -1); + } } else { - ustrcpy(buf, "No Sprite"); + int x1 = rc->x2-width; + int x2 = rc->x2; + + { + BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack + ji_screen = doublebuffer; + theme->draw_bounds(x1, rc->y1, x2, rc->y2, + PART_TOOLBUTTON_NORMAL_NW, + theme->get_button_normal_face_color()); + ji_screen = old_ji_screen; + } + + textout_centre_ex(doublebuffer, widget->getFont(), "No Sprite", + (x1+x2)/2, + (rc->y1+rc->y2)/2-text_height(widget->getFont())/2, + theme->get_button_normal_text_color(), -1); } } catch (locked_sprite_exception&) { - ustrcpy(buf, "Sprite is Locked"); + // Do nothing... } - - textout_right_ex(doublebuffer, widget->getFont(), buf, - rc->x2-2, - (rc->y1+rc->y2)/2-text_height(widget->getFont())/2, - text_color, -1); } jrect_free(rc);