1 /***********************************************************************
2     created:    24/9/2004
3     author:     Paul D Turner
4 *************************************************************************/
5 /***************************************************************************
6  *   Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
7  *
8  *   Permission is hereby granted, free of charge, to any person obtaining
9  *   a copy of this software and associated documentation files (the
10  *   "Software"), to deal in the Software without restriction, including
11  *   without limitation the rights to use, copy, modify, merge, publish,
12  *   distribute, sublicense, and/or sell copies of the Software, and to
13  *   permit persons to whom the Software is furnished to do so, subject to
14  *   the following conditions:
15  *
16  *   The above copyright notice and this permission notice shall be
17  *   included in all copies or substantial portions of the Software.
18  *
19  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22  *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23  *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24  *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  *   OTHER DEALINGS IN THE SOFTWARE.
26  ***************************************************************************/
27 #include "GTK2CEGuiRendererSelector.h"
28 
29 // Renderer name strings
30 const std::string GTK2CEGuiRendererSelector::OgreRendererName("Ogre3D Engine Renderer");
31 const std::string GTK2CEGuiRendererSelector::OpenGLRendererName("OpenGL Renderer (using glut)");
32 const std::string GTK2CEGuiRendererSelector::IrrlichtRendererName("Irrlicht Engine Renderer");
33 
34 
35 
GTK2CEGuiRendererSelector()36 GTK2CEGuiRendererSelector::GTK2CEGuiRendererSelector()
37 {
38     // fake args for gtk_init
39     int argc = 1;
40     char* argv = "SampleApp";
41     char** pargv = &argv;
42 
43     gtk_init (&argc, &pargv);
44 
45     createDialog();
46 }
47 
~GTK2CEGuiRendererSelector()48 GTK2CEGuiRendererSelector::~GTK2CEGuiRendererSelector()
49 {
50 }
51 
invokeDialog()52 bool GTK2CEGuiRendererSelector::invokeDialog()
53 {
54     CEGuiRendererType renderer_types[3];
55     int idx = 0;
56 
57     // Put items in the combobox for enabled renderers.
58     if (d_rendererAvailability[OgreGuiRendererType])
59     {
60         gtk_combo_box_append_text(GTK_COMBO_BOX(d_combobox1), OgreRendererName.c_str());
61         renderer_types[idx++] = OgreGuiRendererType;
62     }
63     if (d_rendererAvailability[OpenGLGuiRendererType])
64     {
65         gtk_combo_box_append_text(GTK_COMBO_BOX(d_combobox1), OpenGLRendererName.c_str());
66         renderer_types[idx++] = OpenGLGuiRendererType;
67     }
68     if (d_rendererAvailability[IrrlichtGuiRendererType])
69     {
70         gtk_combo_box_append_text(GTK_COMBO_BOX(d_combobox1), IrrlichtRendererName.c_str());
71         renderer_types[idx++] = IrrlichtGuiRendererType;
72     }
73 
74     gtk_widget_show(d_dialog);
75     gtk_main ();
76 
77     if (!d_cancelled)
78     {
79         gint active = gtk_combo_box_get_active(GTK_COMBO_BOX(d_combobox1));
80 
81         if (active != -1)
82         {
83             d_lastSelected = renderer_types[active];
84         }
85         else
86         {
87             d_cancelled = true;
88         }
89 
90     }
91 
92     return !d_cancelled;
93 }
94 
createDialog()95 void GTK2CEGuiRendererSelector::createDialog()
96 {
97     d_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
98     gtk_widget_set_size_request(d_dialog, 320, 100);
99     gtk_window_set_title(GTK_WINDOW(d_dialog), "CEGui - Renderer Selection");
100     gtk_window_set_position(GTK_WINDOW(d_dialog), GTK_WIN_POS_CENTER);
101     gtk_window_set_resizable(GTK_WINDOW(d_dialog), FALSE);
102     gtk_window_set_type_hint(GTK_WINDOW(d_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
103 
104     d_vbox1 = gtk_vbox_new(FALSE, 10);
105     gtk_widget_show(d_vbox1);
106     gtk_container_add(GTK_CONTAINER(d_dialog), d_vbox1);
107 
108     d_label1 = gtk_label_new("Select Renderer:");
109     gtk_widget_show(d_label1);
110     gtk_box_pack_start(GTK_BOX(d_vbox1), d_label1, FALSE, FALSE, 0);
111     gtk_misc_set_alignment(GTK_MISC(d_label1), 0, 0.5);
112 
113     d_hbox1 = gtk_hbox_new(FALSE, 0);
114     gtk_widget_show(d_hbox1);
115     gtk_box_pack_end(GTK_BOX(d_vbox1), d_hbox1, FALSE, TRUE, 5);
116 
117     d_cancelButton = gtk_button_new_from_stock("gtk-cancel");
118     gtk_widget_show(d_cancelButton);
119     gtk_box_pack_start(GTK_BOX(d_hbox1), d_cancelButton, TRUE, FALSE, 0);
120 
121     d_okButton = gtk_button_new_from_stock("gtk-ok");
122     gtk_widget_show(d_okButton);
123     gtk_box_pack_start(GTK_BOX(d_hbox1), d_okButton, TRUE, FALSE, 0);
124 
125     d_combobox1 = gtk_combo_box_new_text();
126     gtk_widget_show(d_combobox1);
127     gtk_box_pack_start(GTK_BOX(d_vbox1), d_combobox1, TRUE, FALSE, 0);
128 
129     g_signal_connect((gpointer) d_cancelButton, "clicked",
130                        G_CALLBACK(GTK2CEGuiRendererSelector::on_cancelButton_clicked),
131                        this);
132     g_signal_connect((gpointer) d_okButton, "clicked",
133                        G_CALLBACK(GTK2CEGuiRendererSelector::on_okButton_clicked),
134                        this);
135 }
136 
on_cancelButton_clicked(GtkButton * button,gpointer user_data)137 void GTK2CEGuiRendererSelector::on_cancelButton_clicked(GtkButton* button, gpointer user_data)
138 {
139     static_cast<GTK2CEGuiRendererSelector*>(user_data)->d_cancelled = true;
140     gtk_widget_hide(static_cast<GTK2CEGuiRendererSelector*>(user_data)->d_dialog);
141     gtk_main_quit();
142 }
143 
on_okButton_clicked(GtkButton * button,gpointer user_data)144 void GTK2CEGuiRendererSelector::on_okButton_clicked(GtkButton* button, gpointer user_data)
145 {
146     static_cast<GTK2CEGuiRendererSelector*>(user_data)->d_cancelled = false;
147     gtk_widget_hide(static_cast<GTK2CEGuiRendererSelector*>(user_data)->d_dialog);
148     gtk_main_quit();
149 }
150