Drag drop URLs only parses images, and ignores files

This commit is contained in:
Yousef Khadadeh 2025-10-09 16:56:05 +03:00
parent 32a654b731
commit 27d334e234
10 changed files with 43 additions and 13 deletions

View file

@ -26,6 +26,8 @@ std::shared_ptr<FileDownloader::DownloadData> FileDownloader::download_data_from
h.eHandle = curl_easy_init();
curl_easy_setopt(h.eHandle, CURLOPT_URL, url.data());
curl_easy_setopt(h.eHandle, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(h.eHandle, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_ALL);
curl_easy_setopt(h.eHandle, CURLOPT_USERAGENT, "InfiniPaint/1.0");
disable_ssl_verification(h.eHandle);
save_to_string(h.eHandle, &h.data->str);

View file

@ -462,23 +462,28 @@ void DrawingProgram::update_downloading_dropped_files() {
ResourceData newResource;
newResource.data = std::make_shared<std::string>(downFile.downData->str);
newResource.name = "downloaded file";
ServerClientID imageID = world.rMan.add_resource(newResource);
std::shared_ptr<ResourceDisplay> display = world.rMan.get_display_data(imageID);
Vector2f imTrueDim = display->get_dimensions();
if(display->get_type() == ResourceDisplay::Type::FILE) {
Logger::get().log("WORLDFATAL", "Failed to parse image from URL");
client_erase_set({downFile.comp});
}
else {
Vector2f imTrueDim = display->get_dimensions();
float imWidth = imTrueDim.x() / (imTrueDim.x() + imTrueDim.y());
float imHeight = imTrueDim.y() / (imTrueDim.x() + imTrueDim.y());
Vector2f imDim = Vector2f{downFile.windowSizeWhenDropped.x() * imWidth, downFile.windowSizeWhenDropped.x() * imHeight} * display->get_dimension_scale();
img->d.p1 = dropPos - imDim;
img->d.p2 = dropPos + imDim;
img->d.imageID = imageID;
img->commit_update(*this);
img->client_send_update(*this, true);
float imWidth = imTrueDim.x() / (imTrueDim.x() + imTrueDim.y());
float imHeight = imTrueDim.y() / (imTrueDim.x() + imTrueDim.y());
Vector2f imDim = Vector2f{downFile.windowSizeWhenDropped.x() * imWidth, downFile.windowSizeWhenDropped.x() * imHeight} * display->get_dimension_scale();
img->d.p1 = dropPos - imDim;
img->d.p2 = dropPos + imDim;
img->d.imageID = imageID;
img->commit_update(*this);
img->client_send_update(*this, true);
}
return true;
}
case FileDownloader::DownloadData::Status::FAILURE:
Logger::get().log("WORLDFATAL", "Failed to download data from URL");
client_erase_set({downFile.comp});
return true;
case FileDownloader::DownloadData::Status::IN_PROGRESS:

View file

@ -53,3 +53,7 @@ Vector2f FileResourceDisplay::get_dimensions() const {
float FileResourceDisplay::get_dimension_scale() const {
return 0.1f;
}
ResourceDisplay::Type FileResourceDisplay::get_type() const {
return ResourceDisplay::Type::FILE;
}

View file

@ -10,6 +10,7 @@ class FileResourceDisplay : public ResourceDisplay {
virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) override;
virtual Vector2f get_dimensions() const override;
virtual float get_dimension_scale() const override;
virtual Type get_type() const override;
private:
std::string fileName;
};

View file

@ -87,3 +87,7 @@ Vector2f ImageResourceDisplay::get_dimensions() const {
float ImageResourceDisplay::get_dimension_scale() const {
return 0.3f;
}
ResourceDisplay::Type ImageResourceDisplay::get_type() const {
return ResourceDisplay::Type::IMAGE;
}

View file

@ -11,6 +11,7 @@ class ImageResourceDisplay : public ResourceDisplay {
virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) override;
virtual Vector2f get_dimensions() const override;
virtual float get_dimension_scale() const override;
virtual Type get_type() const override;
private:
struct FrameData {
sk_sp<SkImage> data;

View file

@ -11,11 +11,17 @@ class ResourceManager;
class ResourceDisplay {
public:
enum class Type {
FILE,
IMAGE,
SVG
};
virtual void update(World& w) = 0;
virtual bool load(ResourceManager& rMan, const std::string& fileName, const std::string& fileData) = 0;
virtual bool update_draw() const = 0;
virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) = 0;
virtual Vector2f get_dimensions() const = 0;
virtual float get_dimension_scale() const = 0;
virtual Type get_type() const = 0;
virtual ~ResourceDisplay();
};

View file

@ -50,3 +50,7 @@ Vector2f SvgResourceDisplay::get_dimensions() const {
float SvgResourceDisplay::get_dimension_scale() const {
return 0.3f;
}
ResourceDisplay::Type SvgResourceDisplay::get_type() const {
return ResourceDisplay::Type::SVG;
}

View file

@ -12,6 +12,7 @@ class SvgResourceDisplay : public ResourceDisplay {
virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) override;
virtual Vector2f get_dimensions() const override;
virtual float get_dimension_scale() const override;
virtual Type get_type() const override;
private:
sk_sp<SkSVGDOM> svgDom;
bool mustUpdateDraw = false;

View file

@ -687,16 +687,18 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
mS.m->input.text.newInput = event->text.text;
break;
case SDL_EVENT_DROP_FILE:
mS.m->window.scale = SDL_GetWindowPixelDensity(mS.window);
mS.m->input.droppedItems.emplace_back(InputManager::DroppedItem{
true,
Vector2f{event->drop.x, event->drop.y},
Vector2f{event->drop.x, event->drop.y} * mS.m->window.scale,
event->drop.data
});
break;
case SDL_EVENT_DROP_TEXT:
mS.m->window.scale = SDL_GetWindowPixelDensity(mS.window);
mS.m->input.droppedItems.emplace_back(InputManager::DroppedItem{
false,
Vector2f{event->drop.x, event->drop.y},
Vector2f{event->drop.x, event->drop.y} * mS.m->window.scale,
event->drop.data
});
break;