mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-11 05:07:00 -04:00
Card data in images (start)
* Add uuid implementation * Simplify uid implementation * Check for uid conflicts upon adding/copying cards * Remove unnecessary checks these are already checked as part of the first loop, since they were added to set.cards * Implement card linking * refactor to avoid triple loop * Start link visualization * Continue link visualization * formatting * add missing locale entries * improve layout * improve UI refresh * copy links when copying cards * implement second face editor * refactor using macros * get references * pasting multiple cards and links * start refactoring editors * continue refactoring editors * continue refactoring editors again * finish refactoring editors * refresh card list on link editor event * tweak event handling * Add insert_image script function * change parameter type * add script functions to get cards * add dimensions_of script function calculate both dimensions simultaneously while rendering the image only once. * save value even if not editable * add get_mse_locale script function * Change zoom scale choices * bug fixes * Scale symbol spacing with font size * sync locales * standardize line ending * handle links in new_card * initial waiting on wxWidgets 3.3.1 * update comment * store rect in image filename * store rect in temp file name * Update package.cpp * change line endings
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include <data/card.hpp>
|
||||
#include <data/stylesheet.hpp>
|
||||
#include <data/action/set.hpp>
|
||||
#include <data/format/formats.hpp>
|
||||
#include <gui/add_json_window.hpp>
|
||||
#include <script/functions/json.hpp>
|
||||
#include <script/functions/construction_helper.hpp>
|
||||
@@ -171,6 +172,19 @@ void AddJSONWindow::onBrowseFiles(wxCommandEvent&) {
|
||||
}
|
||||
|
||||
void AddJSONWindow::onOk(wxCommandEvent&) {
|
||||
|
||||
|
||||
|
||||
// debug test shit
|
||||
export_image(set, set->cards.front(), "C:\\Users\\Oli\\Desktop\\tetest\\test.png");
|
||||
auto extImg = make_intrusive<ExternalImage>("C:/Users/Oli/Desktop/tetest/test.png");
|
||||
Image img = extImg->generate(GeneratedImage::Options(0, 0, set->stylesheet.get(), set.get()));
|
||||
if (img.HasOption(wxIMAGE_OPTION_FILENAME)) queue_message(MESSAGE_ERROR, img.GetOption(wxIMAGE_OPTION_FILENAME));
|
||||
else queue_message(MESSAGE_ERROR, _("no dice"));
|
||||
return;
|
||||
|
||||
|
||||
|
||||
/// Perform the import
|
||||
wxBusyCursor wait;
|
||||
// Read the file
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
#include <wx/spinctrl.h>
|
||||
#include <wx/dcbuffer.h>
|
||||
|
||||
map<String, String> ImageSliceWindow::previously_used_settings_path;
|
||||
map<pair<String, String>, pair<wxRect, int>> ImageSliceWindow::previously_used_settings_value;
|
||||
map<String, String> ImageSliceWindow::previously_used_settings_path;
|
||||
map<pair<String, String>, pair<wxRect, int>> ImageSliceWindow::previously_used_settings_value;
|
||||
|
||||
// ----------------------------------------------------------------------------- : ImageSlice
|
||||
|
||||
@@ -101,15 +101,15 @@ ImageSliceWindow::ImageSliceWindow(Window* parent, const Image& source, const St
|
||||
, slice(source, filename, cardname, target_size)
|
||||
, initialized(false)
|
||||
{
|
||||
// init slice
|
||||
pair<String, String> settings_entry = { filename, cardname };
|
||||
if (previously_used_settings_value.find(settings_entry) != previously_used_settings_value.end()) {
|
||||
//slice.allow_outside = true; this currrently crashes
|
||||
slice.aspect_fixed = false;
|
||||
slice.sharpen = true;
|
||||
slice.sharpen_amount = previously_used_settings_value[settings_entry].second;
|
||||
slice.selection = previously_used_settings_value[settings_entry].first;
|
||||
slice.constrain();
|
||||
// init slice
|
||||
pair<String, String> settings_entry = { filename, cardname };
|
||||
if (previously_used_settings_value.find(settings_entry) != previously_used_settings_value.end()) {
|
||||
//slice.allow_outside = true; this currrently crashes
|
||||
slice.aspect_fixed = false;
|
||||
slice.sharpen = true;
|
||||
slice.sharpen_amount = previously_used_settings_value[settings_entry].second;
|
||||
slice.selection = previously_used_settings_value[settings_entry].first;
|
||||
slice.constrain();
|
||||
}
|
||||
else {
|
||||
slice.constrain();
|
||||
@@ -149,7 +149,7 @@ ImageSliceWindow::ImageSliceWindow(Window* parent, const Image& source, const St
|
||||
sharpen_amount = new wxSlider(this, ID_SHARPEN_AMOUNT, 0, 0, 100);
|
||||
// allowOutside= new CheckBox(&this, idSliceAllowOutside, _("Allow selection outside source"))
|
||||
// bgColor = new ColorSelector(&this, wxID_ANY)
|
||||
|
||||
|
||||
String grids[] = { _LABEL_("none")
|
||||
, _LABEL_("grid halves")
|
||||
, _LABEL_("grid thirds")
|
||||
@@ -242,8 +242,8 @@ void ImageSliceWindow::onOk(wxCommandEvent&) {
|
||||
EndModal(wxID_OK);
|
||||
}
|
||||
|
||||
Image ImageSliceWindow::getImage(double scale) const {
|
||||
Image img = slice.getSlice(scale);
|
||||
Image ImageSliceWindow::getImage(double scale) const {
|
||||
Image img = slice.getSlice(scale);
|
||||
previously_used_settings_path[slice.card_name] = slice.source_path;
|
||||
previously_used_settings_value[{ slice.source_path, slice.card_name }] = { slice.selection, slice.sharpen_amount };
|
||||
return img;
|
||||
@@ -275,13 +275,13 @@ void ImageSliceWindow::onChangeSize(wxCommandEvent&) {
|
||||
slice.aspect_fixed = false;
|
||||
onUpdateFromControl();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ImageSliceWindow::onChangeGrid(wxCommandEvent&) {
|
||||
if (!initialized) return;
|
||||
if (!initialized) return;
|
||||
preview->grid = grid->GetSelection();
|
||||
preview->update();
|
||||
}
|
||||
}
|
||||
|
||||
void ImageSliceWindow::onChangeLeft(wxCommandEvent&) {
|
||||
if (!initialized) return;
|
||||
@@ -502,39 +502,39 @@ void ImageSlicePreview::draw(DC& dc) {
|
||||
bitmap = wxBitmap(bitmap.ConvertToImage().Scale(available_size.GetWidth(), available_size.GetHeight()));
|
||||
}
|
||||
if (bitmap.Ok()) {
|
||||
dc.DrawBitmap(bitmap, 0, 0);
|
||||
if (grid == 1) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 2, 0, size.x * 1 / 2, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 2, size.x, size.y * 1 / 2);
|
||||
} else if (grid == 2) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 3, 0, size.x * 1 / 3, size.y);
|
||||
dc.DrawLine(size.x * 2 / 3, 0, size.x * 2 / 3, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 3, size.x, size.y * 1 / 3);
|
||||
dc.DrawLine(0, size.y * 2 / 3, size.x, size.y * 2 / 3);
|
||||
} else if (grid == 3) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 4, 0, size.x * 1 / 4, size.y);
|
||||
dc.DrawLine(size.x * 2 / 4, 0, size.x * 2 / 4, size.y);
|
||||
dc.DrawLine(size.x * 3 / 4, 0, size.x * 3 / 4, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 4, size.x, size.y * 1 / 4);
|
||||
dc.DrawLine(0, size.y * 2 / 4, size.x, size.y * 2 / 4);
|
||||
dc.DrawLine(0, size.y * 3 / 4, size.x, size.y * 3 / 4);
|
||||
} else if (grid == 4) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 5, 0, size.x * 1 / 5, size.y);
|
||||
dc.DrawLine(size.x * 2 / 5, 0, size.x * 2 / 5, size.y);
|
||||
dc.DrawLine(size.x * 3 / 5, 0, size.x * 3 / 5, size.y);
|
||||
dc.DrawLine(size.x * 4 / 5, 0, size.x * 4 / 5, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 5, size.x, size.y * 1 / 5);
|
||||
dc.DrawLine(0, size.y * 2 / 5, size.x, size.y * 2 / 5);
|
||||
dc.DrawLine(0, size.y * 3 / 5, size.x, size.y * 3 / 5);
|
||||
dc.DrawLine(0, size.y * 4 / 5, size.x, size.y * 4 / 5);
|
||||
dc.DrawBitmap(bitmap, 0, 0);
|
||||
if (grid == 1) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 2, 0, size.x * 1 / 2, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 2, size.x, size.y * 1 / 2);
|
||||
} else if (grid == 2) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 3, 0, size.x * 1 / 3, size.y);
|
||||
dc.DrawLine(size.x * 2 / 3, 0, size.x * 2 / 3, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 3, size.x, size.y * 1 / 3);
|
||||
dc.DrawLine(0, size.y * 2 / 3, size.x, size.y * 2 / 3);
|
||||
} else if (grid == 3) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 4, 0, size.x * 1 / 4, size.y);
|
||||
dc.DrawLine(size.x * 2 / 4, 0, size.x * 2 / 4, size.y);
|
||||
dc.DrawLine(size.x * 3 / 4, 0, size.x * 3 / 4, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 4, size.x, size.y * 1 / 4);
|
||||
dc.DrawLine(0, size.y * 2 / 4, size.x, size.y * 2 / 4);
|
||||
dc.DrawLine(0, size.y * 3 / 4, size.x, size.y * 3 / 4);
|
||||
} else if (grid == 4) {
|
||||
wxSize size = dc.GetSize();
|
||||
dc.SetPen(*wxRED_PEN);
|
||||
dc.DrawLine(size.x * 1 / 5, 0, size.x * 1 / 5, size.y);
|
||||
dc.DrawLine(size.x * 2 / 5, 0, size.x * 2 / 5, size.y);
|
||||
dc.DrawLine(size.x * 3 / 5, 0, size.x * 3 / 5, size.y);
|
||||
dc.DrawLine(size.x * 4 / 5, 0, size.x * 4 / 5, size.y);
|
||||
dc.DrawLine(0, size.y * 1 / 5, size.x, size.y * 1 / 5);
|
||||
dc.DrawLine(0, size.y * 2 / 5, size.x, size.y * 2 / 5);
|
||||
dc.DrawLine(0, size.y * 3 / 5, size.x, size.y * 3 / 5);
|
||||
dc.DrawLine(0, size.y * 4 / 5, size.x, size.y * 4 / 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ private:
|
||||
wxButton* link_unlink_1, *link_unlink_2, *link_unlink_3, *link_unlink_4, *link_select;
|
||||
HoverButton* collapse_notes;
|
||||
FilterCtrl* filter;
|
||||
String filter_value; // value of filter, need separate variable because the control is destroyed
|
||||
String filter_value; // value of filter, need separate variable because the control is destroyed
|
||||
wxStaticText* counts;
|
||||
bool notes_below_editor;
|
||||
|
||||
|
||||
+12
-9
@@ -20,18 +20,18 @@
|
||||
IMPLEMENT_VALUE_EDITOR(Image) {}
|
||||
|
||||
bool ImageValueEditor::onLeftDClick(const RealPoint&, wxMouseEvent&) {
|
||||
String directory = settings.default_image_dir;
|
||||
String directory = settings.default_image_dir;
|
||||
String filename = _("");
|
||||
CardP card = parent.getCard();
|
||||
String cardname = card ? card->identification() : _("clipboard");
|
||||
if (ImageSliceWindow::previously_used_settings_path.find(cardname) != ImageSliceWindow::previously_used_settings_path.end()) {
|
||||
String filepath = ImageSliceWindow::previously_used_settings_path[cardname];
|
||||
String cardname = card ? card->identification() : _("clipboard");
|
||||
if (ImageSliceWindow::previously_used_settings_path.find(cardname) != ImageSliceWindow::previously_used_settings_path.end()) {
|
||||
String filepath = ImageSliceWindow::previously_used_settings_path[cardname];
|
||||
size_t pos = filepath.rfind(wxFileName::GetPathSeparator());
|
||||
if (pos != String::npos) {
|
||||
directory = filepath.substr(0, pos+1);
|
||||
filename = filepath.substr(pos+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
filename = wxFileSelector(_("Open image file"), directory, filename, _(""),
|
||||
_("All images|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tif;*.tiff|Windows bitmaps (*.bmp)|*.bmp|JPEG images (*.jpg;*.jpeg)|*.jpg;*.jpeg|PNG images (*.png)|*.png|GIF images (*.gif)|*.gif|TIFF images (*.tif;*.tiff)|*.tif;*.tiff"),
|
||||
wxFD_OPEN, wxGetTopLevelParent(&editor()));
|
||||
@@ -53,12 +53,15 @@ void ImageValueEditor::sliceImage(const Image& image, const String& filename, co
|
||||
GeneratedImage::Options options((int)style().width, (int)style().height, &parent.getStylePackage(), &parent.getLocalPackage());
|
||||
AlphaMask mask;
|
||||
style().mask.getNoCache(options,mask);
|
||||
// slice
|
||||
ImageSliceWindow s(wxGetTopLevelParent(&editor()), image, filename, cardname, style().getSize(), mask);
|
||||
// slice
|
||||
ImageSliceWindow s(wxGetTopLevelParent(&editor()), image, filename, cardname, style().getSize(), mask);
|
||||
// clicked ok?
|
||||
if (s.ShowModal() == wxID_OK) {
|
||||
// store the image into the set
|
||||
LocalFileName new_image_file = getLocalPackage().newFileName(field().name, settings.internal_image_extension ? _(".png") : _("")); // a new unique name in the package
|
||||
StyleP style = field().styleP;
|
||||
String rect = style ? style->getRect() : _("");
|
||||
String extension = settings.internal_image_extension ? _(".png") : _("");
|
||||
LocalFileName new_image_file = getLocalPackage().newFileName(field().name, rect + extension); // a new unique name in the package
|
||||
|
||||
// Specify a desired size based on the stylesheet and a scale multiplier defined within the user's settings.
|
||||
// Storing at a greater than 100% resolution allows for better exports >100%, but may change how images look when filters (sharpen) are applied.
|
||||
|
||||
Reference in New Issue
Block a user