mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-11 21:27:01 -04:00
Reduce coupling between ValueEditors/Viewers and Set and StyleSheet.
- Adding of actions is done with an addAction function
- Files are read from
- getStylePackage for styling stuff (this is stylesheet)
- getLocalPackage for symbol and image values (this was the set)
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@970 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -100,7 +100,7 @@ void SymbolBasicShapeEditor::onLeftDown (const Vector2D& pos, wxMouseEvent& ev
|
||||
void SymbolBasicShapeEditor::onLeftUp (const Vector2D& pos, wxMouseEvent& ev) {
|
||||
if (drawing && shape) {
|
||||
// Finalize the shape
|
||||
getSymbol()->actions.add(new AddSymbolPartAction(*getSymbol(), shape));
|
||||
addAction(new AddSymbolPartAction(*getSymbol(), shape));
|
||||
// Select the part
|
||||
control.selectPart(shape);
|
||||
// no need to clean up, this editor is replaced
|
||||
|
||||
@@ -15,3 +15,7 @@
|
||||
void SymbolEditorBase::SetStatusText(const String& text) {
|
||||
control.parent->SetStatusText(text);
|
||||
}
|
||||
|
||||
void SymbolEditorBase::addAction(Action* action, bool allow_merge) {
|
||||
getSymbol()->actions.addAction(action, allow_merge);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,10 @@ class SymbolEditorBase : public IntrusivePtrVirtualBase {
|
||||
SymbolControl& control;
|
||||
|
||||
inline SymbolP getSymbol() { return control.getSymbol(); }
|
||||
|
||||
/// Perform an action
|
||||
void addAction(Action* action, bool allow_merge = true);
|
||||
|
||||
void SetStatusText(const String& text);
|
||||
|
||||
public:
|
||||
|
||||
@@ -166,9 +166,9 @@ void SymbolPartList::onLeftUp(wxMouseEvent& ev) {
|
||||
if (par != drop_parent && par->parts.size() == 1 && !par->isSymbolSymmetry()) {
|
||||
// this leaves a group without elements, remove it
|
||||
findParent(*par, par, drag_position); // parent of the group
|
||||
symbol->actions.add(new UngroupReorderSymbolPartsAction(*par, drag_position, *drop_parent, drop_position));
|
||||
symbol->actions.addAction(new UngroupReorderSymbolPartsAction(*par, drag_position, *drop_parent, drop_position));
|
||||
} else {
|
||||
symbol->actions.add(new ReorderSymbolPartsAction(*par, drag_position, *drop_parent, drop_position));
|
||||
symbol->actions.addAction(new ReorderSymbolPartsAction(*par, drag_position, *drop_parent, drop_position));
|
||||
}
|
||||
} else {
|
||||
Refresh(false);
|
||||
@@ -253,14 +253,14 @@ void SymbolPartList::onChar(wxKeyEvent& ev) {
|
||||
if (cursor > 0 && cursor <= typing_in->name.size()) {
|
||||
String new_name = typing_in->name;
|
||||
new_name.erase(cursor - 1, 1);
|
||||
symbol->actions.add(new SymbolPartNameAction(typing_in, new_name, cursor, cursor - 1));
|
||||
symbol->actions.addAction(new SymbolPartNameAction(typing_in, new_name, cursor, cursor - 1));
|
||||
}
|
||||
break;
|
||||
case WXK_DELETE:
|
||||
if (cursor < typing_in->name.size()) {
|
||||
String new_name = typing_in->name;
|
||||
new_name.erase(cursor, 1);
|
||||
symbol->actions.add(new SymbolPartNameAction(typing_in, new_name, cursor, cursor));
|
||||
symbol->actions.addAction(new SymbolPartNameAction(typing_in, new_name, cursor, cursor));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -277,7 +277,7 @@ void SymbolPartList::onChar(wxKeyEvent& ev) {
|
||||
#endif
|
||||
String new_name = typing_in->name;
|
||||
new_name.insert(cursor, 1, key);
|
||||
symbol->actions.add(new SymbolPartNameAction(typing_in, new_name, cursor, cursor + 1));
|
||||
symbol->actions.addAction(new SymbolPartNameAction(typing_in, new_name, cursor, cursor + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ void SymbolPointEditor::onLeftDClick(const Vector2D& pos, wxMouseEvent& ev) {
|
||||
if (hovering == SELECTED_NEW_POINT) {
|
||||
// Add point
|
||||
ControlPointAddAction* act = new ControlPointAddAction(part, hover_line_1_idx, hover_line_t);
|
||||
getSymbol()->actions.add(act);
|
||||
addAction(act);
|
||||
// select the new point
|
||||
selectPoint(act->getNewPoint(), false);
|
||||
selection = SELECTED_POINTS;
|
||||
@@ -262,7 +262,7 @@ void SymbolPointEditor::onLeftDClick(const Vector2D& pos, wxMouseEvent& ev) {
|
||||
// Delete point
|
||||
selected_points.clear();
|
||||
selectPoint(hover_handle.point, false);
|
||||
getSymbol()->actions.add(control_point_remove_action(part, selected_points));
|
||||
addAction(control_point_remove_action(part, selected_points));
|
||||
selected_points.clear();
|
||||
selection = SELECTED_NONE;
|
||||
}
|
||||
@@ -288,7 +288,7 @@ void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wx
|
||||
if (controlPointMoveAction) controlPointMoveAction = 0;
|
||||
if (!curveDragAction) {
|
||||
curveDragAction = new CurveDragAction(selected_line1, selected_line2);
|
||||
getSymbol()->actions.add(curveDragAction);
|
||||
addAction(curveDragAction);
|
||||
}
|
||||
curveDragAction->move(delta, selected_line_t);
|
||||
control.Refresh(false);
|
||||
@@ -298,7 +298,7 @@ void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wx
|
||||
if (!controlPointMoveAction) {
|
||||
// create action we can add this movement to
|
||||
controlPointMoveAction = new ControlPointMoveAction(selected_points);
|
||||
getSymbol()->actions.add(controlPointMoveAction);
|
||||
addAction(controlPointMoveAction);
|
||||
}
|
||||
controlPointMoveAction->constrain = ev.ControlDown(); // ctrl constrains
|
||||
controlPointMoveAction->snap = snap(ev);
|
||||
@@ -309,7 +309,7 @@ void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wx
|
||||
// Move the selected handle
|
||||
if (!handleMoveAction) {
|
||||
handleMoveAction = new HandleMoveAction(selected_handle);
|
||||
getSymbol()->actions.add(handleMoveAction);
|
||||
addAction(handleMoveAction);
|
||||
}
|
||||
handleMoveAction->constrain = ev.ControlDown(); // ctrl constrains
|
||||
handleMoveAction->snap = snap(ev);
|
||||
@@ -368,14 +368,14 @@ void SymbolPointEditor::onChar(wxKeyEvent& ev) {
|
||||
if (selection == SELECTED_POINTS || selection == SELECTED_LINE) {
|
||||
// Move all selected points
|
||||
controlPointMoveAction = new ControlPointMoveAction(selected_points);
|
||||
getSymbol()->actions.add(controlPointMoveAction);
|
||||
addAction(controlPointMoveAction);
|
||||
controlPointMoveAction->move(delta);
|
||||
new_point += delta;
|
||||
control.Refresh(false);
|
||||
} else if (selection == SELECTED_HANDLE) {
|
||||
// Move the selected handle
|
||||
handleMoveAction = new HandleMoveAction(selected_handle);
|
||||
getSymbol()->actions.add(handleMoveAction);
|
||||
addAction(handleMoveAction);
|
||||
handleMoveAction->move(delta);
|
||||
control.Refresh(false);
|
||||
}
|
||||
@@ -466,7 +466,7 @@ void SymbolPointEditor::resetActions() {
|
||||
|
||||
void SymbolPointEditor::deleteSelection() {
|
||||
if (!selected_points.empty()) {
|
||||
getSymbol()->actions.add(control_point_remove_action(part, selected_points));
|
||||
addAction(control_point_remove_action(part, selected_points));
|
||||
selected_points.clear();
|
||||
resetActions();
|
||||
control.Refresh(false);
|
||||
@@ -477,12 +477,12 @@ void SymbolPointEditor::onChangeSegment(SegmentMode mode) {
|
||||
assert(selected_line1);
|
||||
assert(selected_line2);
|
||||
if (selected_line1->segment_after == mode) return;
|
||||
getSymbol()->actions.add(new SegmentModeAction(selected_line1, selected_line2, mode));
|
||||
addAction(new SegmentModeAction(selected_line1, selected_line2, mode));
|
||||
control.Refresh(false);
|
||||
}
|
||||
|
||||
void SymbolPointEditor::onChangeLock(LockMode mode) {
|
||||
getSymbol()->actions.add(new LockModeAction(*selected_points.begin(), mode));
|
||||
addAction(new LockModeAction(*selected_points.begin(), mode));
|
||||
control.Refresh(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -173,22 +173,22 @@ void SymbolSelectEditor::onUpdateUI(wxUpdateUIEvent& ev) {
|
||||
void SymbolSelectEditor::onCommand(int id) {
|
||||
if (id >= ID_SYMBOL_COMBINE && id < ID_SYMBOL_COMBINE_MAX) {
|
||||
// change combine mode
|
||||
getSymbol()->actions.add(new CombiningModeAction(
|
||||
addAction(new CombiningModeAction(
|
||||
control.selected_parts.get(),
|
||||
static_cast<SymbolShapeCombine>(id - ID_SYMBOL_COMBINE)
|
||||
));
|
||||
control.Refresh(false);
|
||||
} else if (id == ID_EDIT_DUPLICATE && !isEditing()) {
|
||||
// duplicate selection, not when dragging
|
||||
getSymbol()->actions.add(new DuplicateSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
addAction(new DuplicateSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
control.Refresh(false);
|
||||
} else if (id == ID_EDIT_GROUP && !isEditing()) {
|
||||
// group selection, not when dragging
|
||||
getSymbol()->actions.add(new GroupSymbolPartsAction(*getSymbol(), control.selected_parts.get(), new_intrusive<SymbolGroup>()));
|
||||
addAction(new GroupSymbolPartsAction(*getSymbol(), control.selected_parts.get(), new_intrusive<SymbolGroup>()));
|
||||
control.Refresh(false);
|
||||
} else if (id == ID_EDIT_UNGROUP && !isEditing()) {
|
||||
// ungroup selection, not when dragging
|
||||
getSymbol()->actions.add(new UngroupSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
addAction(new UngroupSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
control.Refresh(false);
|
||||
}
|
||||
}
|
||||
@@ -313,23 +313,23 @@ void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to,
|
||||
if (scaleX == 0 || scaleY == 0) {
|
||||
// shear, center/fixed point on the opposite side
|
||||
shearAction = new SymbolPartShearAction(control.selected_parts.get(), handlePos(-scaleX, -scaleY));
|
||||
getSymbol()->actions.add(shearAction);
|
||||
addAction(shearAction);
|
||||
} else {
|
||||
// rotate
|
||||
rotateAction = new SymbolPartRotateAction(control.selected_parts.get(), center);
|
||||
getSymbol()->actions.add(rotateAction);
|
||||
addAction(rotateAction);
|
||||
startAngle = angleTo(to);
|
||||
}
|
||||
} else {
|
||||
// we are on a handle; start scaling
|
||||
scaleAction = new SymbolPartScaleAction(control.selected_parts.get(), scaleX, scaleY);
|
||||
getSymbol()->actions.add(scaleAction);
|
||||
addAction(scaleAction);
|
||||
}
|
||||
} else {
|
||||
// move
|
||||
click_mode = CLICK_MOVE;
|
||||
moveAction = new SymbolPartMoveAction(control.selected_parts.get());
|
||||
getSymbol()->actions.add(moveAction);
|
||||
addAction(moveAction);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ void SymbolSelectEditor::onKeyChange (wxKeyEvent& ev) {
|
||||
void SymbolSelectEditor::onChar(wxKeyEvent& ev) {
|
||||
if (ev.GetKeyCode() == WXK_DELETE) {
|
||||
// delete selected parts
|
||||
getSymbol()->actions.add(new RemoveSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
addAction(new RemoveSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
if (control.selected_parts.selected(highlightPart)) highlightPart = SymbolPartP(); // deleted it
|
||||
control.selected_parts.clear();
|
||||
resetActions();
|
||||
@@ -416,7 +416,7 @@ void SymbolSelectEditor::onChar(wxKeyEvent& ev) {
|
||||
ev.Skip();
|
||||
return;
|
||||
}
|
||||
getSymbol()->actions.add(new SymbolPartMoveAction(control.selected_parts.get(), delta));
|
||||
addAction(new SymbolPartMoveAction(control.selected_parts.get(), delta));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -107,13 +107,13 @@ void SymbolSymmetryEditor::onCommand(int id) {
|
||||
if (id >= ID_SYMMETRY && id < ID_SYMMETRY_MAX) {
|
||||
SymbolSymmetryType kind = id == ID_SYMMETRY_ROTATION ? SYMMETRY_ROTATION : SYMMETRY_REFLECTION;
|
||||
if (symmetry && symmetry->kind != kind) {
|
||||
getSymbol()->actions.add(new SymmetryTypeAction(*symmetry, kind));
|
||||
addAction(new SymmetryTypeAction(*symmetry, kind));
|
||||
control.Refresh(false);
|
||||
}
|
||||
resetActions();
|
||||
} else if (id == ID_COPIES) {
|
||||
if (symmetry && symmetry->copies != copies->GetValue()) {
|
||||
getSymbol()->actions.add(new SymmetryCopiesAction(*symmetry, copies->GetValue()));
|
||||
addAction(new SymmetryCopiesAction(*symmetry, copies->GetValue()));
|
||||
control.Refresh(false);
|
||||
}
|
||||
resetActions();
|
||||
@@ -124,11 +124,11 @@ void SymbolSymmetryEditor::onCommand(int id) {
|
||||
symmetry->center = Vector2D(0.5,0.5);
|
||||
symmetry->handle = Vector2D(0.2,0);
|
||||
symmetry->name = symmetry->expectedName();
|
||||
getSymbol()->actions.add(new GroupSymbolPartsAction(*getSymbol(), control.selected_parts.get(), symmetry));
|
||||
addAction(new GroupSymbolPartsAction(*getSymbol(), control.selected_parts.get(), symmetry));
|
||||
control.selected_parts.select(symmetry);
|
||||
control.Refresh(false);
|
||||
} else if (id == ID_REMOVE_SYMMETRY) {
|
||||
getSymbol()->actions.add(new UngroupSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
addAction(new UngroupSymbolPartsAction(*getSymbol(), control.selected_parts.get()));
|
||||
symmetry = SymbolSymmetryP();
|
||||
control.Refresh(false);
|
||||
}
|
||||
@@ -158,7 +158,7 @@ void SymbolSymmetryEditor::onMouseDrag (const Vector2D& from, const Vector2D& t
|
||||
symmetryMoveAction = new SymmetryMoveAction(*symmetry, selection == SELECTION_HANDLE);
|
||||
symmetryMoveAction->constrain = ev.ControlDown();
|
||||
symmetryMoveAction->snap = ev.ShiftDown() != settings.symbol_grid_snap ? settings.symbol_grid_size : 0;
|
||||
getSymbol()->actions.add(symmetryMoveAction);
|
||||
addAction(symmetryMoveAction);
|
||||
}
|
||||
symmetryMoveAction->move(to - from);
|
||||
control.Refresh(false);
|
||||
|
||||
+23
-11
@@ -12,23 +12,28 @@
|
||||
#include <gui/symbol/part_list.hpp>
|
||||
#include <gui/icon_menu.hpp>
|
||||
#include <gui/util.hpp>
|
||||
#include <data/set.hpp>
|
||||
#include <data/field/symbol.hpp>
|
||||
#include <data/format/image_to_symbol.hpp>
|
||||
#include <data/action/value.hpp>
|
||||
#include <data/set.hpp> // :(
|
||||
#include <util/window_id.hpp>
|
||||
#include <util/io/reader.hpp>
|
||||
#include <util/io/package.hpp>
|
||||
#include <util/error.hpp>
|
||||
#include <wx/filename.h>
|
||||
#include <wx/wfstream.h>
|
||||
|
||||
// ----------------------------------------------------------------------------- : Constructor
|
||||
|
||||
SymbolWindow::SymbolWindow(Window* parent) {
|
||||
SymbolWindow::SymbolWindow(Window* parent)
|
||||
: performer(nullptr)
|
||||
{
|
||||
init(parent, default_symbol());
|
||||
}
|
||||
|
||||
SymbolWindow::SymbolWindow(Window* parent, const String& filename) {
|
||||
SymbolWindow::SymbolWindow(Window* parent, const String& filename)
|
||||
: performer(nullptr)
|
||||
{
|
||||
// open file
|
||||
Reader reader(new_shared1<wxFileInputStream>(filename), nullptr, filename);
|
||||
SymbolP symbol;
|
||||
@@ -36,15 +41,17 @@ SymbolWindow::SymbolWindow(Window* parent, const String& filename) {
|
||||
init(parent, symbol);
|
||||
}
|
||||
|
||||
SymbolWindow::SymbolWindow(Window* parent, const SetP& set, const Card* card, const SymbolValueP& value)
|
||||
: value(value), card(card), set(set)
|
||||
SymbolWindow::SymbolWindow(Window* parent, ValueActionPerformer* performer)
|
||||
: performer(performer)
|
||||
{
|
||||
// attempt to load symbol
|
||||
SymbolP symbol;
|
||||
SymbolValueP value = static_pointer_cast<SymbolValue>(performer->value);
|
||||
if (!value->filename.empty()) {
|
||||
try {
|
||||
// load symbol
|
||||
symbol = set->readFile<SymbolP>(value->filename);
|
||||
Package& package = performer->getLocalPackage();
|
||||
symbol = package.readFile<SymbolP>(value->filename);
|
||||
} catch (const Error& e) {
|
||||
handle_error(e);
|
||||
}
|
||||
@@ -52,6 +59,9 @@ SymbolWindow::SymbolWindow(Window* parent, const SetP& set, const Card* card, co
|
||||
if (!symbol) symbol = default_symbol();
|
||||
init(parent, symbol);
|
||||
}
|
||||
SymbolWindow::~SymbolWindow() {
|
||||
delete performer;
|
||||
}
|
||||
|
||||
void SymbolWindow::init(Window* parent, SymbolP symbol) {
|
||||
Create(parent, wxID_ANY, _TITLE_("symbol editor"), wxDefaultPosition, wxSize(650,600), wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE);
|
||||
@@ -233,11 +243,13 @@ void SymbolWindow::onFileSaveAs(wxCommandEvent& ev) {
|
||||
}
|
||||
|
||||
void SymbolWindow::onFileStore(wxCommandEvent& ev) {
|
||||
if (value) {
|
||||
FileName new_filename = set->newFileName(value->field().name,_(".mse-symbol")); // a new unique name in the package
|
||||
Writer writer(set->openOut(new_filename));
|
||||
if (performer) {
|
||||
SymbolValueP value = static_pointer_cast<SymbolValue>(performer->value);
|
||||
Package& package = performer->getLocalPackage();
|
||||
FileName new_filename = package.newFileName(value->field().name,_(".mse-symbol")); // a new unique name in the package
|
||||
Writer writer(package.openOut(new_filename));
|
||||
writer.handle(control->getSymbol());
|
||||
set->actions.add(value_action(card, value, new_filename));
|
||||
performer->addAction(value_action(value, new_filename));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,7 +285,7 @@ void SymbolWindow::onUpdateUI(wxUpdateUIEvent& ev) {
|
||||
switch(ev.GetId()) {
|
||||
// file menu
|
||||
case ID_FILE_STORE: {
|
||||
ev.Enable(value);
|
||||
ev.Enable(performer);
|
||||
break;
|
||||
// undo/redo
|
||||
} case ID_EDIT_UNDO: {
|
||||
|
||||
@@ -15,9 +15,7 @@
|
||||
|
||||
class SymbolControl;
|
||||
class SymbolPartList;
|
||||
class Card;
|
||||
DECLARE_POINTER_TYPE(SymbolValue);
|
||||
DECLARE_POINTER_TYPE(Set);
|
||||
DECLARE_POINTER_TYPE(ValueActionPerformer);
|
||||
|
||||
// ----------------------------------------------------------------------------- : SymbolWindow
|
||||
|
||||
@@ -29,7 +27,8 @@ class SymbolWindow : public Frame {
|
||||
/// Construct a SymbolWindow showing a symbol from a file
|
||||
SymbolWindow(Window* parent, const String& filename);
|
||||
/// Construct a SymbolWindow showing a symbol value in a set
|
||||
SymbolWindow(Window* parent, const SetP& set, const Card* card, const SymbolValueP& value);
|
||||
SymbolWindow(Window* parent, ValueActionPerformer* performer);
|
||||
~SymbolWindow();
|
||||
|
||||
private:
|
||||
// --------------------------------------------------- : Children
|
||||
@@ -41,9 +40,7 @@ class SymbolWindow : public Frame {
|
||||
SymbolPartList* parts; ///< A list of parts in the symbol
|
||||
|
||||
// when editing a symbol field
|
||||
SymbolValueP value;
|
||||
const Card* card;
|
||||
SetP set;
|
||||
ValueActionPerformer* performer;
|
||||
|
||||
// --------------------------------------------------- : Event handling
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
Reference in New Issue
Block a user