mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-06-30 20:20:22 +12:00
Added logic for character selection in its view
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
parent
ef119917cf
commit
9dc2544d1c
|
@ -4,6 +4,7 @@
|
||||||
from manuskript.data.characters import Characters, Character
|
from manuskript.data.characters import Characters, Character
|
||||||
from manuskript.data.color import Color
|
from manuskript.data.color import Color
|
||||||
from manuskript.data.goal import GoalKind, Goal
|
from manuskript.data.goal import GoalKind, Goal
|
||||||
|
from manuskript.data.importance import Importance
|
||||||
from manuskript.data.info import Info
|
from manuskript.data.info import Info
|
||||||
from manuskript.data.labels import LabelHost, Label
|
from manuskript.data.labels import LabelHost, Label
|
||||||
from manuskript.data.outline import Outline, OutlineFolder, OutlineText
|
from manuskript.data.outline import Outline, OutlineFolder, OutlineText
|
||||||
|
|
|
@ -5,6 +5,7 @@ import os
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from manuskript.data.color import Color
|
from manuskript.data.color import Color
|
||||||
|
from manuskript.data.importance import Importance
|
||||||
from manuskript.data.unique_id import UniqueIDHost
|
from manuskript.data.unique_id import UniqueIDHost
|
||||||
from manuskript.io.mmdFile import MmdFile
|
from manuskript.io.mmdFile import MmdFile
|
||||||
|
|
||||||
|
@ -48,9 +49,11 @@ class Character:
|
||||||
if ID is None:
|
if ID is None:
|
||||||
raise IOError("Character is missing ID!")
|
raise IOError("Character is missing ID!")
|
||||||
|
|
||||||
|
importance = Character.loadAttribute(metadata, "Importance", None)
|
||||||
|
|
||||||
self.UID = self.characters.host.loadID(int(ID))
|
self.UID = self.characters.host.loadID(int(ID))
|
||||||
self.name = Character.loadAttribute(metadata, "Name", None)
|
self.name = Character.loadAttribute(metadata, "Name", None)
|
||||||
self.importance = Character.loadAttribute(metadata, "Importance", None)
|
self.importance = Importance.fromRawString(importance)
|
||||||
self.POV = Character.loadAttribute(metadata, "POV", None)
|
self.POV = Character.loadAttribute(metadata, "POV", None)
|
||||||
self.motivation = Character.loadAttribute(metadata, "Motivation", None)
|
self.motivation = Character.loadAttribute(metadata, "Motivation", None)
|
||||||
self.goal = Character.loadAttribute(metadata, "Goal", None)
|
self.goal = Character.loadAttribute(metadata, "Goal", None)
|
||||||
|
@ -72,7 +75,7 @@ class Character:
|
||||||
|
|
||||||
metadata["Name"] = self.name
|
metadata["Name"] = self.name
|
||||||
metadata["ID"] = str(self.UID.value)
|
metadata["ID"] = str(self.UID.value)
|
||||||
metadata["Importance"] = self.importance
|
metadata["Importance"] = Importance.toRawString(self.importance)
|
||||||
metadata["POV"] = self.POV
|
metadata["POV"] = self.POV
|
||||||
metadata["Motivation"] = self.motivation
|
metadata["Motivation"] = self.motivation
|
||||||
metadata["Goal"] = self.goal
|
metadata["Goal"] = self.goal
|
||||||
|
@ -96,10 +99,16 @@ class Characters:
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
self.dir_path = os.path.join(path, "characters")
|
self.dir_path = os.path.join(path, "characters")
|
||||||
self.host = UniqueIDHost()
|
self.host = UniqueIDHost()
|
||||||
self.characters = list()
|
self.data = dict()
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self.data.values().__iter__()
|
||||||
|
|
||||||
|
def getByID(self, ID: int) -> Character:
|
||||||
|
return self.data.get(ID, None)
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
self.characters.clear()
|
self.data.clear()
|
||||||
|
|
||||||
for name in os.listdir(self.dir_path):
|
for name in os.listdir(self.dir_path):
|
||||||
path = os.path.join(self.dir_path, name)
|
path = os.path.join(self.dir_path, name)
|
||||||
|
@ -114,8 +123,8 @@ class Characters:
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self.characters.append(character)
|
self.data[character.UID.value] = character
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
for character in self.characters:
|
for character in self.data.values():
|
||||||
character.save()
|
character.save()
|
||||||
|
|
|
@ -11,6 +11,9 @@ class Color:
|
||||||
self.green = green
|
self.green = green
|
||||||
self.blue = blue
|
self.blue = blue
|
||||||
|
|
||||||
|
def getRGB(self):
|
||||||
|
return (self.red << 24) | (self.green << 16) | (self.blue << 8)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "#%02x%02x%02x" % (self.red, self.green, self.blue)
|
return "#%02x%02x%02x" % (self.red, self.green, self.blue)
|
||||||
|
|
||||||
|
|
29
manuskript/data/importance.py
Normal file
29
manuskript/data/importance.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# --!-- coding: utf8 --!--
|
||||||
|
|
||||||
|
from enum import Enum, unique
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class Importance(Enum):
|
||||||
|
MINOR = 0
|
||||||
|
SECONDARY = 1
|
||||||
|
MAIN = 2
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def asValue(cls, importance):
|
||||||
|
return 0 if importance is None else importance.value
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def fromRawString(cls, raw: str):
|
||||||
|
if raw is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
return Importance(int(raw))
|
||||||
|
except ValueError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def toRawString(cls, importance):
|
||||||
|
return None if importance is None else str(importance.value)
|
|
@ -5,17 +5,11 @@ import os
|
||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
from enum import Enum, unique
|
from enum import Enum, unique
|
||||||
|
from manuskript.data.importance import Importance
|
||||||
from manuskript.data.unique_id import UniqueIDHost, UniqueID
|
from manuskript.data.unique_id import UniqueIDHost, UniqueID
|
||||||
from manuskript.io.xmlFile import XmlFile
|
from manuskript.io.xmlFile import XmlFile
|
||||||
|
|
||||||
|
|
||||||
@unique
|
|
||||||
class PlotImportance(Enum):
|
|
||||||
MINOR = 0
|
|
||||||
SECONDARY = 1
|
|
||||||
MAIN = 2
|
|
||||||
|
|
||||||
|
|
||||||
class PlotStep:
|
class PlotStep:
|
||||||
|
|
||||||
def __init__(self, plot, UID: UniqueID, name: str, meta: str = "", summary: str = ""):
|
def __init__(self, plot, UID: UniqueID, name: str, meta: str = "", summary: str = ""):
|
||||||
|
@ -32,7 +26,7 @@ class PlotStep:
|
||||||
|
|
||||||
class PlotLine:
|
class PlotLine:
|
||||||
|
|
||||||
def __init__(self, plots, UID: UniqueID, name: str, importance: PlotImportance = PlotImportance.MINOR):
|
def __init__(self, plots, UID: UniqueID, name: str, importance: Importance = Importance.MINOR):
|
||||||
self.plots = plots
|
self.plots = plots
|
||||||
self.host = UniqueIDHost()
|
self.host = UniqueIDHost()
|
||||||
|
|
||||||
|
@ -72,12 +66,12 @@ class Plots:
|
||||||
self.host = UniqueIDHost()
|
self.host = UniqueIDHost()
|
||||||
self.lines = dict()
|
self.lines = dict()
|
||||||
|
|
||||||
def addLine(self, name: str, importance: PlotImportance = PlotImportance.MINOR):
|
def addLine(self, name: str, importance: Importance = Importance.MINOR):
|
||||||
line = PlotLine(self, self.host.newID(), name, importance)
|
line = PlotLine(self, self.host.newID(), name, importance)
|
||||||
self.lines[line.UID.value] = line
|
self.lines[line.UID.value] = line
|
||||||
return line
|
return line
|
||||||
|
|
||||||
def loadLine(self, ID: int, name: str, importance: PlotImportance = PlotImportance.MINOR):
|
def loadLine(self, ID: int, name: str, importance: Importance = Importance.MINOR):
|
||||||
line = PlotLine(self, self.host.loadID(ID), name, importance)
|
line = PlotLine(self, self.host.loadID(ID), name, importance)
|
||||||
self.lines[line.UID.value] = line
|
self.lines[line.UID.value] = line
|
||||||
return line
|
return line
|
||||||
|
@ -110,7 +104,7 @@ class Plots:
|
||||||
if ID is None:
|
if ID is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
importance = PlotImportance(int(element.get("importance", 0)))
|
importance = Importance.fromRawString(element.get("importance", None))
|
||||||
line = plots.loadLine(int(ID), element.get("name"), importance)
|
line = plots.loadLine(int(ID), element.get("name"), importance)
|
||||||
line.description = element.get("description")
|
line.description = element.get("description")
|
||||||
line.result = element.get("result")
|
line.result = element.get("result")
|
||||||
|
@ -169,7 +163,7 @@ class Plots:
|
||||||
|
|
||||||
cls.saveElementAttribute(element, "name", line.name)
|
cls.saveElementAttribute(element, "name", line.name)
|
||||||
cls.saveElementAttribute(element, "ID", line.UID.value)
|
cls.saveElementAttribute(element, "ID", line.UID.value)
|
||||||
cls.saveElementAttribute(element, "importance", line.importance.value)
|
cls.saveElementAttribute(element, "importance", Importance.toRawString(line.importance))
|
||||||
cls.saveElementAttribute(element, "characters", characters)
|
cls.saveElementAttribute(element, "characters", characters)
|
||||||
cls.saveElementAttribute(element, "description", line.description)
|
cls.saveElementAttribute(element, "description", line.description)
|
||||||
cls.saveElementAttribute(element, "result", line.result)
|
cls.saveElementAttribute(element, "result", line.result)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from manuskript.ui.util import pixbufFromColor
|
||||||
|
|
||||||
from manuskript.ui.generalView import GeneralView
|
from manuskript.ui.generalView import GeneralView
|
||||||
from manuskript.ui.summaryView import SummaryView
|
from manuskript.ui.summaryView import SummaryView
|
||||||
from manuskript.ui.charactersView import CharactersView
|
from manuskript.ui.charactersView import CharactersView
|
||||||
|
@ -10,3 +12,6 @@ from manuskript.ui.outlineView import OutlineView
|
||||||
from manuskript.ui.editorView import EditorView
|
from manuskript.ui.editorView import EditorView
|
||||||
|
|
||||||
from manuskript.ui.mainWindow import MainWindow
|
from manuskript.ui.mainWindow import MainWindow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,20 +6,61 @@ import gi
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
from manuskript.data import Characters, Character, Importance, Color
|
||||||
|
from manuskript.ui.util import rgbaFromColor, pixbufFromColor
|
||||||
|
from manuskript.util import validString, invalidString, validInt, invalidInt
|
||||||
|
|
||||||
|
|
||||||
class CharactersView:
|
class CharactersView:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, characters: Characters):
|
||||||
|
self.characters = characters
|
||||||
|
self.character = None
|
||||||
|
|
||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
builder.add_from_file("ui/characters.glade")
|
builder.add_from_file("ui/characters.glade")
|
||||||
|
|
||||||
self.widget = builder.get_object("characters_view")
|
self.widget = builder.get_object("characters_view")
|
||||||
|
|
||||||
|
self.charactersStore = builder.get_object("characters_store")
|
||||||
|
|
||||||
|
for character in self.characters:
|
||||||
|
tree_iter = self.charactersStore.append()
|
||||||
|
|
||||||
|
if tree_iter is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
self.charactersStore.set_value(tree_iter, 0, character.UID.value)
|
||||||
|
self.charactersStore.set_value(tree_iter, 1, validString(character.name))
|
||||||
|
self.charactersStore.set_value(tree_iter, 2, pixbufFromColor(character.color))
|
||||||
|
self.charactersStore.set_value(tree_iter, 3, Importance.asValue(character.importance))
|
||||||
|
|
||||||
|
self.mainCharactersStore = builder.get_object("main_characters_store")
|
||||||
|
self.secondaryCharactersStore = builder.get_object("secondary_characters_store")
|
||||||
|
self.minorCharactersStore = builder.get_object("minor_characters_store")
|
||||||
|
|
||||||
|
self.mainCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == 2)
|
||||||
|
self.secondaryCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == 1)
|
||||||
|
self.minorCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == 0)
|
||||||
|
|
||||||
|
self.mainCharactersStore.refilter()
|
||||||
|
self.secondaryCharactersStore.refilter()
|
||||||
|
self.minorCharactersStore.refilter()
|
||||||
|
|
||||||
|
self.characterSelections = [
|
||||||
|
builder.get_object("minor_character_selection"),
|
||||||
|
builder.get_object("secondary_character_selection"),
|
||||||
|
builder.get_object("main_character_selection")
|
||||||
|
]
|
||||||
|
|
||||||
|
for selection in self.characterSelections:
|
||||||
|
selection.connect("changed", self.characterSelectionChanged)
|
||||||
|
|
||||||
self.colorButton = builder.get_object("color")
|
self.colorButton = builder.get_object("color")
|
||||||
self.importanceCombo = builder.get_object("importance")
|
self.importanceCombo = builder.get_object("importance")
|
||||||
self.allowPOVCheck = builder.get_object("allow_POV")
|
self.allowPOVCheck = builder.get_object("allow_POV")
|
||||||
|
|
||||||
self.colorButton.connect("color-set", self.colorSet)
|
self.colorSetSignal = self.colorButton.connect("color-set", self.colorSet)
|
||||||
self.importanceCombo.connect("changed", self.importanceChanged)
|
self.importanceCombo.connect("changed", self.importanceChanged)
|
||||||
self.allowPOVCheck.connect("toggled", self.allowPOVToggled)
|
self.allowPOVCheck.connect("toggled", self.allowPOVToggled)
|
||||||
|
|
||||||
|
@ -45,10 +86,71 @@ class CharactersView:
|
||||||
self.summaryBuffer = builder.get_object("summary")
|
self.summaryBuffer = builder.get_object("summary")
|
||||||
self.notesBuffer = builder.get_object("notes")
|
self.notesBuffer = builder.get_object("notes")
|
||||||
|
|
||||||
|
self.unloadCharacterData()
|
||||||
|
|
||||||
|
def loadCharacterData(self, character: Character):
|
||||||
|
self.character = None
|
||||||
|
|
||||||
|
self.colorButton.set_rgba(rgbaFromColor(character.color))
|
||||||
|
self.allowPOVCheck.set_active(character.allowPOV())
|
||||||
|
|
||||||
|
self.nameBuffer.set_text(validString(character.name), -1)
|
||||||
|
self.motivationBuffer.set_text(validString(character.motivation), -1)
|
||||||
|
self.goalBuffer.set_text(validString(character.goal), -1)
|
||||||
|
self.conflictBuffer.set_text(validString(character.conflict), -1)
|
||||||
|
self.epiphanyBuffer.set_text(validString(character.epiphany), -1)
|
||||||
|
self.oneSentenceBuffer.set_text(validString(character.summarySentence), -1)
|
||||||
|
self.oneParagraphBuffer.set_text(validString(character.summaryParagraph), -1)
|
||||||
|
self.summaryBuffer.set_text(validString(character.summaryFull), -1)
|
||||||
|
self.notesBuffer.set_text(validString(character.notes), -1)
|
||||||
|
|
||||||
|
self.character = character
|
||||||
|
|
||||||
|
def unloadCharacterData(self):
|
||||||
|
self.character = None
|
||||||
|
|
||||||
|
self.colorButton.set_rgba(rgbaFromColor(Color(0, 0, 0)))
|
||||||
|
self.allowPOVCheck.set_active(False)
|
||||||
|
|
||||||
|
self.nameBuffer.set_text("", -1)
|
||||||
|
self.motivationBuffer.set_text("", -1)
|
||||||
|
self.goalBuffer.set_text("", -1)
|
||||||
|
self.conflictBuffer.set_text("", -1)
|
||||||
|
self.epiphanyBuffer.set_text("", -1)
|
||||||
|
self.oneSentenceBuffer.set_text("", -1)
|
||||||
|
self.oneParagraphBuffer.set_text("", -1)
|
||||||
|
self.summaryBuffer.set_text("", -1)
|
||||||
|
self.notesBuffer.set_text("", -1)
|
||||||
|
|
||||||
|
def characterSelectionChanged(self, selection: Gtk.TreeSelection):
|
||||||
|
model, tree_iter = selection.get_selected()
|
||||||
|
|
||||||
|
if tree_iter is None:
|
||||||
|
self.unloadCharacterData()
|
||||||
|
return
|
||||||
|
|
||||||
|
for other in self.characterSelections:
|
||||||
|
if other != selection:
|
||||||
|
other.unselect_all()
|
||||||
|
|
||||||
|
character = self.characters.getByID(model[tree_iter][0])
|
||||||
|
|
||||||
|
if character is None:
|
||||||
|
self.unloadCharacterData()
|
||||||
|
else:
|
||||||
|
self.loadCharacterData(character)
|
||||||
|
|
||||||
def colorSet(self, button: Gtk.ColorButton):
|
def colorSet(self, button: Gtk.ColorButton):
|
||||||
|
if self.character is None:
|
||||||
|
return
|
||||||
|
|
||||||
color = button.get_rgba()
|
color = button.get_rgba()
|
||||||
|
|
||||||
print("{} {} {} {}".format(color.red, color.green, color.blue, color.alpha))
|
red = int(color.red * 255)
|
||||||
|
green = int(color.green * 255)
|
||||||
|
blue = int(color.blue * 255)
|
||||||
|
|
||||||
|
self.character.color = Color(red, green, blue)
|
||||||
|
|
||||||
def importanceChanged(self, combo: Gtk.ComboBox):
|
def importanceChanged(self, combo: Gtk.ComboBox):
|
||||||
tree_iter = combo.get_active_iter()
|
tree_iter = combo.get_active_iter()
|
||||||
|
@ -62,9 +164,10 @@ class CharactersView:
|
||||||
print("blub " + name)
|
print("blub " + name)
|
||||||
|
|
||||||
def allowPOVToggled(self, button: Gtk.ToggleButton):
|
def allowPOVToggled(self, button: Gtk.ToggleButton):
|
||||||
state = button.get_active()
|
if self.character is None:
|
||||||
|
return
|
||||||
|
|
||||||
print("OK: {}".format(state))
|
self.character.POV = button.get_active()
|
||||||
|
|
||||||
def addDetailsClicked(self, button: Gtk.Button):
|
def addDetailsClicked(self, button: Gtk.Button):
|
||||||
tree_iter = self.detailsStore.append()
|
tree_iter = self.detailsStore.append()
|
||||||
|
|
|
@ -49,7 +49,7 @@ class MainWindow:
|
||||||
|
|
||||||
self.generalView = MainWindow.packViewIntoSlot(builder, "general_slot", GeneralView, self.project.info)
|
self.generalView = MainWindow.packViewIntoSlot(builder, "general_slot", GeneralView, self.project.info)
|
||||||
self.summaryView = MainWindow.packViewIntoSlot(builder, "summary_slot", SummaryView, self.project.summary)
|
self.summaryView = MainWindow.packViewIntoSlot(builder, "summary_slot", SummaryView, self.project.summary)
|
||||||
self.charactersView = MainWindow.packViewIntoSlot(builder, "characters_slot", CharactersView)
|
self.charactersView = MainWindow.packViewIntoSlot(builder, "characters_slot", CharactersView, self.project.characters)
|
||||||
self.plotView = MainWindow.packViewIntoSlot(builder, "plot_slot", PlotView)
|
self.plotView = MainWindow.packViewIntoSlot(builder, "plot_slot", PlotView)
|
||||||
self.worldView = MainWindow.packViewIntoSlot(builder, "world_slot", WorldView)
|
self.worldView = MainWindow.packViewIntoSlot(builder, "world_slot", WorldView)
|
||||||
self.outlineView = MainWindow.packViewIntoSlot(builder, "outline_slot", OutlineView)
|
self.outlineView = MainWindow.packViewIntoSlot(builder, "outline_slot", OutlineView)
|
||||||
|
|
27
manuskript/ui/util.py
Normal file
27
manuskript/ui/util.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version('Gdk', '3.0')
|
||||||
|
gi.require_version('GdkPixbuf', '2.0')
|
||||||
|
from gi.repository import GdkPixbuf, Gdk
|
||||||
|
|
||||||
|
from manuskript.data import Color
|
||||||
|
|
||||||
|
|
||||||
|
def rgbaFromColor(color: Color) -> Gdk.RGBA:
|
||||||
|
rgba = Gdk.RGBA()
|
||||||
|
rgba.red = color.red / 255.
|
||||||
|
rgba.green = color.green / 255.
|
||||||
|
rgba.blue = color.blue / 255.
|
||||||
|
rgba.alpha = 1.
|
||||||
|
return rgba
|
||||||
|
|
||||||
|
def pixbufFromColor(color: Color) -> GdkPixbuf:
|
||||||
|
if color is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, 8, 16, 16)
|
||||||
|
pixbuf.fill(color.getRGB())
|
||||||
|
return pixbuf
|
|
@ -10,3 +10,11 @@ def validString(invalid: str) -> str:
|
||||||
|
|
||||||
def invalidString(valid: str) -> str:
|
def invalidString(valid: str) -> str:
|
||||||
return None if len(valid) == 0 else valid
|
return None if len(valid) == 0 else valid
|
||||||
|
|
||||||
|
|
||||||
|
def validInt(invalid: int) -> int:
|
||||||
|
return 0 if invalid is None else invalid
|
||||||
|
|
||||||
|
|
||||||
|
def invalidInt(valid: int) -> int:
|
||||||
|
return None if valid == 0 else valid
|
||||||
|
|
|
@ -25,6 +25,27 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
|
||||||
<!-- interface-name Manuskript -->
|
<!-- interface-name Manuskript -->
|
||||||
<!-- interface-description Manuskript is an open-source tool for writers. -->
|
<!-- interface-description Manuskript is an open-source tool for writers. -->
|
||||||
<!-- interface-copyright 2015-2021 Olivier Keshavjee et al. -->
|
<!-- interface-copyright 2015-2021 Olivier Keshavjee et al. -->
|
||||||
|
<object class="GtkListStore" id="characters_store">
|
||||||
|
<columns>
|
||||||
|
<!-- column-name ID -->
|
||||||
|
<column type="gint"/>
|
||||||
|
<!-- column-name name -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name color -->
|
||||||
|
<column type="GdkPixbuf"/>
|
||||||
|
<!-- column-name importance -->
|
||||||
|
<column type="gint"/>
|
||||||
|
</columns>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelFilter" id="main_characters_store">
|
||||||
|
<property name="child-model">characters_store</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelFilter" id="minor_characters_store">
|
||||||
|
<property name="child-model">characters_store</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelFilter" id="secondary_characters_store">
|
||||||
|
<property name="child-model">characters_store</property>
|
||||||
|
</object>
|
||||||
<object class="GtkTextBuffer" id="conflict"/>
|
<object class="GtkTextBuffer" id="conflict"/>
|
||||||
<object class="GtkListStore" id="details_store">
|
<object class="GtkListStore" id="details_store">
|
||||||
<columns>
|
<columns>
|
||||||
|
@ -109,9 +130,30 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox">
|
<object class="GtkTreeView">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="model">main_characters_store</property>
|
||||||
|
<property name="headers-visible">False</property>
|
||||||
|
<child internal-child="selection">
|
||||||
|
<object class="GtkTreeSelection" id="main_character_selection"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn">
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererPixbuf"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="pixbuf">2</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
@ -132,9 +174,30 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox">
|
<object class="GtkTreeView">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="model">secondary_characters_store</property>
|
||||||
|
<property name="headers-visible">False</property>
|
||||||
|
<child internal-child="selection">
|
||||||
|
<object class="GtkTreeSelection" id="secondary_character_selection"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn">
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererPixbuf"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="pixbuf">2</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
@ -155,12 +218,33 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox">
|
<object class="GtkTreeView">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="model">minor_characters_store</property>
|
||||||
|
<property name="headers-visible">False</property>
|
||||||
|
<child internal-child="selection">
|
||||||
|
<object class="GtkTreeSelection" id="minor_character_selection"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn">
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererPixbuf"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="pixbuf">2</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">5</property>
|
<property name="position">5</property>
|
||||||
</packing>
|
</packing>
|
||||||
|
@ -349,6 +433,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">one_paragraph_summary</property>
|
<property name="buffer">one_paragraph_summary</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -374,6 +459,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">one_sentence_summary</property>
|
<property name="buffer">one_sentence_summary</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -399,6 +485,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">epiphany</property>
|
<property name="buffer">epiphany</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -424,6 +511,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">conflict</property>
|
<property name="buffer">conflict</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -449,6 +537,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">goal</property>
|
<property name="buffer">goal</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -474,6 +563,7 @@ summary</property>
|
||||||
<property name="height-request">100</property>
|
<property name="height-request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">motivation</property>
|
<property name="buffer">motivation</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -631,6 +721,7 @@ summary</property>
|
||||||
<object class="GtkTextView">
|
<object class="GtkTextView">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">summary</property>
|
<property name="buffer">summary</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@ -667,6 +758,7 @@ summary</property>
|
||||||
<object class="GtkTextView">
|
<object class="GtkTextView">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
<property name="buffer">notes</property>
|
<property name="buffer">notes</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
Loading…
Reference in a new issue