📄 gui.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 + -