Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/iptux/AboutDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,12 @@ AboutDialog* aboutDialogNew() {

void aboutDialogRun(AboutDialog* aboutDialog, GtkWindow* parent) {
gtk_window_set_transient_for(GTK_WINDOW(aboutDialog), parent);
gtk_dialog_run(GTK_DIALOG(aboutDialog));
gtk_widget_hide(GTK_WIDGET(aboutDialog));
g_signal_connect(aboutDialog, "response",
G_CALLBACK(+[](GtkDialog* dialog, gint, gpointer) {
gtk_widget_hide(GTK_WIDGET(dialog));
}),
NULL);
gtk_widget_show(GTK_WIDGET(aboutDialog));
}

void aboutDialogEntry(GtkWindow* parent) {
Expand Down
272 changes: 142 additions & 130 deletions src/iptux/DataSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,38 +88,48 @@ void DataSettings::ResetDataEntry(Application* app, GtkWidget* parent) {
return;
}

DataSettings dset(app, parent);
GtkWidget* dialog = GTK_WIDGET(dset.dialog());
DataSettings* dset = new DataSettings(app, parent);
GtkWidget* dialog = GTK_WIDGET(dset->dialog());
app->setPreferenceDialog(dialog);

g_signal_connect(
dialog, "response",
G_CALLBACK(+[](GtkDialog* dialog, gint response_id, gpointer user_data) {
DataSettings* dset = static_cast<DataSettings*>(user_data);
Application* app = dset->app;

switch (response_id) {
case GTK_RESPONSE_OK:
if (dset->Save()) {
if (app->getProgramData()->need_restart()) {
pop_warning(GTK_WIDGET(dialog),
_("The program needs to be restarted to take effect!"));
}
app->setPreferenceDialog(NULL);
gtk_widget_destroy(GTK_WIDGET(dialog));
delete dset;
}
break;
case GTK_RESPONSE_APPLY:
if (dset->Save()) {
if (app->getProgramData()->need_restart()) {
pop_warning(GTK_WIDGET(dialog),
_("The program needs to be restarted to take effect!"));
}
}
// Keep dialog open
break;
default:
app->setPreferenceDialog(NULL);
gtk_widget_destroy(GTK_WIDGET(dialog));
delete dset;
break;
}
}),
dset);

/* 运行对话框 */
gtk_widget_show_all(dialog);
bool done = false;
while (!done) {
switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
case GTK_RESPONSE_OK:
if (dset.Save()) {
if (app->getProgramData()->need_restart()) {
pop_warning(dialog,
_("The program needs to be restarted to take effect!"));
}
done = true;
}
break;
case GTK_RESPONSE_APPLY:
if (dset.Save()) {
if (app->getProgramData()->need_restart()) {
pop_warning(dialog,
_("The program needs to be restarted to take effect!"));
}
}
break;
default:
done = true;
break;
}
}
app->setPreferenceDialog(NULL);
}

/**
Expand Down Expand Up @@ -1194,50 +1204,52 @@ gint DataSettings::IconfileGetItemPos(GtkTreeModel* model,
* @param widset widget set
*/
void DataSettings::AddNewIcon(GtkWidget* button, GData** widset) {
GtkWidget *parent, *combo;
GtkTreeModel* model;
gchar* filename;
gint active;

parent = GTK_WIDGET(g_datalist_get_data(widset, "dialog-widget"));
if (!(filename = choose_file_with_preview(_("Please select a face picture"),
parent)))
return;
GtkWidget* parent = GTK_WIDGET(g_datalist_get_data(widset, "dialog-widget"));

choose_file_with_preview_async(
_("Please select a face picture"), parent, [widset, button](gchar* filename) {
if (!filename) {
return;
}

combo = GTK_WIDGET(g_object_get_data(G_OBJECT(button), "icon-combo-widget"));
model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
active = IconfileGetItemPos(model, filename);
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), active);
g_free(filename);
GtkWidget* combo = GTK_WIDGET(
g_object_get_data(G_OBJECT(button), "icon-combo-widget"));
GtkTreeModel* model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
gint active = IconfileGetItemPos(model, filename);
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), active);
g_free(filename);
});
}

