#include #include #include #include #include #include #include #include #include using namespace std; /* ------------------------------------------------------------------------ A efectos de simplicidad, la definición de la clase, la definición de sus funciones miembro y el programa principal se mantienen en un único fichero. Sin embargo, no hay que olvidar que, en general, lo correcto es dividirlo en módulos y ficheros. ------------------------------------------------------------------------ */ class AsistenciaWin : public Fl_Window { public: AsistenciaWin(int x, int y); private: Fl_Check_Button *checkAsistencia; Fl_Round_Button *rbLA1, *rbLA2, *rbLA3; Fl_Button *btSalir; Fl_Box *boxGrupoLab; private: static void cbSalir(Fl_Widget *w, void *datos=NULL); static void cbGuardar(Fl_Widget *w, void *datos=NULL); static void cbCheckAsistencia(Fl_Widget *w, void *datos=NULL); private: void activarBotonesRadio(); void desactivarBotonesRadio(); bool guardarSeleccion(); }; AsistenciaWin::AsistenciaWin(int x, int y) : Fl_Window(x,y,200,200,"Asistencia a grupos de laboratorio") { begin(); checkAsistencia = new Fl_Check_Button(10,10,180,25,"&Asistencia regular"); checkAsistencia->callback(cbCheckAsistencia); checkAsistencia->value(true); rbLA1 = new Fl_Round_Button(30,60,60,25,"LA&1"); rbLA2 = new Fl_Round_Button(30,90,60,25,"LA&2"); rbLA3 = new Fl_Round_Button(30,120,60,25,"LA&3"); rbLA1->value(false); // ¿si el usuario no selecciona nada? rbLA1->type(FL_RADIO_BUTTON); rbLA2->type(FL_RADIO_BUTTON); rbLA3->type(FL_RADIO_BUTTON); checkAsistencia->do_callback(); boxGrupoLab = new Fl_Box(20,55,120,90,"Grupo Laboratorio:"); boxGrupoLab->box(FL_ENGRAVED_FRAME); boxGrupoLab->align(FL_ALIGN_TOP|FL_ALIGN_LEFT); btSalir = new Fl_Button(50,160,80,35,"&Terminar"); btSalir->callback(cbSalir); end(); } bool AsistenciaWin::guardarSeleccion() { ofstream file("seleccion.dat"); if (checkAsistencia->value()) { file << "Se asiste al grupo de laboratorio "; if (rbLA1->value()) file << "LA1"; else if (rbLA2->value()) file << "LA2"; else if (rbLA3->value()) file << "LA3"; else { fl_message("Si asistes a clase, indica a qué grupo de laboratorio"); return false; } return true; } else file << "No se asiste regularmente a clase"; file.close(); return true; } void AsistenciaWin::activarBotonesRadio() { boxGrupoLab->activate(); rbLA1->activate(); rbLA2->activate(); rbLA3->activate(); rbLA1->value(false); rbLA2->value(false); rbLA3->value(false); } void AsistenciaWin::desactivarBotonesRadio () { boxGrupoLab->deactivate(); rbLA1->deactivate(); rbLA2->deactivate(); rbLA3->deactivate(); } void AsistenciaWin::cbSalir(Fl_Widget *w, void *datos) { AsistenciaWin *v = (AsistenciaWin *) w->parent(); if (v->guardarSeleccion()) v->hide(); } void AsistenciaWin::cbCheckAsistencia(Fl_Widget *w, void *datos) { AsistenciaWin *v = (AsistenciaWin *) w->parent(); if (v->checkAsistencia->value()) v->activarBotonesRadio(); else v->desactivarBotonesRadio(); } int main() { AsistenciaWin v1(10,10); v1.show(); return Fl::run(); } /* ....................................................................................................................................... Algunas observaciones/preguntas: - ¿Por qué no se ha utilizado casillas de verificación (en lugar de botones de radio) para los grupos de laboratorio? (Usabilidad) - ¿Por qué se marca la casilla de verificación al principio? (Usabildad) - ¿Por qué se deseleccionan todos los botones de radio cuando se marca la casilla de verificación? (Usabilidad) - ¿Es necesario indicar el tipo FL_RADIO_BUTTON en los "round buttons"? (FLTK) - ¿Se puede tener selección exclusiva entre botones que no sean "round buttons"? (FLTK) - En la función de callback de la casilla de verificación se consulta si está marcada. ¿Cómo se podría prescindir de esta consulta? (FLTK) - ¿Qué pasa si el ancho del Fl_Check_Box se reduce a, por ejemplo, 20 píxels? (FLTK + usabilidad) - ¿Qué pasa si, en guardarSeleccion(), no se comprueba que haya algún botón de radio seleccionado? (FLTK + usabilidad) - ¿Qué ocurre si tuvieses otro grupo de botones de radio independientes de estos? (FLTK) - En caso de que el usuario no haya marcado ningún grupo de laboratorio pero sí la casilla de verificación asociada a la asistencia regular, se muestra un mensaje al usuario antes de que pueda cerrar la ventana. (usabilidad) * ¿Importa el texto exacto de este mensaje? * Compara el que se da con estos otros: "Si asistes a clase, selecciona un grupo de laboratorio" "En caso de que asistas a clase regularmente, por favor, señala uno de los botones de radio" ¿Son igualmente válidos, mejores o peores? ¿En qué sentido? ¿Es posible mejorar el mejor de los tres? ¿Cómo? ....................................................................................................................................... */