implemented d'n'd in the Live Mode window

This commit is contained in:
fgerlits 2007-10-23 16:26:27 +00:00
parent aa740fe757
commit bdb8db1c19
5 changed files with 113 additions and 66 deletions

View file

@ -92,6 +92,11 @@ LiveModeWindow :: LiveModeWindow (Gtk::ToggleButton * windowOpenerButton)
treeView->appendLineNumberColumn("", 2 /* offset */, 50); treeView->appendLineNumberColumn("", 2 /* offset */, 50);
treeView->appendColumn("", modelColumns.infoColumn, 200); treeView->appendColumn("", modelColumns.infoColumn, 200);
treeModel = Gtk::ListStore::create(modelColumns);
treeView->set_model(treeModel);
treeView->connectModelSignals(treeModel);
setupDndCallbacks();
treeView->signal_button_press_event().connect(sigc::mem_fun(*this, treeView->signal_button_press_event().connect(sigc::mem_fun(*this,
&LiveModeWindow::onEntryClicked), &LiveModeWindow::onEntryClicked),
false /* call this first */); false /* call this first */);
@ -99,14 +104,9 @@ LiveModeWindow :: LiveModeWindow (Gtk::ToggleButton * windowOpenerButton)
&LiveModeWindow::onDoubleClick)); &LiveModeWindow::onDoubleClick));
treeView->signalTreeModelChanged().connect(sigc::mem_fun(*this, treeView->signalTreeModelChanged().connect(sigc::mem_fun(*this,
&LiveModeWindow::onTreeModelChanged)); &LiveModeWindow::onTreeModelChanged));
treeView->signal_key_press_event().connect(sigc::mem_fun(*this, treeView->signal_key_press_event().connect(sigc::mem_fun(*this,
&LiveModeWindow::onKeyPressed)); &LiveModeWindow::onKeyPressed));
treeModel = Gtk::ListStore::create(modelColumns);
treeView->set_model(treeModel);
treeView->connectModelSignals(treeModel);
glade->get_widget("cueLabel1", cueLabel); glade->get_widget("cueLabel1", cueLabel);
cueLabel->set_label(*getResourceUstring("cuePlayerLabel")); cueLabel->set_label(*getResourceUstring("cuePlayerLabel"));
cuePlayer.reset(new CuePlayer(this, cuePlayer.reset(new CuePlayer(this,
@ -133,7 +133,6 @@ void
LiveModeWindow :: addItem(Ptr<Playable>::Ref playable) throw () LiveModeWindow :: addItem(Ptr<Playable>::Ref playable) throw ()
{ {
addItem(treeModel->append(), playable); addItem(treeModel->append(), playable);
onTreeModelChanged();
} }
@ -141,7 +140,7 @@ LiveModeWindow :: addItem(Ptr<Playable>::Ref playable) throw ()
* Add a new item as the given row in the Live Mode Window. * Add a new item as the given row in the Live Mode Window.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
LiveModeWindow :: addItem(Gtk::TreeModel::iterator iter, LiveModeWindow :: addItem(Gtk::TreeIter iter,
Ptr<Playable>::Ref playable) throw () Ptr<Playable>::Ref playable) throw ()
{ {
@ -182,7 +181,8 @@ LiveModeWindow :: addItem(Gtk::TreeModel::iterator iter,
infoString->append("</span>"); infoString->append("</span>");
row[modelColumns.infoColumn] = *infoString; row[modelColumns.infoColumn] = *infoString;
gLiveSupport->runMainLoop();
onTreeModelChanged();
} }
@ -206,6 +206,27 @@ LiveModeWindow :: addItem(Ptr<const UniqueId>::Ref id)
} }
/*------------------------------------------------------------------------------
* Add an item to the Live Mode window at the given position, by ID.
*----------------------------------------------------------------------------*/
void
LiveModeWindow :: addItem(Gtk::TreeIter iter,
Ptr<const UniqueId>::Ref id)
throw ()
{
Ptr<Playable>::Ref playable;
try {
playable = gLiveSupport->acquirePlayable(id);
} catch (XmlRpcException &e) {
std::cerr << "could not acquire playable in LiveModeWindow: "
<< e.what() << std::endl;
return;
}
addItem(iter, playable);
}
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* "Pop" the first item from the top of the Live Mode Window. * "Pop" the first item from the top of the Live Mode Window.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
@ -217,7 +238,7 @@ LiveModeWindow :: popTop(void) throw ()
return playable; // return a 0 pointer if auto is set to off return playable; // return a 0 pointer if auto is set to off
} }
Gtk::TreeModel::iterator iter = treeModel->children().begin(); Gtk::TreeIter iter = treeModel->children().begin();
if (iter) { if (iter) {
playable = (*iter)[modelColumns.playableColumn]; playable = (*iter)[modelColumns.playableColumn];
treeModel->erase(iter); treeModel->erase(iter);
@ -493,11 +514,11 @@ LiveModeWindow :: onUploadToHub(void) throw ()
void void
LiveModeWindow :: refreshPlaylist(Ptr<Playlist>::Ref playlist) throw () LiveModeWindow :: refreshPlaylist(Ptr<Playlist>::Ref playlist) throw ()
{ {
for (Gtk::TreeModel::iterator iter = treeModel->children().begin(); for (Gtk::TreeIter iter = treeModel->children().begin();
iter != treeModel->children().end(); ++iter) { iter != treeModel->children().end(); ++iter) {
Ptr<Playable>::Ref currentItem = (*iter)[modelColumns.playableColumn]; Ptr<Playable>::Ref currentItem = (*iter)[modelColumns.playableColumn];
if (*currentItem->getId() == *playlist->getId()) { if (*currentItem->getId() == *playlist->getId()) {
addItem(iter, playlist); addItem(iter, currentItem);
} }
} }
} }
@ -601,16 +622,15 @@ LiveModeWindow :: onRemoveMenuOption(void) throw ()
std::vector<Gtk::TreePath> selectedPaths std::vector<Gtk::TreePath> selectedPaths
= selection->get_selected_rows(); = selection->get_selected_rows();
std::vector<Gtk::TreeModel::iterator> selectedIters; std::vector<Gtk::TreeIter> selectedIters;
for (std::vector<Gtk::TreePath>::iterator pathIt = selectedPaths.begin(); for (std::vector<Gtk::TreePath>::iterator pathIt = selectedPaths.begin();
pathIt != selectedPaths.end(); pathIt != selectedPaths.end();
++pathIt) { ++pathIt) {
selectedIters.push_back(treeModel->get_iter(*pathIt)); selectedIters.push_back(treeModel->get_iter(*pathIt));
} }
Gtk::TreeModel::iterator newSelection; Gtk::TreeIter newSelection;
for (std::vector<Gtk::TreeModel::iterator>::iterator for (std::vector<Gtk::TreeIter>::iterator iterIt = selectedIters.begin();
iterIt = selectedIters.begin();
iterIt != selectedIters.end(); iterIt != selectedIters.end();
++iterIt) { ++iterIt) {
newSelection = *iterIt; newSelection = *iterIt;
@ -637,18 +657,17 @@ LiveModeWindow :: onTreeModelChanged(void) throw ()
return; return;
} }
Gtk::TreeModel::iterator iter = treeModel->children().begin(); Gtk::TreeIter iter = treeModel->children().begin();
if (iter) { if (iter) {
Ptr<Playable>::Ref playable = (*iter)[modelColumns.playableColumn]; Ptr<Playable>::Ref playable = (*iter)[modelColumns.playableColumn];
if (playable) { if (playable) {
if (!savedTopPlayable || savedTopPlayable && if (!savedTopPlayable ||
*savedTopPlayable->getId() != *playable->getId()) { *savedTopPlayable->getId() != *playable->getId()) {
gLiveSupport->preload(playable); gLiveSupport->preload(playable);
} }
savedTopPlayable = playable; savedTopPlayable = playable;
} }
} }
} }
@ -744,3 +763,13 @@ LiveModeWindow :: hide(void) throw ()
GuiWindow::hide(); GuiWindow::hide();
} }
/*------------------------------------------------------------------------------
* The name of the window for the d'n'd methods.
*----------------------------------------------------------------------------*/
Glib::ustring
LiveModeWindow :: getWindowNameForDnd (void) throw ()
{
return bundleName;
}