/**
* 选择个人形象照片.
* @param widset widget set
*/
void DataSettings::ChoosePhoto(GData** widset) {
GtkWidget *image, *parent;
GdkPixbuf* pixbuf;
gchar path[MAX_PATHLEN];
gchar* filename;

parent = GTK_WIDGET(g_datalist_get_data(widset, "dialog-widget"));
if (!(filename = choose_file_with_preview(_("Please select a personal photo"),
parent)))
return;
GtkWidget* parent = GTK_WIDGET(g_datalist_get_data(widset, "dialog-widget"));

choose_file_with_preview_async(
_("Please select a personal photo"), parent, [widset](gchar* filename) {
if (!filename) {
return;
}

if ((pixbuf = gdk_pixbuf_new_from_file(filename, NULL))) {
snprintf(path, MAX_PATHLEN, "%s" PHOTO_PATH "/photo",
g_get_user_config_dir());
pixbuf_shrink_scale_1(&pixbuf, MAX_PHOTOSIZE, MAX_PHOTOSIZE);
gdk_pixbuf_save(pixbuf, path, "bmp", NULL,
NULL); // 命中率极高,不妨直接保存
image = GTK_WIDGET(g_datalist_get_data(widset, "photo-image-widget"));
pixbuf_shrink_scale_1(&pixbuf, MAX_PREVIEWSIZE, MAX_PREVIEWSIZE);
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
g_object_unref(pixbuf);
}
g_free(filename);
GdkPixbuf* pixbuf;
if ((pixbuf = gdk_pixbuf_new_from_file(filename, NULL))) {
gchar path[MAX_PATHLEN];
snprintf(path, MAX_PATHLEN, "%s" PHOTO_PATH "/photo",
g_get_user_config_dir());
pixbuf_shrink_scale_1(&pixbuf, MAX_PHOTOSIZE, MAX_PHOTOSIZE);
gdk_pixbuf_save(pixbuf, path, "bmp", NULL,
NULL); // 命中率极高,不妨直接保存
GtkWidget* image =
GTK_WIDGET(g_datalist_get_data(widset, "photo-image-widget"));
pixbuf_shrink_scale_1(&pixbuf, MAX_PREVIEWSIZE, MAX_PREVIEWSIZE);
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
g_object_unref(pixbuf);
}
g_free(filename);
});
}

/**
Expand Down Expand Up @@ -1388,11 +1400,6 @@ void DataSettings::CellEditText(GtkCellRendererText* renderer,
*/
void DataSettings::ImportNetSegment(DataSettings* dset) {
GtkWidget *dialog, *parent;
GtkTreeModel* model;
GtkTreeIter iter;
gchar* filename;
GSList *list, *tlist;
NetSegment* pns;

parent = GTK_WIDGET(g_datalist_get_data(&dset->widset, "dialog-widget"));
dialog = gtk_file_chooser_dialog_new(
Expand All @@ -1403,31 +1410,37 @@ void DataSettings::ImportNetSegment(DataSettings* dset) {
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
g_get_home_dir());

switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
case GTK_RESPONSE_ACCEPT:
model =
GTK_TREE_MODEL(g_datalist_get_data(&dset->mdlset, "network-model"));
gtk_list_store_clear(GTK_LIST_STORE(model));
list = NULL;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
dset->ReadNetSegment(filename, &list);
g_free(filename);
tlist = list;
while (tlist) {
pns = (NetSegment*)tlist->data;
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0,
pns->startip.c_str(), 1, pns->endip.c_str(), 2,
pns->description.c_str(), -1);
tlist = g_slist_next(tlist);
}
for (tlist = list; tlist; tlist = g_slist_next(tlist))
delete (NetSegment*)tlist->data;
g_slist_free(list);
default:
break;
}
gtk_widget_destroy(dialog);
g_signal_connect_data(
dialog, "response",
G_CALLBACK(+[](GtkDialog* dialog, gint response_id, gpointer user_data) {
DataSettings* dset = static_cast<DataSettings*>(user_data);
if (response_id == GTK_RESPONSE_ACCEPT) {
GtkTreeModel* model = GTK_TREE_MODEL(
g_datalist_get_data(&dset->mdlset, "network-model"));
gtk_list_store_clear(GTK_LIST_STORE(model));
GSList* list = NULL;
gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
dset->ReadNetSegment(filename, &list);
g_free(filename);
GSList* tlist = list;
while (tlist) {
NetSegment* pns = (NetSegment*)tlist->data;
GtkTreeIter iter;
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0,
pns->startip.c_str(), 1, pns->endip.c_str(), 2,
pns->description.c_str(), -1);
tlist = g_slist_next(tlist);
}
for (tlist = list; tlist; tlist = g_slist_next(tlist))
delete (NetSegment*)tlist->data;
g_slist_free(list);
}
gtk_widget_destroy(GTK_WIDGET(dialog));
}),
dset, nullptr, G_CONNECT_AFTER);

