288 lines
9.3 KiB
C++
288 lines
9.3 KiB
C++
/**
|
|
* @file GetInfoDialog.cpp
|
|
* Implements the GetInfoDialog class.
|
|
* @ingroup meshtex-ui
|
|
*/
|
|
|
|
/*
|
|
* Copyright 2012 Joel Baxter
|
|
*
|
|
* This file is part of MeshTex.
|
|
*
|
|
* MeshTex 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.
|
|
*
|
|
* MeshTex 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 MeshTex. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
#include "GenericPluginUI.h"
|
|
#include "GetInfoDialog.h"
|
|
#include "PluginUIMessages.h"
|
|
|
|
|
|
/**
|
|
* Constructor. See MeshEntity::GetInfo for details of how these arguments
|
|
* are interpreted.
|
|
*
|
|
* @param refRow Pointer to reference row number; NULL if none.
|
|
* @param refCol Pointer to reference column number; NULL if none.
|
|
* @param rowTexInfoCallback Pointer to callback for reference row info; NULL
|
|
* if none.
|
|
* @param colTexInfoCallback Pointer to callback for reference column info;
|
|
* NULL if none.
|
|
*/
|
|
GetInfoDialog::GetInfoVisitor::GetInfoVisitor(
|
|
const int *refRow,
|
|
const int *refCol,
|
|
const MeshEntity::TexInfoCallback *rowTexInfoCallback,
|
|
const MeshEntity::TexInfoCallback *colTexInfoCallback) :
|
|
_refRow(refRow),
|
|
_refCol(refCol),
|
|
_rowTexInfoCallback(rowTexInfoCallback),
|
|
_colTexInfoCallback(colTexInfoCallback)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Visitor action; invoke MeshEntity::GetInfo on a mesh.
|
|
*
|
|
* @param [in,out] meshEntity The mesh.
|
|
*
|
|
* @return true.
|
|
*/
|
|
bool
|
|
GetInfoDialog::GetInfoVisitor::Execute(MeshEntity& meshEntity) const
|
|
{
|
|
meshEntity.GetInfo(_refRow, _refCol, _rowTexInfoCallback, _colTexInfoCallback);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Constructor. Connect the row and column texture info callbacks to the
|
|
* appropriate methods on the Set S/T Scale dialog object. Configure the
|
|
* dialog window and create all the contained widgets. Connect widgets to
|
|
* callbacks as necessary.
|
|
*
|
|
* @param key The unique key identifying this dialog.
|
|
* @param setScaleDialog Reference-counted handle on the Set S/T Scale dialog.
|
|
*/
|
|
GetInfoDialog::GetInfoDialog(const std::string& key,
|
|
SmartPointer<SetScaleDialog>& setScaleDialog) :
|
|
GenericDialog(key),
|
|
_setScaleDialog(setScaleDialog),
|
|
_rowTexInfoCallback(
|
|
MeshEntity::TexInfoCallbackMethod<SetScaleDialog,
|
|
&SetScaleDialog::PopulateSWidgets>(*setScaleDialog)),
|
|
_colTexInfoCallback(
|
|
MeshEntity::TexInfoCallbackMethod<SetScaleDialog,
|
|
&SetScaleDialog::PopulateTWidgets>(*setScaleDialog)),
|
|
_nullVisitor(new MeshVisitor())
|
|
{
|
|
// Enable the usual handling of the close event.
|
|
CreateWindowCloseCallback();
|
|
|
|
// Configure the dialog window.
|
|
gtk_window_set_resizable(GTK_WINDOW(_dialog), FALSE);
|
|
gtk_window_set_title(GTK_WINDOW(_dialog), DIALOG_GET_INFO_TITLE);
|
|
gtk_container_set_border_width(GTK_CONTAINER(_dialog), 10);
|
|
|
|
// Create the contained widgets.
|
|
|
|
GtkWidget *table;
|
|
GtkWidget *entry;
|
|
GtkWidget *button;
|
|
GtkWidget *label;
|
|
GtkWidget *hbox;
|
|
|
|
table = gtk_table_new(4, 3, FALSE);
|
|
gtk_table_set_row_spacing(GTK_TABLE(table), 1, 10);
|
|
gtk_table_set_row_spacing(GTK_TABLE(table), 2, 15);
|
|
gtk_container_add(GTK_CONTAINER(_dialog), table);
|
|
gtk_widget_show(table);
|
|
|
|
// Widgets for specifying the reference row if any.
|
|
|
|
button = gtk_check_button_new();
|
|
g_object_set_data(G_OBJECT(_dialog), "s_apply", button);
|
|
gtk_table_attach_defaults(GTK_TABLE(table), button, 0, 1, 0, 1);
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
|
|
gtk_widget_show(button);
|
|
|
|
label = gtk_label_new(DIALOG_GET_INFO_S_ROW_HEADER);
|
|
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
|
|
gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
|
|
gtk_widget_show(label);
|
|
|
|
entry = gtk_entry_new();
|
|
g_object_set_data(G_OBJECT(_dialog), "s_ref_row", entry);
|
|
gtk_entry_set_text(GTK_ENTRY(entry), "0");
|
|
gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 3, 0, 1);
|
|
gtk_widget_set_usize(entry, 50, -2);
|
|
gtk_widget_show(entry);
|
|
|
|
UIInstance().RegisterWidgetDependence(button, label);
|
|
UIInstance().RegisterWidgetDependence(button, entry);
|
|
|
|
// Widgets for specifying the reference column if any.
|
|
|
|
button = gtk_check_button_new();
|
|
g_object_set_data(G_OBJECT(_dialog), "t_apply", button);
|
|
gtk_table_attach_defaults(GTK_TABLE(table), button, 0, 1, 1, 2);
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
|
|
gtk_widget_show(button);
|
|
|
|
label = gtk_label_new(DIALOG_GET_INFO_T_COL_HEADER);
|
|
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
|
|
gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
|
|
gtk_widget_show(label);
|
|
|
|
entry = gtk_entry_new();
|
|
g_object_set_data(G_OBJECT(_dialog), "t_ref_col", entry);
|
|
gtk_entry_set_text(GTK_ENTRY(entry), "0");
|
|
gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 3, 1, 2);
|
|
gtk_widget_set_usize(entry, 50, -2);
|
|
gtk_widget_show(entry);
|
|
|
|
UIInstance().RegisterWidgetDependence(button, label);
|
|
UIInstance().RegisterWidgetDependence(button, entry);
|
|
|
|
// Checkbox to enable the callbacks to Set S/T Scale.
|
|
|
|
button = gtk_check_button_new_with_label(DIALOG_GET_INFO_XFER_OPT_LABEL);
|
|
g_object_set_data(G_OBJECT(_dialog), "transfer", button);
|
|
gtk_table_attach(GTK_TABLE(table), button, 0, 3, 2, 3, GTK_EXPAND, GTK_EXPAND, 0, 0);
|
|
gtk_widget_show(button);
|
|
|
|
hbox = gtk_hbox_new(FALSE, 0);
|
|
gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 3, 3, 4);
|
|
gtk_widget_show(hbox);
|
|
|
|
// Create Cancel button and hook it to callback.
|
|
|
|
button = gtk_button_new_with_label(DIALOG_CANCEL_BUTTON);
|
|
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
gtk_widget_set_usize(button, 60, -2);
|
|
gtk_widget_show(button);
|
|
|
|
CreateCancelButtonCallback(button);
|
|
|
|
// Create Apply button and hook it to callback.
|
|
|
|
button = gtk_button_new_with_label(DIALOG_APPLY_BUTTON);
|
|
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 10);
|
|
gtk_widget_set_usize (button, 60, -2);
|
|
gtk_widget_show(button);
|
|
|
|
CreateApplyButtonCallback(button);
|
|
|
|
// Create OK button and hook it to callback.
|
|
|
|
button = gtk_button_new_with_label(DIALOG_OK_BUTTON);
|
|
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
gtk_widget_set_usize (button, 60, -2);
|
|
gtk_widget_show(button);
|
|
|
|
CreateOkButtonCallback(button);
|
|
}
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
GetInfoDialog::~GetInfoDialog()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handler for the Apply logic for this dialog. Interrogate the selected mesh
|
|
* entities.
|
|
*
|
|
* @return false if no meshes are selected, false if multiple meshes are
|
|
* selected along with the transfer option, true otherwise.
|
|
*/
|
|
bool
|
|
GetInfoDialog::Apply()
|
|
{
|
|
// Before doing anything, check to see if there are some meshes selected.
|
|
_nullVisitor->ResetVisitedCount();
|
|
GlobalSelectionSystem().foreachSelected(*_nullVisitor);
|
|
if (_nullVisitor->GetVisitedCount() == 0)
|
|
{
|
|
// Nope. Warn and bail out.
|
|
GenericPluginUI::WarningReportDialog(DIALOG_WARNING_TITLE,
|
|
DIALOG_NOMESHES_MSG);
|
|
return false;
|
|
}
|
|
|
|
// If the option to transfer info to Set S/T Scale is active, then only one
|
|
// mesh may be selected.
|
|
bool transfer = NamedToggleWidgetActive("transfer");
|
|
if (transfer && _nullVisitor->GetVisitedCount() != 1)
|
|
{
|
|
// Multiple selected. Warn and bail out.
|
|
GenericPluginUI::ErrorReportDialog(DIALOG_ERROR_TITLE,
|
|
DIALOG_MULTIMESHES_ERROR);
|
|
return false;
|
|
}
|
|
|
|
// OK read the remaining info from the widgets.
|
|
|
|
bool sApply = NamedToggleWidgetActive("s_apply");
|
|
bool tApply = NamedToggleWidgetActive("t_apply");
|
|
|
|
int row, col;
|
|
int *refRow = NULL;
|
|
int *refCol = NULL;
|
|
MeshEntity::TexInfoCallback *rowTexInfoCallback = NULL;
|
|
MeshEntity::TexInfoCallback *colTexInfoCallback = NULL;
|
|
if (sApply)
|
|
{
|
|
// Reference row is specified, so get that info.
|
|
row = atoi(NamedEntryWidgetText("s_ref_row"));
|
|
refRow = &row;
|
|
if (transfer)
|
|
{
|
|
// If transferring to Set S/T Scale, get that callback.
|
|
rowTexInfoCallback = &_rowTexInfoCallback;
|
|
}
|
|
}
|
|
if (tApply)
|
|
{
|
|
// Reference column is specified, so get that info.
|
|
col = atoi(NamedEntryWidgetText("t_ref_col"));
|
|
refCol = &col;
|
|
if (transfer)
|
|
{
|
|
// If transferring to Set S/T Scale, get that callback.
|
|
colTexInfoCallback = &_colTexInfoCallback;
|
|
}
|
|
}
|
|
|
|
// We don't need to instantiate an UndoableCommand since we won't be making
|
|
// any changes.
|
|
|
|
// Interrogate every selected mesh.
|
|
SmartPointer<GetInfoVisitor> infoVisitor(
|
|
new GetInfoVisitor(refRow, refCol, rowTexInfoCallback, colTexInfoCallback));
|
|
GlobalSelectionSystem().foreachSelected(*infoVisitor);
|
|
|
|
// If we populated something in the Set S/T Scale dialog, give that dialog a
|
|
// courtesy raise.
|
|
if (transfer)
|
|
{
|
|
_setScaleDialog->Raise();
|
|
}
|
|
|
|
// Done!
|
|
return true;
|
|
}
|