index d657b909640f8383b099dbb91f94c1bf1833b8d5..7b0fea5f558fd8b91d0397b444762ec8c24a8841 100644 (file)
# include <config.h>
#endif
+#include <string.h>
+
#include <cmath>
#include <gtkmm.h>
#include "ui/widget/button.h"
{ "B9", 44, 62, SP_UNIT_MM },
{ "B10", 31, 44, SP_UNIT_MM },
-#if 0 /*
+
+
+//#if 0
+ /*
Whether to include or exclude these depends on how
big we mind our page size menu
becoming. C series is used for envelopes;
- don't know what D and E series are used for. */
+ don't know what D and E series are used for.
+ */
+
{ "C0", 917, 1297, SP_UNIT_MM },
{ "C1", 648, 917, SP_UNIT_MM },
{ "C2", 458, 648, SP_UNIT_MM },
{ "E4", 280, 400, SP_UNIT_MM },
{ "E5", 200, 280, SP_UNIT_MM },
{ "E6", 140, 200, SP_UNIT_MM },
-#endif
+//#endif
+
+
{ "CSE", 462, 649, SP_UNIT_PT },
{ "US #10 Envelope", 4.125, 9.5, SP_UNIT_IN },
*/
PageSizer::PageSizer() : Gtk::VBox(false,4)
{
- Gtk::HBox *hbox_size = manage (new Gtk::HBox (false, 4));
- pack_start (*hbox_size, false, false, 0);
- Gtk::Label *label_size = manage (new Gtk::Label (_("P_age size:"), 1.0, 0.5));
- label_size->set_use_underline();
- hbox_size->pack_start (*label_size, false, false, 0);
- label_size->set_mnemonic_widget (_paperSizeList);
- hbox_size->pack_start (_paperSizeList, true, true, 0);
-
- //# Set up the Paper Size combo box
-
+
+
+ //# Set up the Paper Size combo box
+ _paperSizeListStore = Gtk::ListStore::create(_paperSizeListColumns);
+ _paperSizeList.set_model(_paperSizeListStore);
+ _paperSizeList.append_column(_("Name"),
+ _paperSizeListColumns.nameColumn);
+ _paperSizeList.append_column(_("Description"),
+ _paperSizeListColumns.descColumn);
+ _paperSizeList.set_headers_visible(false);
+ _paperSizeListSelection = _paperSizeList.get_selection();
+ _paper_size_list_connection =
+ _paperSizeListSelection->signal_changed().connect (
+ sigc::mem_fun (*this, &PageSizer::on_paper_size_list_changed));
+ _paperSizeListScroller.add(_paperSizeList);
+ _paperSizeListScroller.set_shadow_type(Gtk::SHADOW_IN);
+ _paperSizeListScroller.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
+ _paperSizeListScroller.set_size_request(-1, 90);
+
for (PaperSizeRec const *p = inkscape_papers; p->name; p++)
{
Glib::ustring name = p->name;
+ char formatBuf[80];
+ snprintf(formatBuf, 79, "%0.1f x %0.1f", p->smaller, p->larger);
+ Glib::ustring desc = formatBuf;
+ if (p->unit == SP_UNIT_IN)
+ desc.append(" in");
+ else if (p->unit == SP_UNIT_MM)
+ desc.append(" mm");
+ else if (p->unit == SP_UNIT_PX)
+ desc.append(" px");
PaperSize paper(name, p->smaller, p->larger, p->unit);
- paperSizeTable[name] = paper;
- _paperSizeList.append_text(name);
+ _paperSizeTable[name] = paper;
+ Gtk::TreeModel::Row row = *(_paperSizeListStore->append());
+ row[_paperSizeListColumns.nameColumn] = name;
+ row[_paperSizeListColumns.descColumn] = desc;
}
+ //Gtk::TreeModel::iterator iter = _paperSizeListStore->children().begin();
+ //if (iter)
+ // _paperSizeListSelection->select(iter);
+
+
+ pack_start (_paperSizeListBox, false, false, 0);
+ _paperSizeListLabel.set_label(_("P_age size:"));
+ _paperSizeListLabel.set_use_underline();
+ _paperSizeListBox.pack_start (_paperSizeListLabel, false, false, 0);
+ _paperSizeListLabel.set_mnemonic_widget (_paperSizeList);
+ _paperSizeListBox.pack_start (_paperSizeListScroller, true, true, 0);
+
+ //## Set up orientation radio buttons
+ pack_start (_orientationBox, false, false, 0);
+ _orientationLabel.set_label(_("Page orientation:"));
+ _orientationBox.pack_start(_orientationLabel, false, false, 0);
+ _landscapeButton.set_use_underline();
+ _landscapeButton.set_label(_("_Landscape"));
+ _landscapeButton.set_active(true);
+ Gtk::RadioButton::Group group = _landscapeButton.get_group();
+ _orientationBox.pack_end (_landscapeButton, false, false, 5);
+ _portraitButton.set_use_underline();
+ _portraitButton.set_label(_("_Portrait"));
+ _portraitButton.set_active(true);
+ _orientationBox.pack_end (_portraitButton, false, false, 5);
+ _portraitButton.set_group (group);
+ _portraitButton.set_active (true);
+
+ //## Set up custom size frame
+ _customFrame.set_label(_("Custom size"));
+ pack_start (_customFrame, false, false, 0);
+ _customTable.resize(2, 2);
+ _customTable.set_border_width (4);
+ _customTable.set_row_spacings (4);
+ _customTable.set_col_spacings (4);
+ _customFrame.add(_customTable);
+
+ _fitPageButton.set_use_underline();
+ _fitPageButton.set_label(_("_Fit page to selection"));
+ _tips.set_tip(_fitPageButton,
+ _("Resize the page to fit the current selection, or the entire drawing if there is no selection"));
+
+
}
void
PageSizer::init (Registry& reg)
{
- Gtk::HBox *hbox_ori = manage (new Gtk::HBox);
- pack_start (*hbox_ori, false, false, 0);
- Gtk::Label *label_ori = manage (new Gtk::Label (_("Page orientation:"), 0.0, 0.5));
- hbox_ori->pack_start (*label_ori, false, false, 0);
-
- _landscapeButton.set_label(_("_Landscape"));
- _landscapeButton.set_active(true);
- Gtk::RadioButton::Group group = _landscapeButton.get_group();
- hbox_ori->pack_end (_landscapeButton, false, false, 5);
- _portraitButton.set_label(_("_Portrait"));
- _portraitButton.set_active(true);
- hbox_ori->pack_end (_portraitButton, false, false, 5);
- _portraitButton.set_group (group);
- _portraitButton.set_active (true);
-
- /* Custom paper frame */
- Gtk::Frame *frame = manage (new Gtk::Frame(_("Custom size")));
- pack_start (*frame, false, false, 0);
- Gtk::Table *table = manage (new Gtk::Table (5, 2, false));
- table->set_border_width (4);
- table->set_row_spacings (4);
- table->set_col_spacings (4);
-
- Inkscape::UI::Widget::Button* fit_canv =
- manage(new Inkscape::UI::Widget::Button(_("_Fit page to selection"),
- _("Resize the page to fit the current selection, or the entire drawing if there is no selection")));
-
- // prevent fit_canv from expanding
- Gtk::Alignment *fit_canv_cont = manage(new Gtk::Alignment(1.0,0.5,0.0,0.0));
- fit_canv_cont->add(*fit_canv);
- frame->add (*table);
+ /*
+ Note that the registered widgets can only be placed onto a
+ container after they have been init()-ed. That is why some
+ of the widget creation is in the constructor, and the rest is
+ here.
+ */
_widgetRegistry = ®
_dimensionHeight.init (_("_Height:"), _("Height of paper"), "height",
_dimensionUnits, *_widgetRegistry);
- table->attach (*_dimensionUnits._label, 0,1,0,1, Gtk::FILL|Gtk::EXPAND,
- (Gtk::AttachOptions)0,0,0);
- table->attach (*_dimensionUnits._sel, 1,2,0,1, Gtk::FILL|Gtk::EXPAND,
- (Gtk::AttachOptions)0,0,0);
- table->attach (*_dimensionWidth.getSU(), 0,2,1,2, Gtk::FILL|Gtk::EXPAND,
- (Gtk::AttachOptions)0,0,0);
- table->attach (*_dimensionHeight.getSU(), 0,2,2,3, Gtk::FILL|Gtk::EXPAND,
- (Gtk::AttachOptions)0,0,0);
- table->attach (*fit_canv_cont, 0,2,3,4, Gtk::FILL|Gtk::EXPAND,
- (Gtk::AttachOptions)0,0,0);
-
- _paper_size_list_connection = _paperSizeList.signal_changed().connect (
- sigc::mem_fun (*this, &PageSizer::on_paper_size_list_changed));
-
+ _customTable.attach(*(_dimensionWidth.getSU()), 0,1,0,1);
+ _customTable.attach(*(_dimensionUnits._sel), 1,2,0,1);
+ _customTable.attach(*(_dimensionHeight.getSU()), 0,1,1,2);
+ _customTable.attach(_fitPageButton, 1,2,1,2);
+
_landscape_connection = _landscapeButton.signal_toggled().connect (
sigc::mem_fun (*this, &PageSizer::on_landscape));
_portrait_connection = _portraitButton.signal_toggled().connect (
sigc::mem_fun (*this, &PageSizer::on_value_changed));
_changedh_connection = _dimensionHeight.getSU()->signal_value_changed().connect (
sigc::mem_fun (*this, &PageSizer::on_value_changed));
- fit_canv->signal_clicked().connect(
+ _fitPageButton.signal_clicked().connect(
sigc::mem_fun(*this, &PageSizer::fire_fit_canvas_to_selection_or_drawing));
show_all_children();
+
}
SPDocument *doc = sp_desktop_document(SP_ACTIVE_DESKTOP);
sp_document_set_width (doc, w, &_px_unit);
sp_document_set_height (doc, h, &_px_unit);
- sp_document_done (doc, SP_VERB_NONE,
- /* TODO: annotate */ "page-sizer.cpp:301");
+ sp_document_done (doc, SP_VERB_NONE, _("Set page size"));
}
_landscape = ( w > h );
_portraitButton.set_active (_landscape ? false : true);
if (changeList)
- _paperSizeList.set_active (find_paper_size (w, h));
+ {
+ Gtk::TreeModel::Row row = (*find_paper_size(w, h));
+ if (row)
+ _paperSizeListSelection->select(row);
+ }
Unit const& unit = _dimensionUnits._sel->getUnit();
_dimensionWidth.setValue (w / unit.factor);
/**
- * Returns an index into paperSizeTable of a paper of the specified
- * size (specified in px), or -1 if there's no such paper.
+ * Returns an iterator pointing to a row in paperSizeListStore which
+ * contains a paper of the specified size (specified in px), or
+ * paperSizeListStore->children().end() if no such paper exists.
*/
-int
+Gtk::ListStore::iterator
PageSizer::find_paper_size (double w, double h) const
{
double smaller = w;
smaller = h; larger = w;
}
- g_return_val_if_fail(smaller <= larger, -1);
+ g_return_val_if_fail(smaller <= larger, _paperSizeListStore->children().end());
- int index = 0;
std::map<Glib::ustring, PaperSize>::const_iterator iter;
- for (iter = paperSizeTable.begin() ; iter != paperSizeTable.end() ; iter++) {
+ for (iter = _paperSizeTable.begin() ;
+ iter != _paperSizeTable.end() ; iter++) {
PaperSize paper = iter->second;
SPUnit const &i_unit = sp_unit_get_by_id(paper.unit);
double smallX = sp_units_get_pixels(paper.smaller, i_unit);
double largeX = sp_units_get_pixels(paper.larger, i_unit);
- g_return_val_if_fail(smallX <= largeX, -1);
+ g_return_val_if_fail(smallX <= largeX, _paperSizeListStore->children().end());
if ((std::abs(smaller - smallX) <= 0.1) &&
- (std::abs(larger - largeX) <= 0.1) )
- return index;
-
- index++;
+ (std::abs(larger - largeX) <= 0.1) ) {
+ Gtk::ListStore::iterator p;
+ // We need to search paperSizeListStore explicitly for the
+ // specified paper size because it is sorted in a different
+ // way than paperSizeTable (which is sorted alphabetically)
+ for (p = _paperSizeListStore->children().begin(); p != _paperSizeListStore->children().end(); p++) {
+ if ((*p)[_paperSizeListColumns.nameColumn] == paper.name) {
+ return p;
+ }
+ }
+ }
}
- return -1;
+ return _paperSizeListStore->children().end();
}
void
PageSizer::on_paper_size_list_changed()
{
- Glib::ustring name = _paperSizeList.get_active_text();
- std::map<Glib::ustring, PaperSize>::const_iterator iter =
- paperSizeTable.find(name);
- if (iter == paperSizeTable.end()) {
+ //Glib::ustring name = _paperSizeList.get_active_text();
+ Gtk::TreeModel::iterator miter = _paperSizeListSelection->get_selected();
+ if(!miter)
+ {
+ //error?
+ return;
+ }
+ Gtk::TreeModel::Row row = *miter;
+ Glib::ustring name = row[_paperSizeListColumns.nameColumn];
+ std::map<Glib::ustring, PaperSize>::const_iterator piter =
+ _paperSizeTable.find(name);
+ if (piter == _paperSizeTable.end()) {
g_warning("paper size '%s' not found in table", name.c_str());
return;
}
- PaperSize paper = iter->second;
+ PaperSize paper = piter->second;
double w = paper.smaller;
double h = paper.larger;
SPUnit const &src_unit = sp_unit_get_by_id (paper.unit);