Cześć wszystkim
Piszę pierwszy swój projekt z GUI w oparciu o GTK2+ (wiem, że jest GTK3, ale za późno się zorientowałem i nie chcę już po prostu zmieniać koncepcji) i przy budowaniu menu natrafiłem na switche. Na stacku przeczytałem, że switche ogólnie się są anty-patternem, ale coś mi mówi, że takie rozwiązanie jeśli chodzi o budowanie każdego menu z osobna jest zbyt rozbudowane. Chciałbym się dowiedzieć czy to podejście ze switchami jest prawidłowe czy jest jakieś inne rozwiązanie, żeby menu zbudować.
Tak wygląda kod jednego z sześciu menu. Oczywiście liczba itemów różni się między każdym z menu, a więc ilość case'ów się zmienia.
void add_items_to_file_menu(struct f_menu *file_menu, GtkAccelGroup *accel_group)
{
GtkWidget *tmp = NULL;
for (int i = 0; i < 7; i++) {
switch (i) {
case 0:
{
tmp = file_menu->new_file = create_item(GTK_STOCK_NEW);
gtk_widget_add_accelerator(file_menu->new_file, "activate", accel_group,
GDK_n, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
} break;
case 1:
{
tmp = file_menu->open = create_item(GTK_STOCK_OPEN);
gtk_widget_add_accelerator(file_menu->open, "activate", accel_group,
GDK_o, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
} break;
case 2:
{
tmp = file_menu->save = create_item(GTK_STOCK_SAVE);
gtk_widget_add_accelerator(file_menu->save, "activate", accel_group,
GDK_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
} break;
case 3:
{
tmp = file_menu->save_as = create_item( GTK_STOCK_SAVE_AS);
gtk_widget_add_accelerator(file_menu->save_as, "activate", accel_group,
GDK_s, (GDK_SHIFT_MASK + GDK_CONTROL_MASK),
GTK_ACCEL_VISIBLE);
} break;
case 4: tmp = file_menu->export_file = gtk_menu_item_new_with_label("Export..."); break;
case 5:
{
tmp = file_menu->close = create_item(GTK_STOCK_CLOSE);
gtk_widget_add_accelerator(file_menu->close, "activate", accel_group,
GDK_w, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
} break;
case 6:
{
tmp = file_menu->quit = create_item(GTK_STOCK_QUIT);
gtk_widget_add_accelerator(file_menu->quit, "activate", accel_group,
GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
} break;
}
gtk_menu_shell_append(GTK_MENU_SHELL(file_menu->container), tmp);
}
}
Switch jest wykorzystywany po to, aby ustalić kolejność ustawienia widgetów w menu. Czy to jest dobre podejście do tego typu problemów pisząc w języku C? Jeśli nie to czy jest jakieś inne rozwiązanie?