X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fview%2Fedit-widget.cpp;h=ca298cd5dbd4f3ed4c648a711fa34864aec44e87;hb=d75719d68573b3c63dfa38578aca41b5c364c372;hp=55f63b443b586eaad8d6f84217af0f39985fa42f;hpb=535b1596de71acb960a629b0f34f0d2171a34348;p=inkscape.git diff --git a/src/ui/view/edit-widget.cpp b/src/ui/view/edit-widget.cpp index 55f63b443..ca298cd5d 100644 --- a/src/ui/view/edit-widget.cpp +++ b/src/ui/view/edit-widget.cpp @@ -16,7 +16,11 @@ * Derek P. Moore * Lauris Kaplinski * Frank Felfe + * John Bintz + * Johan Engelen * + * Copyright (C) 2007 Johan Engelen + * Copyright (C) 2006 John Bintz * Copyright (C) 1999-2005 Authors * Copyright (C) 2000-2001 Ximian, Inc. * @@ -38,6 +42,8 @@ #include #include +#include + #include "macros.h" #include "path-prefix.h" #include "prefs-utils.h" @@ -72,7 +78,8 @@ EditWidget::EditWidget (SPDocument *doc) _act_grp(Gtk::ActionGroup::create()), _ui_mgr(Gtk::UIManager::create()), _update_s_f(false), - _update_a_f(false) + _update_a_f(false), + _interaction_disabled_counter(0) { g_warning("Creating new EditWidget"); @@ -408,6 +415,10 @@ EditWidget::initMenuActions() Gtk::Stock::REDO, Glib::ustring(), _("PLACEHOLDER, do not translate"))); + _act_grp->add(Gtk::Action::create("UndoHistory", + Stock::UNDO_HISTORY, Glib::ustring(), + _("PLACEHOLDER, do not translate"))); + _act_grp->add(Gtk::Action::create("Cut", Gtk::Stock::CUT, Glib::ustring(), _("PLACEHOLDER, do not translate"))); @@ -1143,11 +1154,9 @@ EditWidget::setPosition (NR::Point p) void EditWidget::setTransient (void* p, int i) { -#ifndef WIN32 gtk_window_set_transient_for (static_cast(p), this->gobj()); if (i==2) this->Gtk::Window::present(); -#endif } NR::Point @@ -1158,6 +1167,18 @@ EditWidget::getPointer() return NR::Point (x, y); } +void +EditWidget::setIconified() +{ + iconify(); +} + +void +EditWidget::setMaximized() +{ + maximize(); +} + void EditWidget::setFullscreen() { @@ -1287,6 +1308,37 @@ EditWidget::requestCanvasUpdate() _svg_canvas.widget().queue_draw(); } +void +EditWidget::requestCanvasUpdateAndWait() +{ + requestCanvasUpdate(); + + while (gtk_events_pending()) + gtk_main_iteration_do(FALSE); +} + +void +EditWidget::enableInteraction() +{ + g_return_if_fail(_interaction_disabled_counter > 0); + + _interaction_disabled_counter--; + + if (_interaction_disabled_counter == 0) { + this->set_sensitive(true); + } +} + +void +EditWidget::disableInteraction() +{ + if (_interaction_disabled_counter == 0) { + this->set_sensitive(false); + } + + _interaction_disabled_counter++; +} + void EditWidget::activateDesktop() { @@ -1302,7 +1354,9 @@ EditWidget::deactivateDesktop() void EditWidget::viewSetPosition (NR::Point p) { - p -= _namedview->gridorigin; + // p -= _namedview->gridorigin; + /// \todo Why was the origin corrected for the grid origin? (johan) + double lo, up, pos, max; _top_ruler.get_range (lo, up, pos, max); _top_ruler.set_range (lo, up, p[NR::X], max); @@ -1313,18 +1367,19 @@ EditWidget::viewSetPosition (NR::Point p) void EditWidget::updateRulers() { - NR::Point origin = _namedview->gridorigin; - + //NR::Point gridorigin = _namedview->gridorigin; + /// \todo Why was the origin corrected for the grid origin? (johan) + NR::Rect const viewbox = _svg_canvas.spobj()->getViewbox(); double lo, up, pos, max; double const scale = _desktop->current_zoom(); - double s = viewbox.min()[NR::X] / scale - origin[NR::X]; - double e = viewbox.max()[NR::X] / scale - origin[NR::X]; + double s = viewbox.min()[NR::X] / scale; //- gridorigin[NR::X]; + double e = viewbox.max()[NR::X] / scale; //- gridorigin[NR::X]; _top_ruler.get_range(lo, up, pos, max); _top_ruler.set_range(s, e, pos, e); - s = viewbox.min()[NR::Y] / -scale - origin[NR::Y]; - e = viewbox.max()[NR::Y] / -scale - origin[NR::Y]; - _left_ruler.set_range(s, e, origin[NR::Y], e); + s = viewbox.min()[NR::Y] / -scale; //- gridorigin[NR::Y]; + e = viewbox.max()[NR::Y] / -scale; //- gridorigin[NR::Y]; + _left_ruler.set_range(s, e, 0 /*gridorigin[NR::Y]*/, e); /// \todo is that correct? } @@ -1340,11 +1395,11 @@ EditWidget::updateScrollbars (double scale) /* The desktop region we always show unconditionally */ SPDocument *doc = _desktop->doc(); - NR::Rect const r = sp_item_bbox_desktop(SP_ITEM(SP_DOCUMENT_ROOT(doc))); - NR::Rect darea(NR::Point(MIN(r.min()[NR::X], -sp_document_width(doc)), - MIN(r.min()[NR::Y], -sp_document_height(doc))), - NR::Point(MAX(r.max()[NR::X], 2 * sp_document_width(doc)), - MAX(r.max()[NR::Y], 2 * sp_document_height(doc)))); + NR::Rect darea = NR::Rect(NR::Point(-sp_document_width(doc), + -sp_document_height(doc)), + NR::Point(2 * sp_document_width(doc), + 2 * sp_document_height(doc))); + darea = NR::union_bounds(darea, sp_item_bbox_desktop(SP_ITEM(SP_DOCUMENT_ROOT(doc)))); /* Canvas region we always show unconditionally */ NR::Rect carea(NR::Point(darea.min()[NR::X] * scale - 64, @@ -1355,7 +1410,7 @@ EditWidget::updateScrollbars (double scale) NR::Rect const viewbox = _svg_canvas.spobj()->getViewbox(); /* Viewbox is always included into scrollable region */ - carea = NR::Rect::union_bounds(carea, viewbox); + carea = NR::union_bounds(carea, viewbox); Gtk::Adjustment *adj = _bottom_scrollbar.get_adjustment(); adj->set_value(viewbox.min()[NR::X]); @@ -1383,11 +1438,11 @@ EditWidget::toggleRulers() { _top_ruler.hide_all(); _left_ruler.hide_all(); - prefs_set_int_attribute (_desktop->is_fullscreen ? "fullscreen.rulers" : "window.rulers", "state", 0); + prefs_set_int_attribute (_desktop->is_fullscreen() ? "fullscreen.rulers" : "window.rulers", "state", 0); } else { _top_ruler.show_all(); _left_ruler.show_all(); - prefs_set_int_attribute (_desktop->is_fullscreen ? "fullscreen.rulers" : "window.rulers", "state", 1); + prefs_set_int_attribute (_desktop->is_fullscreen() ? "fullscreen.rulers" : "window.rulers", "state", 1); } } @@ -1398,11 +1453,11 @@ EditWidget::toggleScrollbars() { _bottom_scrollbar.hide_all(); _right_scrollbar.hide_all(); - prefs_set_int_attribute (_desktop->is_fullscreen ? "fullscreen.scrollbars" : "window.scrollbars", "state", 0); + prefs_set_int_attribute (_desktop->is_fullscreen() ? "fullscreen.scrollbars" : "window.scrollbars", "state", 0); } else { _bottom_scrollbar.show_all(); _right_scrollbar.show_all(); - prefs_set_int_attribute (_desktop->is_fullscreen ? "fullscreen.scrollbars" : "window.scrollbars", "state", 1); + prefs_set_int_attribute (_desktop->is_fullscreen() ? "fullscreen.scrollbars" : "window.scrollbars", "state", 1); } } @@ -1468,17 +1523,15 @@ EditWidget::warnDialog (gchar* msg) } -/// \todo make this a member function when the signal is a sigc++ signal -void _namedview_modified (SPNamedView* nv, guint flags, EditWidget* ew) -{ - if (flags & SP_OBJECT_MODIFIED_FLAG) - { - ew->_dt2r = 1.0 / nv->doc_units->unittobase; - ew->_top_ruler.update_metric(); - ew->_left_ruler.update_metric(); - ew->_tooltips.set_tip (ew->_top_ruler, ew->_top_ruler.get_tip()); - ew->_tooltips.set_tip (ew->_left_ruler, ew->_left_ruler.get_tip()); - ew->updateRulers(); +void EditWidget::_namedview_modified (SPObject *obj, guint flags) { + SPNamedView *nv = static_cast(obj); + if (flags & SP_OBJECT_MODIFIED_FLAG) { + this->_dt2r = 1.0 / nv->doc_units->unittobase; + this->_top_ruler.update_metric(); + this->_left_ruler.update_metric(); + this->_tooltips.set_tip(this->_top_ruler, this->_top_ruler.get_tip()); + this->_tooltips.set_tip(this->_left_ruler, this->_left_ruler.get_tip()); + this->updateRulers(); } } @@ -1492,12 +1545,12 @@ EditWidget::initEdit (SPDocument *doc) _svg_canvas.init (_desktop); _desktop->init (_namedview, _svg_canvas.spobj()); sp_namedview_window_from_document (_desktop); + sp_namedview_update_layers_from_document (_desktop); _dt2r = 1.0 / _namedview->doc_units->unittobase; /// \todo convert to sigc++ when SPObject hierarchy gets converted /* Listen on namedview modification */ - g_signal_connect (G_OBJECT (_desktop->namedview), "modified", - G_CALLBACK (_namedview_modified), this); + _namedview_modified_connection = _desktop->namedview->connectModified(sigc::mem_fun(*this, &EditWidget::_namedview_modified)); _layer_selector.setDesktop (_desktop); _selected_style_status.setDesktop (_desktop); @@ -1515,7 +1568,7 @@ EditWidget::destroyEdit() if (_desktop) { _layer_selector.unreference(); Inkscape::NSApplication::Editor::removeDesktop (_desktop); // clears selection too - sp_signal_disconnect_by_data (G_OBJECT (_desktop->namedview), this); + _namedview_modified_connection.disconnect(); _desktop->destroy(); Inkscape::GC::release (_desktop); _desktop = 0; @@ -1592,12 +1645,12 @@ EditWidget::onWindowRealize() NR::Rect d(NR::Point(0, 0), NR::Point(sp_document_width(_desktop->doc()), sp_document_height(_desktop->doc()))); - if (fabs(d.dimensions()[NR::X]) < 1.0 || fabs(d.dimensions()[NR::Y]) < 1.0) { + if (d.isEmpty(1.0)) { return; } _desktop->set_display_area(d.min()[NR::X], d.min()[NR::Y], d.max()[NR::X], d.max()[NR::Y], 10); - _namedview_modified(_desktop->namedview, SP_OBJECT_MODIFIED_FLAG, this); + _namedview_modified(_desktop->namedview, SP_OBJECT_MODIFIED_FLAG); setTitle (SP_DOCUMENT_NAME(_desktop->doc())); }