X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fdialog%2Fsvg-fonts-dialog.cpp;h=ac9556e1433a953a402cf55c6b0b4de7d694c403;hb=94ba79f0006969bce39d02ff2ba1215947263bca;hp=d280853675d16e89bc1fff6919816fb241c73aea;hpb=a6a96a7b597a4385f4a48fd5b6514b870a0f7dc4;p=inkscape.git diff --git a/src/ui/dialog/svg-fonts-dialog.cpp b/src/ui/dialog/svg-fonts-dialog.cpp index d28085367..ac9556e14 100644 --- a/src/ui/dialog/svg-fonts-dialog.cpp +++ b/src/ui/dialog/svg-fonts-dialog.cpp @@ -15,13 +15,14 @@ #ifdef ENABLE_SVG_FONTS +#include #include "svg-fonts-dialog.h" +#include #include SvgFontDrawingArea::SvgFontDrawingArea(){ this->text = ""; this->svgfont = NULL; - ((Gtk::Widget*) this)->set_size_request(150, 50); } void SvgFontDrawingArea::set_svgfont(SvgFont* svgfont){ @@ -32,6 +33,12 @@ void SvgFontDrawingArea::set_text(Glib::ustring text){ this->text = text; } +void SvgFontDrawingArea::set_size(int x, int y){ + this->x = x; + this->y = y; + ((Gtk::Widget*) this)->set_size_request(x, y); +} + void SvgFontDrawingArea::redraw(){ ((Gtk::Widget*) this)->queue_draw(); } @@ -41,8 +48,8 @@ bool SvgFontDrawingArea::on_expose_event (GdkEventExpose *event){ Glib::RefPtr window = get_window(); Cairo::RefPtr cr = window->create_cairo_context(); cr->set_font_face( Cairo::RefPtr(new Cairo::FontFace(this->svgfont->get_font_face(), false /* does not have reference */)) ); - cr->set_font_size (20); - cr->move_to (20, 20); + cr->set_font_size (this->y-20); + cr->move_to (10, 10); cr->show_text (this->text.c_str()); } return TRUE; @@ -68,11 +75,36 @@ void GlyphComboBox::update(SPFont* spfont){ } } +void SvgFontsDialog::on_kerning_changed(){ + if (this->kerning_pair){ + this->kerning_pair->k = kerning_spin.get_value(); + kerning_preview.redraw(); + _font_da.redraw(); + } +} + void SvgFontsDialog::on_glyphs_changed(){ std::string str1(first_glyph.get_active_text()); std::string str2(second_glyph.get_active_text()); kerning_preview.set_text((gchar*) (str1+str2).c_str()); kerning_preview.redraw(); + + + //look for this kerning pair on the currently selected font + this->kerning_pair = NULL; + for(SPObject* node = this->get_selected_spfont()->children; node; node=node->next){ + if (SP_IS_HKERN(node) && ((SPGlyphKerning*)node)->u1->contains((gchar) first_glyph.get_active_text().c_str()[0]) + && ((SPGlyphKerning*)node)->u2->contains((gchar) second_glyph.get_active_text().c_str()[0]) ){ + this->kerning_pair = (SPGlyphKerning*)node; + continue; + } + } + +//TODO: + //if not found, + //create new kern node + if (this->kerning_pair) + kerning_spin.set_value(this->kerning_pair->k); } /* Add all fonts in the document to the combobox. */ @@ -101,11 +133,29 @@ void SvgFontsDialog::on_preview_text_changed(){ } void SvgFontsDialog::on_font_selection_changed(){ - first_glyph.update(this->get_selected_spfont()); - second_glyph.update(this->get_selected_spfont()); - kerning_preview.set_svgfont(this->get_selected_svgfont()); - _font_da.set_svgfont(this->get_selected_svgfont()); + SPFont* spfont = this->get_selected_spfont(); + SvgFont* svgfont = this->get_selected_svgfont(); + first_glyph.update(spfont); + second_glyph.update(spfont); + kerning_preview.set_svgfont(svgfont); + _font_da.set_svgfont(svgfont); _font_da.redraw(); + + int steps = 50; + double set_width = spfont->horiz_adv_x; + setwidth_spin.set_value(set_width); + + kerning_spin.set_range(0,set_width); + kerning_spin.set_increments(int(set_width/steps),2*int(set_width/steps)); + kerning_spin.set_value(0); +} + +void SvgFontsDialog::on_setwidth_changed(){ + SPFont* spfont = this->get_selected_spfont(); + if (spfont){ + spfont->horiz_adv_x = setwidth_spin.get_value(); + //TODO: tell cairo that the glyphs cache has to be invalidated + } } SvgFont* SvgFontsDialog::get_selected_svgfont() @@ -124,6 +174,57 @@ SPFont* SvgFontsDialog::get_selected_spfont() return NULL; } +Gtk::VBox* SvgFontsDialog::global_settings_tab(){ + Gtk::VBox* global_vbox = Gtk::manage(new Gtk::VBox()); + +//Set Width (horiz_adv_x): + Gtk::HBox* setwidth_hbox = Gtk::manage(new Gtk::HBox()); + setwidth_hbox->add(*Gtk::manage(new Gtk::Label(_("Set width:")))); + setwidth_hbox->add(setwidth_spin); + + setwidth_spin.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_setwidth_changed)); + setwidth_spin.set_range(0, 4096); + setwidth_spin.set_increments(10, 100); + global_vbox->add(*setwidth_hbox); + + return global_vbox; +} + +Gtk::VBox* SvgFontsDialog::glyphs_tab(){ + Gtk::VBox* glyphs_vbox = Gtk::manage(new Gtk::VBox()); + return glyphs_vbox; +} + +Gtk::VBox* SvgFontsDialog::kerning_tab(){ + +//kerning setup: + Gtk::VBox* kernvbox = Gtk::manage(new Gtk::VBox()); + +//Kerning Setup: + kernvbox->add(*Gtk::manage(new Gtk::Label(_("Kerning Setup:")))); + Gtk::HBox* kerning_selector = Gtk::manage(new Gtk::HBox()); + kerning_selector->add(*Gtk::manage(new Gtk::Label(_("1st Glyph:")))); + kerning_selector->add(first_glyph); + kerning_selector->add(*Gtk::manage(new Gtk::Label(_("2nd Glyph:")))); + kerning_selector->add(second_glyph); + first_glyph.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_glyphs_changed)); + second_glyph.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_glyphs_changed)); + kerning_spin.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_kerning_changed)); + + kernvbox->add(*kerning_selector); + kernvbox->add((Gtk::Widget&) kerning_preview); + + Gtk::HBox* kerning_amount_hbox = Gtk::manage(new Gtk::HBox()); + kernvbox->add(*kerning_amount_hbox); + kerning_amount_hbox->add(*Gtk::manage(new Gtk::Label(_("Kerning value:")))); + kerning_amount_hbox->add(kerning_spin); + + kerning_preview.set_size(300 + 20, 150 + 20); + _font_da.set_size(150 + 20, 50 + 20); + + return kernvbox; +} + SvgFontsDialog::SvgFontsDialog() : UI::Widget::Panel("", "dialogs.svgfonts", SP_VERB_DIALOG_SVG_FONTS) { @@ -135,33 +236,31 @@ SvgFontsDialog::SvgFontsDialog() //List of SVGFonts declared in a document: _model = Gtk::ListStore::create(_columns); _font_list.set_model(_model); - _font_list.append_column_editable("_Font", _columns.label); + _font_list.append_column_editable(_("_Font"), _columns.label); _font_list.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_font_selection_changed)); this->update_fonts(); -//kerning setup: - Gtk::VBox* kernvbox = Gtk::manage(new Gtk::VBox()); - _font_settings.add(*kernvbox); - kernvbox->add(*Gtk::manage(new Gtk::Label("Kerning Setup:"))); - Gtk::HBox* kerning_selector = Gtk::manage(new Gtk::HBox()); - kerning_selector->add(first_glyph); - kerning_selector->add(second_glyph); - first_glyph.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_glyphs_changed)); - second_glyph.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_glyphs_changed)); + Gtk::Notebook *tabs = Gtk::manage(new Gtk::Notebook()); + tabs->set_scrollable(); - Gtk::SpinButton* kerning_spin = Gtk::manage(new Gtk::SpinButton()); - kernvbox->add(*kerning_selector); - kernvbox->add((Gtk::Widget&) kerning_preview); - kernvbox->add(*kerning_spin); + tabs->append_page(*global_settings_tab(), _("_Global Settings"), true); + tabs->append_page(*glyphs_tab(), _("_Glyphs"), true); + tabs->append_page(*kerning_tab(), _("_Kerning"), true); + + _font_settings.add(*tabs); //Text Preview: _preview_entry.signal_changed().connect(sigc::mem_fun(*this, &SvgFontsDialog::on_preview_text_changed)); - _getContents()->add(*Gtk::manage(new Gtk::Label("Preview Text:"))); _getContents()->add((Gtk::Widget&) _font_da); _preview_entry.set_text("Sample Text"); _font_da.set_text("Sample Text"); - _getContents()->add(_preview_entry); + + Gtk::HBox* preview_entry_hbox = Gtk::manage(new Gtk::HBox()); + _getContents()->add(*preview_entry_hbox); + preview_entry_hbox->add(*Gtk::manage(new Gtk::Label(_("Preview Text:")))); + preview_entry_hbox->add(_preview_entry); + _getContents()->show_all(); }