initial step at modularization. not happy with candy distro

This commit is contained in:
Vivianne 2022-03-23 22:31:33 -07:00
parent f473a73b16
commit 991b23bac5
13 changed files with 370 additions and 262 deletions

View File

@ -1,5 +1,5 @@
namespace Deskcandy.Candy {
class Video : BaseCandy {
public class Video : BaseCandy {
public bool loop { get; set; default = true; }
public double speed { get; set; default = 100.0; }

View File

@ -1,5 +1,5 @@
namespace Deskcandy.Candy {
class XScreensaver : BaseCandy {
public class XScreensaver : BaseCandy {
public string config_path { get; private set; }
public string saver_path { get; private set; }

View File

@ -22,7 +22,7 @@ namespace Deskcandy.Candy {
tag = this.get_child("_description");
this.description = tag.text_content.strip();
message(@"Loaded $this");
debug(@"Loaded $this");
}
public string to_string() {

View File

@ -4,5 +4,9 @@
<file>window.ui</file>
<file>desktop_window.ui</file>
<file>main_menu.ui</file>
<file>editor_page.ui</file>
<file>presets_page.ui</file>
<file>screensaver_form.ui</file>
<file>video_form.ui</file>
</gresource>
</gresources>

View File

@ -264,176 +264,9 @@
</object>
</child>
</template>
<template class="DeskcandyScreensaverForm" parent="GtkBin">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="screensaver_chooser">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="model">screensavers_liststore</property>
<property name="headers-clickable">False</property>
<property name="search-column">0</property>
<property name="activate-on-single-click">True</property>
<signal name="row-activated" handler="on_screensaver_chooser_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="ss_name"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Description</property>
<child>
<object class="GtkCellRendererText" id="ss_description">
<property name="single-paragraph-mode">True</property>
</object>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</template>
<template class="DeskcandyVideoForm" parent="GtkBin">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkFileChooserButton" id="video_chooser">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">start</property>
<property name="filter">video_file_filter</property>
<property name="title" translatable="yes">Select Video</property>
<signal name="file-set" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Speed</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="video_speed_slider">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">video_speed_adjustment</property>
<property name="round-digits">2</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<signal name="value-changed" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="video_loop_checkbox">
<property name="label" translatable="yes">Loop</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</template>
<object class="GtkAdjustment" id="opacity_adjustment">
<property name="upper">100</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkListStore" id="screensavers_liststore">
<columns>
<!-- column-name label -->
<column type="gchararray"/>
<!-- column-name description -->
<column type="gchararray"/>
<!-- column-name name -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkFileFilter" id="video_file_filter">
<mime-types>
<mime-type>video/*</mime-type>
</mime-types>
</object>
<object class="GtkAdjustment" id="video_speed_adjustment">
<property name="lower">0.01</property>
<property name="upper">5</property>
<property name="step-increment">0.01</property>
<property name="page-increment">0.10</property>
</object>
</interface>

47
src/editor_page.vala Normal file
View File

@ -0,0 +1,47 @@
using Deskcandy.Candy;
namespace Deskcandy {
[GtkTemplate(ui = "/moe/solarpunk/Deskcandy/editor_page.ui")]
public class EditorPage : Gtk.Bin {
public signal void preset_type_changed(string type);
[GtkChild]
private unowned Gtk.Stack preset_type_stack;
private new unowned Window parent;
private ScreensaverForm screensaver_form;
private VideoForm video_form;
public EditorPage(Window parent) {
this.parent = parent;
this.screensaver_form = new ScreensaverForm();
this.preset_type_stack.add_titled(screensaver_form, "screensaver", "Screen Saver");
this.video_form = new VideoForm();
this.preset_type_stack.add_titled(video_form, "video", "Video");
}
public void on_initialized(BaseCandy[] candies) {
// TODO: clean this up
this.screensaver_form.on_initialized((XScreensaver)candies[0]);
this.video_form.on_initialized((Video)candies[1]);
}
[GtkCallback]
private void on_preset_type_stack_visible_child_name_notify(Object o, ParamSpec param) {
if (this.preset_type_stack.visible_child_name == null) {
return;
}
message(@"preset type: $(this.preset_type_stack.visible_child_name)");
preset_type_changed(this.preset_type_stack.visible_child_name);
}
[GtkCallback]
private void on_cancel_edit_preset_button_clicked(Gtk.Widget w) {
this.parent.main_stack.visible_child_name = "presets";
}
}
}

View File

@ -3,6 +3,10 @@ deskcandy_sources = [
'window.vala',
'desktop_window.vala',
'application.vala',
'editor_page.vala',
'presets_page.vala',
'screensaver_form.vala',
'video_form.vala',
'candy/base.vala',
'candy/xscreensaver.vala',
'candy/xscreensaver_config.vala',

44
src/presets_page.vala Normal file
View File

@ -0,0 +1,44 @@
namespace Deskcandy {
[GtkTemplate(ui = "/moe/solarpunk/Deskcandy/presets_page.ui")]
public class PresetsPage : Gtk.Bin {
private new unowned Window parent;
public PresetsPage(Window parent) {
this.parent = parent;
var preset_action_group = new SimpleActionGroup();
var create_preset = new SimpleAction("create", null);
preset_action_group.add_action(create_preset);
create_preset.activate.connect(this.on_create_preset);
var delete_preset = new SimpleAction("delete", null);
delete_preset.activate.connect(this.on_delete_preset);
preset_action_group.add_action(delete_preset);
this.insert_action_group("presets", preset_action_group);
}
private void on_create_preset(SimpleAction a, Variant? v) {
this.parent.main_stack.visible_child_name = "editor";
}
private void on_delete_preset(SimpleAction a, Variant? v) {
message("delete");
}
[GtkCallback]
private void on_cancel_new_preset_button_clicked(Gtk.Widget w) {
var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover));
popover.popdown();
this.parent.main_stack.visible_child_name = "presets";
}
[GtkCallback]
private void on_cancel_delete_preset_button_clicked(Gtk.Widget w) {
var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover));
popover.popdown();
}
}
}

76
src/screensaver_form.ui Normal file
View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<template class="DeskcandyScreensaverForm" parent="GtkBin">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="screensaver_chooser">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="model">screensavers_liststore</property>
<property name="headers-clickable">False</property>
<property name="search-column">0</property>
<property name="activate-on-single-click">True</property>
<signal name="row-activated" handler="on_screensaver_chooser_row_activated" swapped="no"/>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="ss_name"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Description</property>
<child>
<object class="GtkCellRendererText" id="ss_description">
<property name="single-paragraph-mode">True</property>
</object>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</template>
<object class="GtkListStore" id="screensavers_liststore">
<columns>
<!-- column-name label -->
<column type="gchararray"/>
<!-- column-name description -->
<column type="gchararray"/>
<!-- column-name name -->
<column type="gchararray"/>
</columns>
</object>
</interface>

32
src/screensaver_form.vala Normal file
View File

@ -0,0 +1,32 @@
using Deskcandy.Candy;
namespace Deskcandy {
[GtkTemplate(ui = "/moe/solarpunk/Deskcandy/screensaver_form.ui")]
public class ScreensaverForm : Gtk.Bin {
[GtkChild]
private unowned Gtk.ListStore screensavers_liststore;
private unowned XScreensaver xss;
public void on_initialized(XScreensaver xss) {
this.xss = xss;
Gtk.TreeIter iter;
this.screensavers_liststore.clear();
foreach (XScreensaverConfig config in xss.configs) {
this.screensavers_liststore.append(out iter);
this.screensavers_liststore.set(iter, 0, config.label, 1, config.description, 2, config.name);
}
}
[GtkCallback]
private void on_screensaver_chooser_row_activated(Gtk.TreeView treeview, Gtk.TreePath path, Gtk.TreeViewColumn col) {
Gtk.TreeIter iter;
if (treeview.model.get_iter(out iter, path)) {
string name;
treeview.model.get(iter, 2, out name);
this.xss.name = name;
}
}
}
}

99
src/video_form.ui Normal file
View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<template class="DeskcandyVideoForm" parent="GtkBin">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkFileChooserButton" id="video_chooser">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">start</property>
<property name="filter">video_file_filter</property>
<property name="title" translatable="yes">Select Video</property>
<signal name="file-set" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Speed</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="video_speed_slider">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">video_speed_adjustment</property>
<property name="round-digits">2</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<signal name="value-changed" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="video_loop_checkbox">
<property name="label" translatable="yes">Loop</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_video_property_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</template>
<object class="GtkFileFilter" id="video_file_filter">
<mime-types>
<mime-type>video/*</mime-type>
</mime-types>
</object>
<object class="GtkAdjustment" id="video_speed_adjustment">
<property name="lower">0.01</property>
<property name="upper">5</property>
<property name="value">1</property>
<property name="step-increment">0.01</property>
<property name="page-increment">0.10</property>
</object>
</interface>

27
src/video_form.vala Normal file
View File

@ -0,0 +1,27 @@
using Deskcandy.Candy;
namespace Deskcandy {
[GtkTemplate(ui = "/moe/solarpunk/Deskcandy/video_form.ui")]
public class VideoForm : Gtk.Bin {
[GtkChild]
private unowned Gtk.FileChooserButton video_chooser;
[GtkChild]
private unowned Gtk.CheckButton video_loop_checkbox;
[GtkChild]
private unowned Gtk.Range video_speed_slider;
private unowned Video video;
public void on_initialized(Video video) {
this.video = video;
}
[GtkCallback]
private void on_video_property_changed() {
this.video.name = this.video_chooser.get_filename();
this.video.loop = this.video_loop_checkbox.get_active();
this.video.speed = this.video_speed_slider.get_value();
}
}
}

View File

@ -11,59 +11,59 @@ namespace Deskcandy {
[GtkChild]
private unowned Gtk.Bin preview;
[GtkChild]
private unowned Gtk.Stack main_stack;
[GtkChild]
private unowned Gtk.Stack preset_type_stack;
public unowned Gtk.Stack main_stack { get; private set; }
[GtkChild]
private unowned Gtk.Label candy_status;
[GtkChild]
private unowned Gtk.ListStore screensavers_liststore;
[GtkChild]
private unowned Gtk.FileChooserButton video_chooser;
[GtkChild]
private unowned Gtk.CheckButton video_loop_checkbox;
[GtkChild]
private unowned Gtk.Range video_speed_slider;
private BaseCandy active_candy;
private Subprocess proc;
private XScreensaver xss;
private Video video;
private EditorPage editor_page;
public Window (Application app) {
Object (application: app);
var preset_action_group = new SimpleActionGroup();
var create_preset = new SimpleAction("create", null);
preset_action_group.add_action(create_preset);
create_preset.activate.connect(this.on_create_preset);
var delete_preset = new SimpleAction("delete", null);
delete_preset.activate.connect(this.on_delete_preset);
preset_action_group.add_action(delete_preset);
this.insert_action_group("presets", preset_action_group);
var builder = new Gtk.Builder.from_resource("/moe/solarpunk/Deskcandy/main_menu.ui");
var menu = (GLib.MenuModel)builder.get_object("main_menu");
this.open_menu_button.menu_model = menu;
app.initialized.connect(this.on_initialized);
app.notify["enabled"].connect(this.on_notify_enabled);
var presets_page = new PresetsPage(this);
this.main_stack.add_titled(presets_page, "presets", "Presets");
this.editor_page = new EditorPage(this);
this.editor_page.preset_type_changed.connect(this.on_preset_type_changed);
this.main_stack.add_titled(this.editor_page, "editor", "Edit Preset");
}
public void on_initialized(BaseCandy[] candies) {
this.xss = (XScreensaver)candies[0];
Gtk.TreeIter iter;
this.screensavers_liststore.clear();
foreach (XScreensaverConfig config in this.xss.configs) {
this.screensavers_liststore.append(out iter);
this.screensavers_liststore.set(iter, 0, config.label, 1, config.description, 2, config.name);
}
this.video = (Video)candies[1];
this.active_candy = this.xss;
foreach (BaseCandy candy in candies) {
candy.notify.connect(this.refresh_socket);
}
this.editor_page.on_initialized(candies);
}
private void on_preset_type_changed(string type) {
switch (type) {
case "video":
this.active_candy = this.video;
break;
case "screensaver":
this.active_candy = this.xss;
break;
}
if (this.active_candy.name != null && this.active_candy.name != "") {
this.refresh_socket();
}
}
private void refresh_socket() {
@ -89,73 +89,15 @@ namespace Deskcandy {
this.application.quit();
}
[GtkCallback]
private void on_screensaver_chooser_row_activated(Gtk.TreeView treeview, Gtk.TreePath path, Gtk.TreeViewColumn col) {
Gtk.TreeIter iter;
if (treeview.model.get_iter(out iter, path)) {
string name;
treeview.model.get(iter, 2, out name);
this.xss.name = name;
this.refresh_socket();
}
}
[GtkCallback]
private void on_video_property_changed() {
this.video.name = this.video_chooser.get_filename();
this.video.loop = this.video_loop_checkbox.get_active();
this.video.speed = this.video_speed_slider.get_value();
this.refresh_socket();
}
private void on_create_preset(SimpleAction a, Variant? v) {
this.main_stack.visible_child_name = "editor_page";
}
[GtkCallback]
private void on_cancel_edit_preset_button_clicked(Gtk.Widget w) {
this.main_stack.visible_child_name = "presets_page";
}
[GtkCallback]
private void on_cancel_new_preset_button_clicked(Gtk.Widget w) {
var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover));
popover.popdown();
this.main_stack.visible_child_name = "presets_page";
}
[GtkCallback]
private void on_cancel_delete_preset_button_clicked(Gtk.Widget w) {
var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover));
popover.popdown();
}
[GtkCallback]
private void on_main_stack_visible_child_name_notify(Object o, ParamSpec param) {
if (this.main_stack.visible_child_name == null) {
return;
}
message(@"page: $(this.main_stack.visible_child_name)");
}
[GtkCallback]
private void on_preset_type_stack_visible_child_name_notify(Object o, ParamSpec param) {
message(@"preset type: $(this.preset_type_stack.visible_child_name)");
switch (this.preset_type_stack.visible_child_name) {
case "video_page":
this.active_candy = this.video;
break;
case "screensaver_page":
this.active_candy = this.xss;
break;
}
if (this.active_candy.name != null && this.active_candy.name != "") {
this.refresh_socket();
}
}
private void on_delete_preset(SimpleAction a, Variant? v) {
message("delete");
}
private void on_notify_enabled(Object o, GLib.ParamSpec param) {
var val = ((Application)o).enabled;
this.candy_status.label = val ? "Candy started" : "Candy stopped";