Compare commits

...

2 commits

Author SHA1 Message Date
84b31caf6b preparing for some refactoring 2025-08-06 09:13:48 -05:00
8de473519b updating flake and todo 2025-08-06 09:13:35 -05:00
8 changed files with 101 additions and 69 deletions

View file

@ -4,10 +4,13 @@
:CATEGORY: dev :CATEGORY: dev
:END: :END:
* Tasks [63%] [55/87] * Tasks [62%] [55/88]
** TODO [#A] REWRITE FOR ALL RUST AND BUILD WITH CARGO ** TODO [#A] REWRITE FOR ALL RUST AND BUILD WITH CARGO
** TODO [#A] Plugin architecture with steel or some scheme as an extension language Found that making sure qmake comes from qt6.full in the flake helps a lot!
** TODO [#A] Server client architecture ** TODO [#A] Move slides into service_items
I believe this will enable me to build things with much more simplicity. The service items contain slides anyway.
** TODO [#C] Plugin architecture with steel or some scheme as an extension language
** TODO [#C] Server client architecture
** TODO [#A] Organize and layout structure of rust code :maintenance: ** TODO [#A] Organize and layout structure of rust code :maintenance:
Since building a lot of the rust code felt more like an experiment, I've not kept it very well organized. I need to go through each model and rust module and organize them well and then decide what needs to be publicly available or not. Since building a lot of the rust code felt more like an experiment, I've not kept it very well organized. I need to go through each model and rust module and organize them well and then decide what needs to be publicly available or not.

View file

@ -33,6 +33,7 @@
]) ])
rust-analyzer rust-analyzer
qt6.wrapQtAppsHook qt6.wrapQtAppsHook
sccache
]; ];
bi = with pkgs; [ bi = with pkgs; [
@ -117,6 +118,7 @@
makeQtWrapper "/bin/sh" "$setQtEnvironment" "''${qtWrapperArgs[@]}" makeQtWrapper "/bin/sh" "$setQtEnvironment" "''${qtWrapperArgs[@]}"
sed "/^exec/d" -i "$setQtEnvironment" sed "/^exec/d" -i "$setQtEnvironment"
source "$setQtEnvironment" source "$setQtEnvironment"
export QMAKE=${pkgs.qt6.full}/bin/qmake
''; '';
# shellHook = '' # shellHook = ''
# export CMAKE_PREFIX_PATH="${pkgs.qt6.full}/lib/cmake/Qt6:$CMAKE_PREFIX_PATH" # export CMAKE_PREFIX_PATH="${pkgs.qt6.full}/lib/cmake/Qt6:$CMAKE_PREFIX_PATH"

View file

@ -5,7 +5,7 @@ fn main() {
.qt_module("Network") .qt_module("Network")
.qml_module(QmlModule { .qml_module(QmlModule {
uri: "org.kde.simplemdviewer", uri: "org.kde.simplemdviewer",
qml_files: &["src/qml/Main.qml"], qml_files: &["src/qml/main.qml"],
rust_files: &["src/main.rs"], rust_files: &["src/main.rs"],
..Default::default() ..Default::default()
}) })

View file

@ -1,7 +1,8 @@
#[cxx_qt::bridge] #[cxx_qt::bridge]
mod ffi { mod ffi {
extern "RustQt" { unsafe extern "RustQt" {
#[qobject] #[qobject]
#[qml_element]
type DummyQObject = super::DummyRustStruct; type DummyQObject = super::DummyRustStruct;
} }
} }
@ -32,7 +33,7 @@ fn main() {
let mut engine = QQmlApplicationEngine::new(); let mut engine = QQmlApplicationEngine::new();
if let Some(engine) = engine.as_mut() { if let Some(engine) = engine.as_mut() {
engine.load(&QUrl::from( engine.load(&QUrl::from(
"qrc:/qt/qml/org/kde/simplemdviewer/src/qml/Main.qml", "qrc:/qt/qml/org/kde/simplemdviewer/src/qml/main.qml",
)); ));
} }

View file

@ -102,26 +102,31 @@ Item {
anchors.fill: parent anchors.fill: parent
onEntered: (drag) => { onEntered: (drag) => {
console.log("here");
if (drag.keys[0] === "library") { if (drag.keys[0] === "library") {
dropHighlightLine.visible = true; dropHighlightLine.visible = true;
dropHighlightLine.y = serviceDrop.mapToItem( dropHighlightLine.y = serviceDrop.mapToItem(
serviceItemList,0,0).y - 2; serviceItemList,0,0).y - 2;
} else {
console.log("here");
let from = drag.source.DelegateModel.itemsIndex;
let to = serviceListItem.DelegateModel.itemsIndex;
console.log("from = " + from);
console.log("to = " + to);
if (from != to && to > -1 && to <= ServiceItemModel.count - 1)
ServiceItemModel.moveRows(from, to, 1);
} }
} }
onDropped: (drag) => { onDropped: (drag) => {
loadingItem.visible = true;
console.log("DROPPED IN ITEM AREA: " + drag.keys);
console.log(dragItemIndex + " " + index);
const hlIndex = serviceItemList.currentIndex;
if (drag.keys[0] === "library") { if (drag.keys[0] === "library") {
loadingItem.visible = true;
console.log("DROPPED IN ITEM AREA: " + drag.keys);
console.log(dragItemIndex + " " + index);
const hlIndex = serviceItemList.currentIndex;
addItem(index, addItem(index,
dragItemType, dragItemType,
dragItemIndex); dragItemIndex);
} else if (drag.keys[0] === "serviceitem") {
/* ServiceItemModel.moveRows(serviceItemList.indexDragged, */
/* serviceItemList.moveToIndex, 1); */
/* serviceItemList.currentIndex = moveToIndex; */
} }
dropHighlightLine.visible = false; dropHighlightLine.visible = false;
loadingItem.visible = false; loadingItem.visible = false;
@ -150,12 +155,12 @@ Item {
Controls.Label { Controls.Label {
id: label id: label
anchors.left: dragHandle.right anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 5 anchors.leftMargin: 5
text: name text: (index + 1) + ": " + name
elide: Text.ElideRight elide: Text.ElideRight
width: parent.width - trailing.width - dragHandle.width - 25 width: parent.width - trailing.width - 25
color: { color: {
if (selected || if (selected ||
mouseHandler.containsMouse || active) mouseHandler.containsMouse || active)
@ -211,10 +216,10 @@ Item {
] ]
/* Drag.dragType: Drag.Automatic */ /* Drag.dragType: Drag.Automatic */
/* Drag.active: mouseHandler.drag.active */ Drag.active: mouseHandler.drag.active
/* Drag.hotSpot.x: width / 2 */ Drag.hotSpot.x: width / 2
/* Drag.hotSpot.y: height / 2 */ Drag.hotSpot.y: height / 2
/* Drag.keys: ["serviceitem"] */ Drag.keys: ["serviceitem"]
MouseArea { MouseArea {
id: mouseHandler id: mouseHandler
@ -222,19 +227,17 @@ Item {
hoverEnabled: true hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton acceptedButtons: Qt.LeftButton | Qt.RightButton
/* drag { */ drag {
/* target: visServiceItem */ target: visServiceItem
/* axis: Drag.YAxis */ axis: Drag.YAxis
/* /\* minimumY: root.y *\/ */ /* minimumY: root.y */
/* /\* maximumY: serviceItemList.height - serviceDrop.height *\/ */ /* maximumY: serviceItemList.height - serviceDrop.height */
/* smoothed: false */ smoothed: false
/* } */ onActiveChanged: {
serviceItemList.indexDragged = index;
}
}
/* drag.onActiveChanged: { */
/* if (mouseHandler.drag.active) { */
/* serviceItemList.indexDragged = index; */
/* } */
/* } */
/* onPositionChanged: { */ /* onPositionChanged: { */
/* if (!pressed) { */ /* if (!pressed) { */
@ -243,9 +246,9 @@ Item {
/* mouseArea.arrangeItem(); */ /* mouseArea.arrangeItem(); */
/* } */ /* } */
onPressed: { /* onPressAndHold: { */
serviceItemList.interactive = false; /* serviceItemList.interactive = false; */
} /* } */
onClicked: { onClicked: {
if (mouse.button === Qt.RightButton) { if (mouse.button === Qt.RightButton) {
@ -275,20 +278,21 @@ Item {
} }
} }
Presenter.DragHandle { /* Kirigami.ListItemDragHandle { */
id: dragHandle /* id: dragHandle */
anchors.left: parent.left /* anchors.left: parent.left */
anchors.verticalCenter: parent.verticalCenter /* anchors.verticalCenter: parent.verticalCenter */
anchors.leftMargin: 5 /* anchors.leftMargin: 5 */
/* width: 20 */ /* incrementalMoves: true */
listItem: serviceListItem /* /\* width: 20 *\/ */
listView: serviceItemList /* listItem: serviceListItem */
onMoveRequested: (oldIndex, newIndex) => { /* listView: serviceItemList */
ServiceItemModel.moveRows(oldIndex, /* onMoveRequested: (oldIndex, newIndex) => { */
newIndex, /* ServiceItemModel.moveRows(oldIndex, */
1) /* newIndex, */
} /* 1) */
} /* } */
/* } */
} }
Controls.Menu { Controls.Menu {

View file

@ -42,6 +42,7 @@ mod service_item_model {
VideoStartTime, VideoStartTime,
VideoEndTime, VideoEndTime,
Id, Id,
Slides,
} }
#[auto_cxx_name] #[auto_cxx_name]
@ -293,6 +294,7 @@ use self::service_item_model::{
ServiceRoles, ServiceRoles,
}; };
use crate::service_item_model::service_item_model::QList_QString; use crate::service_item_model::service_item_model::QList_QString;
use crate::slide_model::Slide;
use crate::slide_types::SlideType; use crate::slide_types::SlideType;
use crate::songs::song_model::{Song, get_song}; use crate::songs::song_model::{Song, get_song};
use crate::{image_model, presentation_model, video_model}; use crate::{image_model, presentation_model, video_model};
@ -303,6 +305,7 @@ use cxx_qt_lib::{
use dirs; use dirs;
// use lumina_core::service_items::ServiceItem as SI; // use lumina_core::service_items::ServiceItem as SI;
use serde_json::{Value, json}; use serde_json::{Value, json};
use std::collections::HashMap;
use std::iter; use std::iter;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::pin::Pin; use std::pin::Pin;
@ -324,6 +327,7 @@ pub struct ServiceItem {
text: QStringList, text: QStringList,
font: QString, font: QString,
font_size: i32, font_size: i32,
slides: HashMap<i32, Slide>,
slide_count: i32, slide_count: i32,
active: bool, active: bool,
selected: bool, selected: bool,
@ -344,6 +348,7 @@ impl Default for ServiceItem {
text: QStringList::default(), text: QStringList::default(),
font: QString::default(), font: QString::default(),
font_size: 50, font_size: 50,
slides: HashMap::new(),
slide_count: 1, slide_count: 1,
active: false, active: false,
selected: false, selected: false,
@ -535,11 +540,11 @@ impl service_item_model::ServiceItemModel {
dest_index: i32, dest_index: i32,
count: i32, count: i32,
) -> bool { ) -> bool {
debug!( // debug!(
source = source_index, // source = source_index,
dest = dest_index, // dest = dest_index,
count = count // count = count
); // );
let model_index = let model_index =
self.index(source_index, 0, &QModelIndex::default()); self.index(source_index, 0, &QModelIndex::default());
let parent = model_index.parent(); let parent = model_index.parent();
@ -567,8 +572,15 @@ impl service_item_model::ServiceItemModel {
qt_dest_index qt_dest_index
); );
println!("rust-end-service_item: {:?}", end_service_item); // Ensure we really need to move
println!("qt-dest-service_item: {:?}", qt_dest_index); if source_index == dest_index
|| dest_index < 0
|| dest_index > self.service_items.len() as i32
{
return false;
}
debug!("{:?}", self.rust().service_items);
unsafe { unsafe {
// this function doesn't build // this function doesn't build
self.as_mut().begin_move_rows( self.as_mut().begin_move_rows(
@ -580,15 +592,15 @@ impl service_item_model::ServiceItemModel {
); );
if source_id < dest_id { if source_id < dest_id {
let move_amount = dest_id - source_id - cnt + 1; let move_amount = 1;
self.as_mut().rust_mut().service_items self.as_mut().rust_mut().service_items
[source_id..=dest_id] [source_id..=dest_id]
.rotate_right(move_amount); .rotate_right(move_amount);
println!("rust-move_amount: {:?}", move_amount); // debug!(?move_amount);
} else { } else {
let move_amount = let move_amount =
end_service_item - dest_id - cnt + 1; end_service_item - dest_id - cnt + 1;
println!("rust-move_amount: {:?}", move_amount); // debug!(?move_amount);
self.as_mut().rust_mut().service_items self.as_mut().rust_mut().service_items
[dest_id..=end_service_item] [dest_id..=end_service_item]
.rotate_left(move_amount); .rotate_left(move_amount);
@ -596,12 +608,13 @@ impl service_item_model::ServiceItemModel {
self.as_mut().end_move_rows(); self.as_mut().end_move_rows();
let item = self.as_mut().get_item(dest_index); let item = self.as_mut().get_item(dest_index);
debug!(source_index, dest_index); // debug!(source_index, dest_index);
self.as_mut().item_moved( self.as_mut().item_moved(
&source_index, &source_index,
&dest_index, &dest_index,
&item, &item,
); );
debug!("{:?}", self.rust().service_items);
true true
} }
} }
@ -1471,6 +1484,9 @@ impl service_item_model::ServiceItemModel {
ServiceRoles::Id => QVariant::from( ServiceRoles::Id => QVariant::from(
&service_item.database_id.unwrap_or_default(), &service_item.database_id.unwrap_or_default(),
), ),
ServiceRoles::Slides => {
QVariant::from(&service_item.slides)
}
_ => QVariant::default(), _ => QVariant::default(),
}; };
} }
@ -1538,6 +1554,10 @@ impl service_item_model::ServiceItemModel {
ServiceRoles::VideoEndTime.repr, ServiceRoles::VideoEndTime.repr,
QByteArray::from("videoEndTime"), QByteArray::from("videoEndTime"),
); );
roles.insert(
ServiceRoles::Slides.repr,
QByteArray::from("slides"),
);
roles.insert(ServiceRoles::Id.repr, QByteArray::from("id")); roles.insert(ServiceRoles::Id.repr, QByteArray::from("id"));
roles roles
} }

View file

@ -722,7 +722,10 @@ impl slide_model::SlideModel {
destination_index: i32, destination_index: i32,
_service_item: &QMap_QString_QVariant, _service_item: &QMap_QString_QVariant,
) { ) {
if source_index == destination_index { if source_index == destination_index
|| destination_index < 0
|| destination_index > self.slides.len() as i32
{
return; return;
} }
@ -778,7 +781,7 @@ impl slide_model::SlideModel {
); );
} }
} else if let Some((i, slide)) = } else if let Some((i, slide)) =
slides_iter.enumerate().find(|slide| { slides_iter.clone().enumerate().find(|slide| {
slide.1.service_item_id == destination_index slide.1.service_item_id == destination_index
}) })
{ {
@ -793,8 +796,8 @@ impl slide_model::SlideModel {
debug!(count, first_slide, dest_slide); debug!(count, first_slide, dest_slide);
let slides = self.slides.clone(); // let slides = self.slides.clone();
let slides_iter = slides.iter(); // let slides_iter = slides.iter();
self.as_mut().move_items( self.as_mut().move_items(
first_slide as usize, first_slide as usize,
@ -829,7 +832,6 @@ impl slide_model::SlideModel {
"While moving down, change service items id of moved slide" "While moving down, change service items id of moved slide"
); );
for (i, _slide) in slides_iter for (i, _slide) in slides_iter
.clone()
.enumerate() .enumerate()
.filter(|x| { .filter(|x| {
x.0 >= (first_slide + dest_count) as usize x.0 >= (first_slide + dest_count) as usize
@ -856,7 +858,6 @@ impl slide_model::SlideModel {
"While moving up, change service items id of moved slide" "While moving up, change service items id of moved slide"
); );
for (i, _slide) in slides_iter for (i, _slide) in slides_iter
.clone()
.enumerate() .enumerate()
.filter(|x| x.0 >= dest_slide as usize) .filter(|x| x.0 >= dest_slide as usize)
.filter(|x| x.0 < (dest_slide + count) as usize) .filter(|x| x.0 < (dest_slide + count) as usize)
@ -893,7 +894,6 @@ impl slide_model::SlideModel {
if move_down { if move_down {
debug!("While moving down, change service item id"); debug!("While moving down, change service item id");
for (i, _slide) in slides_iter for (i, _slide) in slides_iter
.clone()
.enumerate() .enumerate()
.filter(|x| x.1.service_item_id <= destination_index) .filter(|x| x.1.service_item_id <= destination_index)
.filter(|x| x.1.service_item_id >= source_index) .filter(|x| x.1.service_item_id >= source_index)
@ -914,7 +914,6 @@ impl slide_model::SlideModel {
} else { } else {
debug!("While moving up, change service item id"); debug!("While moving up, change service item id");
for (i, _slide) in slides_iter for (i, _slide) in slides_iter
.clone()
.enumerate() .enumerate()
.filter(|x| x.0 >= (dest_slide + count) as usize) .filter(|x| x.0 >= (dest_slide + count) as usize)
.filter(|x| x.1.service_item_id >= destination_index) .filter(|x| x.1.service_item_id >= destination_index)

View file

@ -32,6 +32,7 @@ pub mod qobject {
#[qproperty(i32, font_size)] #[qproperty(i32, font_size)]
#[qproperty(f32, video_start_time)] #[qproperty(f32, video_start_time)]
#[qproperty(f32, video_end_time)] #[qproperty(f32, video_end_time)]
#[qproperty(QString, video_thumbnail)]
// #[qproperty(*mut SlideModel, slide_model)] // #[qproperty(*mut SlideModel, slide_model)]
type SlideObject = super::SlideObjectRust; type SlideObject = super::SlideObjectRust;
@ -116,6 +117,7 @@ pub struct SlideObjectRust {
font_size: i32, font_size: i32,
video_start_time: f32, video_start_time: f32,
video_end_time: f32, video_end_time: f32,
video_thumbnail: QString,
// slide_model: *mut slide_model::SlideModel, // slide_model: *mut slide_model::SlideModel,
} }
@ -139,6 +141,7 @@ impl Default for SlideObjectRust {
inner_slide_index: 0, inner_slide_index: 0,
video_start_time: 0.0, video_start_time: 0.0,
video_end_time: 0.0, video_end_time: 0.0,
video_thumbnail: QString::from(""),
// slide_model: std::ptr::null_mut(), // slide_model: std::ptr::null_mut(),
} }
} }