def __init__(self, *args): """Creates an a new ProgressIndicator. @param args: tuple of the form - () - (value) - (contentSource) """ super(ProgressIndicator, self).__init__() self._indeterminate = False self._dataSource = None self._pollingInterval = 1000 nargs = len(args) if nargs == 0: self.setPropertyDataSource(ObjectProperty(0.0, float)) elif nargs == 1: if isinstance(args[0], prop.IProperty): contentSource, = args self.setPropertyDataSource(contentSource) else: value, = args self.setPropertyDataSource(ObjectProperty(value, float)) else: raise ValueError, 'too many arguments'
def testValueChangeEventPropagationWithReadThrough(self): """Test that field propagates value change events originating from property, but don't fire value change events twice if value has only changed once. TODO: make test field type agnostic (eg. combobox) """ prop = ObjectProperty('') self.getField().setPropertyDataSource(prop) # defaults, buffering off self.getField().setWriteThrough(True) self.getField().setReadThrough(True) # Expectations and start test self.getListener().valueChange(mox.IsA(ValueChangeEvent)) mox.Replay(self.getListener()) # Add listener and set the value -> should end up in listener once self.getField().addListener(self.getListener(), IValueChangeListener) prop.setValue('Foo') # Ensure listener was called once mox.Verify(self.getListener()) # get value should not fire value change again value = self.getField().getValue() self.assertEquals('Foo', value) # Ensure listener still has been called only once mox.Verify(self.getListener())
def __init__(self, value1, value2): super(TestItem, self).__init__() self.addItemProperty(AbstractFilterTest.PROPERTY1, ObjectProperty(value1)) self.addItemProperty(AbstractFilterTest.PROPERTY2, ObjectProperty(value2))
def testValueChangePropagationWithReadThroughWithModifiedValue(self): """If read through is on and value has been modified, but not committed, the value should not propagate similar to L{#testValueChangeEventPropagationWithReadThrough()} TODO: make test field type agnostic (eg. combobox) """ initialValue = 'initial' prop = ObjectProperty(initialValue) self.getField().setPropertyDataSource(prop) # write buffering on, read buffering off self.getField().setWriteThrough(False) self.getField().setReadThrough(True) # Expect no value changes calls to listener mox.Replay(self.getListener()) # first set the value (note, write through false -> not forwarded to # property) self.setValue(self.getField()) self.assertTrue(self.getField().isModified()) # Add listener and set the value -> should end up in listener once self.getField().addListener(self.getListener(), IValueChangeListener) # modify property value, should not fire value change in field as the # field has uncommitted value (aka isModified() == true) prop.setValue('Foo') # Ensure listener was called once mox.Verify(self.getListener()) # get value should not fire value change again value = self.getField().getValue() # Ensure listener still has been called only once mox.Verify(self.getListener()) # field value should be different from the original value and current # proeprty value isValueEqualToInitial = value == initialValue self.assertFalse(isValueEqualToInitial) isValueEqualToPropertyValue = value == prop.getValue() self.assertFalse(isValueEqualToPropertyValue) # Ensure listener has not been called mox.Verify(self.getListener())
def testRemoveListener(self): """Test that listeners are not called when they have been unregistered.""" self.getField().setPropertyDataSource(ObjectProperty('')) self.getField().setWriteThrough(True) self.getField().setReadThrough(True) # Expectations and start test self._listener.valueChange(mox.IsA(ValueChangeEvent)) mox.Replay(self._listener) # Add listener and set the value -> should end up in listener once self.getField().addListener(self._listener, IValueChangeListener) self.setValue(self.getField()) # Ensure listener was called once mox.Verify(self._listener) # Remove the listener and set the value -> should not end up in # listener self.getField().removeListener(self._listener, IValueChangeListener) self.setValue(self.getField()) # Ensure listener still has been called only once mox.Verify(self._listener)
def testSimple(self): prop1 = ObjectProperty(self._super1, TestSuperClass) self.assertEquals('super1', prop1.getValue().getName()) prop1 = ObjectProperty(self._super1) self.assertEquals('super1', prop1.getValue().getName()) prop2 = ObjectProperty(self._sub1, TestSubClass) self.assertEquals('Subclass: sub1', prop2.getValue().getName()) prop2 = ObjectProperty(self._sub1) self.assertEquals('Subclass: sub1', prop2.getValue().getName())
def testMixedGenerics(self): prop = ObjectProperty(self._sub1) self.assertEquals('Subclass: sub1', prop.getValue().getName()) self.assertEquals(prop.getType(), TestSubClass) # create correct subclass based on the runtime type of the instance # given to ObjectProperty constructor, which is a subclass of the type # parameter prop.setValue('sub2') self.assertEquals('Subclass: sub2', prop.getValue().getName())
def testNoWriteThroughNoReadThrough(self): """Fully buffered use where the data source is neither read nor modified during editing, and is updated at commit(). Field value change notifications reflect the buffered value in the field, not the original data source value changes. """ self.getField().setPropertyDataSource(ObjectProperty('')) self.getField().setWriteThrough(False) self.getField().setReadThrough(False) self.expectValueChangeFromSetValueNotCommit()
def testValueChangePropagationWithReadThroughOff(self): """Value change events from property should not propagate if read through is false. Execpt when the property is being set. TODO: make test field type agnostic (eg. combobox) """ initialValue = 'initial' prop = ObjectProperty(initialValue) # set buffering self.getField().setWriteThrough(False) self.getField().setReadThrough(False) # Value change should only happen once, when setting the property, # further changes via property should not cause value change listener # in field to be notified self.getListener().valueChange(mox.IsA(ValueChangeEvent)) mox.Replay(self.getListener()) self.getField().addListener(self.getListener(), IValueChangeListener) self.getField().setPropertyDataSource(prop) # Ensure listener was called once mox.Verify(self.getListener()) # modify property value, should not fire value change in field as the # read buffering is on (read through == false) prop.setValue('Foo') # Ensure listener still has been called only once mox.Verify(self.getListener()) # get value should not fire value change again value = self.getField().getValue() # field value should be different from the original value and current # proeprty value isValueEqualToInitial = value == initialValue self.assertTrue(isValueEqualToInitial) # Ensure listener still has been called only once mox.Verify(self.getListener())
def testWriteThroughReadThrough(self): """Common unbuffered case: both writeThrough (auto-commit) and readThrough are on. Calling commit() should not cause notifications. Using the readThrough mode allows changes made to the property value to be seen in some cases also when there is no notification of value change from the property. Field value change notifications closely mirror value changes of the data source behind the field. """ self.getField().setPropertyDataSource(ObjectProperty('')) self.getField().setWriteThrough(True) self.getField().setReadThrough(True) self.expectValueChangeFromSetValueNotCommit()
def testWriteThroughNoReadThrough(self): """Less common partly buffered case: writeThrough (auto-commit) is on and readThrough is off. Calling commit() should not cause notifications. Without readThrough activated, changes to the data source that do not cause notifications are not reflected by the field value. Field value change notifications correspond to changes made to the data source value through the text field or the (notifying) property. """ self.getField().setPropertyDataSource(ObjectProperty('')) self.getField().setWriteThrough(True) self.getField().setReadThrough(False) self.expectValueChangeFromSetValueNotCommit()
def testNoWriteThroughReadThrough(self): """Partly buffered use where the data source is read but not nor modified during editing, and is updated at commit(). When used like this, a field is updated from the data source if necessary when its value is requested and the property value has changed but the field has not been modified in its buffer. Field value change notifications reflect the buffered value in the field, not the original data source value changes. """ self.getField().setPropertyDataSource(ObjectProperty('')) self.getField().setWriteThrough(False) self.getField().setReadThrough(True) self.expectValueChangeFromSetValueNotCommit()
def __init__(self, contentSource="", contentMode=None): """Creates a new instance of Label with text-contents read from given datasource. """ super(Label, self).__init__() self._dataSource = None self._contentMode = self.CONTENT_DEFAULT if isinstance(contentSource, basestring): contentSource = ObjectProperty(contentSource, str) if contentMode is None: contentMode = self.CONTENT_DEFAULT self.setPropertyDataSource(contentSource) if contentMode != self.CONTENT_DEFAULT: self.setContentMode(contentMode) self.setWidth(100, self.UNITS_PERCENTAGE)
def testSetValueStringSuper(self): prop = ObjectProperty(self._super1, TestSuperClass) self.assertEquals('super1', prop.getValue().getName()) prop.setValue('super2') self.assertEquals('super1', self._super1.getName()) self.assertEquals('super2', prop.getValue().getName())
def __init__(self, app): super(SamplerWindow, self).__init__() self._app = app self._currentList = FeatureGrid(self._app) self._featureView = FeatureView() self._currentFeature = ObjectProperty(None, Feature) self._mainSplit = None self._navigationTree = None # self._webAnalytics = GoogleAnalytics('UA-658457-6', 'none') # "backbutton" self._uriFragmentUtility = UriFragmentUtility() # breadcrumbs self._breadcrumbs = BreadCrumbs(self) self._previousSample = None self._nextSample = None self._search = None self.theme = None # Main top/expanded-bottom layout mainExpand = VerticalLayout() self.setContent(mainExpand) self.setSizeFull() mainExpand.setSizeFull() self.setCaption(self._TITLE) self.setTheme(self._app._currentApplicationTheme) # topbar (navigation) nav = HorizontalLayout() mainExpand.addComponent(nav) nav.setHeight('44px') nav.setWidth('100%') nav.setStyleName('topbar') nav.setSpacing(True) nav.setMargin(False, True, False, False) # Upper left logo logo = self.createLogo() nav.addComponent(logo) nav.setComponentAlignment(logo, Alignment.MIDDLE_LEFT) # Breadcrumbs nav.addComponent(self._breadcrumbs) nav.setExpandRatio(self._breadcrumbs, 1) nav.setComponentAlignment(self._breadcrumbs, Alignment.MIDDLE_LEFT) # invisible analytics -component # nav.addComponent(self._webAnalytics) # "backbutton" nav.addComponent(self._uriFragmentUtility) self._uriFragmentUtility.addListener(UriListener(self), IFragmentChangedListener) # Main left/right split; hidden menu tree self._mainSplit = HorizontalSplitPanel() self._mainSplit.setSizeFull() self._mainSplit.setStyleName('main-split') mainExpand.addComponent(self._mainSplit) mainExpand.setExpandRatio(self._mainSplit, 1) # Select theme themeSelect = self.createThemeSelect() nav.addComponent(themeSelect) nav.setComponentAlignment(themeSelect, Alignment.MIDDLE_LEFT) # Layouts for top area buttons quicknav = HorizontalLayout() arrows = HorizontalLayout() nav.addComponent(quicknav) nav.addComponent(arrows) nav.setComponentAlignment(quicknav, Alignment.MIDDLE_LEFT) nav.setComponentAlignment(arrows, Alignment.MIDDLE_LEFT) quicknav.setStyleName('segment') arrows.setStyleName('segment') # Previous sample self._previousSample = self.createPrevButton() arrows.addComponent(self._previousSample) # Next sample self._nextSample = self.createNextButton() arrows.addComponent(self._nextSample) # "Search" combobox searchComponent = self.createSearch() quicknav.addComponent(searchComponent) # Menu tree, initially shown menuLayout = CssLayout() allSamples = ActiveLink('All Samples', ExternalResource('#')) menuLayout.addComponent(allSamples) self._navigationTree = self.createMenuTree() menuLayout.addComponent(self._navigationTree) self._mainSplit.setFirstComponent(menuLayout) # Show / hide tree treeSwitch = self.createTreeSwitch() quicknav.addComponent(treeSwitch) self.addListener(WindowCloseListener(self, self._app), window.ICloseListener) self.updateFeatureList(self._currentList)
class SamplerWindow(Window): """The main window for Sampler, contains the full application UI.""" _TITLE = 'Muntjac Sampler' def __init__(self, app): super(SamplerWindow, self).__init__() self._app = app self._currentList = FeatureGrid(self._app) self._featureView = FeatureView() self._currentFeature = ObjectProperty(None, Feature) self._mainSplit = None self._navigationTree = None # self._webAnalytics = GoogleAnalytics('UA-658457-6', 'none') # "backbutton" self._uriFragmentUtility = UriFragmentUtility() # breadcrumbs self._breadcrumbs = BreadCrumbs(self) self._previousSample = None self._nextSample = None self._search = None self.theme = None # Main top/expanded-bottom layout mainExpand = VerticalLayout() self.setContent(mainExpand) self.setSizeFull() mainExpand.setSizeFull() self.setCaption(self._TITLE) self.setTheme(self._app._currentApplicationTheme) # topbar (navigation) nav = HorizontalLayout() mainExpand.addComponent(nav) nav.setHeight('44px') nav.setWidth('100%') nav.setStyleName('topbar') nav.setSpacing(True) nav.setMargin(False, True, False, False) # Upper left logo logo = self.createLogo() nav.addComponent(logo) nav.setComponentAlignment(logo, Alignment.MIDDLE_LEFT) # Breadcrumbs nav.addComponent(self._breadcrumbs) nav.setExpandRatio(self._breadcrumbs, 1) nav.setComponentAlignment(self._breadcrumbs, Alignment.MIDDLE_LEFT) # invisible analytics -component # nav.addComponent(self._webAnalytics) # "backbutton" nav.addComponent(self._uriFragmentUtility) self._uriFragmentUtility.addListener(UriListener(self), IFragmentChangedListener) # Main left/right split; hidden menu tree self._mainSplit = HorizontalSplitPanel() self._mainSplit.setSizeFull() self._mainSplit.setStyleName('main-split') mainExpand.addComponent(self._mainSplit) mainExpand.setExpandRatio(self._mainSplit, 1) # Select theme themeSelect = self.createThemeSelect() nav.addComponent(themeSelect) nav.setComponentAlignment(themeSelect, Alignment.MIDDLE_LEFT) # Layouts for top area buttons quicknav = HorizontalLayout() arrows = HorizontalLayout() nav.addComponent(quicknav) nav.addComponent(arrows) nav.setComponentAlignment(quicknav, Alignment.MIDDLE_LEFT) nav.setComponentAlignment(arrows, Alignment.MIDDLE_LEFT) quicknav.setStyleName('segment') arrows.setStyleName('segment') # Previous sample self._previousSample = self.createPrevButton() arrows.addComponent(self._previousSample) # Next sample self._nextSample = self.createNextButton() arrows.addComponent(self._nextSample) # "Search" combobox searchComponent = self.createSearch() quicknav.addComponent(searchComponent) # Menu tree, initially shown menuLayout = CssLayout() allSamples = ActiveLink('All Samples', ExternalResource('#')) menuLayout.addComponent(allSamples) self._navigationTree = self.createMenuTree() menuLayout.addComponent(self._navigationTree) self._mainSplit.setFirstComponent(menuLayout) # Show / hide tree treeSwitch = self.createTreeSwitch() quicknav.addComponent(treeSwitch) self.addListener(WindowCloseListener(self, self._app), window.ICloseListener) self.updateFeatureList(self._currentList) def detach(self): super(SamplerWindow, self).detach() self._search.setContainerDataSource(None) self._navigationTree.setContainerDataSource(None) def removeSubwindows(self): wins = self.getChildWindows() if None is not wins: for w in wins: self.removeWindow(w) def setFeature(self, arg): """Displays a Feature(Set) or displays a Feature(Set) matching the given path, or the main view if no matching Feature(Set) is found. @param arg: Either the Feature(Set) to show or the path of the Feature(Set) to show """ if isinstance(arg, basestring): path = arg f = FeatureSet.FEATURES.getFeature(path) self.setFeature(f) else: f = arg if f == FeatureSet.FEATURES: # "All" is no longer in the tree, use null instead f = None self._currentFeature.setValue(f) fragment = f.getFragmentName() if f is not None else '' # self._webAnalytics.trackPageview(fragment) self._uriFragmentUtility.setFragment(fragment, False) self._breadcrumbs.setPath( self._app.getFullPathFor(f) ) self._previousSample.setEnabled(f is not None) self._nextSample.setEnabled(not self._app._allFeatures.isLastId(f)) self.updateFeatureList(self._currentList) self.setCaption((f.getName() + ': ' if f is not None else '') + self._TITLE) # SamplerWindow helpers def createSearch(self): self._search = ComboBox() self._search.setWidth('160px') self._search.setNewItemsAllowed(False) self._search.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS) self._search.setNullSelectionAllowed(True) self._search.setImmediate(True) self._search.setInputPrompt('Search samples...') self._search.setContainerDataSource( self._app._allFeatures ) for idd in self._app._allFeatures.getItemIds(): if isinstance(idd, FeatureSet): pass # FIXME: 'SamplerApplication' has no attribute 'getResourceAsStream' # self._search.setItemIcon(idd, # ClassResource('folder.gif', self._app)) self._search.addListener(SearchListener(self), prop.IValueChangeListener) # TODO add icons for section/sample # PopupView pv = new PopupView("", search) { public void # changeVariables(Object source, Map variables) { # super.changeVariables(source, variables); if (isPopupVisible()) { # search.focus(); } } }; pv = PopupView('<span></span>', self._search) pv.addListener(PopupListener(self), IPopupVisibilityListener) pv.setStyleName('quickjump') pv.setDescription('Quick jump') return pv def createThemeSelect(self): self.theme = ComboBox() self.theme.setWidth('32px') self.theme.setNewItemsAllowed(False) self.theme.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS) self.theme.setImmediate(True) self.theme.setNullSelectionAllowed(False) for themeName in self._app._THEMES: idd = self._app._SAMPLER_THEME_NAME + '-' + themeName self.theme.addItem(idd) self.theme.setItemCaption(idd, themeName[:1].upper() + (themeName[1:]) + ' theme') self.theme.setItemIcon(idd, _EMPTY_THEME_ICON) currentWindowTheme = self.getTheme() self.theme.setValue(currentWindowTheme) self.theme.setItemIcon(currentWindowTheme, _SELECTED_THEME_ICON) self.theme.addListener(ThemeChangeListener(self, self._app), prop.IValueChangeListener) self.theme.setStyleName('theme-select') self.theme.setDescription('Select Theme') return self.theme def createLogo(self): logo = NativeButton('', LogoClickListener(self)) logo.setDescription('Home') logo.setStyleName(BaseTheme.BUTTON_LINK) logo.addStyleName('logo') return logo def createNextButton(self): b = NativeButton('', NextClickListener(self, self._app)) b.setStyleName('next') b.setDescription('Jump to the next sample') return b def createPrevButton(self): b = NativeButton('', PrevClickListener(self, self._app)) b.setEnabled(False) b.setStyleName('previous') b.setDescription('Jump to the previous sample') return b def createTreeSwitch(self): b = NativeButton() b.setStyleName('tree-switch') b.addStyleName('down') b.setDescription('Toggle sample tree visibility') b.addListener(TreeClickListener(self), button.IClickListener) self._mainSplit.setSplitPosition(250, ISizeable.UNITS_PIXELS) return b def createMenuTree(self): tree = Tree() tree.setImmediate(True) tree.setStyleName('menu') tree.setContainerDataSource(self._app._allFeatures) self._currentFeature.addListener(FeatureChangeListener(self, tree), prop.IValueChangeListener) for f in FeatureSet.FEATURES.getFeatures(): tree.expandItemsRecursively(f) tree.expandItemsRecursively(FeatureSet.FEATURES) tree.addListener(TreeChangeListener(self), prop.IValueChangeListener) tree.setItemStyleGenerator(TreeStyleGenerator()) return tree def updateFeatureList(self, lst): self._currentList = lst val = self._currentFeature.getValue() if val is None: self._currentList.setFeatureContainer(self._app._allFeatures) self._mainSplit.setSecondComponent(self._currentList) elif isinstance(val, FeatureSet): self._currentList.setFeatureContainer(val.getContainer(True)) self._mainSplit.setSecondComponent(self._currentList) else: self._mainSplit.setSecondComponent(self._featureView) self._featureView.setFeature(val)
def testReadOnlyStatusChangeListenerAddGetRemove(self): self._testListenerAddGetRemove(AbstractProperty, IReadOnlyStatusChangeEvent, IReadOnlyStatusChangeListener, ObjectProperty(''))
def testValueChangeListenerAddGetRemove(self): self._testListenerAddGetRemove(AbstractProperty, ValueChangeEvent, IValueChangeListener, ObjectProperty(''))
class SamplerWindow(Window): """The main window for Sampler, contains the full application UI.""" _TITLE = 'Muntjac Sampler' def __init__(self, app): super(SamplerWindow, self).__init__() self._app = app self._currentList = FeatureGrid(self._app) self._featureView = FeatureView() self._currentFeature = ObjectProperty(None, Feature) self._mainSplit = None self._navigationTree = None # self._webAnalytics = GoogleAnalytics('UA-658457-6', 'none') # "backbutton" self._uriFragmentUtility = UriFragmentUtility() # breadcrumbs self._breadcrumbs = BreadCrumbs(self) self._previousSample = None self._nextSample = None self._search = None self.theme = None # Main top/expanded-bottom layout mainExpand = VerticalLayout() self.setContent(mainExpand) self.setSizeFull() mainExpand.setSizeFull() self.setCaption(self._TITLE) self.setTheme(self._app._currentApplicationTheme) # topbar (navigation) nav = HorizontalLayout() mainExpand.addComponent(nav) nav.setHeight('44px') nav.setWidth('100%') nav.setStyleName('topbar') nav.setSpacing(True) nav.setMargin(False, True, False, False) # Upper left logo logo = self.createLogo() nav.addComponent(logo) nav.setComponentAlignment(logo, Alignment.MIDDLE_LEFT) # Breadcrumbs nav.addComponent(self._breadcrumbs) nav.setExpandRatio(self._breadcrumbs, 1) nav.setComponentAlignment(self._breadcrumbs, Alignment.MIDDLE_LEFT) # invisible analytics -component # nav.addComponent(self._webAnalytics) # "backbutton" nav.addComponent(self._uriFragmentUtility) self._uriFragmentUtility.addListener(UriListener(self), IFragmentChangedListener) # Main left/right split; hidden menu tree self._mainSplit = HorizontalSplitPanel() self._mainSplit.setSizeFull() self._mainSplit.setStyleName('main-split') mainExpand.addComponent(self._mainSplit) mainExpand.setExpandRatio(self._mainSplit, 1) # Select theme themeSelect = self.createThemeSelect() nav.addComponent(themeSelect) nav.setComponentAlignment(themeSelect, Alignment.MIDDLE_LEFT) # Layouts for top area buttons quicknav = HorizontalLayout() arrows = HorizontalLayout() nav.addComponent(quicknav) nav.addComponent(arrows) nav.setComponentAlignment(quicknav, Alignment.MIDDLE_LEFT) nav.setComponentAlignment(arrows, Alignment.MIDDLE_LEFT) quicknav.setStyleName('segment') arrows.setStyleName('segment') # Previous sample self._previousSample = self.createPrevButton() arrows.addComponent(self._previousSample) # Next sample self._nextSample = self.createNextButton() arrows.addComponent(self._nextSample) # "Search" combobox searchComponent = self.createSearch() quicknav.addComponent(searchComponent) # Menu tree, initially shown menuLayout = CssLayout() allSamples = ActiveLink('All Samples', ExternalResource('#')) menuLayout.addComponent(allSamples) self._navigationTree = self.createMenuTree() menuLayout.addComponent(self._navigationTree) self._mainSplit.setFirstComponent(menuLayout) # Show / hide tree treeSwitch = self.createTreeSwitch() quicknav.addComponent(treeSwitch) self.addListener(WindowCloseListener(self, self._app), window.ICloseListener) self.updateFeatureList(self._currentList) def detach(self): super(SamplerWindow, self).detach() self._search.setContainerDataSource(None) self._navigationTree.setContainerDataSource(None) def removeSubwindows(self): wins = self.getChildWindows() if None is not wins: for w in wins: self.removeWindow(w) def setFeature(self, arg): """Displays a Feature(Set) or displays a Feature(Set) matching the given path, or the main view if no matching Feature(Set) is found. @param arg: Either the Feature(Set) to show or the path of the Feature(Set) to show """ if isinstance(arg, basestring): path = arg f = FeatureSet.FEATURES.getFeature(path) self.setFeature(f) else: f = arg if f == FeatureSet.FEATURES: # "All" is no longer in the tree, use null instead f = None self._currentFeature.setValue(f) fragment = f.getFragmentName() if f is not None else '' # self._webAnalytics.trackPageview(fragment) self._uriFragmentUtility.setFragment(fragment, False) self._breadcrumbs.setPath(self._app.getFullPathFor(f)) self._previousSample.setEnabled(f is not None) self._nextSample.setEnabled(not self._app._allFeatures.isLastId(f)) self.updateFeatureList(self._currentList) self.setCaption((f.getName() + ': ' if f is not None else '') + self._TITLE) # SamplerWindow helpers def createSearch(self): self._search = ComboBox() self._search.setWidth('160px') self._search.setNewItemsAllowed(False) self._search.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS) self._search.setNullSelectionAllowed(True) self._search.setImmediate(True) self._search.setInputPrompt('Search samples...') self._search.setContainerDataSource(self._app._allFeatures) for idd in self._app._allFeatures.getItemIds(): if isinstance(idd, FeatureSet): pass # FIXME: 'SamplerApplication' has no attribute 'getResourceAsStream' # self._search.setItemIcon(idd, # ClassResource('folder.gif', self._app)) self._search.addListener(SearchListener(self), prop.IValueChangeListener) # TODO add icons for section/sample # PopupView pv = new PopupView("", search) { public void # changeVariables(Object source, Map variables) { # super.changeVariables(source, variables); if (isPopupVisible()) { # search.focus(); } } }; pv = PopupView('<span></span>', self._search) pv.addListener(PopupListener(self), IPopupVisibilityListener) pv.setStyleName('quickjump') pv.setDescription('Quick jump') return pv def createThemeSelect(self): self.theme = ComboBox() self.theme.setWidth('32px') self.theme.setNewItemsAllowed(False) self.theme.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS) self.theme.setImmediate(True) self.theme.setNullSelectionAllowed(False) for themeName in self._app._THEMES: idd = self._app._SAMPLER_THEME_NAME + '-' + themeName self.theme.addItem(idd) self.theme.setItemCaption( idd, themeName[:1].upper() + (themeName[1:]) + ' theme') self.theme.setItemIcon(idd, _EMPTY_THEME_ICON) currentWindowTheme = self.getTheme() self.theme.setValue(currentWindowTheme) self.theme.setItemIcon(currentWindowTheme, _SELECTED_THEME_ICON) self.theme.addListener(ThemeChangeListener(self, self._app), prop.IValueChangeListener) self.theme.setStyleName('theme-select') self.theme.setDescription('Select Theme') return self.theme def createLogo(self): logo = NativeButton('', LogoClickListener(self)) logo.setDescription('Home') logo.setStyleName(BaseTheme.BUTTON_LINK) logo.addStyleName('logo') return logo def createNextButton(self): b = NativeButton('', NextClickListener(self, self._app)) b.setStyleName('next') b.setDescription('Jump to the next sample') return b def createPrevButton(self): b = NativeButton('', PrevClickListener(self, self._app)) b.setEnabled(False) b.setStyleName('previous') b.setDescription('Jump to the previous sample') return b def createTreeSwitch(self): b = NativeButton() b.setStyleName('tree-switch') b.addStyleName('down') b.setDescription('Toggle sample tree visibility') b.addListener(TreeClickListener(self), button.IClickListener) self._mainSplit.setSplitPosition(250, ISizeable.UNITS_PIXELS) return b def createMenuTree(self): tree = Tree() tree.setImmediate(True) tree.setStyleName('menu') tree.setContainerDataSource(self._app._allFeatures) self._currentFeature.addListener(FeatureChangeListener(self, tree), prop.IValueChangeListener) for f in FeatureSet.FEATURES.getFeatures(): tree.expandItemsRecursively(f) tree.expandItemsRecursively(FeatureSet.FEATURES) tree.addListener(TreeChangeListener(self), prop.IValueChangeListener) tree.setItemStyleGenerator(TreeStyleGenerator()) return tree def updateFeatureList(self, lst): self._currentList = lst val = self._currentFeature.getValue() if val is None: self._currentList.setFeatureContainer(self._app._allFeatures) self._mainSplit.setSecondComponent(self._currentList) elif isinstance(val, FeatureSet): self._currentList.setFeatureContainer(val.getContainer(True)) self._mainSplit.setSecondComponent(self._currentList) else: self._mainSplit.setSecondComponent(self._featureView) self._featureView.setFeature(val)
def testSetValueStringSub(self): prop = ObjectProperty(self._sub1, TestSubClass) self.assertEquals('Subclass: sub1', prop.getValue().getName()) prop.setValue('sub2') self.assertEquals('Subclass: sub1', self._sub1.getName()) self.assertEquals('Subclass: sub2', prop.getValue().getName())