Add options and options saving

This commit is contained in:
Dave Pedu 2015-02-13 18:05:12 -08:00
parent 2150c5bd9f
commit fd748dd623
7 changed files with 182 additions and 49 deletions

View File

@ -1,6 +1,11 @@
_tabbro_ = function() { _tabbro_ = function() {
// Options
this.options = {
"autoStickyTabs":true,
}
// Database version // Database version
this.__VERSION = 1; this.__VERSION = 1;
@ -15,12 +20,14 @@ _tabbro_ = function() {
// Storage engine // Storage engine
this._storage = chrome.storage.local; this._storage = chrome.storage.local;
this._cloudstorage = chrome.storage.local;
// the next created window should be stored in the tree window at this index. null for disabled // the next created window should be stored in the tree window at this index. null for disabled
this.nextCreatedWindowIndex = null this.nextCreatedWindowIndex = null
// Action hook - called when we've done something that potentionally could require SAVING and/or any of the guis to be updated // Action hook - called when we've done something that potentionally could require SAVING and/or any of the guis to be updated
this.hook_repaint == null this.hook_repaint == null
this.notify = function() { this.notify = function() {
tabbro.updateCount() tabbro.updateCount()
if(this.hook_repaint!=null) { if(this.hook_repaint!=null) {
@ -29,7 +36,6 @@ _tabbro_ = function() {
this.save() this.save()
} }
// TREE HELPERS // TREE HELPERS
this.t_getWindow = function(winid) { this.t_getWindow = function(winid) {
for(var i in this.tree) { for(var i in this.tree) {
@ -39,7 +45,6 @@ _tabbro_ = function() {
} }
} }
this.t_getWindowFromTab = function(tabid) { this.t_getWindowFromTab = function(tabid) {
// Return the window the specified tab id belongs to // Return the window the specified tab id belongs to
for(var w in this.tree) { for(var w in this.tree) {
@ -51,7 +56,6 @@ _tabbro_ = function() {
} }
} }
this.t_getTab = function(tabid) { this.t_getTab = function(tabid) {
for(var w in this.tree) { for(var w in this.tree) {
for(var t in this.tree[w].tabs) { for(var t in this.tree[w].tabs) {
@ -62,20 +66,17 @@ _tabbro_ = function() {
} }
} }
this.t_windowHasTab = function(winid, tabid) { this.t_windowHasTab = function(winid, tabid) {
// Determine if the specified window by id contains tab specified by tabid // Determine if the specified window by id contains tab specified by tabid
// TODO // TODO
} }
this.t_addTabtoWindow = function(winid, tab, index) { this.t_addTabtoWindow = function(winid, tab, index) {
// Add a tab record to a window specified by winid // Add a tab record to a window specified by winid
var win = this.t_getWindow(winid) var win = this.t_getWindow(winid)
if(win) win.tabs.splice(index, 0, tab) if(win) win.tabs.splice(index, 0, tab)
} }
this.t_removeTab = function(tabid) { this.t_removeTab = function(tabid) {
// Removed tab record // Removed tab record
var thewindow = this.t_getWindowFromTab(tabid) var thewindow = this.t_getWindowFromTab(tabid)
@ -87,7 +88,6 @@ _tabbro_ = function() {
} }
} }
this.t_removeWindow = function(winid) { this.t_removeWindow = function(winid) {
// Remove window // Remove window
for(var i in this.tree) { for(var i in this.tree) {
@ -98,7 +98,6 @@ _tabbro_ = function() {
} }
} }
// UI UTIL FUNCTIONS // UI UTIL FUNCTIONS
this.ui_delete_tab = function(winindex, tabindex) { this.ui_delete_tab = function(winindex, tabindex) {
// Delete tab at tabindex from window at windowindex // Delete tab at tabindex from window at windowindex
@ -115,7 +114,6 @@ _tabbro_ = function() {
this.notify() this.notify()
} }
this.ui_delete_window = function(winindex) { this.ui_delete_window = function(winindex) {
// Delete window at windowindex // Delete window at windowindex
var window = this.tree[winindex] var window = this.tree[winindex]
@ -130,7 +128,6 @@ _tabbro_ = function() {
this.notify() this.notify()
} }
this.ui_stick_tab = function(winindex, tabindex) { this.ui_stick_tab = function(winindex, tabindex) {
// Toggle sticky state for tab at tabindex from window at windowindex // Toggle sticky state for tab at tabindex from window at windowindex
this.tree[winindex].tabs[tabindex].sticky = !this.tree[winindex].tabs[tabindex].sticky this.tree[winindex].tabs[tabindex].sticky = !this.tree[winindex].tabs[tabindex].sticky
@ -141,7 +138,6 @@ _tabbro_ = function() {
this.notify() this.notify()
} }
this.ui_stick_window = function(winindex) { this.ui_stick_window = function(winindex) {
// Toggle sticky state for window at windowindex // Toggle sticky state for window at windowindex
this.tree[winindex].sticky = !this.tree[winindex].sticky this.tree[winindex].sticky = !this.tree[winindex].sticky
@ -152,7 +148,6 @@ _tabbro_ = function() {
this.notify() this.notify()
} }
this.ui_open_window = function(winindex) { this.ui_open_window = function(winindex) {
var bro = this var bro = this
// Open saved window at index winindex // Open saved window at index winindex
@ -209,7 +204,6 @@ _tabbro_ = function() {
}) })
} }
this.ui_open_tab = function(winindex, tabindex) { this.ui_open_tab = function(winindex, tabindex) {
// Open a single tab // Open a single tab
var tab = this.tree[winindex].tabs[tabindex] var tab = this.tree[winindex].tabs[tabindex]
@ -223,13 +217,9 @@ _tabbro_ = function() {
this.ui_rename_window = function(winindex, newname) { this.ui_rename_window = function(winindex, newname) {
this.tree[winindex].name = newname this.tree[winindex].name = newname
this.bro.notify() this.notify()
} }
this.getCount = function() { this.getCount = function() {
// Return count of loaded tabs // Return count of loaded tabs
var count = 0; var count = 0;
@ -243,13 +233,11 @@ _tabbro_ = function() {
return count; return count;
} }
this.updateCount = function() { this.updateCount = function() {
// Update open tab count badge // Update open tab count badge
chrome.browserAction.setBadgeText({"text":this.getCount()+""}) chrome.browserAction.setBadgeText({"text":this.getCount()+""})
} }
// Entry point - load previous session data or create a database // Entry point - load previous session data or create a database
this.load = function() { this.load = function() {
var bro = this var bro = this
@ -269,9 +257,18 @@ _tabbro_ = function() {
} }
bro.setup() bro.setup()
}) })
this._storage.get("tabbro_options", function(_data){
if(_data.tabbro_options==undefined) {
// Use defaults
} else {
for(var i in _data.tabbro_options) {
bro.options[i] = _data.tabbro_options[i]
}
}
})
} }
this.setup = function() { this.setup = function() {
// Set the notification color // Set the notification color
chrome.browserAction.setBadgeBackgroundColor({"color":"#990000"}) chrome.browserAction.setBadgeBackgroundColor({"color":"#990000"})
@ -285,7 +282,6 @@ _tabbro_ = function() {
//console.log("Tabbro v" + this.__VERSION + " ready!") //console.log("Tabbro v" + this.__VERSION + " ready!")
} }
this.loadInitialTree = function() { this.loadInitialTree = function() {
// Add all open windows/tabs to the database tree // Add all open windows/tabs to the database tree
var bro = this var bro = this
@ -323,7 +319,6 @@ _tabbro_ = function() {
}) })
} }
this.pruneData = function() { this.pruneData = function() {
// If any non-sticky windows are in our data from a previous session, remove them // If any non-sticky windows are in our data from a previous session, remove them
var pruneWindows = [] var pruneWindows = []
@ -364,7 +359,6 @@ _tabbro_ = function() {
//console.log("after pruneData: tree length: " + this.tree.length) //console.log("after pruneData: tree length: " + this.tree.length)
} }
this.pruneWindowsTabsForClose = function(win) { this.pruneWindowsTabsForClose = function(win) {
// Remove non-sticky tabs from a window // Remove non-sticky tabs from a window
var pruneTabs = [] var pruneTabs = []
@ -380,13 +374,13 @@ _tabbro_ = function() {
} }
} }
this.save = function() { this.save = function() {
// Save data to chrome // Save data to chrome
//this._storage.set({"tabbro":this.data}) this._storage.set({"tabbro":this.data})
// Save options to cloud
this._cloudstorage.set({"tabbro_options":this.options})
} }
this.addListeners = function() { this.addListeners = function() {
var bro = this var bro = this
@ -462,7 +456,8 @@ _tabbro_ = function() {
tab = bro.t_getTab(tabid) tab = bro.t_getTab(tabid)
if(tab) chrome.tabs.get(tabid, function(_tab) { if(tab) chrome.tabs.get(tabid, function(_tab) {
if(_tab == null || tab == null) debugger if(_tab == null) debugger
if(tab == null) debugger
tab.title = _tab.title tab.title = _tab.title
tab.url = _tab.url tab.url = _tab.url
tab.pinned = _tab.pinned tab.pinned = _tab.pinned
@ -552,6 +547,13 @@ _tabbro_ = function() {
}) })
} }
this.update_setting = function(settingName, newValue) {
if(typeof(this.options[settingName]) != "undefined") {
this.options[settingName] = newValue
}
this.save()
}
this.load() this.load()
} }

View File

@ -17,5 +17,6 @@
"unlimitedStorage", "unlimitedStorage",
"activeTab", "activeTab",
"notifications", "idle", "chrome://favicon/" "notifications", "idle", "chrome://favicon/"
] ],
"options_page": "options.html"
} }

View File

@ -1,14 +1,36 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<title>TAB BRO</title> <title>TABBRO OPTIONS</title>
<link href="style.css" rel="stylesheet" type="text/css" /> <link href="style.css" rel="stylesheet" type="text/css" />
<link href="libs/font-awesome-4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<script src="options.js"></script>
</head> </head>
<body> <body class="options-page">
<div class="wrapper"> <div class="wrapper">
Wello!<br> <h1>Tabbro Options</h1>
<a href="popup.html">Main</a> <ul>
<li>
<label class="clearfix">
<input type="checkbox" class="toggle" id="autoStickyTabs" value="1" />
<strong>Auto-sticky tabs</strong>
</label>
<div class="answer">
<span class="on">When a new tab is opened, it will be sticky if the parent window is sticky.</span>
<span class="off">When a new tab is opened, it will not be sticky. If the parent window is closed, only stick tabs are saved.</span>
</div>
</li>
</ul>
<br />
<br />
<br />
<h1>Dump Data</h1>
<input type="text" name="dumpout" id="dumpout" value="" />
<br />
<br />
<br />
<h1>Load Data</h1>
<input type="text" name="dumpin" id="dumpin" value="Paste JSON here (Not functional yet)" />
</div> </div>
</body> </body>
</html> </html>

50
options.js Normal file
View File

@ -0,0 +1,50 @@
var tabbro = null;
document.addEventListener('DOMContentLoaded', function() {
chrome.runtime.getBackgroundPage(function(page) {
tabbro = page.tabbro
setup()
})
});
function setup() {
// Data dump
document.getElementById("dumpout").value = JSON.stringify(tabbro.tree)
// Set initial option state
for(var i in tabbro.options) {
var input = document.getElementById(i);
var value = tabbro.options[i]
if(typeof value == "boolean") {
input.checked = value
}
input.onchange = function() {
var settingName = this.getAttribute("id")
var newValue = null
if(this.getAttribute("type")=="checkbox") {
newValue = this.checked
if(newValue) {
this.parentElement.parentElement.childNodes[3].childNodes[1].style.display=""
this.parentElement.parentElement.childNodes[3].childNodes[3].style.display="none"
} else {
this.parentElement.parentElement.childNodes[3].childNodes[1].style.display="none"
this.parentElement.parentElement.childNodes[3].childNodes[3].style.display=""
}
}
tabbro.update_setting(settingName, newValue)
}
input.onchange()
}
// Select-all listener for data dump field
var dumpout = document.getElementById("dumpout")
dumpout.onclick = function() {
this.setSelectionRange(0,9999999)
}
dumpout.onkeyup = dumpout.onchange = dumpout.onkeydown = function() {
this.value = JSON.stringify(tabbro.tree)
}
}

View File

@ -6,7 +6,7 @@
<link href="libs/font-awesome-4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" /> <link href="libs/font-awesome-4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<script src="popup.js"></script> <script src="popup.js"></script>
</head> </head>
<body> <body class="popup-page">
<div class="wrapper"> <div class="wrapper">
<ul id="root"></ul> <ul id="root"></ul>
<!--<a href="options.html">Options</a> <!--<a href="options.html">Options</a>

View File

@ -41,6 +41,10 @@ table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; } border-spacing: 0; }
h1 {
font-size: 18px;
margin: 5px 0px 15px 0px; }
/* CLEARFIX */ /* CLEARFIX */
.clearfix:after { .clearfix:after {
visibility: hidden; visibility: hidden;
@ -63,14 +67,34 @@ table {
/* STYLES */ /* STYLES */
/* GLOBAL */ /* GLOBAL */
body { body {
width: 420px;
height: auto;
padding: 5px 0px;
margin: 0;
font-family: Open sans; font-family: Open sans;
font-size: 12px; font-size: 12px; }
max-height: 700px; body.popup-page {
overflow-y: auto; } width: 420px;
height: auto;
padding: 5px 0px;
margin: 0;
max-height: 700px;
overflow-y: auto; }
body.options-page {
padding: 10px 20px; }
body.options-page .wrapper {
max-width: 600px;
margin: 0px auto; }
body.options-page input {
display: block; }
body.options-page input.toggle {
float: left; }
body.options-page input#dumpin, body.options-page input#dumpout {
display: block;
width: 100%; }
body.options-page strong {
font-weight: bold;
padding: 4px 0px 10px 5px;
display: block; }
body.options-page .answer span {
display: block;
margin-left: 20px; }
@-webkit-keyframes nopenopenope { @-webkit-keyframes nopenopenope {
0% { 0% {

View File

@ -40,6 +40,10 @@ table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
h1 {
font-size: 18px;
margin: 5px 0px 15px 0px;
}
/* CLEARFIX */ /* CLEARFIX */
.clearfix:after { .clearfix:after {
visibility: hidden; visibility: hidden;
@ -61,14 +65,44 @@ table {
/* GLOBAL */ /* GLOBAL */
body { body {
width: 420px;
height: auto;
padding: 5px 0px;
margin: 0;
font-family: Open sans; font-family: Open sans;
font-size: 12px; font-size: 12px;
max-height: 700px;
overflow-y: auto; &.popup-page {
width: 420px;
height: auto;
padding: 5px 0px;
margin: 0;
max-height: 700px;
overflow-y: auto;
}
&.options-page {
padding: 10px 20px;
.wrapper {
max-width: 600px;
margin: 0px auto;
}
input {
display: block;
&.toggle {
float: left;
}
&#dumpin, &#dumpout {
display: block;
width: 100%;
}
}
strong {
font-weight: bold;
padding: 4px 0px 10px 5px;
display: block;
}
.answer span {
display: block;
margin-left: 20px;
}
}
} }
@-webkit-keyframes nopenopenope { @-webkit-keyframes nopenopenope {
0% { 0% {