M meson.build => meson.build +3 -1
@@ 5,6 5,8 @@ project('thumbdrives',
],
)
+dependency('libhandy-0.0', version: '>=0.0.10')
+
i18n = import('i18n')
@@ 12,4 14,4 @@ subdir('data')
subdir('src')
subdir('po')
-meson.add_install_script('build-aux/meson/postinstall.py')>
\ No newline at end of file
+meson.add_install_script('build-aux/meson/postinstall.py')
M nl.brixit.Thumbdrives.json => nl.brixit.Thumbdrives.json +20 -0
@@ 22,6 22,26 @@
"*.a"
],
"modules" : [
+ {
+ "name" : "libhandy",
+ "buildsystem" : "meson",
+ "config-opts" : [
+ "-Dprofiling=false",
+ "-Dintrospection=enabled",
+ "-Dgtk_doc=false",
+ "-Dtests=false",
+ "-Dexamples=false",
+ "-Dvapi=false",
+ "-Dglade_catalog=disabled"
+ ],
+ "sources" : [
+ {
+ "type" : "git",
+ "url" : "https://source.puri.sm/Librem5/libhandy.git",
+ "branch": "v0.0.11"
+ }
+ ]
+ },
{
"name" : "thumbdrives",
"builddir" : true,
M src/window.py => src/window.py +29 -0
@@ 26,7 26,12 @@
# use or other dealings in this Software without prior written
# authorization.
+import subprocess
+import os
+
from gi.repository import Gtk
+from xdg import XDG_DATA_HOME
+
import thumbdrives.vdisk as vdisk
@@ 37,9 42,21 @@ class ThumbdrivesWindow(Gtk.ApplicationWindow):
mount = Gtk.Template.Child()
unmount = Gtk.Template.Child()
+ thumbdrive_list = Gtk.Template.Child()
+ iso_list = Gtk.Template.Child()
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
+ datadir = XDG_DATA_HOME / "thumbdrives"
+ if not datadir.is_dir():
+ datadir.mkdir()
+
+ for img in datadir.glob('*.img'):
+ self.add_img(img)
+ for iso in datadir.glob('*.iso'):
+ self.add_iso(iso)
+
def on_mount_clicked(self, widget, args):
print("MOUNTING")
subprocess.run(['truncate', '-s', '16G', '/tmp/test.img'])
@@ 47,3 64,15 @@ class ThumbdrivesWindow(Gtk.ApplicationWindow):
def on_unmount_clicked(self, widget, args):
vdisk.unmount()
+
+ def add_img(path):
+ box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
+ label = Gtk.Label(path.name.replace(".img", ""))
+ box.pack_start(label, True, True, False)
+ self.thumbdrive_list.insert(box)
+
+ def add_iso(path):
+ box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
+ label = Gtk.Label(path.name.replace(".iso", ""))
+ box.pack_start(label, True, True, False)
+ self.iso_list.insert(box)
M src/window.ui => src/window.ui +223 -21
@@ 2,54 2,256 @@
<!-- Generated with glade 3.22.2 -->
<interface>
<requires lib="gtk+" version="3.20"/>
+ <requires lib="libhandy" version="0.0"/>
<template class="ThumbdrivesWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property>
<property name="default_width">600</property>
<property name="default_height">300</property>
<child type="titlebar">
- <object class="GtkHeaderBar" id="header_bar">
+ <object class="HdyHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="title">Hello, World!</property>
- <property name="show_close_button">True</property>
+ <property name="title">Thumbdrives</property>
+ <property name="subtitle">No drive mounted</property>
+ <child>
+ <placeholder/>
+ </child>
</object>
</child>
<child>
- <object class="GtkBox">
+ <object class="GtkStack" id="main_stack">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
<child>
- <object class="GtkButton" id="mount">
- <property name="label" translatable="yes">Mount</property>
+ <object class="GtkScrolledWindow" id="page_home">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <signal name="clicked" handler="on_mount_clicked" swapped="no"/>
+ <property name="vscrollbar_policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="margin_right">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Thumbdrives</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="add_thumbdrive">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">24</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkAlignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkListBox">
+ <property name="name">thumbdrive_list</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ <style>
+ <class name="view"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">ISO Images</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="add_iso">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">24</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkAlignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkListBox">
+ <property name="name">iso_list</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ <style>
+ <class name="view"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
+ <property name="name">page0</property>
+ <property name="title" translatable="yes">page0</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="unmount">
- <property name="label" translatable="yes">Unmount</property>
+ <object class="GtkScrolledWindow" id="page_add">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <signal name="clicked" handler="on_unmount_clicked" swapped="no"/>
+ <property name="vscrollbar_policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="margin_right">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="name">page1</property>
+ <property name="title" translatable="yes">page1</property>
<property name="position">1</property>
</packing>
</child>
- <child>
- <placeholder/>
- </child>
</object>
</child>
</template>