Ticket #815: osd.diff

File osd.diff, 11.4 KB (added by tegzed, 12 years ago)

added command interface osd to display command system accessible attributes

  • attr_def.h

     
    169169ATTR(tec_dirtype)
    170170ATTR(tec_direction)
    171171ATTR(imperial)
     172ATTR(update_period)
    172173ATTR2(0x00027500,type_rel_abs_begin)
    173174/* These attributes are int that can either hold relative               *
    174175 * or absolute values. A relative value is indicated by                 *
  • osd.h

     
    2121#define NAVIT_OSD_H
    2222
    2323struct osd_priv;
     24struct attr;
    2425
    2526struct osd_methods {
    2627        void (*osd_destroy)(struct osd_priv *osd);
     28        void (*set_attr)(struct osd_priv *osd, struct attr* attr);
    2729};
    2830
    2931#define osd_draw_cast(x) (void (*)(struct osd_priv *osd, struct navit *navit, struct vehicle *v))(x)
     
    6668void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv);
    6769void osd_std_resize(struct osd_item *item);
    6870void osd_std_draw(struct osd_item *item);
     71struct osd* osd_get_osd_by_name(char *name);
    6972/* end of prototypes */
    7073
    7174#endif
  • osd.c

     
    3535        struct osd_priv *priv;
    3636};
    3737
     38static GHashTable *osd_hash = NULL;
     39
    3840struct osd *
    3941osd_new(struct attr *parent, struct attr **attrs)
    4042{
     43        struct attr *attr;
    4144        struct osd *o;
    4245        struct osd_priv *(*new)(struct navit *nav, struct osd_methods *meth, struct attr **attrs);
    4346        struct attr *type=attr_search(attrs, NULL, attr_type);
     
    4952                return NULL;
    5053        o=g_new0(struct osd, 1);
    5154        o->priv=new(parent->u.navit, &o->meth, attrs);
     55
     56        attr=attr_search(attrs, NULL, attr_name);
     57        if (attr && attr->u.str) {
     58                if(NULL == osd_hash) {
     59                        osd_hash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL);
     60                }
     61                g_hash_table_insert(osd_hash, g_strdup(attr->u.str), o);
     62        }
     63
     64
    5265        return o;
    5366}
    5467
     68struct osd*
     69osd_get_osd_by_name(char *name)
     70{
     71        return g_hash_table_lookup(osd_hash, name);
     72}
     73
     74int
     75osd_set_attr(struct osd *osd, struct attr* attr)
     76{
     77        if(osd && osd->meth.set_attr) {
     78                osd->meth.set_attr(osd->priv, attr);
     79        }
     80        return 0;
     81}
     82
    5583void
    5684osd_wrap_point(struct point *p, struct navit *nav)
    5785{
     
    250278        attr=attr_search(attrs, NULL, attr_font);
    251279        if (attr)
    252280                item->font_name = g_strdup(attr->u.str);
     281
    253282}
    254 
    255283void
    256284osd_std_config(struct osd_item *item, struct navit *navit)
    257285{
  • osd/core/osd_core.c

     
    7979static void osd_odometer_draw(struct odometer *this, struct navit *nav, struct vehicle *v);
    8080static struct osd_text_item * oti_new(struct osd_text_item * parent);
    8181
     82static int b_commandtable_added = 0;
    8283
     84
    8385struct compass {
    8486        struct osd_item osd_item;
    8587        int width;
     
    214216        return g_strdup_printf("%.0f", num);
    215217}
    216218
     219/**
     220 * sets an attribute (name value pair) of a map item specified by map name and item id
     221 *
     222 * @param navit The navit instance
     223 * @param function unused (needed to match command function signiture)
     224 * @param in input attribute in[0] - name of the osd  ; in[1] - attr name ; in[2] - attr value
     225 * @param out output attribute, 0 on error, 1 on success
     226 * @param valid unused
     227 * @returns nothing
     228 */
     229static void
     230osd_cmd_osd_set_attr(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
     231{
     232        struct attr **list;
     233        struct attr*val = g_new0(struct attr,1);
     234        val->type   = attr_type_int_begin;
     235        val->u.num  = 0;
     236        list = g_new0(struct attr *,2);
     237        list[0]     = val;
    217238
     239        if (
     240                in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str  &&//osd name
     241                in[1] && ATTR_IS_STRING(in[1]->type) && in[1]->u.str  &&//attr_type str
     242                in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str    //attr_value str
     243        ) {
     244                struct attr attr_to_set;
     245               
     246                if(ATTR_IS_STRING(attr_from_name(in[1]->u.str))) {
     247                        attr_to_set.u.str = in[2]->u.str;
     248                        attr_to_set.type = attr_from_name(in[1]->u.str);
     249                }
     250                else if(ATTR_IS_INT(attr_from_name(in[1]->u.str))) {
     251                        attr_to_set.u.num = atoi(in[2]->u.str);
     252                        attr_to_set.type = attr_from_name(in[1]->u.str);
     253                }
     254                else if(ATTR_IS_DOUBLE(attr_from_name(in[1]->u.str))) {
     255                        double* val = g_new0(double,1);
     256                        *val = atof(in[2]->u.str);
     257                        attr_to_set.u.numd = val;
     258                        attr_to_set.type = attr_from_name(in[1]->u.str);
     259                }
     260                struct osd* osd;
     261                osd = osd_get_osd_by_name(in[0]->u.str);
     262                if(osd) {
     263                        osd_set_attr(osd, &attr_to_set);
     264                        val->u.num  = 1;
     265                }
     266        }
     267        list[1] = NULL;
     268        *out = list;
     269}
     270
     271
    218272static int odometers_saved = 0;
    219273static GList* odometer_list = NULL;
    220274
    221275static struct command_table commands[] = {
    222276        {"odometer_reset",command_cast(osd_cmd_odometer_reset)},
     277        {"osd_set_attr"  ,command_cast(osd_cmd_osd_set_attr)},
    223278};
    224279
    225280struct odometer {
     
    670725                fclose(f);
    671726        }
    672727
    673         navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table));
     728        if(b_commandtable_added == 0) {
     729                navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table));
     730                b_commandtable_added = 1;
     731        }
    674732        navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_init), attr_graphics_ready, this));
    675733        navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_destroy), attr_destroy, nav));
    676734        odometer_list = g_list_append(odometer_list, this);
     
    678736        return (struct osd_priv *) this;
    679737}
    680738
     739struct cmd_interface {
     740        struct osd_item osd_item;
     741        int width;
     742        struct graphics_gc *orange,*white;
     743        int update_period;   //in sec
     744        char* text;
     745        struct graphics_image *img;
     746        char*img_filename;
     747        char* command;
     748        int bReserved;
     749};
    681750
     751static void
     752osd_cmd_interface_draw(struct cmd_interface *this, struct navit *nav,
     753                struct vehicle *v)
     754{
     755        struct point p;
     756        struct point bbox[4];
     757        struct graphics_gc *curr_color;
     758        struct attr navit;
     759        p.x = 0;
     760        p.y = 0;
     761        navit.type=attr_navit;
     762        navit.u.navit = this->osd_item.navit;
    682763
     764        if(0==this->bReserved) {
     765                this->bReserved = 1;
     766                command_evaluate(&navit, this->command);
     767                this->bReserved = 0;
     768        }
    683769
     770        osd_std_draw(&this->osd_item);
     771
     772        //display image
     773        if(this->img) {
     774                graphics_draw_image(this->osd_item.gr, this->osd_item.graphic_bg, &p, this->img);
     775        }
     776
     777        //display text
     778        graphics_get_text_bbox(this->osd_item.gr, this->osd_item.font, this->text, 0x10000, 0, bbox, 0);
     779        p.x=(this->osd_item.w-bbox[2].x)/2;
     780        p.y = this->osd_item.h-this->osd_item.h/10;
     781        curr_color = this->white;
     782if(this->text)
     783        graphics_draw_text(this->osd_item.gr, curr_color, NULL, this->osd_item.font, this->text, &p, 0x10000, 0);
     784        graphics_draw_mode(this->osd_item.gr, draw_mode_end);
     785}
     786
     787
     788
     789static void
     790osd_cmd_interface_init(struct cmd_interface *this, struct navit *nav)
     791{
     792        osd_set_std_graphic(nav, &this->osd_item, (struct osd_priv *)this);
     793
     794        this->white = graphics_gc_new(this->osd_item.gr);
     795        graphics_gc_set_foreground(this->white, &this->osd_item.text_color);
     796        graphics_gc_set_linewidth(this->white, this->width);
     797
     798
     799        graphics_gc_set_linewidth(this->osd_item.graphic_fg_white, this->width);
     800
     801        if(this->update_period>0) {
     802                event_add_timeout(this->update_period*1000, 1, callback_new_1(callback_cast(osd_cmd_interface_draw), this));
     803        }
     804
     805        navit_add_callback(nav, callback_new_attr_1(callback_cast (osd_std_click), attr_button, &this->osd_item));
     806
     807        this->text = g_strdup("");
     808}
     809
     810static int
     811osd_cmd_interface_set_attr(struct cmd_interface *this_, struct attr* attr)
     812{
     813        struct navit* nav = this_->osd_item.navit;
     814        if(NULL==attr || NULL==this_) {
     815                return 0;
     816        }       
     817        if(attr->type == attr_status_text) {
     818                if(this_->text) {
     819                        g_free(this_->text);
     820                }
     821                if(attr->u.str) {
     822                        this_->text = g_strdup(attr->u.str);
     823                }
     824                return 1;
     825        }
     826        if(attr->type == attr_src) {
     827                if(attr->u.str) {
     828                        if((!this_->img_filename) || strcmp(this_->img_filename, graphics_icon_path(attr->u.str))) {
     829                                struct graphics *gra = navit_get_graphics(nav);
     830                                //destroy old img, create new  image
     831                                if(this_->img) {
     832                                        graphics_image_free(this_->osd_item.gr, this_->img);
     833                                }
     834                                if(this_->img_filename) {
     835                                        g_free(this_->img_filename);
     836                                }
     837                                this_->img_filename = graphics_icon_path(attr->u.str);
     838                                this_->img = graphics_image_new(this_->osd_item.gr, this_->img_filename);       
     839                        }
     840                }
     841                return 1;
     842        }
     843        return 0;
     844}
     845
     846
     847static struct osd_priv *
     848osd_cmd_interface_new(struct navit *nav, struct osd_methods *meth,
     849                struct attr **attrs)
     850{
     851        struct cmd_interface *this = g_new0(struct cmd_interface, 1);
     852        struct attr *attr;
     853
     854        this->osd_item.p.x = 120;
     855        this->osd_item.p.y = 20;
     856        this->osd_item.w = 60;
     857        this->osd_item.h = 80;
     858        this->osd_item.navit = nav;
     859        this->osd_item.font_size = 200;
     860        this->osd_item.meth.draw = osd_draw_cast(osd_cmd_interface_draw);
     861
     862        meth->set_attr = osd_cmd_interface_set_attr;
     863
     864        osd_set_std_attr(attrs, &this->osd_item, 2);
     865
     866        attr = attr_search(attrs, NULL, attr_width);
     867        this->width=attr ? attr->u.num : 2;
     868
     869        attr = attr_search(attrs, NULL, attr_update_period);
     870        this->update_period=attr ? attr->u.num : 5; //default update period is 5 seconds
     871
     872        attr = attr_search(attrs, NULL, attr_command);
     873        this->command = attr ? g_strdup(attr->u.str) : g_strdup("");
     874
     875        if(b_commandtable_added == 0) {
     876                navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table));
     877                b_commandtable_added = 1;
     878        }
     879        navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_cmd_interface_init), attr_graphics_ready, this));
     880        return (struct osd_priv *) this;
     881}
     882
    684883struct stopwatch {
    685884        struct osd_item osd_item;
    686885        int width;
     
    9731172        navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &this->item));
    9741173        osd_button_draw(this,nav);
    9751174}
     1175 
     1176int
     1177osd_button_set_attr(struct osd_button *this_, struct attr* attr)
     1178{
     1179        if(NULL==attr || NULL==this_) {
     1180                return 0;
     1181        }       
     1182        if(attr->type == attr_src) {
     1183                if(this_->src) {
     1184                        g_free(this_->src);
     1185                }
     1186                if(attr->u.str) {
     1187                        this_->src = graphics_icon_path(attr->u.str);
     1188                }
     1189                struct navit* nav = this_->item.navit;
     1190                struct graphics *gra = navit_get_graphics(nav);
     1191                this_->img = graphics_image_new(gra, this_->src);
     1192                if (!this_->img) {
     1193                        dbg(1, "failed to load '%s'\n", this_->src);
     1194                        return 0;
     1195                }
     1196                if (!this_->item.w)
     1197                        this_->item.w=this_->img->width;
     1198                if (!this_->item.h)
     1199                        this_->item.h=this_->img->height;
    9761200
     1201                if (this_->use_overlay) {
     1202                        struct graphics_image *img;
     1203                        struct point p;
     1204                        img=graphics_image_new(this_->item.gr, this_->src);
     1205                        p.x=(this_->item.w-this_->img->width)/2;
     1206                        p.y=(this_->item.h-this_->img->height)/2;
     1207                        osd_std_draw(&this_->item);
     1208                        graphics_draw_image(this_->item.gr, this_->item.graphic_bg, &p, img);
     1209                        graphics_image_free(this_->item.gr, img);
     1210                }
     1211                osd_button_draw(this_,nav);
     1212                navit_draw(this_->item.navit);
     1213                return 1;
     1214        }
     1215        return 0;
     1216}
     1217
     1218
    9771219static struct osd_priv *
    9781220osd_button_new(struct navit *nav, struct osd_methods *meth,
    9791221               struct attr **attrs)
     
    9841226        this->item.navit = nav;
    9851227        this->item.meth.draw = osd_draw_cast(osd_button_draw);
    9861228
     1229        meth->set_attr = osd_button_set_attr;
     1230
    9871231        osd_set_std_attr(attrs, &this->item, 1|16);
    9881232
    9891233        attr=attr_search(attrs, NULL, attr_use_overlay);
     
    29513195        plugin_register_osd_type("stopwatch", osd_stopwatch_new);
    29523196        plugin_register_osd_type("odometer", osd_odometer_new);
    29533197        plugin_register_osd_type("auxmap", osd_auxmap_new);
     3198        plugin_register_osd_type("cmd_interface", osd_cmd_interface_new);
    29543199}