diff --git a/classes/ComicPressDBInterface.inc b/classes/ComicPressDBInterface.inc
new file mode 100644
index 0000000..0e42de9
--- /dev/null
+++ b/classes/ComicPressDBInterface.inc
@@ -0,0 +1,92 @@
+_all_categories = get_all_category_ids();
+ $this->_non_comic_categories = array_values(array_diff($this->_all_categories, $categories));
+ }
+
+ function _get_categories_to_exclude($category = null) {
+ return (is_null($category)) ? $this->_non_comic_categories : array_values(array_diff($this->_all_categories, array($category)));
+ }
+
+ /**
+ * Find the terminal post in a specific category.
+ */
+ function get_terminal_post_in_category($category_id, $first = true) {
+ $sort_order = $first ? "asc" : "desc";
+ $terminal_comic_query = new WP_Query();
+ $terminal_comic_query->query("showposts=1&order=${sort_order}&cat=${category_id}&status=publish");
+ if ($terminal_comic_query->have_posts()) {
+ return reset($terminal_comic_query->posts);
+ }
+ return false;
+ }
+
+ /**
+ * Get the first comic in a category.
+ */
+ function get_first_comic($category_id) {
+ return $this->get_terminal_post_in_category($category_id);
+ }
+
+ /**
+ * Get the last comic in a category.
+ */
+ function get_last_comic($category_id) {
+ return $this->get_terminal_post_in_category($category_id, false);
+ }
+
+ /**
+ * Get the comic post adjacent to the current comic.
+ * Wrapper around get_adjacent_post(). Don't unit test this method.
+ */
+ function get_adjacent_comic($category, $next = false, $override_post = null) {
+ global $wp_query, $post;
+ $temp_single = $wp_query->is_single;
+ $wp_query->is_single = true;
+
+ if (!is_null($override_post)) {
+ $temp_post = $post;
+ $post = $override_post;
+ }
+
+ $result = get_adjacent_post(false, implode(" and ", $this->_get_categories_to_exclude($category)), !$next);
+
+ $wp_query->is_single = $temp_single;
+
+ if (!is_null($override_post)) {
+ $post = $temp_post;
+ }
+
+ return empty($result) ? false : $result;
+ }
+
+ /**
+ * Get the previous comic from the current one.
+ */
+ function get_previous_comic($category = null, $override_post = null) { return $this->get_adjacent_comic($category, false, $override_post); }
+
+ /**
+ * Get the next comic from the current one.
+ */
+ function get_next_comic($category = null, $override_post = null) { return $this->get_adjacent_comic($category, true, $override_post); }
+}
+
+?>
\ No newline at end of file
diff --git a/classes/ComicPressNavigation.inc b/classes/ComicPressNavigation.inc
index fa37995..bc83178 100644
--- a/classes/ComicPressNavigation.inc
+++ b/classes/ComicPressNavigation.inc
@@ -37,6 +37,8 @@ class ComicPressNavigation {
}
}
}
+
+ return $nav;
}
}
diff --git a/classes/ComicPressStoryline.inc b/classes/ComicPressStoryline.inc
index 4acc4db..aa8896b 100644
--- a/classes/ComicPressStoryline.inc
+++ b/classes/ComicPressStoryline.inc
@@ -18,6 +18,10 @@ class ComicPressStoryline {
$adjacents_by_parent = array();
+ if (is_string($structure)) {
+ $structure = explode(',', $structure);
+ }
+
if (is_array($structure)) {
$is_valid = true;
foreach ($structure as $branch) {
@@ -61,7 +65,7 @@ class ComicPressStoryline {
}
}
}
-
+
$this->_structure = $new_structure;
}
}
@@ -114,6 +118,10 @@ class ComicPressStoryline {
}
return $result;
}
+
+ function get_comic_categories() {
+ return array_keys($this->_structure);
+ }
}
?>
\ No newline at end of file
diff --git a/test/widgets/GraphicalNavigationTest.php b/test/widgets/GraphicalNavigationTest.php
index a9ec67c..8c5ba14 100644
--- a/test/widgets/GraphicalNavigationTest.php
+++ b/test/widgets/GraphicalNavigationTest.php
@@ -5,18 +5,45 @@ require_once('PHPUnit/Framework.php');
require_once(dirname(__FILE__) . '/../../widgets/graphical-navigation.php');
class GraphicalNavigationTest extends PHPUnit_Framework_TestCase {
- function testUpdateWidget() {
- $w = new widget_comicpress_graphical_navigation();
+ function setUp() {
+ _reset_wp();
+ $this->w = new widget_comicpress_graphical_navigation();
+ }
- $this->assertEquals(array(
- "next" => "test",
- "next_title" => "test",
- "archive_path" => "test",
- ), $w->update(array(
+ function testUpdateWidget() {
+ $result = $this->w->update(array(
"next" => "test",
"next_title" => "test",
"archive_path" => "test",
- ), array()));
+ ), array());
+
+ foreach (array(
+ "next" => "on",
+ "next_title" => "test",
+ "archive_path" => "test",
+ ) as $field => $expected_value) {
+ $this->assertEquals($expected_value, $result[$field]);
+ }
+ }
+
+ function providerTestIsNavLinkVisible() {
+ return array(
+ array('first', 1, 2, true),
+ array('first', 1, 1, false),
+ array('last', 1, 2, true),
+ array('last', 1, 1, false),
+ array('prev', 1, 2, true),
+ );
+ }
+
+ /**
+ * @dataProvider providerTestIsNavLinkVisible
+ */
+ function testIsNavLinkVIsible($which, $current_id, $target_id, $expected_result) {
+ $current = (object)array('ID' => $current_id);
+ $target = (object)array('ID' => $target_id);
+
+ $this->assertEquals($expected_result, $this->w->_will_display_nav_link($which, $current, $target));
}
}
diff --git a/widgets/graphical-navigation.php b/widgets/graphical-navigation.php
index 503cf60..112893c 100644
--- a/widgets/graphical-navigation.php
+++ b/widgets/graphical-navigation.php
@@ -9,16 +9,61 @@ Author URI: http://webcomicplanet.com/
*/
+require_once(dirname(__FILE__) . '/../classes/ComicPressNavigation.inc');
+
class widget_comicpress_graphical_navigation extends WP_Widget {
function widget_comicpress_graphical_navigation() {
$widget_ops = array('classname' => 'widget_comicpress_graphical_navigation', 'description' => __('Displays Graphical Navigation Buttons. (used in comic sidebars)','comicpress') );
$this->WP_Widget('graphicalnavigation', __('Comic Navigation','comicpress'), $widget_ops);
}
+ function comicpress_display_navigation_link($which, $current, $target, $title, $content = '') {
+ switch ($which) {
+ case 'first':
+
+ }
+ }
+
+ /**
+ * Returns true if the combination of target and current post will show or hide this nav link.
+ * Different from whether or not a user explicitly hid this link.
+ * @param string $which The link to test.
+ * @param object $current The currently visible post.
+ * @param object $target The target post to comare to.
+ * @return boolean True if this link should be visible.
+ */
+ function _will_display_nav_link($which, $current, $target) {
+ switch ($which) {
+ case 'first':
+ case 'last':
+ return ($target->ID != $current->ID);
+ default:
+ return true;
+ }
+ }
+
+ function comicpress_display_navigation_order($order = array()) {
+ return array(
+ 'first', 'storyline-previous', 'previous', 'archives', 'random', 'comictitle', 'comments', 'buyprint', 'next', 'storynext', 'last'
+ );
+ }
+
function widget($args, $instance) {
- global $wp_query, $post;
+ global $post;
if (is_home() || is_single()) {
+ $storyline = new ComicPressStoryline();
+ $storyline->create_structure(get_option('comicpress-storyline-category-order'));
+
+ $dbi = ComicPressDBInterface::get_instance();
+ $dbi->set_comic_categories($storyline->get_comic_categories());
+
+ $navigation = new ComicPressNavigation();
+ $navigation->init($storyline);
+
+ $storyline_to_nav_mapping = array(
+
+ );
$this_permalink = get_permalink();
@@ -179,26 +224,31 @@ class widget_comicpress_graphical_navigation extends WP_Widget {
+