| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
#include "stdafx.h" |
|---|
| 30 |
#include <gtk/gtk.h> |
|---|
| 31 |
#include <stdlib.h> |
|---|
| 32 |
#include <stdio.h> |
|---|
| 33 |
|
|---|
| 34 |
typedef struct |
|---|
| 35 |
{ |
|---|
| 36 |
GtkObject *object; |
|---|
| 37 |
void *buffer; |
|---|
| 38 |
DLG_DATA_TYPE type; |
|---|
| 39 |
} DLG_DATA; |
|---|
| 40 |
|
|---|
| 41 |
|
|---|
| 42 |
|
|---|
| 43 |
|
|---|
| 44 |
Dialog::Dialog () |
|---|
| 45 |
{ |
|---|
| 46 |
m_pDataList = (GSList*)NULL; |
|---|
| 47 |
m_nReturn = IDCANCEL; |
|---|
| 48 |
m_bNeedBuild = true; |
|---|
| 49 |
m_nLoop = 0; |
|---|
| 50 |
} |
|---|
| 51 |
|
|---|
| 52 |
Dialog::~Dialog () |
|---|
| 53 |
{ |
|---|
| 54 |
while (m_pDataList) |
|---|
| 55 |
{ |
|---|
| 56 |
free (m_pDataList->data); |
|---|
| 57 |
m_pDataList = g_slist_remove (m_pDataList, m_pDataList->data); |
|---|
| 58 |
} |
|---|
| 59 |
|
|---|
| 60 |
if (m_pWidget != NULL) |
|---|
| 61 |
gtk_widget_destroy (m_pWidget); |
|---|
| 62 |
} |
|---|
| 63 |
|
|---|
| 64 |
|
|---|
| 65 |
void Dialog::ShowDlg () |
|---|
| 66 |
{ |
|---|
| 67 |
Create (); |
|---|
| 68 |
UpdateData (FALSE); |
|---|
| 69 |
gtk_widget_show (m_pWidget); |
|---|
| 70 |
} |
|---|
| 71 |
|
|---|
| 72 |
void Dialog::HideDlg () |
|---|
| 73 |
{ |
|---|
| 74 |
UpdateData (TRUE); |
|---|
| 75 |
gtk_widget_hide (m_pWidget); |
|---|
| 76 |
} |
|---|
| 77 |
|
|---|
| 78 |
static gint delete_event_callback(GtkWidget *widget, GdkEvent* event, gpointer data) |
|---|
| 79 |
{ |
|---|
| 80 |
reinterpret_cast<Dialog*>(data)->HideDlg(); |
|---|
| 81 |
reinterpret_cast<Dialog*>(data)->EndModal(IDCANCEL); |
|---|
| 82 |
return TRUE; |
|---|
| 83 |
} |
|---|
| 84 |
|
|---|
| 85 |
void Dialog::Create () |
|---|
| 86 |
{ |
|---|
| 87 |
if (m_bNeedBuild) |
|---|
| 88 |
{ |
|---|
| 89 |
m_pWidget = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
|---|
| 90 |
gtk_signal_connect (GTK_OBJECT (m_pWidget), "delete_event", |
|---|
| 91 |
GTK_SIGNAL_FUNC (delete_event_callback), this); |
|---|
| 92 |
gtk_signal_connect (GTK_OBJECT (m_pWidget), "destroy", |
|---|
| 93 |
GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL); |
|---|
| 94 |
g_object_set_data (G_OBJECT (m_pWidget), "loop", &m_nLoop); |
|---|
| 95 |
g_object_set_data (G_OBJECT (m_pWidget), "ret", &m_nReturn); |
|---|
| 96 |
|
|---|
| 97 |
BuildDialog (); |
|---|
| 98 |
m_bNeedBuild = false; |
|---|
| 99 |
} |
|---|
| 100 |
} |
|---|
| 101 |
|
|---|
| 102 |
void Dialog::Destroy () |
|---|
| 103 |
{ |
|---|
| 104 |
if (m_pWidget != NULL) |
|---|
| 105 |
{ |
|---|
| 106 |
gtk_widget_destroy (m_pWidget); |
|---|
| 107 |
m_pWidget = NULL; |
|---|
| 108 |
} |
|---|
| 109 |
} |
|---|
| 110 |
|
|---|
| 111 |
void Dialog::AddDialogData (GtkObject *object, void *buf, DLG_DATA_TYPE type) |
|---|
| 112 |
{ |
|---|
| 113 |
DLG_DATA *data; |
|---|
| 114 |
|
|---|
| 115 |
data = (DLG_DATA*)qmalloc (sizeof(DLG_DATA)); |
|---|
| 116 |
data->object = object; |
|---|
| 117 |
data->buffer = buf; |
|---|
| 118 |
data->type = type; |
|---|
| 119 |
|
|---|
| 120 |
m_pDataList = g_slist_append (m_pDataList, data); |
|---|
| 121 |
} |
|---|
| 122 |
|
|---|
| 123 |
void Dialog::AddModalButton (GtkWidget *widget, int ret) |
|---|
| 124 |
{ |
|---|
| 125 |
gtk_signal_connect (GTK_OBJECT (widget), "clicked", |
|---|
| 126 |
GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (ret)); |
|---|
| 127 |
} |
|---|
| 128 |
|
|---|
| 129 |
void Dialog::UpdateData (bool retrieve) |
|---|
| 130 |
{ |
|---|
| 131 |
DLG_DATA *data; |
|---|
| 132 |
GSList *lst; |
|---|
| 133 |
char buf[32]; |
|---|
| 134 |
|
|---|
| 135 |
if (retrieve) |
|---|
| 136 |
{ |
|---|
| 137 |
for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst)) |
|---|
| 138 |
{ |
|---|
| 139 |
data = (DLG_DATA*)lst->data; |
|---|
| 140 |
|
|---|
| 141 |
switch (data->type) |
|---|
| 142 |
{ |
|---|
| 143 |
case DLG_CHECK_BOOL: |
|---|
| 144 |
*(bool*)data->buffer = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->object)); |
|---|
| 145 |
break; |
|---|
| 146 |
case DLG_RADIO_INT: |
|---|
| 147 |
{ |
|---|
| 148 |
GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object)); |
|---|
| 149 |
*(int*)data->buffer = g_slist_length (radio) - 1; |
|---|
| 150 |
for (; radio; radio = g_slist_next (radio)) |
|---|
| 151 |
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio->data))) |
|---|
| 152 |
break; |
|---|
| 153 |
else |
|---|
| 154 |
(*(int*)data->buffer)--; |
|---|
| 155 |
} break; |
|---|
| 156 |
case DLG_ENTRY_TEXT: |
|---|
| 157 |
{ |
|---|
| 158 |
const char *txt; |
|---|
| 159 |
Str* str; |
|---|
| 160 |
str = (Str*)data->buffer; |
|---|
| 161 |
txt = gtk_entry_get_text (GTK_ENTRY (data->object)); |
|---|
| 162 |
*str = txt; |
|---|
| 163 |
} break; |
|---|
| 164 |
case DLG_ENTRY_FLOAT: |
|---|
| 165 |
*(float*)data->buffer = atof (gtk_entry_get_text (GTK_ENTRY (data->object))); |
|---|
| 166 |
break; |
|---|
| 167 |
case DLG_ENTRY_INT: |
|---|
| 168 |
*(int*)data->buffer = atoi (gtk_entry_get_text (GTK_ENTRY (data->object))); |
|---|
| 169 |
break; |
|---|
| 170 |
case DLG_SPIN_FLOAT: |
|---|
| 171 |
*(float*)data->buffer = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (data->object)); |
|---|
| 172 |
break; |
|---|
| 173 |
case DLG_SPIN_INT: |
|---|
| 174 |
*(int*)data->buffer = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (data->object)); |
|---|
| 175 |
break; |
|---|
| 176 |
case DLG_ADJ_INT: |
|---|
| 177 |
*(int*)data->buffer = (int) GTK_ADJUSTMENT (data->object)->value; |
|---|
| 178 |
break; |
|---|
| 179 |
case DLG_COMBO_INT: |
|---|
| 180 |
{ |
|---|
| 181 |
GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children; |
|---|
| 182 |
char *label; |
|---|
| 183 |
const char *entry; |
|---|
| 184 |
int i; |
|---|
| 185 |
|
|---|
| 186 |
*(int*)data->buffer = -1; |
|---|
| 187 |
entry = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data->object)->entry)); |
|---|
| 188 |
|
|---|
| 189 |
for (i = 0; lst != NULL; lst = g_list_next (lst)) |
|---|
| 190 |
{ |
|---|
| 191 |
gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &label); |
|---|
| 192 |
|
|---|
| 193 |
if (strcmp (label, entry) == 0) |
|---|
| 194 |
{ |
|---|
| 195 |
*(int*)data->buffer = i; |
|---|
| 196 |
break; |
|---|
| 197 |
} |
|---|
| 198 |
i++; |
|---|
| 199 |
} |
|---|
| 200 |
} break; |
|---|
| 201 |
} |
|---|
| 202 |
} |
|---|
| 203 |
} |
|---|
| 204 |
else |
|---|
| 205 |
{ |
|---|
| 206 |
for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst)) |
|---|
| 207 |
{ |
|---|
| 208 |
data = (DLG_DATA*)lst->data; |
|---|
| 209 |
|
|---|
| 210 |
switch (data->type) |
|---|
| 211 |
{ |
|---|
| 212 |
case DLG_CHECK_BOOL: |
|---|
| 213 |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->object), *(bool*)data->buffer); |
|---|
| 214 |
break; |
|---|
| 215 |
case DLG_RADIO_INT: |
|---|
| 216 |
{ |
|---|
| 217 |
GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object)); |
|---|
| 218 |
gpointer btn = g_slist_nth_data (radio, g_slist_length (radio) - (*(int*)data->buffer) - 1); |
|---|
| 219 |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE); |
|---|
| 220 |
} break; |
|---|
| 221 |
case DLG_ENTRY_TEXT: |
|---|
| 222 |
{ |
|---|
| 223 |
Str* str; |
|---|
| 224 |
str = (Str*)data->buffer; |
|---|
| 225 |
const char *txt = str->GetBuffer (); |
|---|
| 226 |
gtk_entry_set_text (GTK_ENTRY (data->object), txt); |
|---|
| 227 |
} break; |
|---|
| 228 |
case DLG_ENTRY_FLOAT: |
|---|
| 229 |
sprintf (buf, "%g", (*(float*)data->buffer)); |
|---|
| 230 |
gtk_entry_set_text (GTK_ENTRY (data->object), buf); |
|---|
| 231 |
break; |
|---|
| 232 |
case DLG_ENTRY_INT: |
|---|
| 233 |
sprintf (buf, "%d", (*(int*)data->buffer)); |
|---|
| 234 |
gtk_entry_set_text (GTK_ENTRY (data->object), buf); |
|---|
| 235 |
break; |
|---|
| 236 |
case DLG_SPIN_FLOAT: |
|---|
| 237 |
gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(float*)data->buffer)); |
|---|
| 238 |
break; |
|---|
| 239 |
case DLG_SPIN_INT: |
|---|
| 240 |
gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(int*)data->buffer)); |
|---|
| 241 |
break; |
|---|
| 242 |
case DLG_ADJ_INT: |
|---|
| 243 |
gtk_adjustment_set_value (GTK_ADJUSTMENT (data->object), (*(int*)data->buffer)); |
|---|
| 244 |
break; |
|---|
| 245 |
case DLG_COMBO_INT: |
|---|
| 246 |
{ |
|---|
| 247 |
GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children; |
|---|
| 248 |
char *entry = ""; |
|---|
| 249 |
|
|---|
| 250 |
if (*(int*)data->buffer != -1) |
|---|
| 251 |
{ |
|---|
| 252 |
lst = g_list_nth (lst, *(int*)data->buffer); |
|---|
| 253 |
if (lst != NULL) |
|---|
| 254 |
gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &entry); |
|---|
| 255 |
} |
|---|
| 256 |
|
|---|
| 257 |
gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (data->object)->entry), entry); |
|---|
| 258 |
} break; |
|---|
| 259 |
} |
|---|
| 260 |
} |
|---|
| 261 |
} |
|---|
| 262 |
} |
|---|
| 263 |
|
|---|
| 264 |
void Dialog::EndModal (int code) |
|---|
| 265 |
{ |
|---|
| 266 |
m_nLoop = 0; |
|---|
| 267 |
m_nReturn = code; |
|---|
| 268 |
} |
|---|
| 269 |
|
|---|
| 270 |
int Dialog::DoModal () |
|---|
| 271 |
{ |
|---|
| 272 |
Create (); |
|---|
| 273 |
UpdateData (FALSE); |
|---|
| 274 |
|
|---|
| 275 |
PreModal(); |
|---|
| 276 |
|
|---|
| 277 |
gtk_grab_add (m_pWidget); |
|---|
| 278 |
gtk_widget_show (m_pWidget); |
|---|
| 279 |
|
|---|
| 280 |
m_nLoop = 1; |
|---|
| 281 |
while (m_nLoop) |
|---|
| 282 |
gtk_main_iteration (); |
|---|
| 283 |
|
|---|
| 284 |
if (m_pWidget != NULL) |
|---|
| 285 |
{ |
|---|
| 286 |
UpdateData (TRUE); |
|---|
| 287 |
|
|---|
| 288 |
gtk_grab_remove (m_pWidget); |
|---|
| 289 |
gtk_widget_hide (m_pWidget); |
|---|
| 290 |
} |
|---|
| 291 |
PostModal (m_nReturn); |
|---|
| 292 |
|
|---|
| 293 |
return m_nReturn; |
|---|
| 294 |
} |
|---|
| 295 |
|
|---|