Notepad/enter/.obsidian/plugins/sliding-panes-obsidian/main.js

688 lines
124 KiB
JavaScript
Raw Permalink Normal View History

2023-07-05 18:29:11 +00:00
'use strict';
var obsidian = require('obsidian');
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
var SlidingPanesSettings = /** @class */ (function () {
function SlidingPanesSettings() {
this.headerWidth = 32;
this.leafDesktopWidth = 700;
this.leafMobileWidth = 350;
this.leafAutoWidth = false;
this.disabled = false;
this.rotateHeaders = true;
this.headerAlt = false;
this.orienation = "mixed";
this.stackingEnabled = true;
this.smoothAnimation = true;
}
return SlidingPanesSettings;
}());
var SlidingPanesSettingTab = /** @class */ (function (_super) {
__extends(SlidingPanesSettingTab, _super);
function SlidingPanesSettingTab(app, plugin) {
var _this = _super.call(this, app, plugin) || this;
_this.plugin = plugin;
return _this;
}
SlidingPanesSettingTab.prototype.display = function () {
var _this = this;
var containerEl = this.containerEl;
containerEl.empty();
new obsidian.Setting(containerEl)
.setName("Toggle Sliding Panes")
.setDesc("Turns sliding panes on or off globally")
.addToggle(function (toggle) { return toggle.setValue(!_this.plugin.settings.disabled)
.onChange(function (value) {
_this.plugin.settings.disabled = !value;
_this.plugin.saveData(_this.plugin.settings);
if (_this.plugin.settings.disabled) {
_this.plugin.disable();
}
else {
_this.plugin.enable();
}
}); });
new obsidian.Setting(containerEl)
.setName('Smooth Animation')
.setDesc('Whether to use smooth animation (on) or snapping (off)')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.smoothAnimation)
.onChange(function (value) {
_this.plugin.settings.smoothAnimation = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Leaf Auto Width')
.setDesc('If on, the width of the pane should fill the available space')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.leafAutoWidth)
.onChange(function (value) {
_this.plugin.settings.leafAutoWidth = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Leaf Width on Desktop')
.setDesc('The width of a single pane (only if auto width is off)')
.addText(function (text) { return text.setPlaceholder('Example: 700')
.setValue((_this.plugin.settings.leafDesktopWidth || '') + '')
.onChange(function (value) {
_this.plugin.settings.leafDesktopWidth = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Leaf Width on Mobile')
.setDesc('The width of a single pane (only if auto width is off)')
.addText(function (text) { return text.setPlaceholder('Example: 350')
.setValue((_this.plugin.settings.leafMobileWidth || '') + '')
.onChange(function (value) {
_this.plugin.settings.leafMobileWidth = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName("Toggle rotated headers")
.setDesc("Rotates headers to use as spines")
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.rotateHeaders)
.onChange(function (value) {
_this.plugin.settings.rotateHeaders = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName("Swap rotated header direction")
.setDesc("Swaps the direction of rotated headers")
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.headerAlt)
.onChange(function (value) {
_this.plugin.settings.headerAlt = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName("Header text orientation")
.setDesc("Select the header text orientation")
.addDropdown(function (dropdown) {
dropdown.addOption("sideway", "Sideway");
dropdown.addOption("mixed", "Mixed");
dropdown.addOption("upright", "Upright");
dropdown.setValue(_this.plugin.settings.orienation);
dropdown.onChange(function (value) {
_this.plugin.settings.orienation = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
});
});
new obsidian.Setting(containerEl)
.setName("Toggle stacking")
.setDesc("Panes will stack up to the left and right")
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.stackingEnabled)
.onChange(function (value) {
_this.plugin.settings.stackingEnabled = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Spine Width')
.setDesc('The width of the rotated header (or gap) for stacking')
.addText(function (text) { return text.setPlaceholder('Example: 32')
.setValue((_this.plugin.settings.headerWidth || '') + '')
.onChange(function (value) {
_this.plugin.settings.headerWidth = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
};
return SlidingPanesSettingTab;
}(obsidian.PluginSettingTab));
var SlidingPanesCommands = /** @class */ (function () {
function SlidingPanesCommands(plugin) {
this.plugin = plugin;
}
SlidingPanesCommands.prototype.addToggleSettingCommand = function (id, name, settingName) {
var _this = this;
this.plugin.addCommand({
id: id,
name: name,
callback: function () {
// switch the setting, save and refresh
//@ts-ignore
_this.plugin.settings[settingName] = !_this.plugin.settings[settingName];
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}
});
};
SlidingPanesCommands.prototype.addCommands = function () {
var _this = this;
// add the toggle on/off command
this.plugin.addCommand({
id: 'toggle-sliding-panes',
name: 'Toggle Sliding Panes',
callback: function () {
// switch the disabled setting and save
_this.plugin.settings.disabled = !_this.plugin.settings.disabled;
_this.plugin.saveData(_this.plugin.settings);
// disable or enable as necessary
_this.plugin.settings.disabled ? _this.plugin.disable() : _this.plugin.enable();
}
});
// add a command to toggle smooth animation
this.addToggleSettingCommand('toggle-sliding-panes-smooth-animation', 'Toggle Smooth Animation', 'smoothAnimation');
// add a command to toggle leaf auto width
this.addToggleSettingCommand('toggle-sliding-panes-leaf-auto-width', 'Toggle Leaf Auto Width', 'leafAutoWidth');
// add a command to toggle stacking
this.addToggleSettingCommand('toggle-sliding-panes-stacking', 'Toggle Stacking', 'stackingEnabled');
// add a command to toggle rotated headers
this.addToggleSettingCommand('toggle-sliding-panes-rotated-headers', 'Toggle Rotated Headers', 'rotateHeaders');
// add a command to toggle swapped header direction
this.addToggleSettingCommand('toggle-sliding-panes-header-alt', 'Swap rotated header direction', 'headerAlt');
};
return SlidingPanesCommands;
}());
var PluginBase = /** @class */ (function (_super) {
__extends(PluginBase, _super);
function PluginBase() {
var _this = _super !== null && _super.apply(this, arguments) || this;
// runs when the plugin is loaded
_this.onload = function () {
// add in the required command pallete commands
_this.addCommands();
// add in any settings
_this.addSettings();
// wait for layout to be ready to perform the rest
_this.app.workspace.onLayoutReady(_this.onLayoutReady);
};
// runs when the plugin is onloaded
_this.onunload = function () {
// run through the disable steps
_this.disable();
};
// runs once the layout is ready the first time the plugin is started
_this.onLayoutReady = function () {
_this.enable();
};
// perform any setup required to enable the plugin
_this.enable = function () {
document.body.toggleClass(_this.className, true);
};
// perform any required disable steps, leave nothing behind
_this.disable = function () {
document.body.toggleClass(_this.className, false);
};
// add in any required command pallete commands
_this.addCommands = function () { };
// add in any settings
_this.addSettings = function () { };
return _this;
}
Object.defineProperty(PluginBase.prototype, "className", {
get: function () {
if (!this._cachedClassName) {
this._cachedClassName = 'plugin-' + this.manifest.id;
if (this._cachedClassName.endsWith('-obsidian')) {
this._cachedClassName = this._cachedClassName.substring(0, this._cachedClassName.lastIndexOf('-obsidian'));
}
}
return this._cachedClassName;
},
enumerable: false,
configurable: true
});
return PluginBase;
}(obsidian.Plugin));
var MIN_PANE_WIDTH = 200;
var SlidingPanesPlugin = /** @class */ (function (_super) {
__extends(SlidingPanesPlugin, _super);
function SlidingPanesPlugin() {
var _this = _super !== null && _super.apply(this, arguments) || this;
// helper variables
_this.activeLeafIndex = 0;
_this.prevRootLeaves = [];
// runs when the plugin is loaded
_this.onload = function () { return __awaiter(_this, void 0, void 0, function () {
var _a, _b, _c, _d;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
// load settings
_a = this;
_c = (_b = Object).assign;
_d = [new SlidingPanesSettings()];
return [4 /*yield*/, this.loadData()];
case 1:
// load settings
_a.settings = _c.apply(_b, _d.concat([_e.sent()]));
// add in the required command pallete commands
this.addCommands();
// add in any settings
this.addSettings();
// wait for layout to be ready to perform the rest
this.app.workspace.onLayoutReady(this.onLayoutReady);
return [2 /*return*/];
}
});
}); };
// add in any required command pallete commands
_this.addCommands = function () {
// add the commands
new SlidingPanesCommands(_this).addCommands();
};
// add in any settings
_this.addSettings = function () {
// add the settings tab
_this.addSettingTab(new SlidingPanesSettingTab(_this.app, _this));
};
// enable andy mode
_this.enable = function () {
var _a;
if (!((_a = _this.settings) === null || _a === void 0 ? void 0 : _a.disabled)) {
// add the event handlers
_this.registerEvent(_this.app.workspace.on('resize', _this.handleResize));
_this.registerEvent(_this.app.workspace.on('layout-change', _this.handleLayoutChange));
_this.registerEvent(_this.app.workspace.on('active-leaf-change', _this.handleActiveLeafChange));
_this.registerEvent(_this.app.workspace.on('window-open', _this.handleWindowOpen));
_this.registerEvent(_this.app.vault.on('delete', _this.handleDelete));
// wait for layout to be ready to perform the rest
if (_this.app.workspace.layoutReady)
_this.reallyEnable();
}
};
_this.handleWindowOpen = function (window) {
_this.swizzleChildResize(window);
};
// really enable things (once the layout is ready)
_this.reallyEnable = function () {
// we don't need the event handler anymore
_this.app.workspace.off('layout-ready', _this.reallyEnable);
// add some extra classes that can't fit in the styles.css
// because they use settings
_this.addStyle();
// get and loop through the root splits (there may be more than one if using popout windows)
var rootSplits = _this.getRootSplits();
rootSplits.forEach(function (rootSplit) {
_this.swizzleChildResize(rootSplit);
});
// do all the calucations necessary for the workspace leaves
_this.recalculateLeaves();
};
// shut down andy mode
_this.disable = function () {
// get rid of the extra style tag we added
_this.removeStyle();
// get and loop through the root splits (there may be more than one if using popout windows)
var rootSplits = _this.getRootSplits();
rootSplits.forEach(function (rootSplit) {
_this.unswizzleChildResize(rootSplit);
var rootLeaves = rootSplit.children;
// loop through all the leaves
rootLeaves.forEach(_this.clearLeaf);
});
_this.app.workspace.off('resize', _this.handleResize);
_this.app.workspace.off('layout-change', _this.handleLayoutChange);
_this.app.workspace.off('active-leaf-change', _this.handleActiveLeafChange);
_this.app.workspace.off('window-open', _this.handleWindowOpen);
_this.app.vault.off('delete', _this.handleDelete);
};
_this.clearLeaf = function (leaf) {
leaf.containerEl.style.width = null;
leaf.containerEl.style.left = null;
leaf.containerEl.style.right = null;
leaf.containerEl.style.flex = null;
leaf.containerEl.style.flexGrow = leaf.dimension;
leaf.containerEl.classList.remove('mod-am-left-of-active');
leaf.containerEl.classList.remove('mod-am-right-of-active');
var iconEl = leaf.view.iconEl;
var iconText = iconEl.getAttribute("aria-label");
if (iconText.includes("(")) {
iconEl.setAttribute("aria-label", iconText.substring(iconText.lastIndexOf('(') + 1, iconText.lastIndexOf(')')));
}
};
// refresh funcion for when we change settings
_this.refresh = function () {
// re-load the style
_this.updateStyle();
// recalculate leaf positions
_this.recalculateLeaves();
};
// remove the stlying elements we've created
_this.removeStyle = function () {
var el = document.getElementById('plugin-sliding-panes');
if (el)
el.remove();
document.body.classList.remove('plugin-sliding-panes');
document.body.classList.remove('plugin-sliding-panes-rotate-header');
document.body.classList.remove('plugin-sliding-panes-header-alt');
document.body.classList.remove('plugin-sliding-panes-stacking');
};
// add the styling elements we need
_this.addStyle = function () {
// add a css block for our settings-dependent styles
var css = document.createElement('style');
css.id = 'plugin-sliding-panes';
document.getElementsByTagName("head")[0].appendChild(css);
// add the main class
document.body.classList.add('plugin-sliding-panes');
// update the style with the settings-dependent styles
_this.updateStyle();
};
// update the styles (at the start, or as the result of a settings change)
_this.updateStyle = function () {
// if we've got rotate headers on, add the class which enables it
document.body.classList.toggle('plugin-sliding-panes-rotate-header', _this.settings.rotateHeaders);
document.body.classList.toggle('plugin-sliding-panes-header-alt', _this.settings.headerAlt);
// do the same for stacking
document.body.classList.toggle('plugin-sliding-panes-stacking', _this.settings.stackingEnabled);
// get the custom css element
var el = document.getElementById('plugin-sliding-panes');
if (!el)
throw "plugin-sliding-panes element not found!";
else {
// set the settings-dependent css
el.innerText = "body.plugin-sliding-panes{--header-width:".concat(_this.settings.headerWidth, "px;}");
if (!_this.settings.leafAutoWidth) {
if (obsidian.Platform.isDesktop) {
el.innerText += "body.plugin-sliding-panes .mod-root>.workspace-leaf,body.plugin-sliding-panes .mod-root>.workspace-split{width:".concat(_this.settings.leafDesktopWidth + _this.settings.headerWidth, "px;}");
}
else {
el.innerText += "body.plugin-sliding-panes .mod-root>.workspace-leaf,body.plugin-sliding-panes .mod-root>.workspace-split{width:".concat(_this.settings.leafMobileWidth + _this.settings.headerWidth, "px;}");
}
}
}
if (_this.settings.rotateHeaders) {
_this.selectOrientation(_this.settings.orienation);
}
};
_this.handleResize = function () {
if (_this.app.workspace.layoutReady) {
_this.recalculateLeaves();
}
};
_this.handleLayoutChange = function () {
// get and loop through the root splits (there may be more than one if using popout windows)
var rootSplits = _this.getRootSplits();
var rootLeaves = [];
rootSplits.forEach(function (rootSplit) {
rootLeaves.push.apply(rootLeaves, rootSplit.children);
});
if (rootLeaves.length < _this.prevRootLeaves.length) {
_this.prevRootLeaves.forEach(function (leaf) {
if (!rootLeaves.contains(leaf)) {
_this.clearLeaf(leaf);
}
});
}
_this.prevRootLeaves = rootLeaves;
//this.recalculateLeaves();
};
_this.unswizzleChildResize = function (rootSplit) {
rootSplit.onChildResizeStart = rootSplit.oldChildResizeStart;
};
_this.swizzleChildResize = function (rootSplit) {
rootSplit.oldChildResizeStart = rootSplit.onChildResizeStart;
rootSplit.onChildResizeStart = function (leaf, event) {
// only really apply this to vertical splits
if (rootSplit.direction === "vertical") {
// this is the width the leaf started at before resize
var startWidth_1 = leaf.width;
// the mousemove event to trigger while resizing
var mousemove_1 = function (e) {
// get the difference between the first position and current
var deltaX = e.pageX - event.pageX;
// adjust the start width by the delta
leaf.width = startWidth_1 + deltaX;
if (leaf.width < MIN_PANE_WIDTH)
leaf.width = MIN_PANE_WIDTH;
leaf.containerEl.style.width = leaf.width + "px";
};
// the mouseup event to trigger at the end of resizing
var mouseup_1 = function () {
// if stacking is enabled, we need to re-jig the "right" value
if (_this.settings.stackingEnabled) {
// we need the leaf count and index to calculate the correct value
var rootLeaves = rootSplit.children;
var leafCount = rootLeaves.length;
var leafIndex = rootLeaves.findIndex(function (l) { return l == leaf; });
for (var i = leafIndex; i < leafCount; i++) {
rootLeaves[i].containerEl.style.right = (((leafCount - i) * _this.settings.headerWidth) - rootLeaves[i].width) + "px";
}
}
// remove these event listeners. We're done with them
rootSplit.doc.removeEventListener("mousemove", mousemove_1);
rootSplit.doc.removeEventListener("mouseup", mouseup_1);
document.body.removeClass("is-grabbing");
};
// Add the above two event listeners
rootSplit.doc.addEventListener("mousemove", mousemove_1);
rootSplit.doc.addEventListener("mouseup", mouseup_1);
document.body.addClass("is-grabbing");
}
};
};
// Recalculate the leaf sizing and positions
_this.recalculateLeaves = function () {
var activeLeaf = _this.app.workspace.getLeaf();
// get and loop through the root splits (there may be more than one if using popout windows)
var rootSplits = _this.getRootSplits();
rootSplits.forEach(function (rootSplit) {
var rootContainerEl = rootSplit.containerEl;
// get the client width of the root container once, before looping through the leaves
var rootContainerElWidth = rootContainerEl.clientWidth;
var rootLeaves = rootSplit.children;
var leafCount = rootLeaves.length;
var leafWidth = _this.settings.leafAutoWidth
? (rootContainerElWidth - ((leafCount - 1) * _this.settings.headerWidth))
: (obsidian.Platform.isDesktop ? _this.settings.leafDesktopWidth : _this.settings.leafMobileWidth);
var totalWidthEstimate = leafCount * leafWidth;
var widthChange = false;
// loop through all the leaves
rootLeaves.forEach(function (leaf, i) {
var containerEl = leaf.containerEl;
// the default values for the leaf
var flex = '1 0 0';
var width = leaf.width;
// if the leaf was previously "flex", then the width will be out of whack
if (containerEl.style.flexBasis)
width = leafWidth;
var left = null;
var right = null;
if (totalWidthEstimate > rootContainerElWidth) {
// if the total width is greater than the root container width, we need to limit the leaves
flex = null;
if (!width)
width = leafWidth;
if (_this.settings.stackingEnabled) {
// if stacking is enabled, we need to set the left and right values
left = (i * _this.settings.headerWidth) + "px";
right = (((leafCount - i) * _this.settings.headerWidth) - leafWidth) + "px";
}
}
// set the html attributes for the leaf (if they have changed)
if (containerEl.style.flex != flex || containerEl.style.width != width + "px" || containerEl.style.left != left || containerEl.style.right != right) {
widthChange = containerEl.style.width != width + "px";
var style = { flex: flex, left: left, right: right, width: width + "px" };
Object.assign(containerEl.style, style);
}
// set the leaf's width for later reference
leaf.width = width;
if (leaf instanceof obsidian.WorkspaceLeaf) {
var iconEl = leaf.view.iconEl;
var iconText = iconEl.getAttribute("aria-label");
if (!iconText.includes("(")) {
iconEl.setAttribute("aria-label", "".concat(leaf.getDisplayText(), " (").concat(iconText, ")"));
}
}
});
// if the active leaf is in the current container, and the width has changed, refocus the active leaf
if (activeLeaf.getContainer() === rootSplit && widthChange)
_this.focusLeaf(activeLeaf, !_this.settings.leafAutoWidth);
});
};
_this.handleActiveLeafChange = function (leaf) {
if (leaf) {
_this.focusLeaf(leaf);
}
};
// hande when a file is deleted
_this.handleDelete = function (file) {
// close any leaves with the deleted file open
// detaching a leaf while iterating messes with the iteration
var leavesToDetach = [];
_this.app.workspace.iterateRootLeaves(function (leaf) {
if (leaf.view instanceof obsidian.FileView && leaf.view.file == file) {
leavesToDetach.push(leaf);
}
});
leavesToDetach.forEach(function (leaf) { return leaf.detach(); });
};
_this.getRootSplits = function () {
var rootSplits = [];
// push the main window's root split to the list
rootSplits.push(_this.app.workspace.rootSplit);
var floatingSplit = _this.app.workspace.floatingSplit;
floatingSplit.children.forEach(function (child) {
// if this is a window, push it to the list
if (child instanceof obsidian.WorkspaceWindow) {
rootSplits.push(child);
}
});
return rootSplits;
};
return _this;
}
SlidingPanesPlugin.prototype.selectOrientation = function (orient) {
document.body.classList.toggle('plugin-sliding-select-orientation-mixed', orient == 'mixed');
document.body.classList.toggle('plugin-sliding-select-orientation-upright', orient == 'upright');
document.body.classList.toggle('plugin-sliding-select-orientation-sideway', orient == 'sideway');
};
SlidingPanesPlugin.prototype.focusLeaf = function (activeLeaf, animated) {
var _this = this;
if (animated === void 0) { animated = true; }
var rootSplit = activeLeaf.getContainer();
while (activeLeaf != null && activeLeaf.parentSplit != null && activeLeaf.parentSplit !== rootSplit) {
activeLeaf = activeLeaf.parentSplit;
}
if (activeLeaf != null && activeLeaf.parentSplit != null && activeLeaf.parentSplit === rootSplit) {
var rootContainerEl = rootSplit.containerEl;
var rootLeaves = rootSplit.children;
var leafCount = rootLeaves.length;
// get the index of the active leaf
// also, get the position of this leaf, so we can scroll to it
// as leaves are resizable, we have to iterate through all leaves to the
// left until we get to the active one and add all their widths together
var position_1 = 0;
this.activeLeafIndex = -1;
rootLeaves.forEach(function (leaf, index) {
var containerEl = leaf.containerEl;
// this is the active one
if (leaf == activeLeaf) {
_this.activeLeafIndex = index;
containerEl.classList.remove('mod-am-left-of-active');
containerEl.classList.remove('mod-am-right-of-active');
}
else if (_this.activeLeafIndex == -1 || index < _this.activeLeafIndex) {
// this is before the active one, add the width
position_1 += containerEl.clientWidth;
containerEl.classList.add('mod-am-left-of-active');
containerEl.classList.remove('mod-am-right-of-active');
}
else {
// this is right of the active one
containerEl.classList.remove('mod-am-left-of-active');
containerEl.classList.add('mod-am-right-of-active');
}
});
// get this leaf's left value (the amount of space to the left for sticky headers)
var left = parseInt(activeLeaf.containerEl.style.left) || 0;
// the amount of space to the right we need to leave for sticky headers
var headersToRightWidth = this.settings.stackingEnabled ? (leafCount - this.activeLeafIndex - 1) * this.settings.headerWidth : 0;
// determine whether to request 'smooth' animations or 'auto' snap
var behavior = animated && this.settings.smoothAnimation ? 'smooth' : 'auto';
// it's too far left
if (rootContainerEl.scrollLeft > position_1 - left) {
// scroll the left side of the pane into view
rootContainerEl.scrollTo({ left: position_1 - left, top: 0, behavior: behavior });
}
// it's too far right
else if (rootContainerEl.scrollLeft + rootContainerEl.clientWidth < position_1 + activeLeaf.containerEl.clientWidth + headersToRightWidth) {
// scroll the right side of the pane into view
rootContainerEl.scrollTo({ left: position_1 + activeLeaf.containerEl.clientWidth + headersToRightWidth - rootContainerEl.clientWidth, top: 0, behavior: behavior });
}
}
};
return SlidingPanesPlugin;
}(PluginBase));
module.exports = SlidingPanesPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9wbHVnaW4tYmFzZS50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0