- DLG_DATA *data;
-
- data = (DLG_DATA*)qmalloc (sizeof(DLG_DATA));
- data->object = object;
- data->buffer = buf;
- data->type = type;
-
- m_pDataList = g_slist_append (m_pDataList, data);
-}
-
-void Dialog::AddModalButton( GtkWidget *widget, int ret ) {
- gtk_signal_connect( GTK_OBJECT( widget ), "clicked",
- GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( ret ) );
-}
-
-void Dialog::UpdateData (bool retrieve)
- {
- DLG_DATA *data;
- GSList *lst;
- char buf[32];
-
- if (retrieve)
- {
- for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))
- {
- data = (DLG_DATA*)lst->data;
-
- switch (data->type)
- {
- case DLG_CHECK_BOOL:
- *(bool*)data->buffer = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->object));
- break;
- case DLG_RADIO_INT:
- {
- GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));
- *(int*)data->buffer = g_slist_length (radio) - 1;
- for (; radio; radio = g_slist_next (radio))
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio->data)))
- break;
- else
- (*(int*)data->buffer)--;
- } break;
- case DLG_ENTRY_TEXT:
- {
- const char *txt;
- Str* str;
- str = (Str*)data->buffer;
- txt = gtk_entry_get_text (GTK_ENTRY (data->object));
- *str = txt;
- } break;
- case DLG_ENTRY_FLOAT:
- *(float*)data->buffer = atof (gtk_entry_get_text (GTK_ENTRY (data->object)));
- break;
- case DLG_ENTRY_INT:
- *(int*)data->buffer = atoi (gtk_entry_get_text (GTK_ENTRY (data->object)));
- break;
- case DLG_SPIN_FLOAT:
- *(float*)data->buffer = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (data->object));
- break;
- case DLG_SPIN_INT:
- *(int*)data->buffer = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (data->object));
- break;
- case DLG_ADJ_INT:
- *(int*)data->buffer = (int) GTK_ADJUSTMENT (data->object)->value;
- break;
- case DLG_COMBO_INT:
- {
- GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;
- char *label;
- const char *entry;
- int i;
-
- *(int*)data->buffer = -1;
- entry = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data->object)->entry));
-
- for (i = 0; lst != NULL; lst = g_list_next (lst))
- {
- gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &label);
-
- if (strcmp (label, entry) == 0)
- {
- *(int*)data->buffer = i;
- break;
- }
- i++;
- }
- }
- break;
- case DLG_COMBO_BOX_INT: {
- *(int*)data->buffer = gtk_combo_box_get_active( GTK_COMBO_BOX( data->object ) );
+DialogDataList& m_data;
+public:
+AddCustomData( DialogDataList& data ) : m_data( data ){
+}
+void apply(
+ typename Widget::Type& widget,
+ const Callback1<typename Widget::Other>& importViewer,
+ const Callback1<const Callback1<typename Widget::Other>&>& exportViewer
+ ) const {
+ m_data.push_back(
+ new CallbackDialogData<typename Widget::Other>(
+ typename Widget::ImportCaller( widget ),
+ typename Widget::ExportCaller( widget ),
+ importViewer,
+ exportViewer
+ )
+ );
+}
+};
+
+// =============================================================================
+// Dialog class
+
+Dialog::Dialog() : m_window( 0 ), m_parent( 0 ){
+}
+
+Dialog::~Dialog(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->release();
+ }
+
+ ASSERT_MESSAGE( !m_window, "dialog window not destroyed" );
+}
+
+void Dialog::ShowDlg(){
+ ASSERT_MESSAGE( m_window, "dialog was not constructed" );
+ importData();
+ m_window.show();
+}
+
+void Dialog::HideDlg(){
+ ASSERT_MESSAGE( m_window, "dialog was not constructed" );
+ exportData();
+ m_window.hide();
+}
+
+static gint delete_event_callback( ui::Widget widget, GdkEvent* event, gpointer data ){
+ reinterpret_cast<Dialog*>( data )->HideDlg();
+ reinterpret_cast<Dialog*>( data )->EndModal( eIDCANCEL );
+ return TRUE;
+}
+
+void Dialog::Create(){
+ ASSERT_MESSAGE( !m_window, "dialog cannot be constructed" );
+
+ m_window = BuildDialog();
+ m_window.connect( "delete_event", G_CALLBACK( delete_event_callback ), this );
+}
+
+void Dialog::Destroy(){
+ ASSERT_MESSAGE( m_window, "dialog cannot be destroyed" );
+
+ m_window.destroy();
+ m_window = ui::Window{ui::null};
+}
+
+
+void Dialog::AddBoolToggleData( GtkToggleButton& widget, const BoolImportCallback& importViewer, const BoolExportCallback& exportViewer ){
+ AddCustomData<BoolToggleImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntRadioData( GtkRadioButton& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntRadioImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddTextEntryData( GtkEntry& widget, const StringImportCallback& importViewer, const StringExportCallback& exportViewer ){
+ AddCustomData<TextEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntEntryData( GtkEntry& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddSizeEntryData( GtkEntry& widget, const SizeImportCallback& importViewer, const SizeExportCallback& exportViewer ){
+ AddCustomData<SizeEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddFloatEntryData( GtkEntry& widget, const FloatImportCallback& importViewer, const FloatExportCallback& exportViewer ){
+ AddCustomData<FloatEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddFloatSpinnerData( GtkSpinButton& widget, const FloatImportCallback& importViewer, const FloatExportCallback& exportViewer ){
+ AddCustomData<FloatSpinnerImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntSpinnerData( GtkSpinButton& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntSpinnerImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntAdjustmentData( GtkAdjustment& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntAdjustmentImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntComboData( GtkComboBox& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntComboImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+
+void Dialog::AddDialogData( GtkToggleButton& widget, bool& data ){
+ AddData<BoolToggleImportExport, BoolImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkRadioButton& widget, int& data ){
+ AddData<IntRadioImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, CopiedString& data ){
+ AddData<TextEntryImportExport, StringImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, int& data ){
+ AddData<IntEntryImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, std::size_t& data ){
+ AddData<SizeEntryImportExport, SizeImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, float& data ){
+ AddData<FloatEntryImportExport, FloatImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkSpinButton& widget, float& data ){
+ AddData<FloatSpinnerImportExport, FloatImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkSpinButton& widget, int& data ){
+ AddData<IntSpinnerImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkAdjustment& widget, int& data ){
+ AddData<IntAdjustmentImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkComboBox& widget, int& data ){
+ AddData<IntComboImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+
+void Dialog::exportData(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->exportData();
+ }
+}
+
+void Dialog::importData(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->importData();
+ }
+}
+
+void Dialog::EndModal( EMessageBoxReturn code ){
+ m_modal.loop = 0;
+ m_modal.ret = code;
+}
+
+EMessageBoxReturn Dialog::DoModal(){
+ importData();
+
+ PreModal();
+
+ EMessageBoxReturn ret = modal_dialog_show( m_window, m_modal );
+ ASSERT_TRUE( (bool) m_window );
+ if ( ret == eIDOK ) {
+ exportData();
+ }
+
+ m_window.hide();
+
+ PostModal( m_modal.ret );
+
+ return m_modal.ret;
+}
+
+
+ui::CheckButton Dialog::addCheckBox( ui::VBox vbox, const char* name, const char* flag, const BoolImportCallback& importViewer, const BoolExportCallback& exportViewer ){
+ auto check = ui::CheckButton( flag );
+ check.show();
+ AddBoolToggleData( *GTK_TOGGLE_BUTTON( check ), importViewer, exportViewer );
+
+ DialogVBox_packRow( vbox, ui::Widget(DialogRow_new( name, check ) ));
+ return check;
+}
+
+ui::CheckButton Dialog::addCheckBox( ui::VBox vbox, const char* name, const char* flag, bool& data ){
+ return addCheckBox( vbox, name, flag, BoolImportCaller( data ), BoolExportCaller( data ) );
+}
+
+void Dialog::addCombo( ui::VBox vbox, const char* name, StringArrayRange values, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ auto alignment = ui::Alignment( 0.0, 0.5, 0.0, 0.0 );
+ alignment.show();
+ {
+ auto combo = ui::ComboBoxText(ui::New);
+
+ for ( StringArrayRange::Iterator i = values.first; i != values.last; ++i )
+ {
+ gtk_combo_box_text_append_text( GTK_COMBO_BOX_TEXT( combo ), *i );