void Menu::create(Window &parent, const string &text) {
  menu->parent = &parent;
  if(menu->parent->window->defaultFont) menu->setFont(*menu->parent->window->defaultFont);
  menu->setTitle(QString::fromUtf8(text));
  parent.window->menuBar->addMenu(menu);
}

void Menu::create(Menu &parent, const string &text) {
  menu->parent = parent.menu->parent;
  if(menu->parent->window->defaultFont) menu->setFont(*menu->parent->window->defaultFont);
  menu->setTitle(QString::fromUtf8(text));
  parent.menu->addMenu(menu);
}

bool Menu::visible() {
  return menu->isVisible();
}

void Menu::setVisible(bool visible) {
  menu->setVisible(visible);
}

bool Menu::enabled() {
  return menu->isEnabled();
}

void Menu::setEnabled(bool enabled) {
  menu->setEnabled(enabled);
}

Menu::Menu() {
  menu = new Menu::Data(*this);
}

void MenuSeparator::create(Menu &parent) {
  menuSeparator->action = parent.menu->addSeparator();
}

bool MenuSeparator::visible() {
  return menuSeparator->action->isVisible();
}

void MenuSeparator::setVisible(bool visible) {
  menuSeparator->action->setVisible(visible);
}

bool MenuSeparator::enabled() {
  return menuSeparator->action->isEnabled();
}

void MenuSeparator::setEnabled(bool enabled) {
  menuSeparator->action->setEnabled(enabled);
}

MenuSeparator::MenuSeparator() {
  menuSeparator = new MenuSeparator::Data(*this);
}

void MenuItem::create(Menu &parent, const string &text) {
  menuItem->setText(QString::fromUtf8(text));
  menuItem->connect(menuItem, SIGNAL(triggered()), SLOT(onTick()));
  parent.menu->addAction(menuItem);
}

bool MenuItem::visible() {
  return menuItem->isVisible();
}

void MenuItem::setVisible(bool visible) {
  menuItem->setVisible(visible);
}

bool MenuItem::enabled() {
  return menuItem->isEnabled();
}

void MenuItem::setEnabled(bool enabled) {
  menuItem->setEnabled(enabled);
}

MenuItem::MenuItem() {
  menuItem = new MenuItem::Data(*this);
}

void MenuCheckItem::create(Menu &parent, const string &text) {
  menuCheckItem->setText(QString::fromUtf8(text));
  menuCheckItem->setCheckable(true);
  menuCheckItem->connect(menuCheckItem, SIGNAL(triggered()), SLOT(onTick()));
  parent.menu->addAction(menuCheckItem);
}

bool MenuCheckItem::visible() {
  return menuCheckItem->isVisible();
}

void MenuCheckItem::setVisible(bool visible) {
  menuCheckItem->setVisible(visible);
}

bool MenuCheckItem::enabled() {
  return menuCheckItem->isEnabled();
}

void MenuCheckItem::setEnabled(bool enabled) {
  menuCheckItem->setEnabled(enabled);
}

bool MenuCheckItem::checked() {
  return menuCheckItem->isChecked();
}

void MenuCheckItem::setChecked(bool checked) {
  menuCheckItem->setChecked(checked);
}

MenuCheckItem::MenuCheckItem() {
  menuCheckItem = new MenuCheckItem::Data(*this);
}

void MenuRadioItem::create(Menu &parent, const string &text) {
  menuRadioItem->parent = &parent;
  menuRadioItem->actionGroup = new QActionGroup(0);
  menuRadioItem->actionGroup->addAction(menuRadioItem);
  menuRadioItem->setText(QString::fromUtf8(text));
  menuRadioItem->setCheckable(true);
  menuRadioItem->setChecked(true);
  menuRadioItem->connect(menuRadioItem, SIGNAL(changed()), SLOT(onTick()));
  menuRadioItem->parent->menu->addAction(menuRadioItem);
}

void MenuRadioItem::create(MenuRadioItem &parent, const string &text) {
  menuRadioItem->parent = parent.menuRadioItem->parent;
  menuRadioItem->actionGroup = parent.menuRadioItem->actionGroup;
  menuRadioItem->actionGroup->addAction(menuRadioItem);
  menuRadioItem->setText(QString::fromUtf8(text));
  menuRadioItem->setCheckable(true);
  menuRadioItem->connect(menuRadioItem, SIGNAL(changed()), SLOT(onTick()));
  menuRadioItem->parent->menu->addAction(menuRadioItem);
}

bool MenuRadioItem::visible() {
  return menuRadioItem->isVisible();
}

void MenuRadioItem::setVisible(bool visible) {
  menuRadioItem->setVisible(visible);
}

bool MenuRadioItem::enabled() {
  return menuRadioItem->isEnabled();
}

void MenuRadioItem::setEnabled(bool enabled) {
  menuRadioItem->setEnabled(enabled);
}

bool MenuRadioItem::checked() {
  return menuRadioItem->isChecked();
}

void MenuRadioItem::setChecked() {
  object->locked = true;
  menuRadioItem->setChecked(true);
  object->locked = false;
}

MenuRadioItem::MenuRadioItem() {
  menuRadioItem = new MenuRadioItem::Data(*this);
}
