index e0cf6a38b901e0e49bc986d2d391dd9d7c2d190c..e7af7096cb76299ccc68d9ad845afce1f2d3f845 100644 (file)
+/*
+ * This is where the implementation of the DBus based document API lives.
+ * All the methods in here (except in the helper section) are
+ * designed to be called remotly via DBus. application-interface.cpp
+ * has the methods used to connect to the bus and get a document instance.
+ *
+ * Documentation for these methods is in document-interface.xml
+ * which is the "gold standard" as to how the interface should work.
+ *
+ * Authors:
+ * Soren Berg <Glimmer07@gmail.com>
+ *
+ * Copyright (C) 2009 Soren Berg
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
#include "document-interface.h"
#include <string.h>
HELPER / SHORTCUT FUNCTIONS
****************************************************************************/
-const gchar* intToCString(int i)
-{
- std::stringstream ss;
- ss << i;
- return ss.str().c_str();
-}
-
+/*
+ * This function or the one below it translates the user input for an object
+ * into Inkscapes internal representation. It is called by almost every
+ * method so it should be as fast as possible.
+ *
+ * (eg turns "rect2234" to an SPObject or Inkscape::XML::Node)
+ *
+ * If the internal representation changes (No more 'id' attributes) this is the
+ * place to adjust things.
+ */
Inkscape::XML::Node *
get_repr_by_name (SPDesktop *desk, gchar *name, GError **error)
{
return node;
}
+/*
+ * See comment for get_repr_by_name, above.
+ */
SPObject *
get_object_by_name (SPDesktop *desk, gchar *name, GError **error)
{
return obj;
}
+/*
+ * Tests for NULL strings and throws an appropriate error.
+ * Every method that takes a string parameter (other than the
+ * name of an object, that's tested seperatly) should call this.
+ */
gboolean
dbus_check_string (gchar *string, GError ** error, const gchar * errorstr)
{
return TRUE;
}
+/*
+ * This is used to return object values to the user
+ */
const gchar *
get_name_from_object (SPObject * obj)
{
return obj->repr->attribute("id");
}
+/*
+ * Some verbs (cut, paste) only work on the active layer.
+ * This makes sure that the document that is about to recive a command is active.
+ */
void
desktop_ensure_active (SPDesktop* desk) {
if (desk != SP_ACTIVE_DESKTOP)
box = sel->boundsInDocument(box);
return box->y0 + ((box->y1 - box->y0)/2);
}
-//move_to etc
+
+/*
+ * This function is used along with selection_restore to
+ * take advantage of functionality provided by a selection
+ * for a single object.
+ *
+ * It saves the current selection and sets the selection to
+ * the object specified. Any selection verb can be used on the
+ * object and then selection_restore is called, restoring the
+ * original selection.
+ *
+ * This should be mostly transparent to the user who need never
+ * know we never bothered to implement it seperatly. Although
+ * they might see the selection box flicker if used in a loop.
+ */
const GSList *
selection_swap(SPDesktop *desk, gchar *name, GError **error)
{
return oldsel;
}
+/*
+ * See selection_swap, above
+ */
void
selection_restore(SPDesktop *desk, const GSList * oldsel)
{
sel->setList(oldsel);
}
+/*
+ * Shortcut for creating a Node.
+ */
Inkscape::XML::Node *
dbus_create_node (SPDesktop *desk, const gchar *type)
{
return xml_doc->createElement(type);
}
+/*
+ * Called by the shape creation functions. Gets the default style for the doc
+ * or sets it arbitrarily if none.
+ *
+ * There is probably a better way to do this (use the shape tools default styles)
+ * but I'm not sure how.
+ */
gchar *
finish_create_shape (DocumentInterface *object, GError **error, Inkscape::XML::Node *newNode, gchar *desc)
{
@@ -163,6 +225,14 @@ finish_create_shape (DocumentInterface *object, GError **error, Inkscape::XML::N
return strdup(newNode->attribute("id"));
}
+/*
+ * This is the code used internally to call all the verbs.
+ *
+ * It handles error reporting and update pausing (which needs some work.)
+ * This is a good place to improve efficiency as it is called a lot.
+ *
+ * document_interface_call_verb is similar but is called by the user.
+ */
gboolean
dbus_call_verb (DocumentInterface *object, int verbid, GError **error)
{
return (DocumentInterface*)g_object_new (TYPE_DOCUMENT_INTERFACE, NULL);
}
+/*
+ * Error stuff...
+ *
+ * To add a new error type, edit here and in the .h InkscapeError enum.
+ */
GQuark
inkscape_error_quark (void)
{
return quark;
}
-/* This should really be standard. */
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
GType
gboolean
document_interface_text (DocumentInterface *object, int x, int y, gchar *text, GError **error)
{
- //FIXME: Not selectable.
+ //FIXME: Not selectable (aka broken). Needs to be rewritten completely.
SPDesktop *desktop = object->desk;
SPCanvasText * canvas_text = (SPCanvasText *) sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, Geom::Point(0,0), "");
@@ -1094,6 +1168,8 @@ document_interface_selection_move_to (DocumentInterface *object, gdouble x, gdou
}
//FIXME: does not paste in new layer.
+// This needs to use lower level cut_impl and paste_impl (messy)
+// See the built-in sp_selection_to_next_layer and duplicate.
gboolean
document_interface_selection_move_to_layer (DocumentInterface *object,
gchar *layerstr, GError **error)