summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2008-06-08 02:04:22 -0400
committerSøren Sandmann <sandmann@redhat.com>2008-06-08 02:04:22 -0400
commite8f3b2eafc8d73b90cc50895972ea91d57ca329c (patch)
treef5c69a7baf093682048dea4382f83c686f6d0aac
parent039343b3d5d7fd05bfd0b1a530962ba546b1be37 (diff)
Toolbar
-rw-r--r--TODO11
-rwxr-xr-xbuild.sh3
-rw-r--r--deck.h1
-rw-r--r--main.c94
-rw-r--r--oppress.glade1
-rw-r--r--toolbar.c90
-rw-r--r--toolbar.h15
7 files changed, 201 insertions, 14 deletions
diff --git a/TODO b/TODO
index c87f19c..3612697 100644
--- a/TODO
+++ b/TODO
@@ -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.
+
+
-=-=-
diff --git a/build.sh b/build.sh
index 834c21a..e646bf7 100755
--- a/build.sh
+++ b/build.sh
@@ -6,4 +6,5 @@ gcc -Wall -g \
foo-marshal.c \
main.c \
backingstore.c \
- deck.c
+ deck.c \
+ toolbar.c
diff --git a/deck.h b/deck.h
index 22c1ee3..ee6ec9d 100644
--- a/deck.h
+++ b/deck.h
@@ -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.
*/
diff --git a/main.c b/main.c
index 0e93334..bd147c6 100644
--- a/main.c
+++ b/main.c
@@ -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);
+