summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgustav_b <gustav_b@users.sourceforge.net>2006-07-09 11:32:23 +0000
committergustav_b <gustav_b@users.sourceforge.net>2006-07-09 11:32:23 +0000
commitc631dfb4add034db59cb477843ca95bcc2986758 (patch)
treec616db1f1e294f6630734af1e237322259c09366
parent* packaging/osx-app.sh: Set the svn:executable property. (diff)
downloadinkscape-c631dfb4add034db59cb477843ca95bcc2986758.tar.gz
inkscape-c631dfb4add034db59cb477843ca95bcc2986758.zip
Added descriptions to Undo/Redo commands in the menus
(bzr r1379)
-rw-r--r--src/document.cpp1
-rw-r--r--src/event-log.cpp89
-rw-r--r--src/event-log.h14
-rw-r--r--src/extension/effect.cpp2
-rw-r--r--src/helper/action.cpp32
-rw-r--r--src/helper/action.h3
-rw-r--r--src/interface.cpp15
-rw-r--r--src/sp-namedview.cpp4
-rw-r--r--src/ui/dialog/undo-history.cpp4
-rw-r--r--src/verbs.cpp45
-rw-r--r--src/verbs.h2
-rw-r--r--src/widgets/button.cpp3
12 files changed, 191 insertions, 23 deletions
diff --git a/src/document.cpp b/src/document.cpp
index a6b6e4e45..69f9128a8 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -106,6 +106,7 @@ SPDocument::SPDocument() {
p->redo = NULL;
p->undoStackObservers.add(p->event_log);
+ p->event_log.setDocument(this);
priv = p;
diff --git a/src/event-log.cpp b/src/event-log.cpp
index 40c8364ac..64a9b19ec 100644
--- a/src/event-log.cpp
+++ b/src/event-log.cpp
@@ -10,14 +10,16 @@
#include <glibmm/i18n.h>
#include "desktop.h"
-
#include "event-log.h"
+#include "inkscape.h"
+#include "util/ucompose.hpp"
namespace Inkscape {
EventLog::EventLog() :
UndoStackObserver(),
_connected (false),
+ _document (NULL),
_event_list_store (Gtk::TreeStore::create(_columns)),
_event_list_selection (NULL),
_event_list_view (NULL),
@@ -39,7 +41,7 @@ void
EventLog::notifyUndoEvent(Event* log)
{
if ( !_notifications_blocked ) {
-
+
// if we're on the first child event...
if ( _curr_event->parent() &&
_curr_event == _curr_event->parent()->children().begin() )
@@ -81,7 +83,9 @@ EventLog::notifyUndoEvent(Event* log)
(*_callback_connections)[CALLB_SELECTION_CHANGE].block(false);
}
+ updateUndoVerbs();
}
+
}
void
@@ -137,7 +141,9 @@ EventLog::notifyRedoEvent(Event* log)
(*_callback_connections)[CALLB_SELECTION_CHANGE].block(false);
}
+ updateUndoVerbs();
}
+
}
void
@@ -219,8 +225,18 @@ EventLog::notifyUndoCommitEvent(Event* log)
(*_callback_connections)[CALLB_SELECTION_CHANGE].block(false);
}
+ updateUndoVerbs();
}
+
+void
+EventLog::setDocument(SPDocument *document)
+{
+ _document = document;
+ updateUndoVerbs();
+}
+
+
void
EventLog::connectWithDialog(Gtk::TreeView *event_list_view, CallbackMap *callback_connections)
{
@@ -242,7 +258,76 @@ EventLog::connectWithDialog(Gtk::TreeView *event_list_view, CallbackMap *callbac
_connected = true;
}
+void
+EventLog::updateUndoVerbs()
+{
+ if(_document) {
+
+ if(_getUndoEvent()) {
+ Inkscape::Verb::get(SP_VERB_EDIT_UNDO)->sensitive(_document, true);
+
+ Inkscape::Verb::get(SP_VERB_EDIT_UNDO)->name(_document, String::ucompose("%1 %2",
+ Glib::ustring(_("_Undo")),
+ Glib::ustring((*_getUndoEvent())[_columns.description])));
+ } else {
+ Inkscape::Verb::get(SP_VERB_EDIT_UNDO)->name(_document, _("_Undo"));
+ Inkscape::Verb::get(SP_VERB_EDIT_UNDO)->sensitive(_document, false);
+ }
+
+ if(_getRedoEvent()) {
+ Inkscape::Verb::get(SP_VERB_EDIT_REDO)->sensitive(_document, true);
+ Inkscape::Verb::get(SP_VERB_EDIT_REDO)->name(_document, String::ucompose("%1 %2",
+ Glib::ustring(_("_Redo")),
+ Glib::ustring((*_getRedoEvent())[_columns.description])));
+
+ } else {
+ Inkscape::Verb::get(SP_VERB_EDIT_REDO)->name(_document, _("_Redo"));
+ Inkscape::Verb::get(SP_VERB_EDIT_REDO)->sensitive(_document, false);
+ }
+
+ }
+
+}
+
+
+EventLog::const_iterator
+EventLog::_getUndoEvent() const
+{
+ const_iterator undo_event = (const_iterator)NULL;
+ if( _curr_event != _event_list_store->children().begin() )
+ undo_event = _curr_event;
+ return undo_event;
}
+
+EventLog::const_iterator
+EventLog::_getRedoEvent() const
+{
+ const_iterator redo_event = (const_iterator)NULL;
+
+ if ( _curr_event != _last_event ) {
+
+ if ( !_curr_event->children().empty() )
+ redo_event = _curr_event->children().begin();
+ else {
+ redo_event = _curr_event;
+ ++redo_event;
+
+ if ( redo_event->parent() &&
+ redo_event == redo_event->parent()->children().end() ) {
+
+ redo_event = redo_event->parent();
+ ++redo_event;
+
+ }
+ }
+
+ }
+
+ return redo_event;
+}
+
+}
+
/*
Local Variables:
mode:c++
diff --git a/src/event-log.h b/src/event-log.h
index 148d6329d..16ecfd555 100644
--- a/src/event-log.h
+++ b/src/event-log.h
@@ -85,6 +85,8 @@ public:
void setCurrEventParent(iterator event) { _curr_event_parent = event; }
void blockNotifications(bool status=true) { _notifications_blocked = status; }
+ void setDocument(SPDocument *document);
+
/*
* Callback types for TreeView changes.
*/
@@ -103,9 +105,16 @@ public:
*/
void connectWithDialog(Gtk::TreeView *event_list_view, CallbackMap *callback_connections);
+ /*
+ * Updates the sensitivity and names of SP_VERB_EDIT_UNDO and SP_VERB_EDIT_REDO to reflect the
+ * current state.
+ */
+ void updateUndoVerbs();
+
private:
bool _connected; //< connected with dialog
-
+ SPDocument *_document; //< document that is logged
+
const EventModelColumns _columns;
/**
@@ -125,6 +134,9 @@ private:
// Map of connections used to temporary block/unblock callbacks in a TreeView
CallbackMap *_callback_connections;
+ const_iterator _getUndoEvent() const; //< returns the current undoable event or NULL if none
+ const_iterator _getRedoEvent() const; //< returns the current redoable event or NULL if none
+
// noncopyable, nonassignable
EventLog(EventLog const &other);
EventLog& operator=(EventLog const &other);
diff --git a/src/extension/effect.cpp b/src/extension/effect.cpp
index 2f884aa1c..71ddf3e24 100644
--- a/src/extension/effect.cpp
+++ b/src/extension/effect.cpp
@@ -305,7 +305,7 @@ Effect::EffectVerb::perform (SPAction *action, void * data, void *pdata)
* is called.
*/
SPActionEventVector Effect::EffectVerb::vector =
- {{NULL},Effect::EffectVerb::perform, NULL, NULL, NULL};
+ {{NULL}, Effect::EffectVerb::perform, NULL, NULL, NULL, NULL};
} } /* namespace Inkscape, Extension */
diff --git a/src/helper/action.cpp b/src/helper/action.cpp
index 9584c5dae..1c8c7ec15 100644
--- a/src/helper/action.cpp
+++ b/src/helper/action.cpp
@@ -13,7 +13,6 @@
#include <string.h>
-
#include "helper/action.h"
static void sp_action_class_init (SPActionClass *klass);
@@ -206,6 +205,37 @@ sp_action_set_sensitive (SPAction *action, unsigned int sensitive)
}
}
+
+/**
+ * Change name for all actions that can be taken with the action.
+ */
+void
+sp_action_set_name (SPAction *action, Glib::ustring name)
+{
+ nr_return_if_fail (action != NULL);
+ nr_return_if_fail (SP_IS_ACTION (action));
+
+ NRActiveObject *aobject;
+ g_free(action->name);
+ action->name = g_strdup(name.c_str());
+ aobject = (NRActiveObject *) action;
+ if (aobject->callbacks) {
+ unsigned int i;
+ for (i = 0; i < aobject->callbacks->length; i++) {
+ NRObjectListener *listener;
+ SPActionEventVector *avector;
+ listener = aobject->callbacks->listeners + i;
+ avector = (SPActionEventVector *) listener->vector;
+ if ((listener->size >= sizeof (SPActionEventVector)) && avector->set_name) {
+ avector->set_name (action, name, listener->data);
+ }
+ }
+ }
+}
+
+
+
+
/**
* Return View associated with the action.
*/
diff --git a/src/helper/action.h b/src/helper/action.h
index 1e3646439..4c99e31d8 100644
--- a/src/helper/action.h
+++ b/src/helper/action.h
@@ -25,6 +25,7 @@
#include "libnr/nr-object.h"
#include "forward.h"
+#include <glibmm/ustring.h>
//class Inkscape::UI::View::View;
namespace Inkscape {
@@ -41,6 +42,7 @@ struct SPActionEventVector {
void (* set_active)(SPAction *action, unsigned active, void *data); /**< Callback for activation change */
void (* set_sensitive)(SPAction *action, unsigned sensitive, void *data); /**< Callback for a change in sensitivity */
void (* set_shortcut)(SPAction *action, unsigned shortcut, void *data); /**< Callback for setting the shortcut for this function */
+ void (* set_name)(SPAction *action, Glib::ustring, void *data); /**< Callback for setting the name for this function */
};
/** All the data that is required to be an action. This
@@ -74,6 +76,7 @@ SPAction *sp_action_new(Inkscape::UI::View::View *view,
void sp_action_perform(SPAction *action, void *data);
void sp_action_set_active(SPAction *action, unsigned active);
void sp_action_set_sensitive(SPAction *action, unsigned sensitive);
+void sp_action_set_name (SPAction *action, Glib::ustring);
Inkscape::UI::View::View *sp_action_get_view(SPAction *action);
#endif
diff --git a/src/interface.cpp b/src/interface.cpp
index 91a26226f..348e71821 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -112,13 +112,17 @@ static void sp_ui_drag_data_received(GtkWidget *widget,
static void sp_ui_menu_item_set_sensitive(SPAction *action,
unsigned int sensitive,
void *data);
+static void sp_ui_menu_item_set_name(SPAction *action,
+ Glib::ustring name,
+ void *data);
SPActionEventVector menu_item_event_vector = {
{NULL},
NULL,
NULL, /* set_active */
sp_ui_menu_item_set_sensitive, /* set_sensitive */
- NULL /* set_shortcut */
+ NULL, /* set_shortcut */
+ sp_ui_menu_item_set_name /* set_name */
};
void
@@ -1317,6 +1321,15 @@ sp_ui_menu_item_set_sensitive(SPAction *action, unsigned int sensitive, void *da
return gtk_widget_set_sensitive(GTK_WIDGET(data), sensitive);
}
+static void
+sp_ui_menu_item_set_name(SPAction *action, Glib::ustring name, void *data)
+{
+ gtk_label_set_markup_with_mnemonic(
+ GTK_LABEL (gtk_container_get_children(GTK_CONTAINER (GTK_BIN (data)->child))->data),
+ name.c_str());
+}
+
+
/*
Local Variables:
mode:c++
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index 4f9e4e288..f3dea40c7 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -23,6 +23,7 @@
#include "document.h"
#include "desktop-events.h"
#include "desktop-handles.h"
+#include "event-log.h"
#include "sp-guide.h"
#include "sp-item-group.h"
#include "sp-namedview.h"
@@ -674,6 +675,9 @@ void sp_namedview_window_from_document(SPDesktop *desktop)
if (layer) {
desktop->setCurrentLayer(layer);
}
+
+ // FIXME: find a better place to do this
+ sp_desktop_document(desktop)->getEventLog().updateUndoVerbs();
}
void sp_namedview_document_from_window(SPDesktop *desktop)
diff --git a/src/ui/dialog/undo-history.cpp b/src/ui/dialog/undo-history.cpp
index 13f6bff26..e1b60f315 100644
--- a/src/ui/dialog/undo-history.cpp
+++ b/src/ui/dialog/undo-history.cpp
@@ -175,7 +175,7 @@ UndoHistory::_onListSelectionChange()
EventLog::const_iterator selected = _event_list_selection->get_selected();
/* If no event is selected in the view, find the right one and select it. This happens whenever
- * a branch we're currently in is collapsed.
+ * a branch we're currently in is collapsed.
*/
if (!selected) {
@@ -239,6 +239,7 @@ UndoHistory::_onListSelectionChange()
}
}
_event_log->blockNotifications(false);
+ _event_log->updateUndoVerbs();
} else { // An event after the current one has been selected. Redo to the selected event.
@@ -267,6 +268,7 @@ UndoHistory::_onListSelectionChange()
}
_event_log->setCurrEvent(selected);
+ _event_log->updateUndoVerbs();
}
}
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 6a5957218..5b740b215 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -654,6 +654,21 @@ Verb::sensitive(SPDocument *in_doc, bool in_sensitive)
return;
}
+
+void
+Verb::name(SPDocument *in_doc, Glib::ustring in_name)
+{
+ if (_actions != NULL) {
+ for (ActionTable::iterator cur_action = _actions->begin();
+ cur_action != _actions->end();
+ cur_action++) {
+ if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) {
+ sp_action_set_name(cur_action->second, in_name);
+ }
+ }
+ }
+}
+
/** \brief A function to remove the action associated with a view.
\param view Which view's actions should be removed.
\return None
@@ -1686,48 +1701,48 @@ TutorialVerb::perform(SPAction *action, void *data, void *pdata)
* is called.
*/
SPActionEventVector FileVerb::vector =
- {{NULL},FileVerb::perform, NULL, NULL, NULL};
+ {{NULL},FileVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined edit verb is
* called.
*/
SPActionEventVector EditVerb::vector =
- {{NULL},EditVerb::perform, NULL, NULL, NULL};
+ {{NULL},EditVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined selection
* verb is called
*/
SPActionEventVector SelectionVerb::vector =
- {{NULL},SelectionVerb::perform, NULL, NULL, NULL};
+ {{NULL},SelectionVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined layer
* verb is called
*/
SPActionEventVector LayerVerb::vector =
- {{NULL}, LayerVerb::perform, NULL, NULL, NULL};
+ {{NULL}, LayerVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined object
* editing verb is called
*/
SPActionEventVector ObjectVerb::vector =
- {{NULL},ObjectVerb::perform, NULL, NULL, NULL};
+ {{NULL},ObjectVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined context
* verb is called
*/
SPActionEventVector ContextVerb::vector =
- {{NULL},ContextVerb::perform, NULL, NULL, NULL};
+ {{NULL},ContextVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined zoom verb
* is called
*/
SPActionEventVector ZoomVerb::vector =
- {{NULL},ZoomVerb::perform, NULL, NULL, NULL};
+ {{NULL},ZoomVerb::perform, NULL, NULL, NULL, NULL};
/**
@@ -1735,28 +1750,28 @@ SPActionEventVector ZoomVerb::vector =
* is called
*/
SPActionEventVector DialogVerb::vector =
- {{NULL},DialogVerb::perform, NULL, NULL, NULL};
+ {{NULL},DialogVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined help verb
* is called
*/
SPActionEventVector HelpVerb::vector =
- {{NULL},HelpVerb::perform, NULL, NULL, NULL};
+ {{NULL},HelpVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined tutorial verb
* is called
*/
SPActionEventVector TutorialVerb::vector =
- {{NULL},TutorialVerb::perform, NULL, NULL, NULL};
+ {{NULL},TutorialVerb::perform, NULL, NULL, NULL, NULL};
/**
* Action vector to define functions called if a staticly defined tutorial verb
* is called
*/
SPActionEventVector TextVerb::vector =
- {{NULL},TextVerb::perform, NULL, NULL, NULL};
+ {{NULL},TextVerb::perform, NULL, NULL, NULL, NULL};
/* *********** Effect Last ********** */
@@ -1785,7 +1800,7 @@ public:
* The vector to attach in the last effect verb.
*/
SPActionEventVector EffectLastVerb::vector =
- {{NULL},EffectLastVerb::perform, NULL, NULL, NULL};
+ {{NULL},EffectLastVerb::perform, NULL, NULL, NULL, NULL};
/** \brief Create an action for a \c EffectLastVerb
\param view Which view the action should be created for
@@ -1854,7 +1869,7 @@ public:
* The vector to attach in the fit canvas verb.
*/
SPActionEventVector FitCanvasVerb::vector =
- {{NULL},FitCanvasVerb::perform, NULL, NULL, NULL};
+ {{NULL},FitCanvasVerb::perform, NULL, NULL, NULL, NULL};
/** \brief Create an action for a \c FitCanvasVerb
\param view Which view the action should be created for
@@ -2312,9 +2327,9 @@ Verb *Verb::_base_verbs[] = {
/* Effect */
new EffectLastVerb(SP_VERB_EFFECT_LAST, "EffectLast", N_("Previous Effect"),
- N_("Repeat the last effect with the same settings"), NULL/*"tutorial_tips"*/),
+ N_("Repeat the last effect with the same settings"), NULL),
new EffectLastVerb(SP_VERB_EFFECT_LAST_PREF, "EffectLastPref", N_("Previous Effect Settings..."),
- N_("Repeat the last effect with new settings"), NULL/*"tutorial_tips"*/),
+ N_("Repeat the last effect with new settings"), NULL),
/* Fit Page */
new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION, "FitCanvasToSelection", N_("Fit Page to Selection"),
diff --git a/src/verbs.h b/src/verbs.h
index 8474203f6..fa232280b 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -16,6 +16,7 @@
#include "require-config.h" /* HAVE_GTK_WINDOW_FULLSCREEN */
#include "helper/helper-forward.h"
#include "forward.h"
+#include <glibmm/ustring.h>
/** \brief This anonymous enum is used to provide a list of the Verbs
which are defined staticly in the verb files. There may be
@@ -380,6 +381,7 @@ public:
void delete_view (Inkscape::UI::View::View * view);
void sensitive (SPDocument * in_doc = NULL, bool in_sensitive = true);
+ void name (SPDocument * in_doc = NULL, Glib::ustring in_name = "");
// Yes, multiple public, protected and private sections are bad. We'll clean that up later
protected:
diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp
index 42775213a..f9e854302 100644
--- a/src/widgets/button.cpp
+++ b/src/widgets/button.cpp
@@ -52,7 +52,8 @@ SPActionEventVector button_event_vector = {
NULL,
sp_button_action_set_active,
sp_button_action_set_sensitive,
- sp_button_action_set_shortcut
+ sp_button_action_set_shortcut,
+ NULL
};
GtkType