Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add bindable property to wrap a control's value - #119

Merged
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property
Jul 6, 2016
Merged

Add bindable property to wrap a control's value#119
RuiAAPeres merged 4 commits into
RACCommunity:masterfrom
dmcrodrigues:dr/add-uicontrol-value-changed-property

Conversation

@dmcrodrigues

Copy link
Copy Markdown
Contributor

What's included in this PR?

  • Extended associatedProperty with a setUp closure to perform some configuration like setting up any signals that may affect the property once.
  • A bindable property, rex_valueChanged, to wrap a control's value. The property uses UIControlEvents.ValueChanged and UIControlEvents.EditingChanged events to detect changes and keep the value up-to-date. This prevents code duplication in each control to monitor changes.
  • Enables tests of UIControls that need to use -sendActionsForControlEvents: like UIDatePicker (test was disabled) and UISwitch.
  • Use the introduced setUp to install the signal that rex_dismissAnimated depends upon. This prevents repetition of events in cases where the property is accessed more than once (each access adds a new rac_signalForSelector for the dismiss of the view controller).

If this goes forward it will help to easily provide bindable properties for other controls like UISegmentedControl, UISlider, ...

Comment threadSource/Foundation/Association.swift Outdated
return associatedObject(host, key: key) { host in
let property = MutableProperty(initial(host))

setUp?(property)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUp should be as well @NoEscape

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It cannot be @noescape unless we change it to non-optional but it that case we need to provide a default implementation. What approach should I follow?

@RuiAAPeresRuiAAPeresApr 30, 2016

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer with it and and default { _ in }. This would be easier for the consumer, since he wouldn't have to reference self in the closure. There is also some minor optimization with it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 3dea651 to d8d9dffCompareApril 30, 2016 22:20
Comment threadSource/UIKit/UIControl.swift Outdated
/// events to detect changes and keep the value up-to-date.
//
@warn_unused_result(message="Did you forget to use the property?")
class func rex_valueChanged<Host: UIControl, T>(host: Host, getter: Host -> T, setter: (Host, T) -> ()) -> MutableProperty<T> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the name rex_valueChanged is misleading.

Especially considering rex_controlEvents above, I first assumed that this was like a pre-filtered version of rex_controlEvents, but then I saw thats not really what it does.

I'm not sure what would be a good name, rex_controlEventUpdatedProperty seems a bit clumsy.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the name is not entirely correct mainly because this is a property with a state so the Changed part does not make much sense. I would suggest rex_value which I think is more accurate since is a bindable property for a value of a UIControl.

The name will clash with UISlider's value (in terms of naming only) but this property is not intended to be public, it's only a convenient method to be (re-)used internally. But I'm totally open for other suggestions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since its internal, I think rex_value should be fine

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from d8d9dff to e9fe238CompareMay 5, 2016 20:52
@RuiAAPeres

Copy link
Copy Markdown
Member

@dmcrodrigues quick one, how is this related to #115?

@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from e9fe238 to 5123869CompareJuly 6, 2016 08:21
@dmcrodrigues

Copy link
Copy Markdown
ContributorAuthor

@RuiAAPeres sorry I haven't seen your comment. #115 introduces a bindable property for CocoaAction, this one is about the value of a UIControl only. In resume: I refactored the code around bindable properties to avoid repeating the exact same code for each control.

The introduced `setUp` is extremely helpful to setup any signals that may
affect the property once.
This property is common to every `UIControl` and can be used by
providing a getter and a setter for the value wrapped. This property
uses `UIControlEvents.ValueChanged` and `UIControlEvents.EditingChanged`
events to detect changes and keep the value up-to-date. This kind of
logic can be reused instead of being defined and used for each control.
This prevents repetition of events in cases where the property is
accessed more than once (each access adds a new `rac_signalForSelector`
for the dismiss of the view controller).
@dmcrodrigues
dmcrodriguesforce-pushed the dr/add-uicontrol-value-changed-property branch from 5123869 to 98d4932CompareJuly 6, 2016 11:30
@RuiAAPeres
RuiAAPeres merged commit 4a3bd79 into RACCommunity:masterJul 6, 2016
@dmcrodrigues
dmcrodrigues deleted the dr/add-uicontrol-value-changed-property branch July 7, 2016 15:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dmcrodrigues@RuiAAPeres@iv-mexx