JAVASCRIPT =
JAVASCRIPT2 =
JAVASCRIPT_TV =
-CSS =
+CSS_INIT =
+CSS_DONE =
+CSS_BLUE =
+CSS_GREY =
+CSS_ACCESS =
CSS_TV =
#
# CSS
#
-CSS += $(EXTJSPATH)/resources/css/ext-all-notheme.css
-CSS += $(EXTJSPATH)/resources/css/xtheme-blue.css
-CSS += $(ROOTPATH)/livegrid/resources/css/ext-ux-livegrid.css
-CSS += $(EXTJSPATH)/examples/ux/gridfilters/css/GridFilters.css
-CSS += $(EXTJSPATH)/examples/ux/gridfilters/css/RangeMenu.css
-CSS += static/xcheckbox/xcheckbox.css
-CSS += static/app/ext.css
+CSS_INIT += $(EXTJSPATH)/resources/css/ext-all-notheme.css
+CSS_DONE += $(ROOTPATH)/livegrid/resources/css/ext-ux-livegrid.css
+CSS_DONE += $(EXTJSPATH)/examples/ux/gridfilters/css/GridFilters.css
+CSS_DONE += $(EXTJSPATH)/examples/ux/gridfilters/css/RangeMenu.css
+CSS_DONE += static/xcheckbox/xcheckbox.css
+CSS_DONE += static/app/ext.css
+
+CSS_BLUE += $(EXTJSPATH)/resources/css/xtheme-blue.css
+CSS_GREY += $(EXTJSPATH)/resources/css/xtheme-grey.css
+CSS_ACCESS += $(EXTJSPATH)/resources/css/xtheme-access.css
#
# extjs extensions
#
JAVASCRIPT_SRC = $(foreach f,$(JAVASCRIPT),$(WEBDIR)/$(f))
-CSS_SRC = $(foreach f,$(CSS),$(WEBDIR)/$(f))
+CSS_BLUE_SRC = $(foreach f,$(CSS_INIT) $(CSS_BLUE) $(CSS_DONE),$(WEBDIR)/$(f))
+CSS_GRAY_SRC = $(foreach f,$(CSS_INIT) $(CSS_GRAY) $(CSS_DONE),$(WEBDIR)/$(f))
+CSS_ACCESS_SRC = $(foreach f,$(CSS_INIT) $(CSS_ACCESS) $(CSS_DONE),$(WEBDIR)/$(f))
+CSS_SRC = $(CSS_BLUE_SRC) $(CSS_GRAY_SRC) $(CSS_ACCESS_SRC)
+
JAVASCRIPT_TV_SRC = $(foreach f,$(JAVASCRIPT_TV),$(WEBDIR)/$(f))
-CSS_TV_SRC = $(foreach f,$(CSS_TV),$(WEBDIR)/$(f))
+CSS_TV_SRC = $(foreach f,$(CSS_TV),$(WEBDIR)/$(f))
#
# Internationalization
$(MAKE) -f $(IAM) WEBUI=debug compile-debug
$(WEBDIR)/extjs-std.c: $(JAVASCRIPT_SRC) $(CSS_SRC)
- $(VV)printf 'extjs_lcss(hq, "static/tvh.css.gz");\n' > $@
+ $(VV)printf 'extjs_lcss(hq, "redir/theme.css");\n' > $@
$(VV)printf 'extjs_load(hq, "redir/locale.js");\n' >> $@
$(VV)printf 'extjs_load(hq, "static/tvh.js.gz");\n' >> $@
$(WEBDIR)/extjs-debug.c: $(JAVASCRIPT_SRC) $(CSS_SRC)
- $(VV)printf '$(foreach f,$(CSS),extjs_lcss(hq, "$(f)");\n)' > $@
+ $(VV)printf '$(foreach f,$(CSS_INIT),extjs_lcss(hq, "$(f)");\n)' > $@
+ $(VV)printf 'extjs_lcss(hq, "redir/theme.debug.css");\n' >> $@
+ $(VV)printf '$(foreach f,$(CSS_DONE),extjs_lcss(hq, "$(f)");\n)' >> $@
$(VV)printf 'extjs_load(hq, "redir/locale.js");\n' >> $@
$(VV)printf '$(foreach f,$(JAVASCRIPT),extjs_load(hq, "$(f)");\n)' >> $@
$(WEBDIR)/$(ROOTPATH)/tvh.js.gz: $(JAVASCRIPT_SRC)
$(call GO_JS)
-$(WEBDIR)/$(ROOTPATH)/tvh.css.gz: $(CSS_SRC)
+$(WEBDIR)/$(ROOTPATH)/tvh.blue.css.gz: $(CSS_BLUE_SRC)
+ $(call GO_CSS)
+
+$(WEBDIR)/$(ROOTPATH)/tvh.gray.css.gz: $(CSS_GRAY_SRC)
+ $(call GO_CSS)
+
+$(WEBDIR)/$(ROOTPATH)/tvh.access.css.gz: $(CSS_ACCESS_SRC)
$(call GO_CSS)
$(WEBDIR)/$(ROOTPATH)/tvh-tv.js.gz: $(JAVASCRIPT_TV_SRC)
$(call GO_CSS)
.PHONY: compile-std
-compile-std: $(WEBDIR)/$(ROOTPATH)/tvh.js.gz $(WEBDIR)/$(ROOTPATH)/tvh.css.gz \
+compile-std: $(WEBDIR)/$(ROOTPATH)/tvh.js.gz $(WEBDIR)/$(ROOTPATH)/tvh.blue.css.gz \
+ $(WEBDIR)/$(ROOTPATH)/tvh.gray.css.gz $(WEBDIR)/$(ROOTPATH)/tvh.access.css.gz \
$(WEBDIR)/$(ROOTPATH)/tvh-tv.js.gz $(WEBDIR)/$(ROOTPATH)/tvh-tv.css.gz \
$(WEBDIR)/extjs-std.c $(WEBDIR)/extjs-tv-std.c $(JSI-FILES)
@echo "WEBUI std finished"
dst->aa_lang = strdup(src->aa_lang);
if (src->aa_lang_ui)
dst->aa_lang_ui = strdup(src->aa_lang_ui);
+ if (src->aa_theme)
+ dst->aa_theme = strdup(src->aa_theme);
if (src->aa_profiles)
dst->aa_profiles = htsmsg_copy(src->aa_profiles);
if (src->aa_dvrcfgs)
}
}
+/**
+ *
+ */
+const char *
+access_get_theme(access_t *a)
+{
+ if (a->aa_theme == NULL || a->aa_theme[0] == '\0') {
+ if (config.theme_ui == NULL || config.theme_ui[0] == '\0')
+ return "blue";
+ return config.theme_ui;
+ }
+ return a->aa_theme;
+}
+
/**
*
*/
free(a->aa_representative);
free(a->aa_lang);
free(a->aa_lang_ui);
+ free(a->aa_theme);
htsmsg_destroy(a->aa_profiles);
htsmsg_destroy(a->aa_dvrcfgs);
htsmsg_destroy(a->aa_chtags);
a->aa_lang_ui = lang_code_user(s);
}
+ if ((!a->aa_theme || a->aa_theme[0] == '\0') && ae->ae_theme && ae->ae_theme[0])
+ a->aa_theme = strdup(a->aa_theme);
+
a->aa_rights |= ae->ae_rights;
}
return strtab2htsmsg(tab, 1, lang);
}
+htsmsg_t *
+theme_get_ui_list ( void *p, const char *lang )
+{
+ static struct strtab_str tab[] = {
+ { N_("Blue"), "blue" },
+ { N_("Gray"), "gray" },
+ { N_("Access"), "access" },
+ };
+ return strtab2htsmsg_str(tab, 1, lang);
+}
+
const idclass_t access_entry_class = {
.ic_class = "access",
.ic_caption = N_("Access"),
.type = PT_STR,
.id = "langui",
.name = N_("Web interface language"),
- .desc = N_("Default web interface language."),
+ .desc = N_("Web interface language."),
.list = language_get_ui_list,
.off = offsetof(access_entry_t, ae_lang_ui),
.opts = PO_ADVANCED,
},
+ {
+ .type = PT_STR,
+ .id = "themeui",
+ .name = N_("Web theme"),
+ .desc = N_("Web interface theme."),
+ .list = theme_get_ui_list,
+ .off = offsetof(access_entry_t, ae_theme),
+ },
{
.type = PT_BOOL,
.id = "streaming",
char *ae_comment;
char *ae_lang;
char *ae_lang_ui;
+ char *ae_theme;
int ae_index;
int ae_wizard;
uint32_t aa_conn_dvr;
int aa_uilevel;
int aa_uilevel_nochange;
+ char *aa_theme;
} access_t;
TAILQ_HEAD(access_ticket_queue, access_ticket);
char *
access_get_lang(access_t *a, const char *lang);
+/**
+ *
+ */
+const char *
+access_get_theme(access_t *a);
+
/**
* Verifies that the given user in combination with the source ip
* complies with the requested mask
*/
htsmsg_t *language_get_list ( void *obj, const char *lang );
htsmsg_t *language_get_ui_list ( void *obj, const char *lang );
+htsmsg_t *theme_get_ui_list ( void *obj, const char *lang );
htsmsg_t *user_get_userlist ( void *obj, const char *lang );
#endif /* ACCESS_H_ */
config.descrambler_buffer = 9000;
config.epg_compress = 1;
config_scanfile_ok = 0;
+ config.theme_ui = strdup("blue");
/* Generate default */
if (!path) {
free(config.server_name);
free(config.language);
free(config.language_ui);
+ free(config.theme_ui);
free(config.info_area);
free(config.muxconf_path);
free(config.chicon_path);
.off = offsetof(config_t, language_ui),
.group = 3
},
+ {
+ .type = PT_STR,
+ .id = "theme_ui",
+ .name = N_("Theme"),
+ .desc = N_("The default theme for web interface to use if the user "
+ " theme isn't set in the Access Entries tab."),
+ .list = theme_get_ui_list,
+ .off = offsetof(config_t, theme_ui),
+ .group = 3
+ },
{
.type = PT_STR,
.id = "muxconfpath",
char *language;
char *info_area;
char *language_ui;
+ char *theme_ui;
char *muxconf_path;
int prefer_picon;
char *chicon_path;
if (config.uilevel_nochange)
htsmsg_add_u32(m, "uilevel_nochange", config.uilevel_nochange);
}
+ htsmsg_add_str(m, "theme", access_get_theme(hc->hc_access));
htsmsg_add_u32(m, "quicktips", config.ui_quicktips);
if (!access_noacl)
htsmsg_add_str(m, "username", username);
'channel_tag_exclude,channel_tag,comment';
var list2 = 'enabled,username,password,prefix,' +
- 'lang,webui,langui,uilevel,uilevel_nochange,admin,' +
+ 'lang,webui,themeui,langui,uilevel,uilevel_nochange,admin,' +
'streaming,adv_streaming,htsp_streaming,' +
'profile,conn_limit_type,conn_limit,' +
'dvr,htsp_dvr,all_dvr,all_rw_dvr,' +
if (l !== tvheadend.uilevel)
reload = 1;
}
+ var n = data['theme'];
+ if (n !== tvheadend.theme)
+ reload = 1;
var n = data['uilevel_nochange'] ? true : false;
if (n !== tvheadend.uilevel_nochange)
reload = 1;
if (o.uilevel)
tvheadend.uilevel = o.uilevel;
+ if (o.theme)
+ tvheadend.theme = o.theme;
+
tvheadend.quicktips = o.quicktips ? true : false;
if (o.uilevel_nochange)
static int
http_redir(http_connection_t *hc, const char *remain, void *opaque)
{
- const char *lang;
+ const char *lang, *theme;
char *components[3];
char buf[256];
int nc;
pthread_mutex_unlock(&hc->hc_fd_lock);
return 0;
}
+ if (!strcmp(components[0], "theme.css")) {
+ theme = access_get_theme(hc->hc_access);
+ if (theme) {
+ snprintf(buf, sizeof(buf), "src/webui/static/tvh.%s.css.gz", theme);
+ if (!http_file_test(buf)) {
+ snprintf(buf, sizeof(buf), "/static/tvh.%s.css.gz", theme);
+ http_redirect(hc, buf, NULL, 0);
+ return 0;
+ }
+ }
+ return 0;
+ }
+ if (!strcmp(components[0], "theme.debug.css")) {
+ theme = access_get_theme(hc->hc_access);
+ if (theme) {
+ snprintf(buf, sizeof(buf), "src/webui/static/extjs/resources/css/xtheme-%s.css", theme);
+ if (!http_file_test(buf)) {
+ snprintf(buf, sizeof(buf), "/static/extjs/resources/css/xtheme-%s.css", theme);
+ http_redirect(hc, buf, NULL, 0);
+ return 0;
+ }
+ }
+ return 0;
+ }
}
if (nc >= 2) {