From 84b31caf6bf973e8caaa6e111ba158738d70d0ec Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 6 Aug 2025 09:13:48 -0500 Subject: [PATCH] preparing for some refactoring --- src/qml/presenter/ServiceList.qml | 92 ++++++++++++++++--------------- src/rust/service_item_model.rs | 42 ++++++++++---- src/rust/slide_model.rs | 15 +++-- src/rust/slide_object.rs | 3 + 4 files changed, 89 insertions(+), 63 deletions(-) diff --git a/src/qml/presenter/ServiceList.qml b/src/qml/presenter/ServiceList.qml index f3a0c5c..3bf16e9 100644 --- a/src/qml/presenter/ServiceList.qml +++ b/src/qml/presenter/ServiceList.qml @@ -102,26 +102,31 @@ Item { anchors.fill: parent onEntered: (drag) => { + console.log("here"); if (drag.keys[0] === "library") { dropHighlightLine.visible = true; dropHighlightLine.y = serviceDrop.mapToItem( 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) => { - loadingItem.visible = true; - console.log("DROPPED IN ITEM AREA: " + drag.keys); - console.log(dragItemIndex + " " + index); - const hlIndex = serviceItemList.currentIndex; 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, dragItemType, dragItemIndex); - } else if (drag.keys[0] === "serviceitem") { - /* ServiceItemModel.moveRows(serviceItemList.indexDragged, */ - /* serviceItemList.moveToIndex, 1); */ - /* serviceItemList.currentIndex = moveToIndex; */ } dropHighlightLine.visible = false; loadingItem.visible = false; @@ -150,12 +155,12 @@ Item { Controls.Label { id: label - anchors.left: dragHandle.right + anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: 5 - text: name + text: (index + 1) + ": " + name elide: Text.ElideRight - width: parent.width - trailing.width - dragHandle.width - 25 + width: parent.width - trailing.width - 25 color: { if (selected || mouseHandler.containsMouse || active) @@ -211,10 +216,10 @@ Item { ] /* Drag.dragType: Drag.Automatic */ - /* Drag.active: mouseHandler.drag.active */ - /* Drag.hotSpot.x: width / 2 */ - /* Drag.hotSpot.y: height / 2 */ - /* Drag.keys: ["serviceitem"] */ + Drag.active: mouseHandler.drag.active + Drag.hotSpot.x: width / 2 + Drag.hotSpot.y: height / 2 + Drag.keys: ["serviceitem"] MouseArea { id: mouseHandler @@ -222,19 +227,17 @@ Item { hoverEnabled: true acceptedButtons: Qt.LeftButton | Qt.RightButton - /* drag { */ - /* target: visServiceItem */ - /* axis: Drag.YAxis */ - /* /\* minimumY: root.y *\/ */ - /* /\* maximumY: serviceItemList.height - serviceDrop.height *\/ */ - /* smoothed: false */ - /* } */ + drag { + target: visServiceItem + axis: Drag.YAxis + /* minimumY: root.y */ + /* maximumY: serviceItemList.height - serviceDrop.height */ + smoothed: false + onActiveChanged: { + serviceItemList.indexDragged = index; + } + } - /* drag.onActiveChanged: { */ - /* if (mouseHandler.drag.active) { */ - /* serviceItemList.indexDragged = index; */ - /* } */ - /* } */ /* onPositionChanged: { */ /* if (!pressed) { */ @@ -243,9 +246,9 @@ Item { /* mouseArea.arrangeItem(); */ /* } */ - onPressed: { - serviceItemList.interactive = false; - } + /* onPressAndHold: { */ + /* serviceItemList.interactive = false; */ + /* } */ onClicked: { if (mouse.button === Qt.RightButton) { @@ -275,20 +278,21 @@ Item { } } - Presenter.DragHandle { - id: dragHandle - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: 5 - /* width: 20 */ - listItem: serviceListItem - listView: serviceItemList - onMoveRequested: (oldIndex, newIndex) => { - ServiceItemModel.moveRows(oldIndex, - newIndex, - 1) - } - } + /* Kirigami.ListItemDragHandle { */ + /* id: dragHandle */ + /* anchors.left: parent.left */ + /* anchors.verticalCenter: parent.verticalCenter */ + /* anchors.leftMargin: 5 */ + /* incrementalMoves: true */ + /* /\* width: 20 *\/ */ + /* listItem: serviceListItem */ + /* listView: serviceItemList */ + /* onMoveRequested: (oldIndex, newIndex) => { */ + /* ServiceItemModel.moveRows(oldIndex, */ + /* newIndex, */ + /* 1) */ + /* } */ + /* } */ } Controls.Menu { diff --git a/src/rust/service_item_model.rs b/src/rust/service_item_model.rs index b8b3cd5..d5c5c18 100644 --- a/src/rust/service_item_model.rs +++ b/src/rust/service_item_model.rs @@ -42,6 +42,7 @@ mod service_item_model { VideoStartTime, VideoEndTime, Id, + Slides, } #[auto_cxx_name] @@ -293,6 +294,7 @@ use self::service_item_model::{ ServiceRoles, }; use crate::service_item_model::service_item_model::QList_QString; +use crate::slide_model::Slide; use crate::slide_types::SlideType; use crate::songs::song_model::{Song, get_song}; use crate::{image_model, presentation_model, video_model}; @@ -303,6 +305,7 @@ use cxx_qt_lib::{ use dirs; // use lumina_core::service_items::ServiceItem as SI; use serde_json::{Value, json}; +use std::collections::HashMap; use std::iter; use std::path::{Path, PathBuf}; use std::pin::Pin; @@ -324,6 +327,7 @@ pub struct ServiceItem { text: QStringList, font: QString, font_size: i32, + slides: HashMap, slide_count: i32, active: bool, selected: bool, @@ -344,6 +348,7 @@ impl Default for ServiceItem { text: QStringList::default(), font: QString::default(), font_size: 50, + slides: HashMap::new(), slide_count: 1, active: false, selected: false, @@ -535,11 +540,11 @@ impl service_item_model::ServiceItemModel { dest_index: i32, count: i32, ) -> bool { - debug!( - source = source_index, - dest = dest_index, - count = count - ); + // debug!( + // source = source_index, + // dest = dest_index, + // count = count + // ); let model_index = self.index(source_index, 0, &QModelIndex::default()); let parent = model_index.parent(); @@ -567,8 +572,15 @@ impl service_item_model::ServiceItemModel { qt_dest_index ); - println!("rust-end-service_item: {:?}", end_service_item); - println!("qt-dest-service_item: {:?}", qt_dest_index); + // Ensure we really need to move + if source_index == dest_index + || dest_index < 0 + || dest_index > self.service_items.len() as i32 + { + return false; + } + + debug!("{:?}", self.rust().service_items); unsafe { // this function doesn't build self.as_mut().begin_move_rows( @@ -580,15 +592,15 @@ impl service_item_model::ServiceItemModel { ); 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 [source_id..=dest_id] .rotate_right(move_amount); - println!("rust-move_amount: {:?}", move_amount); + // debug!(?move_amount); } else { let move_amount = end_service_item - dest_id - cnt + 1; - println!("rust-move_amount: {:?}", move_amount); + // debug!(?move_amount); self.as_mut().rust_mut().service_items [dest_id..=end_service_item] .rotate_left(move_amount); @@ -596,12 +608,13 @@ impl service_item_model::ServiceItemModel { self.as_mut().end_move_rows(); let item = self.as_mut().get_item(dest_index); - debug!(source_index, dest_index); + // debug!(source_index, dest_index); self.as_mut().item_moved( &source_index, &dest_index, &item, ); + debug!("{:?}", self.rust().service_items); true } } @@ -1471,6 +1484,9 @@ impl service_item_model::ServiceItemModel { ServiceRoles::Id => QVariant::from( &service_item.database_id.unwrap_or_default(), ), + ServiceRoles::Slides => { + QVariant::from(&service_item.slides) + } _ => QVariant::default(), }; } @@ -1538,6 +1554,10 @@ impl service_item_model::ServiceItemModel { ServiceRoles::VideoEndTime.repr, QByteArray::from("videoEndTime"), ); + roles.insert( + ServiceRoles::Slides.repr, + QByteArray::from("slides"), + ); roles.insert(ServiceRoles::Id.repr, QByteArray::from("id")); roles } diff --git a/src/rust/slide_model.rs b/src/rust/slide_model.rs index 14c4c9a..ef29d71 100644 --- a/src/rust/slide_model.rs +++ b/src/rust/slide_model.rs @@ -722,7 +722,10 @@ impl slide_model::SlideModel { destination_index: i32, _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; } @@ -778,7 +781,7 @@ impl slide_model::SlideModel { ); } } else if let Some((i, slide)) = - slides_iter.enumerate().find(|slide| { + slides_iter.clone().enumerate().find(|slide| { slide.1.service_item_id == destination_index }) { @@ -793,8 +796,8 @@ impl slide_model::SlideModel { debug!(count, first_slide, dest_slide); - let slides = self.slides.clone(); - let slides_iter = slides.iter(); + // let slides = self.slides.clone(); + // let slides_iter = slides.iter(); self.as_mut().move_items( first_slide as usize, @@ -829,7 +832,6 @@ impl slide_model::SlideModel { "While moving down, change service items id of moved slide" ); for (i, _slide) in slides_iter - .clone() .enumerate() .filter(|x| { 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" ); for (i, _slide) in slides_iter - .clone() .enumerate() .filter(|x| x.0 >= dest_slide as usize) .filter(|x| x.0 < (dest_slide + count) as usize) @@ -893,7 +894,6 @@ impl slide_model::SlideModel { if move_down { debug!("While moving down, change service item id"); for (i, _slide) in slides_iter - .clone() .enumerate() .filter(|x| x.1.service_item_id <= destination_index) .filter(|x| x.1.service_item_id >= source_index) @@ -914,7 +914,6 @@ impl slide_model::SlideModel { } else { debug!("While moving up, change service item id"); for (i, _slide) in slides_iter - .clone() .enumerate() .filter(|x| x.0 >= (dest_slide + count) as usize) .filter(|x| x.1.service_item_id >= destination_index) diff --git a/src/rust/slide_object.rs b/src/rust/slide_object.rs index ff2ce56..e5997fa 100644 --- a/src/rust/slide_object.rs +++ b/src/rust/slide_object.rs @@ -32,6 +32,7 @@ pub mod qobject { #[qproperty(i32, font_size)] #[qproperty(f32, video_start_time)] #[qproperty(f32, video_end_time)] + #[qproperty(QString, video_thumbnail)] // #[qproperty(*mut SlideModel, slide_model)] type SlideObject = super::SlideObjectRust; @@ -116,6 +117,7 @@ pub struct SlideObjectRust { font_size: i32, video_start_time: f32, video_end_time: f32, + video_thumbnail: QString, // slide_model: *mut slide_model::SlideModel, } @@ -139,6 +141,7 @@ impl Default for SlideObjectRust { inner_slide_index: 0, video_start_time: 0.0, video_end_time: 0.0, + video_thumbnail: QString::from(""), // slide_model: std::ptr::null_mut(), } }