diff --git a/README.md b/README.md index 9efec2a..d346f60 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,23 @@ Arbeitest du an **mehreren PCs**, kann MyStart seinen kompletten Datenstand abgleichen – sofern auf beiden PCs **OneDrive** eingerichtet und angemeldet ist. -- MyStart legt dazu automatisch `OneDrive\MyStart\sync.json` an. Die - eigentliche Übertragung zwischen den PCs übernimmt OneDrive selbst – - MyStart schreibt/liest dort nur die Datei. +Der Abgleich ist **optional und standardmäßig aus**. Einschalten unter +**Einstellungen → MyStart → „Zwischen PCs abgleichen“** – auf jedem PC +einzeln. Solange er aus ist, wird nichts geschrieben oder gelesen, und der +Status-Punkt in der Reiter-Leiste ist ausgeblendet. + +**Ordner:** Standardmäßig wird automatisch dein OneDrive-Ordner erkannt +(`OneDrive\MyStart`). Darunter zeigt die App den aktuell genutzten Ordner an. +Mit **„Ordner wählen…“** kannst du stattdessen einen beliebigen anderen +synchronisierten Ordner nehmen (Dropbox, Google Drive, Netzlaufwerk …), +„Automatisch (OneDrive)“ stellt es zurück. Auf **allen PCs muss derselbe +Ordner** genutzt werden, also dieselbe Cloud-Freigabe. + +- MyStart legt dazu im Ordner `OneDrive\MyStart` pro PC eine eigene Datei + `sync-.json` an (jeder PC schreibt nur seine eigene, damit + OneDrive keine Konfliktkopien erzeugt). Die eigentliche Übertragung + zwischen den PCs übernimmt OneDrive selbst – MyStart schreibt/liest dort + nur diese Dateien. - Abgeglichen wird **alle 30 Sekunden**, außerdem beim Start und beim Schließen der App. - Regel bei Änderungen: **die neueste Version gewinnt.** Ändern beide PCs diff --git a/bundle.js b/bundle.js index b3451fd..e69bf43 100644 --- a/bundle.js +++ b/bundle.js @@ -88,39 +88,98 @@ const trInfra = const autostartJs = `(function(){ var A={enabled:false,supported:!!(window.chrome&&window.chrome.webview)}; window.__mystartAutostart=A; - function paint(){ - var tr=document.getElementById('mystart-autostart-track'); - var kn=document.getElementById('mystart-autostart-knob'); + // Second switch: OneDrive sync, opt-in (off until switched on here). + var Y={enabled:false,available:true,path:null,custom:false}; + function paintOne(prefix,on){ + var tr=document.getElementById(prefix+'-track'); + var kn=document.getElementById(prefix+'-knob'); if(!tr||!kn)return; - tr.style.background=A.enabled?'#2ea043':'#565d68'; - kn.style.left=A.enabled?'23px':'3px'; + tr.style.background=on?'#2ea043':'#565d68'; + kn.style.left=on?'23px':'3px'; + } + function paint(){ + paintOne('mystart-autostart',A.enabled); + paintOne('mystart-sync',Y.enabled); + var w=document.getElementById('mystart-sync-wrap'); + if(w){ + w.style.opacity=Y.available?'1':'0.5'; + w.style.cursor=Y.available?'pointer':'default'; + w.title=Y.available?'':'Kein Sync-Ordner gefunden – bitte unten einen Ordner wählen.'; + } + var fp=document.getElementById('mystart-sync-folder-path'); + if(fp)fp.textContent=Y.path?('Ordner: '+Y.path+(Y.custom?'':' (automatisch, OneDrive)')):'Kein OneDrive-Ordner gefunden – bitte einen Ordner wählen.'; + var rs=document.getElementById('mystart-sync-folder-reset'); + if(rs)rs.style.display=Y.custom?'':'none'; } if(A.supported){ window.chrome.webview.addEventListener('message',function(ev){ - var d=ev.data;if(d&&d.type==='autostart'){A.enabled=!!d.enabled;paint();} + var d=ev.data;if(!d)return; + if(d.type==='autostart'){A.enabled=!!d.enabled;paint();} + else if(d.type==='sync-state'){Y.enabled=!!d.enabled;Y.available=!!d.available;Y.path=d.path||null;Y.custom=!!d.custom;paint();} }); } - function render(row){ + function mkToggle(row,prefix,label,hint,onClick){ var wrap=document.createElement('div'); + wrap.id=prefix+'-wrap'; wrap.style.cssText='display:flex;align-items:center;gap:10px;margin-top:18px;cursor:pointer;user-select:none;'; var track=document.createElement('div'); - track.id='mystart-autostart-track'; + track.id=prefix+'-track'; track.style.cssText='position:relative;width:46px;height:26px;border-radius:13px;background:#565d68;flex:0 0 auto;transition:background .15s;box-sizing:border-box;'; var knob=document.createElement('div'); - knob.id='mystart-autostart-knob'; + knob.id=prefix+'-knob'; knob.style.cssText='position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px rgba(0,0,0,.4);box-sizing:border-box;'; track.appendChild(knob); var txt=document.createElement('span'); - txt.textContent='Mit Windows starten (minimiert)'; + txt.textContent=label; if(!A.supported){wrap.style.opacity='0.5';wrap.style.cursor='default';wrap.title='Nur in der MyStart-App verfügbar.';} wrap.appendChild(track);wrap.appendChild(txt);row.appendChild(wrap); - paint(); - wrap.addEventListener('click',function(){ - if(!A.supported)return; + if(hint){ + var h=document.createElement('p'); + h.textContent=hint; + h.style.cssText='margin:6px 0 0 56px;font-size:12px;opacity:.65;'; + row.appendChild(h); + } + wrap.addEventListener('click',function(){if(A.supported)onClick();}); + } + function render(row){ + mkToggle(row,'mystart-autostart','Mit Windows starten (minimiert)',null,function(){ A.enabled=!A.enabled;paint(); try{window.chrome.webview.postMessage({type:'autostart-set',value:A.enabled});}catch(e){} }); - if(A.supported){try{window.chrome.webview.postMessage({type:'autostart-get'});}catch(e){}} + mkToggle(row,'mystart-sync','Zwischen PCs abgleichen (OneDrive)','Gleicht Lesezeichen und Reiter über einen synchronisierten Ordner ab, standardmäßig OneDrive. Auf jedem PC einzeln einschalten, und auf allen PCs denselben Ordner nutzen.',function(){ + if(!Y.available)return; + Y.enabled=!Y.enabled;paint(); + try{window.chrome.webview.postMessage({type:'sync-set',value:Y.enabled});}catch(e){} + }); + // Which folder the sync files go to: shown, plus pick another / go back to OneDrive. + var fr=document.createElement('div'); + fr.style.cssText='margin:8px 0 0 56px;font-size:12px;'; + var fpath=document.createElement('div'); + fpath.id='mystart-sync-folder-path'; + fpath.style.cssText='opacity:.75;word-break:break-all;'; + var fbtns=document.createElement('div'); + fbtns.style.cssText='display:flex;gap:8px;margin-top:6px;flex-wrap:wrap;'; + function mkBtn(text,id,type){ + var b=document.createElement('div'); + if(id)b.id=id; + b.textContent=text; + b.style.cssText='padding:5px 10px;border-radius:6px;background:rgba(128,128,128,.25);cursor:pointer;user-select:none;'; + b.onmouseenter=function(){b.style.background='rgba(128,128,128,.4)';}; + b.onmouseleave=function(){b.style.background='rgba(128,128,128,.25)';}; + b.addEventListener('click',function(){ + if(!A.supported)return; + try{window.chrome.webview.postMessage({type:type});}catch(e){} + }); + return b; + } + fbtns.appendChild(mkBtn('Ordner wählen…',null,'sync-browse')); + fbtns.appendChild(mkBtn('Automatisch (OneDrive)','mystart-sync-folder-reset','sync-folder-reset')); + fr.appendChild(fpath);fr.appendChild(fbtns);row.appendChild(fr); + paint(); + if(A.supported){ + try{window.chrome.webview.postMessage({type:'autostart-get'});}catch(e){} + try{window.chrome.webview.postMessage({type:'sync-get'});}catch(e){} + } } function ensure(){ var row=document.getElementById('mystart-autostart-row'); @@ -361,19 +420,28 @@ const profilesJs = `(function(){ }catch(e){return false;} }; var syncDot; + var lastSync=null; // last status from the host, so a re-rendered dot isn't blank + function paintSyncDot(){ + if(!syncDot)return; + // Sync is opt-in: no dot at all until it's switched on (Einstellungen -> MyStart). + if(!lastSync||lastSync.enabled===false){syncDot.style.display='none';return;} + syncDot.style.display=''; + syncDot.style.background=lastSync.ok?'#2ea043':'#e8b923'; + syncDot.title=lastSync.ok?('OneDrive-Sync: '+lastSync.message):('OneDrive-Sync-Problem: '+lastSync.message); + } function mkSyncDot(){ var d=document.createElement('div'); d.style.cssText='width:8px;height:8px;border-radius:50%;background:#565d68;margin-left:6px;flex:0 0 auto;'; - d.title='OneDrive-Sync: noch kein Status'; syncDot=d; + paintSyncDot(); return d; } if(window.chrome&&window.chrome.webview){ window.chrome.webview.addEventListener('message',function(ev){ var d=ev.data; - if(!d||d.type!=='sync-status'||!syncDot)return; - syncDot.style.background=d.ok?'#2ea043':'#e8b923'; - syncDot.title=d.ok?('OneDrive-Sync: '+d.message):('OneDrive-Sync-Problem: '+d.message); + if(!d||d.type!=='sync-status')return; + lastSync=d; + paintSyncDot(); }); } var bar;