diff -u b/core/modules/breakpoint/breakpoint.module b/core/modules/breakpoint/breakpoint.module --- b/core/modules/breakpoint/breakpoint.module +++ b/core/modules/breakpoint/breakpoint.module @@ -35,7 +35,7 @@ if ($themes[$theme_key]->status) { $theme_breakpoints = breakpoint_get_theme_breakpoint_list($theme_key); if (!empty($theme_breakpoints)) { - if ($breakpoint_group = BreakpointGroup::loadFromTheme($theme_key, $themes[$theme_key]->info['name'], $theme_breakpoints)) { + if ($breakpoint_group = _breakpoint_import_breakpoints($themes[$theme_key]->info['name'], $theme_key, Breakpoint::SOURCE_TYPE_THEME, $theme_breakpoints)) { $breakpoint_group->save(); $uri = $breakpoint_group->uri(); if ($uri) { @@ -85,7 +85,7 @@ foreach ($modules as $module) { $module_breakpoints = breakpoint_get_module_breakpoint_list($module); if (!empty($module_breakpoints)) { - if ($breakpoint_group = BreakpointGroup::loadFromModule($module, $module, $module_breakpoints)) { + if ($breakpoint_group = _breakpoint_import_breakpoints($module, $module, Breakpoint::SOURCE_TYPE_MODULE, $module_breakpoints)) { $breakpoint_group->save(); $uri = $breakpoint_group->uri(); if ($uri) { @@ -123,6 +123,68 @@ } /** + * Import breakpoints from theme or module. + * + * @param string $label + * Name of the breakpoint group. + * @param string $id + * Id of the breakpoint group. + * @param string $sourceType + * Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE. + * @param array $media_queries + * Array of media queries keyed by id. + * + * @return Drupal\breakpoint\BreakpointGroup|false + * Returns the new breakpoint group if one is created. + */ +function _breakpoint_import_breakpoints($label, $id, $source_type, $media_queries) { + if (!empty($media_queries)) { + $weight = 0; + // Use the existing breakpoint group if it exists. + $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $id); + if (!$breakpoint_group) { + // Build a new breakpoint group. + $breakpoint_group = entity_create('breakpoint_group', array( + 'id' => $id, + 'label' => $label, + 'source' => $id, + 'sourceType' => $source_type, + )); + } + else { + // Reset label. + $breakpoint_group->label = $label; + } + foreach ($media_queries as $name => $media_query) { + // Use the existing breakpoint if it exists. + $breakpoint = entity_load('breakpoint', $source_type . '.' . $id . '.' . $name); + if (!$breakpoint) { + // Build a new breakpoint. + $breakpoint = entity_create('breakpoint', array( + 'name' => $name, + 'label' => drupal_ucfirst($name), + 'mediaQuery' => $media_query, + 'source' => $id, + 'sourceType' => $source_type, + 'weight' => $weight++, + )); + $breakpoint->save(); + } + else { + // Reset name, label, weight and media query. + $breakpoint->name = $name; + $breakpoint->label = drupal_ucfirst($name); + $breakpoint->mediaQuery = $media_query; + $breakpoint->weight = $weight++; + } + $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint; + } + return $breakpoint_group; + } + return FALSE; +} + +/** * Import breakpoint groups from theme or module. * * @param string $group_id @@ -132,14 +194,58 @@ * * @return boolean */ -function _breakpoint_import_breakpoint_groups($source, $source_type) { - $breakpoint_groups = config($source . '.breakpoint_groups'); +function _breakpoint_import_breakpoint_groups($group_id, $source_type) { + $breakpoint_groups = config($group_id . '.breakpoint_groups'); if ($breakpoint_groups) { foreach ($breakpoint_groups->get() as $id => $data) { // Breakpoints is mandatory. if (isset($data['breakpoints']) && !empty($data['breakpoints'])) { - if ($breakpoint_group = BreakpointGroup::ImportBreakpointGroup($source, $source_type, $id, isset($data['label']) ? $data['label'] : drupal_ucfirst($data[$id]), $data['breakpoints'])) { - $breakpoint_group->save(); + // Use the existing breakpoint group if it exists. + $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $id); + if (!$breakpoint_group) { + $breakpoint_group = entity_create('breakpoint_group', array( + 'id' => $id, + 'label' => isset($data['label']) ? $data['label'] : drupal_ucfirst($data[$id]), + 'source' => $group_id, + 'sourceType' => $source_type, + )); + } + else { + // Reset label. + $breakpoint_group->label = isset($data['label']) ? $data['label'] : drupal_ucfirst($data[$id]); + } + foreach ($data['breakpoints'] as $breakpoint_id => $multipliers) { + // Check if breakpoint exists, assume short name. + $breakpoint = entity_load('breakpoint', $source_type . '.' . $group_id . '.' . $breakpoint_id); + // If the breakpoint doesn't exist, try using the full name. + if (!$breakpoint) { + $breakpoint = entity_load('breakpoint', $breakpoint_id); + } + if ($breakpoint) { + // Check if the multipliers are set, if not set them now. + if (is_array($multipliers) && !empty($multipliers)) { + // Check settings first. + $settings = breakpoint_settings(); + $defined_multipliers = $settings->multipliers; + $new_multipliers = array_diff($multipliers, $defined_multipliers); + if (!empty($new_multipliers)) { + $defined_multipliers = array_merge($defined_multipliers, $new_multipliers); + breakpoint_settings_save_multipliers($defined_multipliers); + } + + // Check breakpoint multipliers. + $multipliers = drupal_map_assoc(array_values($multipliers)); + $new_multipliers = array_diff($multipliers, $breakpoint->multipliers); + if (!empty($new_multipliers)) { + $breakpoint->multipliers += $new_multipliers; + $breakpoint->save(); + } + } + + // Add breakpoint to group. + $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint; + $breakpoint_group->save(); + } } } } @@ -178,7 +284,7 @@ } } } - // Delete groups defined by a module/theme even if that module/theme didn't + // Deletet groups defined by a module/theme even if that module/theme didn't // define any breakpoints. foreach ($ids as $id) { // delete all breakpoint groups defined by the theme or module. @@ -248,7 +354,7 @@ if (isset($themes[$theme_key]) && $themes[$theme_key]->status) { $theme_breakpoints = breakpoint_get_theme_breakpoint_list($theme_key); if (!empty($theme_breakpoints)) { - return BreakpointGroup::loadFromTheme($theme_key, $themes[$theme_key]->info['name'], $theme_breakpoints); + return _breakpoint_import_breakpoints($themes[$theme_key]->info['name'], $theme_key, Breakpoint::SOURCE_TYPE_THEME, $theme_breakpoints); } } return FALSE; diff -u b/core/modules/breakpoint/lib/Drupal/breakpoint/Breakpoint.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Breakpoint.php --- b/core/modules/breakpoint/lib/Drupal/breakpoint/Breakpoint.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Breakpoint.php @@ -116,6 +116,10 @@ */ public function __construct(array $values = array(), $entity_type = 'breakpoint') { parent::__construct($values, $entity_type); + if (!isset($this->uuid)) { + $uuid = new Uuid(); + $this->uuid = $uuid->generate(); + } } /** diff -u b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroup.php b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroup.php --- b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroup.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroup.php @@ -78,6 +78,11 @@ */ public function __construct(array $values = array(), $entity_type = 'breakpoint_group') { parent::__construct($values, $entity_type); + // Assign a new UUID if there is none yet. + if (!isset($this->uuid)) { + $uuid = new Uuid(); + $this->uuid = $uuid->generate(); + } $this->loadAllBreakpoints(); } @@ -159,164 +164,6 @@ } /** - * Add a breakpoint using a name and a media query. - * - * @param string $name - * The name of the breakpoint. - * @param string $media_query - * Media query. - */ - public function addBreakpointFromMediaQuery($name, $media_query) { - // Use the existing breakpoint if it exists. - $breakpoint = entity_load('breakpoint', $this->sourceType . '.' . $this->id . '.' . $name); - if (!$breakpoint) { - // Build a new breakpoint. - $breakpoint = entity_create('breakpoint', array( - 'name' => $name, - 'label' => drupal_ucfirst($name), - 'mediaQuery' => $media_query, - 'source' => $this->id, - 'sourceType' => $this->sourceType, - 'weight' => count($this->breakpoints), - )); - $breakpoint->save(); - } - else { - // Reset name, label, weight and media query. - $breakpoint->name = $name; - $breakpoint->label = drupal_ucfirst($name); - $breakpoint->mediaQuery = $media_query; - $breakpoint->weight = count($this->breakpoints); - } - $this->breakpoints[$breakpoint->id()] = $breakpoint; - } - - /** - * Load breakpoints from a theme and build a default group. - * - * @param string $theme_key - * The name of the theme. - * @param string $name - * The human readable name of the theme. - * @param array $media_queries - * Array of media queries keyed by id. - * - * @return \Drupal\breakpoint\BreakpointGroup|false - * Return the new breakpoint group containing all breakpoints. - */ - public static function loadFromTheme($theme_key, $name, $media_queries) { - return BreakpointGroup::loadFromThemeOrModule($theme_key, $name, Breakpoint::SOURCE_TYPE_THEME, $media_queries); - } - - /** - * Load breakpoints from a module and build a default group. - * - * @param string $module - * The name of the theme. - * @param string $name - * The human readable name of the module. - * @param array $media_queries - * Array of media queries keyed by id. - * - * @return \Drupal\breakpoint\BreakpointGroup|false - * Return the new breakpoint group containing all breakpoints. - */ - public static function loadFromModule($module, $name, $media_queries) { - return BreakpointGroup::loadFromThemeOrModule($module, $name, Breakpoint::SOURCE_TYPE_MODULE, $media_queries); - } - - /** - * Load breakpoints from a theme/module and build a default group. - * - * @param string $id - * Name of the breakpoint group. - * @param string $label - * Human readable name of the breakpoint group. - * @param string $sourceType - * Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE. - * @param array $media_queries - * Array of media queries keyed by id. - * - * @return \Drupal\breakpoint\BreakpointGroup|false - * Return the new breakpoint group containing all breakpoints. - * - * @see Drupal\breakpoint\BreakpointGroup::loadFromTheme() - * @see Drupal\breakpoint\BreakpointGroup::loadFromModule() - */ - protected static function loadFromThemeOrModule($id, $label, $source_type, $media_queries) { - $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $id); - /* @var $breakpoint_group \Drupal\breakpoint\BreakpointGroup */ - if (!$breakpoint_group) { - // Build a new breakpoint group. - $breakpoint_group = entity_create('breakpoint_group', array( - 'id' => $id, - 'label' => $label, - 'source' => $id, - 'sourceType' => $source_type, - )); - } - else { - // Reset label. - $breakpoint_group->label = $label; - } - - foreach ($media_queries as $name => $media_query) { - $breakpoint_group->addBreakpointFromMediaQuery($name, $media_query); - } - return $breakpoint_group; - } - - /** - * Import breakpoint groups from theme or module. - * - * @param string $source - * Source of the breakpoint group, theme_key or module name. - * @param string $sourceType - * Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE. - * @param string $name - * Name of the breakpoint group. - * @param string $label - * Human readable name of the breakpoint group. - * @param array $breakpoints - * Array of breakpoints, using either the short name or the full name. - * - * @return \Drupal\breakpoint\BreakpointGroup|false - * Return the new breakpoint group containing all breakpoints. - */ - public static function ImportBreakpointGroup($source, $source_type, $name, $label, $breakpoints) { - // Use the existing breakpoint group if it exists. - $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $name); - /* @var $breakpoint_group \Drupal\breakpoint\BreakpointGroup */ - if (!$breakpoint_group) { - $breakpoint_group = entity_create('breakpoint_group', array( - 'id' => $name, - 'label' => !empty($label) ? $label : $name, - 'source' => $source, - 'sourceType' => $source_type, - )); - } - else { - // Reset label. - $breakpoint_group->label = !empty($label) ? $label : $name; - } - - // Add breakpoints to the group. - foreach ($breakpoints as $breakpoint_name) { - // Check if breakpoint exists, assume short name. - $breakpoint = entity_load('breakpoint', $source_type . '.' . $source . '.' . $breakpoint_name); - // If the breakpoint doesn't exist, try using the full name. - if (!$breakpoint) { - $breakpoint = entity_load('breakpoint', $breakpoint_name); - } - if ($breakpoint) { - // Add breakpoint to group. - $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint; - } - } - return $breakpoint_group; - } - - /** * Load all breakpoints, remove non-existing ones. */ protected function loadAllBreakpoints() { diff -u b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php --- b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php @@ -134,13 +134,24 @@ )); $breakpoint_group_obj->breakpoints = array( 'theme.breakpoint_test_theme.mobile' => array(), - 'theme.breakpoint_test_theme.narrow' => array(), + 'theme.breakpoint_test_theme.narrow' => array('3.x', '4.x'), 'theme.breakpoint_test_theme.wide' => array(), ); // Verify we can load this breakpoint defined by the theme. $this->verifyBreakpointGroup($breakpoint_group_obj); + // Check that the multipliers are added to the settings. + $settings = breakpoint_settings(); + $expected_settings = array( + 0 => '1x', + 1 => '1.5x', + 2 => '2x', + 3 => '3x', + 4 => '4x', + ); + $this->assertEqual($settings->multipliers, $expected_settings, 'Multipliers are added to settings.'); + // Disable the test theme and verify the breakpoint group still exists. theme_disable(array('breakpoint_test_theme')); $this->assertTrue(entity_load('breakpoint_group', 'module_test'), 'Breakpoint group still exists if theme is disabled.'); diff -u b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml --- b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml +++ b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml @@ -4,3 +4,3 @@ - - theme.breakpoint_test_theme.mobile - - theme.breakpoint_test_theme.narrow - - theme.breakpoint_test_theme.wide + theme.breakpoint_test_theme.mobile: [] + theme.breakpoint_test_theme.narrow: ['3x', '4x'] + theme.breakpoint_test_theme.wide: diff -u b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/breakpoint_test_theme.info b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/breakpoint_test_theme.info --- b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/breakpoint_test_theme.info +++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/breakpoint_test_theme.info @@ -5 +5 @@ -hidden = TRUE +hidden = FALSE diff -u b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml --- b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml +++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml @@ -4,3 +4,3 @@ - - mobile - - narrow - - wide + mobile: ['1.5x', '2x'] + narrow: + wide: