cinera: Single browser tab and no autofocus mode

This allows search result links to open in the same tab, and prevents
automatic scrolling to the search input box on page load
This commit is contained in:
Matt Mascarenhas 2018-07-03 15:26:17 +01:00
parent 92909a9ee9
commit aa0a8ba327
2 changed files with 28 additions and 12 deletions

View File

@ -16,7 +16,7 @@ typedef struct
version CINERA_APP_VERSION = { version CINERA_APP_VERSION = {
.Major = 0, .Major = 0,
.Minor = 5, .Minor = 5,
.Patch = 63 .Patch = 64
}; };
// TODO(matt): Copy in the DB 3 stuff from cinera_working.c // TODO(matt): Copy in the DB 3 stuff from cinera_working.c
@ -92,6 +92,7 @@ enum
MODE_EXAMINE = 1 << 2, MODE_EXAMINE = 1 << 2,
MODE_NOCACHE = 1 << 3, MODE_NOCACHE = 1 << 3,
MODE_NOPRIVACY = 1 << 4, MODE_NOPRIVACY = 1 << 4,
MODE_SINGLETAB = 1 << 5
} modes; } modes;
enum enum
@ -2290,9 +2291,6 @@ PrintUsage(char *BinaryLocation, config *DefaultConfig)
"\e[0m -s <style>\n" "\e[0m -s <style>\n"
" Set the style / theme, corresponding to a cinera__*.css file\n" " Set the style / theme, corresponding to a cinera__*.css file\n"
" This is equal to the \"project\" field in the HMML files by default\n" " This is equal to the \"project\" field in the HMML files by default\n"
" -q\n"
" Quit after syncing with annotation files in project input directory\n"
" \e[1;30mUNSUPPORTED: This is likely to be removed in the future\e[0m\n"
"\n" "\n"
" Project Input Paths\n" " Project Input Paths\n"
" -d <annotations directory>\n" " -d <annotations directory>\n"
@ -2325,14 +2323,19 @@ PrintUsage(char *BinaryLocation, config *DefaultConfig)
" -o <output location>\n" " -o <output location>\n"
" Override default output player location (\"%s\")\n" " Override default output player location (\"%s\")\n"
"\n" "\n"
" -e\n" " -1\n"
" Display (examine) index file and exit\n" " Open search result links in the same browser tab and do not autofocus\n"
" search input box on page load\n"
" NOTE: Ideal for a guide embedded in an iframe\n"
" -f\n" " -f\n"
" Force integration with an incomplete template\n" " Force integration with an incomplete template\n"
" -g\n" " -g\n"
" Ignore video privacy status\n" " Ignore video privacy status\n"
" NOTE: For use with projects whose videos are known to all be public,\n" " NOTE: For use with projects whose videos are known to all be public,\n"
" to save us having to check their privacy status\n" " to save us having to check their privacy status\n"
" -q\n"
" Quit after syncing with annotation files in project input directory\n"
" \e[1;30mUNSUPPORTED: This is likely to be removed in the future\e[0m\n"
" -w\n" " -w\n"
" Force quote cache rebuild \e[1;30m(memory aid: \"wget\")\e[0m\n" " Force quote cache rebuild \e[1;30m(memory aid: \"wget\")\e[0m\n"
"\n" "\n"
@ -2341,6 +2344,9 @@ PrintUsage(char *BinaryLocation, config *DefaultConfig)
" -u <seconds>\n" " -u <seconds>\n"
" Override default update interval (%d)\n" " Override default update interval (%d)\n"
//" -c config location\n" //" -c config location\n"
"\n"
" -e\n"
" Display (examine) index file and exit\n"
" -v\n" " -v\n"
" Display version and exit\n" " Display version and exit\n"
" -h\n" " -h\n"
@ -5504,25 +5510,27 @@ IndexToBuffer(index *Index, buffers *CollationBuffers) // NOTE(matt): This guy m
} }
char *Theme = StringsDiffer(Config.Theme, "") ? Config.Theme : Config.ProjectID; char *Theme = StringsDiffer(Config.Theme, "") ? Config.Theme : Config.ProjectID;
int Allowance = StringLength(Theme) * 2 + StringLength(Config.ProjectID) + StringLength(Config.BaseURL) + StringLength(Config.PlayerLocation); int Allowance = StringLength(Theme) * 2 + StringLength(Config.ProjectID) + StringLength(Config.BaseURL) + StringLength(Config.PlayerLocation) + (Config.Mode & MODE_SINGLETAB ? 0 : 10);
char queryContainer[656 + Allowance]; // NOTE(matt): Update the size if changing the string char queryContainer[659 + Allowance]; // NOTE(matt): Update the size if changing the string
CopyString(queryContainer, sizeof(queryContainer), CopyString(queryContainer, sizeof(queryContainer),
"<div class=\"cineraQueryContainer %s\">\n" "<div class=\"cineraQueryContainer %s\">\n"
" <label for=\"query\">Query:</label>\n" " <label for=\"query\">Query:</label>\n"
" <div class=\"inputContainer\">\n" " <div class=\"inputContainer\">\n"
" <input type=\"text\" id=\"query\" autofocus=\"\">\n" " <input type=\"text\" id=\"query\"%s>\n"
" <div class=\"spinner\">\n" " <div class=\"spinner\">\n"
" Downloading data...\n" " Downloading data...\n"
" </div>\n" " </div>\n"
" </div>\n" " </div>\n"
" </div>\n" " </div>\n"
" <div id=\"cineraResultsSummary\">Found: 0 episodes, 0 markers, 0h 0m 0s total.</div>\n" " <div id=\"cineraResultsSummary\">Found: 0 episodes, 0 markers, 0h 0m 0s total.</div>\n"
" <div id=\"cineraResults\"></div>\n" " <div id=\"cineraResults\" data-single=\"%d\"></div>\n"
"\n" "\n"
" <div id=\"cineraIndex\" class=\"%s\" data-project=\"%s\" data-baseURL=\"%s\" data-playerLocation=\"%s\">\n" " <div id=\"cineraIndex\" class=\"%s\" data-project=\"%s\" data-baseURL=\"%s\" data-playerLocation=\"%s\">\n"
" <div id=\"cineraIndexSort\">Sort: Old to New &#9206;</div>\n" " <div id=\"cineraIndexSort\">Sort: Old to New &#9206;</div>\n"
" <div id=\"cineraIndexEntries\">\n", " <div id=\"cineraIndexEntries\">\n",
Theme, Theme,
Config.Mode & MODE_SINGLETAB ? "": " autofocus",
Config.Mode & MODE_SINGLETAB ? 1 : 0,
Theme, Theme,
Config.ProjectID, Config.ProjectID,
Config.BaseURL, Config.BaseURL,
@ -6342,10 +6350,13 @@ main(int ArgC, char **Args)
} }
char CommandLineArg; char CommandLineArg;
while((CommandLineArg = getopt(ArgC, Args, "a:b:B:c:d:efghi:j:l:m:n:o:p:qr:R:s:t:u:vwx:y:")) != -1) while((CommandLineArg = getopt(ArgC, Args, "1a:b:B:c:d:efghi:j:l:m:n:o:p:qr:R:s:t:u:vwx:y:")) != -1)
{ {
switch(CommandLineArg) switch(CommandLineArg)
{ {
case '1':
Config.Mode |= MODE_SINGLETAB;
break;
case 'a': case 'a':
Config.PlayerLocation = StripSurroundingSlashes(optarg); Config.PlayerLocation = StripSurroundingSlashes(optarg);
break; break;
@ -6647,6 +6658,7 @@ main(int ArgC, char **Args)
" Player Page Prefix: \e[1;30m(hardcoded)\e[0m\t%s\n" " Player Page Prefix: \e[1;30m(hardcoded)\e[0m\t%s\n"
"\n" "\n"
"Modes\n" "Modes\n"
" Single browser tab: \e[1;30m(-1)\e[0m\t\t%s\n"
" Force template integration: \e[1;30m(-f)\e[0m\t%s\n" " Force template integration: \e[1;30m(-f)\e[0m\t%s\n"
" Ignore video privacy status: \e[1;30m(-g)\e[0m\t%s\n" " Ignore video privacy status: \e[1;30m(-g)\e[0m\t%s\n"
" Quit after sync: \e[1;30m(-q)\e[0m\t\t%s\n" " Quit after sync: \e[1;30m(-q)\e[0m\t\t%s\n"
@ -6677,6 +6689,7 @@ main(int ArgC, char **Args)
StringsDiffer(Config.PlayerLocation, "") ? Config.PlayerLocation : "(directly descended from base)", StringsDiffer(Config.PlayerLocation, "") ? Config.PlayerLocation : "(directly descended from base)",
StringsDiffer(Config.PlayerURLPrefix, "") ? Config.PlayerURLPrefix : Config.ProjectID, StringsDiffer(Config.PlayerURLPrefix, "") ? Config.PlayerURLPrefix : Config.ProjectID,
Config.Mode & MODE_SINGLETAB ? "on" : "off",
Config.Mode & MODE_FORCEINTEGRATION ? "on" : "off", Config.Mode & MODE_FORCEINTEGRATION ? "on" : "off",
Config.Mode & MODE_NOPRIVACY ? "on" : "off", Config.Mode & MODE_NOPRIVACY ? "on" : "off",
Config.Mode & MODE_ONESHOT ? "on" : "off", Config.Mode & MODE_ONESHOT ? "on" : "off",

View File

@ -54,7 +54,10 @@ dayContainerPrototype.appendChild(markerListPrototype);
var markerPrototype = document.createElement("A"); var markerPrototype = document.createElement("A");
markerPrototype.classList.add("marker"); markerPrototype.classList.add("marker");
if(resultsContainer.getAttribute("data-single") == 0)
{
markerPrototype.setAttribute("target", "_blank"); markerPrototype.setAttribute("target", "_blank");
}
var highlightPrototype = document.createElement("B"); var highlightPrototype = document.createElement("B");