void UnitTracker::_fixupAdjustments( SPUnit const* oldUnit, SPUnit const *newUnit )
{
    _isUpdating = true;
    for ( GSList* cur = _adjList; cur; cur = g_slist_next(cur) ) {
        GtkAdjustment* adj = GTK_ADJUSTMENT(cur->data);
        gdouble oldVal = gtk_adjustment_get_value(adj);
        gdouble val = oldVal;

        if ((oldUnit->base == SP_UNIT_ABSOLUTE || oldUnit->base == SP_UNIT_DEVICE)
            && (newUnit->base == SP_UNIT_DIMENSIONLESS))
        {
            val = 1.0 / newUnit->unittobase;
            _priorValues[adj] = sp_units_get_pixels( oldVal, *oldUnit );
        } else if ((oldUnit->base == SP_UNIT_DIMENSIONLESS)
                   && (newUnit->base == SP_UNIT_ABSOLUTE || newUnit->base == SP_UNIT_DEVICE)) {
            if ( _priorValues.find(adj) != _priorValues.end() ) {
                val = sp_pixels_get_units( _priorValues[adj], *newUnit );
            }
        } else {
            val = sp_convert_distance_full( oldVal, *oldUnit, *newUnit );
        }

        gtk_adjustment_set_value( adj, val );
    }
    _isUpdating = false;
}
示例#2
0
void GuidelinePropertiesDialog::_modeChanged()
{
    _mode = !_relative_toggle.get_active();
    if (!_mode) {
        // relative
        _spin_angle.set_value(0);

        _spin_button_y.set_value(0);
        _spin_button_x.set_value(0);
    } else {
        // absolute
        _spin_angle.set_value(_oldangle);

        SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(_unit_selector->gobj()));
        gdouble const val_y = sp_pixels_get_units(_oldpos[Geom::Y], unit);
        _spin_button_y.set_value(val_y);
        gdouble const val_x = sp_pixels_get_units(_oldpos[Geom::X], unit);
        _spin_button_x.set_value(val_x);
    }
}