Add .config/DankMaterialShell/plugin_settings.json Add .config/DankMaterialShell/plugins/calculator/CalculatorLauncher.qml Add .config/DankMaterialShell/plugins/calculator/CalculatorSettings.qml Add .config/DankMaterialShell/plugins/calculator/README.md Add .config/DankMaterialShell/plugins/calculator/calculator.js Add .config/DankMaterialShell/plugins/calculator/.git/HEAD Add .config/DankMaterialShell/plugins/calculator/.git/config Add .config/DankMaterialShell/plugins/calculator/.git/index Add .config/DankMaterialShell/plugins/calculator/.git/objects/info/.keep Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.idx Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.rev Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.pack Add .config/DankMaterialShell/plugins/calculator/.git/refs/heads/main Add .config/DankMaterialShell/plugins/calculator/.git/refs/remotes/origin/main Add .config/DankMaterialShell/plugins/calculator/.git/refs/remotes/origin/qalc Add .config/DankMaterialShell/plugins/calculator/.git/refs/tags/.keep Add .config/DankMaterialShell/plugins/calculator/plugin.json Add .config/DankMaterialShell/plugins/calculator/screenshot.png Add .config/DankMaterialShell/plugins/calculator/test_precision.js Add .config/DankMaterialShell/plugins/calculator/test_single.js Add .config/DankMaterialShell/plugins/commandRunner/CommandRunner.qml Add .config/DankMaterialShell/plugins/commandRunner/CommandRunnerSettings.qml Add .config/DankMaterialShell/plugins/commandRunner/LICENSE Add .config/DankMaterialShell/plugins/commandRunner/README.md Add .config/DankMaterialShell/plugins/commandRunner/.git/HEAD Add .config/DankMaterialShell/plugins/commandRunner/.git/config Add .config/DankMaterialShell/plugins/commandRunner/.git/index Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/info/.keep Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.idx Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.rev Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.pack Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/heads/main Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/remotes/origin/main Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/tags/.keep Add .config/DankMaterialShell/plugins/commandRunner/plugin.json Add .config/DankMaterialShell/plugins/commandRunner/screenshot.png Add .config/DankMaterialShell/plugins/dankActions.meta Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/DankActionsSettings.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/DankActionsWidget.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/plugin.json Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/DankBatteryAlerts.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/DankBatteryAlertsSettings.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/plugin.json Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/DankHooks.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/DankHooksSettings.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/README.md Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/plugin.json Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/DankPomodoroSettings.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/DankPomodoroWidget.qml Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/plugin.json Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/LICENSE Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/README.md Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/HEAD Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/config Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/index Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/info/.keep Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.idx Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.rev Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.pack Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/heads/master Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/remotes/origin/master Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/tags/.keep Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.gitignore Add .config/DankMaterialShell/plugins/emojiLauncher/EmojiLauncher.qml Add .config/DankMaterialShell/plugins/emojiLauncher/EmojiLauncherSettings.qml Add .config/DankMaterialShell/plugins/emojiLauncher/LICENSE Add .config/DankMaterialShell/plugins/emojiLauncher/README.md Add .config/DankMaterialShell/plugins/emojiLauncher/catalog.js Add .config/DankMaterialShell/plugins/emojiLauncher/data/emojis.txt Add .config/DankMaterialShell/plugins/emojiLauncher/data/math.txt Add .config/DankMaterialShell/plugins/emojiLauncher/data/nerdfont.txt Add .config/DankMaterialShell/plugins/emojiLauncher/.git/HEAD Add .config/DankMaterialShell/plugins/emojiLauncher/.git/config Add .config/DankMaterialShell/plugins/emojiLauncher/.git/index Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/info/.keep Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.idx Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.rev Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.pack Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/heads/main Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/remotes/origin/main Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/tags/.keep Add .config/DankMaterialShell/plugins/emojiLauncher/plugin.json Add .config/DankMaterialShell/plugins/emojiLauncher/screenshot.png Add .config/DankMaterialShell/plugins/emojiLauncher/scripts/generate_catalog.py Add .config/DankMaterialShell/plugins/dankActions Add .config/DankMaterialShell/plugins/webSearch/LICENSE Add .config/DankMaterialShell/plugins/webSearch/README.md Add .config/DankMaterialShell/plugins/webSearch/WebSearch.qml Add .config/DankMaterialShell/plugins/webSearch/WebSearchSettings.qml Add .config/DankMaterialShell/plugins/webSearch/.git/HEAD Add .config/DankMaterialShell/plugins/webSearch/.git/config Add .config/DankMaterialShell/plugins/webSearch/.git/index Add .config/DankMaterialShell/plugins/webSearch/.git/objects/info/.keep Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.idx Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.rev Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.pack Add .config/DankMaterialShell/plugins/webSearch/.git/refs/heads/main Add .config/DankMaterialShell/plugins/webSearch/.git/refs/remotes/origin/main Add .config/DankMaterialShell/plugins/webSearch/.git/refs/tags/.keep Add .config/DankMaterialShell/plugins/webSearch/plugin.json Add .config/DankMaterialShell/plugins/webSearch/screenshot.png Add .config/DankMaterialShell/settings.json
352 lines
11 KiB
QML
352 lines
11 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import qs.Services
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property var pluginService: null
|
|
property string trigger: "?"
|
|
property var searchEngines: []
|
|
property string defaultEngine: "google"
|
|
|
|
signal itemsChanged()
|
|
|
|
property var builtInEngines: [
|
|
{
|
|
id: "google",
|
|
name: "Google",
|
|
icon: "material:travel_explore",
|
|
url: "https://www.google.com/search?q=%s",
|
|
keywords: ["google", "search"]
|
|
},
|
|
{
|
|
id: "duckduckgo",
|
|
name: "DuckDuckGo",
|
|
icon: "material:shield",
|
|
url: "https://duckduckgo.com/?q=%s",
|
|
keywords: ["ddg", "duckduckgo", "privacy"]
|
|
},
|
|
{
|
|
id: "brave",
|
|
name: "Brave Search",
|
|
icon: "material:security",
|
|
url: "https://search.brave.com/search?q=%s",
|
|
keywords: ["brave", "privacy"]
|
|
},
|
|
{
|
|
id: "bing",
|
|
name: "Bing",
|
|
icon: "material:language",
|
|
url: "https://www.bing.com/search?q=%s",
|
|
keywords: ["bing", "microsoft"]
|
|
},
|
|
{
|
|
id: "youtube",
|
|
name: "YouTube",
|
|
icon: "material:youtube_activity",
|
|
url: "https://www.youtube.com/results?search_query=%s",
|
|
keywords: ["youtube", "video", "yt"]
|
|
},
|
|
{
|
|
id: "github",
|
|
name: "GitHub",
|
|
icon: "unicode:",
|
|
url: "https://github.com/search?q=%s",
|
|
keywords: ["github", "code", "git"]
|
|
},
|
|
{
|
|
id: "stackoverflow",
|
|
name: "Stack Overflow",
|
|
icon: "unicode:",
|
|
url: "https://stackoverflow.com/search?q=%s",
|
|
keywords: ["stackoverflow", "stack", "coding"]
|
|
},
|
|
{
|
|
id: "reddit",
|
|
name: "Reddit",
|
|
icon: "unicode:",
|
|
url: "https://www.reddit.com/search?q=%s",
|
|
keywords: ["reddit"]
|
|
},
|
|
{
|
|
id: "wikipedia",
|
|
name: "Wikipedia",
|
|
icon: "material:menu_book",
|
|
url: "https://en.wikipedia.org/wiki/Special:Search?search=%s",
|
|
keywords: ["wikipedia", "wiki"]
|
|
},
|
|
{
|
|
id: "amazon",
|
|
name: "Amazon",
|
|
icon: "material:shopping_cart",
|
|
url: "https://www.amazon.com/s?k=%s",
|
|
keywords: ["amazon", "shop", "shopping"]
|
|
},
|
|
{
|
|
id: "ebay",
|
|
name: "eBay",
|
|
icon: "material:local_mall",
|
|
url: "https://www.ebay.com/sch/i.html?_nkw=%s",
|
|
keywords: ["ebay", "shop", "auction"]
|
|
},
|
|
{
|
|
id: "maps",
|
|
name: "Google Maps",
|
|
icon: "material:map",
|
|
url: "https://www.google.com/maps/search/%s",
|
|
keywords: ["maps", "location", "directions"]
|
|
},
|
|
{
|
|
id: "images",
|
|
name: "Google Images",
|
|
icon: "material:photo_library",
|
|
url: "https://www.google.com/search?tbm=isch&q=%s",
|
|
keywords: ["images", "pictures", "photos"]
|
|
},
|
|
{
|
|
id: "twitter",
|
|
name: "Twitter/X",
|
|
icon: "unicode:",
|
|
url: "https://twitter.com/search?q=%s",
|
|
keywords: ["twitter", "x", "social"]
|
|
},
|
|
{
|
|
id: "linkedin",
|
|
name: "LinkedIn",
|
|
icon: "unicode:",
|
|
url: "https://www.linkedin.com/search/results/all/?keywords=%s",
|
|
keywords: ["linkedin", "job", "professional"]
|
|
},
|
|
{
|
|
id: "imdb",
|
|
name: "IMDb",
|
|
icon: "unicode:",
|
|
url: "https://www.imdb.com/find?q=%s",
|
|
keywords: ["imdb", "movies", "tv"]
|
|
},
|
|
{
|
|
id: "translate",
|
|
name: "Google Translate",
|
|
icon: "material:g_translate",
|
|
url: "https://translate.google.com/?text=%s",
|
|
keywords: ["translate", "translation"]
|
|
},
|
|
{
|
|
id: "archlinux",
|
|
name: "Arch Linux Wiki",
|
|
icon: "material:terminal",
|
|
url: "https://wiki.archlinux.org/index.php?search=%s",
|
|
keywords: ["arch", "linux", "packages"]
|
|
},
|
|
{
|
|
id: "aur",
|
|
name: "AUR",
|
|
icon: "unicode:",
|
|
url: "https://aur.archlinux.org/packages?K=%s",
|
|
keywords: ["aur", "arch", "packages"]
|
|
},
|
|
{
|
|
id: "npmjs",
|
|
name: "npm",
|
|
icon: "unicode:",
|
|
url: "https://www.npmjs.com/search?q=%s",
|
|
keywords: ["npm", "node", "javascript"]
|
|
},
|
|
{
|
|
id: "pypi",
|
|
name: "PyPI",
|
|
icon: "unicode:",
|
|
url: "https://pypi.org/search/?q=%s",
|
|
keywords: ["pypi", "python", "pip"]
|
|
},
|
|
{
|
|
id: "crates",
|
|
name: "crates.io",
|
|
icon: "material:inventory_2",
|
|
url: "https://crates.io/search?q=%s",
|
|
keywords: ["crates", "rust", "cargo"]
|
|
},
|
|
{
|
|
id: "mdn",
|
|
name: "MDN Web Docs",
|
|
icon: "material:code_blocks",
|
|
url: "https://developer.mozilla.org/en-US/search?q=%s",
|
|
keywords: ["mdn", "mozilla", "web", "docs"]
|
|
}
|
|
]
|
|
|
|
Component.onCompleted: {
|
|
loadSettings()
|
|
}
|
|
|
|
onPluginServiceChanged: {
|
|
if (pluginService) {
|
|
loadSettings()
|
|
}
|
|
}
|
|
|
|
function loadSettings() {
|
|
if (pluginService) {
|
|
trigger = pluginService.loadPluginData("webSearch", "trigger", "?")
|
|
defaultEngine = pluginService.loadPluginData("webSearch", "defaultEngine", "google")
|
|
searchEngines = pluginService.loadPluginData("webSearch", "searchEngines", [])
|
|
}
|
|
}
|
|
|
|
function getItems(query) {
|
|
const items = []
|
|
const allEngines = builtInEngines.concat(searchEngines)
|
|
|
|
if (!query || query.trim().length === 0) {
|
|
items.push({
|
|
name: "Type a search query",
|
|
icon: "unicode:🔍",
|
|
comment: "Search the web with your default engine (" + getEngineName(defaultEngine) + ")",
|
|
action: "noop",
|
|
categories: ["Web Search"]
|
|
})
|
|
|
|
for (let i = 0; i < allEngines.length; i++) {
|
|
const engine = allEngines[i]
|
|
items.push({
|
|
name: engine.name,
|
|
icon: engine.icon || "unicode:🔍",
|
|
comment: engine.keywords ? engine.keywords.join(", ") : "Search engine",
|
|
action: "noop",
|
|
categories: ["Web Search"]
|
|
})
|
|
}
|
|
|
|
return items
|
|
}
|
|
|
|
let matchedEngineId = null
|
|
let searchQuery = query.trim()
|
|
let fallbackQuery = query.trim()
|
|
|
|
for (let i = 0; i < allEngines.length; i++) {
|
|
const engine = allEngines[i]
|
|
if (engine.keywords) {
|
|
for (let k = 0; k < engine.keywords.length; k++) {
|
|
const keyword = engine.keywords[k]
|
|
if (searchQuery.toLowerCase().startsWith(keyword + " ")) {
|
|
matchedEngineId = engine.id
|
|
searchQuery = searchQuery.substring(keyword.length + 1).trim()
|
|
break
|
|
}
|
|
}
|
|
if (matchedEngineId) break
|
|
}
|
|
}
|
|
|
|
const primaryEngineId = matchedEngineId || defaultEngine
|
|
const primaryEngineObj = allEngines.find(e => e.id === primaryEngineId)
|
|
|
|
if (primaryEngineObj) {
|
|
items.push({
|
|
name: "Search with " + primaryEngineObj.name + ": " + searchQuery,
|
|
icon: primaryEngineObj.icon || "unicode:🔍",
|
|
comment: "Open in browser",
|
|
action: "search:" + primaryEngineId + ":" + searchQuery,
|
|
categories: ["Web Search"]
|
|
})
|
|
}
|
|
|
|
for (let i = 0; i < allEngines.length; i++) {
|
|
const engine = allEngines[i]
|
|
if (engine.id !== primaryEngineId) {
|
|
items.push({
|
|
name: "Search with " + engine.name + ": " + (matchedEngineId ? fallbackQuery : searchQuery),
|
|
icon: engine.icon || "material:search",
|
|
comment: "Open in browser",
|
|
action: "search:" + engine.id + ":" + (matchedEngineId ? fallbackQuery : searchQuery),
|
|
categories: ["Web Search"]
|
|
})
|
|
}
|
|
}
|
|
|
|
return items
|
|
}
|
|
|
|
function executeItem(item) {
|
|
if (!item || !item.action) {
|
|
console.warn("WebSearch: Invalid item or action")
|
|
return
|
|
}
|
|
|
|
console.log("WebSearch: Executing item:", item.name, "with action:", item.action)
|
|
|
|
const actionParts = item.action.split(":")
|
|
const actionType = actionParts[0]
|
|
|
|
switch (actionType) {
|
|
case "noop":
|
|
return
|
|
case "search":
|
|
performSearch(actionParts)
|
|
break
|
|
default:
|
|
console.warn("WebSearch: Unknown action type:", actionType)
|
|
showToast("Unknown action: " + actionType)
|
|
}
|
|
}
|
|
|
|
function performSearch(actionParts) {
|
|
const engineId = actionParts[1]
|
|
const query = actionParts.slice(2).join(":")
|
|
|
|
const allEngines = builtInEngines.concat(searchEngines)
|
|
const engine = allEngines.find(e => e.id === engineId)
|
|
|
|
if (engine) {
|
|
const encodedQuery = encodeQuery(query)
|
|
const url = engine.url.replace("%s", encodedQuery)
|
|
|
|
Quickshell.execDetached(["xdg-open", url])
|
|
showToast("Searching " + engine.name + " for: " + query)
|
|
} else {
|
|
console.warn("WebSearch: Engine not found:", engineId)
|
|
showToast("Search engine not found: " + engineId)
|
|
}
|
|
}
|
|
|
|
function showToast(message) {
|
|
if (typeof ToastService !== "undefined") {
|
|
ToastService.showInfo("Web Search", message)
|
|
} else {
|
|
console.log("WebSearch Toast:", message)
|
|
}
|
|
}
|
|
|
|
function getEngineName(engineId) {
|
|
const allEngines = builtInEngines.concat(searchEngines)
|
|
const engine = allEngines.find(e => e.id === engineId)
|
|
return engine ? engine.name : "Unknown"
|
|
}
|
|
|
|
function encodeQuery(str) {
|
|
return str.replace(/ /g, "+")
|
|
}
|
|
|
|
onTriggerChanged: {
|
|
if (pluginService) {
|
|
pluginService.savePluginData("webSearch", "trigger", trigger)
|
|
}
|
|
itemsChanged()
|
|
}
|
|
|
|
onDefaultEngineChanged: {
|
|
if (pluginService) {
|
|
pluginService.savePluginData("webSearch", "defaultEngine", defaultEngine)
|
|
}
|
|
itemsChanged()
|
|
}
|
|
|
|
onSearchEnginesChanged: {
|
|
if (pluginService) {
|
|
pluginService.savePluginData("webSearch", "searchEngines", searchEngines)
|
|
}
|
|
itemsChanged()
|
|
}
|
|
}
|