gtk_widget_show(dialog);
}

/**
Expand All @@ -1436,11 +1449,6 @@ void DataSettings::ImportNetSegment(DataSettings* dset) {
*/
void DataSettings::ExportNetSegment(DataSettings* dset) {
GtkWidget *dialog, *parent;
GtkTreeModel* model;
GtkTreeIter iter;
gchar* filename;
GSList *list, *tlist;
NetSegment* ns;

parent = GTK_WIDGET(g_datalist_get_data(&dset->widset, "dialog-widget"));
dialog = gtk_file_chooser_dialog_new(
Expand All @@ -1450,38 +1458,42 @@ void DataSettings::ExportNetSegment(DataSettings* dset) {
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
g_get_home_dir());

switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
case GTK_RESPONSE_ACCEPT:
model =
GTK_TREE_MODEL(g_datalist_get_data(&dset->mdlset, "network-model"));
if (!gtk_tree_model_get_iter_first(model, &iter))
break;
list = NULL;
do {
char* startip;
char* endip;
char* description;
gtk_tree_model_get(model, &iter, 0, &startip, 1, &endip, 2,
&description, -1);
ns = new NetSegment;
if (startip)
ns->startip = startip;
if (endip)
ns->endip = endip;
if (description)
ns->description = description;
list = g_slist_append(list, ns);
} while (gtk_tree_model_iter_next(model, &iter));
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
dset->WriteNetSegment(filename, list);
g_free(filename);
for (tlist = list; tlist; tlist = g_slist_next(tlist))
delete (NetSegment*)tlist->data;
g_slist_free(list);
default:
break;
}
gtk_widget_destroy(dialog);
g_signal_connect_data(
dialog, "response",
G_CALLBACK(+[](GtkDialog* dialog, gint response_id, gpointer user_data) {
DataSettings* dset = static_cast<DataSettings*>(user_data);
if (response_id == GTK_RESPONSE_ACCEPT) {
GtkTreeModel* model = GTK_TREE_MODEL(
g_datalist_get_data(&dset->mdlset, "network-model"));
GtkTreeIter iter;
if (gtk_tree_model_get_iter_first(model, &iter)) {
GSList* list = NULL;
do {
char *startip, *endip, *description;
gtk_tree_model_get(model, &iter, 0, &startip, 1, &endip, 2,
&description, -1);
NetSegment* ns = new NetSegment;
if (startip)
ns->startip = startip;
if (endip)
ns->endip = endip;
if (description)
ns->description = description;
list = g_slist_append(list, ns);
} while (gtk_tree_model_iter_next(model, &iter));
gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
dset->WriteNetSegment(filename, list);
g_free(filename);
for (GSList* tlist = list; tlist; tlist = g_slist_next(tlist))
delete (NetSegment*)tlist->data;
g_slist_free(list);
}
}
gtk_widget_destroy(GTK_WIDGET(dialog));
}),
dset, nullptr, G_CONNECT_AFTER);

gtk_widget_show(dialog);
}

/**
Expand Down
Loading
Loading