/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined( INCLUDED_DIALOG_H ) #define INCLUDED_DIALOG_H #include #include #include "generic/callback.h" #include "gtkutil/dialog.h" #include "generic/callback.h" #include "string/string.h" template struct impexp { static void Import(Self &self, T value) { self = value; } static void Export(Self &self, const Callback &importCallback) { importCallback(self); } }; template ImportExportCallback mkImportExportCallback(Self &self) { return { ReferenceCaller::Import>(self), ReferenceCaller &), impexp::Export>(self) }; } #define BoolImport impexp::Import #define BoolExport impexp::Export typedef ReferenceCaller &), BoolExport> BoolExportCaller; #define IntImport impexp::Import #define IntExport impexp::Export typedef ReferenceCaller &), IntExport> IntExportCaller; #define SizeImport impexp::Import #define SizeExport impexp::Export #define FloatImport impexp::Import #define FloatExport impexp::Export typedef ReferenceCaller &), FloatExport> FloatExportCaller; #define StringImport impexp::Import #define StringExport impexp::Export template<> struct impexp { static void Import(CopiedString &self, const char *value) { self = value; } static void Export(CopiedString &self, const Callback &importCallback) { importCallback(self.c_str()); } }; typedef ReferenceCaller &), StringExport> StringExportCaller; struct DLG_DATA { virtual ~DLG_DATA() = default; virtual void release() = 0; virtual void importData() const = 0; virtual void exportData() const = 0; }; template class CallbackDialogData; typedef std::list DialogDataList; class Dialog { ui::Window m_window; DialogDataList m_data; public: ModalDialog m_modal; ui::Window m_parent; Dialog(); virtual ~Dialog(); /*! start modal dialog box you need to use AddModalButton to select eIDOK eIDCANCEL buttons */ EMessageBoxReturn DoModal(); void EndModal( EMessageBoxReturn code ); virtual ui::Window BuildDialog() = 0; virtual void exportData(); virtual void importData(); virtual void PreModal() { }; virtual void PostModal( EMessageBoxReturn code ) { }; virtual void ShowDlg(); virtual void HideDlg(); void Create(); void Destroy(); ui::Window GetWidget(){ return m_window; } const ui::Window GetWidget() const { return m_window; } ui::CheckButton addCheckBox(ui::VBox vbox, const char *name, const char *flag, ImportExportCallback const &cb); ui::CheckButton addCheckBox( ui::VBox vbox, const char* name, const char* flag, bool& data ); void addCombo(ui::VBox vbox, const char *name, StringArrayRange values, ImportExportCallback const &cb); void addCombo( ui::VBox vbox, const char* name, int& data, StringArrayRange values ); void addSlider( ui::VBox vbox, const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ); void addRadio(ui::VBox vbox, const char *name, StringArrayRange names, ImportExportCallback const &cb); void addRadio( ui::VBox vbox, const char* name, int& data, StringArrayRange names ); void addRadioIcons(ui::VBox vbox, const char *name, StringArrayRange icons, ImportExportCallback const &cb); void addRadioIcons( ui::VBox vbox, const char* name, int& data, StringArrayRange icons ); ui::Widget addIntEntry(ui::VBox vbox, const char *name, ImportExportCallback const &cb); ui::Widget addEntry( ui::VBox vbox, const char* name, int& data ){ return addIntEntry(vbox, name, mkImportExportCallback(data)); } ui::Widget addSizeEntry(ui::VBox vbox, const char *name, ImportExportCallback const &cb); ui::Widget addEntry( ui::VBox vbox, const char* name, std::size_t& data ){ return addSizeEntry(vbox, name, mkImportExportCallback(data)); } ui::Widget addFloatEntry(ui::VBox vbox, const char *name, ImportExportCallback const &cb); ui::Widget addEntry( ui::VBox vbox, const char* name, float& data ){ return addFloatEntry(vbox, name, mkImportExportCallback(data)); } ui::Widget addPathEntry(ui::VBox vbox, const char *name, bool browse_directory, ImportExportCallback const &cb); ui::Widget addPathEntry( ui::VBox vbox, const char* name, CopiedString& data, bool directory ); ui::SpinButton addSpinner( ui::VBox vbox, const char* name, int& data, double value, double lower, double upper ); ui::SpinButton addSpinner(ui::VBox vbox, const char *name, double value, double lower, double upper, ImportExportCallback const &cb); ui::SpinButton addSpinner(ui::VBox vbox, const char *name, double value, double lower, double upper, ImportExportCallback const &cb); protected: void AddBoolToggleData(struct _GtkToggleButton &object, ImportExportCallback const &cb); void AddIntRadioData(struct _GtkRadioButton &object, ImportExportCallback const &cb); void AddTextEntryData(struct _GtkEntry &object, ImportExportCallback const &cb); void AddIntEntryData(struct _GtkEntry &object, ImportExportCallback const &cb); void AddSizeEntryData(struct _GtkEntry &object, ImportExportCallback const &cb); void AddFloatEntryData(struct _GtkEntry &object, ImportExportCallback const &cb); void AddFloatSpinnerData(struct _GtkSpinButton &object, ImportExportCallback const &cb); void AddIntSpinnerData(struct _GtkSpinButton &object, ImportExportCallback const &cb); void AddIntAdjustmentData(struct _GtkAdjustment &object, ImportExportCallback const &cb); void AddIntComboData(struct _GtkComboBox &object, ImportExportCallback const &cb); void AddDialogData( struct _GtkToggleButton& object, bool& data ); void AddDialogData( struct _GtkRadioButton& object, int& data ); void AddDialogData( struct _GtkEntry& object, CopiedString& data ); void AddDialogData( struct _GtkEntry& object, int& data ); void AddDialogData( struct _GtkEntry& object, std::size_t& data ); void AddDialogData( struct _GtkEntry& object, float& data ); void AddDialogData( struct _GtkSpinButton& object, float& data ); void AddDialogData( struct _GtkSpinButton& object, int& data ); void AddDialogData( struct _GtkAdjustment& object, int& data ); void AddDialogData( struct _GtkComboBox& object, int& data ); }; #endif