diff options
author | Søren Sandmann <sandmann@redhat.com> | 2008-06-08 02:04:22 -0400 |
---|---|---|
committer | Søren Sandmann <sandmann@redhat.com> | 2008-06-08 02:04:22 -0400 |
commit | e8f3b2eafc8d73b90cc50895972ea91d57ca329c (patch) | |
tree | f5c69a7baf093682048dea4382f83c686f6d0aac | |
parent | 039343b3d5d7fd05bfd0b1a530962ba546b1be37 (diff) |
Toolbar
-rw-r--r-- | TODO | 11 | ||||
-rwxr-xr-x | build.sh | 3 | ||||
-rw-r--r-- | deck.h | 1 | ||||
-rw-r--r-- | main.c | 94 | ||||
-rw-r--r-- | oppress.glade | 1 | ||||
-rw-r--r-- | toolbar.c | 90 | ||||
-rw-r--r-- | toolbar.h | 15 |
7 files changed, 201 insertions, 14 deletions
@@ -21,6 +21,17 @@ Bugs This location should survive all resizing. +- Need to figure out how to deal with sizes. Clearly the desk should + not know about viewports - it should just be passed a width when it + needs it. + +- Slides should probably not know anything except be passed an + appropriately transformed cairo_t. However, when items are tiny + enough, they shouldn't be painted; also staffage may not make sense + if it would just be a complete clutter, or if there simply isn't + room for it. + + -=-=- @@ -6,4 +6,5 @@ gcc -Wall -g \ foo-marshal.c \ main.c \ backingstore.c \ - deck.c + deck.c \ + toolbar.c @@ -10,6 +10,7 @@ Deck *deck_new (DeckChangeNotify notify, void deck_paint (Deck *deck, FooScrollArea *area, cairo_t *cr); + /* Returns the slide the user is likely looking * at, given the viewport. */ @@ -6,16 +6,21 @@ #include <math.h> #include "scrollarea.h" #include "deck.h" +#include "toolbar.h" typedef struct { GladeXML * xml; - GtkWidget * main_area; - GtkWidget * thumbnails; + FooScrollArea * main_area; + FooScrollArea * thumbnails; Deck * deck; int nth_slide; + Toolbar * toolbar; } App; +#define TOOLBAR_Y_OFFSET 12 +#define TOOLBAR_X_OFFSET 12 + static void * get_widget (App *app, const char *name) { @@ -52,6 +57,39 @@ on_thumbs_viewport_size_changed (FooScrollArea *scroll_area, } static void +offset_toolbar (App *app, GdkRectangle *viewport) +{ + GtkWidget *window = get_widget (app, "main_window"); + + if (!(gdk_window_get_state (window->window) & GDK_WINDOW_STATE_MAXIMIZED)) + { + viewport->x += TOOLBAR_X_OFFSET; + viewport->y += TOOLBAR_Y_OFFSET; + } +} + +static void +paint_toolbar (App *app, FooScrollArea *area, cairo_t *cr) +{ + GdkRectangle viewport; + + foo_scroll_area_get_viewport (app->main_area, &viewport); + + offset_toolbar (app, &viewport); + + toolbar_paint (app->toolbar, area, cr, viewport.x, viewport.y); +} + +static void +invalidate_toolbar (App *app, GdkRectangle *viewport) +{ + offset_toolbar (app, viewport); + + toolbar_invalidate (app->toolbar, + app->main_area, viewport->x, viewport->y); +} + +static void on_main_paint (FooScrollArea *scroll_area, cairo_t *cr, GdkRectangle *extents, @@ -59,8 +97,16 @@ on_main_paint (FooScrollArea *scroll_area, gpointer data) { App *app = data; - + GdkRectangle viewport; + + foo_scroll_area_get_viewport (scroll_area, &viewport); + + cairo_save (cr); + deck_paint (app->deck, scroll_area, cr); + paint_toolbar (app, scroll_area, cr); + + cairo_restore (cr); } static void @@ -92,14 +138,14 @@ on_main_viewport_size_changed (FooScrollArea *scroll_area, foo_scroll_area_set_viewport_pos (scroll_area, 0, 0); } - + foo_scroll_area_invalidate (scroll_area); } static void make_thumbnail_viewable (App *app) { - FooScrollArea *area = FOO_SCROLL_AREA (app->thumbnails); + FooScrollArea *area = app->thumbnails; GdkRectangle viewport; int top, height; const int margin = 10; @@ -123,14 +169,18 @@ on_viewport_changed (FooScrollArea *scroll_area, GdkRectangle *old_viewport, gpointer data) { + App *app = data; + if (!foo_scroll_area_is_resizing (scroll_area)) { - App *app = data; - app->nth_slide = deck_get_view_slide (app->deck, viewport); make_thumbnail_viewable (app); } + + /* Invalidate toolbar */ + invalidate_toolbar (app, old_viewport); + invalidate_toolbar (app, viewport); } static void @@ -159,6 +209,19 @@ set_window_size (GtkWindow *window) gtk_window_resize (window, width, height); } +static void +on_state_change (GtkWidget *widget, + GdkEvent *event, + App *app) +{ + /* Apparently, on unmaximize we get size allocated before + * the window has actually changed state, so we need to + * invalidate here. + */ + + foo_scroll_area_invalidate (app->main_area); +} + int main (int argc, char **argv) { @@ -169,20 +232,21 @@ main (int argc, char **argv) app = g_new0 (App, 1); app->xml = glade_xml_new (GLADE_FILE, NULL, NULL); - app->main_area = (GtkWidget *)foo_scroll_area_new(); - app->thumbnails = (GtkWidget *)foo_scroll_area_new(); + app->main_area = foo_scroll_area_new(); + app->thumbnails = foo_scroll_area_new(); app->deck = deck_new (on_deck_changed, app); + app->toolbar = toolbar_new (); gtk_container_add ( GTK_CONTAINER (get_widget (app, "main_area_scrolled_window")), - app->main_area); + GTK_WIDGET (app->main_area)); gtk_container_add ( GTK_CONTAINER (get_widget (app, "thumbnails_scrolled_window")), - app->thumbnails); + GTK_WIDGET (app->thumbnails)); - foo_scroll_area_set_min_size (FOO_SCROLL_AREA (app->thumbnails), 200, -1); + foo_scroll_area_set_min_size (app->thumbnails, 200, -1); g_signal_connect (app->main_area, "paint", G_CALLBACK (on_main_paint), app); @@ -196,9 +260,15 @@ main (int argc, char **argv) g_signal_connect (app->thumbnails, "viewport_size_changed", G_CALLBACK (on_thumbs_viewport_size_changed), app); + g_signal_connect (get_widget (app, "main_window"), "delete_event", + G_CALLBACK (gtk_main_quit), NULL); + g_signal_connect (get_widget (app, "main_window"), "window_state_event", + G_CALLBACK (on_state_change), app); + set_window_size (get_widget (app, "main_window")); gtk_widget_show_all (get_widget (app, "main_window")); + gtk_widget_hide (get_widget (app, "toolbar1")); gtk_main (); diff --git a/oppress.glade b/oppress.glade index 274d4cf..ed5139e 100644 --- a/oppress.glade +++ b/oppress.glade @@ -206,7 +206,6 @@ <child> <widget class="GtkToolbar" id="toolbar1"> - <property name="visible">True</property> <property name="orientation">GTK_ORIENTATION_VERTICAL</property> <property name="toolbar_style">GTK_TOOLBAR_BOTH</property> <property name="tooltips">False</property> diff --git a/toolbar.c b/toolbar.c new file mode 100644 index 0000000..62a37e5 --- /dev/null +++ b/toolbar.c @@ -0,0 +1,90 @@ +#include "toolbar.h" + +#define N_TOOLS 10 +#define TOOL_SIZE 75 +#define CORNER_SIZE 10 +#define BORDER_WIDTH 2 +#define MARGIN 6 +#define COLOR 1.4 * (0x58 / 255.0), 1.4 * (0x75 / 255.0), 1.4 * (0xA7 / 255.0) +#define STROKE_COLOR (0x58 / 255.0), (0x75 / 255.0), (0xA7 / 255.0) + +struct Toolbar +{ + int dummy; + /* no content */ +}; + +Toolbar * +toolbar_new (void) +{ + return g_new0 (Toolbar, 1); +} + +void +toolbar_paint (Toolbar *bar, + FooScrollArea *scroll_area, + cairo_t *cr, + int x, + int y) +{ + int i; + int b = BORDER_WIDTH / 2; + int segment = TOOL_SIZE - 2 * b - 2 * CORNER_SIZE; + GdkRectangle viewport; + + foo_scroll_area_get_viewport (scroll_area, &viewport); + + cairo_move_to (cr, b + x, MARGIN + y); + + for (i = 0; i < N_TOOLS; ++i) + { + double x, y; + + cairo_get_current_point (cr, &x, &y); + + cairo_rel_move_to (cr, CORNER_SIZE, 0); + cairo_rel_line_to (cr, segment, 0); + cairo_rel_curve_to (cr, + CORNER_SIZE, 0, + CORNER_SIZE, 0, + CORNER_SIZE, CORNER_SIZE); + cairo_rel_line_to (cr, 0, segment); + cairo_rel_curve_to (cr, + 0, CORNER_SIZE, + 0, CORNER_SIZE, + -CORNER_SIZE, CORNER_SIZE); + cairo_rel_line_to (cr, -segment, 0); + cairo_rel_curve_to (cr, + -CORNER_SIZE, 0, + -CORNER_SIZE, 0, + -CORNER_SIZE, -CORNER_SIZE); + cairo_rel_line_to (cr, 0, -segment); + cairo_rel_curve_to (cr, + 0, -CORNER_SIZE, + 0, -CORNER_SIZE, + CORNER_SIZE, -CORNER_SIZE); + + cairo_set_source_rgba (cr, COLOR, 0.8); + + cairo_fill_preserve (cr); + + cairo_set_source_rgba (cr, STROKE_COLOR, 0.8); + cairo_set_line_width (cr, BORDER_WIDTH); + + cairo_stroke (cr); + + cairo_move_to (cr, x, y + TOOL_SIZE + MARGIN); + } +} + +void +toolbar_invalidate (Toolbar *bar, + FooScrollArea *scroll_area, + int x, + int y) +{ + foo_scroll_area_invalidate_rect (scroll_area, + x, y, + TOOL_SIZE + 10, + N_TOOLS * (TOOL_SIZE + MARGIN) + 10); +} diff --git a/toolbar.h b/toolbar.h new file mode 100644 index 0000000..ede9e47 --- /dev/null +++ b/toolbar.h @@ -0,0 +1,15 @@ +#include "scrollarea.h" + +typedef struct Toolbar Toolbar; + +Toolbar *toolbar_new (void); +void toolbar_paint (Toolbar *bar, + FooScrollArea *scroll_area, + cairo_t *cr, + int x, + int y); +void toolbar_invalidate (Toolbar *bar, + FooScrollArea *scroll_area, + int x, + int y); + |