mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 07:17:35 +00:00
PixelPaint: Make images keep track of their path & title
The title is either "Untitled" (default), or the basename of the image after we've opened or saved it.
This commit is contained in:
parent
35456f035c
commit
abc40af809
5 changed files with 45 additions and 1 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <AK/JsonObject.h>
|
#include <AK/JsonObject.h>
|
||||||
#include <AK/JsonObjectSerializer.h>
|
#include <AK/JsonObjectSerializer.h>
|
||||||
#include <AK/JsonValue.h>
|
#include <AK/JsonValue.h>
|
||||||
|
#include <AK/LexicalPath.h>
|
||||||
#include <AK/MappedFile.h>
|
#include <AK/MappedFile.h>
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <LibCore/File.h>
|
#include <LibCore/File.h>
|
||||||
|
@ -51,7 +52,8 @@ RefPtr<Image> Image::try_create_with_size(Gfx::IntSize const& size)
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::Image(Gfx::IntSize const& size)
|
Image::Image(Gfx::IntSize const& size)
|
||||||
: m_size(size)
|
: m_title("Untitled")
|
||||||
|
, m_size(size)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +133,7 @@ Result<NonnullRefPtr<Image>, String> Image::try_create_from_pixel_paint_file(Str
|
||||||
image->add_layer(*layer);
|
image->add_layer(*layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
image->set_path(file_path);
|
||||||
return image.release_nonnull();
|
return image.release_nonnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,6 +155,7 @@ Result<NonnullRefPtr<Image>, String> Image::try_create_from_file(String const& f
|
||||||
auto image = Image::try_create_from_bitmap(bitmap.release_nonnull());
|
auto image = Image::try_create_from_bitmap(bitmap.release_nonnull());
|
||||||
if (!image)
|
if (!image)
|
||||||
return String { "Unable to allocate Image"sv };
|
return String { "Unable to allocate Image"sv };
|
||||||
|
image->set_path(file_path);
|
||||||
return image.release_nonnull();
|
return image.release_nonnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,4 +422,17 @@ void ImageUndoCommand::redo()
|
||||||
undo();
|
undo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Image::set_title(String title)
|
||||||
|
{
|
||||||
|
m_title = move(title);
|
||||||
|
for (auto* client : m_clients)
|
||||||
|
client->image_did_change_title(m_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Image::set_path(String path)
|
||||||
|
{
|
||||||
|
m_path = move(path);
|
||||||
|
set_title(LexicalPath(m_path).basename());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ public:
|
||||||
virtual void image_did_modify_layer_stack() { }
|
virtual void image_did_modify_layer_stack() { }
|
||||||
virtual void image_did_change() { }
|
virtual void image_did_change() { }
|
||||||
virtual void image_select_layer(Layer*) { }
|
virtual void image_select_layer(Layer*) { }
|
||||||
|
virtual void image_did_change_title(String const&) { }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~ImageClient() = default;
|
virtual ~ImageClient() = default;
|
||||||
|
@ -76,6 +77,12 @@ public:
|
||||||
|
|
||||||
size_t index_of(Layer const&) const;
|
size_t index_of(Layer const&) const;
|
||||||
|
|
||||||
|
String const& path() const { return m_path; }
|
||||||
|
void set_path(String);
|
||||||
|
|
||||||
|
String const& title() const { return m_title; }
|
||||||
|
void set_title(String);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Image(Gfx::IntSize const&);
|
explicit Image(Gfx::IntSize const&);
|
||||||
|
|
||||||
|
@ -84,6 +91,9 @@ private:
|
||||||
void did_change();
|
void did_change();
|
||||||
void did_modify_layer_stack();
|
void did_modify_layer_stack();
|
||||||
|
|
||||||
|
String m_path;
|
||||||
|
String m_title;
|
||||||
|
|
||||||
Gfx::IntSize m_size;
|
Gfx::IntSize m_size;
|
||||||
NonnullRefPtrVector<Layer> m_layers;
|
NonnullRefPtrVector<Layer> m_layers;
|
||||||
|
|
||||||
|
|
|
@ -395,6 +395,12 @@ void ImageEditor::image_did_change()
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImageEditor::image_did_change_title(String const& path)
|
||||||
|
{
|
||||||
|
if (on_image_title_change)
|
||||||
|
on_image_title_change(path);
|
||||||
|
}
|
||||||
|
|
||||||
void ImageEditor::image_select_layer(Layer* layer)
|
void ImageEditor::image_select_layer(Layer* layer)
|
||||||
{
|
{
|
||||||
set_active_layer(layer);
|
set_active_layer(layer);
|
||||||
|
|
|
@ -63,6 +63,8 @@ public:
|
||||||
|
|
||||||
Function<void(Layer*)> on_active_layer_change;
|
Function<void(Layer*)> on_active_layer_change;
|
||||||
|
|
||||||
|
Function<void(String const&)> on_image_title_change;
|
||||||
|
|
||||||
Gfx::FloatRect layer_rect_to_editor_rect(Layer const&, Gfx::IntRect const&) const;
|
Gfx::FloatRect layer_rect_to_editor_rect(Layer const&, Gfx::IntRect const&) const;
|
||||||
Gfx::FloatRect image_rect_to_editor_rect(Gfx::IntRect const&) const;
|
Gfx::FloatRect image_rect_to_editor_rect(Gfx::IntRect const&) const;
|
||||||
Gfx::FloatRect editor_rect_to_image_rect(Gfx::IntRect const&) const;
|
Gfx::FloatRect editor_rect_to_image_rect(Gfx::IntRect const&) const;
|
||||||
|
@ -86,6 +88,7 @@ private:
|
||||||
|
|
||||||
virtual void image_did_change() override;
|
virtual void image_did_change() override;
|
||||||
virtual void image_select_layer(Layer*) override;
|
virtual void image_select_layer(Layer*) override;
|
||||||
|
virtual void image_did_change_title(String const&) override;
|
||||||
|
|
||||||
GUI::MouseEvent event_adjusted_for_layer(GUI::MouseEvent const&, Layer const&) const;
|
GUI::MouseEvent event_adjusted_for_layer(GUI::MouseEvent const&, Layer const&) const;
|
||||||
GUI::MouseEvent event_with_pan_and_scale_applied(GUI::MouseEvent const&) const;
|
GUI::MouseEvent event_with_pan_and_scale_applied(GUI::MouseEvent const&) const;
|
||||||
|
|
|
@ -135,6 +135,7 @@ int main(int argc, char** argv)
|
||||||
GUI::MessageBox::show_error(window, String::formatted("Could not save {}: {}", save_path.value(), result.error()));
|
GUI::MessageBox::show_error(window, String::formatted("Could not save {}: {}", save_path.value(), result.error()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
editor->image().set_path(save_path.value());
|
||||||
});
|
});
|
||||||
|
|
||||||
auto menubar = GUI::Menubar::construct();
|
auto menubar = GUI::Menubar::construct();
|
||||||
|
@ -506,6 +507,13 @@ int main(int argc, char** argv)
|
||||||
layer_properties_widget.set_layer(layer);
|
layer_properties_widget.set_layer(layer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
image_editor.on_image_title_change = [&](auto const& title) {
|
||||||
|
tab_widget.set_tab_title(image_editor, title);
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOTE: We invoke the above hook directly here to make sure the tab title is set up.
|
||||||
|
image_editor.on_image_title_change(image->title());
|
||||||
|
|
||||||
if (image->layer_count())
|
if (image->layer_count())
|
||||||
image_editor.set_active_layer(&image->layer(0));
|
image_editor.set_active_layer(&image->layer(0));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue