Pick the text stage's font with a font chooser
A new Font param type (ParamSpec::makeFont) is a font family as the machine names it. The interface shows it as a family-only FontDialogButton; the command line and the project file treat it as a plain string, as they did the Text param it replaces, so existing projects and --font-family keep working. A family the machine lacks is kept as written. Bumps the version to 0.8.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -591,6 +591,48 @@ void testVideo(Gtk::Window& window, const std::filesystem::path& dir) {
|
||||
stack->set_visible_child("chain");
|
||||
}
|
||||
|
||||
// A font param is a font chooser showing the family, and the family picked
|
||||
// there is what the stage renders with and what the project saves.
|
||||
void testFont(Gtk::Window& window, const std::filesystem::path& dir) {
|
||||
std::cout << "font\n";
|
||||
std::filesystem::create_directories(dir);
|
||||
const auto path = dir / "lettering.json";
|
||||
effector::Project project;
|
||||
effector::ChainStage stage{effector::effectByName("text"), {}};
|
||||
stage.values["font_family"] = std::string("Serif");
|
||||
project.stages.push_back(stage);
|
||||
effector::saveProject(path.string(), project);
|
||||
window.activate_action("win.open-recent",
|
||||
Glib::Variant<Glib::ustring>::create(Glib::filename_to_uri(path.string())));
|
||||
pump(300);
|
||||
|
||||
auto* chainList = named<Gtk::ListBox>(window, "chain-list");
|
||||
if (chainList != nullptr && chainList->get_row_at_index(0) != nullptr) {
|
||||
chainList->select_row(*chainList->get_row_at_index(0));
|
||||
}
|
||||
pump(100);
|
||||
std::vector<Gtk::FontDialogButton*> buttons;
|
||||
collect<Gtk::FontDialogButton>(window, [](Gtk::FontDialogButton& b) { return b.is_drawable(); },
|
||||
buttons);
|
||||
check(buttons.size() == 1, "the text stage picks its font with a font chooser");
|
||||
if (buttons.size() != 1) return;
|
||||
auto* button = buttons.front();
|
||||
check(button->get_level() == Gtk::FontLevel::FAMILY,
|
||||
"which chooses only the family, the weight and size being params of their own");
|
||||
check(button->get_font_desc().get_family() == "Serif", "and shows the family saved");
|
||||
|
||||
Pango::FontDescription mono;
|
||||
mono.set_family("Monospace");
|
||||
button->set_font_desc(mono);
|
||||
pump(100);
|
||||
window.activate_action("win.save-project");
|
||||
pump(100);
|
||||
const auto saved = effector::loadProject(path.string());
|
||||
check(saved.stages.size() == 1 &&
|
||||
effector::paramText(saved.stages[0].values, "font_family", "") == "Monospace",
|
||||
"a family chosen there is saved with the project");
|
||||
}
|
||||
|
||||
// A project whose images will not fit is refused before any is decoded, and
|
||||
// saving it then must not quietly drop them from the file.
|
||||
void testMemoryGuard(Gtk::Window& window, const std::filesystem::path& dir) {
|
||||
@@ -658,6 +700,7 @@ int main(int argc, char** argv) {
|
||||
testHelpWindows(*window);
|
||||
testRecentProjects(*window, dataDir / "projects");
|
||||
testVideo(*window, dataDir / "video");
|
||||
testFont(*window, dataDir / "font");
|
||||
testMemoryGuard(*window, dataDir / "memory");
|
||||
app->remove_window(*window);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user