6 days ago
implement menu toggleitem (QT)
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2014 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <QMenuBar> #include <QAction> #include "menu.h" #include "toolkit.h" #include "../common/context.h" #include "../common/menu.h" #include "../ui/properties.h" #include "../ui/window.h" #include "stock.h" #include "container.h" static ui_menu_add_f createMenuItem[] = { /* UI_MENU */ add_menu_widget, /* UI_MENU_ITEM */ add_menuitem_widget, /* UI_MENU_CHECK_ITEM */ add_checkitem_widget, /* UI_MENU_RADIO_ITEM */ add_radioitem_widget, /* UI_MENU_ITEM_LIST */ add_menuitem_list_widget, /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget, /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget, /* UI_MENU_SEPARATOR */ add_menuseparator_widget }; /* * create all menu child items */ static void add_menu_items(QMenu *parent, int i, UiMenu *menu, UiObject *obj) { UiMenuItemI *it = menu->items_begin; int index = 0; while(it) { createMenuItem[it->type](parent, index, it, obj); it = it->next; index++; } } void add_menu_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { UiMenu *m = (UiMenu*)item; QMenu *menu = parent->addMenu(m->label); add_menu_items(menu, i, m, obj); } static UiAction* create_action( UiObject *obj, const char *icon, const char *label, ui_callback callback, void *userdata, int *states) { QString str = QString::fromUtf8(label); UiAction *action = new UiAction(obj, str, callback, userdata); if(icon) { action->setIcon(QIcon::fromTheme(icon)); action->setIconVisibleInMenu(true); } if(states) { size_t nstates = uic_group_array_size(states); uic_add_group_widget_i(obj->ctx, action, (ui_enablefunc)ui_action_enable, states, nstates); action->setEnabled(false); } return action; } void add_menuitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { UiMenuItem *it = (UiMenuItem*)item; UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->groups); parent->addAction(action); QObject::connect(action, SIGNAL(triggered()), action, SLOT(trigger())); } void add_menuseparator_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { parent->addSeparator(); } void add_checkitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { UiMenuCheckItem *it = (UiMenuCheckItem*)item; UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->groups); parent->addAction(action); action->setCheckable(true); action->prepare_event = ui_checkableaction_prepare_event; UiVar* var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER); if(var) { UiInteger *value = (UiInteger*)var->value; value->obj = action; value->get = ui_checkableaction_get; value->set = ui_checkableaction_set; action->setChecked((bool)value->value); } } void add_radioitem_widget(QMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { } void add_checkitemnv_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { } void add_menuitem_list_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) { } void ui_add_menus(UiObject *obj, QMainWindow *window) { UiMenu *menus_begin = uic_get_menu_list(); if(menus_begin == NULL) { return; } QMenuBar *mb = window->menuBar(); UiMenu *ls = menus_begin; while(ls) { if(ls->item.type == UI_MENU) { QMenu *menu = mb->addMenu(ls->label); add_menu_items(menu, 0, ls, obj); } ls = (UiMenu*)ls->item.next; } } void ui_checkableaction_prepare_event(UiEvent *event, UiAction *action) { if(action->var) { event->eventdata = action->var->value; } event->intval = action->isChecked(); } int64_t ui_checkableaction_get(UiInteger *value) { UiAction *action= (UiAction*)value->obj; value->value = action->isChecked(); return value->value; } void ui_checkableaction_set(UiInteger *value, int64_t i) { UiAction *action = (UiAction*)value->obj; value->value = i; if(i != 0) { action->setChecked((bool)i); } }