Add 'Arbitrary Move' command and dialog to the Modify menu.
This commit is contained in:
parent
00f967f070
commit
cc5f83e191
3 changed files with 142 additions and 0 deletions
|
@ -2160,6 +2160,7 @@ ui::MenuItem create_selection_menu()
|
||||||
create_menu_item_with_mnemonic(menu_in_menu, "Flip _Z", "MirrorSelectionZ");
|
create_menu_item_with_mnemonic(menu_in_menu, "Flip _Z", "MirrorSelectionZ");
|
||||||
}
|
}
|
||||||
menu_separator(menu);
|
menu_separator(menu);
|
||||||
|
create_menu_item_with_mnemonic(menu, "Arbitrary move...", "ArbitraryMove");
|
||||||
create_menu_item_with_mnemonic(menu, "Arbitrary rotation...", "ArbitraryRotation");
|
create_menu_item_with_mnemonic(menu, "Arbitrary rotation...", "ArbitraryRotation");
|
||||||
create_menu_item_with_mnemonic(menu, "Arbitrary scale...", "ArbitraryScale");
|
create_menu_item_with_mnemonic(menu, "Arbitrary scale...", "ArbitraryScale");
|
||||||
create_menu_item_with_mnemonic(menu, "Find brush...", "FindBrush");
|
create_menu_item_with_mnemonic(menu, "Find brush...", "FindBrush");
|
||||||
|
@ -3207,6 +3208,7 @@ void MainFrame_Construct()
|
||||||
GlobalCommands_insert("MirrorSelectionZ", makeCallbackF(Selection_Flipz));
|
GlobalCommands_insert("MirrorSelectionZ", makeCallbackF(Selection_Flipz));
|
||||||
GlobalCommands_insert("RotateSelectionZ", makeCallbackF(Selection_Rotatez));
|
GlobalCommands_insert("RotateSelectionZ", makeCallbackF(Selection_Rotatez));
|
||||||
|
|
||||||
|
GlobalCommands_insert("ArbitraryMove", makeCallbackF(DoMoveDlg));
|
||||||
GlobalCommands_insert("ArbitraryRotation", makeCallbackF(DoRotateDlg));
|
GlobalCommands_insert("ArbitraryRotation", makeCallbackF(DoRotateDlg));
|
||||||
GlobalCommands_insert("ArbitraryScale", makeCallbackF(DoScaleDlg));
|
GlobalCommands_insert("ArbitraryScale", makeCallbackF(DoScaleDlg));
|
||||||
|
|
||||||
|
|
139
src/select.cpp
139
src/select.cpp
|
@ -1280,3 +1280,142 @@ void DoScaleDlg()
|
||||||
|
|
||||||
g_scale_dialog.window.show();
|
g_scale_dialog.window.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* NEW: Artbirary Move */
|
||||||
|
|
||||||
|
struct MoveDialog {
|
||||||
|
ui::Entry x{ui::null};
|
||||||
|
ui::Entry y{ui::null};
|
||||||
|
ui::Entry z{ui::null};
|
||||||
|
ui::Window window{ui::null};
|
||||||
|
};
|
||||||
|
|
||||||
|
static gboolean movedlg_apply(ui::Widget widget, MoveDialog *moveDialog)
|
||||||
|
{
|
||||||
|
float sx, sy, sz;
|
||||||
|
|
||||||
|
sx = static_cast<float>( atof(gtk_entry_get_text(GTK_ENTRY(moveDialog->x))));
|
||||||
|
sy = static_cast<float>( atof(gtk_entry_get_text(GTK_ENTRY(moveDialog->y))));
|
||||||
|
sz = static_cast<float>( atof(gtk_entry_get_text(GTK_ENTRY(moveDialog->z))));
|
||||||
|
|
||||||
|
StringOutputStream command;
|
||||||
|
command << "nudgeSelected -axis x " << sx;
|
||||||
|
command << "nudgeSelected -axis y " << sy;
|
||||||
|
command << "nudgeSelected -axis z " << sz;
|
||||||
|
UndoableCommand undo(command.c_str());
|
||||||
|
|
||||||
|
Nudge(0, sx);
|
||||||
|
Nudge(1, sy);
|
||||||
|
Nudge(2, sz);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean movedlg_cancel(ui::Widget widget, MoveDialog *moveDialog)
|
||||||
|
{
|
||||||
|
moveDialog->window.hide();
|
||||||
|
|
||||||
|
moveDialog->x.text("0.0");
|
||||||
|
moveDialog->y.text("0.0");
|
||||||
|
moveDialog->z.text("0.0");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean movedlg_ok(ui::Widget widget, MoveDialog *moveDialog)
|
||||||
|
{
|
||||||
|
movedlg_apply(widget, moveDialog);
|
||||||
|
moveDialog->window.hide();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean movedlg_delete(ui::Widget widget, GdkEventAny *event, MoveDialog *moveDialog)
|
||||||
|
{
|
||||||
|
movedlg_cancel(widget, moveDialog);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MoveDialog g_move_dialog;
|
||||||
|
|
||||||
|
void DoMoveDlg()
|
||||||
|
{
|
||||||
|
if (!g_move_dialog.window) {
|
||||||
|
g_move_dialog.window = MainFrame_getWindow().create_dialog_window("Arbitrary scale",
|
||||||
|
G_CALLBACK(movedlg_delete),
|
||||||
|
&g_move_dialog);
|
||||||
|
|
||||||
|
auto accel = ui::AccelGroup(ui::New);
|
||||||
|
g_move_dialog.window.add_accel_group(accel);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto hbox = create_dialog_hbox(4, 4);
|
||||||
|
g_move_dialog.window.add(hbox);
|
||||||
|
{
|
||||||
|
auto table = create_dialog_table(3, 2, 4, 4);
|
||||||
|
hbox.pack_start(table, TRUE, TRUE, 0);
|
||||||
|
{
|
||||||
|
ui::Widget label = ui::Label(" X ");
|
||||||
|
label.show();
|
||||||
|
table.attach(label, {0, 1, 0, 1}, {0, 0});
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ui::Widget label = ui::Label(" Y ");
|
||||||
|
label.show();
|
||||||
|
table.attach(label, {0, 1, 1, 2}, {0, 0});
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ui::Widget label = ui::Label(" Z ");
|
||||||
|
label.show();
|
||||||
|
table.attach(label, {0, 1, 2, 3}, {0, 0});
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto entry = ui::Entry(ui::New);
|
||||||
|
entry.text("0.0");
|
||||||
|
entry.show();
|
||||||
|
table.attach(entry, {1, 2, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
|
||||||
|
|
||||||
|
g_move_dialog.x = entry;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto entry = ui::Entry(ui::New);
|
||||||
|
entry.text("0.0");
|
||||||
|
entry.show();
|
||||||
|
table.attach(entry, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
|
||||||
|
|
||||||
|
g_move_dialog.y = entry;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto entry = ui::Entry(ui::New);
|
||||||
|
entry.text("0.0");
|
||||||
|
entry.show();
|
||||||
|
table.attach(entry, {1, 2, 2, 3}, {GTK_EXPAND | GTK_FILL, 0});
|
||||||
|
|
||||||
|
g_move_dialog.z = entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto vbox = create_dialog_vbox(4);
|
||||||
|
hbox.pack_start(vbox, TRUE, TRUE, 0);
|
||||||
|
{
|
||||||
|
auto button = create_dialog_button("OK", G_CALLBACK(movedlg_ok), &g_move_dialog);
|
||||||
|
vbox.pack_start(button, FALSE, FALSE, 0);
|
||||||
|
widget_make_default(button);
|
||||||
|
gtk_widget_add_accelerator(button, "clicked", accel, GDK_KEY_Return, (GdkModifierType) 0,
|
||||||
|
(GtkAccelFlags) 0);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto button = create_dialog_button("Cancel", G_CALLBACK(movedlg_cancel), &g_move_dialog);
|
||||||
|
vbox.pack_start(button, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_add_accelerator(button, "clicked", accel, GDK_KEY_Escape, (GdkModifierType) 0,
|
||||||
|
(GtkAccelFlags) 0);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto button = create_dialog_button("Apply", G_CALLBACK(movedlg_apply), &g_move_dialog);
|
||||||
|
vbox.pack_start(button, FALSE, FALSE, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_move_dialog.window.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ void DoRotateDlg();
|
||||||
|
|
||||||
void DoScaleDlg();
|
void DoScaleDlg();
|
||||||
|
|
||||||
|
void DoMoveDlg();
|
||||||
|
|
||||||
void Select_SetShader(const char *shader);
|
void Select_SetShader(const char *shader);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue