Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions install/menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@
<menuItem name="texturelock" caption="Texture lock" command="TogTexLock" />
<menuSeparator />
<menuItem name="createdecals" caption="Create Decal Patches" command="CreateDecalsForFaces" icon="create_decals.png" />
<menuItem name="createtrim" caption="Create Trim..." command="CreateTrimDialog" />
<menuItem name="makevisportal" caption="Make Visportal" command="MakeVisportal" icon="make_visportal.png" />

<menuSeparator />
Expand Down
1 change: 1 addition & 0 deletions radiant/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ add_executable(darkradiant
ui/aas/RenderableAasFile.cpp
ui/about/AboutDialog.cpp
ui/array/ArrayDialog.cpp
ui/brush/CreateTrimDialog.cpp
ui/brush/FindBrush.cpp
ui/brush/QuerySidesDialog.cpp
ui/commandlist/CommandList.cpp
Expand Down
2 changes: 2 additions & 0 deletions radiant/ui/UserInterfaceModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
#include "ui/terrain/TerrainGeneratorDialog.h"
#include "ui/selectionset/SelectionSetToolmenu.h"
#include "ui/brush/QuerySidesDialog.h"
#include "ui/brush/CreateTrimDialog.h"
#include "ui/brush/FindBrush.h"
#include "ui/array/ArrayDialog.h"
#include "ui/mousetool/RegistrationHelper.h"
Expand Down Expand Up @@ -541,6 +542,7 @@ void UserInterfaceModule::registerUICommands()
GlobalCommandSystem().addCommand("ExportCollisionModelDialog", ExportCollisionModelDialog::Show);
GlobalCommandSystem().addWithCheck("QueryBrushPrefabSidesDialog", QuerySidesDialog::Show,
selection::pred::haveBrush, {cmd::ARGTYPE_INT});
GlobalCommandSystem().addCommand("CreateTrimDialog", CreateTrimDialog::CreateTrimCmd);

// Set up the CloneSelection command to react on key up events only
GlobalEventManager().addCommand("CloneSelection", "CloneSelection", true); // react on keyUp
Expand Down
102 changes: 102 additions & 0 deletions radiant/ui/brush/CreateTrimDialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#include "CreateTrimDialog.h"

#include "i18n.h"
#include "icommandsystem.h"
#include "iselection.h"
#include "string/convert.h"
#include "selectionlib.h"
#include "wxutil/dialog/MessageBox.h"

namespace
{
const char* WINDOW_TITLE = N_("Create Trim");
const char* LABEL_HEIGHT = N_("Trim Height:");
const char* LABEL_DEPTH = N_("Trim Depth:");
const char* LABEL_FIT_TO = N_("Fit To:");
const char* LABEL_MITERED = N_("45-degree mitered ends");

const double DEFAULT_HEIGHT = 16;
const double DEFAULT_DEPTH = 1;

const char* FIT_BOTTOM = N_("Bottom");
const char* FIT_TOP = N_("Top");
const char* FIT_LEFT = N_("Left");
const char* FIT_RIGHT = N_("Right");
}

namespace ui {

CreateTrimDialog::CreateTrimDialog() :
wxutil::Dialog(_(WINDOW_TITLE))
{
_heightHandle = addSpinButton(_(LABEL_HEIGHT), 1, 4096, 1, 0);
_depthHandle = addSpinButton(_(LABEL_DEPTH), 1, 4096, 1, 0);

ui::IDialog::ComboBoxOptions fitOptions;
fitOptions.push_back(_(FIT_BOTTOM));
fitOptions.push_back(_(FIT_TOP));
fitOptions.push_back(_(FIT_LEFT));
fitOptions.push_back(_(FIT_RIGHT));
_fitToHandle = addComboBox(_(LABEL_FIT_TO), fitOptions);

_miteredHandle = addCheckbox(_(LABEL_MITERED));

setElementValue(_heightHandle, string::to_string(DEFAULT_HEIGHT));
setElementValue(_depthHandle, string::to_string(DEFAULT_DEPTH));
setElementValue(_fitToHandle, _(FIT_BOTTOM));
setElementValue(_miteredHandle, "0");
}

bool CreateTrimDialog::QueryTrimParams(TrimParams& params)
{
auto* dialog = new CreateTrimDialog;

IDialog::Result result = dialog->run();

if (result == IDialog::RESULT_OK)
{
params.height = string::convert<double>(dialog->getElementValue(dialog->_heightHandle));
params.depth = string::convert<double>(dialog->getElementValue(dialog->_depthHandle));

std::string fitToStr = dialog->getElementValue(dialog->_fitToHandle);

if (fitToStr == _(FIT_TOP))
params.fitTo = FitTo::Top;
else if (fitToStr == _(FIT_LEFT))
params.fitTo = FitTo::Left;
else if (fitToStr == _(FIT_RIGHT))
params.fitTo = FitTo::Right;
else
params.fitTo = FitTo::Bottom;

params.mitered = (dialog->getElementValue(dialog->_miteredHandle) == "1");

return true;
}

return false;
}

void CreateTrimDialog::CreateTrimCmd(const cmd::ArgumentList& args)
{
if (GlobalSelectionSystem().getSelectionInfo().componentCount == 0)
{
wxutil::Messagebox::ShowError(_("Cannot create trim. No faces selected."));
return;
}

TrimParams params;

if (QueryTrimParams(params))
{
cmd::ArgumentList trimArgs;
trimArgs.push_back(params.height);
trimArgs.push_back(params.depth);
trimArgs.push_back(static_cast<int>(params.fitTo));
trimArgs.push_back(params.mitered ? 1 : 0);

GlobalCommandSystem().executeCommand("CreateTrimForFaces", trimArgs);
}
}

} // namespace
37 changes: 37 additions & 0 deletions radiant/ui/brush/CreateTrimDialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#pragma once

#include "icommandsystem.h"
#include "wxutil/dialog/Dialog.h"

namespace ui
{

class CreateTrimDialog :
public wxutil::Dialog
{
public:
enum class FitTo { Bottom, Top, Left, Right };

struct TrimParams
{
double height;
double depth;
FitTo fitTo;
bool mitered;
};

private:
Handle _heightHandle;
Handle _depthHandle;
Handle _fitToHandle;
Handle _miteredHandle;

public:
CreateTrimDialog();

static bool QueryTrimParams(TrimParams& params);

static void CreateTrimCmd(const cmd::ArgumentList& args);
};

} // namespace ui
6 changes: 6 additions & 0 deletions radiantcore/selection/algorithm/General.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,12 @@ void registerCommands()
[] { return !FaceInstance::Selection().empty(); }
);

GlobalCommandSystem().addWithCheck(
"CreateTrimForFaces", createTrimForSelectedFaces,
[] { return !FaceInstance::Selection().empty(); },
{ cmd::ARGTYPE_DOUBLE, cmd::ARGTYPE_DOUBLE, cmd::ARGTYPE_INT, cmd::ARGTYPE_INT }
);

GlobalCommandSystem().addCommand("Copy", clipboard::copy);
GlobalCommandSystem().addCommand("Cut", clipboard::cut);
GlobalCommandSystem().addCommand("Paste", clipboard::paste);
Expand Down
Loading