1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-28 14:30:51 +00:00

Gui: Add options for nightmode; switch window icons; switch wiki css

This commit is contained in:
gnosygnu 2017-03-05 07:16:35 -05:00
parent 3e39b2fe77
commit 98fb49687b
11 changed files with 99 additions and 34 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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));

View File

@ -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";
}

View File

@ -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"

View File

@ -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

View File

@ -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>")
;