Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • cleanup/new_coverage_version
  • dev
  • feature/paste_any_mime_type
  • main
  • release/v0.12.0
  • v0.10.0
  • v0.11.0
7 results

Target

Select target project
  • blackfennec/extensions/core
1 result
Select Git revision
  • cleanup/new_coverage_version
  • dev
  • feature/paste_any_mime_type
  • main
  • release/v0.12.0
  • v0.10.0
  • v0.11.0
7 results
Show changes
Commits on Source (22)
Showing
with 216 additions and 233 deletions
......@@ -4,8 +4,7 @@ help:
cat Makefile
flatpak:
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak-builder --user --install .flatpak-build/ org.blackfennec.extensions.core.yml --force-clean --install-deps-from flathub --repo=.flatpak-repo
flatpak-builder --user --install .flatpak-build/ org.blackfennec.app.extensions.core.yml --force-clean --repo=.flatpak-repo
lint:
find . -name "*.py" | xargs pylint --output-format=text || true
......
from blackfennec.extension.extension_api import ExtensionApi
from blackfennec.interpretation.specification import Specification
from blackfennec.type_system.boolean_type import BooleanType
from blackfennec.type_system.list_type import ListType
from blackfennec.type_system.map_type import MapType
from blackfennec.type_system.null_type import NullType
from blackfennec.type_system.number_type import NumberType
from blackfennec.type_system.reference_type import ReferenceType
from blackfennec.type_system.string_type import StringType
from blackfennec.extension_system.extension_api import ExtensionApi
from blackfennec.extension_system.extension import Extension
from core.extension import CoreExtension
import gi
from core.null.null_view_factory import NullViewFactory
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from core.boolean.boolean_view_factory import BooleanViewFactory
from core.column_based_presenter.column_based_presenter_view_factory import \
ColumnBasedPresenterViewFactory
from core.list.list_view_factory import ListViewFactory
from core.map.map_view_factory import MapViewFactory
from core.number.number_view_factory import NumberViewFactory
from core.reference.reference_view_factory import ReferenceViewFactory
from core.string.string_view_factory import StringViewFactory
class CoreTypes:
"""Contains all core types in black-fennec
Attributes:
boolean (BooleanType): boolean type
number (NumberType): number type
string (StringType): string type
list (ListType): list type
map (MapType): map type
reference (ReferenceType): reference type
"""
boolean = BooleanType()
number = NumberType()
string = StringType()
list = ListType()
map = MapType()
reference = ReferenceType()
null = NullType()
def register(self, type_registry):
type_registry.register_type(self.boolean)
type_registry.register_type(self.number)
type_registry.register_type(self.string)
type_registry.register_type(self.list)
type_registry.register_type(self.map)
type_registry.register_type(self.reference)
type_registry.register_type(self.null)
def deregister(self, type_registry):
type_registry.deregister_type(self.boolean)
type_registry.deregister_type(self.number)
type_registry.deregister_type(self.string)
type_registry.deregister_type(self.list)
type_registry.deregister_type(self.map)
type_registry.deregister_type(self.reference)
type_registry.deregister_type(self.null)
class CoreExtension:
def __init__(self):
self._is_setup = False
self._is_registered = False
self.types = CoreTypes()
self.view_factories = dict()
self.actions = []
def setup(self, extension_api: ExtensionApi):
self.view_factories = {
self.types.boolean: BooleanViewFactory(),
self.types.number: NumberViewFactory(),
self.types.string: StringViewFactory(),
self.types.list: ListViewFactory(
extension_api.interpretation_service,
extension_api.type_registry,
extension_api.action_registry,
extension_api.view_factory
),
self.types.map: MapViewFactory(
extension_api.interpretation_service,
extension_api.type_registry,
extension_api.action_registry,
extension_api.view_factory,
),
self.types.reference: ReferenceViewFactory(),
self.types.null: NullViewFactory(),
}
from core.string.actions.to_upper import ToUpperAction
from core.string.actions.to_lower import ToLowerAction
from core.number.actions.to_integer import ToIntegerAction
from core.map.actions.delete_items import DeleteMapItemsAction
from core.list.actions.delete_items import DeleteListItemsAction
from core.boolean.actions.toggle_boolean import ToggleBooleanAction
from core.structure.actions.copy import CopyAction
from core.structure.actions.paste import PasteAction
self.actions = [
CopyAction(self.types.map, extension_api.document_registry),
CopyAction(self.types.list, extension_api.document_registry),
CopyAction(self.types.string, extension_api.document_registry),
CopyAction(self.types.number, extension_api.document_registry),
CopyAction(self.types.reference, extension_api.document_registry),
CopyAction(self.types.boolean, extension_api.document_registry),
PasteAction(self.types.map, extension_api.document_registry),
PasteAction(self.types.list, extension_api.document_registry),
PasteAction(self.types.string, extension_api.document_registry),
PasteAction(self.types.number, extension_api.document_registry),
PasteAction(self.types.reference, extension_api.document_registry),
PasteAction(self.types.boolean, extension_api.document_registry),
ToUpperAction(),
ToLowerAction(),
ToIntegerAction(),
DeleteMapItemsAction(),
DeleteListItemsAction(),
ToggleBooleanAction(),
]
def register(self, extension_api: ExtensionApi):
self.setup(extension_api)
self.types.register(extension_api.type_registry)
extension_api.presenter_registry.register_presenter(
ColumnBasedPresenterViewFactory(
extension_api.interpretation_service,
extension_api.view_factory))
for type, factory in self.view_factories.items():
extension_api.view_factory_registry.register_view_factory(
type, Specification(), factory)
extension_api.view_factory_registry.register_view_factory(
type, Specification(True), factory)
for action in self.actions:
extension_api.action_registry.register_action(action)
def deregister(self, extension_api: ExtensionApi):
self.types.deregister(extension_api.type_registry)
extension_api.presenter_registry.deregister_presenter(
ColumnBasedPresenterViewFactory
)
for type, _ in self.view_factories.items():
extension_api.view_factory_registry.deregister_view_factory(
type, Specification())
extension_api.view_factory_registry.deregister_view_factory(
type, Specification(True))
for action in self.actions:
extension_api.action_registry.deregister_action(action)
CORE_EXTENSION = CoreExtension()
def create_extension(extension_api: ExtensionApi):
"""Registers all core types in black-fennec
Args:
extension_api (ExtensionApi): contains constructor injection
parameters.
"""
CORE_EXTENSION.register(extension_api)
def destroy_extension(extension_api: ExtensionApi):
"""Deregisters all core types from black-fennec
Args:
extension_api (ExtensionApi): contains constructor injection
parameters
"""
CORE_EXTENSION.deregister(extension_api)
def create(api: ExtensionApi) -> Extension:
return CoreExtension(api)
from decimal import Decimal
from blackfennec.actions.action import Action
from blackfennec.actions.context import Context
from core import CORE_EXTENSION
from blackfennec.action_system.action import Action
from blackfennec.action_system.context import Context
class ToggleBooleanAction(Action):
def __init__(self):
super().__init__(CORE_EXTENSION.types.boolean)
def __init__(self, boolean_type):
super().__init__(boolean_type)
def execute(self, context: Context):
context.structure.value = not context.structure.value
......
......@@ -3,6 +3,7 @@ from pathlib import Path
from gi.repository import Gtk, Adw
from blackfennec.presentation_system.type_view import TypeView
from blackfennec.util.change_notification import ChangeNotification
logger = logging.getLogger(__name__)
......@@ -12,7 +13,7 @@ UI_TEMPLATE = str(BASE_DIR.joinpath('boolean_preview.ui'))
@Gtk.Template(filename=UI_TEMPLATE)
class BooleanPreview(Gtk.Switch):
class BooleanPreview(Gtk.Switch, TypeView):
"""View for the core type Boolean."""
__gtype_name__ = 'BooleanPreview'
......
......@@ -3,6 +3,7 @@ from pathlib import Path
from gi.repository import Gtk, Adw
import logging
from blackfennec.presentation_system.type_view import TypeView
from blackfennec.util.change_notification import ChangeNotification
logger = logging.getLogger(__name__)
......@@ -12,7 +13,7 @@ UI_TEMPLATE = str(BASE_DIR.joinpath('boolean_view.ui'))
@Gtk.Template(filename=UI_TEMPLATE)
class BooleanView(Adw.Bin):
class BooleanView(Adw.Bin, TypeView):
"""View for the core type Boolean."""
__gtype_name__ = 'BooleanView'
......
from blackfennec.presentation_system.type_view_factory import TypeViewFactory
from core.boolean.boolean_preview import BooleanPreview
from core.boolean.boolean_view_model import BooleanViewModel
from core.boolean.boolean_view import BooleanView
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.interpretation.specification import Specification
from blackfennec.type_system.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.specification import Specification
class BooleanViewFactory:
class BooleanViewFactory(TypeViewFactory):
"""Creator of the BooleanView"""
def satisfies(self, unused_specification: Specification) -> bool:
......
......@@ -2,13 +2,17 @@ using Gtk 4.0;
using Adw 1;
template ColumnBasedPresenterView : ScrolledWindow {
focusable: false;
Viewport viewport {
focusable: false;
hexpand: true;
vexpand: true;
hscroll-policy: natural;
scroll-to-focus: true;
scroll-to-focus: false;
Box {
focusable: false;
hexpand: true;
vexpand: true;
......@@ -16,7 +20,7 @@ template ColumnBasedPresenterView : ScrolledWindow {
visible: false;
hexpand: true;
vexpand: true;
focusable: true;
focusable: false;
}
Adw.StatusPage _empty_list_pattern {
......
......@@ -4,7 +4,7 @@ from pathlib import Path
from gi.repository import Gtk, Adw
from core.column_based_presenter.column_based_presenter_view_model import ColumnBasedPresenterViewModel
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation import Interpretation
from core.column_based_presenter.column_view import ColumnView
logger = logging.getLogger(__name__)
......
# -*- coding: utf-8 -*-
import logging
from blackfennec.layers.history.history import History
from blackfennec.layers.history.recording import RecordingLayer
from blackfennec.presentation_system.history_service import HistoryService
from blackfennec.layers.observable.observable import ObservableLayer
from blackfennec.structure.structure import Structure
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.interpretation.interpretation_service import \
from blackfennec.type_system.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation_service import \
InterpretationService
from blackfennec.interpretation.specification import Specification
from blackfennec.navigation.navigation_service import NavigationService
from blackfennec.type_system.interpretation.specification import Specification
from blackfennec.presentation_system.navigation_service.navigation_service \
import NavigationService
from blackfennec.layers.overlay.overlay import Overlay
from blackfennec.util.observable import Observable
......@@ -30,7 +31,7 @@ class ColumnBasedPresenterViewModel(Observable):
def __init__(self,
interpretation_service: InterpretationService,
navigation_service: NavigationService,
history: History):
history: HistoryService):
"""Constructor of Column-Based Presenter View Model
A presenter that arranges interpretations in columns.
......@@ -56,10 +57,11 @@ class ColumnBasedPresenterViewModel(Observable):
self,
structure: Structure
):
recording_layer = RecordingLayer(self._history)
historizable = recording_layer.apply(structure)
recording_layer = ObservableLayer()
self._history.observe(recording_layer)
observable = recording_layer.apply(structure)
overlay_layer = Overlay()
overlay = overlay_layer.apply(historizable)
overlay = overlay_layer.apply(observable)
self.show(None, overlay)
def show(
......
from blackfennec.extension_system.extension_api import ExtensionApi
from blackfennec.extension_system.extension import Extension
from blackfennec.type_system.interpretation.specification import Specification
from blackfennec.type_system.boolean_type import BooleanType
from blackfennec.type_system.list_type import ListType
from blackfennec.type_system.map_type import MapType
from blackfennec.type_system.null_type import NullType
from blackfennec.type_system.number_type import NumberType
from blackfennec.type_system.reference_type import ReferenceType
from blackfennec.type_system.string_type import StringType
from core.null.null_view_factory import NullViewFactory
from core.boolean.boolean_view_factory import BooleanViewFactory
from core.column_based_presenter.column_based_presenter_view_factory import \
ColumnBasedPresenterViewFactory
from core.list.list_view_factory import ListViewFactory
from core.map.map_view_factory import MapViewFactory
from core.number.number_view_factory import NumberViewFactory
from core.reference.reference_view_factory import ReferenceViewFactory
from core.string.string_view_factory import StringViewFactory
from core.string.actions.to_upper import ToUpperAction
from core.string.actions.to_lower import ToLowerAction
from core.number.actions.to_integer import ToIntegerAction
from core.map.actions.delete_items import DeleteMapItemsAction
from core.list.actions.delete_items import DeleteListItemsAction
from core.boolean.actions.toggle_boolean import ToggleBooleanAction
from core.structure.actions.copy import CopyAction
from core.structure.actions.paste import PasteAction
class CoreTypes:
"""Contains all core types in black-fennec
Attributes:
boolean (BooleanType): boolean type
number (NumberType): number type
string (StringType): string type
list (ListType): list type
map (MapType): map type
reference (ReferenceType): reference type
"""
boolean = BooleanType()
number = NumberType()
string = StringType()
list = ListType()
map = MapType()
reference = ReferenceType()
null = NullType()
def __iter__(self):
return iter([
self.boolean,
self.number,
self.string,
self.list,
self.map,
self.reference,
self.null,
])
class CoreExtension(Extension):
def __init__(self, api: ExtensionApi):
super().__init__('core', api)
self.types = CoreTypes()
self.view_factories = {
self.types.boolean: BooleanViewFactory(),
self.types.number: NumberViewFactory(),
self.types.string: StringViewFactory(),
self.types.list: ListViewFactory(
self._api.interpretation_service,
self._api.type_registry,
self._api.action_registry,
self._api.view_factory
),
self.types.map: MapViewFactory(
self._api.interpretation_service,
self._api.type_registry,
self._api.action_registry,
self._api.view_factory,
),
self.types.reference: ReferenceViewFactory(),
self.types.null: NullViewFactory(),
}
self.actions = [
*[CopyAction(t, self._api) for t in self.types],
*[PasteAction(t, self._api) for t in self.types],
ToUpperAction(self.types.string),
ToLowerAction(self.types.string),
ToIntegerAction(self.types.number),
DeleteMapItemsAction(self.types.map),
DeleteListItemsAction(self.types.list),
ToggleBooleanAction(self.types.boolean),
]
self.presenters = [
ColumnBasedPresenterViewFactory(
self._api.interpretation_service,
self._api.view_factory)
]
def register_types(self):
for t in self.types:
self._api.type_registry.register_type(t)
def deregister_types(self):
for t in self.types:
self._api.type_registry.deregister_type(t)
def register_actions(self):
for action in self.actions:
self._api.action_registry.register_action(action)
def deregister_actions(self):
for action in self.actions:
self._api.action_registry.deregister_action(action)
def register_view_factories(self):
for specification in [Specification(), Specification(True)]:
for type, view_factory in self.view_factories.items():
if not view_factory.satisfies(specification):
continue
self._api.view_factory_registry.register_type_view_factory(
type, specification, view_factory)
def deregister_view_factories(self):
for specification in [Specification(), Specification(True)]:
for type, view_factory in self.view_factories.items():
if not view_factory.satisfies(specification):
continue
self._api.view_factory_registry.deregister_type_view_factory(
type, specification)
def register_presenters(self):
for presenter in self.presenters:
self._api.presenter_registry.register_presenter(presenter)
def deregister_presenters(self):
for presenter in self.presenters:
self._api.presenter_registry.deregister_presenter(type(presenter))
from decimal import Decimal
from blackfennec.actions.action import Action
from blackfennec.actions.context import Context
from core import CORE_EXTENSION
from blackfennec.action_system.action import Action
from blackfennec.action_system.context import Context
class DeleteListItemsAction(Action):
def __init__(self):
super().__init__(CORE_EXTENSION.types.list)
def __init__(self, list_type):
super().__init__(list_type)
def execute(self, context: Context):
context.structure.value = []
......
......@@ -3,7 +3,7 @@ from pathlib import Path
from gi.repository import Gtk, Adw
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation import Interpretation
from core.list.list_view_model import ListViewModel
from core.util.action_item_view import ActionItemView
......@@ -33,7 +33,7 @@ class ListItemView(Adw.ActionRow, ActionItemView):
view_model (ListViewModel): view model
"""
Adw.ActionRow.__init__(self)
ActionItemView.__init__(self, interpretation, view_model)
ActionItemView.__init__(self, interpretation, view_model, self)
view = next(view_factory.create(interpretation))
self.set_activatable_widget(view)
......
......@@ -3,6 +3,8 @@ from pathlib import Path
from gi.repository import Gtk, Adw
import logging
from blackfennec.presentation_system.type_view import TypeView
logger = logging.getLogger(__name__)
BASE_DIR = Path(__file__).resolve().parent
......@@ -10,7 +12,7 @@ UI_TEMPLATE = str(BASE_DIR.joinpath('list_preview.ui'))
@Gtk.Template(filename=UI_TEMPLATE)
class ListPreview(Gtk.Button):
class ListPreview(Gtk.Button, TypeView):
"""Preview for the core type List"""
__gtype_name__ = 'ListPreview'
......
from blackfennec.actions import ActionRegistry
from blackfennec.action_system import ActionRegistry
from blackfennec.presentation_system.type_view_factory import TypeViewFactory
from blackfennec.type_system.type_registry import TypeRegistry
from core.list.list_view_model import ListViewModel
from core.list.list_view import ListView
from core.list.list_preview import ListPreview
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.interpretation.interpretation_service import InterpretationService
from blackfennec.interpretation.specification import Specification
from blackfennec.type_system.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation_service import InterpretationService
from blackfennec.type_system.interpretation.specification import Specification
class ListViewFactory:
class ListViewFactory(TypeViewFactory):
"""Creator of the ListView"""
def __init__(
......@@ -18,6 +19,7 @@ class ListViewFactory:
action_registry: ActionRegistry,
view_factory
):
super().__init__()
self._interpretation_service = interpretation_service
self._type_registry = type_registry
self._action_registry = action_registry
......
from blackfennec.actions import ActionRegistry
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.interpretation.interpretation_service import \
from blackfennec.action_system import ActionRegistry
from blackfennec.type_system.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation_service import \
InterpretationService
from blackfennec.interpretation.specification import Specification
from blackfennec.navigation.navigation_proxy import NavigationProxy
from blackfennec.type_system.interpretation.specification import Specification
from blackfennec.presentation_system.navigation_service.navigation_proxy \
import NavigationProxy
from blackfennec.structure.list import List
from blackfennec.structure.structure import Structure
from blackfennec.type_system.type import Type
from blackfennec.type_system.type_registry import TypeRegistry
from blackfennec.util.change_notification_dispatch_mixin import ChangeNotificationDispatchMixin
from blackfennec.util.change_notification_dispatch_mixin \
import ChangeNotificationDispatchMixin
class ListViewModel(ChangeNotificationDispatchMixin):
......
from decimal import Decimal
from blackfennec.actions.action import Action
from blackfennec.actions.context import Context
from core import CORE_EXTENSION
from blackfennec.action_system.action import Action
from blackfennec.action_system.context import Context
class DeleteMapItemsAction(Action):
def __init__(self):
super().__init__(CORE_EXTENSION.types.map)
def __init__(self, map_type):
super().__init__(map_type)
def execute(self, context: Context):
context.structure.value = {}
......
......@@ -2,7 +2,7 @@ import logging
from pathlib import Path
from gi.repository import Gtk, Adw
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation import Interpretation
from core.map.map_view_model import MapViewModel
logger = logging.getLogger(__name__)
......
import logging
from pathlib import Path
from gi.repository import Gtk, Adw, Gio, Gdk
from gi.repository import Gtk, Adw
from blackfennec.interpretation.interpretation import Interpretation
from blackfennec.type_system.interpretation.interpretation import Interpretation
from core.map.map_view_model import MapViewModel
from core.util.action_item_view import ActionItemView
......@@ -37,7 +37,7 @@ class MapItemView(Adw.ActionRow, ActionItemView):
"""
Adw.ActionRow.__init__(self)
ActionItemView.__init__(self, interpretation, view_model)
ActionItemView.__init__(self, interpretation, view_model, self)
self.key = key
view = next(view_factory.create(interpretation))
......
import logging
from pathlib import Path
from gi.repository import Gtk, Adw
from gi.repository import Gtk
from blackfennec.presentation_system.type_view import TypeView
logger = logging.getLogger(__name__)
......@@ -10,7 +12,7 @@ UI_TEMPLATE = str(BASE_DIR.joinpath('map_preview.ui'))
@Gtk.Template(filename=UI_TEMPLATE)
class MapPreview(Gtk.Button):
class MapPreview(Gtk.Button, TypeView):
"""Preview for the core type Map."""
__gtype_name__ = 'MapPreview'
......
......@@ -3,6 +3,7 @@ from pathlib import Path
from gi.repository import Gtk, GObject, Adw
from blackfennec.presentation_system.type_view import TypeView
from blackfennec.util.change_notification import ChangeNotification
from core.map.items.editable_map_item_view import EditableMapItemView
from core.map.items.map_item_view import MapItemView
......@@ -15,7 +16,7 @@ UI_TEMPLATE = str(BASE_DIR.joinpath('map_view.ui'))
@Gtk.Template(filename=UI_TEMPLATE)
class MapView(Adw.PreferencesGroup):
class MapView(Adw.PreferencesGroup, TypeView):
"""View for the core type Map."""
__gtype_name__ = 'MapView'
......