internal void RestoreStatus(ArrayList status, int index) { int pos = (int)status [index]; if (pos >= menuItems.Count) { return; } ActionMenuItem item = (ActionMenuItem)menuItems [pos]; if (index == status.Count - 1) { // The last position in the status is the selected item item.Select(); if (item.Node.Action != null && item.Node.Action.Name.Length == 0) { // Then only case when there can have an action when an empty name // is when the user clicked on the "add action" link. In this case, // start editing the item again item.EditingDone += OnEditingDone; item.StartEditing(); } } else { item.ShowSubmenu(); if (OpenSubmenu != null) { OpenSubmenu.RestoreStatus(status, index + 1); } } }
void OnAddClicked(object s, Gtk.ButtonPressEventArgs args) { Wrapper.Action ac = (Wrapper.Action)ObjectWrapper.Create(project, new Gtk.Action("", "", null, null)); ActionMenuItem item = InsertAction(ac, actionGroup.Actions.Count); item.EditingDone += OnEditDone; item.Select(); item.StartEditing(); HideAddLabel(); ShowAll(); }
void Fill() { menuItems.Clear(); uint n = 0; ActionMenuItem editItem = null; if (nodes.Count > 0) { foreach (ActionTreeNode node in nodes) { ActionMenuItem item = new ActionMenuItem(wrapper, this, node); item.KeyPressEvent += OnItemKeyPress; item.Attach(table, n++, 0); menuItems.Add(item); // If adding an action with an empty name, select and start editing it // if (node.Action != null && node.Action.Name.Length == 0) // editItem = item; } } emptyLabel = new Gtk.EventBox(); emptyLabel.VisibleWindow = false; Gtk.Label label = new Gtk.Label(); label.Xalign = 0; label.Markup = "<i><span foreground='darkgrey'>" + Catalog.GetString("Click to create action") + "</span></i>"; emptyLabel.Add(label); emptyLabel.ButtonPressEvent += OnAddClicked; table.Attach(emptyLabel, 1, 2, n, n + 1); ShowAll(); if (editItem != null) { // If there is an item with an empty action, it means that it was an item that was // being edited. Restart the editing now. GLib.Timeout.Add(200, delegate { editItem.Select(); editItem.EditingDone += OnEditingDone; editItem.StartEditing(); return(false); }); } }
ActionTreeNode InsertAction(int pos) { using (wrapper.UndoManager.AtomicChange) { Wrapper.Action ac = (Wrapper.Action)ObjectWrapper.Create(wrapper.Project, new Gtk.Action("", "", null, null)); ActionTreeNode newNode = new ActionTreeNode(Gtk.UIManagerItemType.Menuitem, null, ac); nodes.Insert(pos, newNode); ActionMenuItem item = FindMenuItem(newNode); item.EditingDone += OnEditingDone; item.Select(); item.StartEditing(); emptyLabel.Hide(); if (wrapper.LocalActionGroups.Count == 0) { wrapper.LocalActionGroups.Add(new ActionGroup("Default")); } wrapper.LocalActionGroups [0].Actions.Add(ac); return(newNode); } }
void InsertAction(int pos) { Widget wrapper = Widget.Lookup(this); using (wrapper.UndoManager.AtomicChange) { Wrapper.Action ac = (Wrapper.Action)ObjectWrapper.Create(wrapper.Project, new Gtk.Action("", "", null, null)); ActionTreeNode node = new ActionTreeNode(Gtk.UIManagerItemType.Menu, "", ac); actionTree.Children.Insert(pos, node); ActionMenuItem aitem = FindMenuItem(node); aitem.EditingDone += OnEditingDone; aitem.Select(); aitem.StartEditing(); if (wrapper.LocalActionGroups.Count == 0) { wrapper.LocalActionGroups.Add(new ActionGroup("Default")); } wrapper.LocalActionGroups[0].Actions.Add(ac); } }
void ProcessKey (ActionMenuItem item, Gdk.Key key, Gdk.ModifierType modifier) { int pos = menuItems.IndexOf (item); switch (key) { case Gdk.Key.Up: if (pos > 0) ((ActionMenuItem)menuItems[pos - 1]).Select (); else if (parentMenu.Widget is ActionMenuBar) { ActionMenuBar bar = (ActionMenuBar) parentMenu.Widget; bar.Select (parentNode); } break; case Gdk.Key.Down: if (pos < menuItems.Count - 1) ((ActionMenuItem)menuItems[pos + 1]).Select (); else if (pos == menuItems.Count - 1) { InsertAction (menuItems.Count); } break; case Gdk.Key.Right: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menuitem) { // Create a submenu using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menu; } item.Node.Action.NotifyChanged (); } if (item.HasSubmenu) { item.ShowSubmenu (); if (openSubmenu != null) openSubmenu.Select (null); } else if (parentNode != null) { ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf (parentNode); if (i < parentNode.ParentNode.Children.Count - 1) parentMB.DropMenu (parentNode.ParentNode.Children [i + 1]); } } break; case Gdk.Key.Left: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menu) { // Remove the submenu OpenSubmenu = null; using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menuitem; item.Node.Children.Clear (); } item.Node.Action.NotifyChanged (); break; } if (parentNode != null) { ActionMenu parentAM = parentMenu.Widget as ActionMenu; if (parentAM != null) { parentAM.Select (parentNode); } ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf (parentNode); if (i > 0) parentMB.DropMenu (parentNode.ParentNode.Children [i - 1]); } } break; case Gdk.Key.Return: item.EditingDone += OnEditingDone; item.StartEditing (); break; case Gdk.Key.Insert: if ((modifier & Gdk.ModifierType.ControlMask) != 0) InsertActionAt (item, true, true); else InsertActionAt (item, false, false); break; case Gdk.Key.Delete: DeleteAction (item); break; } }
void ProcessKey(ActionMenuItem item, Gdk.Key key, Gdk.ModifierType modifier) { int pos = menuItems.IndexOf(item); switch (key) { case Gdk.Key.Up: if (pos > 0) { ((ActionMenuItem)menuItems[pos - 1]).Select(); } else if (parentMenu.Widget is ActionMenuBar) { ActionMenuBar bar = (ActionMenuBar)parentMenu.Widget; bar.Select(parentNode); } break; case Gdk.Key.Down: if (pos < menuItems.Count - 1) { ((ActionMenuItem)menuItems[pos + 1]).Select(); } else if (pos == menuItems.Count - 1) { InsertAction(menuItems.Count); } break; case Gdk.Key.Right: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menuitem) { // Create a submenu using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menu; } item.Node.Action.NotifyChanged(); } if (item.HasSubmenu) { item.ShowSubmenu(); if (openSubmenu != null) { openSubmenu.Select(null); } } else if (parentNode != null) { ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf(parentNode); if (i < parentNode.ParentNode.Children.Count - 1) { parentMB.DropMenu(parentNode.ParentNode.Children [i + 1]); } } } break; case Gdk.Key.Left: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menu) { // Remove the submenu OpenSubmenu = null; using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menuitem; item.Node.Children.Clear(); } item.Node.Action.NotifyChanged(); break; } if (parentNode != null) { ActionMenu parentAM = parentMenu.Widget as ActionMenu; if (parentAM != null) { parentAM.Select(parentNode); } ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf(parentNode); if (i > 0) { parentMB.DropMenu(parentNode.ParentNode.Children [i - 1]); } } } break; case Gdk.Key.Return: item.EditingDone += OnEditingDone; item.StartEditing(); break; case Gdk.Key.Insert: if ((modifier & Gdk.ModifierType.ControlMask) != 0) { InsertActionAt(item, true, true); } else { InsertActionAt(item, false, false); } break; case Gdk.Key.Delete: DeleteAction(item); break; } }