diff --git a/src/interface.cpp b/src/interface.cpp
index 415593b7885ba76dbe76fb259af0cd718708bb4e..40d8458a3d2b39059c973d08425a72f77dfb3957 100644 (file)
--- a/src/interface.cpp
+++ b/src/interface.cpp
#include <glib.h>
#include "inkscape-private.h"
+#include "extension/db.h"
#include "extension/effect.h"
+#include "extension/input.h"
#include "widgets/icon.h"
#include "preferences.h"
#include "path-prefix.h"
#include "io/sys.h"
#include "dialogs/dialog-events.h"
#include "message-context.h"
+#include "ui/uxmanager.h"
// Added for color drag-n-drop
#if ENABLE_LCMS
} // end of sp_ui_menu_append_item()
-/**
-\brief a wrapper around gdk_keyval_name producing (when possible) characters, not names
- */
-static gchar const *
-sp_key_name(guint keyval)
-{
- /* TODO: Compare with the definition of gtk_accel_label_refetch in gtk/gtkaccellabel.c (or
- simply use GtkAccelLabel as the TODO comment in sp_ui_shortcut_string suggests). */
- gchar const *n = gdk_keyval_name(gdk_keyval_to_upper(keyval));
-
- if (!strcmp(n, "asciicircum")) return "^";
- else if (!strcmp(n, "parenleft" )) return "(";
- else if (!strcmp(n, "parenright" )) return ")";
- else if (!strcmp(n, "plus" )) return "+";
- else if (!strcmp(n, "minus" )) return "-";
- else if (!strcmp(n, "asterisk" )) return "*";
- else if (!strcmp(n, "KP_Multiply")) return "*";
- else if (!strcmp(n, "Delete" )) return "Del";
- else if (!strcmp(n, "Page_Up" )) return "PgUp";
- else if (!strcmp(n, "Page_Down" )) return "PgDn";
- else if (!strcmp(n, "grave" )) return "`";
- else if (!strcmp(n, "numbersign" )) return "#";
- else if (!strcmp(n, "bar" )) return "|";
- else if (!strcmp(n, "slash" )) return "/";
- else if (!strcmp(n, "exclam" )) return "!";
- else if (!strcmp(n, "percent" )) return "%";
- else return n;
-}
-
-
-/**
- * \param shortcut A GDK keyval OR'd with SP_SHORTCUT_blah_MASK values.
- * \param c Points to a buffer at least 256 bytes long.
- */
-void
-sp_ui_shortcut_string(unsigned const shortcut, gchar *const c)
-{
- /* TODO: This function shouldn't exist. Our callers should use GtkAccelLabel instead of
- * a generic GtkLabel containing this string, and should call gtk_widget_add_accelerator.
- * Will probably need to change sp_shortcut_invoke callers.
- *
- * The existing gtk_label_new_with_mnemonic call can be replaced with
- * g_object_new(GTK_TYPE_ACCEL_LABEL, NULL) followed by
- * gtk_label_set_text_with_mnemonic(lbl, str).
- */
- static GtkAccelLabelClass const &accel_lbl_cls
- = *(GtkAccelLabelClass const *) g_type_class_peek_static(GTK_TYPE_ACCEL_LABEL);
-
- struct { unsigned test; char const *name; } const modifier_tbl[] = {
- { SP_SHORTCUT_SHIFT_MASK, accel_lbl_cls.mod_name_shift },
- { SP_SHORTCUT_CONTROL_MASK, accel_lbl_cls.mod_name_control },
- { SP_SHORTCUT_ALT_MASK, accel_lbl_cls.mod_name_alt }
- };
-
- gchar *p = c;
- gchar *end = p + 256;
-
- for (unsigned i = 0; i < G_N_ELEMENTS(modifier_tbl); ++i) {
- if ((shortcut & modifier_tbl[i].test)
- && (p < end))
- {
- p += g_snprintf(p, end - p, "%s%s",
- modifier_tbl[i].name,
- accel_lbl_cls.mod_separator);
- }
- }
- if (p < end) {
- p += g_snprintf(p, end - p, "%s", sp_key_name(shortcut & 0xffffff));
- }
- end[-1] = '\0'; // snprintf doesn't guarantee to nul-terminate the string.
-}
-
void
sp_ui_dialog_title_string(Inkscape::Verb *verb, gchar *c)
{
SPAction *action;
unsigned int shortcut;
gchar *s;
- gchar key[256];
gchar *atitle;
action = verb->get_action(NULL);
g_free(atitle);
shortcut = sp_shortcut_get_primary(verb);
- if (shortcut) {
+ if (shortcut!=GDK_VoidSymbol) {
+ gchar* key = sp_shortcut_get_label(shortcut);
s = g_stpcpy(s, " (");
- sp_ui_shortcut_string(shortcut, key);
s = g_stpcpy(s, key);
s = g_stpcpy(s, ")");
+ g_free(key);
}
}
@@ -579,9 +510,8 @@ sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::
if (!action) return NULL;
shortcut = sp_shortcut_get_primary(verb);
- if (shortcut) {
- gchar c[256];
- sp_ui_shortcut_string(shortcut, c);
+ if (shortcut!=GDK_VoidSymbol) {
+ gchar* c = sp_shortcut_get_label(shortcut);
GtkWidget *const hb = gtk_hbox_new(FALSE, 16);
GtkWidget *const name_lbl = gtk_label_new("");
gtk_label_set_markup_with_mnemonic(GTK_LABEL(name_lbl), action->name);
@@ -597,6 +527,7 @@ sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::
item = gtk_image_menu_item_new();
}
gtk_container_add((GtkContainer *) item, hb);
+ g_free(c);
} else {
if (radio) {
item = gtk_radio_menu_item_new (group);
@@ -632,20 +563,28 @@ sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::
} // end of sp_ui_menu_append_item_from_verb
-static void
-checkitem_toggled(GtkCheckMenuItem *menuitem, gpointer user_data)
+static Glib::ustring getLayoutPrefPath( Inkscape::UI::View::View *view )
{
- gchar const *pref = (gchar const *) user_data;
- Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view");
+ Glib::ustring prefPath;
- Glib::ustring pref_path;
if (reinterpret_cast<SPDesktop*>(view)->is_focusMode()) {
- pref_path = "/focus/";
+ prefPath = "/focus/";
} else if (reinterpret_cast<SPDesktop*>(view)->is_fullscreen()) {
- pref_path = "/fullscreen/";
+ prefPath = "/fullscreen/";
} else {
- pref_path = "/window/";
+ prefPath = "/window/";
}
+
+ return prefPath;
+}
+
+static void
+checkitem_toggled(GtkCheckMenuItem *menuitem, gpointer user_data)
+{
+ gchar const *pref = (gchar const *) user_data;
+ Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view");
+
+ Glib::ustring pref_path = getLayoutPrefPath( view );
pref_path += pref;
pref_path += "/state";
@@ -664,16 +603,12 @@ checkitem_update(GtkWidget *widget, GdkEventExpose */*event*/, gpointer user_dat
gchar const *pref = (gchar const *) user_data;
Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view");
- Glib::ustring pref_path;
- if ((static_cast<SPDesktop*>(view))->is_fullscreen()) {
- pref_path = "/fullscreen/";
- } else {
- pref_path = "/window/";
- }
+ Glib::ustring pref_path = getLayoutPrefPath( view );
pref_path += pref;
+ pref_path += "/state";
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool ison = prefs->getBool(pref_path + "/state", true);
+ bool ison = prefs->getBool(pref_path, true);
g_signal_handlers_block_by_func(G_OBJECT(menuitem), (gpointer)(GCallback)checkitem_toggled, user_data);
gtk_check_menu_item_set_active(menuitem, ison);
@@ -682,6 +617,20 @@ checkitem_update(GtkWidget *widget, GdkEventExpose */*event*/, gpointer user_dat
return FALSE;
}
+static void taskToggled(GtkCheckMenuItem *menuitem, gpointer userData)
+{
+ if ( gtk_check_menu_item_get_active(menuitem) ) {
+ gint taskNum = GPOINTER_TO_INT(userData);
+ taskNum = (taskNum < 0) ? 0 : (taskNum > 2) ? 2 : taskNum;
+
+ Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view");
+
+ // note: this will change once more options are in the task set support:
+ Inkscape::UI::UXManager::getInstance()->setTask( dynamic_cast<SPDesktop*>(view), taskNum );
+ }
+}
+
+
/**
* \brief Callback function to update the status of the radio buttons in the View -> Display mode menu (Normal, No Filters, Outline)
*/
@@ -703,6 +652,8 @@ update_view_menu(GtkWidget *widget, GdkEventExpose */*event*/, gpointer user_dat
new_state = mode == Inkscape::RENDERMODE_NO_FILTERS;
} else if (!strcmp(action->id, "ViewModeOutline")) {
new_state = mode == Inkscape::RENDERMODE_OUTLINE;
+ } else if (!strcmp(action->id, "ViewModePrintColorsPreview")) {
+ new_state = mode == Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW;
} else {
g_warning("update_view_menu does not handle this verb");
}
@@ -727,19 +678,12 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View *
gboolean (*callback_update)(GtkWidget *widget, GdkEventExpose *event, gpointer user_data),
Inkscape::Verb *verb)
{
- GtkWidget *item;
+ unsigned int shortcut = (verb) ? sp_shortcut_get_primary(verb) : 0;
+ SPAction *action = (verb) ? verb->get_action(view) : 0;
+ GtkWidget *item = gtk_check_menu_item_new();
- unsigned int shortcut = 0;
- SPAction *action = NULL;
-
- if (verb) {
- shortcut = sp_shortcut_get_primary(verb);
- action = verb->get_action(view);
- }
-
- if (verb && shortcut) {
- gchar c[256];
- sp_ui_shortcut_string(shortcut, c);
+ if (verb && shortcut!=GDK_VoidSymbol) {
+ gchar* c = sp_shortcut_get_label(shortcut);
GtkWidget *hb = gtk_hbox_new(FALSE, 16);
@@ -757,12 +701,11 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View *
gtk_widget_show_all(hb);
- item = gtk_check_menu_item_new();
gtk_container_add((GtkContainer *) item, hb);
+ g_free(c);
} else {
GtkWidget *l = gtk_label_new_with_mnemonic(action ? action->name : label);
gtk_misc_set_alignment((GtkMisc *) l, 0.0, 0.5);
- item = gtk_check_menu_item_new();
gtk_container_add((GtkContainer *) item, l);
}
#if 0
checkitem_toggled, checkitem_update, 0);
}
+
+void addTaskMenuItems(GtkMenu *menu, Inkscape::UI::View::View *view)
+{
+ gchar const* data[] = {
+ _("Default"), _("Default interface setup"),
+ _("Custom"), _("Set the custom task"),
+ _("Wide"), _("Setup for widescreen work"),
+ 0, 0
+ };
+
+ GSList *group = 0;
+ int count = 0;
+ gint active = Inkscape::UI::UXManager::getInstance()->getDefaultTask( dynamic_cast<SPDesktop*>(view) );
+ for (gchar const **strs = data; strs[0]; strs += 2, count++)
+ {
+ GtkWidget *item = gtk_radio_menu_item_new_with_label( group, strs[0] );
+ group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );
+ if ( count == active )
+ {
+ gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item), TRUE );
+ }
+
+ g_object_set_data( G_OBJECT(item), "view", view );
+ g_signal_connect( G_OBJECT(item), "toggled", reinterpret_cast<GCallback>(taskToggled), GINT_TO_POINTER(count) );
+ g_signal_connect( G_OBJECT(item), "select", G_CALLBACK(sp_ui_menu_select), const_cast<gchar*>(strs[1]) );
+ g_signal_connect( G_OBJECT(item), "deselect", G_CALLBACK(sp_ui_menu_deselect), 0 );
+
+ gtk_widget_show( item );
+ gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );
+ }
+}
+
+
/** @brief Observer that updates the recent list's max document count */
class MaxRecentObserver : public Inkscape::Preferences::Observer {
public:
@@ -1008,6 +984,10 @@ sp_ui_build_dyn_menus(Inkscape::XML::Node *menus, GtkWidget *menu, Inkscape::UI:
sp_ui_checkboxes_menus(GTK_MENU(menu), view);
continue;
}
+ if (!strcmp(menu_pntr->name(), "task-checkboxes")) {
+ addTaskMenuItems(GTK_MENU(menu), view);
+ continue;
+ }
}
}
if ( group && group != dt->currentLayer() ) {
/* TRANSLATORS: #%s is the id of the group e.g. <g id="#g7">, not a number. */
- gchar *label=g_strdup_printf(_("Enter group #%s"), SP_OBJECT_ID(group));
+ gchar *label=g_strdup_printf(_("Enter group #%s"), group->getId());
GtkWidget *w = gtk_menu_item_new_with_label(label);
g_free(label);
g_object_set_data(G_OBJECT(w), "group", group);
const GSList *gradients = sp_document_get_resource_list(doc, "gradient");
for (const GSList *item = gradients; item; item = item->next) {
SPGradient* grad = SP_GRADIENT(item->data);
- if ( color.descr == grad->id ) {
- if ( grad->has_stops ) {
+ if ( color.descr == grad->getId() ) {
+ if ( grad->hasStops() ) {
matches = grad;
break;
}
}
if (matches) {
colorspec = "url(#";
- colorspec += matches->id;
+ colorspec += matches->getId();
colorspec += ")";
} else {
gchar* tmp = g_strdup_printf("#%02x%02x%02x", r, g, b);
case PNG_DATA:
case JPEG_DATA:
case IMAGE_DATA: {
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc);
- Inkscape::XML::Node *newImage = xml_doc->createElement("svg:image");
- gchar *atom_name = gdk_atom_name(data->type);
-
- // this formula taken from Glib docs
- guint needed_size = data->length * 4 / 3 + data->length * 4 / (3 * 72) + 7;
- needed_size += 5 + 8 + strlen(atom_name); // 5 bytes for data:, 8 for ;base64,
-
- gchar *buffer = (gchar *) g_malloc(needed_size), *buf_work = buffer;
- buf_work += g_sprintf(buffer, "data:%s;base64,", atom_name);
-
- gint state = 0, save = 0;
- g_base64_encode_step(data->data, data->length, TRUE, buf_work, &state, &save);
- g_base64_encode_close(TRUE, buf_work, &state, &save);
-
- newImage->setAttribute("xlink:href", buffer);
- g_free(buffer);
-
- GError *error = NULL;
- GdkPixbufLoader *loader = gdk_pixbuf_loader_new_with_mime_type( gdk_atom_name(data->type), &error );
- if ( loader ) {
- error = NULL;
- if ( gdk_pixbuf_loader_write( loader, data->data, data->length, &error) ) {
- GdkPixbuf *pbuf = gdk_pixbuf_loader_get_pixbuf(loader);
- if ( pbuf ) {
- char tmp[1024];
- int width = gdk_pixbuf_get_width(pbuf);
- int height = gdk_pixbuf_get_height(pbuf);
- snprintf( tmp, sizeof(tmp), "%d", width );
- newImage->setAttribute("width", tmp);
-
- snprintf( tmp, sizeof(tmp), "%d", height );
- newImage->setAttribute("height", tmp);
- }
- }
- }
- g_free(atom_name);
-
- // Add it to the current layer
- desktop->currentLayer()->appendChildRepr(newImage);
+ const char *mime = (info == JPEG_DATA ? "image/jpeg" : "image/png");
- Inkscape::GC::release(newImage);
+ Inkscape::Extension::DB::InputList o;
+ Inkscape::Extension::db.get_input_list(o);
+ Inkscape::Extension::DB::InputList::const_iterator i = o.begin();
+ while (i != o.end() && strcmp( (*i)->get_mimetype(), mime ) != 0) {
+ ++i;
+ }
+ Inkscape::Extension::Extension *ext = *i;
+ bool save = (strcmp(ext->get_param_optiongroup("link"), "embed") == 0);
+ ext->set_param_optiongroup("link", "embed");
+ ext->set_gui(false);
+
+ gchar *filename = g_build_filename( g_get_tmp_dir(), "inkscape-dnd-import", NULL );
+ g_file_set_contents(filename, reinterpret_cast<gchar const *>(data->data), data->length, NULL);
+ file_import(doc, filename, ext);
+ g_free(filename);
+
+ ext->set_param_optiongroup("link", save ? "embed" : "link");
+ ext->set_gui(true);
sp_document_done( doc , SP_VERB_NONE,
_("Drop bitmap image"));
break;
@@ -1647,4 +1605,4 @@ sp_ui_menu_item_set_name(SPAction */*action*/, Glib::ustring name, void *data)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :