summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorShlomi Fish <shlomif@shlomifish.org>2016-09-29 16:32:49 +0000
committerShlomi Fish <shlomif@shlomifish.org>2016-09-29 16:32:49 +0000
commitf51ad5ea1ef1c96a93a64910cb263a360fc32d00 (patch)
tree29626e107bf83f920304192ccacb3d538a4676e3 /src/ui
parentRemove "== true" and trailing whitespace. (diff)
parentfix tabs in src/main-cmdlineact (diff)
downloadinkscape-f51ad5ea1ef1c96a93a64910cb263a360fc32d00.tar.gz
inkscape-f51ad5ea1ef1c96a93a64910cb263a360fc32d00.zip
Merged.
(bzr r15100.1.23)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/dialog/align-and-distribute.cpp4
-rw-r--r--src/ui/dialog/export.cpp62
-rw-r--r--src/ui/dialog/export.h14
-rw-r--r--src/ui/dialog/xml-tree.cpp3
-rw-r--r--src/ui/tools/gradient-tool.cpp1
-rw-r--r--src/ui/tools/mesh-tool.cpp35
-rw-r--r--src/ui/widget/selected-style.cpp4
7 files changed, 97 insertions, 26 deletions
diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp
index ed9ec3b0a..7ba6df978 100644
--- a/src/ui/dialog/align-and-distribute.cpp
+++ b/src/ui/dialog/align-and-distribute.cpp
@@ -134,10 +134,10 @@ void ActionAlign::do_action(SPDesktop *desktop, int index)
switch (AlignTarget(prefs->getInt("/dialogs/align/align-to", 6)))
{
case LAST:
- focus = SP_ITEM(*selected.begin());
+ focus = SP_ITEM(*--(selected.end()));
break;
case FIRST:
- focus = SP_ITEM(*--(selected.end()));
+ focus = SP_ITEM(*selected.begin());
break;
case BIGGEST:
focus = selection->largestItem(horiz);
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 670e4c8b5..64a5d9866 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -145,6 +145,13 @@ Export::Export (void) :
browse_image(Gtk::StockID(Gtk::Stock::INDEX), Gtk::ICON_SIZE_BUTTON),
batch_box(false, 5),
batch_export(_("B_atch export all selected objects"), _("Export each selected object into its own PNG file, using export hints if any (caution, overwrites without asking!)")),
+ interlacing(_("Use interlacing"),_("Enables ADAM7 interlacing for PNG output. This results in slightly heavier images, but big images will look better sooner when loading the file")),
+ bitdepth_label(_("Bit depth")),
+ bitdepth_cb(),
+ zlib_label(_("Compression")),
+ zlib_compression(),
+ pHYs_label(_("pHYs dpi")),
+ pHYs_sb(pHYs_adj, 1.0, 2),
hide_box(false, 5),
hide_export(_("Hide a_ll except selected"), _("In the exported image, hide all objects except those that are selected")),
closeWhenDone(_("Close when complete"), _("Once the export completes, close this dialog")),
@@ -321,6 +328,34 @@ Export::Export (void) :
button_box.pack_start(closeWhenDone, true, true, 0 );
button_box.pack_end(export_button, false, false, 0);
+ /*Advanced*/
+ Gtk::Label *label_advanced = Gtk::manage(new Gtk::Label(_("Advanced"),1));
+ expander.set_label_widget(*label_advanced);
+ const char* const modes_list[]={"Gray_1", "Gray_2","Gray_4","Gray_8","Gray_16","RGB_8","RGB_16","GrayAlpha_8","GrayAlpha_16","RGBA_8","RGBA_16"};
+ for(int i=0; i<11; ++i)
+ bitdepth_cb.append(modes_list[i]);
+ bitdepth_cb.set_active_text("RGBA_8");
+ bitdepth_cb.set_hexpand();
+ const char* const zlist[]={"Z_NO_COMPRESSION","Z_BEST_SPEED","2","3","4","5","Z_DEFAULT_COMPRESSION","7","8","Z_BEST_COMPRESSION"};
+ for(int i=0; i<10; ++i)
+ zlib_compression.append(zlist[i]);
+ zlib_compression.set_active_text("Z_DEFAULT_COMPRESSION");
+ pHYs_adj = Gtk::Adjustment::create(0, 0, 100000, 0.1, 1.0, 0);
+ pHYs_sb.set_adjustment(pHYs_adj);
+ pHYs_sb.set_width_chars(7);
+ pHYs_sb.set_tooltip_text( _("Will force-set the physical dpi for the png file. Set this to 72 if you're planning to work on your png with Photoshop") );
+ zlib_compression.set_hexpand();
+ auto table = new Gtk::Grid();
+ gtk_container_add(GTK_CONTAINER(expander.gobj()), (GtkWidget*)(table->gobj()));
+ table->attach(interlacing,0,0,1,1);
+ table->attach(bitdepth_label,0,1,1,1);
+ table->attach(bitdepth_cb,1,1,1,1);
+ table->attach(zlib_label,0,2,1,1);
+ table->attach(zlib_compression,1,2,1,1);
+ table->attach(pHYs_label,0,3,1,1);
+ table->attach(pHYs_sb,1,3,1,1);
+ table->show();
+
/* Main dialog */
Gtk::Box *contents = _getContents();
contents->set_spacing(0);
@@ -329,6 +364,7 @@ Export::Export (void) :
contents->pack_start(hide_box);
contents->pack_end(button_box, false, 0);
contents->pack_end(_prog, Gtk::PACK_EXPAND_WIDGET);
+ contents->pack_end(expander, FALSE, FALSE,0);
/* Signal handlers */
filename_entry.signal_changed().connect( sigc::mem_fun(*this, &Export::onFilenameModified) );
@@ -943,6 +979,18 @@ void Export::onExport ()
bool exportSuccessful = false;
bool hide = hide_export.get_active ();
+
+ // Advanced parameters
+ bool do_interlace = (interlacing.get_active());
+ float pHYs = 0;
+ int zlib = zlib_compression.get_active_row_number() ;
+ const char* const modes_list[]={"Gray_1", "Gray_2","Gray_4","Gray_8","Gray_16","RGB_8","RGB_16","GrayAlpha_8","GrayAlpha_16","RGBA_8","RGBA_16"};
+ int colortypes[] = {0,0,0,0,0,2,2,4,4,6,6}; //keep in sync with modes_list in Export constructor. values are from libpng doc.
+ int bitdepths[] = {1,2,4,8,16,8,16,8,16,8,16};
+ int color_type = colortypes[bitdepth_cb.get_active_row_number()] ;
+ int bit_depth = bitdepths[bitdepth_cb.get_active_row_number()] ;
+
+
if (batch_export.get_active ()) {
// Batch export of selected objects
@@ -987,6 +1035,7 @@ void Export::onExport ()
if (dpi == 0.0) {
dpi = getValue(xdpi_adj);
}
+ pHYs = (pHYs_adj->get_value() > 0.01) ? pHYs_adj->get_value() : dpi;
Geom::OptRect area = item->desktopVisualBounds();
if (area) {
@@ -1003,11 +1052,12 @@ void Export::onExport ()
std::vector<SPItem*> x;
std::vector<SPItem*> selected(desktop->getSelection()->items().begin(), desktop->getSelection()->items().end());
if (!sp_export_png_file (doc, path.c_str(),
- *area, width, height, dpi, dpi,
+ *area, width, height, pHYs, pHYs,
nv->pagecolor,
onProgressCallback, (void*)prog_dlg,
TRUE, // overwrite without asking
- hide ? selected : x
+ hide ? selected : x,
+ do_interlace, color_type, bit_depth, zlib
)) {
gchar * error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile);
@@ -1049,6 +1099,7 @@ void Export::onExport ()
float const y1 = getValuePx(y1_adj);
float const xdpi = getValue(xdpi_adj);
float const ydpi = getValue(ydpi_adj);
+ pHYs = (pHYs_adj->get_value() > 0.01) ? pHYs_adj->get_value() : xdpi;
unsigned long int const width = int(getValue(bmwidth_adj) + 0.5);
unsigned long int const height = int(getValue(bmheight_adj) + 0.5);
@@ -1094,12 +1145,13 @@ void Export::onExport ()
std::vector<SPItem*> x;
std::vector<SPItem*> selected(desktop->getSelection()->items().begin(), desktop->getSelection()->items().end());
ExportResult status = sp_export_png_file(desktop->getDocument(), path.c_str(),
- Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi,
+ Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, pHYs, pHYs, //previously xdpi, ydpi.
nv->pagecolor,
onProgressCallback, (void*)prog_dlg,
FALSE,
- hide ? selected : x
- );
+ hide ? selected : x,
+ do_interlace, color_type, bit_depth, zlib
+ );
if (status == EXPORT_ERROR) {
gchar * safeFile = Inkscape::IO::sanitizeString(path.c_str());
gchar * error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile);
diff --git a/src/ui/dialog/export.h b/src/ui/dialog/export.h
index a1c44714b..112f42312 100644
--- a/src/ui/dialog/export.h
+++ b/src/ui/dialog/export.h
@@ -13,6 +13,9 @@
#define SP_EXPORT_H
#include <gtkmm/progressbar.h>
+#include <gtkmm/expander.h>
+#include <gtkmm/grid.h>
+#include <gtkmm/comboboxtext.h>
#include "ui/dialog/desktop-tracker.h"
#include "ui/widget/panel.h"
@@ -314,6 +317,17 @@ private:
Inkscape::UI::Widget::CheckButton closeWhenDone;
+ /* Advanced */
+ Gtk::Expander expander;
+ Inkscape::UI::Widget::CheckButton interlacing;
+ Gtk::Label bitdepth_label;
+ Gtk::ComboBoxText bitdepth_cb;
+ Gtk::Label zlib_label;
+ Gtk::ComboBoxText zlib_compression;
+ Gtk::Label pHYs_label;
+ Glib::RefPtr<Gtk::Adjustment> pHYs_adj;
+ Gtk::SpinButton pHYs_sb;
+
/* Export Button widgets */
Gtk::HBox button_box;
Gtk::Button export_button;
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp
index eae33ff83..d05c52531 100644
--- a/src/ui/dialog/xml-tree.cpp
+++ b/src/ui/dialog/xml-tree.cpp
@@ -790,7 +790,8 @@ void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * n
void XmlTree::on_attr_unselect_row_clear_text()
{
attr_name.set_text("");
- attr_value.get_buffer()->set_text("", 0);
+ // Set text with empty Glib::ustring
+ attr_value.get_buffer()->set_text( Glib::ustring() );
}
void XmlTree::onNameChanged()
diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp
index a084a8fd9..16df225e0 100644
--- a/src/ui/tools/gradient-tool.cpp
+++ b/src/ui/tools/gradient-tool.cpp
@@ -871,6 +871,7 @@ bool GradientTool::root_handler(GdkEvent* event) {
return ret;
}
+// Creates a new linear or radial gradient.
static void sp_gradient_drag(GradientTool &rc, Geom::Point const pt, guint /*state*/, guint32 etime)
{
SPDesktop *desktop = SP_EVENT_CONTEXT(&rc)->desktop;
diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp
index f2cf8c4a2..aac8239f3 100644
--- a/src/ui/tools/mesh-tool.cpp
+++ b/src/ui/tools/mesh-tool.cpp
@@ -47,7 +47,7 @@
// Mesh specific
#include "ui/tools/mesh-tool.h"
-#include "sp-mesh.h"
+#include "sp-mesh-gradient.h"
#include "display/sp-ctrlcurve.h"
using Inkscape::DocumentUndo;
@@ -161,9 +161,9 @@ void MeshTool::selection_changed(Inkscape::Selection* /*sel*/) {
// if (style && (style->fill.isPaintserver())) {
// SPPaintServer *server = item->style->getFillPaintServer();
- // if ( SP_IS_MESH(server) ) {
+ // if ( SP_IS_MESHGRADIENT(server) ) {
- // SPMesh *mg = SP_MESH(server);
+ // SPMeshGradient *mg = SP_MESHGRADIENT(server);
// guint rows = 0;//mg->array.patches.size();
// for ( guint i = 0; i < rows; ++i ) {
@@ -265,14 +265,18 @@ sp_mesh_context_select_prev (ToolBase *event_context)
Returns true if mouse cursor over mesh edge.
*/
static bool
-sp_mesh_context_is_over_line (MeshTool *rc, SPItem *item, Geom::Point event_p)
+sp_mesh_context_is_over_line (MeshTool *rc, SPCtrlLine *line, Geom::Point event_p)
{
+ if (!SP_IS_CTRLCURVE(line) ) {
+ return false;
+ }
+
SPDesktop *desktop = SP_EVENT_CONTEXT (rc)->desktop;
//Translate mouse point into proper coord system
rc->mousepoint_doc = desktop->w2d(event_p);
- SPCtrlCurve *curve = SP_CTRLCURVE(item);
+ SPCtrlCurve *curve = SP_CTRLCURVE(line);
Geom::BezierCurveN<3> b( curve->p0, curve->p1, curve->p2, curve->p3 );
Geom::Coord coord = b.nearestTime( rc->mousepoint_doc ); // Coord == double
Geom::Point nearest = b( coord );
@@ -326,8 +330,8 @@ sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation )
SPDocument *doc = NULL;
GrDrag *drag = rc->_grdrag;
- std::map<SPMesh*, std::vector<guint> > points;
- std::map<SPMesh*, SPItem*> items;
+ std::map<SPMeshGradient*, std::vector<guint> > points;
+ std::map<SPMeshGradient*, SPItem*> items;
// Get list of selected draggers for each mesh.
// For all selected draggers
@@ -341,7 +345,7 @@ sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation )
if( d->point_type != POINT_MG_CORNER ) continue;
// Find the gradient
- SPMesh *gradient = SP_MESH( getGradient (d->item, d->fill_or_stroke) );
+ SPMeshGradient *gradient = SP_MESHGRADIENT( getGradient (d->item, d->fill_or_stroke) );
// Collect points together for same gradient
points[gradient].push_back( d->point_i );
@@ -350,8 +354,8 @@ sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation )
}
// Loop over meshes.
- for( std::map<SPMesh*, std::vector<guint> >::const_iterator iter = points.begin(); iter != points.end(); ++iter) {
- SPMesh *mg = SP_MESH( iter->first );
+ for( std::map<SPMeshGradient*, std::vector<guint> >::const_iterator iter = points.begin(); iter != points.end(); ++iter) {
+ SPMeshGradient *mg = SP_MESHGRADIENT( iter->first );
if( iter->second.size() > 0 ) {
guint noperation = 0;
switch (operation) {
@@ -425,6 +429,7 @@ sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation )
/**
Handles all keyboard and mouse input for meshs.
+Note: node/handle events are take care of elsewhere.
*/
bool MeshTool::root_handler(GdkEvent* event) {
static bool dragging;
@@ -454,12 +459,10 @@ bool MeshTool::root_handler(GdkEvent* event) {
if ( event->button.button == 1 ) {
// Are we over a mesh line?
bool over_line = false;
- SPCtrlCurve *line = NULL;
if (! drag->lines.empty()) {
for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); ++l) {
- line = (SPCtrlCurve*) (*l);
- over_line |= sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y));
+ over_line |= sp_mesh_context_is_over_line (this, *l, Geom::Point(event->motion.x, event->motion.y));
}
}
@@ -594,7 +597,7 @@ bool MeshTool::root_handler(GdkEvent* event) {
if (!drag->lines.empty()) {
for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() ; ++l) {
- over_line |= sp_mesh_context_is_over_line (this, (SPItem*)(*l), Geom::Point(event->motion.x, event->motion.y));
+ over_line |= sp_mesh_context_is_over_line (this, *l, Geom::Point(event->motion.x, event->motion.y));
}
}
@@ -625,8 +628,7 @@ bool MeshTool::root_handler(GdkEvent* event) {
if (!drag->lines.empty()) {
for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); ++l) {
- line = (SPCtrlLine*)(*l);
- over_line = sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y));
+ over_line = sp_mesh_context_is_over_line (this, *l, Geom::Point(event->motion.x, event->motion.y));
if (over_line) {
break;
@@ -925,6 +927,7 @@ bool MeshTool::root_handler(GdkEvent* event) {
return ret;
}
+// Creates a new mesh gradient.
static void sp_mesh_end_drag(MeshTool &rc) {
SPDesktop *desktop = SP_EVENT_CONTEXT(&rc)->desktop;
Inkscape::Selection *selection = desktop->getSelection();
diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp
index fd83a62c9..301a3b2e0 100644
--- a/src/ui/widget/selected-style.cpp
+++ b/src/ui/widget/selected-style.cpp
@@ -25,7 +25,7 @@
#include "sp-namedview.h"
#include "sp-linear-gradient.h"
#include "sp-radial-gradient.h"
-#include "sp-mesh.h"
+#include "sp-mesh-gradient.h"
#include "sp-pattern.h"
#include "ui/dialog/dialog-manager.h"
#include "ui/dialog/fill-and-stroke.h"
@@ -1010,7 +1010,7 @@ SelectedStyle::update()
place->set_tooltip_text(__rgradient[i]);
_mode[i] = SS_RGRADIENT;
#ifdef WITH_MESH
- } else if (SP_IS_MESH(server)) {
+ } else if (SP_IS_MESHGRADIENT(server)) {
SPGradient *vector = SP_GRADIENT(server)->getVector();
sp_gradient_image_set_gradient(SP_GRADIENT_IMAGE(_gradient_preview_m[i]), vector);
place->add(_gradient_box_m[i]);