From c6ba96970224b346d1bde31dd8b5d67f43bb9a37 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sun, 31 Dec 2023 19:53:59 +0100 Subject: [PATCH 01/10] Main screen layout, just for fun https://github.com/MathNodes/meile-gui/issues/64 --- tests/v2/main_screen.py | 188 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 tests/v2/main_screen.py diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py new file mode 100644 index 00000000..2ddf0ead --- /dev/null +++ b/tests/v2/main_screen.py @@ -0,0 +1,188 @@ +from kivy.lang import Builder +from kivymd.app import MDApp +from kivy.core.window import Window +from kivy.utils import get_color_from_hex +from kivymd.uix.boxlayout import MDBoxLayout +from kivy.uix.screenmanager import ScreenManager, Screen + +from kivymd.uix.expansionpanel import MDExpansionPanel, MDExpansionPanelTwoLine + +KV = """ +#:import get_color_from_hex kivy.utils.get_color_from_hex + +WindowManager: + + + adaptive_height: True + orientation: 'vertical' + + OneLineListItem: + text: "Node1" + text_color: "white" + theme_text_color: "Custom" + font_style: "Overline" + bg_color: "black" + + OneLineListItem: + text: "Node 2" + text_color: "white" + theme_text_color: "Custom" + font_style: "Overline" + bg_color: "black" + + OneLineListItem: + text: "Node 3" + text_color: "white" + theme_text_color: "Custom" + font_style: "Overline" + bg_color: "black" + +: + name: "main" + MDGridLayout: + md_bg_color: get_color_from_hex("#121212") + rows: 2 + + MDBoxLayout: + md_bg_color: get_color_from_hex("#212221") + size_hint_y: None + height: 50 + + MDLabel: + padding: 10 + text: "Meile" + font_style: "H4" + text_color: "white" + theme_text_color: "Custom" + + MDGridLayout: + cols: 2 + md_bg_color: get_color_from_hex("#212221") + + MDGridLayout: + rows: 4 + padding: 10 + size_hint_x: None + width: 250 + md_bg_color: get_color_from_hex("#060606") + align: "center" + + MDRectangleFlatIconButton: + size_hint_y: None + + text: "Connect" + text_color: "black" + icon: "lightning-bolt" + icon_color: "black" + md_bg_color: get_color_from_hex("#FCB70C") + line_color: 0, 0, 0, 0 + font_size: "16sp" + size_hint: 1, 0 + + MDTextField: + icon_left: "magnify" + line_color_normal: get_color_from_hex("#FCB70C") + line_color_focus: get_color_from_hex("#FCB70C") + icon_left_color_normal: get_color_from_hex("#FCB70C") + icon_left_color_focus: get_color_from_hex("#FCB70C") + text_color_normal: get_color_from_hex("#FCB70C") + text_color_focus: get_color_from_hex("#FCB70C") + + MDScrollView: + MDList: + id: countries_list + spacing: 3 + padding: 10 + + MDBoxLayout: + size_hint_y: None + height: 50 + + MDIconButton: + icon: "wallet" + theme_text_color: "Custom" + text_color: "white" + + MDIconButton: + icon: "cog" + theme_text_color: "Custom" + text_color: "white" + + MDIconButton: + icon: "help-circle" + theme_text_color: "Custom" + text_color: "white" + + + + MDFloatLayout: + orientation: "horizontal" + md_bg_color: get_color_from_hex("#131313") +""" + +class WindowManager(ScreenManager): + pass + + +class Content(MDBoxLayout): + pass + + +class MainScreen(Screen): + def __init__(self, **kwargs): + super().__init__() + self.build() + + def build(self): + import random + countries = ["France", "Italy", "Brasil", "Egypt", "Belgium", "Deutschland", "Canada"] + for _ in range(0, 100): + country = random.choice(countries) + + # item = TwoLineAvatarListItem( + # radius = [10, 10, 10, 10], + # bg_color = get_color_from_hex("#212221"), + # text = country, + # text_color = "white", + # theme_text_color = "Custom", + # font_style = "Subtitle1", + # secondary_text = f"{random.randint(1, 100)} servers", + # secondary_text_color = "white", + # secondary_theme_text_color = "Custom", + # secondary_font_style = "Caption", + # ) + # item.add_widget(ImageLeftWidget(source=f"../../src/imgs/{country[:2].lower()}.png")) + + item = MDExpansionPanel( + icon=f"../../src/imgs/{country[:2].lower()}.png", + content=Content(), + panel_cls=MDExpansionPanelTwoLine( + radius = [10, 10, 10, 10], + bg_color = get_color_from_hex("#212221"), + text = country, + text_color = "white", + theme_text_color = "Custom", + font_style = "Subtitle1", + secondary_text = f"{random.randint(1, 100)} servers", + secondary_text_color = "white", + secondary_theme_text_color = "Custom", + secondary_font_style = "Caption", + ) + ) + self.ids.countries_list.add_widget(item) + + + +Builder.load_string(KV) +class Test(MDApp): + title = "MainScreen v2" + + def build(self): + Window.size = (1280,720) + + manager = WindowManager() + manager.add_widget(MainScreen()) + return manager + +if __name__ == "__main__": + Test().run() \ No newline at end of file From 00686f6e95ba188a51e85a394c8a2e95be59e0ea Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Thu, 4 Jan 2024 13:17:19 +0100 Subject: [PATCH 02/10] Custom MDExpansionPanelRoundIcon and MDExpansionPanelTwoLineSmall (round icon with small size) --- tests/v2/main_screen.py | 271 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 267 insertions(+), 4 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index 2ddf0ead..a6ee161e 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -5,7 +5,37 @@ from kivymd.uix.boxlayout import MDBoxLayout from kivy.uix.screenmanager import ScreenManager, Screen -from kivymd.uix.expansionpanel import MDExpansionPanel, MDExpansionPanelTwoLine +from kivymd.uix.expansionpanel import MDExpansionPanelOneLine, MDExpansionPanelThreeLine, MDExpansionPanelLabel + +from kivymd.uix.behaviors import RoundedRectangularElevationBehavior, CommonElevationBehavior, RectangularRippleBehavior, CircularRippleBehavior +from kivy.uix.behaviors import ButtonBehavior +from kivymd.uix.fitimage.fitimage import FitImage + +import os +from typing import Union + +from kivy.animation import Animation +from kivy.clock import Clock +from kivy.lang import Builder +from kivy.metrics import dp +from kivy.properties import NumericProperty, ObjectProperty, StringProperty +from kivy.uix.relativelayout import RelativeLayout +from kivy.uix.widget import WidgetException + +import kivymd.material_resources as m_res +from kivymd import uix_path +from kivymd.icon_definitions import md_icons +from kivymd.uix.button import MDIconButton +from kivymd.uix.list import ( + IconLeftWidget, + ImageLeftWidget, + IRightBodyTouch, + OneLineAvatarIconListItem, + ThreeLineAvatarIconListItem, + TwoLineAvatarIconListItem, + TwoLineListItem, +) + KV = """ #:import get_color_from_hex kivy.utils.get_color_from_hex @@ -118,6 +148,28 @@ MDFloatLayout: orientation: "horizontal" md_bg_color: get_color_from_hex("#131313") + +: + icon: "chevron-down" + theme_text_color: "Custom" + text_color: "white" + + disabled: True + md_bg_color_disabled: 0, 0, 0, 0 + + canvas.before: + PushMatrix + Rotate: + angle: self._angle + axis: (0, 0, 1) + origin: self.center + canvas.after: + PopMatrix + + + + size_hint_y: None + # height: dp(68) """ class WindowManager(ScreenManager): @@ -127,6 +179,217 @@ class WindowManager(ScreenManager): class Content(MDBoxLayout): pass +class MDExpansionChevronRight(IRightBodyTouch, MDIconButton): + _angle = NumericProperty(0) + +class DisplayPic(CommonElevationBehavior, FitImage): + pass + +class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): + """ + Two-line panel. + + For more information, see in the + :class:`~kivymd.uix.list.TwoLineAvatarIconListItem` class documentation. + """ + + _txt_top_pad = NumericProperty("20dp") + _txt_bot_pad = NumericProperty("6dp") + _txt_left_pad = NumericProperty("50dp") + _height = NumericProperty("50dp") + _num_lines = 2 + +# https://raw.githubusercontent.com/kivymd/KivyMD/master/kivymd/uix/expansionpanel/expansionpanel.py +class MDExpansionPanelRoundIcon(RelativeLayout): + content = ObjectProperty() + icon = StringProperty() + #TODO: icon size(?) + opening_transition = StringProperty("out_cubic") + opening_time = NumericProperty(0.2) + closing_transition = StringProperty("out_sine") + closing_time = NumericProperty(0.2) + panel_cls = ObjectProperty() + + _state = StringProperty("close") + _anim_playing = False + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.register_event_type("on_open") + self.register_event_type("on_close") + + if self.panel_cls and isinstance( + self.panel_cls, + ( + MDExpansionPanelOneLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ), + ): + self.panel_cls.pos_hint = {"top": 1} + + self.panel_cls._no_ripple_effect = True + self.panel_cls.bind( + on_release=lambda x: self.check_open_panel(self.panel_cls) + ) + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + self.chevron = MDExpansionChevronRight() + self.panel_cls.add_widget(self.chevron) + if self.icon: + if self.icon in md_icons.keys(): + self.panel_cls.add_widget( + IconLeftWidget( + icon=self.icon, + pos_hint={"center_y": 0.5}, + ) + ) + else: + # self.panel_cls.add_widget(ImageLeftWidget(source=self.icon, pos_hint={"center_y": 0.5})) + self.panel_cls.add_widget(DisplayPic( + source=self.icon, + elevation=dp(3), + size_hint=(None, None), + size=(dp(30), dp(30)), + radius=dp(360), + pos_hint={'center_x': .12, 'center_y': .5} + )) + else: + self.panel_cls.remove_widget( + self.panel_cls.ids._left_container + ) + self.panel_cls._txt_left_pad = 0 + else: + # if no icon + self.panel_cls._txt_left_pad = m_res.HORIZ_MARGINS + self.add_widget(self.panel_cls) + else: + raise ValueError( + "KivyMD: `panel_cls` object must be must be one of the " + "objects from the list\n" + "[MDExpansionPanelOneLine, MDExpansionPanelTwoLineSmall, " + "MDExpansionPanelThreeLine]" + ) + + def on_open(self, *args): + """Called when a panel is opened.""" + + def on_close(self, *args): + """Called when a panel is closed.""" + + def check_open_panel( + self, + instance_panel: [ + MDExpansionPanelThreeLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ], + ) -> None: + """ + Called when you click on the panel. Called methods to open or close + a panel. + """ + + press_current_panel = False + for panel in self.parent.children: + if isinstance(panel, MDExpansionPanelRoundIcon): + if len(panel.children) == 2: + if instance_panel is panel.children[1]: + press_current_panel = True + panel.remove_widget(panel.children[0]) + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + chevron = panel.children[0].children[1].children[0] # Fix [0/1] + self.set_chevron_up(chevron) + self.close_panel(panel, press_current_panel) + self.dispatch("on_close") + break + if not press_current_panel: + self.set_chevron_down() + + def set_chevron_down(self) -> None: + """Sets the chevron down.""" + + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + Animation(_angle=-90, d=self.opening_time).start(self.chevron) + self.open_panel() + self.dispatch("on_open") + + def set_chevron_up(self, instance_chevron: MDExpansionChevronRight) -> None: + """Sets the chevron up.""" + + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + Animation(_angle=0, d=self.closing_time).start(instance_chevron) + + def close_panel( + self, instance_expansion_panel, press_current_panel: bool + ) -> None: + """Method closes the panel.""" + + if self._anim_playing: + return + + if press_current_panel: + self._anim_playing = True + + self._state = "close" + + anim = Animation( + height=self.panel_cls.height, + d=self.closing_time, + t=self.closing_transition, + ) + anim.bind(on_complete=self._disable_anim) + anim.start(instance_expansion_panel) + + def open_panel(self, *args) -> None: + """Method opens a panel.""" + + if self._anim_playing: + return + + self._anim_playing = True + self._state = "open" + + anim = Animation( + height=self.content.height + self.height, + d=self.opening_time, + t=self.opening_transition, + ) + anim.bind(on_complete=self._add_content) + anim.bind(on_complete=self._disable_anim) + anim.start(self) + + def get_state(self) -> str: + """Returns the state of panel. Can be `close` or `open` .""" + + return self._state + + def add_widget(self, widget, index=0, canvas=None): + if isinstance( + widget, + ( + MDExpansionPanelOneLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ), + ): + self.height = widget.height + return super().add_widget(widget) + + def _disable_anim(self, *args): + self._anim_playing = False + + def _add_content(self, *args): + if self.content: + try: + if isinstance(self.panel_cls, MDExpansionPanelLabel): + self.content.y = dp(36) + self.add_widget(self.content) + except WidgetException: + pass + class MainScreen(Screen): def __init__(self, **kwargs): @@ -136,7 +399,7 @@ def __init__(self, **kwargs): def build(self): import random countries = ["France", "Italy", "Brasil", "Egypt", "Belgium", "Deutschland", "Canada"] - for _ in range(0, 100): + for _ in range(0, 10): country = random.choice(countries) # item = TwoLineAvatarListItem( @@ -153,10 +416,10 @@ def build(self): # ) # item.add_widget(ImageLeftWidget(source=f"../../src/imgs/{country[:2].lower()}.png")) - item = MDExpansionPanel( + item = MDExpansionPanelRoundIcon( icon=f"../../src/imgs/{country[:2].lower()}.png", content=Content(), - panel_cls=MDExpansionPanelTwoLine( + panel_cls=MDExpansionPanelTwoLineSmall( radius = [10, 10, 10, 10], bg_color = get_color_from_hex("#212221"), text = country, From 8dde9a832a9557fa2ce16ae21c451244f0814e4b Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Fri, 5 Jan 2024 17:04:03 +0100 Subject: [PATCH 03/10] MDExpansionPanelRoundIcon and MDExpansionPanelTwoLineSmall, to separate file --- tests/v2/main_screen.py | 233 +----------------------------- tests/v2/uix/__init__.py | 0 tests/v2/uix/expansionpanel.py | 253 +++++++++++++++++++++++++++++++++ 3 files changed, 255 insertions(+), 231 deletions(-) create mode 100644 tests/v2/uix/__init__.py create mode 100644 tests/v2/uix/expansionpanel.py diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index a6ee161e..fe1c86d0 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -37,6 +37,8 @@ ) +from uix.expansionpanel import MDExpansionPanelRoundIcon, MDExpansionPanelTwoLineSmall + KV = """ #:import get_color_from_hex kivy.utils.get_color_from_hex @@ -149,27 +151,7 @@ orientation: "horizontal" md_bg_color: get_color_from_hex("#131313") -: - icon: "chevron-down" - theme_text_color: "Custom" - text_color: "white" - - disabled: True - md_bg_color_disabled: 0, 0, 0, 0 - - canvas.before: - PushMatrix - Rotate: - angle: self._angle - axis: (0, 0, 1) - origin: self.center - canvas.after: - PopMatrix - - - size_hint_y: None - # height: dp(68) """ class WindowManager(ScreenManager): @@ -179,217 +161,6 @@ class WindowManager(ScreenManager): class Content(MDBoxLayout): pass -class MDExpansionChevronRight(IRightBodyTouch, MDIconButton): - _angle = NumericProperty(0) - -class DisplayPic(CommonElevationBehavior, FitImage): - pass - -class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): - """ - Two-line panel. - - For more information, see in the - :class:`~kivymd.uix.list.TwoLineAvatarIconListItem` class documentation. - """ - - _txt_top_pad = NumericProperty("20dp") - _txt_bot_pad = NumericProperty("6dp") - _txt_left_pad = NumericProperty("50dp") - _height = NumericProperty("50dp") - _num_lines = 2 - -# https://raw.githubusercontent.com/kivymd/KivyMD/master/kivymd/uix/expansionpanel/expansionpanel.py -class MDExpansionPanelRoundIcon(RelativeLayout): - content = ObjectProperty() - icon = StringProperty() - #TODO: icon size(?) - opening_transition = StringProperty("out_cubic") - opening_time = NumericProperty(0.2) - closing_transition = StringProperty("out_sine") - closing_time = NumericProperty(0.2) - panel_cls = ObjectProperty() - - _state = StringProperty("close") - _anim_playing = False - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.register_event_type("on_open") - self.register_event_type("on_close") - - if self.panel_cls and isinstance( - self.panel_cls, - ( - MDExpansionPanelOneLine, - MDExpansionPanelTwoLineSmall, - MDExpansionPanelThreeLine, - MDExpansionPanelLabel, - ), - ): - self.panel_cls.pos_hint = {"top": 1} - - self.panel_cls._no_ripple_effect = True - self.panel_cls.bind( - on_release=lambda x: self.check_open_panel(self.panel_cls) - ) - if not isinstance(self.panel_cls, MDExpansionPanelLabel): - self.chevron = MDExpansionChevronRight() - self.panel_cls.add_widget(self.chevron) - if self.icon: - if self.icon in md_icons.keys(): - self.panel_cls.add_widget( - IconLeftWidget( - icon=self.icon, - pos_hint={"center_y": 0.5}, - ) - ) - else: - # self.panel_cls.add_widget(ImageLeftWidget(source=self.icon, pos_hint={"center_y": 0.5})) - self.panel_cls.add_widget(DisplayPic( - source=self.icon, - elevation=dp(3), - size_hint=(None, None), - size=(dp(30), dp(30)), - radius=dp(360), - pos_hint={'center_x': .12, 'center_y': .5} - )) - else: - self.panel_cls.remove_widget( - self.panel_cls.ids._left_container - ) - self.panel_cls._txt_left_pad = 0 - else: - # if no icon - self.panel_cls._txt_left_pad = m_res.HORIZ_MARGINS - self.add_widget(self.panel_cls) - else: - raise ValueError( - "KivyMD: `panel_cls` object must be must be one of the " - "objects from the list\n" - "[MDExpansionPanelOneLine, MDExpansionPanelTwoLineSmall, " - "MDExpansionPanelThreeLine]" - ) - - def on_open(self, *args): - """Called when a panel is opened.""" - - def on_close(self, *args): - """Called when a panel is closed.""" - - def check_open_panel( - self, - instance_panel: [ - MDExpansionPanelThreeLine, - MDExpansionPanelTwoLineSmall, - MDExpansionPanelThreeLine, - MDExpansionPanelLabel, - ], - ) -> None: - """ - Called when you click on the panel. Called methods to open or close - a panel. - """ - - press_current_panel = False - for panel in self.parent.children: - if isinstance(panel, MDExpansionPanelRoundIcon): - if len(panel.children) == 2: - if instance_panel is panel.children[1]: - press_current_panel = True - panel.remove_widget(panel.children[0]) - if not isinstance(self.panel_cls, MDExpansionPanelLabel): - chevron = panel.children[0].children[1].children[0] # Fix [0/1] - self.set_chevron_up(chevron) - self.close_panel(panel, press_current_panel) - self.dispatch("on_close") - break - if not press_current_panel: - self.set_chevron_down() - - def set_chevron_down(self) -> None: - """Sets the chevron down.""" - - if not isinstance(self.panel_cls, MDExpansionPanelLabel): - Animation(_angle=-90, d=self.opening_time).start(self.chevron) - self.open_panel() - self.dispatch("on_open") - - def set_chevron_up(self, instance_chevron: MDExpansionChevronRight) -> None: - """Sets the chevron up.""" - - if not isinstance(self.panel_cls, MDExpansionPanelLabel): - Animation(_angle=0, d=self.closing_time).start(instance_chevron) - - def close_panel( - self, instance_expansion_panel, press_current_panel: bool - ) -> None: - """Method closes the panel.""" - - if self._anim_playing: - return - - if press_current_panel: - self._anim_playing = True - - self._state = "close" - - anim = Animation( - height=self.panel_cls.height, - d=self.closing_time, - t=self.closing_transition, - ) - anim.bind(on_complete=self._disable_anim) - anim.start(instance_expansion_panel) - - def open_panel(self, *args) -> None: - """Method opens a panel.""" - - if self._anim_playing: - return - - self._anim_playing = True - self._state = "open" - - anim = Animation( - height=self.content.height + self.height, - d=self.opening_time, - t=self.opening_transition, - ) - anim.bind(on_complete=self._add_content) - anim.bind(on_complete=self._disable_anim) - anim.start(self) - - def get_state(self) -> str: - """Returns the state of panel. Can be `close` or `open` .""" - - return self._state - - def add_widget(self, widget, index=0, canvas=None): - if isinstance( - widget, - ( - MDExpansionPanelOneLine, - MDExpansionPanelTwoLineSmall, - MDExpansionPanelThreeLine, - MDExpansionPanelLabel, - ), - ): - self.height = widget.height - return super().add_widget(widget) - - def _disable_anim(self, *args): - self._anim_playing = False - - def _add_content(self, *args): - if self.content: - try: - if isinstance(self.panel_cls, MDExpansionPanelLabel): - self.content.y = dp(36) - self.add_widget(self.content) - except WidgetException: - pass - class MainScreen(Screen): def __init__(self, **kwargs): diff --git a/tests/v2/uix/__init__.py b/tests/v2/uix/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/v2/uix/expansionpanel.py b/tests/v2/uix/expansionpanel.py new file mode 100644 index 00000000..52beac5b --- /dev/null +++ b/tests/v2/uix/expansionpanel.py @@ -0,0 +1,253 @@ +# https://raw.githubusercontent.com/kivymd/KivyMD/master/kivymd/uix/expansionpanel/expansionpanel.py + + +import os +from typing import Union + +from kivy.animation import Animation +from kivy.clock import Clock +from kivy.lang import Builder +from kivy.metrics import dp +from kivy.properties import NumericProperty, ObjectProperty, StringProperty +from kivy.uix.relativelayout import RelativeLayout +from kivy.uix.widget import WidgetException + +import kivymd.material_resources as m_res +from kivymd import uix_path +from kivymd.icon_definitions import md_icons +from kivymd.uix.button import MDIconButton +from kivymd.uix.list import ( + IconLeftWidget, + ImageLeftWidget, + IRightBodyTouch, + OneLineAvatarIconListItem, + ThreeLineAvatarIconListItem, + TwoLineAvatarIconListItem, + TwoLineListItem, +) + +from kivymd.uix.expansionpanel import MDExpansionPanelOneLine, MDExpansionPanelThreeLine, MDExpansionPanelLabel + +from kivymd.uix.behaviors import RoundedRectangularElevationBehavior, CommonElevationBehavior, RectangularRippleBehavior, CircularRippleBehavior +from kivy.uix.behaviors import ButtonBehavior +from kivymd.uix.fitimage.fitimage import FitImage + + +KV = """ + size_hint_y: None + # height: dp(68) +""" +Builder.load_string(KV) + +class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): + """ + Two-line panel. + + For more information, see in the + :class:`~kivymd.uix.list.TwoLineAvatarIconListItem` class documentation. + """ + + _txt_top_pad = NumericProperty("20dp") + _txt_bot_pad = NumericProperty("6dp") + _txt_left_pad = NumericProperty("50dp") + _height = NumericProperty("50dp") + _num_lines = 2 + +class DisplayPic(CommonElevationBehavior, FitImage): + pass + + +class MDExpansionChevronRight(IRightBodyTouch, MDIconButton): + _angle = NumericProperty(0) + + + +class MDExpansionPanelRoundIcon(RelativeLayout): + content = ObjectProperty() + icon = StringProperty() + #TODO: icon size(?) + opening_transition = StringProperty("out_cubic") + opening_time = NumericProperty(0.2) + closing_transition = StringProperty("out_sine") + closing_time = NumericProperty(0.2) + panel_cls = ObjectProperty() + + _state = StringProperty("close") + _anim_playing = False + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.register_event_type("on_open") + self.register_event_type("on_close") + + if self.panel_cls and isinstance( + self.panel_cls, + ( + MDExpansionPanelOneLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ), + ): + self.panel_cls.pos_hint = {"top": 1} + + self.panel_cls._no_ripple_effect = True + self.panel_cls.bind( + on_release=lambda x: self.check_open_panel(self.panel_cls) + ) + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + self.chevron = MDExpansionChevronRight() + self.panel_cls.add_widget(self.chevron) + if self.icon: + if self.icon in md_icons.keys(): + self.panel_cls.add_widget( + IconLeftWidget( + icon=self.icon, + pos_hint={"center_y": 0.5}, + ) + ) + else: + # self.panel_cls.add_widget(ImageLeftWidget(source=self.icon, pos_hint={"center_y": 0.5})) + self.panel_cls.add_widget(DisplayPic( + source=self.icon, + elevation=dp(3), + size_hint=(None, None), + size=(dp(30), dp(30)), + radius=dp(360), + pos_hint={'center_x': .12, 'center_y': .5} + )) + else: + self.panel_cls.remove_widget( + self.panel_cls.ids._left_container + ) + self.panel_cls._txt_left_pad = 0 + else: + # if no icon + self.panel_cls._txt_left_pad = m_res.HORIZ_MARGINS + self.add_widget(self.panel_cls) + else: + raise ValueError( + "KivyMD: `panel_cls` object must be must be one of the " + "objects from the list\n" + "[MDExpansionPanelOneLine, MDExpansionPanelTwoLineSmall, " + "MDExpansionPanelThreeLine]" + ) + + def on_open(self, *args): + """Called when a panel is opened.""" + + def on_close(self, *args): + """Called when a panel is closed.""" + + def check_open_panel( + self, + instance_panel: [ + MDExpansionPanelThreeLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ], + ) -> None: + """ + Called when you click on the panel. Called methods to open or close + a panel. + """ + + press_current_panel = False + for panel in self.parent.children: + if isinstance(panel, MDExpansionPanelRoundIcon): + if len(panel.children) == 2: + if instance_panel is panel.children[1]: + press_current_panel = True + panel.remove_widget(panel.children[0]) + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + chevron = panel.children[0].children[1].children[0] # Fix [0/1] + self.set_chevron_up(chevron) + self.close_panel(panel, press_current_panel) + self.dispatch("on_close") + break + if not press_current_panel: + self.set_chevron_down() + + def set_chevron_down(self) -> None: + """Sets the chevron down.""" + + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + Animation(_angle=-90, d=self.opening_time).start(self.chevron) + self.open_panel() + self.dispatch("on_open") + + def set_chevron_up(self, instance_chevron: MDExpansionChevronRight) -> None: + """Sets the chevron up.""" + + if not isinstance(self.panel_cls, MDExpansionPanelLabel): + Animation(_angle=0, d=self.closing_time).start(instance_chevron) + + def close_panel( + self, instance_expansion_panel, press_current_panel: bool + ) -> None: + """Method closes the panel.""" + + if self._anim_playing: + return + + if press_current_panel: + self._anim_playing = True + + self._state = "close" + + anim = Animation( + height=self.panel_cls.height, + d=self.closing_time, + t=self.closing_transition, + ) + anim.bind(on_complete=self._disable_anim) + anim.start(instance_expansion_panel) + + def open_panel(self, *args) -> None: + """Method opens a panel.""" + + if self._anim_playing: + return + + self._anim_playing = True + self._state = "open" + + anim = Animation( + height=self.content.height + self.height, + d=self.opening_time, + t=self.opening_transition, + ) + anim.bind(on_complete=self._add_content) + anim.bind(on_complete=self._disable_anim) + anim.start(self) + + def get_state(self) -> str: + """Returns the state of panel. Can be `close` or `open` .""" + + return self._state + + def add_widget(self, widget, index=0, canvas=None): + if isinstance( + widget, + ( + MDExpansionPanelOneLine, + MDExpansionPanelTwoLineSmall, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, + ), + ): + self.height = widget.height + return super().add_widget(widget) + + def _disable_anim(self, *args): + self._anim_playing = False + + def _add_content(self, *args): + if self.content: + try: + if isinstance(self.panel_cls, MDExpansionPanelLabel): + self.content.y = dp(36) + self.add_widget(self.content) + except WidgetException: + pass From 271ae9e3598e65f01deb0ace465c0fe1f3d2a120 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Fri, 5 Jan 2024 17:11:17 +0100 Subject: [PATCH 04/10] Clear code, remove unused import, PEP8 Black --- tests/v2/main_screen.py | 71 ++++++++++++++-------------------- tests/v2/uix/expansionpanel.py | 49 ++++++++++------------- 2 files changed, 50 insertions(+), 70 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index fe1c86d0..eee8017e 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -5,38 +5,13 @@ from kivymd.uix.boxlayout import MDBoxLayout from kivy.uix.screenmanager import ScreenManager, Screen -from kivymd.uix.expansionpanel import MDExpansionPanelOneLine, MDExpansionPanelThreeLine, MDExpansionPanelLabel -from kivymd.uix.behaviors import RoundedRectangularElevationBehavior, CommonElevationBehavior, RectangularRippleBehavior, CircularRippleBehavior -from kivy.uix.behaviors import ButtonBehavior -from kivymd.uix.fitimage.fitimage import FitImage - -import os -from typing import Union - -from kivy.animation import Animation -from kivy.clock import Clock from kivy.lang import Builder from kivy.metrics import dp -from kivy.properties import NumericProperty, ObjectProperty, StringProperty -from kivy.uix.relativelayout import RelativeLayout -from kivy.uix.widget import WidgetException - -import kivymd.material_resources as m_res -from kivymd import uix_path -from kivymd.icon_definitions import md_icons -from kivymd.uix.button import MDIconButton -from kivymd.uix.list import ( - IconLeftWidget, - ImageLeftWidget, - IRightBodyTouch, - OneLineAvatarIconListItem, - ThreeLineAvatarIconListItem, - TwoLineAvatarIconListItem, - TwoLineListItem, -) +from kivymd.uix.list import ImageLeftWidget +# meil uix from tests from uix.expansionpanel import MDExpansionPanelRoundIcon, MDExpansionPanelTwoLineSmall KV = """ @@ -154,6 +129,7 @@ """ + class WindowManager(ScreenManager): pass @@ -169,7 +145,16 @@ def __init__(self, **kwargs): def build(self): import random - countries = ["France", "Italy", "Brasil", "Egypt", "Belgium", "Deutschland", "Canada"] + + countries = [ + "France", + "Italy", + "Brasil", + "Egypt", + "Belgium", + "Deutschland", + "Canada", + ] for _ in range(0, 10): country = random.choice(countries) @@ -191,32 +176,34 @@ def build(self): icon=f"../../src/imgs/{country[:2].lower()}.png", content=Content(), panel_cls=MDExpansionPanelTwoLineSmall( - radius = [10, 10, 10, 10], - bg_color = get_color_from_hex("#212221"), - text = country, - text_color = "white", - theme_text_color = "Custom", - font_style = "Subtitle1", - secondary_text = f"{random.randint(1, 100)} servers", - secondary_text_color = "white", - secondary_theme_text_color = "Custom", - secondary_font_style = "Caption", - ) + radius=[10, 10, 10, 10], + bg_color=get_color_from_hex("#212221"), + text=country, + text_color="white", + theme_text_color="Custom", + font_style="Subtitle1", + secondary_text=f"{random.randint(1, 100)} servers", + secondary_text_color="white", + secondary_theme_text_color="Custom", + secondary_font_style="Caption", + ), ) self.ids.countries_list.add_widget(item) - Builder.load_string(KV) + + class Test(MDApp): title = "MainScreen v2" def build(self): - Window.size = (1280,720) + Window.size = (1280, 720) manager = WindowManager() manager.add_widget(MainScreen()) return manager + if __name__ == "__main__": - Test().run() \ No newline at end of file + Test().run() diff --git a/tests/v2/uix/expansionpanel.py b/tests/v2/uix/expansionpanel.py index 52beac5b..79214f75 100644 --- a/tests/v2/uix/expansionpanel.py +++ b/tests/v2/uix/expansionpanel.py @@ -1,11 +1,8 @@ # https://raw.githubusercontent.com/kivymd/KivyMD/master/kivymd/uix/expansionpanel/expansionpanel.py -import os -from typing import Union from kivy.animation import Animation -from kivy.clock import Clock from kivy.lang import Builder from kivy.metrics import dp from kivy.properties import NumericProperty, ObjectProperty, StringProperty @@ -13,23 +10,20 @@ from kivy.uix.widget import WidgetException import kivymd.material_resources as m_res -from kivymd import uix_path from kivymd.icon_definitions import md_icons from kivymd.uix.button import MDIconButton from kivymd.uix.list import ( - IconLeftWidget, - ImageLeftWidget, IRightBodyTouch, - OneLineAvatarIconListItem, - ThreeLineAvatarIconListItem, TwoLineAvatarIconListItem, - TwoLineListItem, ) -from kivymd.uix.expansionpanel import MDExpansionPanelOneLine, MDExpansionPanelThreeLine, MDExpansionPanelLabel +from kivymd.uix.expansionpanel import ( + MDExpansionPanelOneLine, + MDExpansionPanelThreeLine, + MDExpansionPanelLabel, +) -from kivymd.uix.behaviors import RoundedRectangularElevationBehavior, CommonElevationBehavior, RectangularRippleBehavior, CircularRippleBehavior -from kivy.uix.behaviors import ButtonBehavior +from kivymd.uix.behaviors import CommonElevationBehavior from kivymd.uix.fitimage.fitimage import FitImage @@ -39,6 +33,7 @@ """ Builder.load_string(KV) + class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): """ Two-line panel. @@ -53,6 +48,7 @@ class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): _height = NumericProperty("50dp") _num_lines = 2 + class DisplayPic(CommonElevationBehavior, FitImage): pass @@ -61,11 +57,10 @@ class MDExpansionChevronRight(IRightBodyTouch, MDIconButton): _angle = NumericProperty(0) - class MDExpansionPanelRoundIcon(RelativeLayout): content = ObjectProperty() icon = StringProperty() - #TODO: icon size(?) + # TODO: icon size(?) opening_transition = StringProperty("out_cubic") opening_time = NumericProperty(0.2) closing_transition = StringProperty("out_sine") @@ -108,18 +103,18 @@ def __init__(self, **kwargs): ) else: # self.panel_cls.add_widget(ImageLeftWidget(source=self.icon, pos_hint={"center_y": 0.5})) - self.panel_cls.add_widget(DisplayPic( - source=self.icon, - elevation=dp(3), - size_hint=(None, None), - size=(dp(30), dp(30)), - radius=dp(360), - pos_hint={'center_x': .12, 'center_y': .5} - )) + self.panel_cls.add_widget( + DisplayPic( + source=self.icon, + elevation=dp(3), + size_hint=(None, None), + size=(dp(30), dp(30)), + radius=dp(360), + pos_hint={"center_x": 0.12, "center_y": 0.5}, + ) + ) else: - self.panel_cls.remove_widget( - self.panel_cls.ids._left_container - ) + self.panel_cls.remove_widget(self.panel_cls.ids._left_container) self.panel_cls._txt_left_pad = 0 else: # if no icon @@ -183,9 +178,7 @@ def set_chevron_up(self, instance_chevron: MDExpansionChevronRight) -> None: if not isinstance(self.panel_cls, MDExpansionPanelLabel): Animation(_angle=0, d=self.closing_time).start(instance_chevron) - def close_panel( - self, instance_expansion_panel, press_current_panel: bool - ) -> None: + def close_panel(self, instance_expansion_panel, press_current_panel: bool) -> None: """Method closes the panel.""" if self._anim_playing: From 58081546308ca3fdbbc77b04101115870b5673fa Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Fri, 5 Jan 2024 17:49:38 +0100 Subject: [PATCH 05/10] white MDExpansionChevronRight --- tests/v2/main_screen.py | 1 + tests/v2/uix/expansionpanel.py | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index eee8017e..eff859da 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -174,6 +174,7 @@ def build(self): item = MDExpansionPanelRoundIcon( icon=f"../../src/imgs/{country[:2].lower()}.png", + icon_size=(25, 25), content=Content(), panel_cls=MDExpansionPanelTwoLineSmall( radius=[10, 10, 10, 10], diff --git a/tests/v2/uix/expansionpanel.py b/tests/v2/uix/expansionpanel.py index 79214f75..bf4a4e82 100644 --- a/tests/v2/uix/expansionpanel.py +++ b/tests/v2/uix/expansionpanel.py @@ -5,7 +5,7 @@ from kivy.animation import Animation from kivy.lang import Builder from kivy.metrics import dp -from kivy.properties import NumericProperty, ObjectProperty, StringProperty +from kivy.properties import NumericProperty, ObjectProperty, StringProperty, ListProperty from kivy.uix.relativelayout import RelativeLayout from kivy.uix.widget import WidgetException @@ -15,6 +15,7 @@ from kivymd.uix.list import ( IRightBodyTouch, TwoLineAvatarIconListItem, + IconLeftWidget ) from kivymd.uix.expansionpanel import ( @@ -27,7 +28,8 @@ from kivymd.uix.fitimage.fitimage import FitImage -KV = """ +KV = """ + size_hint_y: None # height: dp(68) """ @@ -42,7 +44,7 @@ class MDExpansionPanelTwoLineSmall(TwoLineAvatarIconListItem): :class:`~kivymd.uix.list.TwoLineAvatarIconListItem` class documentation. """ - _txt_top_pad = NumericProperty("20dp") + # _txt_top_pad = NumericProperty("20dp") _txt_bot_pad = NumericProperty("6dp") _txt_left_pad = NumericProperty("50dp") _height = NumericProperty("50dp") @@ -60,7 +62,7 @@ class MDExpansionChevronRight(IRightBodyTouch, MDIconButton): class MDExpansionPanelRoundIcon(RelativeLayout): content = ObjectProperty() icon = StringProperty() - # TODO: icon size(?) + icon_size = ListProperty((25, 25)) opening_transition = StringProperty("out_cubic") opening_time = NumericProperty(0.2) closing_transition = StringProperty("out_sine") @@ -91,7 +93,12 @@ def __init__(self, **kwargs): on_release=lambda x: self.check_open_panel(self.panel_cls) ) if not isinstance(self.panel_cls, MDExpansionPanelLabel): - self.chevron = MDExpansionChevronRight() + self.chevron = MDExpansionChevronRight( + icon_color="white", + theme_icon_color="Custom", + md_bg_color_disabled="white", + disabled=False + ) self.panel_cls.add_widget(self.chevron) if self.icon: if self.icon in md_icons.keys(): @@ -108,7 +115,7 @@ def __init__(self, **kwargs): source=self.icon, elevation=dp(3), size_hint=(None, None), - size=(dp(30), dp(30)), + size=self.icon_size, radius=dp(360), pos_hint={"center_x": 0.12, "center_y": 0.5}, ) From 2a20868f8b10c9f01c4e41579b8f0305f8000364 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Fri, 5 Jan 2024 18:16:36 +0100 Subject: [PATCH 06/10] organge border for bottom toolbar, outline icons --- tests/v2/main_screen.py | 29 ++++++++++++++++++++++++++--- tests/v2/uix/expansionpanel.py | 3 +++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index eff859da..168ce0fe 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -102,21 +102,44 @@ padding: 10 MDBoxLayout: + orientation: 'horizontal' + # padding: [20, 0, 0, 0] size_hint_y: None height: 50 + spacing: 10 + + canvas: + # draw a background of red. This will be the border + Color: + rgba: get_color_from_hex("#453103") + RoundedRectangle: + pos: self.pos + size: self.size + + # draw over the above except for 1 pixels around edges, leaving the orange border showing + Color: + rgba: get_color_from_hex("#212221") + RoundedRectangle: + pos: self.x+1, self.y+1 + size: self.width-2, self.height-2 MDIconButton: - icon: "wallet" + icon: "wallet-outline" theme_text_color: "Custom" text_color: "white" MDIconButton: - icon: "cog" + icon: "book-open-outline" theme_text_color: "Custom" text_color: "white" MDIconButton: - icon: "help-circle" + icon: "cog-outline" + theme_text_color: "Custom" + text_color: "white" + + MDIconButton: + icon: "help-circle-outline" theme_text_color: "Custom" text_color: "white" diff --git a/tests/v2/uix/expansionpanel.py b/tests/v2/uix/expansionpanel.py index bf4a4e82..2c6ac8d3 100644 --- a/tests/v2/uix/expansionpanel.py +++ b/tests/v2/uix/expansionpanel.py @@ -99,7 +99,10 @@ def __init__(self, **kwargs): md_bg_color_disabled="white", disabled=False ) + self.chevron.ripple_scale = 0 + self.chevron._no_ripple_effect = True self.panel_cls.add_widget(self.chevron) + if self.icon: if self.icon in md_icons.keys(): self.panel_cls.add_widget( From 3f89598151660105075d7634791c1d0968fdd485 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sun, 7 Jan 2024 22:50:49 +0100 Subject: [PATCH 07/10] Just copy the example of MDDataTable (https://kivymd.readthedocs.io/en/1.1.1/components/datatables/index.html) --- tests/v2/main_screen.py | 128 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index 168ce0fe..672bc878 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -11,6 +11,8 @@ from kivymd.uix.list import ImageLeftWidget +from kivymd.uix.datatables import MDDataTable + # meil uix from tests from uix.expansionpanel import MDExpansionPanelRoundIcon, MDExpansionPanelTwoLineSmall @@ -143,12 +145,10 @@ theme_text_color: "Custom" text_color: "white" - - - MDFloatLayout: + AnchorLayout: orientation: "horizontal" md_bg_color: get_color_from_hex("#131313") - + id: servers_datatable """ @@ -215,6 +215,126 @@ def build(self): self.ids.countries_list.add_widget(item) + self.data_tables = MDDataTable( + use_pagination=True, + check=True, + column_data=[ + ("No.", dp(30)), + ("Status", dp(30)), + ("Signal Name", dp(60), self.sort_on_signal), + ("Severity", dp(30)), + ("Stage", dp(30)), + ("Schedule", dp(30), self.sort_on_schedule), + ("Team Lead", dp(30), self.sort_on_team), + ], + row_data=[ + ( + "1", + ("alert", [255 / 256, 165 / 256, 0, 1], "No Signal"), + "Astrid: NE shared managed", + "Medium", + "Triaged", + "0:33", + "Chase Nguyen", + ), + ( + "2", + ("alert-circle", [1, 0, 0, 1], "Offline"), + "Cosmo: prod shared ares", + "Huge", + "Triaged", + "0:39", + "Brie Furman", + ), + ( + "3", + ( + "checkbox-marked-circle", + [39 / 256, 174 / 256, 96 / 256, 1], + "Online", + ), + "Phoenix: prod shared lyra-lists", + "Minor", + "Not Triaged", + "3:12", + "Jeremy lake", + ), + ( + "4", + ( + "checkbox-marked-circle", + [39 / 256, 174 / 256, 96 / 256, 1], + "Online", + ), + "Sirius: NW prod shared locations", + "Negligible", + "Triaged", + "13:18", + "Angelica Howards", + ), + ( + "5", + ( + "checkbox-marked-circle", + [39 / 256, 174 / 256, 96 / 256, 1], + "Online", + ), + "Sirius: prod independent account", + "Negligible", + "Triaged", + "22:06", + "Diane Okuma", + ), + ], + sorted_on="Schedule", + sorted_order="ASC", + elevation=2, + ) + self.data_tables.bind(on_row_press=self.on_row_press) + self.data_tables.bind(on_check_press=self.on_check_press) + + self.ids.servers_datatable.add_widget(self.data_tables) + + def on_row_press(self, instance_table, instance_row): + '''Called when a table row is clicked.''' + + print(instance_table, instance_row) + + def on_check_press(self, instance_table, current_row): + '''Called when the check box in the table row is checked.''' + + print(instance_table, current_row) + + # Sorting Methods: + # since the https://github.com/kivymd/KivyMD/pull/914 request, the + # sorting method requires you to sort out the indexes of each data value + # for the support of selections. + # + # The most common method to do this is with the use of the builtin function + # zip and enumerate, see the example below for more info. + # + # The result given by these funcitons must be a list in the format of + # [Indexes, Sorted_Row_Data] + + def sort_on_signal(self, data): + return zip(*sorted(enumerate(data), key=lambda l: l[1][2])) + + def sort_on_schedule(self, data): + return zip( + *sorted( + enumerate(data), + key=lambda l: sum( + [ + int(l[1][-2].split(":")[0]) * 60, + int(l[1][-2].split(":")[1]), + ] + ), + ) + ) + + def sort_on_team(self, data): + return zip(*sorted(enumerate(data), key=lambda l: l[1][-1])) + Builder.load_string(KV) From a097e1315033298912fcf25fffe5f011aaa141b4 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sun, 7 Jan 2024 23:29:22 +0100 Subject: [PATCH 08/10] Populate a datatables with dummy data (moniker, location, speed, status, price, protocol, type). We should implement all the sort methods (by column). Note: what about the price denom? up and down with ascii icon? Location should be the city? Login for speedometer? https://github.com/MathNodes/meile-gui/issues/65 --- tests/v2/main_screen.py | 113 +++++++++++++++------------------------- 1 file changed, 42 insertions(+), 71 deletions(-) diff --git a/tests/v2/main_screen.py b/tests/v2/main_screen.py index 672bc878..54fc5759 100644 --- a/tests/v2/main_screen.py +++ b/tests/v2/main_screen.py @@ -167,7 +167,7 @@ def __init__(self, **kwargs): self.build() def build(self): - import random + import random, string countries = [ "France", @@ -217,82 +217,49 @@ def build(self): self.data_tables = MDDataTable( use_pagination=True, - check=True, + check=False, column_data=[ - ("No.", dp(30)), - ("Status", dp(30)), - ("Signal Name", dp(60), self.sort_on_signal), - ("Severity", dp(30)), - ("Stage", dp(30)), - ("Schedule", dp(30), self.sort_on_schedule), - ("Team Lead", dp(30), self.sort_on_team), + ("Moniker", dp(45)), + ("Location", dp(20)), + ("Speed", dp(50)), + ("Status", dp(20)), + ("Price", dp(40)), + ("Protocol", dp(20)), + ("Type", dp(20)), ], - row_data=[ - ( - "1", - ("alert", [255 / 256, 165 / 256, 0, 1], "No Signal"), - "Astrid: NE shared managed", - "Medium", - "Triaged", - "0:33", - "Chase Nguyen", - ), - ( - "2", - ("alert-circle", [1, 0, 0, 1], "Offline"), - "Cosmo: prod shared ares", - "Huge", - "Triaged", - "0:39", - "Brie Furman", - ), - ( - "3", - ( - "checkbox-marked-circle", - [39 / 256, 174 / 256, 96 / 256, 1], - "Online", - ), - "Phoenix: prod shared lyra-lists", - "Minor", - "Not Triaged", - "3:12", - "Jeremy lake", - ), - ( - "4", - ( - "checkbox-marked-circle", - [39 / 256, 174 / 256, 96 / 256, 1], - "Online", - ), - "Sirius: NW prod shared locations", - "Negligible", - "Triaged", - "13:18", - "Angelica Howards", - ), - ( - "5", - ( - "checkbox-marked-circle", - [39 / 256, 174 / 256, 96 / 256, 1], - "Online", - ), - "Sirius: prod independent account", - "Negligible", - "Triaged", - "22:06", - "Diane Okuma", - ), - ], - sorted_on="Schedule", + sorted_on="Moniker", sorted_order="ASC", elevation=2, + rows_num=10 ) - self.data_tables.bind(on_row_press=self.on_row_press) - self.data_tables.bind(on_check_press=self.on_check_press) + row_data = [] + for _ in range(0, 150): + upload = random.uniform(100, 900) + download = random.uniform(100, 900) + bandwith = "speedometer-medium" + if upload + download > 1200: + bandwith = "speedometer" + elif upload + download < 400: + bandwith = "speedometer-slow" + + healthcheck = random.choice([True, False]) + + row_data.append( + ( + ''.join(random.choices(string.printable[:-6], k=random.randint(5, 15))), # Moniker + random.choice(countries), + (bandwith, [1, 1, 1, 1] ,f"[size=12][color=#00FF00]up[/color] {round(upload, 2)}mb/s[color=#f44336]down[/color] {round(download, 2)}mb/s[/size]"), + ("shield-plus", [39 / 256, 174 / 256, 96 / 256, 1], "Health") if healthcheck is True else ("emoticon-sick", [1, 0, 0, 1], "Sick"), + f"[size=12]{random.randint(1, 100)}dvpn, {random.randint(1, 100)}atom, {random.randint(1, 100)}osmo, {random.randint(1, 100)}srct, {random.randint(1, 100)}dec[/size]", + random.choice(["Wireguard", "V2RAY"]), + random.choice(["Residential", "Datacenter", "Unknown"]) + ) + ) + + self.data_tables.row_data = row_data + + self.data_tables.bind(on_row_press=self.on_row_press) self.ids.servers_datatable.add_widget(self.data_tables) def on_row_press(self, instance_table, instance_row): @@ -344,6 +311,10 @@ class Test(MDApp): def build(self): Window.size = (1280, 720) + # TODO: review this values + self.theme_cls.theme_style = "Dark" # (?) + self.theme_cls.primary_palette = "Orange" # (?) + manager = WindowManager() manager.add_widget(MainScreen()) return manager From 33eb52d17a3f127cf4d7670767fccbba316f241c Mon Sep 17 00:00:00 2001 From: freqnik Date: Thu, 25 Jan 2024 08:08:22 -0500 Subject: [PATCH 09/10] Update README,CHANGELOG --- CHANGELOG.md | 24 +++++++++++ README.md | 105 ++++++++++++++++++++++++++++++++++--------------- dpkg.build | 2 +- img/ARRR.png | Bin 16296 -> 60130 bytes img/XMR.png | Bin 16033 -> 60637 bytes meile-gui.spec | 44 --------------------- 6 files changed, 99 insertions(+), 76 deletions(-) delete mode 100644 meile-gui.spec diff --git a/CHANGELOG.md b/CHANGELOG.md index d2f002ce..91ba9db2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,30 @@ CHANGELOG ======================== +# v1.8.0 (11/01/2024) + +* NEW: Carousel to include subcards and node cards within main screen +* NEW: Zoom to Lat/Long of location of connected IP address +* NEW: Add background threading and progress bar to refresh +* NEW: Add @Tkd-Alex coin cache to FIAT gateway +* UPDATE: Change dimensions to 16:10 (1280x800) +* UPDATE: Change map tile size for smoother rendering +* UPDATE: Change size of left panel +* UPDATE: Change MN-API timeout to 4 seconds +* UPDATE: Drop support of icanhazip and use ifconfnig.co JSON results for DNS, IP, and Lat/Long +* UPDATE: Refactor IP from win.py to konstants +* UPDATE: include MeileMap data in konstants +* UPDATE: Change hover color to darkish grey on sub and node cards +* FIX: Country Node Pins not loading on erroneous AWOC data https://github.com/MathNodes/meile-gui/commit/33ed1237e8457657928f623513cfacd5a23c14f5 +* FIX: Error on connecting to v2ray #80 https://github.com/MathNodes/meile-gui/commit/df890224f91c1cc4419bd7d060a201ce3b07cf19 + +# v1.7.18 (20/12/2023) + +* NEW: Sentinel Health Check Data with Status Icons +* UPDATE: Include error handling for country names not in AWOC +* FIX: Turkish spelling in AWOC. +* FIX: Update unicode in AWOC. + # v1.7.17 (08/12/2023) * NEW: Implement @TKd-Alex Price Cache for Subscription Dialog diff --git a/README.md b/README.md index 2207460e..cddd3a80 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ Meile-GUI (may•lah) ======================== + [![Github All Releases](https://img.shields.io/github/downloads/mathnodes/meile-gui/total?style=for-the-badge)](https://github.com/MathNodes/meile-gui/releases) [![GitHub license](https://img.shields.io/github/license/mathnodes/meile-gui?style=for-the-badge)](https://github.com/MathNodes/meile-gui/blob/main/LICENSE) [![GitHub stars](https://img.shields.io/github/stars/mathnodes/meile-gui?style=for-the-badge)](https://github.com/mathnodes/meile-gui/stargazers) @@ -13,29 +14,27 @@ Meile dVPN GUI for Linux, OS X, and Windows - Powered by the Sentinel Network - # Full Version -The full version 1.7.12 has been released to GitHub. Branches include **main**, **osx-fiat-intel**, **windows**, **fiat**, **osx-fiat**, **pip**. The exception is that we did not include the scrtsxx.py which contains credentials for the FIAT gateway. Please navigate the various branches to understand the different interworkings. It is our intention to eventually merge all branches into a unified code source. - +The full version 1.8.0 has been released to GitHub. Branches include **main**, **osx-fiat-intel**, **windows**, **fiat**, **osx-fiat**, **pip**. The exception is that we did not include the scrtsxx.py which contains credentials for the FIAT gateway. Please navigate the various branches to understand the different interworkings. It is our intention to eventually merge all branches into a unified code source. ## Windows -The current release is version **1.7.11**. Please note this does not use Windows APIs to ask for Administration privleges and relies on an open source implementation called "gsudo". Gsudo is just a hack to ask the user to modify network adapters so that Meile may connect without hassel. - -Also, Meile opens a debug console in the background. Do not close this otherwise the app will close as well. We are working on getting a Microsoft Developers Certificate so we may sign the app for official release. Also, when we get the certificate we will eliminate the debug console as well. This is all in the works. - +The current release is version **1.8.0**. Please note this does not use Windows APIs to ask for Administration privileges and relies on an open source implementation called "gsudo". Gsudo is just a hack to ask the user to modify network adapters so that Meile may connect without issue. -Download: [Meile for Windows (v1.7.11)](https://github.com/MathNodes/meile-gui/releases/tag/v1.7.11) +Also, Meile opens a debug console in the background. Do not close this otherwise the app will close as well. We are working on getting a Microsoft Developers Certificate so we may sign the app for official release. Also, when we get the certificate we will eliminate the debug console as well. We also have plans to integrate an MSI installer package. This is all in the works. +Download: [Meile for Windows (v1.8.0)](https://github.com/MathNodes/meile-gui/releases/tag/v1.8.0) ## Mac OS X -Download the latest release as a DMG: [Mac OS X v1.7.11](https://github.com/MathNodes/meile-gui/releases/tag/v1.7.11) -The OS X M1/M2 and Intel builds are packaged as a disk image (DMG). To install, simply download the correct DMG for your architecture (Intel or Apple Silicon). Double click on the DMG file and move the Meile app bundle to your desktop or to the Applications folder. +Download the latest release as a DMG: [Mac OS X v1.8.0](https://github.com/MathNodes/meile-gui/releases/tag/v1.8.0) + +The OS X M1/M2 and Intel builds are packaged as a disk image (DMG). To install, simply download the correct DMG for your architecture (Intel or Apple Silicon [arm]). Double click on the DMG file and move the Meile app bundle to your desktop or to the Applications folder. Both the OS X Intel and Apple Silicon release are signed by a Apple Developer Certificate. There should be no errors when running these. ### NOTE: -pip install is not currently available for Mac OS X. We are working on bringing this as a separate packages. +pip install is not currently available for Mac OS X or Windows. We are working on bringing this as a separate packages. ## Debian .deb package @@ -44,7 +43,7 @@ The latest version of Meile GUI comes packaged as a Debian archive. Simply downl and run apt for your build: ```shell -sudo apt install -y ./meile-gui-v1.7.12_ubuntu22.04_amd64.deb +sudo apt install -y ./meile-gui-v1.8.0_ubuntu22.04_amd64.deb ``` This release will install wireguard tools, resolvconf, curl, and net-tools alongside the Meile GUI. To connect to nodes or disconnect requires "sudo" privileges. You will be prompted by your system dialog to enter your username's password to give authorization to complete the connection. This is due to how Linux handles permissions with regards to network interfaces. @@ -61,42 +60,60 @@ Or goto your panel menu under Internet and there will be a clickable icon. Because there were issues loading certain mesa OpenGL drivers in various Debian Virtual Machines, we have included a separate .deb archive that automatically configures the system to handle the Meile dependencies. Please use this version if you are running a Debian flavor in a virutal machine (VM). -[Debian/Ubuntu 20.04 Virtual Machine](https://github.com/MathNodes/meile-gui/releases/download/v1.7.12/meile-gui-v1.7.12_ubuntu2004_amd64_vm.deb) +[Debian/Ubuntu 20.04 Virtual Machine](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-v1.8.0_ubuntu2004_amd64_vm.deb) -[Debian/Ubuntu 22.04 Virtual Machine](https://github.com/MathNodes/meile-gui/releases/download/v1.7.12/meile-gui-v1.7.12_ubuntu2204_amd64_vm.deb) +[Debian/Ubuntu 22.04 Virtual Machine](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-v1.8.0_ubuntu2204_amd64_vm.deb) ## Redhat/CentOS/Fedora (.rpm) Download the latest RPM for RedHat releases: -[RedHat RPM (fc36)](https://github.com/MathNodes/meile-gui/releases/download/v1.7.12/meile-gui-v1.7.12-1.fc36.x86_64.rpm) - -[RedHat RPM (fc37)](https://github.com/MathNodes/meile-gui/releases/download/v1.7.12/meile-gui-v1.7.12-1.fc37.x86_64.rpm) +[RedHat RPM (fc36)](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-v1.8.0-1.fc36.x86_64.rpm) +[RedHat RPM (fc37)](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-v1.8.0-1.fc37.x86_64.rpm) Install the rpm from a terminal via *dnf* (**RECOMMENDED**): + ```shell -sudo dnf install meile-gui-v1.7.12-1.fc36.x86_64.rpm +sudo dnf install meile-gui-v1.8.0-1.fc36.x86_64.rpm ``` or via *rpm*: ```shell -sudo rpm -i meile-gui-v1.7.12-1.fc36.x86_64.rpm +sudo rpm -i meile-gui-v1.8.0-1.fc36.x86_64.rpm ``` *dnf* is **recommended** as it will install all dependencies for Meile to function correctly. + +# Arch Linux (.zst) + +Our wonderful community member and part-time developer @Tkd-Alex has graciously taken on the role of compiling an Arch Linux package. The current release version is **1.8.0** and can be downloaded from: [Meile Arch Linux Release](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-1.8.0-1-x86_64.pkg.tar.zst) + +To install, run: + +```shell +sudo pacman -U --noconfirm meile-gui-1.8.0-1-x86_64.pkg.tar.zst +``` + + + ## Installing via pip -Meile dVPN GUI v0.14.1 is now available as a pip packages as well. These are pre-releases scheduled to be built into a binary. First install system dependencies: +**Requirements:** python<=3.10 + + + +Meile dVPN GUI v0.15.0.0 is now available as a pip packages as well. These are pre-releases scheduled to be built into a binary for the various platforms. First install system dependencies: ```shell sudo apt install -y wireguard-tools openresolv mesa-utils libgl1-mesa-glx xclip python3-devel curl net-tools python3-venv ``` Then install via pip + ```shell pip3 install meile-gui ``` @@ -105,7 +122,7 @@ via a virtual environment: ```shell mkdir ~/venv && python3 -m venv ~/venv/meile -source venv/meile/bin/activate +source ~/venv/meile/bin/activate pip3 install meile-gui ``` @@ -115,7 +132,6 @@ Upgrade via pip pip3 install meile-gui --upgrade ``` - To run Meile GUI after pip install do the following: ```shell @@ -124,10 +140,30 @@ meile-gui ### NOTE: -The FIAT gateway is not included in the pip package. This is due to certain credentials needing to remain secret for OPSEC reasons. The pip package will continue to get updated with the FIAT release in bug fixes and feature additions. +The FIAT gateway is not included in the pip package. This is due to certain credentials needing to remain secret for OPSEC reasons. The pip package will continue to get updated without the FIAT gateway with bug fixes and feature additions. We consider the pip releases to be pre-releases of the compiled binaries. Pip is considered the bleeding edge of Meile releases +### Packaged Binaries + +We package the following binaries with our releases: + +* tun2socks([GitHub - xjasonlyu/tun2socks: tun2socks - powered by gVisor TCP/IP stack](https://github.com/xjasonlyu/tun2socks)) + +* v2ray ([GitHub - v2fly/v2ray-core: A platform for building proxies to bypass network restrictions.](https://github.com/v2fly/v2ray-core)) + +* sentinel-cli ([GitHub - sentinel-official/cli-client: The official Sentinel CLI client](https://github.com/sentinel-official/cli-client)) + +* warp ([Download WARP · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/download-warp/)) + +* gsudo ([GitHub - gerardog/gsudo: Sudo for Windows](https://github.com/gerardog/gsudo)) + +We have built tun2socks, v2ray, and sentinel-cli from source on the target architectures. Cloudflare warp is closed-source and so we packaged the binaries direct from the install link above. For windows we downloaded the pre-built gsudo binary from the above github. + + + +**Note:** we use **v2ray** version **5.1.0** as this is what the dvpn-node software also uses and it is recommended to use the same client version as the server version. + ## Help Please make comments, suggestions, and issues on the issues page here at GitHub. If you are a GitHub newb, you can join us in our various open messaging channels: @@ -139,15 +175,14 @@ Please make comments, suggestions, and issues on the issues page here at GitHub. Session: ![session](./img/session_qr.png) - All suggestions are welcome. - ## Creating a Binary for your distribution: In order to create a binary for your distribution some packages need to be installed first. Pyinstaller: + ```shell pip3 install pyinstaller ``` @@ -159,11 +194,13 @@ sudo apt install python3-venv ``` Then clone the repo: + ```shell git clone https://github.com/MathNodes/meile-gui ``` Switch to the pip branch as this is the one without FIAT gateway + ``` cd meile-gui && git checkout pip ``` @@ -178,7 +215,7 @@ pip install -r requriements.txt && pip install -e . Once meile-gui and it's dependencies have been installed within the python virutal environment, a binary release can be created: -``` +```shell bash pyinstaller.cmd ``` @@ -200,26 +237,32 @@ Because we are working on a small grant with no VC funding, any additional contr ## BTC (Bitcoin) -`bc1qtvc9l3cr9u4qg6uwe6pvv7jufvsnn0xxpdyftl` +``` +bc1qtvc9l3cr9u4qg6uwe6pvv7jufvsnn0xxpdyftl +``` ![BTC](./img/BTC.png) ## DVPN (Sentinel) -`sent12v8ghhg98e2n0chyje3su4uqlsg75sh4lwcyww` +``` +sent12v8ghhg98e2n0chyje3su4uqlsg75sh4lwcyww +``` ![dvpn](./img/DVPN.png) ## XMR (Monero) -`87qHJPU5dZGWaWzuoC3My5SgoQSuxh4sHSv1FXRZrQ9XZHWnfC33EX1NLv5HujpVhbPbbF9RcXXD94byT18HonAQ75b9dyR` +``` +87qHJPU5dZGWaWzuoC3My5SgoQSuxh4sHSv1FXRZrQ9XZHWnfC33EX1NLv5HujpVhbPbbF9RcXXD94byT18HonAQ75b9dyR +``` ![xmr](./img/XMR.png) ## ARRR (Pirate Chain) -`zs1gn457262c52z5xa666k77zafqmke0hd60qvc38dk48w9fx378h4zjs5rrwnl0x8qazj4q3x4svz` +``` +zs1gn457262c52z5xa666k77zafqmke0hd60qvc38dk48w9fx378h4zjs5rrwnl0x8qazj4q3x4svz +``` ![ARRR](./img/ARRR.png) - - diff --git a/dpkg.build b/dpkg.build index ea532c0d..b26510b1 100644 --- a/dpkg.build +++ b/dpkg.build @@ -1 +1 @@ -dpkg-deb --build --root-owner-group meilegui_0.9.3-beta.3_amd64 +dpkg-deb --build --root-owner-group meile-gui-v1.8.0_ubuntu2004_amd64 diff --git a/img/ARRR.png b/img/ARRR.png index 33eebe6d882a2c27a0f79b39527584f2158d9f40..8c87e4fb4ec7b3f1ed93536a2a8e53f4bd62fac3 100644 GIT binary patch literal 60130 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 literal 16296 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 BtW5v_ diff --git a/img/XMR.png b/img/XMR.png index 72b899ba29df9758c71c22a75a052ed33f057a25..8eb6b2b4613ecac4b4e3093be9de9362eddcb285 100644 GIT binary patch literal 60637 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 literal 16033 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 Q{1l7kT^&{IzmJ~(F9t9Fz5oCK diff --git a/meile-gui.spec b/meile-gui.spec deleted file mode 100644 index 8ee5d725..00000000 --- a/meile-gui.spec +++ /dev/null @@ -1,44 +0,0 @@ -# -*- mode: python ; coding: utf-8 -*- - - -block_cipher = None - - -a = Analysis( - ['meile-gui.py'], - pathex=[], - binaries=[], - datas=[('src/awoc/data/', 'data'), ('src/utils/fonts/', '../utils/fonts'), ('src/utils/coinimg/', '../utils/coinimg'), ('src/imgs/', '../imgs'), ('src/kivy/', '../kivy'), ('src/conf/config/', 'config'), ('src/bin/', '../bin')], - hiddenimports=[], - hookspath=[], - hooksconfig={}, - runtime_hooks=[], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=block_cipher, - noarchive=False, -) -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE( - pyz, - a.scripts, - a.binaries, - a.zipfiles, - a.datas, - [], - name='meile-gui', - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - upx_exclude=[], - runtime_tmpdir=None, - console=True, - disable_windowed_traceback=False, - argv_emulation=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None, -) From ec2dc231860d5ddb5110a3b6220c8b5cb6e40973 Mon Sep 17 00:00:00 2001 From: freqnik Date: Fri, 26 Jan 2024 22:09:40 -0500 Subject: [PATCH 10/10] Update README --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cddd3a80..b3f7bed2 100755 --- a/README.md +++ b/README.md @@ -86,8 +86,6 @@ sudo rpm -i meile-gui-v1.8.0-1.fc36.x86_64.rpm *dnf* is **recommended** as it will install all dependencies for Meile to function correctly. - - # Arch Linux (.zst) Our wonderful community member and part-time developer @Tkd-Alex has graciously taken on the role of compiling an Arch Linux package. The current release version is **1.8.0** and can be downloaded from: [Meile Arch Linux Release](https://github.com/MathNodes/meile-gui/releases/download/v1.8.0/meile-gui-1.8.0-1-x86_64.pkg.tar.zst) @@ -98,18 +96,23 @@ To install, run: sudo pacman -U --noconfirm meile-gui-1.8.0-1-x86_64.pkg.tar.zst ``` - - ## Installing via pip **Requirements:** python<=3.10 +**Recommended:** python==3.10.x + +To install python3.10 on Ubuntu 20.04/Fedora 36 or older follow the instructions here: + + +[Install python3.10 as python on ubuntu 20.04 · GitHub](https://gist.github.com/ant1fact/8fdacea1b925ec9219cb04467783b18c) + Meile dVPN GUI v0.15.0.0 is now available as a pip packages as well. These are pre-releases scheduled to be built into a binary for the various platforms. First install system dependencies: ```shell -sudo apt install -y wireguard-tools openresolv mesa-utils libgl1-mesa-glx xclip python3-devel curl net-tools python3-venv +sudo apt install -y wireguard-tools openresolv mesa-utils libgl1-mesa-glx xclip python3-dev curl net-tools python3.10-venv build-essential ``` Then install via pip @@ -160,8 +163,6 @@ We package the following binaries with our releases: We have built tun2socks, v2ray, and sentinel-cli from source on the target architectures. Cloudflare warp is closed-source and so we packaged the binaries direct from the install link above. For windows we downloaded the pre-built gsudo binary from the above github. - - **Note:** we use **v2ray** version **5.1.0** as this is what the dvpn-node software also uses and it is recommended to use the same client version as the server version. ## Help