Started implementing the canvas and the document.

This commit is contained in:
Přemysl Eric Janouch 2010-09-17 18:48:02 +02:00
parent 55c25ae1bd
commit db46ae5505
7 changed files with 339 additions and 11 deletions

View File

@ -1 +1,99 @@
/*
* canvas.c
*
* This file is a part of logdiag.
* Copyright Přemysl Janouch 2010. All rights reserved.
*
* See the file LICENSE for licensing information.
*
*/
#include <gtk/gtk.h>
#include "config.h"
#include "canvas.h"
#include "document.h"
/* http://www.gnomejournal.org/article/34/writing-a-widget-using-cairo-and-gtk28 */
/**
* SECTION:canvas
* @short_description: A canvas.
* @see_also: #LogdiagDocument
*
* #LogdiagCanvas is used for displaying #LogdiagDocument objects.
*/
/*
* LogdiagCanvasPrivate:
* @document: A document object assigned to this canvas as a model.
*/
struct _LogdiagCanvasPrivate
{
LogdiagDocument *document;
};
G_DEFINE_TYPE (LogdiagCanvas, logdiag_canvas, GTK_TYPE_DRAWING_AREA);
static void
logdiag_canvas_finalize (GObject *gobject);
static void
logdiag_canvas_class_init (LogdiagCanvasClass *klass)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass);
object_class->finalize = logdiag_canvas_finalize;
widget_class = GTK_WIDGET_CLASS (klass);
/**
* LogdiagCanvas::set-scroll-adjustments:
* @canvas: The canvas object.
*
* Contents of the library have changed.
*/
/*
widget_class->set_scroll_adjustments_signal = g_signal_new
("set-scroll-adjustments", G_TYPE_FROM_CLASS (widget_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
0, // G_STRUCT_OFFSET (LogdiagCanvasClass, ...)
NULL, NULL,
gtk_marshal_NONE__POINTER_POINTER,
G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
*/
g_type_class_add_private (klass, sizeof (LogdiagCanvasPrivate));
}
static void
logdiag_canvas_init (LogdiagCanvas *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE
(self, LOGDIAG_TYPE_CANVAS, LogdiagCanvasPrivate);
}
static void
logdiag_canvas_finalize (GObject *gobject)
{
LogdiagCanvas *self;
self = LOGDIAG_CANVAS (gobject);
/* Chain up to the parent class. */
G_OBJECT_CLASS (logdiag_canvas_parent_class)->finalize (gobject);
}
/**
* logdiag_canvas_new:
*
* Create an instance.
*/
LogdiagCanvas *
logdiag_canvas_new (void)
{
return g_object_new (LOGDIAG_TYPE_CANVAS, NULL);
}

View File

@ -0,0 +1,59 @@
/*
* canvas.h
*
* This file is a part of logdiag.
* Copyright Přemysl Janouch 2010. All rights reserved.
*
* See the file LICENSE for licensing information.
*
*/
#ifndef __CANVAS_H__
#define __CANVAS_H__
G_BEGIN_DECLS
#define LOGDIAG_TYPE_CANVAS (logdiag_canvas_get_type ())
#define LOGDIAG_CANVAS(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LOGDIAG_TYPE_CANVAS, LogdiagCanvas))
#define LOGDIAG_CANVAS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LOGDIAG_TYPE_CANVAS, LogdiagCanvasClass))
#define LOGDIAG_IS_CANVAS(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LOGDIAG_TYPE_CANVAS))
#define LOGDIAG_IS_CANVAS_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LOGDIAG_TYPE_CANVAS))
#define LOGDIAG_CANVAS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LOGDIAG_CANVAS, LogdiagCanvasClass))
typedef struct _LogdiagCanvas LogdiagCanvas;
typedef struct _LogdiagCanvasPrivate LogdiagCanvasPrivate;
typedef struct _LogdiagCanvasClass LogdiagCanvasClass;
/**
* LogdiagCanvas:
*/
struct _LogdiagCanvas
{
/*< private >*/
GtkDrawingArea parent_instance;
LogdiagCanvasPrivate *priv;
/*< public >*/
};
struct _LogdiagCanvasClass
{
GtkDrawingAreaClass parent_class;
};
GType logdiag_canvas_get_type (void) G_GNUC_CONST;
LogdiagCanvas *logdiag_canvas_new (void);
G_END_DECLS
#endif /* ! __CANVAS_H__ */

View File

