Cleanup: rename ValueViewer::viewer -> parent; store CardP in ValueAction

This commit is contained in:
Twan van Laarhoven
2020-05-31 16:03:42 +02:00
parent 31baa909d8
commit 1f75175943
18 changed files with 84 additions and 65 deletions
+10 -5
View File
@@ -23,18 +23,23 @@
// ----------------------------------------------------------------------------- : ValueAction
ValueAction::ValueAction(const ValueP& value)
: valueP(value), card(nullptr), old_time_modified(wxDateTime::Now())
{}
ValueAction::~ValueAction() {} // here because we need the destructor of Card
String ValueAction::getName(bool to_undo) const {
return _ACTION_1_("change", valueP->fieldP->name);
}
void ValueAction::perform(bool to_undo) {
if (card) {
swap(const_cast<Card*>(card)->time_modified, old_time_modified);
swap(card->time_modified, old_time_modified);
}
}
void ValueAction::isOnCard(Card* card) {
this->card = card;
void ValueAction::setCard(CardP const& card) {
const_cast<CardP&>(this->card) = card;
}
// ----------------------------------------------------------------------------- : Simple
@@ -253,13 +258,13 @@ void ScriptStyleEvent::perform(bool) {
// ----------------------------------------------------------------------------- : Action performer
ValueActionPerformer::ValueActionPerformer(const ValueP& value, Card* card, const SetP& set)
ValueActionPerformer::ValueActionPerformer(const ValueP& value, CardP const& card, const SetP& set)
: value(value), card(card), set(set)
{}
ValueActionPerformer::~ValueActionPerformer() {}
void ValueActionPerformer::addAction(unique_ptr<ValueAction>&& action) {
action->isOnCard(card);
action->setCard(card);
set->actions.addAction(move(action));
}
+8 -9
View File
@@ -17,9 +17,9 @@
#include <util/action_stack.hpp>
#include <util/defaultable.hpp>
class Card;
class StyleSheet;
class LocalFileName;
DECLARE_POINTER_TYPE(Card);
DECLARE_POINTER_TYPE(Set);
DECLARE_POINTER_TYPE(Value);
DECLARE_POINTER_TYPE(Style);
@@ -36,18 +36,17 @@ DECLARE_POINTER_TYPE(PackageChoiceValue);
/// An Action the changes a Value
class ValueAction : public Action {
public:
inline ValueAction(const ValueP& value)
: valueP(value), card(nullptr), old_time_modified(wxDateTime::Now())
{}
ValueAction(const ValueP& value);
~ValueAction();
String getName(bool to_undo) const override;
void perform(bool to_undo) override;
/// We know that the value is on the given card, add that information
void isOnCard(Card* card);
void setCard(CardP const& card);
const ValueP valueP; ///< The modified value
const Card* card; ///< The card the value is on, or null if it is not a card value
const CardP card; ///< The card the value is on, or null if it is not a card value
private:
wxDateTime old_time_modified;
};
@@ -166,7 +165,7 @@ public:
/** Used to reduce coupling */
class ValueActionPerformer {
public:
ValueActionPerformer(const ValueP& value, Card* card, const SetP& set);
ValueActionPerformer(const ValueP& value, CardP const& card, const SetP& set);
~ValueActionPerformer();
/// Perform an action. The performer takes ownerwhip of the action.
void addAction(unique_ptr<ValueAction>&& action);
@@ -174,7 +173,7 @@ public:
const ValueP value; ///< The value
Package& getLocalPackage();
private:
Card* card; ///< Card the value is on (if any)
SetP set; ///< Set for the actions
CardP card; ///< Card the value is on (if any)
SetP set; ///< Set for the actions
};
+3 -1
View File
@@ -32,13 +32,15 @@ public:
Rotation getRotation() const override;
private:
bool use_zoom_settings;
double zoom = 1.0;
double angle = 0.0;
};
Rotation UnzoomedDataViewer::getRotation() const {
if (use_zoom_settings) {
return DataViewer::getRotation();
} else {
if (!stylesheet) stylesheet = set->stylesheet;
return Rotation(0, stylesheet->getCardRect(), 1.0, 1.0, ROTATION_ATTACH_TOP_LEFT);
return Rotation(angle, stylesheet->getCardRect(), zoom, 1.0, ROTATION_ATTACH_TOP_LEFT);
}
}
+4 -4
View File
@@ -115,10 +115,10 @@ void DropDownList::show(bool in_place, wxPoint pos, RealRect* rect) {
int parent_height = 0;
if (!in_place && viewer) {
// Position the drop down list below the editor control (based on the style)
Rotation rot = viewer->viewer.getRotation();
Rotation rot = viewer->parent.getRotation();
Rotater rr(rot, viewer->getRotation());
RealRect r = rot.trRectToBB(rect ? *rect : rot.getInternalRect());
if (viewer->viewer.nativeLook()) {
if (viewer->nativeLook()) {
pos = RealPoint(r.x - 3, r.y - 3);
size.width = max(size.width, r.width + 6);
parent_height = (int)r.height + 6;
@@ -282,8 +282,8 @@ int DropDownList::itemPosition(size_t item) const {
void DropDownList::redrawArrowOnParent() {
if (viewer) {
ValueEditor* e = viewer->getEditor();
if (e && viewer->viewer.nativeLook()) {
CardEditor& editor = static_cast<CardEditor&>(viewer->viewer);
if (e && viewer->parent.nativeLook()) {
CardEditor& editor = static_cast<CardEditor&>(viewer->parent);
shared_ptr<RotatedDC> dcP = editor.overdrawDC();
RotatedDC& dc = *dcP;
Rotater r(dc, viewer->getRotation());
+3 -3
View File
@@ -78,7 +78,7 @@ DropDownChoiceListBase::DropDownChoiceListBase
void DropDownChoiceListBase::onShow() {
// update 'enabled'
Context& ctx = cve.viewer.getContext();
Context& ctx = cve.getContext();
FOR_EACH(c, group->choices) {
c->enabled.update(ctx);
}
@@ -145,7 +145,7 @@ void DropDownChoiceListBase::drawIcon(DC& dc, int x, int y, size_t item, bool se
void DropDownChoiceListBase::generateThumbnailImages() {
if (!isRoot()) return;
// init choice images
Context& ctx = cve.viewer.getContext();
Context& ctx = cve.getContext();
if (style().choice_images.empty() && style().image.isScripted()) {
int n = field().choices->lastId();
for (int i = 0 ; i < n; ++i) {
@@ -230,7 +230,7 @@ size_t DropDownChoiceList::selection() const {
} else {
// run default script to find out what the default choice would be
try {
String default_choice = field().default_script.invoke( cve.viewer.getContext() )->toString();
String default_choice = field().default_script.invoke(cve.getContext())->toString();
default_id = group->choiceId(default_choice);
} catch (ScriptError const& e) {
handle_error(ScriptError(e.what() + _("\n in default script for '") + field().name + _("'")));
+1 -1
View File
@@ -108,7 +108,7 @@ size_t DropDownColorList::selection() const {
} else if (hasDefault()) {
// evaluate script to find default color
try {
default_color = field().default_script.invoke(cve.viewer.getContext())->toColor();
default_color = field().default_script.invoke(cve.getContext())->toColor();
} catch (ScriptError const& e) {
handle_error(ScriptError(e.what() + _("\n in default script for '") + field().name + _("'")));
}
+1 -1
View File
@@ -14,7 +14,7 @@
void ValueEditor::addAction(unique_ptr<ValueAction> a) {
if (a) {
a->isOnCard(editor().getCard().get());
a->setCard(editor().getCard());
editor().addAction(move(a));
}
}
+1 -1
View File
@@ -142,7 +142,7 @@ protected:
private: \
/** Retrieve the parent editor object */ \
inline DataEditor& editor() const override { \
return static_cast<DataEditor&>(viewer); \
return static_cast<DataEditor&>(parent); \
} \
public:
+1 -1
View File
@@ -37,7 +37,7 @@ bool ImageValueEditor::onLeftDClick(const RealPoint&, wxMouseEvent&) {
void ImageValueEditor::sliceImage(const Image& image) {
if (!image.Ok()) return;
// mask
GeneratedImage::Options options((int)style().width, (int)style().height, &viewer.getStylePackage(), &viewer.getLocalPackage());
GeneratedImage::Options options((int)style().width, (int)style().height, &parent.getStylePackage(), &parent.getLocalPackage());
AlphaMask mask;
style().mask.getNoCache(options,mask);
// slice
+5 -5
View File
@@ -65,7 +65,7 @@ bool SymbolValueEditor::onLeftDown(const RealPoint& pos, wxMouseEvent&) {
int button = findButton(pos);
if (button != button_down) {
button_down = button;
viewer.redraw(*this);
parent.redraw(*this);
}
return true;
}
@@ -74,7 +74,7 @@ bool SymbolValueEditor::onMotion(const RealPoint& pos, wxMouseEvent& ev) {
int button = findButton(pos);
if (button != button_down) {
button_down = button;
viewer.redraw(*this);
parent.redraw(*this);
}
}
return true;
@@ -85,13 +85,13 @@ bool SymbolValueEditor::onLeftUp(const RealPoint& pos, wxMouseEvent&) {
if (button_down == 0) {
// edit
button_down = -2;
viewer.redraw(*this);
parent.redraw(*this);
editSymbol();
return true;
} else if (button_down == 1) {
// gallery
button_down = -2;
viewer.redraw(*this);
parent.redraw(*this);
// TODO
return true;
} else {
@@ -117,5 +117,5 @@ void SymbolValueEditor::editSymbol() {
}
ValueActionPerformer* SymbolValueEditor::getActionPerformer() {
return new ValueActionPerformer(valueP(), editor().getCard().get(), editor().getSetForActions());
return new ValueActionPerformer(valueP(), editor().getCard(), editor().getSetForActions());
}
+12 -12
View File
@@ -181,7 +181,7 @@ void DropDownWordList::setWords(const WordListWordP& words2) {
void DropDownWordList::addWordsFromScript(const WordListWordP& w) {
assert(w->script);
// run script
Context& ctx = tve.viewer.getContext();
Context& ctx = tve.getContext();
String str = w->script.invoke(ctx)->toString();
// collect items
vector<String> strings;
@@ -317,7 +317,7 @@ IMPLEMENT_VALUE_EDITOR(Text)
, scrollbar(nullptr), scroll_with_cursor(false)
, hovered_words(nullptr)
{
if (viewer.nativeLook() && field().multi_line) {
if (nativeLook() && field().multi_line) {
scrollbar = new TextValueEditorScrollBar(*this);
style->padding_right = max(style->padding_right(), (double)scrollbar->GetSize().x);
}
@@ -616,7 +616,7 @@ bool TextValueEditor::onCommand(int id) {
wxMenu* TextValueEditor::getMenu(int type) const {
if (type == ID_INSERT_SYMBOL && (style().always_symbol || style().allow_formating)
&& style().symbol_font.valid()) {
return style().symbol_font.font->insertSymbolMenu(viewer.getContext());
return style().symbol_font.font->insertSymbolMenu(getContext());
} else {
return nullptr;
}
@@ -709,7 +709,7 @@ wxCursor TextValueEditor::cursor(const RealPoint& pos) const {
hovered_words = p.get();
const_cast<TextValueEditor*>(this)->redrawWordListIndicators();
}
Radians angle = viewer.getRotation().getAngle() + deg_to_rad(style().angle);
Radians angle = parent.getRotation().getAngle() + deg_to_rad(style().angle);
if (is_sideways(angle)) { // 90 or 270 degrees
if (!rotated_ibeam.Ok()) {
rotated_ibeam = wxCursor(load_resource_cursor(_("rot_text")));
@@ -866,7 +866,7 @@ void TextValueEditor::showCaret() {
return;
}
// Rotation
Rotation rot(viewer.getRotation());
Rotation rot(parent.getRotation());
Rotater rot2(rot, getRotation());
// The caret
wxCaret* caret = editor().GetCaret();
@@ -877,7 +877,7 @@ void TextValueEditor::showCaret() {
// it is not 0 for empty text, because TextRenderer handles that case
if (cursor.height == 0) {
if (style().always_symbol && style().symbol_font.valid()) {
style().symbol_font.font->update(viewer.getContext());
style().symbol_font.font->update(getContext());
RealSize s = style().symbol_font.font->defaultSymbolSize(rot.trS(style().symbol_font.size));
cursor.height = s.height;
} else {
@@ -1033,7 +1033,7 @@ void TextValueEditor::replaceSelection(const String& replacement, const String&
void TextValueEditor::tryAutoReplace() {
size_t end = selection_start_i;
GameSettings& gs = settings.gameSettingsFor(viewer.getGame());
GameSettings& gs = settings.gameSettingsFor(parent.getGame());
if (!gs.use_auto_replace) return;
FOR_EACH(ar, gs.auto_replaces) {
if (ar->enabled && ar->match.size() <= end) {
@@ -1217,7 +1217,7 @@ bool TextValueEditor::matchSubstr(const String& s, size_t pos, FindInfo& find) {
fixSelection(TYPE_INDEX);
was_selection = old_sel_start == selection_start && old_sel_end == selection_end;
}
if (find.handle(viewer.getCard(), valueP(), pos, was_selection)) {
if (find.handle(parent.getCard(), valueP(), pos, was_selection)) {
return true;
} else {
// TODO: string might have changed when doing replace all
@@ -1253,7 +1253,7 @@ void TextValueEditor::determineSize(bool force_fit) {
style().angle = 0; // force no rotation in nativeLook
if (scrollbar) {
// muliline, determine scrollbar size
Rotation rot = viewer.getRotation();
Rotation rot = parent.getRotation();
Rotater r(rot, getRotation());
if (!force_fit) style().height = 100;
int sbw = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
@@ -1329,7 +1329,7 @@ void TextValueEditor::prepareDrawScrollbar(RotatedDC& dc) {
style().width.mutate() -= scrollbar_width;
// prepare text, and remember scroll position
double scroll_pos = v.getExactScrollPosition();
v.prepare(dc, value().value(), style(), viewer.getContext());
v.prepare(dc, value().value(), style(), getContext());
v.setExactScrollPosition(scroll_pos);
// scroll to the same place, but always show the caret
ensureCaretVisible();
@@ -1358,7 +1358,7 @@ void TextValueEditor::findWordLists() {
String name = str.substr(pos + 11, type_end - pos - 11);
WordListP word_list;
// find word list type
FOR_EACH(wl, viewer.getGame().word_lists) {
FOR_EACH(wl, parent.getGame().word_lists) {
if (wl->name == name) {
word_list = wl;
break;
@@ -1399,7 +1399,7 @@ void TextValueEditor::redrawWordListIndicators(bool toggling_dropdown) {
void TextValueEditor::drawWordListIndicators(RotatedDC& dc, bool redrawing) {
if (word_lists.empty()) return;
DrawWhat what = viewer.drawWhat(this);
DrawWhat what = drawWhat();
bool current = what & DRAW_ACTIVE;
// Draw lines around fields
FOR_EACH(wl, word_lists) {
+3 -3
View File
@@ -97,8 +97,8 @@ protected:
/// Notification that the size of the viewer may have changed
virtual void onChangeSize() {}
vector<ValueViewerP> viewers; ///< The viewers for the different values in the data
CardP card; ///< The card that is currently displayed, if any
mutable StyleSheetP stylesheet; ///< Stylesheet being used
vector<ValueViewerP> viewers; ///< The viewers for the different values in the data
CardP card; ///< The card that is currently displayed, if any
mutable StyleSheetP stylesheet; ///< Stylesheet being used
};
+2 -2
View File
@@ -36,7 +36,7 @@ bool prepare_choice_viewer(RotatedDC& dc, ValueViewer& viewer, ChoiceStyle& styl
if (style.render_style & RENDER_IMAGE) {
style.initImage();
CachedScriptableImage& img = style.image;
Context& ctx = viewer.viewer.getContext();
Context& ctx = viewer.getContext();
ctx.setVariable(SCRIPT_VAR_input, to_script(value));
// generate to determine the size
if (img.update(ctx) && img.isReady()) {
@@ -67,7 +67,7 @@ void draw_choice_viewer(RotatedDC& dc, ValueViewer& viewer, ChoiceStyle& style,
CachedScriptableImage& img = style.image;
if (style.content_dependent) {
// re run script
Context& ctx = viewer.viewer.getContext();
Context& ctx = viewer.getContext();
ctx.setVariable(SCRIPT_VAR_input, to_script(value));
img.update(ctx);
}
+1 -1
View File
@@ -16,7 +16,7 @@
IMPLEMENT_VALUE_VIEWER(Image);
void ImageValueViewer::draw(RotatedDC& dc) {
DrawWhat what = viewer.drawWhat(this);
DrawWhat what = drawWhat();
// reset?
int w = max(0,(int)dc.trX(style().width)), h = max(0,(int)dc.trY(style().height));
Radians a = dc.getAngle();
+3 -3
View File
@@ -16,16 +16,16 @@ IMPLEMENT_VALUE_VIEWER(Text);
bool TextValueViewer::prepare(RotatedDC& dc) {
getMask(dc); // ensure alpha/contour mask is loaded
return v.prepare(dc, value().value(), style(), viewer.getContext());
return v.prepare(dc, value().value(), style(), getContext());
}
void TextValueViewer::draw(RotatedDC& dc) {
drawFieldBorder(dc);
if (!v.prepared()) {
v.prepare(dc, value().value(), style(), viewer.getContext());
v.prepare(dc, value().value(), style(), getContext());
dc.setStretch(getStretch());
}
DrawWhat what = viewer.drawWhat(this);
DrawWhat what = drawWhat();
v.draw(dc, style(), (DrawWhat)(what & DRAW_ACTIVE));
setFieldBorderPen(dc);
v.draw(dc, style(), (DrawWhat)(what & ~DRAW_ACTIVE));
+14 -8
View File
@@ -13,11 +13,11 @@
// ----------------------------------------------------------------------------- : ValueViewer
ValueViewer::ValueViewer(DataViewer& parent, const StyleP& style)
: StyleListener(style), viewer(parent)
: StyleListener(style), parent(parent)
{}
Package& ValueViewer::getStylePackage() const { return viewer.getStylePackage(); }
Package& ValueViewer::getLocalPackage() const { return viewer.getLocalPackage(); }
Package& ValueViewer::getStylePackage() const { return parent.getStylePackage(); }
Package& ValueViewer::getLocalPackage() const { return parent.getLocalPackage(); }
void ValueViewer::setValue(const ValueP& value) {
assert(value->fieldP == styleP->fieldP); // matching field
@@ -53,7 +53,7 @@ Rotation ValueViewer::getRotation() const {
bool ValueViewer::setFieldBorderPen(RotatedDC& dc) {
if (!getField()->editable) return false;
DrawWhat what = viewer.drawWhat(this);
DrawWhat what = drawWhat();
if (!(what & DRAW_BORDERS)) return false;
if (what & DRAW_ACTIVE) {
dc.SetPen(wxPen(Color(0, 128, 255), 1, wxPENSTYLE_SOLID));
@@ -91,20 +91,26 @@ const AlphaMask& ValueViewer::getMask(const Rotation& rot) const {
return getMask((int)rot.trX(styleP->width), (int)rot.trY(styleP->height));
}
Context& ValueViewer::getContext() const {
return parent.getContext();
}
void ValueViewer::redraw() {
viewer.redraw(*this);
parent.redraw(*this);
}
bool ValueViewer::nativeLook() const {
return viewer.nativeLook();
return parent.nativeLook();
}
DrawWhat ValueViewer::drawWhat() const {
return parent.drawWhat(this);
}
bool ValueViewer::isCurrent() const {
return viewer.viewerIsCurrent(this);
return parent.viewerIsCurrent(this);
}
void ValueViewer::onStyleChange(int changes) {
if (!(changes & CHANGE_ALREADY_PREPARED)) {
viewer.redraw(*this);
parent.redraw(*this);
}
}
+11 -4
View File
@@ -11,6 +11,7 @@
#include <util/prec.hpp>
#include <util/rotation.hpp>
#include <util/real_point.hpp>
#include <data/draw_what.hpp>
#include <data/field.hpp>
class Set;
@@ -69,10 +70,11 @@ public:
/// Convert this viewer to an editor, if possible
virtual ValueEditor* getEditor() { return nullptr; }
DataViewer& viewer; ///< Our parent object
public:
DataViewer& parent; ///< Our parent object
protected:
ValueP valueP; ///< The value we are currently viewing
ValueP valueP; ///< The value we are currently viewing
/// Set the pen for drawing the border, returns true if a border needs to be drawn
bool setFieldBorderPen(RotatedDC& dc);
@@ -85,10 +87,15 @@ protected:
/// Load the AlphaMask for this field, scaled but not rotated
const AlphaMask& getMask(int w = 0, int h = 0) const;
const AlphaMask& getMask(const Rotation& rot) const;
public:
// Context to use for script functions
Context& getContext() const;
/// Should this viewer render using a platform native look?
bool nativeLook() const;
/// What elements to draw
DrawWhat drawWhat() const;
/// Is this the currently selected viewer?
/** Usually only the editor allows selection of viewers */
bool isCurrent() const;
+1 -1
View File
@@ -142,7 +142,7 @@ void SetScriptManager::initDependencies(Context& ctx, StyleSheet& stylesheet) {
void SetScriptManager::onAction(const Action& action, bool undone) {
TYPE_CASE(action, ValueAction) {
if (action.card) {
updateValue(*action.valueP, const_cast<Card*>(action.card)->intrusive_from_this());
updateValue(*action.valueP, action.card);
return;
} else {
// is it a keyword's fake value?