skia2/experimental/sktext/editor/App.cpp
Julia Lavrova ad5944cf8d Refactoring Text Editor (in progress)
Insert/Delete/Backspace
Status line

Change-Id: I38727ddb86bf20cdd6c64363c33ffda03ab3c2c7
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/431179
Reviewed-by: Julia Lavrova <jlavrova@google.com>
Commit-Queue: Julia Lavrova <jlavrova@google.com>
2021-08-09 15:06:56 +00:00

72 lines
2.1 KiB
C++

// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
// Proof of principle of a text editor written with Skia & SkShaper.
// https://bugs.skia.org/9020
#include "include/core/SkCanvas.h"
#include "include/core/SkSurface.h"
#include "include/core/SkTime.h"
#include "tools/sk_app/Application.h"
#include "tools/sk_app/Window.h"
#include "tools/skui/ModifierKey.h"
#include "experimental/sktext/editor/Editor.h"
#include "third_party/icu/SkLoadICU.h"
#include <fstream>
#include <memory>
using namespace skia::text;
namespace skia {
namespace editor {
struct EditorApplication : public sk_app::Application {
std::unique_ptr<sk_app::Window> fWindow;
std::unique_ptr<Editor> fLayer;
double fNextTime = -DBL_MAX;
EditorApplication(std::unique_ptr<sk_app::Window> win) : fWindow(std::move(win)) {}
bool init(const char* path) {
fWindow->attach(sk_app::Window::kRaster_BackendType);
fLayer = Editor::MakeDemo(fWindow->width(), fWindow->height());
fWindow->pushLayer(fLayer.get());
fWindow->setTitle("Editor");
fLayer->onResize(fWindow->width(), fWindow->height());
fWindow->show();
return true;
}
~EditorApplication() override { fWindow->detach(); }
void onIdle() override {
double now = SkTime::GetNSecs();
if (now >= fNextTime) {
constexpr double kHalfPeriodNanoSeconds = 0.5 * 1e9;
fNextTime = now + kHalfPeriodNanoSeconds;
fLayer->blink();
fWindow->inval();
}
}
};
} // namespace text
} // namespace skia
sk_app::Application* sk_app::Application::Create(int argc, char** argv, void* dat) {
if (!SkLoadICU()) {
SK_ABORT("SkLoadICU failed.");
}
std::unique_ptr<sk_app::Window> win(sk_app::Window::CreateNativeWindow(dat));
if (!win) {
SK_ABORT("CreateNativeWindow failed.");
}
std::unique_ptr<skia::editor::EditorApplication> app(new skia::editor::EditorApplication(std::move(win)));
(void)app->init(argc > 1 ? argv[1] : nullptr);
return app.release();
}