@ -0,0 +1,91 @@
/*
* document.h
*
* This file is a part of logdiag.
* Copyright Přemysl Janouch 2010. All rights reserved.
*
* See the file LICENSE for licensing information.
*
*/
#ifndef __DOCUMENT_H__
#define __DOCUMENT_H__
G_BEGIN_DECLS
#define LOGDIAG_TYPE_DOCUMENT (logdiag_symbol_library_get_type ())
#define LOGDIAG_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LOGDIAG_TYPE_DOCUMENT, LogdiagDocument))
#define LOGDIAG_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LOGDIAG_TYPE_DOCUMENT, LogdiagDocumentClass))
#define LOGDIAG_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LOGDIAG_TYPE_DOCUMENT))
#define LOGDIAG_IS_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LOGDIAG_TYPE_DOCUMENT))
#define LOGDIAG_DOCUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LOGDIAG_DOCUMENT, LogdiagDocumentClass))
typedef struct _LogdiagDocument LogdiagDocument;
/*typedef struct _LogdiagDocumentPrivate LogdiagDocumentPrivate;*/
typedef struct _LogdiagDocumentClass LogdiagDocumentClass;
/**
* LogdiagDocument:
*/
struct _LogdiagDocument
{
/*< private >*/
GObject parent_instance;
/*< public >*/
};
struct _LogdiagDocumentClass
{
GObjectClass parent_class;
};
GType logdiag_document_get_type (void) G_GNUC_CONST;
LogdiagDocument *logdiag_document_new (void);
gboolean logdiag_document_new_from_file (const char *file_name, GError *error);
gboolean logdiag_document_save_to_file (const char *file_name, GError *error);
#if 0
/*
* LogdiagDocumentPrivate:
* @objects: All the objects in the document.
*/
struct _LogdiagDocumentPrivate
{
GSList *objects;
};
/** The contents of the document have changed. */
signal documentChanged (...);
/* TODO: A list of objects: */
LogdiagDocumentSymbol
LogdiagDocumentLabel
logdiag_document_add_symbol (LogdiagSymbol *symbol, x, y);
/* XXX: Separated lists of objects
* or a single list for all objects?
*/
/* TODO: Wires. */
logdiag_document_selection_...
logdiag_document_selection_get_json (LogdiagDocument *self);
logdiag_document_insert_json (LogdiagDocument *self);
/** Go back or forward in the history of changes. */
/* TODO: An interface that informs about the history. */
logdiag_document_history_go (LogdiagDocument *self);
#endif /* 0 */
G_END_DECLS
#endif /* ! __DOCUMENT_H__ */

View File

@ -35,7 +35,7 @@ typedef struct _LogdiagSymbolCategoryClass LogdiagSymbolCategoryClass;
* @parent: The parent object, may be LogdiagSymbolLibrary
* or another LogdiagSymbolCategory.
* @name: The name of the category.
* @image_path: Path to the image of the category.
* @image_path: Path to the image for this category.
* @children: Children of this category.
*/
struct _LogdiagSymbolCategory
@ -52,7 +52,7 @@ struct _LogdiagSymbolCategory
struct _LogdiagSymbolCategoryClass
{
GtkObjectClass parent_class;
GObjectClass parent_class;
};

View File

