/** * @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 . */ #include #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) : GenericDialog(key), _setScaleDialog(setScaleDialog), _rowTexInfoCallback( MeshEntity::TexInfoCallbackMethod(*setScaleDialog)), _colTexInfoCallback( MeshEntity::TexInfoCallbackMethod(*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(); gtk_object_set_data(GTK_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(); gtk_object_set_data(GTK_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(); gtk_object_set_data(GTK_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(); gtk_object_set_data(GTK_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); gtk_object_set_data(GTK_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 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; }