⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui.cpp

📁 即时通信程序(类似于QQ,MSN) 用C写的
💻 CPP
字号:
#include "gui.h"
#include "../network/network.h"


extern bool idle_func(GtkWidget *, gpointer);
extern network *net;
bool online;
struct _gui gui;
struct _chat_wnd *liste_chat_wnd;

void
fermeture(GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

void
connexion(GtkWidget *widget, gpointer data)
{
//lecture parametres par defaut
 char* fichier_config = "jcq.conf";
 FILE *fich;
 char parametre[255];
 char valeur[50];
 char login[50];
 char serveur[50];
 strcpy(login,"Default");
 strcpy(serveur,"localhost");
 
 //lecture des nouveaux parametres
 if (fich = fopen(fichier_config,"r"))
 {
   while (fscanf(fich, "%s = %s\n", parametre, valeur) != EOF)
   {
     if     (!strcmp(parametre, "LOGIN"))
          strcpy(login, valeur);
     else if(!strcmp(parametre, "SERVER"))
          strcpy(serveur, valeur);
   }
   fclose(fich);
 }
 
 //gui
 GtkWidget *popup;
 popup = gtk_dialog_new_with_buttons("Login",
					                 GTK_WINDOW (data),
					                 GTK_DIALOG_MODAL,
					                 GTK_STOCK_OK,
					                 GTK_RESPONSE_OK,
					                 GTK_STOCK_CANCEL,
					                 GTK_RESPONSE_CANCEL,
					                 NULL);

 gtk_window_set_default_size((GtkWindow*)popup, 80,100);
 GtkWidget *vbox = gtk_vbox_new (FALSE, 3);
 GtkWidget *hbox1 = gtk_hbox_new (FALSE, 3);
 GtkWidget * txt_login = gtk_entry_new_with_max_length(20);
 gtk_entry_set_text((GtkEntry *)txt_login, login);
 gtk_box_pack_start (GTK_BOX (hbox1), gtk_label_new("Login : "), TRUE, FALSE,0);
 gtk_box_pack_start (GTK_BOX (hbox1), txt_login, TRUE, FALSE,0);
 GtkWidget *hbox2 = gtk_hbox_new (FALSE, 3);
 GtkWidget * txt_serveur = gtk_entry_new_with_max_length(20);
 gtk_entry_set_text((GtkEntry *)txt_serveur, serveur);
 gtk_box_pack_start (GTK_BOX (hbox2), gtk_label_new("Serveur : "), TRUE, FALSE,0);
 gtk_box_pack_start (GTK_BOX (hbox2), txt_serveur, TRUE, FALSE,0);
 gtk_box_pack_start (GTK_BOX (vbox), hbox1, TRUE, FALSE,0);
 gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, FALSE,0);
 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(popup)->vbox),vbox);
 gtk_widget_show_all(vbox);


 int reponse = gtk_dialog_run (GTK_DIALOG (popup));
 if (reponse == GTK_RESPONSE_OK)
 {
  if (net->demarre_client((char *)gtk_entry_get_text((GtkEntry *)txt_serveur)) == -1)
  {
    errormsg((GtkWidget *)data, "Impossible de se connecter au serveur!");
    gtk_widget_destroy(popup);
  } 
  else
  {
   gtk_window_set_title((GtkWindow *)gui.window, (char *)gtk_entry_get_text((GtkEntry *)txt_login));
   gui.user_nick = (char*) malloc((strlen((char *)gtk_entry_get_text((GtkEntry *)txt_login))+1)*sizeof(char));
   strcpy(gui.user_nick, (char *)gtk_entry_get_text((GtkEntry *)txt_login));
   net->envoi(-1, "LOGIN",(char *)gtk_entry_get_text((GtkEntry *)txt_login));
   net->update_output();
   online = true;  
   if (fich = fopen(fichier_config,"w"))
   {
    fprintf(fich, "LOGIN = %s\n", (char *)gtk_entry_get_text((GtkEntry *)txt_login));
    fprintf(fich, "SERVER = %s\n", (char *)gtk_entry_get_text((GtkEntry *)txt_serveur));
    fclose(fich);
   }
   gtk_widget_destroy(popup);
  }
 }
 else
  gtk_widget_destroy(popup);
}





GtkTreeModel *
creation_modele()
{
  gint i = 0;
  GtkTreeStore *store;
  GtkTreeIter iter;

  store = gtk_tree_store_new (NUM_COLUMNS,
  			                  G_TYPE_STRING
  			                  );

  return GTK_TREE_MODEL (store);	      
}



void start_chat   (GtkTreeView       *treeview,
                   GtkTreePath       *path,
                   GtkTreeViewColumn *col,
                   gpointer          userdata)
{
    GtkTreeModel *model;
    GtkTreeIter   iter;
    model = gtk_tree_view_get_model(treeview);
    if (gtk_tree_model_get_iter(model, &iter, path))
    {
       gchar *name;

       gtk_tree_model_get(model, &iter, COLUMN_NOM, &name, -1);

       popup_manager(name, NULL);
       g_free(name);
    }
}
  


