X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fmoof%2Fmodal_dialog.hh;fp=src%2Fmoof%2Fmodal_dialog.hh;h=65bc61f79e54b286c3a511899888adaaa3ef2469;hb=831f04d4bc19a390415ac0bbac4331c7a65509bc;hp=0000000000000000000000000000000000000000;hpb=299af4f2047e767e5d79501c26444473bda64c64;p=chaz%2Fyoink diff --git a/src/moof/modal_dialog.hh b/src/moof/modal_dialog.hh new file mode 100644 index 0000000..65bc61f --- /dev/null +++ b/src/moof/modal_dialog.hh @@ -0,0 +1,202 @@ + +/*] Copyright (c) 2009-2010, Charles McGarvey [************************** +**] All rights reserved. +* +* vi:ts=4 sw=4 tw=75 +* +* Distributable under the terms and conditions of the 2-clause BSD license; +* see the file COPYING for a complete text of the license. +* +**************************************************************************/ + +#ifndef _MOOF_MODAL_DIALOG_HH_ +#define _MOOF_MODAL_DIALOG_HH_ + +/** + * \file modal_dialog.hh + * A class for creating and running modal dialogs. Several toolkits are + * supported, but only one can be used as determined at build time. + */ + +#include + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#if defined(_WIN32) +#include +#elif USE_GTK +#include +#elif USE_QT4 +#include +#include +#include +#endif + +#include +#include + + +namespace moof { + + +/** + * Small wrapper over various user interface modal dialog windows. + */ + +struct modal_dialog +{ + enum type + { + information = 1, + warning = 2, + error = 3 + }; + + + std::string title; + type type; + std::string text1; + std::string text2; + + + /** + * Construct a dialog box. + * \param type The type of dialog, indicating its priority. + * \param title The text used as the title of the dialog. + * \param text1 The first line of the dialog window. + * \param text2 The second line. + */ + modal_dialog(enum type type = information, + const std::string& title = "", + const std::string& text1 = "", + const std::string& text2 = "") : + title(title), + type(type), + text1(text1), + text2(text2) {} + + + void run() const + { + switch (type) + { + case warning: + log_warning(text1); + log_warning(text2); + break; + case error: + log_error(text1); + log_error(text2); + break; + default: + log_info(text1); + log_info(text2); + break; + } + +#if defined(_WIN32) + + int icon_type; + switch (type) + { + case warning: + icon_type = MB_ICONWARNING; + break; + case error: + icon_type = MB_ICONERROR; + break; + default: + icon_type = MB_ICONINFORMATION; + break; + } + + MessageBox(0, (text1 + "\n" + text2).c_str(), title.c_str(), + MB_OK | icon_type); + +#elif USE_GTK + + int argc = 0; + char** argv; + gtk_init(&argc, &argv); + + GtkMessageType icon_type; + switch (type) + { + case warning: + icon_type = GTK_MESSAGE_WARNING; + break; + case error: + icon_type = GTK_MESSAGE_ERROR; + break; + default: + icon_type = GTK_MESSAGE_INFO; + break; + } + + GtkWidget* dialog = gtk_message_dialog_new(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, icon_type, + GTK_BUTTONS_CLOSE, "%s", text1.c_str()); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + "%s", text2.c_str()); + gtk_window_set_title(GTK_WINDOW(dialog), title.c_str()); + + std::string icon_path(PACKAGE".png"); + if (resource::find_path(icon_path)) + { + GdkPixbuf* iconPixbuf = gdk_pixbuf_new_from_file(icon_path.c_str(), + NULL); + gtk_window_set_icon(GTK_WINDOW(dialog), iconPixbuf); + } + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + // FIXME - this doesn't seem to actually remove the window from the + // screen when it closes + +#elif USE_QT4 + + int argc = 0; + char** argv; + QApplication qt_app(argc, argv); + + QMessageBox::Icon icon_type; + switch (type) + { + case warning: + icon_type = QMessageBox::Warning; + break; + case error: + icon_type = QMessageBox::Critical; + break; + default: + icon_type = QMessageBox::Information; + break; + } + + QMessageBox dialog; + dialog.setWindowTitle(title.c_str()); + dialog.setIcon(icon_type); + dialog.setText(text1.c_str()); + dialog.setInformativeText(text2.c_str()); + dialog.setStandardButtons(QMessageBox::Close); + + std::string icon_path(PACKAGE".png"); + if (resource::find_path(icon_path)) + { + QIcon icon(icon_path.c_str()); + dialog.setWindowIcon(icon); + } + + dialog.exec(); + +#endif + } +}; + + +} // namespace moof + +#endif // _MOOF_MODAL_DIALOG_HH_ +