@ -177,6 +177,7 @@ logdiag_symbol_library_load (LogdiagSymbolLibrary *self, const char *path)
/**
* logdiag_symbol_library_clear:
* @self: A symbol library object.
*
* Clears all the contents.
*/
@ -246,6 +247,7 @@ logdiag_symbol_category_finalize (GObject *gobject)
/**
* logdiag_symbol_category_new:
* @parent: The parent library for this category.
*
* Create an instance.
*/
@ -276,16 +278,72 @@ logdiag_symbol_category_new (LogdiagSymbolLibrary *parent)
/*
* LogdiagSymbolPrivate:
* @parent_library: The parent LogdiagSymbolLibrary.
* @library: The parent LogdiagSymbolLibrary.
* The library contains the real function for rendering.
*/
struct _LogdiagSymbolPrivate
{
LogdiagSymbolLibrary *parent_library;
LogdiagSymbolLibrary *library;
};
G_DEFINE_TYPE (LogdiagSymbol, logdiag_symbol, G_TYPE_OBJECT);
static void
logdiag_symbol_finalize (GObject *gobject);
static void
logdiag_symbol_class_init (LogdiagSymbolClass *klass)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class->finalize = logdiag_symbol_finalize;
g_type_class_add_private (klass, sizeof (LogdiagSymbolPrivate));
}
static void
logdiag_symbol_init (LogdiagSymbol *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE
(self, LOGDIAG_TYPE_SYMBOL_LIBRARY, LogdiagSymbolPrivate);
}
static void
logdiag_symbol_finalize (GObject *gobject)
{
LogdiagSymbol *self;
self = LOGDIAG_SYMBOL (gobject);
g_object_unref (self->priv->library);
/* Chain up to the parent class. */
G_OBJECT_CLASS (logdiag_symbol_parent_class)->finalize (gobject);
}
/**
* logdiag_symbol_new:
* @library: A library object.
* @filename: The file from which the symbol will be loaded.
*
* Load a symbol from a file into the library.
*/
LogdiagSymbol *logdiag_symbol_new (LogdiagSymbolLibrary *library,
const gchar *filename)
{
LogdiagSymbol *symbol;
symbol = g_object_new (LOGDIAG_TYPE_SYMBOL, NULL);
/* TODO: Use the filename, Luke. */
symbol->priv->library = library;
g_object_ref (library);
}
/**
* logdiag_symbol_build_identifier:
* @self: A symbol object.
*
* Build an identifier for the symbol.
* The identifier is in the format "Category/Category/Symbol".
@ -298,6 +356,12 @@ logdiag_symbol_build_identifier (LogdiagSymbol *self)
/**
* logdiag_symbol_draw:
* @self: A symbol object.
* @surface: A cairo surface to be drawn on.
* @param: Parameters for the symbol in a table.
* @x: The X coordinate on the surface.
* @y: The Y coordinate on the surface.
* @zoom: Zoom ratio.
*
* Draw the symbol onto a Cairo surface.
*/

View File

@ -27,34 +27,34 @@ G_BEGIN_DECLS
((obj), LOGDIAG_SYMBOL, LogdiagSymbolClass))
typedef struct _LogdiagSymbol LogdiagSymbol;
/*typedef struct _LogdiagSymbolPrivate LogdiagSymbolPrivate;*/
typedef struct _LogdiagSymbolPrivate LogdiagSymbolPrivate;
typedef struct _LogdiagSymbolClass LogdiagSymbolClass;
/**
* LogdiagSymbol:
* @parent: The parent category.
* @name: The name of this symbol.
*/
struct _LogdiagSymbol
{
/*< private >*/
GObject parent_instance;
/* LogdiagSymbolPrivate *priv;*/
LogdiagSymbolPrivate *priv;
/*< public >*/
LogdiagSymbolCategory *parent;
char *name;
gchar *name;
};
struct _LogdiagSymbolClass
{
GtkObjectClass parent_class;
GObjectClass parent_class;
};
GType logdiag_symbol_get_type (void) G_GNUC_CONST;
LogdiagSymbol *logdiag_symbol_new (LogdiagSymbolLibrary *library,
const gchar *filename);
char *logdiag_symbol_build_identifier (LogdiagSymbol *self);
void logdiag_symbol_draw (LogdiagSymbol *self, cairo_t *surface,
GHashTable *param, gint x, gint y, gdouble zoom);

View File

@ -13,8 +13,11 @@
#include "config.h"
#include "window-main.h"
#include "canvas.h"
#include "document.h"
#include "symbol-library.h"
#include "symbol-category.h"
#include "symbol.h"
/**
@ -37,11 +40,19 @@ struct _LogdiagWindowMainPrivate
GtkWidget *toolbar;
LogdiagSymbolLibrary *library;
LogdiagCanvas *canvas;
GtkWidget *statusbar;
guint statusbar_menu_context_id;
};
struct DocumentData
{
LogdiagDocument *document;
const gchar *file_name;
/* Canvas viewport settings (for multitabbed) */
};
/* Define the type. */
G_DEFINE_TYPE (LogdiagWindowMain, logdiag_window_main, GTK_TYPE_WINDOW);
@ -219,6 +230,11 @@ logdiag_window_main_init (LogdiagWindowMain *self)
load_toolbar (self);
/* Canvas. */
priv->canvas = logdiag_canvas_new ();
gtk_box_pack_start (GTK_BOX (priv->hbox), GTK_WIDGET (priv->canvas),
FALSE, FALSE, 0);
/* TODO: GtkHPaned */
priv->statusbar = gtk_statusbar_new ();
@ -227,7 +243,7 @@ logdiag_window_main_init (LogdiagWindowMain *self)
gtk_box_pack_end (GTK_BOX (priv->vbox), priv->statusbar, FALSE, FALSE, 0);
/* Do this on disposal. */
/* TODO: Do this on disposal. */
/* g_object_unref(ui_manager); */
/* Proceed to showing the window. */