[python/turtle] color and pencolor can take various arguments

These two methods are equal.
This commit is contained in:
Léa Saviot
2018-12-11 12:23:24 +01:00
parent 23e3038c00
commit 62cda01d2b
7 changed files with 73 additions and 6 deletions

View File

@@ -120,8 +120,39 @@ mp_obj_t modturtle_isdown() {
return sTurtle.isPenDown() ? mp_const_true : mp_const_false;
}
mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b) {
sTurtle.setColor(KDColor::RGB888(mp_obj_get_int(r), mp_obj_get_int(g), mp_obj_get_int(b)));
mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args) {
if (n_args == 0) {
// pencolor()
KDColor c = sTurtle.color();
mp_obj_t mp_col[3];
mp_col[0] = mp_obj_new_int_from_uint(c.red());
mp_col[1] = mp_obj_new_int_from_uint(c.green());
mp_col[2] = mp_obj_new_int_from_uint(c.blue());
return mp_obj_new_tuple(3, mp_col);
}
if (n_args == 1) {
if (MP_OBJ_IS_STR(args[0])) {
// pencolor("blue")
size_t l;
sTurtle.setColor(mp_obj_str_get_data(args[0], &l));
} else {
// pencolor((r, g, b))
mp_obj_t * rgb;
mp_obj_get_array_fixed_n(args[0], 3, &rgb);
sTurtle.setColor(
KDColor::RGB888(
mp_obj_get_int(rgb[0]),
mp_obj_get_int(rgb[1]),
mp_obj_get_int(rgb[2])));
}
} else if (n_args == 3) {
// pencolor(r, g, b)
sTurtle.setColor(
KDColor::RGB888(
mp_obj_get_int(args[0]),
mp_obj_get_int(args[1]),
mp_obj_get_int(args[2])));
}
return mp_const_none;
}

View File

@@ -23,7 +23,7 @@ mp_obj_t modturtle_isdown();
mp_obj_t modturtle_pensize(size_t n_args, const mp_obj_t *args);
mp_obj_t modturtle_isvisible();
mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b);
mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args);
mp_obj_t modturtle_showturtle();
mp_obj_t modturtle_hideturtle();

View File

@@ -19,7 +19,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_penup_obj, modturtle_penup);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_isdown_obj, modturtle_isdown);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pensize_obj, 0, 1, modturtle_pensize);
STATIC MP_DEFINE_CONST_FUN_OBJ_3(modturtle_color_obj, modturtle_color);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pencolor_obj, 0, 3, modturtle_pencolor);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_showturtle_obj, modturtle_showturtle);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_hideturtle_obj, modturtle_hideturtle);
@@ -64,7 +64,8 @@ STATIC const mp_rom_map_elem_t modturtle_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_pensize), (mp_obj_t)&modturtle_pensize_obj },
{ MP_ROM_QSTR(MP_QSTR_width), (mp_obj_t)&modturtle_pensize_obj },
{ MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_color_obj },
{ MP_ROM_QSTR(MP_QSTR_color), (mp_obj_t)&modturtle_pencolor_obj },
{ MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_pencolor_obj },
{ MP_ROM_QSTR(MP_QSTR_showturtle), (mp_obj_t)&modturtle_showturtle_obj },
{ MP_ROM_QSTR(MP_QSTR_st), (mp_obj_t)&modturtle_showturtle_obj },

View File

@@ -1,4 +1,5 @@
#include "turtle.h"
#include <escher/palette.h>
extern "C" {
#include <py/misc.h>
}
@@ -144,6 +145,32 @@ void Turtle::setVisible(bool visible) {
}
}
void Turtle::setColor(const char * color) {
if (strcmp("blue", color) == 0) {
m_color = KDColorBlue;
} else if (strcmp("red", color) == 0) {
m_color = KDColorRed;
} else if (strcmp("green", color) == 0) {
m_color = Palette::Green;
} else if (strcmp("yellow", color) == 0) {
m_color = KDColorYellow;
} else if (strcmp("brown", color) == 0) {
m_color = Palette::Brown;
} else if (strcmp("black", color) == 0) {
m_color = KDColorBlack;
} else if (strcmp("white", color) == 0) {
m_color = KDColorWhite;
} else if (strcmp("pink", color) == 0) {
m_color = Palette::Pink;
} else if (strcmp("orange", color) == 0) {
m_color = Palette::Orange;
} else if (strcmp("purple", color) == 0) {
m_color = Palette::Purple;
} else if (strcmp("grey", color) == 0) {
m_color = Palette::GreyDark;
}
}
// Private functions
void Turtle::setHeadingPrivate(mp_float_t angle) {

View File

@@ -63,10 +63,14 @@ public:
bool isVisible() const { return m_visible; }
void setVisible(bool visible);
KDColor color() const { return m_color; }
void setColor(KDColor c) {
m_color = c;
}
void setColor(uint8_t r, uint8_t g, uint8_t b) {
m_color = KDColor::RGB888(r, g, b);
}
void setColor(const char * color);
private:
static constexpr mp_float_t k_headingOffset = M_PI_2;
static constexpr mp_float_t k_headingScale = M_PI / 180;