void Command_manager::undo() { INVARIANT(undo_available(), "undo() called with empty history"); auto& last_cmd = _commands.at(_history_size-1); last_cmd->undo(); _history_size--; }
/* This is the real implementation of the sensitivity update. TODO: move it to the DDisplay as it belongs to it IMHO */ void diagram_update_menu_sensitivity (Diagram *dia) { gint selected_count = g_list_length (dia->data->selected); DDisplay *ddisp = ddisplay_active(); gboolean focus_active = (get_active_focus(dia->data) != NULL); gboolean textedit_active = ddisp ? textedit_mode(ddisp) : FALSE; GtkAction *action; /* Edit menu */ if ((action = menus_get_action ("EditUndo")) != NULL) gtk_action_set_sensitive (action, dia ? undo_available(dia->undo, TRUE) : FALSE); if ((action = menus_get_action ("EditRedo")) != NULL) gtk_action_set_sensitive (action, dia ? undo_available(dia->undo, FALSE) : FALSE); if ((action = menus_get_action ("EditCopy")) != NULL) gtk_action_set_sensitive (action, textedit_active || selected_count > 0); if ((action = menus_get_action ("EditCut")) != NULL) gtk_action_set_sensitive (action, textedit_mode(ddisp) || selected_count > 0); if ((action = menus_get_action ("EditPaste")) != NULL) gtk_action_set_sensitive (action, textedit_active || cnp_exist_stored_objects()); if ((action = menus_get_action ("EditDelete")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("EditDuplicate")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("EditCopytext")) != NULL) gtk_action_set_sensitive (action, focus_active); if ((action = menus_get_action ("EditCuttext")) != NULL) gtk_action_set_sensitive (action, focus_active); if ((action = menus_get_action ("EditPastetext")) != NULL) gtk_action_set_sensitive (action, focus_active); /* Objects menu */ if ((action = menus_get_action ("ObjectsSendtoback")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsBringtofront")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsSendbackwards")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsBringforwards")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsLayerAbove")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsLayerBelow")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsGroup")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsUngroup")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_groups (dia)); if ((action = menus_get_action ("ObjectsParent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_can_parent (dia)); if ((action = menus_get_action ("ObjectsUnparent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_children (dia)); if ((action = menus_get_action ("ObjectsUnparentchildren")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_parents (dia)); if ((action = menus_get_action ("ObjectsProperties")) != NULL) gtk_action_set_sensitive (action, selected_count > 0); /* Objects->Align menu */ if ((action = menus_get_action ("ObjectsAlignLeft")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignCenter")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignRight")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignSpreadouthorizontally")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignAdjacent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignTop")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignMiddle")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignBottom")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignSpreadoutvertically")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignStacked")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignConnected")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); /* Select menu */ if ((action = menus_get_action ("SelectAll")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectNone")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectInvert")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectTransitive")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectConnected")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectSametype")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectReplace")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectUnion")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectIntersection")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectRemove")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectInverse")) != NULL) gtk_action_set_sensitive (action, !textedit_active); /* Tools menu - toolbox actions */ gtk_action_group_set_sensitive (menus_get_tool_actions (), !textedit_active); /* View menu - should not need disabling yet */ }