From cdb11c4aa9d7b7a26e687968ad916ac4f7dd78f1 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Tue, 16 Oct 2012 11:44:34 -0600 Subject: [PATCH 01/12] Add a new showcase example that allows interactive editing of Kivy language code to see how it affects the widgets. --- examples/demo/kivycatalog/DroidSansMono.ttf | Bin 0 -> 117072 bytes examples/demo/kivycatalog/README | 20 +++ .../container_kvs/AnchorLayoutContainer.kv | 15 ++ .../container_kvs/BoxLayoutContainer.kv | 14 ++ .../container_kvs/ButtonContainer.kv | 27 +++ .../container_kvs/CheckBoxContainer.kv | 27 +++ .../container_kvs/FileChooserContainer.kv | 19 +++ .../container_kvs/FloatLayoutContainer.kv | 16 ++ .../container_kvs/GridLayoutContainer.kv | 20 +++ .../container_kvs/LabelContainer.kv | 21 +++ .../container_kvs/MediaContainer.kv | 9 + .../container_kvs/PlaygroundContainer.kv | 4 + .../container_kvs/PopupContainer.kv | 23 +++ .../container_kvs/ProgressBarContainer.kv | 17 ++ .../container_kvs/RestContainer.kv | 5 + .../container_kvs/ScatterContainer.kv | 16 ++ .../container_kvs/SelectorsContainer.kv | 10 ++ .../container_kvs/StackLayoutContainer.kv | 25 +++ .../container_kvs/TextContainer.kv | 20 +++ examples/demo/kivycatalog/kivycatalog.kv | 161 ++++++++++++++++++ examples/demo/kivycatalog/main.py | 138 +++++++++++++++ 21 files changed, 607 insertions(+) create mode 100644 examples/demo/kivycatalog/DroidSansMono.ttf create mode 100644 examples/demo/kivycatalog/README create mode 100644 examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/ButtonContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/LabelContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/MediaContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/PopupContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/RestContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/ScatterContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv create mode 100644 examples/demo/kivycatalog/container_kvs/TextContainer.kv create mode 100644 examples/demo/kivycatalog/kivycatalog.kv create mode 100644 examples/demo/kivycatalog/main.py diff --git a/examples/demo/kivycatalog/DroidSansMono.ttf b/examples/demo/kivycatalog/DroidSansMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6e79dad17fc95ac20b6f52097f70b2ca652316f2 GIT binary patch literal 117072 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: + language_box: language_box + BoxLayout: + spacing: 5 + TabbedPanel: + size_hint: .6, 1 + tab_pos: "left_top" + default_tab_text: "Introduction" + default_tab_content: introduction_tab + on_default_tab: root.show_kv(*args) + + + Accordion: + id: introduction_tab + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Playground" + kv_container: playground + PlaygroundContainer: + id: playground + AccordionItem: + title: "Welcome" + Label: + text_size: self.width-60, self.height-60 + valign: "middle" + text: "The Kivy Catalog is an interactive showcase of Kivy Widgets defined in the Kivy language. For each widget you see, you can directly edit the .kv language syntax to see what effects your changes have on the widget.\n\nThere is also a playground on this tab where you can test your Kivy language code directly. This is beta software. The basics seem to work, but some widgets are missing or don't have the ideal .kv representation. Not all widgets are represented yet. It is trivial to add a new .kv file to the interface.\n\nPull requests are welcome." + + TabbedPanelHeader: + text: 'Layouts' + content: layout_tab + on_state: root.show_kv(*args) + TabbedPanelHeader: + text: 'UX Widgets' + content: basic_widgets + on_state: root.show_kv(*args) + TabbedPanelHeader: + text: 'Complex' + content: complex_widgets + on_state: root.show_kv(*args) + + Accordion: + id: layout_tab + AccordionItem: + on_collapse: root.show_kv(*args) + title: "FloatLayout" + kv_container: floatlayoutcontainer + FloatLayoutContainer: + id: floatlayoutcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "BoxLayout" + kv_container: boxlayoutcontainer + BoxLayoutContainer: + id: boxlayoutcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "AnchorLayout" + kv_container: anchorlayoutcontainer + AnchorLayoutContainer: + id: anchorlayoutcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "GridLayout" + kv_container: gridlayoutcontainer + GridLayoutContainer: + id: gridlayoutcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "StackLayout" + kv_container: stacklayoutcontainer + StackLayoutContainer: + id: stacklayoutcontainer + Accordion: + id: basic_widgets + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Buttons" + kv_container: buttoncontainer + ButtonContainer: + id: buttoncontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Labels" + kv_container: labelcontainer + LabelContainer: + id: labelcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Booleans" + kv_container: checkboxcontainer + CheckBoxContainer: + id: checkboxcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Progress Bar" + kv_container: progressbarcontainer + ProgressBarContainer: + id: progressbarcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Media" + kv_container: mediacontainer + MediaContainer: + id: mediacontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Text" + kv_container: textcontainer + TextContainer: + id: textcontainer + Accordion: + id: complex_widgets + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Popups" + kv_container: popupcontainer + PopupContainer: + id: popupcontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Selectors" + kv_container: selectorscontainer + SelectorsContainer: + id: selectorscontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "FileChoosers" + kv_container: filechoosercontainer + FileChooserContainer: + id: filechoosercontainer + AccordionItem: + on_collapse: root.show_kv(*args) + title: "Scatter" + kv_container: scatter + ScatterContainer: + id: scatter + AccordionItem: + on_collapse: root.show_kv(*args) + title: "ReST" + kv_container: rest + RestContainer: + id: rest + + BoxLayout: + id: bl + orientation: "vertical" + size_hint: .4, 1 + TextInput: + text_size: self.width-20, self.height-20 + font_name: "DroidSansMono.ttf" + valign: "top" + id: language_box + text: "This box will display the kivy language for whatever has been selected" + Button: + size_hint: 1, None + height: 50 + text: "Render" + on_press: root.change_kv(*args) diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py new file mode 100644 index 000000000..74bb85ef7 --- /dev/null +++ b/examples/demo/kivycatalog/main.py @@ -0,0 +1,138 @@ +import os +from kivy.app import App +from kivy.factory import Factory +from kivy.lang import Builder, Parser, ParserException +from kivy.properties import ObjectProperty + +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.popup import Popup +from kivy.uix.label import Label + +'''List of classes that need to be instantiated in the factory from .kv files. +''' +CONTAINER_CLASSES = [c[:-3] for c in os.listdir('container_kvs') + if c.endswith('.kv')] + + +def factoryable(class_name, parents, attrs): + '''Metaclass that automatically records the resultant class in the Factory. + This allows the class to be accessed inside the .kv language file in the + Builder. + ''' + cls = type(class_name, parents, attrs) + Factory.register(class_name, cls) + return cls + + +class Container(BoxLayout): + '''A container is essentially a class that loads its root from a known + .kv file. + + The name of the .kv file is taken from the Container's class. + We can't just use kv rules because the class may be edited + in the interface and reloaded by the user. + See :meth: change_kv where this happens. + ''' + __metaclass__ = factoryable + + def __init__(self, **kwargs): + super(Container, self).__init__(**kwargs) + parser = Parser(content=file(self.kv_file).read()) + widget = Factory.get(parser.root.name)() + Builder._apply_rule(widget, parser.root, parser.root) + self.add_widget(widget) + + @property + def kv_file(self): + '''Get the name of the kv file, a lowercase version of the class name.''' + return os.path.join('container_kvs', + self.__class__.__name__ + ".kv") + + +for class_name in CONTAINER_CLASSES: + globals()[class_name] = type(class_name, (Container,), {}) + + +class Catalog(BoxLayout): + '''Catalog of widgets. This is the root widget of the app. It contains + a tabbed pain of widgets that can be displayed and a textbox where .kv + language files for widgets being demoed can be edited. + + The entire interface for the Catalog is defined in kivycatalog.kv, although + individual containers are defined in the container_kvs directory. + + To add a container to the catalog, + first create the .kv file in container_kvs + The name of the file (sans .kv) will be the name of the widget available + inside the kivycatalog.kv + Finally modify kivycatalog.kv to add an AccordionItem + to hold the new widget. + Follow the examples in kivycatalog.kv to ensure the item + has an appropriate id and the class has been referenced. + + You do not need to edit any python code, just .kv language files! + ''' + language_box = ObjectProperty() + + def __init__(self, **kwargs): + super(Catalog, self).__init__(**kwargs) + self.kv_container = None + from kivy.clock import Clock + Clock.schedule_once(self.show_kv) + + def show_kv(self, object, collapsed=None): + '''Called when an accordionitem is collapsed or expanded. If it + was expanded, we need to show the .kv language file associated with + the newly revealed container.''' + if collapsed == "down": # a tabbed panel was clicked, not an accordion + object = object.content.children[0] + collapsed = False + if collapsed is False and hasattr(object, "kv_container"): + with open(object.kv_container.kv_file) as file: + self.language_box.background_color = (1, 1, 1, 1) + self.language_box.readonly = False + self.language_box.text = file.read() + self.kv_container = object.kv_container + else: + self.language_box.background_color = (1, 1, 1, .5) + self.language_box.text = "" + self.language_box.readonly = True + self.kv_container = None + + def change_kv(self, button): + '''Called when the update button is clicked. Needs to update the + interface for the currently active kv widget, if there is one based + on the kv file the user entered. If there is an error in their kv + syntax, show a nice popup.''' + if self.kv_container: + try: + parser = Parser(content=self.language_box.text.encode('utf8')) + self.kv_container.clear_widgets() + widget = Factory.get(parser.root.name)() + Builder._apply_rule(widget, parser.root, parser.root) + self.kv_container.add_widget(widget) + except (SyntaxError, ParserException) as e: + content = Label(text=str(e), text_size=(350, None)) + popup = Popup(title="Parse Error in Kivy Language Markup", + content=content, text_size=(350, None), + size_hint=(None, None), size=(400, 400)) + popup.open() + except: + import traceback + traceback.print_exc() + popup = Popup(title="Boom", + content=Label(text="Something horrible happened while parsing your Kivy Language", text_size=(350, None)), + text_size=(350, None), + size_hint=(None, None), size=(400, 400)) + popup.open() + + +class KivyCatalogApp(App): + '''The kivy App that runs the main root. All we do is build a catalog + widget into the root.''' + def build(self): + return Catalog() + + +if __name__ == "__main__": + KivyCatalogApp().run() From c093c824004ae0fb276554a3120b89d283200a56 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 19:13:34 -0600 Subject: [PATCH 02/12] class decorators are so much sexier than meta classes --- examples/demo/kivycatalog/main.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py index 74bb85ef7..21d7700ba 100644 --- a/examples/demo/kivycatalog/main.py +++ b/examples/demo/kivycatalog/main.py @@ -14,16 +14,17 @@ CONTAINER_CLASSES = [c[:-3] for c in os.listdir('container_kvs') if c.endswith('.kv')] -def factoryable(class_name, parents, attrs): - '''Metaclass that automatically records the resultant class in the Factory. - This allows the class to be accessed inside the .kv language file in the - Builder. +def factoryable(cls): + '''Class decorator that automatically records + the resultant class in the Factory. + This allows the class to be accessed + inside the .kv language file in the Builder. ''' - cls = type(class_name, parents, attrs) - Factory.register(class_name, cls) + Factory.register(cls.__name__, cls) return cls +@factoryable class Container(BoxLayout): '''A container is essentially a class that loads its root from a known .kv file. @@ -33,7 +34,6 @@ class Container(BoxLayout): in the interface and reloaded by the user. See :meth: change_kv where this happens. ''' - __metaclass__ = factoryable def __init__(self, **kwargs): super(Container, self).__init__(**kwargs) From a10a5131338d6b1af1edabc39e539481a71561f6 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 19:26:10 -0600 Subject: [PATCH 03/12] Add a keybinding to the Kivy textarea to render when ctrl-S is pressed. --- examples/demo/kivycatalog/kivycatalog.kv | 2 +- examples/demo/kivycatalog/main.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/examples/demo/kivycatalog/kivycatalog.kv b/examples/demo/kivycatalog/kivycatalog.kv index 8fb2d2e54..636f425b7 100644 --- a/examples/demo/kivycatalog/kivycatalog.kv +++ b/examples/demo/kivycatalog/kivycatalog.kv @@ -148,7 +148,7 @@ id: bl orientation: "vertical" size_hint: .4, 1 - TextInput: + KivyRenderTextInput: text_size: self.width-20, self.height-20 font_name: "DroidSansMono.ttf" valign: "top" diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py index 21d7700ba..b7fa5fc4e 100644 --- a/examples/demo/kivycatalog/main.py +++ b/examples/demo/kivycatalog/main.py @@ -1,4 +1,5 @@ import os +import sys from kivy.app import App from kivy.factory import Factory from kivy.lang import Builder, Parser, ParserException @@ -7,6 +8,7 @@ from kivy.properties import ObjectProperty from kivy.uix.boxlayout import BoxLayout from kivy.uix.popup import Popup from kivy.uix.label import Label +from kivy.uix.textinput import TextInput '''List of classes that need to be instantiated in the factory from .kv files. ''' @@ -53,6 +55,25 @@ for class_name in CONTAINER_CLASSES: globals()[class_name] = type(class_name, (Container,), {}) +@factoryable +class KivyRenderTextInput(TextInput): + def _keyboard_on_key_down(self, window, keycode, text, modifiers): + is_osx = sys.platform == 'darwin' + # Keycodes on OSX: + ctrl, cmd = 64, 1024 + key, key_str = keycode + + if text and not key in (self.interesting_keys.keys() + [27]): + # This allows *either* ctrl *or* cmd, but not both. + if modifiers == ['ctrl'] or (is_osx and modifiers == ['meta']): + if key == ord('s'): + self.parent.parent.parent.change_kv(True) + return + + super(KivyRenderTextInput, self)._keyboard_on_key_down( + window, keycode, text, modifiers) + + class Catalog(BoxLayout): '''Catalog of widgets. This is the root widget of the app. It contains a tabbed pain of widgets that can be displayed and a textbox where .kv From 4a4adfeaac9ef7090189a1e8e2f7f48c26eed507 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 19:32:12 -0600 Subject: [PATCH 04/12] Update the more or less pathetic help screen. --- examples/demo/kivycatalog/kivycatalog.kv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo/kivycatalog/kivycatalog.kv b/examples/demo/kivycatalog/kivycatalog.kv index 636f425b7..be37b77f7 100644 --- a/examples/demo/kivycatalog/kivycatalog.kv +++ b/examples/demo/kivycatalog/kivycatalog.kv @@ -26,7 +26,7 @@ Label: text_size: self.width-60, self.height-60 valign: "middle" - text: "The Kivy Catalog is an interactive showcase of Kivy Widgets defined in the Kivy language. For each widget you see, you can directly edit the .kv language syntax to see what effects your changes have on the widget.\n\nThere is also a playground on this tab where you can test your Kivy language code directly. This is beta software. The basics seem to work, but some widgets are missing or don't have the ideal .kv representation. Not all widgets are represented yet. It is trivial to add a new .kv file to the interface.\n\nPull requests are welcome." + text: "The Kivy Catalog is an interactive showcase of Kivy Widgets defined in the Kivy language. For each widget you see, you can directly edit the .kv language syntax to see what effects your changes have on the widget. Click 'Render' or hit 'Ctrl-S' to view your changes.\n\nThere is also a playground on this tab where you can test your Kivy language code directly. This is beta software. The basics seem to work, but some widgets are missing or don't have the ideal .kv representation. Not all widgets are represented yet. It is trivial to add a new .kv file to the interface.\n\nPull requests are welcome." TabbedPanelHeader: text: 'Layouts' From 4715beff3643a726a99df8a6eaa91702b84ded50 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 21:48:34 -0600 Subject: [PATCH 05/12] Switch to a screen manager for better use of screen real estate --- .../container_kvs/PlaygroundContainer.kv | 4 +- examples/demo/kivycatalog/kivycatalog.kv | 241 ++++++++---------- examples/demo/kivycatalog/main.py | 76 +++--- 3 files changed, 140 insertions(+), 181 deletions(-) diff --git a/examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv b/examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv index afb25979b..9cdb3352d 100644 --- a/examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +++ b/examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv @@ -1,4 +1,6 @@ #:kivy 1.4 Label: - text: "Paste your Kivy code in here and render!" \ No newline at end of file + text_size: self.width-60, self.height-60 + valign: "middle" + text: "The Kivy Catalog is an interactive showcase of Kivy Widgets defined in the Kivy language. For each widget you see, you can directly edit the .kv language syntax to see what effects your changes have on the widget. Click 'Render' or hit 'Ctrl-S' to view your changes.\n\nThere is also a playground on this tab where you can test your Kivy language code directly. This is beta software. The basics seem to work, but some widgets are missing or don't have the ideal .kv representation. Not all widgets are represented yet. It is trivial to add a new .kv file to the interface.\n\nPull requests are welcome." diff --git a/examples/demo/kivycatalog/kivycatalog.kv b/examples/demo/kivycatalog/kivycatalog.kv index be37b77f7..371b3f824 100644 --- a/examples/demo/kivycatalog/kivycatalog.kv +++ b/examples/demo/kivycatalog/kivycatalog.kv @@ -1,153 +1,112 @@ #:kivy 1.4 +[ContainerToggle@ToggleButton]: + group: "container_toggle" + text: ctx.text + on_press: root.parent.parent.parent.show_kv(*args) + state: ctx.state if hasattr(ctx, "state") else "normal" : language_box: language_box + screen_manager: screen_manager BoxLayout: - spacing: 5 - TabbedPanel: - size_hint: .6, 1 - tab_pos: "left_top" - default_tab_text: "Introduction" - default_tab_content: introduction_tab - on_default_tab: root.show_kv(*args) - - - Accordion: - id: introduction_tab - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Playground" - kv_container: playground - PlaygroundContainer: - id: playground - AccordionItem: - title: "Welcome" - Label: - text_size: self.width-60, self.height-60 - valign: "middle" - text: "The Kivy Catalog is an interactive showcase of Kivy Widgets defined in the Kivy language. For each widget you see, you can directly edit the .kv language syntax to see what effects your changes have on the widget. Click 'Render' or hit 'Ctrl-S' to view your changes.\n\nThere is also a playground on this tab where you can test your Kivy language code directly. This is beta software. The basics seem to work, but some widgets are missing or don't have the ideal .kv representation. Not all widgets are represented yet. It is trivial to add a new .kv file to the interface.\n\nPull requests are welcome." - - TabbedPanelHeader: - text: 'Layouts' - content: layout_tab - on_state: root.show_kv(*args) - TabbedPanelHeader: - text: 'UX Widgets' - content: basic_widgets - on_state: root.show_kv(*args) - TabbedPanelHeader: - text: 'Complex' - content: complex_widgets - on_state: root.show_kv(*args) - - Accordion: - id: layout_tab - AccordionItem: - on_collapse: root.show_kv(*args) - title: "FloatLayout" - kv_container: floatlayoutcontainer - FloatLayoutContainer: - id: floatlayoutcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "BoxLayout" - kv_container: boxlayoutcontainer - BoxLayoutContainer: - id: boxlayoutcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "AnchorLayout" - kv_container: anchorlayoutcontainer - AnchorLayoutContainer: - id: anchorlayoutcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "GridLayout" - kv_container: gridlayoutcontainer - GridLayoutContainer: - id: gridlayoutcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "StackLayout" - kv_container: stacklayoutcontainer - StackLayoutContainer: - id: stacklayoutcontainer - Accordion: - id: basic_widgets - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Buttons" - kv_container: buttoncontainer - ButtonContainer: - id: buttoncontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Labels" - kv_container: labelcontainer - LabelContainer: - id: labelcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Booleans" - kv_container: checkboxcontainer - CheckBoxContainer: - id: checkboxcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Progress Bar" - kv_container: progressbarcontainer - ProgressBarContainer: - id: progressbarcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Media" - kv_container: mediacontainer - MediaContainer: - id: mediacontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Text" - kv_container: textcontainer - TextContainer: - id: textcontainer - Accordion: - id: complex_widgets - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Popups" - kv_container: popupcontainer - PopupContainer: - id: popupcontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Selectors" - kv_container: selectorscontainer - SelectorsContainer: - id: selectorscontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "FileChoosers" - kv_container: filechoosercontainer - FileChooserContainer: - id: filechoosercontainer - AccordionItem: - on_collapse: root.show_kv(*args) - title: "Scatter" - kv_container: scatter - ScatterContainer: - id: scatter - AccordionItem: - on_collapse: root.show_kv(*args) - title: "ReST" - kv_container: rest - RestContainer: - id: rest + BoxLayout: + size_hint: None, 1 + orientation: "vertical" + ContainerToggle: + text: "Welcome" + state: "down" + ContainerToggle: + text: "Float Layout" + ContainerToggle: + text: "Box Layout" + ContainerToggle: + text: "Anchor Layout" + ContainerToggle: + text: "Grid Layout" + ContainerToggle: + text: "Stack Layout" + ContainerToggle: + text: "Buttons" + ContainerToggle: + text: "Labels" + ContainerToggle: + text: "Booleans" + ContainerToggle: + text: "Progress Bar" + ContainerToggle: + text: "Media" + ContainerToggle: + text: "Text" + ContainerToggle: + text: "Popups" + ContainerToggle: + text: "Selectors" + ContainerToggle: + text: "File Choosers" + ContainerToggle: + text: "Scatter" + ContainerToggle: + text: "ReST" + ScreenManager: + id: screen_manager + size_hint: 1, 1 + Screen: + name: "Welcome" + PlaygroundContainer: + Screen: + name: "Float Layout" + FloatLayoutContainer + Screen: + name: "Box Layout" + BoxLayoutContainer: + Screen: + name: "Anchor Layout" + AnchorLayoutContainer: + Screen: + name: "Grid Layout" + GridLayoutContainer: + Screen: + name: "Stack Layout" + StackLayoutContainer: + Screen: + name: "Buttons" + ButtonContainer: + Screen: + name: "Labels" + LabelContainer: + Screen: + name: "Booleans" + CheckBoxContainer: + Screen: + name: "Progress Bar" + ProgressBarContainer: + Screen: + name: "Media" + MediaContainer: + Screen: + name: "Text" + TextContainer: + Screen: + name: "Popups" + PopupContainer: + Screen: + name: "Selectors" + SelectorsContainer: + Screen: + name: "File Choosers" + FileChooserContainer: + Screen: + name: "Scatter" + ScatterContainer: + Screen: + name: "ReST" + RestContainer: BoxLayout: id: bl orientation: "vertical" - size_hint: .4, 1 + size_hint: 1, 1 KivyRenderTextInput: text_size: self.width-20, self.height-20 font_name: "DroidSansMono.ttf" @@ -158,4 +117,4 @@ size_hint: 1, None height: 50 text: "Render" - on_press: root.change_kv(*args) + on_press: root.change_kv(*args) \ No newline at end of file diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py index b7fa5fc4e..c8b1983a0 100644 --- a/examples/demo/kivycatalog/main.py +++ b/examples/demo/kivycatalog/main.py @@ -94,58 +94,56 @@ class Catalog(BoxLayout): You do not need to edit any python code, just .kv language files! ''' language_box = ObjectProperty() + screen_manager = ObjectProperty() def __init__(self, **kwargs): super(Catalog, self).__init__(**kwargs) - self.kv_container = None - from kivy.clock import Clock - Clock.schedule_once(self.show_kv) + self.show_kv(None) - def show_kv(self, object, collapsed=None): + def show_kv(self, object): '''Called when an accordionitem is collapsed or expanded. If it was expanded, we need to show the .kv language file associated with the newly revealed container.''' - if collapsed == "down": # a tabbed panel was clicked, not an accordion - object = object.content.children[0] - collapsed = False - if collapsed is False and hasattr(object, "kv_container"): - with open(object.kv_container.kv_file) as file: - self.language_box.background_color = (1, 1, 1, 1) - self.language_box.readonly = False - self.language_box.text = file.read() - self.kv_container = object.kv_container - else: - self.language_box.background_color = (1, 1, 1, .5) - self.language_box.text = "" - self.language_box.readonly = True - self.kv_container = None + + # if object is not passed, it's initialization, we just need to load + # the file + if object: + # one button must always be pressed, even if user presses it again + if object.state == "normal": + object.state = "down" + + self.screen_manager.current = object.text + + with open(self.screen_manager.current_screen.content.children[ + 0].kv_file) as file: + self.language_box.text = file.read() def change_kv(self, button): '''Called when the update button is clicked. Needs to update the interface for the currently active kv widget, if there is one based on the kv file the user entered. If there is an error in their kv syntax, show a nice popup.''' - if self.kv_container: - try: - parser = Parser(content=self.language_box.text.encode('utf8')) - self.kv_container.clear_widgets() - widget = Factory.get(parser.root.name)() - Builder._apply_rule(widget, parser.root, parser.root) - self.kv_container.add_widget(widget) - except (SyntaxError, ParserException) as e: - content = Label(text=str(e), text_size=(350, None)) - popup = Popup(title="Parse Error in Kivy Language Markup", - content=content, text_size=(350, None), - size_hint=(None, None), size=(400, 400)) - popup.open() - except: - import traceback - traceback.print_exc() - popup = Popup(title="Boom", - content=Label(text="Something horrible happened while parsing your Kivy Language", text_size=(350, None)), - text_size=(350, None), - size_hint=(None, None), size=(400, 400)) - popup.open() + kv_container = self.screen_manager.current_screen.content.children[0] + try: + parser = Parser(content=self.language_box.text.encode('utf8')) + kv_container.clear_widgets() + widget = Factory.get(parser.root.name)() + Builder._apply_rule(widget, parser.root, parser.root) + kv_container.add_widget(widget) + except (SyntaxError, ParserException) as e: + content = Label(text=str(e), text_size=(350, None)) + popup = Popup(title="Parse Error in Kivy Language Markup", + content=content, text_size=(350, None), + size_hint=(None, None), size=(400, 400)) + popup.open() + except: + import traceback + traceback.print_exc() + popup = Popup(title="Boom", + content=Label(text="Something horrible happened while parsing your Kivy Language", text_size=(350, None)), + text_size=(350, None), + size_hint=(None, None), size=(400, 400)) + popup.open() class KivyCatalogApp(App): From d2538382cd947ccc43a4e902d0235c7c3268340e Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 21:50:23 -0600 Subject: [PATCH 06/12] Fix bugs in scatter demo --- examples/demo/kivycatalog/container_kvs/ScatterContainer.kv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/demo/kivycatalog/container_kvs/ScatterContainer.kv b/examples/demo/kivycatalog/container_kvs/ScatterContainer.kv index 16cd4d93c..3b94f6124 100644 --- a/examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +++ b/examples/demo/kivycatalog/container_kvs/ScatterContainer.kv @@ -1,12 +1,12 @@ #:kivy 1.4 -BoxLayout: +FloatLayout: Scatter: size_hint: None, None size: 100, 100 pos: 100, 100 Image: - source: 'softboy.png' + source: "../../widgets/softboy.png" Scatter: size_hint: None, None size: 100, 100 From 967ba589621ac520728609f400375c930385cb71 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 21:53:42 -0600 Subject: [PATCH 07/12] One issue fixed --- examples/demo/kivycatalog/README | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/demo/kivycatalog/README b/examples/demo/kivycatalog/README index e51568e75..e9b5dc8ce 100644 --- a/examples/demo/kivycatalog/README +++ b/examples/demo/kivycatalog/README @@ -11,7 +11,6 @@ python main.py and browse or edit widgets to your heart's content. Known bugs: * StackLayout is misbehaving * The DropDown item I had tested completely crashes Kivy -* Scatter seems to do some weird translation on multitouch. This is probably an Accordion related bug * The GridLayout example could use some extra features * If you try to start the app with focused set to true, weird stuff happens. but it works fine if you set focused to true and press render. From d9bf952eba4d470a8f8a98e8f21c460a0b2a7fc2 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Wed, 17 Oct 2012 21:58:11 -0600 Subject: [PATCH 08/12] Make the text area a fixed width to give more room to demo results --- examples/demo/kivycatalog/kivycatalog.kv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/demo/kivycatalog/kivycatalog.kv b/examples/demo/kivycatalog/kivycatalog.kv index 371b3f824..c97b33af4 100644 --- a/examples/demo/kivycatalog/kivycatalog.kv +++ b/examples/demo/kivycatalog/kivycatalog.kv @@ -50,7 +50,6 @@ text: "ReST" ScreenManager: id: screen_manager - size_hint: 1, 1 Screen: name: "Welcome" PlaygroundContainer: @@ -106,7 +105,8 @@ BoxLayout: id: bl orientation: "vertical" - size_hint: 1, 1 + size_hint: None, 1 + width: 400 KivyRenderTextInput: text_size: self.width-20, self.height-20 font_name: "DroidSansMono.ttf" From 810cd555a9dc438a19cd98132b13f0778ca933d9 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Thu, 18 Oct 2012 15:24:11 -0600 Subject: [PATCH 09/12] No need to explicitly register subclasses of Widget in Kivy 1.5 --- examples/demo/kivycatalog/main.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py index c8b1983a0..e65ceaa86 100644 --- a/examples/demo/kivycatalog/main.py +++ b/examples/demo/kivycatalog/main.py @@ -16,17 +16,6 @@ CONTAINER_CLASSES = [c[:-3] for c in os.listdir('container_kvs') if c.endswith('.kv')] -def factoryable(cls): - '''Class decorator that automatically records - the resultant class in the Factory. - This allows the class to be accessed - inside the .kv language file in the Builder. - ''' - Factory.register(cls.__name__, cls) - return cls - - -@factoryable class Container(BoxLayout): '''A container is essentially a class that loads its root from a known .kv file. @@ -55,7 +44,6 @@ for class_name in CONTAINER_CLASSES: globals()[class_name] = type(class_name, (Container,), {}) -@factoryable class KivyRenderTextInput(TextInput): def _keyboard_on_key_down(self, window, keycode, text, modifiers): is_osx = sys.platform == 'darwin' From 4879498652175561440cbe5e4416c2d60803d41a Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Thu, 18 Oct 2012 15:29:42 -0600 Subject: [PATCH 10/12] Set a default size of 1024x768 on the window. This may not be an appropriate default size. But it is a default size. ;) --- examples/demo/kivycatalog/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/demo/kivycatalog/main.py b/examples/demo/kivycatalog/main.py index e65ceaa86..6a02fc70e 100644 --- a/examples/demo/kivycatalog/main.py +++ b/examples/demo/kivycatalog/main.py @@ -1,15 +1,23 @@ +import kivy +kivy.require('1.4.2') import os import sys from kivy.app import App from kivy.factory import Factory from kivy.lang import Builder, Parser, ParserException from kivy.properties import ObjectProperty +from kivy.config import Config from kivy.uix.boxlayout import BoxLayout from kivy.uix.popup import Popup from kivy.uix.label import Label from kivy.uix.textinput import TextInput +print Config.get('graphics', 'width') + +Config.set('graphics', 'width', '1024') +Config.set('graphics', 'height', '768') + '''List of classes that need to be instantiated in the factory from .kv files. ''' CONTAINER_CLASSES = [c[:-3] for c in os.listdir('container_kvs') From 8a4351c3db043acb6e6c3d728a22af4b20d19936 Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Mon, 22 Oct 2012 21:47:32 -0600 Subject: [PATCH 11/12] Make stack layout more representative --- .../container_kvs/StackLayoutContainer.kv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv b/examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv index 981d5d2e3..867261d1a 100644 --- a/examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +++ b/examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv @@ -6,20 +6,20 @@ StackLayout: spacing: 5 Button: text: "Button 1" - size_hint: .2, .5 + size_hint: .2, .4 width: 100 Button: text: "Button 2" - size_hint: .2, .5 + size_hint: .2, .4 Button: text: "Button 3" - size_hint: .2, .5 + size_hint: .2, .4 Button: text: "Button 4" - size_hint: .2, .5 + size_hint: .2, .4 Button: text: "Button 5" - size_hint: .2, .5 + size_hint: .2, .4 Button: text: "Button 6" - size_hint: .2, .5 + size_hint: .2, .4 \ No newline at end of file From d2abb515197d981381c1bbe3642c190f9f76192b Mon Sep 17 00:00:00 2001 From: Dusty Phillips Date: Mon, 22 Oct 2012 21:47:58 -0600 Subject: [PATCH 12/12] Remove TODO --- examples/demo/kivycatalog/README | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/demo/kivycatalog/README b/examples/demo/kivycatalog/README index e9b5dc8ce..6c3b5dac0 100644 --- a/examples/demo/kivycatalog/README +++ b/examples/demo/kivycatalog/README @@ -9,7 +9,6 @@ a la http://kivy.org/docs/installation/installation.html Then run python main.py and browse or edit widgets to your heart's content. Known bugs: -* StackLayout is misbehaving * The DropDown item I had tested completely crashes Kivy * The GridLayout example could use some extra features * If you try to start the app with focused set to true, weird stuff happens.