void *procesar_boton(void *nada){ // Hilo que se ejecutará cuando se pulse el botón OK Go!. Simula un inicio de sesión que una vez fallará y otra vez no Gtk::Label *etiq; // Estos son los objetos que queremos manejar. En la ventana hay más, pero no les hacemos nada, asique no necesitamos declarar punteros a ellos. Esta es la etiqueta que muestra el Cargando... Gtk::Spinner *spin; // Esto es un dibujito que gira mientras carga Gtk::Image *image; // Esta es la imagen que aparece cuando se inicia sesión (tanto si falla(muestra una X de error) como si no(muestra un tick verde) Gtk::RadioButton *radio; // Este es un botón de los de la izquierda, donde seleccionas si inicias sesion, creas usuario o borras usuario Gtk::Entry *entrada; // Esta es la cajeta de entrada de texto como por ejemplo, donde pones el nombre de usuario y la contraseña builder->get_widget("label3", etiq); // Como el builder crea la ventana, él nos dará las referencias a los objetos definidos arriba builder->get_widget("spinner1", spin); builder->get_widget("image1", image); image->set_visible(false); // Hacemos que las imagenes no se vean. Mientras está cargando no se muestran. Esta es la imagen de cuando se inicia sesión correctamente builder->get_widget("image2", image); // Reusamos el puntero para referenciar a la otra imagen. Esta se muestra cuando el inicio sesion falla image->set_visible(false); builder->get_widget("radiobutton1",radio);// Como esto se ejecuta cuando se pulsa el botón OK Go!, se supone que estamos procesando el inicio de sesión. Es habitual bloquearlo todo para que no se pueda cambiar de opción mientras se inicia sesion (En realidad es por estética, porque al programa se la trae floja lo que hagas) :) radio->set_sensitive(false); builder->get_widget("radiobutton2",radio); radio->set_sensitive(false); builder->get_widget("radiobutton3",radio); radio->set_sensitive(false); builder->get_widget("entry1", entrada); entrada->set_sensitive(false); builder->get_widget("entry2", entrada); entrada->set_sensitive(false); spin->set_visible(true); // Como estamos cargando, mostramos el iconito este girando. (Este es el mismo que se muestra cuando buscas archivos en ubuntu) etiq->set_label("Conectando..."); // Hacemos que la etiqueta muestre Conectando... sleep(1); // Simulamos que la conexion se establece etiq->set_label("Obteniendo datos del servidor"); // Se supone que estamos conectados y ahora intercambiamos datos con el servidor sleep(2); // Simulamos el intercambio de datos spin->set_visible(false); // Ya se ha procesado el inicio de sesion y ya no debemos ver el iconico girando, porque eso es sólo cuando carga if(i%2){ // Si es impar, el inicio de sesion es correcto builder->get_widget("image1", image); // Obtenemos la imagen1, la del tick verde etiq->set_label("Login correcto"); // Cambiamos el texto de la etiqueta (una etiqueta sólo hace eso: mostrar texto) } else { etiq->set_label("Login incorrecto"); // Si es par, el inicio de sesion es incorrecto. No tenemos que obtener la imagen porque el puntero ya apunta a la imagen correcta } image->set_visible(true); // Sea cual sea la imagen escogida, se muestra builder->get_widget("radiobutton1",radio); // Y se desbloquea todo esperando a que el usuario cambie algo y vuelva a pulsar otro botón radio->set_sensitive(true); builder->get_widget("radiobutton2",radio); radio->set_sensitive(true); builder->get_widget("radiobutton3",radio); radio->set_sensitive(true); builder->get_widget("entry1", entrada); entrada->set_sensitive(true); builder->get_widget("entry2", entrada); entrada->set_sensitive(true); i++; // Esto alterna entre simular un inicio de sesion correcto (i impar) y uno incorrecto (i par) }
void getThreadData(Glib::RefPtr<Gtk::ListStore> m_threads_tree_model) { ///Get the thread data as JSON, and then push it onto the ListStore given in m_threads_tree_model Gtk::Spinner *spin = 0; builder->get_widget("spinner1", spin); spin->set_visible(true); spin->show(); Gtk::TreeView *tree = 0; builder->get_widget("treeview2", tree); tree->hide(); tree->set_visible(false); Json::Value json = getThreads(BOARD); for(int j=0;j<json.size();++j) { Json::Value threads = json[j]["threads"]; for(int i=0;i<threads.size();++i) { Gtk::TreeModel::Row row = *(m_threads_tree_model->append()); ostringstream convert3; convert3 << threads[i]["replies"].asUInt(); row[m_thread_list.text] = standardPostFormatting(threads[i])+"\n\n"+convert3.str()+" replies"; row[m_thread_list.tim] = threads[i]["tim"].asString(); row[m_thread_list.ext] = trim(threads[i]["ext"].asString()); if(threads[i].isMember("filename")) { row[m_thread_list.fn] = threads[i]["filename"].asString(); } ostringstream convert2; convert2 << threads[i]["no"].asInt(); row[m_thread_list.no] = convert2.str(); } } spin->hide(); spin->set_visible(false); tree->show(); tree->set_visible(true); }
void on_refresh_posts_clicked(Glib::RefPtr<Gtk::ListStore> m_threads_tree_model) { ///To be executed when the refresh button is clicked while viewing a thread Gtk::Spinner *spin = 0; builder->get_widget("spinner1", spin); spin->show(); spin->set_visible(true); Gtk::TreeView *tree = 0; builder->get_widget("treeview4", tree); tree->hide(); tree->set_visible(false); m_threads_tree_model->clear(); getPostData(m_threads_tree_model); webkit_web_view_load_uri(pWebKitView, "about:blank"); spin->hide(); spin->set_visible(false); tree->show(); tree->set_visible(true); }