mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Gui: Add options for nightmode; switch window icons; switch wiki css
This commit is contained in:
parent
3e39b2fe77
commit
98fb49687b
@ -54,7 +54,7 @@ public class ColorAdp_ implements ParseAble {
|
||||
else
|
||||
return null;
|
||||
}
|
||||
@gplx.Internal protected static ColorAdp parse_hex_(String raw) {
|
||||
public static ColorAdp parse_hex_(String raw) {
|
||||
try {
|
||||
int[] ary = new int[4]; // make ARGB ary
|
||||
int idx = 0;
|
||||
|
@ -62,7 +62,13 @@ public class Swt_btn_no_border implements GxwElem, Swt_control {
|
||||
private void Btn_img_(ImageAdp v) {
|
||||
if (box_btn == null || v == null) return;
|
||||
SizeAdp size = core.Size();
|
||||
v = v.Resize(size.Width(), size.Height());
|
||||
// HACK: nightmode
|
||||
// for day mode, resize needed b/c blurred images look better
|
||||
// for night mode, SWT introduces white pixels
|
||||
// so resize only if height is different knowing that (a) btns have height of 16px and (b) day=32px; night=16px
|
||||
// note can't use width, b/c search_exec_btn somehow goes from 16px to 20px
|
||||
if (v.Size().Height() != size.Height())
|
||||
v = v.Resize(size.Width(), size.Height());
|
||||
box_btn.setImage(Copy_w_transparency((Image)v.Under()));
|
||||
}
|
||||
private Image Copy_w_transparency(Image src) {
|
||||
|
@ -37,7 +37,15 @@ public class Xoapi_browser implements Gfo_invk {
|
||||
public Xoapi_info Info() {return info;} private Xoapi_info info = new Xoapi_info();
|
||||
public Xoapi_prog_log Prog_log() {return prog_log;} private Xoapi_prog_log prog_log = new Xoapi_prog_log();
|
||||
private void Nightmode_toggle() {
|
||||
app.Gui_mgr().Nightmode_mgr().Enabled_toggle_();
|
||||
// toggle nightmode
|
||||
app.Gui_mgr().Nightmode_mgr().Enabled_toggle();
|
||||
|
||||
// toggle nightmode for all other tabs
|
||||
gplx.xowa.guis.views.Xog_tab_mgr tab_mgr = app.Gui_mgr().Browser_win().Tab_mgr();
|
||||
int len = tab_mgr.Tabs_len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
app.Gui_mgr().Browser_win().Page__refresh(tab_mgr.Tabs_get_at(i));
|
||||
}
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_url)) return url;
|
||||
|
@ -52,7 +52,7 @@ public class Xoa_css_extractor {
|
||||
this.wiki_html_dir = wiki.App().Fsys_mgr().Wiki_css_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org
|
||||
Io_url css_comm_fil = wiki_html_dir.GenSubFil(Css_common_name);
|
||||
Io_url css_wiki_fil = wiki_html_dir.GenSubFil(Css_wiki_name);
|
||||
wiki.Html__wtr_mgr().Init_css_urls(css_comm_fil, css_wiki_fil);
|
||||
wiki.Html__wtr_mgr().Init_css_urls(wiki.App(), css_comm_fil, css_wiki_fil);
|
||||
if (wiki.Domain_tid() == Xow_domain_tid_.Tid__home || Env_.Mode_testing()) return; // NOTE: do not download if home_wiki; also needed for TEST
|
||||
if (Io_mgr.Instance.ExistsFil(css_wiki_fil)) return; // css file exists; nothing to generate
|
||||
if (wiki.Html__css_installing()) return;
|
||||
|
@ -38,8 +38,18 @@ public class Xog_tab_itm implements Gfo_invk {
|
||||
html_box.Html_js_enabled_(tab_mgr.Javascript_enabled());
|
||||
html_box.Html_invk_src_(win);
|
||||
html_itm.Html_box_(html_box);
|
||||
if (app.Mode().Tid_is_gui()) { // NOTE: only run for gui; will cause firefox_addon to fail; DATE:2014-05-03
|
||||
html_box.Html_doc_html_load_by_mem(""); // NOTE: must set source, else control will be empty, and key events will not be raised; DATE:2014-04-30
|
||||
if (app.Mode().Tid_is_gui()) { // NOTE: only run for gui; will cause firefox_addon to fail; DATE:2014-05-03
|
||||
// NOTE: must set source, else control will be empty, and key events will not be raised; DATE:2014-04-30
|
||||
// NOTE: use load_by_url for nightmode else load_by_mem causes "white flashing" DATE:2017-03-04
|
||||
if (app.Gui_mgr().Nightmode_mgr().Enabled()) {
|
||||
html_box.Html_doc_html_load_by_url
|
||||
( app.Usere().Fsys_mgr().App_temp_html_dir().GenSubFil("tab_new.html")
|
||||
, String_.new_u8(gplx.xowa.specials.xowa.default_tab.Default_tab_page.DEFAULT_HTML_NIGHT)
|
||||
);
|
||||
}
|
||||
else {
|
||||
html_box.Html_doc_html_load_by_mem("");
|
||||
}
|
||||
IptBnd_.ipt_to_(IptCfg_.Null, html_box, this, "popup", IptEventType_.MouseDown, IptMouseBtn_.Right);
|
||||
IptBnd_.cmd_to_(IptCfg_.Null, html_box, win, Xog_win_itm.Invk_exit, IptKey_.add_(IptKey_.Alt, IptKey_.F4)); // WORKAROUND:SWT: xulrunner_v24 no longer sends Alt+F4 to SwtShell; must manually subscribe it to quit; DATE:2015-07-31
|
||||
Gfo_evt_mgr_.Sub_same(html_box, GfuiElemKeys.Evt_menu_detected, html_itm);
|
||||
|
@ -217,7 +217,10 @@ public class Xog_win_itm implements Gfo_invk, Gfo_evt_itm {
|
||||
Page__refresh();
|
||||
}
|
||||
public void Page__refresh() {
|
||||
Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm();
|
||||
Page__refresh(tab_mgr.Active_tab());
|
||||
}
|
||||
public void Page__refresh(Xog_tab_itm tab) {
|
||||
Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm();
|
||||
page = page.Wikie().Page_mgr().Load_page(page.Url(), page.Ttl(), tab); // NOTE: refresh should always reload and regen page; DATE:2017-02-15
|
||||
page.Html_data().Bmk_pos_(html_itm.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get));
|
||||
html_itm.Show(page);
|
||||
@ -308,19 +311,18 @@ public class Xog_win_itm implements Gfo_invk, Gfo_evt_itm {
|
||||
this.kit = kit;
|
||||
this.win_box = kit.New_win_app("win");
|
||||
this.sync_cmd = win_box.Kit().New_cmd_sync(this);
|
||||
Io_url img_dir = app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("app.window");
|
||||
FontAdp ui_font = app.Gui_mgr().Win_cfg().Font().To_font();
|
||||
|
||||
win_box.Layout_mgr_(new Swt_layout_mgr__grid().Cols_(1).Margin_w_(0).Margin_h_(0).Spacing_h_(0));
|
||||
|
||||
// toolbar
|
||||
this.toolbar_grp = Xog_win_itm_.new_grp(app, kit, win_box, "toolbar_grp");
|
||||
go_bwd_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, img_dir, "go_bwd_btn", "go_bwd.png" );
|
||||
go_fwd_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, img_dir, "go_fwd_btn", "go_fwd.png" );
|
||||
go_bwd_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, "go_bwd_btn");
|
||||
go_fwd_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, "go_fwd_btn");
|
||||
url_box = Xog_win_itm_.new_cbo(app, kit, toolbar_grp, ui_font, "url_box" , true);
|
||||
url_exec_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, img_dir, "url_exec_btn", "url_exec.png" );
|
||||
url_exec_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, "url_exec_btn");
|
||||
search_box = Xog_win_itm_.new_txt(app, kit, toolbar_grp, ui_font, "search_box" , true);
|
||||
search_exec_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, img_dir, "search_exec_btn", "search_exec.png" );
|
||||
search_exec_btn = Xog_win_itm_.new_btn(app, kit, toolbar_grp, "search_exec_btn");
|
||||
|
||||
toolbar_grp.Layout_data_(new Swt_layout_data__grid().Grab_excess_w_(true).Align_w__fill_().Hint_h_(28));
|
||||
toolbar_grp.Layout_mgr_(new Swt_layout_mgr__grid().Cols_(6)
|
||||
@ -339,10 +341,10 @@ public class Xog_win_itm implements Gfo_invk, Gfo_evt_itm {
|
||||
|
||||
// statusbar
|
||||
this.statusbar_grp = Xog_win_itm_.new_grp(app, kit, win_box, "statusbar_grp");
|
||||
find_close_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, img_dir, "find_close_btn", "find_close.png" );
|
||||
find_close_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, "find_close_btn");
|
||||
find_box = Xog_win_itm_.new_txt(app, kit, statusbar_grp, ui_font, "find_box" , true);
|
||||
find_fwd_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, img_dir, "find_fwd_btn", "find_fwd.png" );
|
||||
find_bwd_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, img_dir, "find_bwd_btn", "find_bwd.png" );
|
||||
find_fwd_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, "find_fwd_btn");
|
||||
find_bwd_btn = Xog_win_itm_.new_btn(app, kit, statusbar_grp, "find_bwd_btn");
|
||||
prog_box = Xog_win_itm_.new_txt(app, kit, statusbar_grp, ui_font, "prog_box" , false);
|
||||
info_box = Xog_win_itm_.new_txt(app, kit, statusbar_grp, ui_font, "note_box" , false);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public class Xog_win_itm_ {
|
||||
public static void Show_win(Xog_win_itm win) {
|
||||
Xoae_app app = win.App(); GfuiWin win_box = win.Win_box();
|
||||
win_box.Focus_able_(false);
|
||||
app.Gui_mgr().Nightmode_mgr().Enabled_dflt_();
|
||||
app.Gui_mgr().Nightmode_mgr().Enabled_by_cfg();
|
||||
Xog_startup_win_.Startup(app, win_box);
|
||||
|
||||
win_box.Icon_(IconAdp.file_or_blank(app.Fsys_mgr().Bin_xowa_dir().GenSubFil_nest("file", "app.window", "app_icon.png")));
|
||||
@ -29,10 +29,8 @@ public class Xog_win_itm_ {
|
||||
public static Gfui_grp new_grp(Xoae_app app, Gfui_kit kit, GfuiElem win, String id) {
|
||||
return kit.New_grp(id, win);
|
||||
}
|
||||
public static GfuiBtn new_btn(Xoae_app app, Gfui_kit kit, GfuiElem win, Io_url img_dir, String id, String file) {
|
||||
GfuiBtn rv = kit.New_btn(id, win);
|
||||
rv.Btn_img_(kit.New_img_load(img_dir.GenSubFil(file)));
|
||||
return rv;
|
||||
public static GfuiBtn new_btn(Xoae_app app, Gfui_kit kit, GfuiElem win, String id) {
|
||||
return kit.New_btn(id, win);
|
||||
}
|
||||
public static GfuiComboBox new_cbo(Xoae_app app, Gfui_kit kit, GfuiElem win, FontAdp ui_font, String id, boolean border_on) {
|
||||
GfuiComboBox rv = kit.New_combo(id, win, Keyval_.new_(GfuiTextBox.CFG_border_on_, border_on));
|
||||
|
@ -15,18 +15,23 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.xowa.guis.views.nightmodes; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*;
|
||||
import gplx.gfui.controls.elems.*; import gplx.gfui.draws.*;
|
||||
import gplx.xowa.specials.xowa.default_tab.*;
|
||||
public class Xog_nightmode_mgr {
|
||||
private Xoae_app app;
|
||||
private boolean enabled;
|
||||
private Xog_win_itm win;
|
||||
public void Init_by_app(Xoae_app app) {
|
||||
this.app = app;
|
||||
this.win = app.Gui_mgr().Browser_win();
|
||||
}
|
||||
public boolean Enabled() {return enabled;}
|
||||
public void Enabled_dflt_() {
|
||||
Enabled_(false);
|
||||
public void Enabled_by_cfg() {
|
||||
Enabled_(app.Cfg().Get_bool_app_or(Cfg__nightmode_enabled, false));
|
||||
}
|
||||
public void Enabled_toggle_() {
|
||||
Enabled_(!enabled);
|
||||
public void Enabled_toggle() {
|
||||
boolean val = !enabled;
|
||||
Enabled_(val);
|
||||
app.Cfg().Set_bool_app(Cfg__nightmode_enabled, val);
|
||||
}
|
||||
private void Enabled_(boolean v) {
|
||||
this.enabled = v;
|
||||
@ -34,14 +39,14 @@ public class Xog_nightmode_mgr {
|
||||
// get colors
|
||||
ColorAdp backcolor, forecolor, edgecolor;
|
||||
if (enabled) {
|
||||
backcolor = ColorAdp_.Black;
|
||||
forecolor = ColorAdp_.White;
|
||||
edgecolor = ColorAdp_.Black;
|
||||
backcolor = Parse_from_cfg(app, "xowa.gui.nightmode.nightcolors.backcolor", ColorAdp_.White);
|
||||
forecolor = Parse_from_cfg(app, "xowa.gui.nightmode.nightcolors.forecolor", ColorAdp_.Black);
|
||||
edgecolor = Parse_from_cfg(app, "xowa.gui.nightmode.nightcolors.edgecolor", ColorAdp_.LightGray);
|
||||
}
|
||||
else {
|
||||
backcolor = ColorAdp_.White;
|
||||
forecolor = ColorAdp_.Black;
|
||||
edgecolor = ColorAdp_.LightGray;
|
||||
backcolor = Parse_from_cfg(app, "xowa.gui.nightmode.daycolors.backcolor", ColorAdp_.Black);
|
||||
forecolor = Parse_from_cfg(app, "xowa.gui.nightmode.daycolors.forecolor", ColorAdp_.White);
|
||||
edgecolor = Parse_from_cfg(app, "xowa.gui.nightmode.daycolors.edgecolor", ColorAdp_.Black);
|
||||
}
|
||||
|
||||
// set back / fore for window and tab
|
||||
@ -76,5 +81,27 @@ public class Xog_nightmode_mgr {
|
||||
win.Search_box().Border_color_(edgecolor);
|
||||
win.Find_box().Border_color_(edgecolor);
|
||||
win.Prog_box().Border_color_(backcolor);
|
||||
|
||||
// change button icons
|
||||
// note that nightmode needs 16px and unresized b/c swt interpolates white pixels when resizing images (even when downsizing?)
|
||||
// note that daymode needs 32px and resized b/c resizing "blurs" image which looks better
|
||||
Io_url img_dir = app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("app.window", enabled ? "16px" : "32px");
|
||||
win.Go_bwd_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("go_bwd.png")));
|
||||
win.Go_fwd_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("go_fwd.png")));
|
||||
win.Url_exec_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("url_exec.png")));
|
||||
win.Search_exec_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("search_exec.png")));
|
||||
win.Find_close_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("find_close.png")));
|
||||
win.Find_bwd_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("find_bwd.png")));
|
||||
win.Find_fwd_btn().Btn_img_(app.Gui_mgr().Kit().New_img_load(img_dir.GenSubFil("find_fwd.png")));
|
||||
}
|
||||
private static ColorAdp Parse_from_cfg(Xoa_app app, String key, ColorAdp or) {
|
||||
String val = app.Cfg().Get_str_app_or(key, null);
|
||||
try {
|
||||
return val == null ? or : ColorAdp_.parse_hex_("#00" + val); // parse_hex requires leading "#00"
|
||||
} catch (Exception e) {
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to parse color; key=~{0} val=~{1} err=~{2}", key, val, Err_.Message_gplx_log(e));
|
||||
return or;
|
||||
}
|
||||
}
|
||||
private static final String Cfg__nightmode_enabled = "xowa.gui.nightmode.enabled";
|
||||
}
|
||||
|
@ -28,14 +28,26 @@ public class Xoh_page_wtr_mgr implements Gfo_invk {
|
||||
public boolean Html_capable() {return html_capable;} public Xoh_page_wtr_mgr Html_capable_(boolean v) {html_capable = v; return this;} private boolean html_capable;
|
||||
public byte[] Css_common_bry() {return css_common_bry;} private byte[] css_common_bry;
|
||||
public byte[] Css_wiki_bry() {return css_wiki_bry;} private byte[] css_wiki_bry;
|
||||
public byte[] Css_night_bry(boolean nightmode_enabled) {return nightmode_enabled ? css_night_bry : Bry_.Empty;} private byte[] css_night_bry;
|
||||
public boolean Scripting_enabled() {return scripting_enabled;} private boolean scripting_enabled;
|
||||
public Bry_fmtr Page_read_fmtr() {return page_read_fmtr;} private Bry_fmtr page_read_fmtr = Bry_fmtr.new_("", Fmtr_keys);
|
||||
public Bry_fmtr Page_edit_fmtr() {return page_edit_fmtr;} private Bry_fmtr page_edit_fmtr = Bry_fmtr.new_("", Fmtr_keys);
|
||||
public Bry_fmtr Page_html_fmtr() {return page_html_fmtr;} private Bry_fmtr page_html_fmtr = Bry_fmtr.new_("", Fmtr_keys);
|
||||
public byte[] Edit_rename_div_bry(Xoa_ttl ttl) {return div_edit_rename_fmtr.Bld_bry_many(tmp_bfr, ttl.Full_db());}
|
||||
public void Init_css_urls(Io_url css_common_url, Io_url css_wiki_url) {
|
||||
public void Init_css_urls(Xoa_app app, Io_url css_common_url, Io_url css_wiki_url) {
|
||||
this.css_common_bry = css_common_url.To_http_file_bry();
|
||||
this.css_wiki_bry = css_wiki_url.To_http_file_bry();
|
||||
|
||||
// set css_night_url to /xowa/user/ root
|
||||
Io_url css_night_url = css_wiki_url.OwnerDir().GenSubFil("xowa_night.css");
|
||||
|
||||
// if it doesn't exist, use bin root
|
||||
if (!Io_mgr.Instance.ExistsFil(css_night_url)) {
|
||||
css_night_url = app.Fsys_mgr().Bin_xowa_dir().GenSubFil_nest("html", "css", "nightmode", "xowa_night.css");
|
||||
}
|
||||
|
||||
// make night_bry
|
||||
this.css_night_bry = Bry_.new_u8("<link rel=\"stylesheet\" href=\"" + css_night_url.To_http_file_str() + "\" type=\"text/css\">");;
|
||||
}
|
||||
public void Init_(boolean v) {init = v;} private boolean init = true;
|
||||
public void Init_by_wiki(Xow_wiki wiki) {
|
||||
@ -83,7 +95,7 @@ public class Xoh_page_wtr_mgr implements Gfo_invk {
|
||||
private static final String[] Fmtr_keys = new String[]
|
||||
{ "app_root_dir", "app_version", "app_build_date", "xowa_mode_is_server"
|
||||
, "page_id", "page_ttl_full", "page_name", "page_heading", "page_modified_on_msg"
|
||||
, "html_css_common_path", "html_css_wiki_path", "xowa_head"
|
||||
, "html_css_common_path", "html_css_wiki_path", "html_css_night_tag", "xowa_head"
|
||||
, "page_lang_ltr", "page_indicators", "page_content_sub", "page_jumpto", "page_pgbnr", "page_body_cls", "html_content_editable"
|
||||
, "page_data", "page_langs"
|
||||
, "portal_div_personal", "portal_div_ns", "portal_div_view"
|
||||
|
@ -98,7 +98,9 @@ public class Xoh_page_wtr_wkr {
|
||||
, page.Db().Page().Id(), page.Ttl().Full_db()
|
||||
, page_name, page.Html_data().Page_heading().Init(wiki, html_gen_tid == Xopg_page_.Tid_read, page.Html_data(), page.Ttl().Full_db(), page_display_title)
|
||||
, modified_on_msg
|
||||
, mgr.Css_common_bry(), mgr.Css_wiki_bry(), page.Html_data().Head_mgr().Init(app, wiki, page).Init_dflts()
|
||||
, mgr.Css_common_bry(), mgr.Css_wiki_bry()
|
||||
, mgr.Css_night_bry(app.Gui_mgr().Nightmode_mgr().Enabled())
|
||||
, page.Html_data().Head_mgr().Init(app, wiki, page).Init_dflts()
|
||||
, page.Lang().Dir_ltr_bry(), page.Html_data().Indicators(), page_content_sub, wiki.Html_mgr().Portal_mgr().Div_jump_to(), wiki.Xtn_mgr().Xtn_pgbnr().Write_html(page, ctx, hctx), page_body_class, html_content_editable
|
||||
, page_data, wdata_lang_wtr
|
||||
|
||||
|
@ -28,7 +28,7 @@ public class Default_tab_page implements Xow_special_page {
|
||||
|
||||
public Xow_special_page Special__clone() {return this;}
|
||||
|
||||
private static final byte[]
|
||||
public static final byte[]
|
||||
DEFAULT_HTML_DAY = Bry_.new_a7("<html><body style='background-color:white'></body></html>")
|
||||
, DEFAULT_HTML_NIGHT = Bry_.new_a7("<html><body style='background-color:black'></body></html>")
|
||||
;
|
||||
|
Loading…
Reference in New Issue
Block a user