Added all the "Command" stuff.

This commit is contained in:
David Capello 2007-09-23 19:08:27 +00:00
parent a880a41ead
commit 447451e374
2 changed files with 46 additions and 67 deletions

View File

@ -29,6 +29,7 @@
#include "jinete/message.h" #include "jinete/message.h"
#include "jinete/widget.h" #include "jinete/widget.h"
#include "commands/commands.h"
#include "core/core.h" #include "core/core.h"
#include "modules/chkmthds.h" #include "modules/chkmthds.h"
#include "modules/gui.h" #include "modules/gui.h"
@ -38,57 +39,44 @@
typedef struct MenuItem typedef struct MenuItem
{ {
char *script; Command *command;
CheckMethod check_method; char *argument;
} MenuItem; } MenuItem;
static int menuitem_type (void); static int menuitem_type(void);
static bool menuitem_msg_proc (JWidget widget, JMessage msg); static bool menuitem_msg_proc(JWidget widget, JMessage msg);
/** /**
* A widget that represent a menu item of the application. * A widget that represent a menu item of the application.
* *
* It's like a jmenuitem, but it has a extra properties: the script to * It's like a jmenuitem, but it has a extra properties: the name of
* be executed and a method to check the status of the menu-item. * the command to be executed when it's clicked (also that command is
* used to check the availability of the command).
* *
* @see jmenuitem_new * @see jmenuitem_new
*/ */
JWidget menuitem_new(const char *text) JWidget menuitem_new(const char *text,
Command *command,
const char *argument)
{ {
JWidget widget = jmenuitem_new(text); JWidget widget = jmenuitem_new(text);
MenuItem *menuitem = jnew0(MenuItem, 1); MenuItem *menuitem = jnew0(MenuItem, 1);
jwidget_add_hook(widget, menuitem_type(), menuitem->command = command;
menuitem_msg_proc, menuitem); menuitem->argument = argument ? jstrdup(argument): NULL;
jwidget_add_hook(widget,
menuitem_type(),
menuitem_msg_proc,
menuitem);
return widget; return widget;
} }
const char *menuitem_get_script(JWidget widget) Command *menuitem_get_command(JWidget widget)
{ {
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type()); MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
return menuitem->command;
return menuitem->script;
}
void menuitem_set_script(JWidget widget, const char *format, ...)
{
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
char buf[4096];
va_list ap;
va_start(ap, format);
vsprintf(buf, format, ap);
va_end(ap);
menuitem->script = jstrdup(buf);
}
void menuitem_set_check_method(JWidget widget, CheckMethod check_method)
{
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
menuitem->check_method = check_method;
} }
static int menuitem_type(void) static int menuitem_type(void)
@ -104,13 +92,9 @@ static bool menuitem_msg_proc(JWidget widget, JMessage msg)
switch (msg->type) { switch (msg->type) {
case JM_DESTROY: { case JM_DESTROY: {
MenuItem *menuitem = jwidget_get_data (widget, menuitem_type ()); MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
if (menuitem->argument)
if (menuitem->script) { jfree(menuitem->argument);
jfree(menuitem->script);
menuitem->script = NULL;
}
jfree(menuitem); jfree(menuitem);
break; break;
} }
@ -118,14 +102,20 @@ static bool menuitem_msg_proc(JWidget widget, JMessage msg)
case JM_OPEN: { case JM_OPEN: {
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type()); MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
if (menuitem->check_method) { if (menuitem->command) {
/* call the check method */ /* enabled? */
if ((*menuitem->check_method)(widget)) if (command_is_enabled(menuitem->command,
/* enable the widget */ menuitem->argument))
jwidget_enable(widget); jwidget_enable(widget);
else else
/* disable it */
jwidget_disable(widget); jwidget_disable(widget);
/* selected? */
if (command_is_selected(menuitem->command,
menuitem->argument))
jwidget_select(widget);
else
jwidget_deselect(widget);
} }
break; break;
} }
@ -133,31 +123,20 @@ static bool menuitem_msg_proc(JWidget widget, JMessage msg)
case JM_CLOSE: { case JM_CLOSE: {
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type()); MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
/* enable (to get the keyboard bindinds) */ /* disable the menu (the keyboard shortcuts are processed by "manager_msg_proc") */
if (menuitem->check_method) if (menuitem->command)
jwidget_enable(widget); jwidget_disable(widget);
break; break;
} }
case JM_SIGNAL: case JM_SIGNAL:
if (msg->signal.num == JI_SIGNAL_MENUITEM_SELECT) { if (msg->signal.num == JI_SIGNAL_MENUITEM_SELECT) {
/* call the script of the selected menu item */
MenuItem *menuitem = jwidget_get_data(widget, menuitem_type()); MenuItem *menuitem = jwidget_get_data(widget, menuitem_type());
if (menuitem->script) { if (menuitem->command && command_is_enabled(menuitem->command,
if (menuitem->check_method) { menuitem->argument)) {
/* call the check method */ command_execute(menuitem->command,
if (!(*menuitem->check_method)(widget)) menuitem->argument);
return FALSE;
}
PRINTF("Calling menu \"%s\" script\n", widget->text);
rebuild_lock();
do_script_expr(menuitem->script);
rebuild_unlock();
PRINTF("Done with menu call\n");
return TRUE; return TRUE;
} }
} }

View File

@ -20,13 +20,13 @@
#define WIDGETS_MENU_H #define WIDGETS_MENU_H
#include "jinete/base.h" #include "jinete/base.h"
#include "modules/chkmthds.h"
JWidget menuitem_new(const char *text); struct Command;
const char *menuitem_get_script(JWidget menuitem); JWidget menuitem_new(const char *text,
void menuitem_set_script(JWidget menuitem, const char *format, ...); struct Command *command,
const char *argument);
void menuitem_set_check_method(JWidget menuitem, CheckMethod check_method); Command *menuitem_get_command(JWidget menuitem);
#endif /* WIDGETS_MENU_H */ #endif /* WIDGETS_MENU_H */