Skip to content

Commit

Permalink
Move metaclass editor to profile package
Browse files Browse the repository at this point in the history
Clean up unused code
  • Loading branch information
amolenaar committed Mar 17, 2020
1 parent 5207245 commit 3128131
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 152 deletions.
89 changes: 10 additions & 79 deletions gaphor/diagram/classes/classespropertypages.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
PropertyPageBase,
PropertyPages,
UMLComboModel,
create_hbox_label,
new_builder,
on_bool_cell_edited,
on_keypress_event,
Expand Down Expand Up @@ -97,99 +96,31 @@ def _swap_objects(self, o1, o2):
return self._item.subject.ownedOperation.swap(o1, o2)


def _issubclass(c, b):
try:
return issubclass(c, b)
except TypeError:
return False
@PropertyPages.register(UML.Classifier)
class ClassifierPropertyPage(PropertyPageBase):


@PropertyPages.register(UML.Class)
class ClassPropertyPage(NamedElementPropertyPage):
"""Adapter which shows a property page for a class view.
Also handles metaclasses.
"""

subject: UML.Class

CLASSES = list(
sorted(
c
for c in dir(UML)
if _issubclass(getattr(UML, c), UML.Element) and c != "Stereotype"
)
)
order = 15

def __init__(self, subject):
super().__init__(subject)
self.subject = subject

def construct(self):
if UML.model.is_metaclass(self.subject):
return self.construct_metaclass()

page = super().construct()
return

if not self.subject:
return page
builder = new_builder("classifier-editor")

# Abstract toggle
hbox = Gtk.HBox()
label = Gtk.Label(label="")
label.set_justify(Gtk.Justification.LEFT)
self.size_group.add_widget(label)
hbox.pack_start(label, False, True, 0)
button = Gtk.CheckButton(label=gettext("Abstract"))
button.set_active(self.subject.isAbstract)
abstract = builder.get_object("abstract")
abstract.set_active(self.subject.isAbstract)

button.connect("toggled", self._on_abstract_change)
hbox.pack_start(button, True, True, 0)
page.pack_start(hbox, False, True, 0)
builder.connect_signals({"abstract-changed": (self._on_abstract_change,)})

return page
return builder.get_object("classifier-editor")

@transactional
def _on_abstract_change(self, button):
self.subject.isAbstract = button.get_active()

def construct_metaclass(self):
page = Gtk.VBox()

subject = self.subject
if not subject:
return page

hbox = create_hbox_label(self, page, gettext("Name"))
model = Gtk.ListStore(str)
for c in self.CLASSES:
model.append([c])

cb = Gtk.ComboBox.new_with_model_and_entry(model)
cb.set_entry_text_column(0)
completion = Gtk.EntryCompletion()
completion.set_model(model)
completion.set_minimum_key_length(1)
completion.set_text_column(0)
cb.get_child().set_completion(completion)

entry = cb.get_child()
entry.set_text(subject and subject.name or "")
hbox.pack_start(cb, True, True, 0)
page.default = entry

# monitor subject.name attribute
changed_id = entry.connect("changed", self._on_name_changed)

def handler(event):
if event.element is subject and event.new_value is not None:
entry.handler_block(changed_id)
entry.set_text(event.new_value)
entry.handler_unblock(changed_id)

self.watcher.watch("name", handler).subscribe_all()
entry.connect("destroy", self.watcher.unsubscribe_all)
page.show_all()
return page


@PropertyPages.register(InterfaceItem)
class InterfacePropertyPage(PropertyPageBase):
Expand Down
3 changes: 2 additions & 1 deletion gaphor/diagram/profiles/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
def _load():
from gaphor.diagram.profiles import (
extensionconnect,
stereotypepage,
metaclasspropertypage,
stereotypepropertypages,
)


Expand Down
72 changes: 72 additions & 0 deletions gaphor/diagram/profiles/metaclasspropertypage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from gi.repository import Gtk

from gaphor import UML
from gaphor.core import transactional
from gaphor.diagram.propertypages import PropertyPageBase, PropertyPages, new_builder


def _issubclass(c, b):
try:
return issubclass(c, b)
except TypeError:
return False


@PropertyPages.register(UML.Class)
class MetaclassPropertyPage(PropertyPageBase):
"""Adapter which shows a property page for a class view.
Also handles metaclasses.
"""

subject: UML.Class

CLASSES = list(
sorted(
c
for c in dir(UML)
if _issubclass(getattr(UML, c), UML.Element) and c != "Stereotype"
)
)

def __init__(self, subject):
self.subject = subject
self.watcher = subject.watcher()

def construct(self):
if not UML.model.is_metaclass(self.subject):
return

builder = new_builder("metaclass-editor")

combo = builder.get_object("metaclass-combo")
for c in self.CLASSES:
combo.append_text(c)

completion = Gtk.EntryCompletion()
completion.set_model(combo.get_model())
completion.set_minimum_key_length(1)
completion.set_text_column(0)

