diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/sitespec.c | 8 | ||||
-rw-r--r-- | src/ui/documentwidget.c | 6 | ||||
-rw-r--r-- | src/ui/keys.c | 2 | ||||
-rw-r--r-- | src/ui/util.c | 95 |
4 files changed, 102 insertions, 9 deletions
diff --git a/src/sitespec.c b/src/sitespec.c index 31094981..21edc0a2 100644 --- a/src/sitespec.c +++ b/src/sitespec.c | |||
@@ -268,6 +268,12 @@ void setValueString_SiteSpec(const iString *site, enum iSiteSpecKey key, const i | |||
268 | set_String(¶ms->titanIdentity, value); | 268 | set_String(¶ms->titanIdentity, value); |
269 | } | 269 | } |
270 | break; | 270 | break; |
271 | case paletteSeed_SiteSpecKey: | ||
272 | if (!equal_String(¶ms->paletteSeed, value)) { | ||
273 | needSave = iTrue; | ||
274 | set_String(¶ms->paletteSeed, value); | ||
275 | } | ||
276 | break; | ||
271 | default: | 277 | default: |
272 | break; | 278 | break; |
273 | } | 279 | } |
@@ -339,6 +345,8 @@ const iString *valueString_SiteSpec(const iString *site, enum iSiteSpecKey key) | |||
339 | switch (key) { | 345 | switch (key) { |
340 | case titanIdentity_SiteSpecKey: | 346 | case titanIdentity_SiteSpecKey: |
341 | return ¶ms->titanIdentity; | 347 | return ¶ms->titanIdentity; |
348 | case paletteSeed_SiteSpecKey: | ||
349 | return ¶ms->paletteSeed; | ||
342 | default: | 350 | default: |
343 | return collectNew_String(); | 351 | return collectNew_String(); |
344 | } | 352 | } |
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 7d9ac154..1f3e0e37 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -4033,6 +4033,12 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
4033 | addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok"); | 4033 | addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok"); |
4034 | return iTrue; | 4034 | return iTrue; |
4035 | } | 4035 | } |
4036 | else if (equal_Command(cmd, "document.sitespec") && d == document_App()) { | ||
4037 | if (!findWidget_App("sitespec.palette")) { | ||
4038 | makeSiteSpecificSettings_Widget(d->mod.url); | ||
4039 | } | ||
4040 | return iTrue; | ||
4041 | } | ||
4036 | else if (equal_Command(cmd, "server.unexpire") && document_App() == d) { | 4042 | else if (equal_Command(cmd, "server.unexpire") && document_App() == d) { |
4037 | const iRangecc host = urlHost_String(d->mod.url); | 4043 | const iRangecc host = urlHost_String(d->mod.url); |
4038 | const uint16_t port = urlPort_String(d->mod.url); | 4044 | const uint16_t port = urlPort_String(d->mod.url); |
diff --git a/src/ui/keys.c b/src/ui/keys.c index 26a286bc..88efa98b 100644 --- a/src/ui/keys.c +++ b/src/ui/keys.c | |||
@@ -243,6 +243,8 @@ static const struct { int id; iMenuItem bind; int flags; } defaultBindings_[] = | |||
243 | { 110,{ "${menu.save.downloads}", SDLK_s, KMOD_PRIMARY, "document.save" }, 0 }, | 243 | { 110,{ "${menu.save.downloads}", SDLK_s, KMOD_PRIMARY, "document.save" }, 0 }, |
244 | { 120,{ "${keys.upload}", SDLK_u, KMOD_PRIMARY, "document.upload" }, 0 }, | 244 | { 120,{ "${keys.upload}", SDLK_u, KMOD_PRIMARY, "document.upload" }, 0 }, |
245 | { 121,{ "${keys.upload.edit}", SDLK_e, KMOD_PRIMARY, "document.upload copy:1" }, 0 }, | 245 | { 121,{ "${keys.upload.edit}", SDLK_e, KMOD_PRIMARY, "document.upload copy:1" }, 0 }, |
246 | { 125,{ "${keys.pageinfo}", SDLK_i, KMOD_PRIMARY, "document.info" }, 0 }, | ||
247 | { 126,{ "${keys.sitespec}", ',', KMOD_PRIMARY | KMOD_SHIFT, "document.sitespec" }, 0 }, | ||
246 | { 130,{ "${keys.input.precedingline}", SDLK_v, KMOD_PRIMARY | KMOD_SHIFT, "input.precedingline" }, 0 }, | 248 | { 130,{ "${keys.input.precedingline}", SDLK_v, KMOD_PRIMARY | KMOD_SHIFT, "input.precedingline" }, 0 }, |
247 | /* The following cannot currently be changed (built-in duplicates). */ | 249 | /* The following cannot currently be changed (built-in duplicates). */ |
248 | #if defined (iPlatformApple) | 250 | #if defined (iPlatformApple) |
diff --git a/src/ui/util.c b/src/ui/util.c index 54715121..5cd8a582 100644 --- a/src/ui/util.c +++ b/src/ui/util.c | |||
@@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |||
35 | #include "keys.h" | 35 | #include "keys.h" |
36 | #include "labelwidget.h" | 36 | #include "labelwidget.h" |
37 | #include "root.h" | 37 | #include "root.h" |
38 | #include "sitespec.h" | ||
38 | #include "text.h" | 39 | #include "text.h" |
39 | #include "touch.h" | 40 | #include "touch.h" |
40 | #include "widget.h" | 41 | #include "widget.h" |
@@ -3126,7 +3127,7 @@ iWidget *makeBookmarkCreation_Widget(const iString *url, const iString *title, i | |||
3126 | 3127 | ||
3127 | static iBool handleFeedSettingCommands_(iWidget *dlg, const char *cmd) { | 3128 | static iBool handleFeedSettingCommands_(iWidget *dlg, const char *cmd) { |
3128 | if (equal_Command(cmd, "cancel")) { | 3129 | if (equal_Command(cmd, "cancel")) { |
3129 | setupSheetTransition_Mobile(dlg, iFalse); | 3130 | setupSheetTransition_Mobile(dlg, 0); |
3130 | destroy_Widget(dlg); | 3131 | destroy_Widget(dlg); |
3131 | return iTrue; | 3132 | return iTrue; |
3132 | } | 3133 | } |
@@ -3233,32 +3234,108 @@ iWidget *makeFeedSettings_Widget(uint32_t bookmarkId) { | |||
3233 | return dlg; | 3234 | return dlg; |
3234 | } | 3235 | } |
3235 | 3236 | ||
3237 | /*----------------------------------------------------------------------------------------------*/ | ||
3238 | |||
3239 | static void siteSpecificThemeChanged_(const iWidget *dlg) { | ||
3240 | iDocumentWidget *doc = document_App(); | ||
3241 | setThemeSeed_GmDocument((iGmDocument *) document_DocumentWidget(doc), | ||
3242 | urlPaletteSeed_String(url_DocumentWidget(doc)), | ||
3243 | urlThemeSeed_String(url_DocumentWidget(doc))); | ||
3244 | postCommand_App("theme.changed"); | ||
3245 | } | ||
3246 | |||
3247 | static const iString *siteSpecificRoot_(const iWidget *dlg) { | ||
3248 | return collect_String(suffix_Command(cstr_String(id_Widget(dlg)), "site")); | ||
3249 | } | ||
3250 | |||
3251 | static void updateSiteSpecificTheme_(iInputWidget *palSeed, void *context) { | ||
3252 | iWidget *dlg = context; | ||
3253 | const iString *siteRoot = siteSpecificRoot_(dlg); | ||
3254 | setValueString_SiteSpec(siteRoot, paletteSeed_SiteSpecKey, text_InputWidget(palSeed)); | ||
3255 | siteSpecificThemeChanged_(dlg); | ||
3256 | /* Allow seeing the new theme. */ | ||
3257 | setFlags_Widget(dlg, noFadeBackground_WidgetFlag, iTrue); | ||
3258 | } | ||
3259 | |||
3260 | static void closeSiteSpecific_(iWidget *dlg) { | ||
3261 | setupSheetTransition_Mobile(dlg, 0); | ||
3262 | delete_String(userData_Object(dlg)); /* saved original palette seed */ | ||
3263 | destroy_Widget(dlg); | ||
3264 | } | ||
3265 | |||
3266 | static iBool siteSpecificSettingsHandler_(iWidget *dlg, const char *cmd) { | ||
3267 | if (equal_Command(cmd, "cancel")) { | ||
3268 | iInputWidget *palSeed = findChild_Widget(dlg, "sitespec.palette"); | ||
3269 | setText_InputWidget(palSeed, userData_Object(dlg)); | ||
3270 | updateSiteSpecificTheme_(palSeed, dlg); | ||
3271 | closeSiteSpecific_(dlg); | ||
3272 | return iTrue; | ||
3273 | } | ||
3274 | if (startsWith_CStr(cmd, "input.ended id:sitespec.palette")) { | ||
3275 | setFlags_Widget(dlg, noFadeBackground_WidgetFlag, iFalse); | ||
3276 | refresh_Widget(dlg); | ||
3277 | siteSpecificThemeChanged_(dlg); | ||
3278 | return iTrue; | ||
3279 | } | ||
3280 | if (equal_Command(cmd, "sitespec.accept")) { | ||
3281 | const iInputWidget *palSeed = findChild_Widget(dlg, "sitespec.palette"); | ||
3282 | const iBool warnAnsi = isSelected_Widget(findChild_Widget(dlg, "sitespec.ansi")); | ||
3283 | const iString *siteRoot = siteSpecificRoot_(dlg); | ||
3284 | int dismissed = value_SiteSpec(siteRoot, dismissWarnings_SiteSpecKey); | ||
3285 | iChangeFlags(dismissed, ansiEscapes_GmDocumentWarning, !warnAnsi); | ||
3286 | setValue_SiteSpec(siteRoot, dismissWarnings_SiteSpecKey, dismissed); | ||
3287 | setValueString_SiteSpec(siteRoot, paletteSeed_SiteSpecKey, text_InputWidget(palSeed)); | ||
3288 | siteSpecificThemeChanged_(dlg); | ||
3289 | /* Note: The active DocumentWidget may actually be different than when opening the dialog. */ | ||
3290 | closeSiteSpecific_(dlg); | ||
3291 | return iTrue; | ||
3292 | } | ||
3293 | return iFalse; | ||
3294 | } | ||
3295 | |||
3236 | iWidget *makeSiteSpecificSettings_Widget(const iString *url) { | 3296 | iWidget *makeSiteSpecificSettings_Widget(const iString *url) { |
3237 | iWidget *dlg; | 3297 | iWidget *dlg; |
3238 | const iMenuItem actions[] = { | 3298 | const iMenuItem actions[] = { |
3239 | { "${cancel}" }, { "${sitespec.accept}", SDLK_RETURN, KMOD_PRIMARY, "sitespec.accept" } | 3299 | { "${cancel}" }, |
3300 | { "${sitespec.accept}", SDLK_RETURN, KMOD_PRIMARY, "sitespec.accept" } | ||
3240 | }; | 3301 | }; |
3241 | if (isUsingPanelLayout_Mobile()) { | 3302 | if (isUsingPanelLayout_Mobile()) { |
3242 | iAssert(iFalse); | 3303 | iAssert(iFalse); |
3243 | } | 3304 | } |
3244 | else { | 3305 | else { |
3245 | iWidget *headings, *values; | 3306 | iWidget *headings, *values; |
3246 | dlg = makeSheet_Widget("sitespec"); | 3307 | dlg = makeSheet_Widget(format_CStr("sitespec site:%s", cstr_Rangecc(urlRoot_String(url)))); |
3247 | addDialogTitle_(dlg, "${heading.sitespec}", "heading.sitespec"); | 3308 | addDialogTitle_(dlg, "${heading.sitespec}", "heading.sitespec"); |
3248 | addChild_Widget(dlg, iClob(makeTwoColumns_Widget(&headings, &values))); | 3309 | addChild_Widget(dlg, iClob(makeTwoColumns_Widget(&headings, &values))); |
3310 | iInputWidget *palSeed = new_InputWidget(0); | ||
3311 | setHint_InputWidget(palSeed, cstr_Block(urlThemeSeed_String(url))); | ||
3312 | addPrefsInputWithHeading_(headings, values, "sitespec.palette", iClob(palSeed)); | ||
3249 | addDialogToggle_(headings, values, "${sitespec.ansi}", "sitespec.ansi"); | 3313 | addDialogToggle_(headings, values, "${sitespec.ansi}", "sitespec.ansi"); |
3250 | iInputWidget *palInput = new_InputWidget(0); | 3314 | addChild_Widget(dlg, iClob(makeDialogButtons_Widget(actions, iElemCount(actions)))); |
3251 | addPrefsInputWithHeading_(headings, values, "sitespec.palette", iClob(palInput)); | 3315 | addChild_Widget(get_Root()->widget, iClob(dlg)); |
3252 | as_Widget(palInput)->rect.size.x = 80 * gap_UI; | 3316 | as_Widget(palSeed)->rect.size.x = 60 * gap_UI; |
3253 | addChild_Widget(dlg, iClob(makeDialogButtons_Widget(actions, iElemCount(actions)))); | 3317 | arrange_Widget(dlg); |
3254 | } | 3318 | } |
3255 | /* Initialize. */ { | 3319 | /* Initialize. */ { |
3256 | const iRangecc root = urlRoot_String(url); | 3320 | const iString *site = collectNewRange_String(urlRoot_String(url)); |
3257 | 3321 | setToggle_Widget(findChild_Widget(dlg, "sitespec.ansi"), | |
3322 | ~value_SiteSpec(site, dismissWarnings_SiteSpecKey) & ansiEscapes_GmDocumentWarning); | ||
3323 | setText_InputWidget(findChild_Widget(dlg, "sitespec.palette"), | ||
3324 | valueString_SiteSpec(site, paletteSeed_SiteSpecKey)); | ||
3325 | /* Keep a copy of the original palette seed for restoring on cancel. */ | ||
3326 | setUserData_Object(dlg, copy_String(valueString_SiteSpec(site, paletteSeed_SiteSpecKey))); | ||
3327 | if (!isUsingPanelLayout_Mobile()) { | ||
3328 | setValidator_InputWidget(findChild_Widget(dlg, "sitespec.palette"), | ||
3329 | updateSiteSpecificTheme_, dlg); | ||
3330 | } | ||
3258 | } | 3331 | } |
3332 | setCommandHandler_Widget(dlg, siteSpecificSettingsHandler_); | ||
3333 | setupSheetTransition_Mobile(dlg, incoming_TransitionFlag); | ||
3259 | return dlg; | 3334 | return dlg; |
3260 | } | 3335 | } |
3261 | 3336 | ||
3337 | /*----------------------------------------------------------------------------------------------*/ | ||
3338 | |||
3262 | iWidget *makeIdentityCreation_Widget(void) { | 3339 | iWidget *makeIdentityCreation_Widget(void) { |
3263 | const iMenuItem actions[] = { { "${dlg.newident.more}", 0, 0, "ident.showmore" }, | 3340 | const iMenuItem actions[] = { { "${dlg.newident.more}", 0, 0, "ident.showmore" }, |
3264 | { "---" }, | 3341 | { "---" }, |