From 66b3ab86240f8abe2c38221eb8774ff9c8d65d15 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sun, 16 Apr 2023 22:01:16 -0500 Subject: [PATCH] Initial layout and signals --- src/new-src/__main__.py | 1 + src/new-src/core/containers/__init__.py | 3 + .../core/{ => containers}/core_widget.py | 19 ++----- src/new-src/core/containers/left_box.py | 35 ++++++++++++ src/new-src/core/containers/right_box.py | 35 ++++++++++++ src/new-src/core/controller.py | 3 +- src/new-src/core/widgets/__init__.py | 3 + src/new-src/core/widgets/delay_amount.py | 43 ++++++++++++++ src/new-src/core/widgets/images_list.py | 54 ++++++++++++++++++ src/new-src/core/widgets/monitor_list.py | 50 ++++++++++++++++ src/new-src/core/widgets/preview_image.py | 33 +++++++++++ src/new-src/core/widgets/radio_buttons.py | 57 +++++++++++++++++++ src/new-src/core/widgets/snapshot_button.py | 45 +++++++++++++++ src/new-src/core/window.py | 4 ++ src/new-src/mixins/__init__.py | 3 + src/new-src/mixins/tree_nixin.py | 37 ++++++++++++ src/new-src/utils/settings/settings.py | 39 ++++++++++++- src/old-src/mixins/tree_nixin.py | 38 +++++++++++++ 18 files changed, 484 insertions(+), 18 deletions(-) create mode 100644 src/new-src/core/containers/__init__.py rename src/new-src/core/{ => containers}/core_widget.py (59%) create mode 100644 src/new-src/core/containers/left_box.py create mode 100644 src/new-src/core/containers/right_box.py create mode 100644 src/new-src/core/widgets/__init__.py create mode 100644 src/new-src/core/widgets/delay_amount.py create mode 100644 src/new-src/core/widgets/images_list.py create mode 100644 src/new-src/core/widgets/monitor_list.py create mode 100644 src/new-src/core/widgets/preview_image.py create mode 100644 src/new-src/core/widgets/radio_buttons.py create mode 100644 src/new-src/core/widgets/snapshot_button.py create mode 100644 src/new-src/mixins/__init__.py create mode 100644 src/new-src/mixins/tree_nixin.py create mode 100644 src/old-src/mixins/tree_nixin.py diff --git a/src/new-src/__main__.py b/src/new-src/__main__.py index 8ab4870..065a783 100644 --- a/src/new-src/__main__.py +++ b/src/new-src/__main__.py @@ -32,6 +32,7 @@ if __name__ == "__main__": # Add long and short arguments parser.add_argument("--debug", "-d", default="false", help="Do extra console messaging.") parser.add_argument("--trace-debug", "-td", default="false", help="Disable saves, ignore IPC lock, do extra console messaging.") + parser.add_argument("--no-plugins", "-np", default="false", help="Do not load plugins.") parser.add_argument("--new-tab", "-nt", default="false", help="Opens a 'New Tab' if a handler is set for it.") parser.add_argument("--file", "-f", default="default", help="JUST SOME FILE ARG.") diff --git a/src/new-src/core/containers/__init__.py b/src/new-src/core/containers/__init__.py new file mode 100644 index 0000000..4efd4b9 --- /dev/null +++ b/src/new-src/core/containers/__init__.py @@ -0,0 +1,3 @@ +""" + Containers Module +""" diff --git a/src/new-src/core/core_widget.py b/src/new-src/core/containers/core_widget.py similarity index 59% rename from src/new-src/core/core_widget.py rename to src/new-src/core/containers/core_widget.py index 2775c0e..616ab1a 100644 --- a/src/new-src/core/core_widget.py +++ b/src/new-src/core/containers/core_widget.py @@ -6,7 +6,8 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports - +from .left_box import LeftBox +from .right_box import RightBox @@ -24,21 +25,11 @@ class CoreWidget(Gtk.Box): def _setup_styling(self): - self.set_orientation(1) + self.set_orientation(Gtk.Orientation.HORIZONTAL) def _setup_signals(self): ... def _load_widgets(self): - glade_box = self._builder.get_object("glade_box") - button = Gtk.Button(label="Click Me!") - - button.connect("clicked", self._hello_world) - - self.add(button) - self.add(glade_box) - - - - def _hello_world(self, widget=None, eve=None): - print("Hello, World!") + self.add(LeftBox()) + self.add(RightBox()) diff --git a/src/new-src/core/containers/left_box.py b/src/new-src/core/containers/left_box.py new file mode 100644 index 0000000..5adb631 --- /dev/null +++ b/src/new-src/core/containers/left_box.py @@ -0,0 +1,35 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from ..widgets.radio_buttons import RadioButtons +from ..widgets.delay_amount import DelayAmount +from ..widgets.preview_image import PreviewPane + + + +class LeftBox(Gtk.Box): + def __init__(self): + super(LeftBox, self).__init__() + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_orientation(Gtk.Orientation.VERTICAL) + + def _setup_signals(self): + ... + + def _load_widgets(self): + self.add(RadioButtons()) + self.add(DelayAmount()) + self.add(PreviewPane()) diff --git a/src/new-src/core/containers/right_box.py b/src/new-src/core/containers/right_box.py new file mode 100644 index 0000000..be8e6a0 --- /dev/null +++ b/src/new-src/core/containers/right_box.py @@ -0,0 +1,35 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from ..widgets.snapshot_button import SnapshotButton +from ..widgets.monitor_list import MonitorList +from ..widgets.images_list import ImagesList + + + +class RightBox(Gtk.Box): + def __init__(self): + super(RightBox, self).__init__() + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_orientation(Gtk.Orientation.VERTICAL) + + def _setup_signals(self): + ... + + def _load_widgets(self): + self.add(SnapshotButton()) + self.add(MonitorList()) + self.add(ImagesList()) diff --git a/src/new-src/core/controller.py b/src/new-src/core/controller.py index a34cbcb..95aef43 100644 --- a/src/new-src/core/controller.py +++ b/src/new-src/core/controller.py @@ -1,4 +1,5 @@ # Python imports +import os # Lib imports import gi @@ -11,7 +12,7 @@ from gi.repository import GLib # Application imports from .mixins.signals_mixins import SignalsMixins from .controller_data import ControllerData -from .core_widget import CoreWidget +from .containers.core_widget import CoreWidget diff --git a/src/new-src/core/widgets/__init__.py b/src/new-src/core/widgets/__init__.py new file mode 100644 index 0000000..72b072b --- /dev/null +++ b/src/new-src/core/widgets/__init__.py @@ -0,0 +1,3 @@ +""" + Widgets Module +""" diff --git a/src/new-src/core/widgets/delay_amount.py b/src/new-src/core/widgets/delay_amount.py new file mode 100644 index 0000000..613059a --- /dev/null +++ b/src/new-src/core/widgets/delay_amount.py @@ -0,0 +1,43 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class DelayAmount(Gtk.Box): + def __init__(self): + super(DelayAmount, self).__init__() + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_orientation(Gtk.Orientation.HORIZONTAL) + self.set_margin_top(5) + self.set_margin_bottom(5) + + def _setup_signals(self): + ... + + def _load_widgets(self): + label = Gtk.Label("Timeout: ") + spinner = Gtk.SpinButton() + + spinner.set_hexpand(True) + spinner.set_numeric(True) + spinner.set_snap_to_ticks(True) + spinner.set_digits(0) + spinner.set_range(1, 120) + spinner.set_increments(1, 5) + + self.add(label) + self.add(spinner) diff --git a/src/new-src/core/widgets/images_list.py b/src/new-src/core/widgets/images_list.py new file mode 100644 index 0000000..7f7471f --- /dev/null +++ b/src/new-src/core/widgets/images_list.py @@ -0,0 +1,54 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins.tree_nixin import TreeMixin + + + +class ImagesList(TreeMixin, Gtk.ScrolledWindow): + def __init__(self): + super(ImagesList, self).__init__() + + self._store = None + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_size_request(200, -1) + self.set_hexpand(False) + self.set_vexpand(True) + self.set_margin_top(15) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + ... + + def _load_widgets(self): + grid, self._store = self._create_treeview_widget("Images") + self.referesh_directory_list() + self.add(grid) + + @threaded + def referesh_directory_list(self): + images = settings.get_directory_list() + images.sort() + if len(images) != len(self._store): + self._store.clear() + for image in images: + GLib.idle_add(self.add_to_store, (image,)) + + def add_to_store(self, image): + self._store.append(image) diff --git a/src/new-src/core/widgets/monitor_list.py b/src/new-src/core/widgets/monitor_list.py new file mode 100644 index 0000000..b2e6f31 --- /dev/null +++ b/src/new-src/core/widgets/monitor_list.py @@ -0,0 +1,50 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins.tree_nixin import TreeMixin + + + +class MonitorList(TreeMixin, Gtk.Box): + def __init__(self): + super(MonitorList, self).__init__() + + self._store = None + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_hexpand(False) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + ... + + def _load_widgets(self): + grid, self._store = self._create_treeview_widget("Monitors") + self._load_monitor_store() + + grid.set_hexpand(True) + self.add(grid) + + def _load_monitor_store(self): + MONITORS = settings.get_monitor_data() + i = 0 + for monitor in MONITORS: + if i > 0: + mon = str(monitor.width) + "x" + str(monitor.height) + "+" + str(monitor.x) + "+" + str(monitor.y) + self._store.append([mon]) + i += 1 diff --git a/src/new-src/core/widgets/preview_image.py b/src/new-src/core/widgets/preview_image.py new file mode 100644 index 0000000..398671d --- /dev/null +++ b/src/new-src/core/widgets/preview_image.py @@ -0,0 +1,33 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class PreviewPane(Gtk.AspectFrame): + def __init__(self): + super(PreviewPane, self).__init__() + + self._preview_image = None + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_size_request(312, 312) + + def _setup_signals(self): + ... + + def _load_widgets(self): + self._preview_image = Gtk.Image() + self.add(self._preview_image) diff --git a/src/new-src/core/widgets/radio_buttons.py b/src/new-src/core/widgets/radio_buttons.py new file mode 100644 index 0000000..85604ba --- /dev/null +++ b/src/new-src/core/widgets/radio_buttons.py @@ -0,0 +1,57 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class RadioButtons(Gtk.Box): + def __init__(self): + super(RadioButtons, self).__init__() + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_orientation(Gtk.Orientation.HORIZONTAL) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + event_system.subscribe("get_screenshot_type", self._get_active_type) + + def _load_widgets(self): + radio_1 = Gtk.RadioButton(label = "Entire Screen") + radio_2 = Gtk.RadioButton(label = "Active Window") + radio_3 = Gtk.RadioButton(label = "Select Region") + radio_4 = Gtk.RadioButton(label = "Select Monitor") + + self.add(radio_1) + self.add(radio_2) + self.add(radio_3) + self.add(radio_4) + + self._setup_data() + + def _setup_data(self): + last_child = None + for child in self.get_children(): + if last_child: + child.join_group(last_child) + else: + last_child = child + + def _get_active_type(self): + group = self.get_children()[0].get_group() + active_radio = [r for r in group if r.get_active()] + return active_radio[0] diff --git a/src/new-src/core/widgets/snapshot_button.py b/src/new-src/core/widgets/snapshot_button.py new file mode 100644 index 0000000..30c68b3 --- /dev/null +++ b/src/new-src/core/widgets/snapshot_button.py @@ -0,0 +1,45 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class SnapshotButton(Gtk.Button): + def __init__(self): + super(SnapshotButton, self).__init__() + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_always_show_image(True) + self.set_image_position(Gtk.PositionType.LEFT) + self.set_label("Take Snapshot") + + def _setup_signals(self): + self.connect("clicked", self._take_snapshot) + + def _subscribe_to_events(self): + ... + + def _load_widgets(self): + image = Gtk.Image.new_from_icon_name("gtk-media-play", 3) + self.set_image(image) + + def _take_snapshot(self, widget = None, eve = None): + type = event_system.emit_and_await("get_screenshot_type").get_label() + print(type) + # NOTE: + # 1. Get type of screenshot + # 2. Grab screenshot + # 3. Emit images list file update diff --git a/src/new-src/core/window.py b/src/new-src/core/window.py index 45c79b5..d91edbf 100644 --- a/src/new-src/core/window.py +++ b/src/new-src/core/window.py @@ -43,6 +43,10 @@ class Window(Gtk.ApplicationWindow): def _setup_styling(self): self.set_default_size(settings.get_main_window_width(), settings.get_main_window_height()) + + self.set_size_request(settings.get_main_window_width(), + settings.get_main_window_height()) + self.set_title(f"{app_name}") self.set_icon_from_file( settings.get_window_icon() ) self.set_gravity(5) # 5 = CENTER diff --git a/src/new-src/mixins/__init__.py b/src/new-src/mixins/__init__.py new file mode 100644 index 0000000..636992f --- /dev/null +++ b/src/new-src/mixins/__init__.py @@ -0,0 +1,3 @@ +""" + Mixins module +""" diff --git a/src/new-src/mixins/tree_nixin.py b/src/new-src/mixins/tree_nixin.py new file mode 100644 index 0000000..9182fa7 --- /dev/null +++ b/src/new-src/mixins/tree_nixin.py @@ -0,0 +1,37 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class TreeMixin: + def _create_treeview_widget(self, title = "Not Set"): + scroll = Gtk.ScrolledWindow() + grid = Gtk.TreeView() + store = Gtk.ListStore(str) + column = Gtk.TreeViewColumn(title) + name = Gtk.CellRendererText() + selec = grid.get_selection() + + grid.set_model(store) + selec.set_mode(2) + scroll.set_size_request(145, 96) + + column.pack_start(name, True) + column.add_attribute(name, "text", 0) + column.set_expand(False) + + grid.append_column(column) + grid.set_search_column(0) + grid.set_headers_visible(True) + grid.set_enable_tree_lines(False) + + grid.show_all() + scroll.add(grid) + grid.columns_autosize() + return scroll, store diff --git a/src/new-src/utils/settings/settings.py b/src/new-src/utils/settings/settings.py index 58408e3..2aeba1c 100644 --- a/src/new-src/utils/settings/settings.py +++ b/src/new-src/utils/settings/settings.py @@ -4,6 +4,9 @@ import json import inspect # Lib imports +import gi +gi.require_version('Gdk', '3.0') +from gi.repository import Gdk # Application imports from ..singleton import Singleton @@ -23,6 +26,7 @@ class Settings(StartCheckMixin, Singleton): self._USR_CONFIG_FILE = f"{self._USR_PATH}/settings.json" self._HOME_CONFIG_PATH = f"{self._USER_HOME}/.config/{app_name.lower()}" + self._SCREENSHOTS_DIR = f"{self._USER_HOME}/.screenshots" self._PLUGINS_PATH = f"{self._HOME_CONFIG_PATH}/plugins" self._DEFAULT_ICONS = f"{self._HOME_CONFIG_PATH}/icons" self._CONFIG_FILE = f"{self._HOME_CONFIG_PATH}/settings.json" @@ -30,14 +34,17 @@ class Settings(StartCheckMixin, Singleton): self._CSS_FILE = f"{self._HOME_CONFIG_PATH}/stylesheet.css" self._KEY_BINDINGS_FILE = f"{self._HOME_CONFIG_PATH}/key-bindings.json" self._PID_FILE = f"{self._HOME_CONFIG_PATH}/{app_name.lower()}.pid" - self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{app_name.lower()}.png" self._UI_WIDEGTS_PATH = f"{self._HOME_CONFIG_PATH}/ui_widgets" self._CONTEXT_MENU = f"{self._HOME_CONFIG_PATH}/contexct_menu.json" + self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{app_name.lower()}.png" + if not os.path.exists(self._HOME_CONFIG_PATH): os.mkdir(self._HOME_CONFIG_PATH) if not os.path.exists(self._PLUGINS_PATH): os.mkdir(self._PLUGINS_PATH) + if not os.path.isdir(self._SCREENSHOTS_DIR): + os.mkdir(self._SCREENSHOTS_DIR) if not os.path.exists(self._CONFIG_FILE): import shutil @@ -87,8 +94,8 @@ class Settings(StartCheckMixin, Singleton): self._main_window = None - self._main_window_w = 800 - self._main_window_h = 600 + self._main_window_w = 500 + self._main_window_h = 310 self._builder = None self.PAINT_BG_COLOR = (0, 0, 0, 0.54) @@ -134,6 +141,7 @@ class Settings(StartCheckMixin, Singleton): def get_ui_widgets_path(self) -> str: return self._UI_WIDEGTS_PATH def get_context_menu_data(self) -> str: return self._context_menu_data + def get_screenshots_dir(self) -> str: return self._SCREENSHOTS_DIR def get_plugins_path(self) -> str: return self._PLUGINS_PATH def get_icon_theme(self) -> str: return self._ICON_THEME def get_css_file(self) -> str: return self._CSS_FILE @@ -175,3 +183,28 @@ class Settings(StartCheckMixin, Singleton): def save_settings(self): with open(self._CONFIG_FILE, 'w') as outfile: json.dump(self._settings, outfile, separators=(',', ':'), indent=4) + + + def get_monitor_data(self): + screen = self.get_main_window().get_screen() + wdth = screen.get_width() + hght = screen.get_height() + mon0 = Gdk.Rectangle() + mon0.width = wdth + mon0.height = hght + monitors = [] + + monitors.append(mon0) + for m in range(screen.get_n_monitors()): + monitors.append(screen.get_monitor_geometry(m)) + + return monitors + + def get_directory_list(self): + files = [] + + for file in os.listdir(self._SCREENSHOTS_DIR): + if os.path.isfile(os.path.join(self._SCREENSHOTS_DIR, file)): + files.append(file) + + return files diff --git a/src/old-src/mixins/tree_nixin.py b/src/old-src/mixins/tree_nixin.py new file mode 100644 index 0000000..da93a84 --- /dev/null +++ b/src/old-src/mixins/tree_nixin.py @@ -0,0 +1,38 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + +class TreeMixin: + def _create_treeview_widget(self, title = "Not Set"): + # scroll = Gtk.ScrolledWindow() + grid = Gtk.TreeView() + store = Gtk.ListStore(str) + column = Gtk.TreeViewColumn(title) + name = Gtk.CellRendererText() + selec = grid.get_selection() + + grid.set_model(store) + selec.set_mode(2) + # scroll.set_size_request(145, 96) + + column.pack_start(name, True) + column.add_attribute(name, "text", 0) + column.set_expand(False) + + grid.append_column(column) + grid.set_search_column(0) + grid.set_headers_visible(True) + grid.set_enable_tree_lines(False) + + grid.show_all() + # scroll.add(grid) + grid.columns_autosize() + # return scroll, store + return grid, store