mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-12-01 11:56:58 -05:00
217 lines
6.1 KiB
C++
217 lines
6.1 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Product: OpenCTM tools
|
|
// File: sysdialog_gtk.cpp
|
|
// Description: Implementation of system GUI dialog routines for GTK+.
|
|
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2009-2010 Marcus Geelnard
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would be
|
|
// appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such, and must not
|
|
// be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source
|
|
// distribution.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include <gtk/gtk.h>
|
|
#include "sysdialog.h"
|
|
|
|
using namespace std;
|
|
|
|
|
|
/// Constructor.
|
|
SysMessageBox::SysMessageBox()
|
|
{
|
|
mMessageType = mtInformation;
|
|
}
|
|
|
|
/// Show the dialog.
|
|
bool SysMessageBox::Show()
|
|
{
|
|
// Init GTK+
|
|
if(!gtk_init_check(0, NULL))
|
|
return false;
|
|
|
|
// Select message type
|
|
GtkMessageType messageType;
|
|
switch(mMessageType)
|
|
{
|
|
default:
|
|
case mtInformation:
|
|
messageType = GTK_MESSAGE_INFO;
|
|
break;
|
|
case mtWarning:
|
|
messageType = GTK_MESSAGE_WARNING;
|
|
break;
|
|
case mtError:
|
|
messageType = GTK_MESSAGE_ERROR;
|
|
break;
|
|
}
|
|
|
|
// Create dialog widget
|
|
GtkWidget * dialog = gtk_message_dialog_new(
|
|
NULL,
|
|
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
messageType,
|
|
GTK_BUTTONS_OK,
|
|
mText.c_str(), "title");
|
|
gtk_window_set_title(GTK_WINDOW(dialog), mCaption.c_str());
|
|
|
|
// Show the dialog
|
|
gint dlgResult = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
|
|
// Free the dialog widget (we're done with it)
|
|
gtk_widget_destroy(dialog);
|
|
while(gtk_events_pending()) gtk_main_iteration();
|
|
|
|
// Evaluate dialog result
|
|
return (dlgResult == GTK_RESPONSE_ACCEPT);
|
|
}
|
|
|
|
|
|
/// Constructor
|
|
SysOpenDialog::SysOpenDialog()
|
|
{
|
|
mCaption = "Open File";
|
|
}
|
|
|
|
/// Show the dialog.
|
|
bool SysOpenDialog::Show()
|
|
{
|
|
// Init GTK+
|
|
if(!gtk_init_check(0, NULL))
|
|
return true;
|
|
|
|
// Create dialog widget
|
|
GtkWidget * dialog = gtk_file_chooser_dialog_new(
|
|
mCaption.c_str(),
|
|
NULL,
|
|
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
|
NULL);
|
|
|
|
// Add filters
|
|
for(list<string>::iterator i = mFilters.begin(); i != mFilters.end(); ++ i)
|
|
{
|
|
size_t splitPos = (*i).find("|");
|
|
if(splitPos != string::npos)
|
|
{
|
|
string name = (*i).substr(0, splitPos);
|
|
string pattern = (*i).substr(splitPos + 1);
|
|
GtkFileFilter * filter = gtk_file_filter_new();
|
|
gtk_file_filter_set_name(filter, name.c_str());
|
|
size_t pos1 = 0;
|
|
while(pos1 != string::npos)
|
|
{
|
|
size_t pos2 = pattern.find(";", pos1);
|
|
gtk_file_filter_add_pattern(filter, (pattern.substr(pos1, pos2 - pos1)).c_str());
|
|
if(pos2 != string::npos)
|
|
pos1 = pos2 + 1;
|
|
else
|
|
pos1 = pos2;
|
|
}
|
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
|
}
|
|
}
|
|
|
|
// Show the dialog
|
|
gint dlgResult = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
|
|
// Extract the resulting file name
|
|
if(dlgResult == GTK_RESPONSE_ACCEPT)
|
|
{
|
|
char * fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
mFileName = string(fileName);
|
|
g_free(fileName);
|
|
}
|
|
|
|
// Free the dialog widget (we're done with it)
|
|
gtk_widget_destroy(dialog);
|
|
while(gtk_events_pending()) gtk_main_iteration();
|
|
|
|
// Evaluate dialog result
|
|
return (dlgResult == GTK_RESPONSE_ACCEPT);
|
|
}
|
|
|
|
|
|
/// Constructor
|
|
SysSaveDialog::SysSaveDialog()
|
|
{
|
|
mCaption = "Save File";
|
|
}
|
|
|
|
/// Show the dialog.
|
|
bool SysSaveDialog::Show()
|
|
{
|
|
// Init GTK+
|
|
if(!gtk_init_check(0, NULL))
|
|
return true;
|
|
|
|
// Create dialog widget
|
|
GtkWidget * dialog = gtk_file_chooser_dialog_new(
|
|
mCaption.c_str(),
|
|
NULL,
|
|
GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
|
|
NULL);
|
|
|
|
// Configure the dialog
|
|
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), mFileName.c_str());
|
|
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
|
|
|
|
// Add filters
|
|
for(list<string>::iterator i = mFilters.begin(); i != mFilters.end(); ++ i)
|
|
{
|
|
size_t splitPos = (*i).find("|");
|
|
if(splitPos != string::npos)
|
|
{
|
|
string name = (*i).substr(0, splitPos);
|
|
string pattern = (*i).substr(splitPos + 1);
|
|
GtkFileFilter * filter = gtk_file_filter_new();
|
|
gtk_file_filter_set_name(filter, name.c_str());
|
|
size_t pos1 = 0;
|
|
while(pos1 != string::npos)
|
|
{
|
|
size_t pos2 = pattern.find(";", pos1);
|
|
gtk_file_filter_add_pattern(filter, (pattern.substr(pos1, pos2 - pos1)).c_str());
|
|
if(pos2 != string::npos)
|
|
pos1 = pos2 + 1;
|
|
else
|
|
pos1 = pos2;
|
|
}
|
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
|
}
|
|
}
|
|
|
|
// Show the dialog
|
|
gint dlgResult = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
|
|
// Extract the resulting file name
|
|
if(dlgResult == GTK_RESPONSE_ACCEPT)
|
|
{
|
|
char * fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
mFileName = string(fileName);
|
|
g_free(fileName);
|
|
}
|
|
|
|
// Free the dialog widget (we're done with it)
|
|
gtk_widget_destroy(dialog);
|
|
while(gtk_events_pending()) gtk_main_iteration();
|
|
|
|
// Evaluate dialog result
|
|
return (dlgResult == GTK_RESPONSE_ACCEPT);
|
|
}
|