aboutsummaryrefslogtreecommitdiffstats
path: root/tagit/apps
diff options
context:
space:
mode:
authorMatthias Baumgartner <dev@igsor.net>2023-02-08 21:29:58 +0100
committerMatthias Baumgartner <dev@igsor.net>2023-02-08 21:29:58 +0100
commitbf98c062ece242a5fc56de0f1adbc12f0588809a (patch)
tree417f4fe5af06bfeb028e96c809bb23bf58bb4e29 /tagit/apps
parent547124605a9f86469a547fcaf38dc18ae57b707f (diff)
parentf39d577421bc2e4b041b5d22e788f4615ef78d77 (diff)
downloadtagit-bf98c062ece242a5fc56de0f1adbc12f0588809a.tar.gz
tagit-bf98c062ece242a5fc56de0f1adbc12f0588809a.tar.bz2
tagit-bf98c062ece242a5fc56de0f1adbc12f0588809a.zip
Merge branch 'mb/port/desktop' into develop
Diffstat (limited to 'tagit/apps')
-rw-r--r--tagit/apps/desktop.py40
-rw-r--r--tagit/apps/port-config.yaml154
-rw-r--r--tagit/apps/port-schema.nt108
-rw-r--r--tagit/apps/port_data.py127
4 files changed, 426 insertions, 3 deletions
diff --git a/tagit/apps/desktop.py b/tagit/apps/desktop.py
index 67733f0..7b21336 100644
--- a/tagit/apps/desktop.py
+++ b/tagit/apps/desktop.py
@@ -5,6 +5,7 @@ A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
# standard imports
+import os
import typing
# kivy imports
@@ -12,7 +13,10 @@ from kivy.app import App
from kivy.uix.settings import SettingsWithSidebar
# tagit imports
-from tagit.widgets import desktop
+from tagit import config
+from tagit.utils import bsfs, ns
+from tagit.utils.bsfs import URI
+from tagit.windows import desktop
# exports
__all__: typing.Sequence[str] = (
@@ -32,20 +36,50 @@ class TagitApp(App):
# set title
self.title = 'tagit v2.0'
+ # FIXME: mb/port
+ # load essentials
+
+ #from tagit.config.loader import load_settings, TAGITRC
+ #cfg = load_settings(TAGITRC, 0)
+ cfg = config.Settings.Open(os.path.join(os.path.dirname(__file__), 'port-config.yaml'))
+
+ # FIXME: mb/port/bsfs
+ # open BSFS storage
+ store = bsfs.Open(cfg('session', 'bsfs'))
+ # check storage schema
+ # FIXME: Move somewhere else?!
+ with open(os.path.join(os.path.dirname(__file__), 'port-schema.nt'), 'rt') as ifile:
+ required_schema = bsfs.schema.from_string(ifile.read())
+ # FIXME: Since the store isn't persistent, we migrate to the required one here.
+ #if not required_schema <= store.schema:
+ # raise Exception('')
+ store.migrate(required_schema)
+
+ # FIXME: debug: add some data to the storage
+ from . import port_data
+ port_data.add_port_data(store)
+
# create widget
- return desktop.MainWindow()
+ return desktop.MainWindow(cfg, store, None) # FIXME: expects cfg, stor, log arguments
def on_start(self):
# trigger startup operations
self.root.on_startup()
+ # FIXME: mb/port
+ #def on_stop(self):
+ # self.root.session.storage.close()
-def main():
+def main(argv):
"""Start the tagit GUI. Opens a window to browse images."""
# Run the GUI
app = TagitApp()
app.run()
+## config
+
+config.declare(('session', 'bsfs'), config.Any(), {},
+ __name__, 'bsfs config', 'Configuration to connect to a BSFS storage.')
## main ##
diff --git a/tagit/apps/port-config.yaml b/tagit/apps/port-config.yaml
new file mode 100644
index 0000000..a9907b7
--- /dev/null
+++ b/tagit/apps/port-config.yaml
@@ -0,0 +1,154 @@
+session:
+ first_start: false
+ paths:
+ searchlog: ~/.tagit.log
+ bsfs: # FIXME: mb/port: rename to storage, but that space is currently polluted
+ Graph:
+ backend:
+ SparqlStore: {}
+ user: 'http://example.com/me'
+ script:
+ #- ShowBrowsing
+ - [AddToken, 'hello']
+storage:
+ index:
+ preview_size:
+ - 50
+ - 200
+ - 400
+ui:
+ standalone:
+ plane: browsing
+ keytriggers:
+ - CreateGroup
+ - DissolveGroup
+ - AddToGroup
+ - MoveCursorUp
+ - MoveCursorDown
+ - MoveCursorLeft
+ - MoveCursorRight
+ - MoveCursorLast
+ - MoveCursorFirst
+ - NextPage
+ - PreviousPage
+ - ScrollDown
+ - ScrollUp
+ - ZoomIn
+ - ZoomOut
+ - Select
+ - SelectAll
+ - SelectNone
+ - SelectMulti
+ - SelectRange
+ - AddToken
+ - GoBack
+ - GoForth
+ - SearchByAddressOnce
+ - SearchmodeSwitch
+ - AddTag
+ - EditTag
+ - OpenGroup
+ #- RepresentGroup
+ - Search
+ - ShowSelected
+ - RemoveSelected
+ - OpenExternal
+ - ShowHelp
+ browser:
+ maxcols: 8
+ maxrows: 8
+ buttondocks:
+ sidebar_left:
+ - Menu
+ - ShowDashboard
+ - AddToken
+ - AddTag
+ - EditTag
+ - CreateGroup
+ - DissolveGroup
+ - SelectAll
+ - SelectNone
+ - SelectInvert
+ - SelectAdditive
+ - SelectSubtractive
+ - SelectSingle
+ - SelectMulti
+ - SelectRange
+ - ShellDrop
+ filter:
+ - AddToken
+ - EditToken
+ context:
+ app:
+ - ShowSettings
+ - ShowHelp
+ - ShowConsole
+ - ShowBrowsing
+ browser:
+ - ZoomIn
+ - ZoomOut
+ # clipboard:
+ # - ClipboardCopy
+ # - ClipboardPaste
+ grouping:
+ - CreateGroup
+ - DissolveGroup
+ - AddToGroup
+ # - RepresentGroup
+ # - RemoveFromGroup
+ root:
+ - LoadSession
+ # search:
+ # - ShowSelected
+ # - RemoveSelected
+ select:
+ - SelectAll
+ - SelectNone
+ - SelectInvert
+ - SelectSingle
+ - SelectMulti
+ - SelectRange
+ - SelectAdditive
+ - SelectSubtractive
+ tagging:
+ - AddTag
+ - EditTag
+ # - SetRank1
+ # - SetRank3
+ # - SetRank5
+ search:
+ sort_blacklist:
+ - entity
+ - flash
+ - latitude
+ - longitude
+ - mime
+ - author
+ - camera
+ - attributes
+ tiledocks:
+ dashboard: {}
+ #Buttons:
+ # buttons:
+ # - ShowBrowsing
+ # - CreateSession
+ # - CreateTempSession
+ # - LoadSession
+ # - ReloadSession
+ # - ImportObjects
+ # - ItemExport
+ # - UpdateSelectedObjects
+ # - ShowHelp
+ # - ShowSettings
+ #Hints: {}
+ #LibSummary: {}
+ #Searchtree: {}
+ #TagHistogram: {}
+ #Tagcloud: {}
+ sidebar_right:
+ Info: {}
+ CursorTags: {}
+ BrowserTags: {}
+ #SelectionTags: {}
+ #Geo: {}
+ window_size: 1024x768
diff --git a/tagit/apps/port-schema.nt b/tagit/apps/port-schema.nt
new file mode 100644
index 0000000..7569052
--- /dev/null
+++ b/tagit/apps/port-schema.nt
@@ -0,0 +1,108 @@
+# common external prefixes
+prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+prefix xsd: <http://www.w3.org/2001/XMLSchema#>
+prefix schema: <http://schema.org/>
+
+# common bsfs prefixes
+prefix bsfs: <http://bsfs.ai/schema/>
+prefix bse: <http://bsfs.ai/schema/Entity#>
+prefix bst: <http://bsfs.ai/schema/Tag#>
+prefix bsg: <http://bsfs.ai/schema/Group#>
+prefix bsp: <http://bsfs.ai/schema/Preview#>
+
+# essential nodes
+bsfs:Entity rdfs:subClassOf bsfs:Node .
+bsfs:Preview rdfs:subClassOf bsfs:Node .
+bsfs:File rdfs:subClassOf bsfs:Entity .
+bsfs:Tag rdfs:subClassOf bsfs:Node .
+bsfs:Group rdfs:subClassOf bsfs:Node .
+
+# common definitions
+bsfs:BinaryBlob rdfs:subClassOf bsfs:Literal .
+bsfs:URI rdfs:subClassOf bsfs:Literal .
+bsfs:Number rdfs:subClassOf bsfs:Literal .
+bsfs:Time rdfs:subClassOf bsfs:Literal .
+bsfs:JPEG rdfs:subClassOf bsfs:BinaryBlob .
+xsd:string rdfs:subClassOf bsfs:Literal .
+xsd:integer rdfs:subClassOf bsfs:Number .
+
+bse:filename rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range xsd:string ;
+ rdfs:label "File name"^^xsd:string ;
+ schema:description "Filename of entity in some filesystem."^^xsd:string ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:filesize rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range xsd:integer ;
+ rdfs:label "File size"^^xsd:string ;
+ schema:description "File size of entity in some filesystem."^^xsd:string ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:mime rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range xsd:string ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:preview rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Entity ;
+ rdfs:range bsfs:Preview .
+
+bse:tag rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range bsfs:Tag .
+
+bst:label rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Tag ;
+ rdfs:range xsd:string ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:comment rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Node ;
+ rdfs:range xsd:string .
+
+bse:group rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Entity ;
+ rdfs:range bsfs:Group .
+
+bsg:represented_by rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Group ;
+ rdfs:range bsfs:File ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:longitude rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range xsd:integer ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bse:latitude rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:File ;
+ rdfs:range xsd:integer ;
+ bsfs:unique "true"^^xsd:boolean .
+
+
+## preview nodes
+
+bsp:width rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Preview ;
+ rdfs:range xsd:integer ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bsp:height rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Preview ;
+ rdfs:range xsd:integer ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bsp:orientation rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Preview ;
+ rdfs:range xsd:integer ;
+ bsfs:unique "true"^^xsd:boolean .
+
+bsp:asset rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Preview ;
+ rdfs:range bsfs:JPEG ;
+ bsfs:unique "true"^^xsd:boolean .
+
+
diff --git a/tagit/apps/port_data.py b/tagit/apps/port_data.py
new file mode 100644
index 0000000..cda2d63
--- /dev/null
+++ b/tagit/apps/port_data.py
@@ -0,0 +1,127 @@
+import os
+from tagit.utils import ns
+from tagit.utils.bsfs import URI
+
+def add_port_data(store):
+ # tags
+ t_hello = store.node(ns.bsfs.Tag, URI('http://example.com/me/tag#hello')) \
+ .set(ns.bst.label, 'hello')
+ t_world = store.node(ns.bsfs.Tag, URI('http://example.com/me/tag#world')) \
+ .set(ns.bst.label, 'world')
+ t_foobar = store.node(ns.bsfs.Tag, URI('http://example.com/me/tag#foobar')) \
+ .set(ns.bst.label, 'foobar')
+
+ # entities
+ n0 = store.node(ns.bsfs.File, URI('http://example.com/me/entity#01')) \
+ .set(ns.bse.filename, 'textfile.t') \
+ .set(ns.bse.filesize, 100) \
+ .set(ns.bse.tag, t_hello) \
+ .set(ns.bse.tag, t_foobar) \
+ .set(ns.bse.latitude, 47.374444) \
+ .set(ns.bse.longitude, 8.541111)
+ n1 = store.node(ns.bsfs.File, URI('http://example.com/me/entity#02')) \
+ .set(ns.bse.filename, 'document.pdf') \
+ .set(ns.bse.filesize, 200) \
+ .set(ns.bse.tag, t_world) \
+ .set(ns.bse.tag, t_foobar)
+ n2 = store.node(ns.bsfs.File, URI('http://example.com/me/entity#03')) \
+ .set(ns.bse.filename, 'document.odt') \
+ .set(ns.bse.filesize, 300) \
+ .set(ns.bse.tag, t_world)
+ n3 = store.node(ns.bsfs.File, URI('http://example.com/me/entity#04')) \
+ .set(ns.bse.filename, 'image.jpg') \
+ .set(ns.bse.comment, 'some image') \
+ .set(ns.bse.tag, t_hello) \
+ .set(ns.bse.tag, t_foobar)
+ n4 = store.node(ns.bsfs.File, URI('http://example.com/me/entity#05')) \
+ .set(ns.bse.filename, 'image.png') \
+ .set(ns.bse.comment, 'another image') \
+ .set(ns.bse.tag, t_hello)
+
+ # groups
+ grp = store.node(ns.bsfs.Group, URI('http://example.com/me/group#1234'))
+ grp.set(ns.bsg.represented_by, n0)
+ n0.set(ns.bse.group, grp)
+ n1.set(ns.bse.group, grp)
+ n3.set(ns.bse.group, grp)
+
+ # previews
+ base = os.path.join(os.path.dirname(__file__), 'port-data')
+ n0.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent01_w100_h100')) \
+ .set(ns.bsp.width, 100) \
+ .set(ns.bsp.height, 100) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent01_w100_h100.jpg'), 'rb').read())
+ )
+ n0.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, str('http://example.com/me/preview#ent01_w400_h200')) \
+ .set(ns.bsp.width, 200) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent01_w400_h200.jpg'), 'rb').read())
+ )
+ n0.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent01_w400_h400')) \
+ .set(ns.bsp.width, 400) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent01_w400_h400.jpg'), 'rb').read())
+ )
+ n1.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent02_w100_h100')) \
+ .set(ns.bsp.width, 100) \
+ .set(ns.bsp.height, 100) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent02_w100_h100.jpg'), 'rb').read())
+ )
+ n1.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent02_w400_h200')) \
+ .set(ns.bsp.width, 200) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent02_w400_h200.jpg'), 'rb').read())
+ )
+ n2.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent03_w100_h100')) \
+ .set(ns.bsp.width, 100) \
+ .set(ns.bsp.height, 100) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent03_w100_h100.jpg'), 'rb').read())
+ )
+ n2.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent03_w400_h200')) \
+ .set(ns.bsp.width, 200) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent03_w400_h200.jpg'), 'rb').read())
+ )
+ n3.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent04_w100_h100')) \
+ .set(ns.bsp.width, 100) \
+ .set(ns.bsp.height, 100) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent04_w100_h100.png'), 'rb').read())
+ )
+ n3.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent04_w400_h200')) \
+ .set(ns.bsp.width, 200) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent04_w400_h200.png'), 'rb').read())
+ )
+ n4.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent05_w100_h100')) \
+ .set(ns.bsp.width, 100) \
+ .set(ns.bsp.height, 100) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent05_w100_h100.jpg'), 'rb').read())
+ )
+ n4.set(ns.bse.preview,
+ store.node(ns.bsfs.Preview, URI('http://example.com/me/preview#ent05_w400_h200')) \
+ .set(ns.bsp.width, 200) \
+ .set(ns.bsp.height, 400) \
+ .set(ns.bsp.orientation, 1) \
+ .set(ns.bsp.asset, open(os.path.join(base, 'ent05_w400_h200.jpg'), 'rb').read())
+ )
+