diff options
author | Matthias Baumgartner <dev@igsor.net> | 2023-02-08 21:29:58 +0100 |
---|---|---|
committer | Matthias Baumgartner <dev@igsor.net> | 2023-02-08 21:29:58 +0100 |
commit | bf98c062ece242a5fc56de0f1adbc12f0588809a (patch) | |
tree | 417f4fe5af06bfeb028e96c809bb23bf58bb4e29 /tagit/apps | |
parent | 547124605a9f86469a547fcaf38dc18ae57b707f (diff) | |
parent | f39d577421bc2e4b041b5d22e788f4615ef78d77 (diff) | |
download | tagit-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.py | 40 | ||||
-rw-r--r-- | tagit/apps/port-config.yaml | 154 | ||||
-rw-r--r-- | tagit/apps/port-schema.nt | 108 | ||||
-rw-r--r-- | tagit/apps/port_data.py | 127 |
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()) + ) + |