X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Finterface.cpp;h=0259ecb6602dd52d7f62c0f53e5a7cded9f1d31e;hb=9e8fe96d9bacc116eee7e4496cacbeab3ad22ab1;hp=eada69c34ffdd5bb59f1162c036b68dd70f470cf;hpb=08be22f20985e3183bec96c9fb5e74d502f99e0b;p=inkscape.git diff --git a/src/interface.cpp b/src/interface.cpp index eada69c34..0259ecb66 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -39,6 +39,8 @@ #include "svg-view-widget.h" #include "widgets/desktop-widget.h" #include "sp-item-group.h" +#include "sp-text.h" +#include "sp-flowtext.h" #include "sp-namedview.h" #include "ui/view/view.h" @@ -63,6 +65,13 @@ #include "svg/svg-color.h" #include "desktop-style.h" #include "style.h" +#include "event-context.h" +#include "gradient-drag.h" + +// Include Mac OS X menu synchronization on native OSX build +#ifdef GDK_WINDOWING_QUARTZ +#include "ige-mac-menu.h" +#endif using Inkscape::IO::StringOutputStream; using Inkscape::IO::Base64OutputStream; @@ -80,15 +89,15 @@ typedef enum { } ui_drop_target_info; static GtkTargetEntry ui_drop_target_entries [] = { - {"text/uri-list", 0, URI_LIST}, - {"image/svg+xml", 0, SVG_XML_DATA}, - {"image/svg", 0, SVG_DATA}, - {"image/png", 0, PNG_DATA}, - {"image/jpeg", 0, JPEG_DATA}, + {(gchar *)"text/uri-list", 0, URI_LIST }, + {(gchar *)"image/svg+xml", 0, SVG_XML_DATA }, + {(gchar *)"image/svg", 0, SVG_DATA }, + {(gchar *)"image/png", 0, PNG_DATA }, + {(gchar *)"image/jpeg", 0, JPEG_DATA }, #if ENABLE_MAGIC_COLORS - {"application/x-inkscape-color", 0, APP_X_INKY_COLOR}, + {(gchar *)"application/x-inkscape-color", 0, APP_X_INKY_COLOR}, #endif // ENABLE_MAGIC_COLORS - {"application/x-color", 0, APP_X_COLOR} + {(gchar *)"application/x-color", 0, APP_X_COLOR } }; static GtkTargetEntry *completeDropTargets = 0; @@ -106,6 +115,17 @@ static void sp_ui_drag_data_received(GtkWidget *widget, guint info, guint event_time, gpointer user_data); +static void sp_ui_drag_motion( GtkWidget *widget, + GdkDragContext *drag_context, + gint x, gint y, + GtkSelectionData *data, + guint info, + guint event_time, + gpointer user_data ); +static void sp_ui_drag_leave( GtkWidget *widget, + GdkDragContext *drag_context, + guint event_time, + gpointer user_data ); static void sp_ui_menu_item_set_sensitive(SPAction *action, unsigned int sensitive, void *data); @@ -132,6 +152,9 @@ sp_create_window(SPViewWidget *vw, gboolean editable) Gtk::Window *win = Inkscape::UI::window_new("", TRUE); + gtk_container_add(GTK_CONTAINER(win->gobj()), GTK_WIDGET(vw)); + gtk_widget_show(GTK_WIDGET(vw)); + if (editable) { g_object_set_data(G_OBJECT(vw), "window", win); @@ -140,16 +163,13 @@ sp_create_window(SPViewWidget *vw, gboolean editable) desktop_widget->window = win; - /* fixme: doesn't allow making window any smaller than this */ - win->set_default_size(640, 480); - win->set_data("desktop", desktop); win->set_data("desktopwidget", desktop_widget); win->signal_delete_event().connect(sigc::mem_fun(*(SPDesktop*)vw->view, &SPDesktop::onDeleteUI)); win->signal_window_state_event().connect(sigc::mem_fun(*desktop, &SPDesktop::onWindowStateEvent)); win->signal_focus_in_event().connect(sigc::mem_fun(*desktop_widget, &SPDesktopWidget::onFocusInEvent)); - + gint prefs_geometry = (2==prefs_get_int_attribute("options.savewindowgeometry", "value", 0)); if (prefs_geometry) { @@ -197,9 +217,6 @@ sp_create_window(SPViewWidget *vw, gboolean editable) gtk_window_set_policy(GTK_WINDOW(win->gobj()), TRUE, TRUE, TRUE); } - gtk_container_add(GTK_CONTAINER(win->gobj()), GTK_WIDGET(vw)); - gtk_widget_show(GTK_WIDGET(vw)); - if ( completeDropTargets == 0 || completeDropTargetsCount == 0 ) { std::vector types; @@ -236,10 +253,20 @@ sp_create_window(SPViewWidget *vw, gboolean editable) completeDropTargets, completeDropTargetsCount, GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE)); + + g_signal_connect(G_OBJECT(win->gobj()), "drag_data_received", G_CALLBACK(sp_ui_drag_data_received), NULL); + g_signal_connect(G_OBJECT(win->gobj()), + "drag_motion", + G_CALLBACK(sp_ui_drag_motion), + NULL); + g_signal_connect(G_OBJECT(win->gobj()), + "drag_leave", + G_CALLBACK(sp_ui_drag_leave), + NULL); win->show(); // needed because the first ACTIVATE_DESKTOP was sent when there was no window yet @@ -285,7 +312,7 @@ sp_ui_new_view_preview() * \param widget unused */ void -sp_ui_close_view(GtkWidget *widget) +sp_ui_close_view(GtkWidget */*widget*/) { if (SP_ACTIVE_DESKTOP == NULL) { return; @@ -332,19 +359,19 @@ sp_ui_close_all(void) * investigate when they're called. */ static void -sp_ui_menu_activate(void *object, SPAction *action) +sp_ui_menu_activate(void */*object*/, SPAction *action) { sp_action_perform(action, NULL); } static void -sp_ui_menu_select_action(void *object, SPAction *action) +sp_ui_menu_select_action(void */*object*/, SPAction *action) { action->view->tipsMessageContext()->set(Inkscape::NORMAL_MESSAGE, action->tip); } static void -sp_ui_menu_deselect_action(void *object, SPAction *action) +sp_ui_menu_deselect_action(void */*object*/, SPAction *action) { action->view->tipsMessageContext()->clear(); } @@ -442,9 +469,10 @@ sp_key_name(guint keyval) 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, "bar" )) return "|"; + else if (!strcmp(n, "slash" )) return "/"; + else if (!strcmp(n, "exclam" )) return "!"; + else if (!strcmp(n, "percent" )) return "%"; else return n; } @@ -618,7 +646,7 @@ checkitem_toggled(GtkCheckMenuItem *menuitem, gpointer user_data) } static gboolean -checkitem_update(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) +checkitem_update(GtkWidget *widget, GdkEventExpose */*event*/, gpointer user_data) { GtkCheckMenuItem *menuitem=GTK_CHECK_MENU_ITEM(widget); @@ -705,13 +733,13 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View * } static void -sp_recent_open(GtkWidget *widget, gchar const *uri) +sp_recent_open(GtkWidget */*widget*/, gchar const *uri) { sp_file_open(uri, NULL); } static void -sp_file_new_from_template(GtkWidget *widget, gchar const *uri) +sp_file_new_from_template(GtkWidget */*widget*/, gchar const *uri) { sp_file_new(uri); } @@ -919,9 +947,17 @@ sp_ui_main_menubar(Inkscape::UI::View::View *view) { GtkWidget *mbar = gtk_menu_bar_new(); +#ifdef GDK_WINDOWING_QUARTZ + ige_mac_menu_set_menu_bar(GTK_MENU_SHELL(mbar)); +#endif + sp_ui_build_dyn_menus(inkscape_get_menus(INKSCAPE), mbar, view); +#ifdef GDK_WINDOWING_QUARTZ + return NULL; +#else return mbar; +#endif } static void leave_group(GtkMenuItem *, SPDesktop *desktop) { @@ -1013,8 +1049,8 @@ sp_ui_drag_data_received(GtkWidget *widget, gint x, gint y, GtkSelectionData *data, guint info, - guint event_time, - gpointer user_data) + guint /*event_time*/, + gpointer /*user_data*/) { SPDocument *doc = SP_ACTIVE_DOCUMENT; SPDesktop *desktop = SP_ACTIVE_DESKTOP; @@ -1031,13 +1067,15 @@ sp_ui_drag_data_received(GtkWidget *widget, SPItem *item = desktop->item_at_point( where, true ); if ( item ) { + bool fillnotstroke = (drag_context->action != GDK_ACTION_MOVE); + if ( data->length >= 8 ) { cmsHPROFILE srgbProf = cmsCreate_sRGBProfile(); gchar c[64] = {0}; // Careful about endian issues. guint16* dataVals = (guint16*)data->data; - sp_svg_write_color( c, 64, + sp_svg_write_color( c, sizeof(c), SP_RGBA32_U_COMPOSE( 0x0ff & (dataVals[0] >> 8), 0x0ff & (dataVals[1] >> 8), @@ -1066,18 +1104,18 @@ sp_ui_drag_data_received(GtkWidget *widget, str = 0; sp_object_setAttribute( SP_OBJECT(item), - (drag_context->action != GDK_ACTION_MOVE) ? "inkscape:x-fill-tag":"inkscape:x-stroke-tag", + fillnotstroke ? "inkscape:x-fill-tag":"inkscape:x-stroke-tag", palName.c_str(), false ); item->updateRepr(); - sp_repr_css_set_property( css, (drag_context->action != GDK_ACTION_MOVE) ? "fill":"stroke", c ); + sp_repr_css_set_property( css, fillnotstroke ? "fill":"stroke", c ); updatePerformed = true; } } if ( !updatePerformed ) { - sp_repr_css_set_property( css, (drag_context->action != GDK_ACTION_MOVE) ? "fill":"stroke", c ); + sp_repr_css_set_property( css, fillnotstroke ? "fill":"stroke", c ); } sp_desktop_apply_css_recursive( item, css, true ); @@ -1101,24 +1139,69 @@ sp_ui_drag_data_received(GtkWidget *widget, int destY = 0; gtk_widget_translate_coordinates( widget, &(desktop->canvas->widget), x, y, &destX, &destY ); NR::Point where( sp_canvas_window_to_world( desktop->canvas, NR::Point( destX, destY ) ) ); + NR::Point const button_dt(desktop->w2d(where)); + NR::Point const button_doc(desktop->dt2doc(button_dt)); + + if ( data->length == 8 ) { + gchar c[64] = {0}; + // Careful about endian issues. + guint16* dataVals = (guint16*)data->data; + sp_svg_write_color( c, 64, + SP_RGBA32_U_COMPOSE( + 0x0ff & (dataVals[0] >> 8), + 0x0ff & (dataVals[1] >> 8), + 0x0ff & (dataVals[2] >> 8), + 0xff // can't have transparency in the color itself + //0x0ff & (data->data[3] >> 8), + )); + + SPItem *item = desktop->item_at_point( where, true ); + + bool consumed = false; + if (desktop->event_context && desktop->event_context->get_drag()) { + consumed = desktop->event_context->get_drag()->dropColor(item, c, button_dt); + if (consumed) { + sp_document_done( doc , SP_VERB_NONE, _("Drop color on gradient")); + desktop->event_context->get_drag()->updateDraggers(); + } + } + + //if (!consumed && tools_active(desktop, TOOLS_TEXT)) { + // consumed = sp_text_context_drop_color(c, button_doc); + // if (consumed) { + // sp_document_done( doc , SP_VERB_NONE, _("Drop color on gradient stop")); + // } + //} + + if (!consumed && item) { + bool fillnotstroke = (drag_context->action != GDK_ACTION_MOVE); + if (fillnotstroke && + (SP_IS_SHAPE(item) || SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item))) { + Path *livarot_path = Path_for_item(item, true, true); + livarot_path->ConvertWithBackData(0.04); + + boost::optional position = get_nearest_position_on_Path(livarot_path, button_doc); + if (position) { + NR::Point nearest = get_point_on_Path(livarot_path, position->piece, position->t); + NR::Point delta = nearest - button_doc; + delta = desktop->d2w(delta); + double stroke_tolerance = + ( !SP_OBJECT_STYLE(item)->stroke.isNone() ? + desktop->current_zoom() * + SP_OBJECT_STYLE (item)->stroke_width.computed * + NR::expansion(sp_item_i2d_affine(item)) * 0.5 + : 0.0) + + prefs_get_int_attribute_limited("options.dragtolerance", "value", 0, 0, 100); + + if (NR::L2 (delta) < stroke_tolerance) { + fillnotstroke = false; + } + } + delete livarot_path; + } - SPItem *item = desktop->item_at_point( where, true ); - if ( item ) - { - if ( data->length == 8 ) { - gchar c[64] = {0}; - // Careful about endian issues. - guint16* dataVals = (guint16*)data->data; - sp_svg_write_color( c, 64, - SP_RGBA32_U_COMPOSE( - 0x0ff & (dataVals[0] >> 8), - 0x0ff & (dataVals[1] >> 8), - 0x0ff & (dataVals[2] >> 8), - 0xff // can't have transparency in the color itself - //0x0ff & (data->data[3] >> 8), - )); SPCSSAttr *css = sp_repr_css_attr_new(); - sp_repr_css_set_property( css, (drag_context->action != GDK_ACTION_MOVE) ? "fill":"stroke", c ); + sp_repr_css_set_property( css, fillnotstroke ? "fill":"stroke", c ); sp_desktop_apply_css_recursive( item, css, true ); item->updateRepr(); @@ -1169,7 +1252,7 @@ sp_ui_drag_data_received(GtkWidget *widget, int const saved_pref = prefs_get_int_attribute("options.transform", "pattern", 1); prefs_set_int_attribute("options.transform", "pattern", 1); sp_document_ensure_up_to_date(sp_desktop_document(desktop)); - NR::Maybe sel_bbox = selection->bounds(); + boost::optional sel_bbox = selection->bounds(); if (sel_bbox) { NR::Point m( desktop->point() - sel_bbox->midpoint() ); sp_selection_move_relative(selection, m); @@ -1243,6 +1326,31 @@ sp_ui_drag_data_received(GtkWidget *widget, } } +#include "gradient-context.h" + +void sp_ui_drag_motion( GtkWidget */*widget*/, + GdkDragContext */*drag_context*/, + gint /*x*/, gint /*y*/, + GtkSelectionData */*data*/, + guint /*info*/, + guint /*event_time*/, + gpointer /*user_data*/) +{ +// SPDocument *doc = SP_ACTIVE_DOCUMENT; +// SPDesktop *desktop = SP_ACTIVE_DESKTOP; + + +// g_message("drag-n-drop motion (%4d, %4d) at %d", x, y, event_time); +} + +static void sp_ui_drag_leave( GtkWidget */*widget*/, + GdkDragContext */*drag_context*/, + guint /*event_time*/, + gpointer /*user_data*/ ) +{ +// g_message("drag-n-drop leave at %d", event_time); +} + static void sp_ui_import_files(gchar *buffer) { @@ -1255,7 +1363,7 @@ sp_ui_import_files(gchar *buffer) } static void -sp_ui_import_one_file_with_check(gpointer filename, gpointer unused) +sp_ui_import_one_file_with_check(gpointer filename, gpointer /*unused*/) { if (filename) { if (strlen((char const *)filename) > 2) @@ -1297,13 +1405,7 @@ sp_ui_overwrite_file(gchar const *filename) bool return_value = FALSE; if (Inkscape::IO::file_test(filename, G_FILE_TEST_EXISTS)) { - Gtk::Widget* ancestor = NULL; - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - if ( desktop ) { - desktop->getToplevel( ancestor ); - } - Gtk::Window *window = ancestor->is_toplevel() ? - dynamic_cast( ancestor ) : 0; + Gtk::Window *window = SP_ACTIVE_DESKTOP->getToplevel(); gchar* baseName = g_path_get_basename( filename ); gchar* dirName = g_path_get_dirname( filename ); GtkWidget* dialog = gtk_message_dialog_new_with_markup( window->gobj(), @@ -1337,13 +1439,13 @@ sp_ui_overwrite_file(gchar const *filename) } static void -sp_ui_menu_item_set_sensitive(SPAction *action, unsigned int sensitive, void *data) +sp_ui_menu_item_set_sensitive(SPAction */*action*/, unsigned int sensitive, void *data) { return gtk_widget_set_sensitive(GTK_WIDGET(data), sensitive); } static void -sp_ui_menu_item_set_name(SPAction *action, Glib::ustring name, void *data) +sp_ui_menu_item_set_name(SPAction */*action*/, Glib::ustring name, void *data) { void *child = GTK_BIN (data)->child; //child is either