View file

@ -42,16 +42,19 @@
#include <string> #include <string>
#include "GuiWindow.h"
#include "ContentsStorable.h"
#include "DndMethods.h"
#include "LiveSupport/Core/Ptr.h" #include "LiveSupport/Core/Ptr.h"
#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" #include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h"
#include "LiveSupport/Widgets/ZebraTreeView.h" #include "LiveSupport/Widgets/ZebraTreeView.h"
#include "GuiWindow.h"
#include "ContentsStorable.h"
#include "CuePlayer.h" #include "CuePlayer.h"
#include "GLiveSupport.h" #include "GLiveSupport.h"
#include "ExportPlaylistWindow.h" #include "ExportPlaylistWindow.h"
#include "SchedulePlaylistWindow.h" #include "SchedulePlaylistWindow.h"
namespace LiveSupport { namespace LiveSupport {
namespace GLiveSupport { namespace GLiveSupport {
@ -74,7 +77,8 @@ using namespace LiveSupport::Widgets;
* @version $Revision$ * @version $Revision$
*/ */
class LiveModeWindow : public GuiWindow, class LiveModeWindow : public GuiWindow,
public ContentsStorable public ContentsStorable,
public DndMethods
{ {
private: private:
@ -146,28 +150,6 @@ class LiveModeWindow : public GuiWindow,
Ptr<Gtk::Menu>::Ref Ptr<Gtk::Menu>::Ref
constructPlaylistContextMenu(void) throw (); constructPlaylistContextMenu(void) throw ();
/**
* Return the topmost selected row.
* Sets selectedPaths and selectedIter; does not increment it.
*
* @return the first selected playable item.
*/
Ptr<Playable>::Ref
getFirstSelectedPlayable(void) throw ();
/**
* Used to iterate over the selected rows.
* Can only be called after onEntryClicked() has set the selectedPaths
* and selectedIter variables.
* Returns a 0 pointer if nothing is selected or we have reached the
* end of the list of selected rows.
* Increments selectedIter after reading it.
*
* @return the next selected playable item.
*/
Ptr<Playable>::Ref
getNextSelectedPlayable(void) throw ();
/** /**
* Check whether exactly one row is selected. * Check whether exactly one row is selected.
* *
@ -211,16 +193,6 @@ class LiveModeWindow : public GuiWindow,
*/ */
ModelColumns modelColumns; ModelColumns modelColumns;
/**
* The main container in the window.
*/
Gtk::VBox vBox;
/**
* A scrolled window, so that the list can be scrolled.
*/
Gtk::ScrolledWindow scrolledWindow;
/** /**
* The tree view, now only showing rows. * The tree view, now only showing rows.
*/ */
@ -333,6 +305,51 @@ class LiveModeWindow : public GuiWindow,
virtual void virtual void
onTreeModelChanged(void) throw (); onTreeModelChanged(void) throw ();
/**
* The tree view we want to implement d'n'd on.
*/
virtual Gtk::TreeView *
getTreeViewForDnd (void) throw ()
{
return treeView;
}
/**
* The name of the window for the d'n'd methods.
*/
virtual Glib::ustring
getWindowNameForDnd (void) throw ();
/**
* Return the topmost selected row.
* Sets selectedPaths and selectedIter; does not increment it.
*
* @return the first selected playable item.
*/
virtual Ptr<Playable>::Ref
getFirstSelectedPlayable (void) throw ();
/**
* Used to iterate over the selected rows.
* Reset to the first row by onEntryClicked().
* Returns a 0 pointer if nothing is selected or we have reached
* the end of the list of selected rows.
*
* @return the next selected playable item.
*/
virtual Ptr<Playable>::Ref
getNextSelectedPlayable (void) throw ();
/**
* Add an item to the d'n'd tree view at the given position.
*
* @param iter the iterator pointing to the row to be filled in.
* @param id the ID of the item to add.
*/
virtual void
addItem (Gtk::TreeIter iter,
Ptr<const UniqueId>::Ref id) throw ();
public: public:
@ -368,7 +385,7 @@ class LiveModeWindow : public GuiWindow,
* @param playable the playable object to be added. * @param playable the playable object to be added.
*/ */
void void
addItem(Gtk::TreeModel::iterator iter, addItem(Gtk::TreeIter iter,
Ptr<Playable>::Ref playable) throw (); Ptr<Playable>::Ref playable) throw ();
/** /**

View file

@ -99,6 +99,7 @@ ScratchpadWindow :: ScratchpadWindow (
treeModel = Gtk::ListStore::create(modelColumns); treeModel = Gtk::ListStore::create(modelColumns);
treeView->set_model(treeModel); treeView->set_model(treeModel);
treeView->connectModelSignals(treeModel); treeView->connectModelSignals(treeModel);
setupDndCallbacks();
// register the signal handlers for treeview // register the signal handlers for treeview
treeView->signal_button_press_event().connect(sigc::mem_fun(*this, treeView->signal_button_press_event().connect(sigc::mem_fun(*this,
@ -108,7 +109,6 @@ ScratchpadWindow :: ScratchpadWindow (
&ScratchpadWindow::onDoubleClick)); &ScratchpadWindow::onDoubleClick));
treeView->signal_key_press_event().connect(sigc::mem_fun(*this, treeView->signal_key_press_event().connect(sigc::mem_fun(*this,
&ScratchpadWindow::onKeyPressed)); &ScratchpadWindow::onKeyPressed));
setupDndCallbacks();
// create the cue player widget // create the cue player widget
cuePlayer.reset(new CuePlayer(this, cuePlayer.reset(new CuePlayer(this,

View file

@ -42,16 +42,16 @@
#include <string> #include <string>
#include "GuiWindow.h"
#include "ContentsStorable.h"
#include "DndMethods.h"
#include "LiveSupport/Core/Ptr.h" #include "LiveSupport/Core/Ptr.h"
#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" #include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h"
#include "LiveSupport/Widgets/ZebraTreeView.h" #include "LiveSupport/Widgets/ZebraTreeView.h"
#include "CuePlayer.h" #include "CuePlayer.h"
#include "ContentsStorable.h"
#include "ExportPlaylistWindow.h" #include "ExportPlaylistWindow.h"
#include "SchedulePlaylistWindow.h" #include "SchedulePlaylistWindow.h"
#include "DndMethods.h"
#include "GuiWindow.h"
namespace LiveSupport { namespace LiveSupport {
@ -324,7 +324,7 @@ class ScratchpadWindow : public GuiWindow,
getNextSelectedPlayable (void) throw (); getNextSelectedPlayable (void) throw ();
/** /**
* Add an item to the Scratchpad at the given position. * Add an item to the d'n'd tree view at the given position.
* *
* @param iter the iterator pointing to the row to be filled in. * @param iter the iterator pointing to the row to be filled in.
* @param id the ID of the item to add. * @param id the ID of the item to add.

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.2.0 on Tue Aug 21 16:11:34 2007 by fgerlits@desktop--> <!--Generated with glade3 3.2.0 on Tue Oct 23 17:22:43 2007 by fgerlits@desktop-->
<glade-interface> <glade-interface>
<widget class="GtkWindow" id="mainWindow1"> <widget class="GtkWindow" id="mainWindow1">
<property name="width_request">400</property> <property name="width_request">400</property>
@ -128,6 +128,7 @@
<property name="headers_visible">False</property> <property name="headers_visible">False</property>
<property name="reorderable">True</property> <property name="reorderable">True</property>
<property name="rules_hint">True</property> <property name="rules_hint">True</property>
<property name="search_column">1</property>
</widget> </widget>
</child> </child>
</widget> </widget>