void
creation_colonnes(GtkTreeView *treeview)
{
  GtkCellRenderer *renderer;
  GtkTreeViewColumn *column;
  GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  gtk_tree_view_columns_autosize ((GtkTreeView*)gui.treeview);

  // column for zones
  renderer = gtk_cell_renderer_text_new();
  column = gtk_tree_view_column_new_with_attributes ("Nick",
						                             renderer,
                                                     "text",
						                             COLUMN_NOM,
						                             NULL);
  gtk_tree_view_column_set_sort_column_id (column, COLUMN_NOM);
  gtk_tree_view_append_column (treeview, column);

}






void
maj_modele(char *str)
{
  GtkTreeStore *store;
  
  char tmp[255];
  char ext[10];
  char *tmp2;

  //creation du modele
  store = gtk_tree_store_new (NUM_COLUMNS,
  			                  G_TYPE_STRING 
  			                  );
  		                       
  tmp2 = strtok(str, "#");
  while (tmp2)
  {
    if (strcmp(gui.user_nick, tmp2))
    {
        GtkTreeIter iter;
        gtk_tree_store_append (store, &iter, NULL);  //nouvelle ligne
        gtk_tree_store_set (   store, &iter,      //maj de la ligne
                    		   COLUMN_NOM, tmp2,
  		                       -1);
    }
    tmp2 = strtok(NULL, "#");
  }
  gtk_tree_view_set_model((GtkTreeView *)gui.treeview,   GTK_TREE_MODEL (store));   
}




bool
start_gui(int argc, char *argv[])
{
   online = false;
   liste_chat_wnd = NULL;


   gtk_init (&argc, &argv);
   gui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   g_signal_connect (G_OBJECT (gui.window), "destroy",G_CALLBACK (fermeture), NULL);
   gtk_window_set_default_size((GtkWindow*)gui.window, 150,300);
   gtk_window_set_title((GtkWindow *)gui.window, "-- JCQ --");
   //Cr閍tion de la barre d'outils
   GtkWidget *toolbar = gtk_toolbar_new();


   gtk_toolbar_insert_item       (GTK_TOOLBAR (toolbar),
                                  "Connecter",
                                  "Se connecter au serveur",
                                  NULL,
                                  GTK_WIDGET(gtk_image_new_from_stock (GTK_STOCK_HOME, GTK_ICON_SIZE_SMALL_TOOLBAR)),
                                  G_CALLBACK (connexion),
                                  gui.window,
                                  -1);
  gtk_toolbar_insert_item       (GTK_TOOLBAR (toolbar),
                                  "Quitter",
                                  "Quitter l'application",
                                  NULL,
                                  GTK_WIDGET(gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_SMALL_TOOLBAR)),
                                  G_CALLBACK (fermeture),
                                  gui.window,
                                  -1);

   //Zone tree
   GtkTreeModel *modele;
   GtkTreeSelection *selection;
   modele = creation_modele();
   gui.treeview = gtk_tree_view_new_with_model (modele);    // creation du widget arbre
   g_signal_connect(gui.treeview, "row-activated", (GCallback) start_chat, NULL);
   gtk_tree_view_set_headers_clickable ((GtkTreeView *)gui.treeview, false);
   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (gui.treeview), TRUE);
   gtk_tree_view_set_search_column (GTK_TREE_VIEW (gui.treeview),COLUMN_NOM);
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (gui.treeview));
   gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
   g_object_unref (modele);
   creation_colonnes(GTK_TREE_VIEW (gui.treeview));

   //zone scrollable
   GtkWidget *sc_treeview = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (    GTK_SCROLLED_WINDOW (sc_treeview),
                                       GTK_POLICY_NEVER,
                                       GTK_POLICY_AUTOMATIC);
   gtk_container_add (GTK_CONTAINER (sc_treeview), gui.treeview);
                                     
   //mise en page                                  
   GtkWidget *vbox = gtk_vbox_new (FALSE, 2);                                  
   gtk_box_pack_start (GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
   gtk_container_add (GTK_CONTAINER(vbox), sc_treeview);

   gtk_container_add (GTK_CONTAINER (gui.window), vbox);  
   gtk_widget_show_all(gui.window);

   gtk_timeout_add(500, (GtkFunction)(idle_func), NULL); //check reseau tt les 500ms

   gtk_main ();
}

void
errormsg(GtkWidget *parent, char *format, ...)
{
 GtkWidget *popup;
 char str[255];
 va_list args;
 va_start(args, format);
 int res = vsnprintf(str, 254, format, args);
 if ((res == -1)||(res = 254))
   str[254] = '\0';
 va_end(args);
  
 popup = gtk_dialog_new_with_buttons("Attention !",
					                 GTK_WINDOW (parent),
					                 GTK_DIALOG_MODAL,
					                 GTK_STOCK_OK,
					                 GTK_RESPONSE_OK,
					                 NULL);
 GtkWidget *vbox = gtk_vbox_new (FALSE, 5);
 gtk_container_add(GTK_CONTAINER(vbox), gtk_label_new(" "));
 gtk_container_add(GTK_CONTAINER(vbox), gtk_label_new(str));
 gtk_container_add(GTK_CONTAINER(vbox), gtk_label_new(" "));
 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(popup)->vbox),vbox);
 gtk_widget_show_all(vbox);

 int reponse = gtk_dialog_run (GTK_DIALOG (popup));
 if (reponse == GTK_RESPONSE_OK)
  gtk_widget_destroy(popup);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -