diff --git a/bazaar/XMLMenu/XMLCommand.cpp b/bazaar/XMLMenu/XMLCommand.cpp index 13bbba00f..dbbf8baa9 100644 --- a/bazaar/XMLMenu/XMLCommand.cpp +++ b/bazaar/XMLMenu/XMLCommand.cpp @@ -12,7 +12,7 @@ XMLCommand::XMLCommand(XMLCommand const &c, int) ctrlSize = c.ctrlSize; callback = c.callback; menuCallback = c.menuCallback; - menuTb <<= c.menuTb; + menuTb = One(new XMLToolBar(*c.menuTb, 1)); // @@ was deep copy operator <<= enabled = c.enabled; custom = c.custom; commandString = c.commandString; diff --git a/bazaar/XMLMenu/XMLMenuEditor.cpp b/bazaar/XMLMenu/XMLMenuEditor.cpp index 15670372a..2ffce2017 100644 --- a/bazaar/XMLMenu/XMLMenuEditor.cpp +++ b/bazaar/XMLMenu/XMLMenuEditor.cpp @@ -219,15 +219,15 @@ void XMLBarEditor::fieldsModCb(void) return; if(i == 0) { - bar->SetName(itemPane.label); + bar->SetName(~itemPane.label); barTree.SetRoot(Null, itemPane.label); return; } XMLToolBarItem item(ValueTo(barTree.Get(i)), 0); - item.label = itemPane.label; - item.commandId = itemPane.cmdId; - item.tooltip = itemPane.tooltip; + item.label = ~itemPane.label; + item.commandId = ~itemPane.cmdId; + item.tooltip = ~itemPane.tooltip; item.icon = curIcon; TreeCtrl::Node node(item.GetIcon(), RawDeepToValue(item), item.GetLabel()); barTree.SetNode(i, node); @@ -469,7 +469,7 @@ void XMLBarsEditor::barContextAddCb(void) add.Close(); if(res == IDOK) { - toolBars.Add(~add.barName, XMLToolBar()); + toolBars.AddPick(~add.barName, XMLToolBar()); barListPane.barList.Add(~add.barName); barListPane.barList.SetCursor(barListPane.barList.GetCount() - 1); } @@ -646,7 +646,7 @@ void XMLMenuEditor::cmdContextAddCb(void) edit.Close(); if(res == IDOK) { - commands.Add(edit.cmdId, edit.cmdStr); + commands.Add(~edit.cmdId, ~edit.cmdStr); FillCmdList(); cmdPane.commandList.SetCursor(cmdPane.commandList.Find(~edit.cmdId)); } @@ -662,7 +662,7 @@ void XMLMenuEditor::cmdContextEditCb(void) if(res == IDOK) { int idx = commands.Find(~edit.cmdId); - commands[idx].SetCommandString(edit.cmdStr); + commands[idx].SetCommandString(~edit.cmdStr); FillCmdList(); cmdPane.commandList.SetCursor(cmdPane.commandList.Find(~edit.cmdId)); } diff --git a/bazaar/XMLMenu/XMLMenuEditor.h b/bazaar/XMLMenu/XMLMenuEditor.h index 32ddc470f..975e78659 100644 --- a/bazaar/XMLMenu/XMLMenuEditor.h +++ b/bazaar/XMLMenu/XMLMenuEditor.h @@ -97,7 +97,7 @@ class XMLBarAdd : public WithBarAddLayout Exclamation(t_("Invalid empty bar name")); return; } - if(bars.Find(barName) >= 0) + if(bars.Find(~barName) >= 0) { Exclamation(Format(t_("Bar '%s' already present"), ~barName)); return; @@ -191,7 +191,7 @@ class XMLCmdEdit : public WithCmdEditLayout Exclamation(t_("Invalid empty command Id")); return; } - if(adding && cmds.Has(cmdId)) + if(adding && cmds.Has(~cmdId)) { Exclamation(Format(t_("Command '%s' already present"), ~cmdId)); return; diff --git a/bazaar/XMLMenu/XMLToolBar.cpp b/bazaar/XMLMenu/XMLToolBar.cpp index 93ac196a3..f151c9513 100644 --- a/bazaar/XMLMenu/XMLToolBar.cpp +++ b/bazaar/XMLMenu/XMLToolBar.cpp @@ -13,28 +13,34 @@ XMLToolBarItem::XMLToolBarItem() icon = Null; tooltip = ""; isSeparator = false; + internalCb.Clear(); subMenu.Clear(); } // copy constructor -XMLToolBarItem::XMLToolBarItem(const XMLToolBarItem &item, int dummy) +XMLToolBarItem::XMLToolBarItem(const XMLToolBarItem &item, int) { commandId = item.commandId; label = item.label; icon = item.icon; tooltip = item.tooltip; isSeparator = item.isSeparator; - subMenu <<= item.subMenu; + internalCb = item.internalCb; + if(!item.subMenu.IsEmpty()) + subMenu = One(new XMLToolBar(*item.subMenu, 1)); // @@ it was <<= deep copy.... + else + subMenu.Clear(); } // pick constructor -XMLToolBarItem::XMLToolBarItem(XMLToolBarItem rval_ item) +XMLToolBarItem::XMLToolBarItem(XMLToolBarItem &&item) { commandId = item.commandId; label = item.label; icon = item.icon; tooltip = item.tooltip; isSeparator = item.isSeparator; + internalCb = item.internalCb; subMenu = pick(item.subMenu); } @@ -113,7 +119,7 @@ XMLToolBar::XMLToolBar() } // pick constructor -XMLToolBar::XMLToolBar(XMLToolBar pick_ &tb) +XMLToolBar::XMLToolBar(XMLToolBar &&tb) { name = tb.name; items = pick(tb.items); @@ -122,17 +128,17 @@ XMLToolBar::XMLToolBar(XMLToolBar pick_ &tb) } // copy constructor -XMLToolBar::XMLToolBar(XMLToolBar const &tb, int dummy) +XMLToolBar::XMLToolBar(XMLToolBar const &tb, int) { name = tb.name; - items <<= tb.items; + items = clone(tb.items); state = tb.state; prevState = tb.prevState; position = tb.position; } -// copy operator -XMLToolBar &XMLToolBar::operator=(XMLToolBar pick_ &tb) +// pick operator = +XMLToolBar &XMLToolBar::operator=(XMLToolBar &&tb) { name = tb.name; items = pick(tb.items); @@ -142,6 +148,17 @@ XMLToolBar &XMLToolBar::operator=(XMLToolBar pick_ &tb) return *this; } +// copy operator = +XMLToolBar const &XMLToolBar::operator=(XMLToolBar const &tb) +{ + name = tb.name; + items = clone(tb.items); + state = tb.state; + prevState = tb.prevState; + position = tb.position; + return *this; +} + // add an entry, various ways XMLToolBar &XMLToolBar::Add(String const &commandId) { @@ -228,22 +245,22 @@ XMLToolBar &XMLToolBar::Add(String const &commandId, String const &label, Image } // add a submenu entry -XMLToolBar &XMLToolBar::Add(String const &subLabel, XMLToolBar pick_ &subMenu) +XMLToolBar &XMLToolBar::Add(String const &subLabel, XMLToolBar const &subMenu) { XMLToolBarItem *item = new XMLToolBarItem; item->label = subLabel; - item->subMenu = new XMLToolBar(subMenu); + item->subMenu = new XMLToolBar(clone(subMenu)); item->subMenu->name = subLabel; items.Add(item); return *this; } -XMLToolBar &XMLToolBar::Add(String const &subLabel, Image const &icon, XMLToolBar pick_ &subMenu) +XMLToolBar &XMLToolBar::Add(String const &subLabel, Image const &icon, XMLToolBar const &subMenu) { XMLToolBarItem *item = new XMLToolBarItem; item->label = subLabel; item->icon = icon; - item->subMenu = new XMLToolBar(subMenu); + item->subMenu = new XMLToolBar(clone(subMenu)); item->subMenu->name = subLabel; items.Add(item); return *this; @@ -260,7 +277,7 @@ XMLToolBar &XMLToolBar::Add(Callback1 bar) { XMLToolBar tb; bar(tb); - items.Append(tb.items); + items.AppendPick(pick(tb.items)); return *this; } diff --git a/bazaar/XMLMenu/XMLToolBar.h b/bazaar/XMLMenu/XMLToolBar.h index 6c8f10d44..d74fc7061 100644 --- a/bazaar/XMLMenu/XMLToolBar.h +++ b/bazaar/XMLMenu/XMLToolBar.h @@ -100,13 +100,16 @@ class XMLToolBar : DeepCopyOption XMLToolBar(); // pick constructor - XMLToolBar(XMLToolBar pick_ &tb); + XMLToolBar(XMLToolBar &&tb); // copy constructor - XMLToolBar(XMLToolBar const &tb, int dummy); + XMLToolBar(XMLToolBar const &tb, int); - // copy operator - XMLToolBar &operator=(XMLToolBar pick_ &tb); + // pick operator = + XMLToolBar &operator=(XMLToolBar &&tb); + + // copy operator = + XMLToolBar const &operator=(XMLToolBar const &tb); // add an entry, various ways XMLToolBar &SetName(String const &_name) { name = _name; return *this; } @@ -123,8 +126,8 @@ class XMLToolBar : DeepCopyOption XMLToolBar &Add(String const &commandId, String const &label, Image const &icon, String const &tooltip); // add a submenu entry - XMLToolBar &Add(String const &subLabel, XMLToolBar pick_ &subMenu); - XMLToolBar &Add(String const &subLabel, Image const &icon, XMLToolBar pick_ &subMenu); + XMLToolBar &Add(String const &subLabel, XMLToolBar const &subMenu); + XMLToolBar &Add(String const &subLabel, Image const &icon, XMLToolBar const &subMenu); // creates a submenu entry XMLToolBar SubMenu(void); @@ -162,7 +165,7 @@ class XMLToolBar : DeepCopyOption // debugging stuff -- dumps bar content void Dump(int level = 0); #endif - rval_default(XMLToolBar); +// rval_default(XMLToolBar); }; //////////////////////////////////////////////////////////////////////////////////// diff --git a/bazaar/XMLMenu/XMLToolBarFloating.cpp b/bazaar/XMLMenu/XMLToolBarFloating.cpp index d5720164d..23bf1100c 100644 --- a/bazaar/XMLMenu/XMLToolBarFloating.cpp +++ b/bazaar/XMLMenu/XMLToolBarFloating.cpp @@ -7,9 +7,17 @@ NAMESPACE_UPP // handler for window drag events void XMLToolBarFloating::WindowDragged(DragWindow::DragEvent e, Point p) { + // avoid re-entering - caused a sigseg error + static bool inside = false; + if(inside) + return; + inside = true; + XMLMenuInterface *iFace = toolBar->GetInterface(); if(iFace && e == DragWindow::DRAG_DRAG) iFace->FloatingDraggedEvent(*toolBar, p); + + inside = false; } XMLToolBarFloating::XMLToolBarFloating(XMLToolBarCtrl &tb, Point p)