Skip to content

Commit

Permalink
Magnifier: Add the option to save captures
Browse files Browse the repository at this point in the history
  • Loading branch information
gigaroby authored and AtkinsSJ committed Sep 26, 2022
1 parent eb0657c commit 69f7a59
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Userland/Applications/Magnifier/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ set(SOURCES
)

serenity_app(Magnifier ICON app-magnifier)
target_link_libraries(Magnifier LibGfx LibGUI LibMain)
target_link_libraries(Magnifier LibGfx LibGUI LibMain LibFileSystemAccessClient)
2 changes: 2 additions & 0 deletions Userland/Applications/Magnifier/MagnifierWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class MagnifierWidget final : public GUI::Frame {
virtual ~MagnifierWidget() override = default;
void set_scale_factor(int scale_factor);
void set_color_filter(OwnPtr<Gfx::ColorBlindnessFilter>);

void pause_capture(bool pause)
{
m_pause_capture = pause;
Expand All @@ -26,6 +27,7 @@ class MagnifierWidget final : public GUI::Frame {
}
void display_previous_frame();
void display_next_frame();
RefPtr<Gfx::Bitmap> current_bitmap() const { return m_grabbed_bitmap; };

private:
MagnifierWidget();
Expand Down
43 changes: 42 additions & 1 deletion Userland/Applications/Magnifier/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,43 @@
*/

#include "MagnifierWidget.h"
#include <AK/LexicalPath.h>
#include <LibCore/System.h>
#include <LibFileSystemAccessClient/Client.h>
#include <LibGUI/ActionGroup.h>
#include <LibGUI/Application.h>
#include <LibGUI/Icon.h>
#include <LibGUI/Menu.h>
#include <LibGUI/Menubar.h>
#include <LibGUI/MessageBox.h>
#include <LibGUI/Window.h>
#include <LibGfx/BMPWriter.h>
#include <LibGfx/Filters/ColorBlindnessFilter.h>
#include <LibGfx/PNGWriter.h>
#include <LibGfx/QOIWriter.h>
#include <LibMain/Main.h>

static ErrorOr<ByteBuffer> dump_bitmap(RefPtr<Gfx::Bitmap> bitmap, AK::StringView extension)
{
if (extension == "bmp") {
Gfx::BMPWriter dumper;
return dumper.dump(bitmap);
} else if (extension == "png") {
return Gfx::PNGWriter::encode(*bitmap);
} else if (extension == "qoi") {
return Gfx::QOIWriter::encode(*bitmap);
} else {
return Error::from_string_literal("invalid image format");
}
}

ErrorOr<int> serenity_main(Main::Arguments arguments)
{
TRY(Core::System::pledge("stdio cpath rpath recvfd sendfd unix"));
auto app = TRY(GUI::Application::try_create(arguments));

TRY(Core::System::pledge("stdio cpath rpath recvfd sendfd"));
TRY(Core::System::unveil("/res", "r"));
TRY(Core::System::unveil("/tmp/user/%uid/portal/filesystemaccess", "rw"));
TRY(Core::System::unveil(nullptr, nullptr));

auto app_icon = GUI::Icon::default_icon("app-magnifier"sv);
Expand All @@ -40,6 +60,27 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
app->quit();
})));

TRY(file_menu->try_add_action(GUI::CommonActions::make_save_as_action([&](auto&) {
AK::String filename = "file for saving";
auto do_save = [&]() -> ErrorOr<void> {
auto file = TRY(FileSystemAccessClient::Client::the().try_save_file(window, "Capture", "png"));
auto path = AK::LexicalPath(file->filename());
filename = path.basename();
auto encoded = TRY(dump_bitmap(magnifier->current_bitmap(), path.extension()));

if (!file->write(encoded.data(), encoded.size())) {
return Error::from_errno(file->error());
}
return {};
};

auto result = do_save();
if (result.is_error()) {
GUI::MessageBox::show(window, "Unable to save file.\n"sv, "Error"sv, GUI::MessageBox::Type::Error);
warnln("Error saving bitmap to {}: {}", filename, result.error().string_literal());
}
})));

auto size_action_group = make<GUI::ActionGroup>();

auto two_x_action = GUI::Action::create_checkable(
Expand Down

0 comments on commit 69f7a59

Please sign in to comment.