From 2dc7d1dc5b42456a988da357e7f1d118c8e7cfca Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Wed, 29 Jan 2025 16:56:08 -0500 Subject: [PATCH] Add donation settings page --- Makefile | 12 +- extension.js | 6 + img/kofi.png | Bin 0 -> 3318 bytes img/paypal.png | Bin 0 -> 5415 bytes img/stripe.png | Bin 0 -> 2368 bytes prefs.js | 36 ++++ ...shell.extensions.dash-to-panel.gschema.xml | 8 + taskbar.js | 62 ++++++- ui/SettingsAction.ui | 2 +- ui/SettingsDonation.ui | 167 ++++++++++++++++++ 10 files changed, 281 insertions(+), 12 deletions(-) create mode 100644 img/kofi.png create mode 100644 img/paypal.png create mode 100755 img/stripe.png create mode 100644 ui/SettingsDonation.ui diff --git a/Makefile b/Makefile index 52bbefa..63c156a 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,9 @@ # Basic Makefile UUID = dash-to-panel@jderose9.github.com -BASE_MODULES = extension.js stylesheet.css metadata.json COPYING README.md -EXTRA_MODULES = appIcons.js panel.js panelManager.js proximity.js intellihide.js progress.js panelPositions.js panelSettings.js panelStyle.js overview.js taskbar.js transparency.js windowPreview.js prefs.js utils.js desktopIconsIntegration.js -UI_MODULES = ui/BoxAdvancedOptions.ui ui/BoxAnimateAppIconHoverOptions.ui ui/BoxDotOptions.ui ui/BoxDynamicOpacityOptions.ui ui/BoxGroupAppsOptions.ui ui/BoxIntellihideOptions.ui ui/BoxMiddleClickOptions.ui ui/BoxOverlayShortcut.ui ui/BoxScrollIconOptions.ui ui/BoxScrollPanelOptions.ui ui/BoxSecondaryMenuOptions.ui ui/BoxShowApplicationsOptions.ui ui/BoxShowDesktopOptions.ui ui/BoxWindowPreviewOptions.ui ui/SettingsAbout.ui ui/SettingsAction.ui ui/SettingsBehavior.ui ui/SettingsFineTune.ui ui/SettingsPosition.ui ui/SettingsStyle.ui - -EXTRA_IMAGES = highlight_stacked_bg.svg highlight_stacked_bg_2.svg highlight_stacked_bg_3.svg +MODULES = ./*.js stylesheet.css metadata.json COPYING README.md +UI_MODULES = ui/*.ui +IMAGES = ./* ../media/design/svg/dash-to-panel-logo-light.svg TOLOCALIZE = prefs.js appIcons.js MSGSRC = $(wildcard po/*.po) @@ -83,12 +81,12 @@ zip-file: _build _build: all -rm -fR ./_build mkdir -p _build - cp $(BASE_MODULES) $(EXTRA_MODULES) _build + cp $(MODULES) _build mkdir -p _build/ui cp $(UI_MODULES) _build/ui mkdir -p _build/img - cd img ; cp $(EXTRA_IMAGES) ../_build/img/ + cd img ; cp $(IMAGES) ../_build/img/ mkdir -p _build/schemas cp schemas/*.xml _build/schemas/ cp schemas/gschemas.compiled _build/schemas/ diff --git a/extension.js b/extension.js index 412eb95..13928dd 100644 --- a/extension.js +++ b/extension.js @@ -118,6 +118,12 @@ function _enable(extension) { }); } + // show the donate icon every 120 days (10368000000 milliseconds) + let donateIconUnixtime = SETTINGS.get_string('hide-donate-icon-unixtime') + + if (donateIconUnixtime && donateIconUnixtime < Date.now() - 10368000000) + SETTINGS.set_string('hide-donate-icon-unixtime', '') + panelManager = new PanelManager.PanelManager(); panelManager.enable(); diff --git a/img/kofi.png b/img/kofi.png new file mode 100644 index 0000000000000000000000000000000000000000..0990258db5212077ee300d35438cb218f080cb64 GIT binary patch literal 3318 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 literal 0 HcmV?d00001 diff --git a/img/paypal.png b/img/paypal.png new file mode 100644 index 0000000000000000000000000000000000000000..d8932e461dee9a8a3f5756ae64409595c7baaa6e GIT binary patch literal 5415 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 + this._settings.set_string('hide-donate-icon-unixtime', widget.get_active() ? Date.now().toString() : '') + ) + + this.notebook.connect('notify::visible-page', () => { + clearTimeout(revealDonateTimeout) + + if (this.notebook.visible_page_name == 'donation' && !donationRevealer.get_reveal_child()) + revealDonateTimeout = setTimeout(() => donationRevealer.set_reveal_child(true), 14000) + }) } _setPreviewTitlePosition() { diff --git a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml index b5898b7..64d278db 100644 --- a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -1279,5 +1279,13 @@ Show badge count on app icon Whether to show badge count overlay on app icon, for supported applications. + + '' + The preferences page name to display + + + '' + Unix time when the donate icon was hidden + diff --git a/taskbar.js b/taskbar.js index 7cd4486..8094404 100644 --- a/taskbar.js +++ b/taskbar.js @@ -42,7 +42,7 @@ import * as PanelSettings from './panelSettings.js'; import * as Pos from './panelPositions.js'; import * as Utils from './utils.js'; import * as WindowPreview from './windowPreview.js'; -import {SETTINGS} from './extension.js'; +import {DTP_EXTENSION, SETTINGS} from './extension.js'; const SearchController = Main.overview.searchController; @@ -53,7 +53,45 @@ export const MIN_ICON_SIZE = 4; const T1 = 'ensureAppIconVisibilityTimeout' const T2 = 'showLabelTimeout' const T3 = 'resetHoverTimeout' +const T4 = 'donateAppTimeout' +let donateDummyApp = { + connect: () => [], + connectObject: () => [], + get_id: () => "dtp_donate", + get_windows: () => [], + get_name: function() { + return this.isActive() ? _('Thank you!') : _("Please donate :)") + }, + create_icon_texture: function(size) { + return new St.Icon({ + icon_name: this.isActive() ? 'face-smile' : 'emote-love', + icon_size: size + }) + }, + activate: function() { + if (this.isActive()) + return + + SETTINGS.set_string('target-prefs-page', 'donation') + DTP_EXTENSION.openPreferences() + this._taskbar._timeoutsHandler.add([T4, 5000, this.forceRefresh.bind(this)]) + this.forceRefresh() + }, + forceRefresh: function() { + setDonateApp.call(this._taskbar) + this._taskbar._queueRedisplay() + }, + isActive: function() { + return !!this._taskbar._timeoutsHandler.getId(T4) + } +} + +function setDonateApp() { + this._donateApp = Object.create(donateDummyApp) + this._donateApp._taskbar = this + this._donateApp.visible = !SETTINGS.get_string('hide-donate-icon-unixtime') +} /** * Extend DashItemContainer @@ -360,7 +398,8 @@ export const Taskbar = class extends EventEmitter { 'changed::dot-size', 'changed::show-favorites', 'changed::show-running-apps', - 'changed::show-favorites-all-monitors' + 'changed::show-favorites-all-monitors', + 'changed::hide-donate-icon-unixtime' ], () => { setAttributes() @@ -404,6 +443,8 @@ export const Taskbar = class extends EventEmitter { (this.dtpPanel.isPrimary || SETTINGS.get_boolean('show-favorites-all-monitors')) this.showRunningApps = SETTINGS.get_boolean('show-running-apps') this.allowSplitApps = this.usingLaunchers || (!this.isGroupApps && !this.showFavorites) + + setDonateApp.call(this) } setAttributes() @@ -914,15 +955,28 @@ export const Taskbar = class extends EventEmitter { // When using isolation, we filter out apps that have no windows in // the current workspace (this check is done in AppIcons.getInterestingWindows) let runningApps = this.showRunningApps ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; + let appInfos if (this.allowSplitApps) { - return this._createAppInfos(favoriteApps, [], true) + appInfos = this._createAppInfos(favoriteApps, [], true) .concat(this._createAppInfos(runningApps) .filter(appInfo => appInfo.windows.length)); } else { - return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) + appInfos = this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); } + + if (this._donateApp.visible) + appInfos = [ + { + app: this._donateApp, + isLauncher: true, + windows: [], + }, + ...appInfos + ] + + return appInfos } _redisplay() { diff --git a/ui/SettingsAction.ui b/ui/SettingsAction.ui index 20cbf9c..58c7a0b 100644 --- a/ui/SettingsAction.ui +++ b/ui/SettingsAction.ui @@ -4,7 +4,7 @@ Action - view-pin-symbolic + input-mouse-symbolic diff --git a/ui/SettingsDonation.ui b/ui/SettingsDonation.ui new file mode 100644 index 0000000..626f692 --- /dev/null +++ b/ui/SettingsDonation.ui @@ -0,0 +1,167 @@ + + + + + + True + emote-love-symbolic + donation + Donation + + + + + center + 50 + 50 + 16 + + + error + emote-love-symbolic + 48 + + + + + + + + + + center + <span size="large">Gnome is the best desktop environment. No question. But if you're like me and would never use it without the enhanced workflow that Dash to Panel provides, please support my work by making a donation.</span> + 40 + True + True + + + + + center + I know you're thinking "I don't have time for this", but consider that I've poured countless volunteer hours into making Dash to Panel a quality extension that is useful to YOU! :) + 60 + True + True + + + + + center + 60 + 40 + center + + + + + center + 6 + center + + + + + + Paypal + 6 + + + + + button + https://www.paypal.com/donate/?hosted_button_id=5DCVELP7BSAVQ + + + + + + + center + 6 + center + + + + + + Stripe + 6 + + + + + button + https://donate.stripe.com/9AQg1g8sA5EY1y07ss + + + + + + + center + 6 + center + + + + + + Ko-fi + 6 + + + + + button + https://ko-fi.com/charlesgagnon + + + + + + + + + center + start + + + start + <span size="9000">Thanks for your time! +If you like, you can now hide the donate icon</span> + 10 + True + center + + + + + end + center + + + + + 20 + crossfade + + + + + +