entry = combo.get_child()
entry.set_completion(completion)

entry.set_text(self.subject and self.subject.name or "")

def handler(event):
if event.element is self.subject and event.new_value is not None:
entry.set_text(event.new_value)

self.watcher.watch("name", handler).subscribe_all()

builder.connect_signals(
{
"metaclass-combo-changed": (self._on_name_changed,),
"metaclass-combo-destroy": (self.watcher.unsubscribe_all,),
}
)

return builder.get_object("metaclass-editor")

@transactional
def _on_name_changed(self, combo):
self.subject.name = combo.get_active_text()
File renamed without changes.
55 changes: 27 additions & 28 deletions gaphor/diagram/propertypages.glade
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,28 @@ Use -/= to move items up or down.</property>
</object>
</child>
</object>
<object class="GtkBox" id="classifier-editor">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="abstract">
<property name="label" translatable="yes">Abstract</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="abstract-changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<object class="GtkBox" id="comment-editor">
<property name="visible">True</property>
<property name="can_focus">False</property>
Expand Down Expand Up @@ -658,29 +680,6 @@ Use -/= to move items up or down.</property>
</packing>
</child>
</object>
<object class="GtkListStore" id="metaclass-model">
<columns>
<!-- column-name class -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Class</col>
</row>
<row>
<col id="0" translatable="yes">Interface</col>
</row>
<row>
<col id="0" translatable="yes">Element</col>
</row>
</data>
</object>
<object class="GtkEntryCompletion" id="metaclass-completion">
<property name="model">metaclass-model</property>
<property name="text_column">0</property>
<property name="inline_completion">True</property>
<property name="inline_selection">True</property>
</object>
<object class="GtkBox" id="metaclass-editor">
<property name="visible">True</property>
<property name="can_focus">False</property>
Expand All @@ -703,16 +702,16 @@ Use -/= to move items up or down.</property>
</packing>
</child>
<child>
<object class="GtkComboBox">
<object class="GtkComboBoxText" id="metaclass-combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">metaclass-model</property>
<property name="has_entry">True</property>
<property name="entry_text_column">0</property>
<signal name="changed" handler="metaclass-combo-changed" swapped="no"/>
<signal name="destroy" handler="metaclass-combo-destroy" swapped="no"/>
<child internal-child="entry">
<object class="GtkEntry">
<property name="can_focus">False</property>
<property name="completion">metaclass-completion</property>
<property name="can_focus">True</property>
<property name="text" translatable="yes">NamedElement</property>
</object>
</child>
</object>
Expand Down
38 changes: 5 additions & 33 deletions gaphor/diagram/propertypages.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@
from gaphor.UML.element import DummyEventWatcher


def new_builder(object_id):
def new_builder(*object_ids):
builder = Gtk.Builder()
builder.set_translation_domain("gaphor")
with importlib.resources.path(
"gaphor.diagram", "propertypages.glade"
) as glade_file:
builder.add_objects_from_file(str(glade_file), [object_id])
builder.add_objects_from_file(str(glade_file), object_ids)
return builder


Expand Down Expand Up @@ -328,35 +328,6 @@ def get_value(self, index):
return self._data[index][1]


def create_uml_combo(data, callback):
"""
Create a combo box using ``UMLComboModel`` model.
Combo box is returned.
"""
model = UMLComboModel(data)
combo = Gtk.ComboBox(model=model)
cell = Gtk.CellRendererText()
combo.pack_start(cell, True)
combo.add_attribute(cell, "text", 0)
combo.connect("changed", callback)
return combo


def create_hbox_label(adapter, page, label):
"""
Create a HBox with a label for given property page adapter and page
itself.
"""
hbox = Gtk.HBox(spacing=12)
label = Gtk.Label(label=label)
# label.set_alignment(0.0, 0.5)
adapter.size_group.add_widget(label)
hbox.pack_start(label, False, True, 0)
page.pack_start(hbox, False, True, 0)
return hbox


@PropertyPages.register(UML.NamedElement)
class NamedElementPropertyPage(PropertyPageBase):
"""An adapter which works for any named item view.
Expand All @@ -375,9 +346,11 @@ def __init__(self, subject: UML.NamedElement):
)
self.subject = subject
self.watcher = subject.watcher() if subject else DummyEventWatcher()
self.size_group = Gtk.SizeGroup.new(Gtk.SizeGroupMode.HORIZONTAL)

def construct(self):
if UML.model.is_metaclass(self.subject):
return

builder = new_builder("named-element-editor")

subject = self.subject
Expand Down Expand Up @@ -428,7 +401,6 @@ class LineStylePage(PropertyPageBase):
def __init__(self, item):
super().__init__()
self.item = item
self.size_group = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL)
self.horizontal_button: Gtk.Button

def construct(self):
Expand Down

0 comments on commit 3128131

Please sign in to comment.