Introduce Property<T> to simplify preferences system
[xonotic/netradiant.git] / radiant / dialog.h
1 /*
2    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #if !defined( INCLUDED_DIALOG_H )
23 #define INCLUDED_DIALOG_H
24
25 #include <list>
26 #include <uilib/uilib.h>
27 #include "property.h"
28
29 #include "generic/callback.h"
30 #include "gtkutil/dialog.h"
31 #include "generic/callback.h"
32 #include "string/string.h"
33
34 struct DLG_DATA
35 {
36         virtual ~DLG_DATA() = default;
37         virtual void release() = 0;
38         virtual void importData() const = 0;
39         virtual void exportData() const = 0;
40 };
41
42
43 template<typename FirstArgument>
44 class CallbackDialogData;
45
46 typedef std::list<DLG_DATA*> DialogDataList;
47
48 class Dialog
49 {
50 ui::Window m_window;
51 DialogDataList m_data;
52 public:
53 ModalDialog m_modal;
54 ui::Window m_parent;
55
56 Dialog();
57 virtual ~Dialog();
58
59 /*!
60    start modal dialog box
61    you need to use AddModalButton to select eIDOK eIDCANCEL buttons
62  */
63 EMessageBoxReturn DoModal();
64 void EndModal( EMessageBoxReturn code );
65 virtual ui::Window BuildDialog() = 0;
66 virtual void exportData();
67 virtual void importData();
68 virtual void PreModal() { };
69 virtual void PostModal( EMessageBoxReturn code ) { };
70 virtual void ShowDlg();
71 virtual void HideDlg();
72 void Create();
73 void Destroy();
74 ui::Window GetWidget(){
75         return m_window;
76 }
77 const ui::Window GetWidget() const {
78         return m_window;
79 }
80
81     ui::CheckButton addCheckBox(ui::VBox vbox, const char *name, const char *flag, Property<bool> const &cb);
82 ui::CheckButton addCheckBox( ui::VBox vbox, const char* name, const char* flag, bool& data );
83
84     void addCombo(ui::VBox vbox, const char *name, StringArrayRange values, Property<int> const &cb);
85 void addCombo( ui::VBox vbox, const char* name, int& data, StringArrayRange values );
86 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 );
87
88     void addRadio(ui::VBox vbox, const char *name, StringArrayRange names, Property<int> const &cb);
89 void addRadio( ui::VBox vbox, const char* name, int& data, StringArrayRange names );
90
91     void addRadioIcons(ui::VBox vbox, const char *name, StringArrayRange icons, Property<int> const &cb);
92 void addRadioIcons( ui::VBox vbox, const char* name, int& data, StringArrayRange icons );
93
94     ui::Widget addIntEntry(ui::VBox vbox, const char *name, Property<int> const &cb);
95 ui::Widget addEntry( ui::VBox vbox, const char* name, int& data ){
96     return addIntEntry(vbox, name, make_property(data));
97 }
98
99     ui::Widget addSizeEntry(ui::VBox vbox, const char *name, Property<std::size_t> const &cb);
100 ui::Widget addEntry( ui::VBox vbox, const char* name, std::size_t& data ){
101     return addSizeEntry(vbox, name, make_property(data));
102 }
103
104     ui::Widget addFloatEntry(ui::VBox vbox, const char *name, Property<float> const &cb);
105 ui::Widget addEntry( ui::VBox vbox, const char* name, float& data ){
106     return addFloatEntry(vbox, name, make_property(data));
107 }
108
109     ui::Widget
110     addPathEntry(ui::VBox vbox, const char *name, bool browse_directory, Property<const char *> const &cb);
111 ui::Widget addPathEntry( ui::VBox vbox, const char* name, CopiedString& data, bool directory );
112 ui::SpinButton addSpinner( ui::VBox vbox, const char* name, int& data, double value, double lower, double upper );
113
114     ui::SpinButton
115     addSpinner(ui::VBox vbox, const char *name, double value, double lower, double upper, Property<int> const &cb);
116
117     ui::SpinButton addSpinner(ui::VBox vbox, const char *name, double value, double lower, double upper,
118                               Property<float> const &cb);
119
120 protected:
121
122     void AddBoolToggleData(struct _GtkToggleButton &object, Property<bool> const &cb);
123
124     void AddIntRadioData(struct _GtkRadioButton &object, Property<int> const &cb);
125
126     void AddTextEntryData(struct _GtkEntry &object, Property<const char *> const &cb);
127
128     void AddIntEntryData(struct _GtkEntry &object, Property<int> const &cb);
129
130     void AddSizeEntryData(struct _GtkEntry &object, Property<std::size_t> const &cb);
131
132     void AddFloatEntryData(struct _GtkEntry &object, Property<float> const &cb);
133
134     void AddFloatSpinnerData(struct _GtkSpinButton &object, Property<float> const &cb);
135
136     void AddIntSpinnerData(struct _GtkSpinButton &object, Property<int> const &cb);
137
138     void AddIntAdjustmentData(struct _GtkAdjustment &object, Property<int> const &cb);
139
140     void AddIntComboData(struct _GtkComboBox &object, Property<int> const &cb);
141
142 void AddDialogData( struct _GtkToggleButton& object, bool& data );
143 void AddDialogData( struct _GtkRadioButton& object, int& data );
144 void AddDialogData( struct _GtkEntry& object, CopiedString& data );
145 void AddDialogData( struct _GtkEntry& object, int& data );
146 void AddDialogData( struct _GtkEntry& object, std::size_t& data );
147 void AddDialogData( struct _GtkEntry& object, float& data );
148 void AddDialogData( struct _GtkSpinButton& object, float& data );
149 void AddDialogData( struct _GtkSpinButton& object, int& data );
150 void AddDialogData( struct _GtkAdjustment& object, int& data );
151 void AddDialogData( struct _GtkComboBox& object, int& data );
152 };
153
154 #endif