drag and drop, first step
This commit is contained in:
parent
d700e16530
commit
66ac275957
|
@ -107,6 +107,7 @@ 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,
|
||||||
|
@ -618,3 +619,94 @@ ScratchpadWindow :: hide(void) throw ()
|
||||||
GuiWindow::hide();
|
GuiWindow::hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set up the D'n'D callbacks.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ScratchpadWindow :: setupDndCallbacks (void) throw ()
|
||||||
|
{
|
||||||
|
std::list<Gtk::TargetEntry> targets;
|
||||||
|
targets.push_back(Gtk::TargetEntry("STRING",
|
||||||
|
Gtk::TARGET_SAME_APP));
|
||||||
|
|
||||||
|
// set up the tree view as a d'n'd source
|
||||||
|
treeView->enable_model_drag_source(targets);
|
||||||
|
treeView->signal_drag_data_get().connect(sigc::mem_fun(*this,
|
||||||
|
&ScratchpadWindow::onTreeViewDragDataGet));
|
||||||
|
|
||||||
|
// set up the tree view as a d'n'd target
|
||||||
|
treeView->enable_model_drag_dest(targets);
|
||||||
|
treeView->signal_drag_data_received().connect(sigc::mem_fun(*this,
|
||||||
|
&ScratchpadWindow::onTreeViewDragDataReceived));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The callback for supplying the data for the drag and drop.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ScratchpadWindow :: onTreeViewDragDataGet(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
Glib::ustring dropString = bundleName;
|
||||||
|
Ptr<Playable>::Ref playable = getFirstSelectedPlayable();
|
||||||
|
|
||||||
|
while ((playable = getNextSelectedPlayable())) {
|
||||||
|
dropString += " ";
|
||||||
|
dropString += std::string(*playable->getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
selectionData.set(selectionData.get_target(),
|
||||||
|
8 /* 8 bits format*/,
|
||||||
|
(const guchar *) dropString.c_str(),
|
||||||
|
dropString.bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The callback for processing the data delivered by drag and drop.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ScratchpadWindow :: onTreeViewDragDataReceived(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
const Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
if (selectionData.get_length() < 0 || selectionData.get_format() != 8) {
|
||||||
|
std::cerr << "unknown type of data dropped on the tree view in "
|
||||||
|
<< bundleName << std::endl;
|
||||||
|
context->drag_finish(false, false, time);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Glib::ustring data = selectionData.get_data_as_string();
|
||||||
|
Glib::ustring data = "searchWindow 123 456 789 abc";
|
||||||
|
std::stringstream dataStream(data);
|
||||||
|
Glib::ustring sourceWindow;
|
||||||
|
dataStream >> sourceWindow;
|
||||||
|
|
||||||
|
|
||||||
|
Glib::ustring playableId;
|
||||||
|
while (dataStream >> playableId) {
|
||||||
|
if (sourceWindow == bundleName) {
|
||||||
|
//insertRow(destination, x, y, stripped, ROW_MOVE);
|
||||||
|
std::cerr << "same window; move " << playableId << std::endl;
|
||||||
|
context->drag_finish(true, true, time);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//insertRow(destination, x, y, stripped, ROW_COPY);
|
||||||
|
std::cerr << "other window: " << sourceWindow
|
||||||
|
<< "; copy " << playableId << std::endl;
|
||||||
|
context->drag_finish(true, false, time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,12 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
void
|
void
|
||||||
removeItem(Ptr<const UniqueId>::Ref id) throw ();
|
removeItem(Ptr<const UniqueId>::Ref id) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the D'n'D callbacks.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setupDndCallbacks (void) throw ();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -242,7 +248,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
void
|
void
|
||||||
onDoubleClick(const Gtk::TreeModel::Path & path,
|
onDoubleClick(const Gtk::TreeModel::Path & path,
|
||||||
const Gtk::TreeViewColumn * column)
|
const Gtk::TreeViewColumn * column)
|
||||||
throw ();
|
throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for a key pressed at one of the entries.
|
* Signal handler for a key pressed at one of the entries.
|
||||||
|
@ -255,56 +261,92 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @return true if the key press was fully handled, false if not
|
* @return true if the key press was fully handled, false if not
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
onKeyPressed(GdkEventKey * event) throw ();
|
onKeyPressed(GdkEventKey * event) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "edit playlist" menu item selected from
|
* Signal handler for the "edit playlist" menu item selected from
|
||||||
* the entry context menu. For playlists only.
|
* the entry context menu. For playlists only.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onEditPlaylist(void) throw ();
|
onEditPlaylist(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "schedule playlist" menu item selected
|
* Signal handler for the "schedule playlist" menu item selected
|
||||||
* from the entry context menu. For playlists only.
|
* from the entry context menu. For playlists only.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onSchedulePlaylist(void) throw ();
|
onSchedulePlaylist(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "export playlist" menu item selected from
|
* Signal handler for the "export playlist" menu item selected from
|
||||||
* the entry context menu. For playlists only.
|
* the entry context menu. For playlists only.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onExportPlaylist(void) throw ();
|
onExportPlaylist(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "add to playlist" menu item selected from
|
* Signal handler for the "add to playlist" menu item selected from
|
||||||
* the entry context menu.
|
* the entry context menu.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onAddToPlaylist(void) throw ();
|
onAddToPlaylist(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "add to live mode" menu item selected from
|
* Signal handler for the "add to live mode" menu item selected from
|
||||||
* the entry context menu.
|
* the entry context menu.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onAddToLiveMode(void) throw ();
|
onAddToLiveMode(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal handler for the "upload to hub" menu item selected from
|
* Signal handler for the "upload to hub" menu item selected from
|
||||||
* the entry context menu.
|
* the entry context menu.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onUploadToHub(void) throw ();
|
onUploadToHub(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event handler for the Remove menu item selected from
|
* Event handler for the Remove menu item selected from
|
||||||
* the entry conext menu.
|
* the entry conext menu.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
onRemoveMenuOption(void) throw ();
|
onRemoveMenuOption(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The callback for supplying the data for the drag and drop.
|
||||||
|
*
|
||||||
|
* @param context the drag context.
|
||||||
|
* @param selectionData the data (filled in by this function).
|
||||||
|
* @param info not used.
|
||||||
|
* @param time timestamp for the d'n'd operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
onTreeViewDragDataGet(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The callback for processing the data delivered by drag and drop.
|
||||||
|
*
|
||||||
|
* @param context the drag context.
|
||||||
|
* @param x the x coord where the data was dropped.
|
||||||
|
* @param y the y coord where the data was dropped.
|
||||||
|
* @param selectionData the data.
|
||||||
|
* @param info not used.
|
||||||
|
* @param time timestamp for the d'n'd operation.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
onTreeViewDragDataReceived(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
const Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -316,13 +358,13 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* this window.
|
* this window.
|
||||||
*/
|
*/
|
||||||
ScratchpadWindow(Gtk::ToggleButton * windowOpenerButton)
|
ScratchpadWindow(Gtk::ToggleButton * windowOpenerButton)
|
||||||
throw ();
|
throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual destructor.
|
* Virtual destructor.
|
||||||
*/
|
*/
|
||||||
virtual
|
virtual
|
||||||
~ScratchpadWindow(void) throw ()
|
~ScratchpadWindow(void) throw ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,7 +375,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @param playable the Playable object to add.
|
* @param playable the Playable object to add.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
addItem(Ptr<Playable>::Ref playable) throw ();
|
addItem(Ptr<Playable>::Ref playable) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an item to the Scratchpad.
|
* Add an item to the Scratchpad.
|
||||||
|
@ -342,7 +384,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @param id the id of the item to add.
|
* @param id the id of the item to add.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
addItem(Ptr<const UniqueId>::Ref id) throw ();
|
addItem(Ptr<const UniqueId>::Ref id) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the contents of the Scratchpad.
|
* Return the contents of the Scratchpad.
|
||||||
|
@ -350,7 +392,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @return a space-separated list of the unique IDs, in base 10.
|
* @return a space-separated list of the unique IDs, in base 10.
|
||||||
*/
|
*/
|
||||||
Ptr<Glib::ustring>::Ref
|
Ptr<Glib::ustring>::Ref
|
||||||
getContents(void) throw ();
|
getContents(void) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restore the contents of the Scratchpad.
|
* Restore the contents of the Scratchpad.
|
||||||
|
@ -360,7 +402,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @param contents a space-separated list of unique IDs, in base 10.
|
* @param contents a space-separated list of unique IDs, in base 10.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
setContents(Ptr<const Glib::ustring>::Ref contents) throw ();
|
setContents(Ptr<const Glib::ustring>::Ref contents) throw ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the user preferences key.
|
* Return the user preferences key.
|
||||||
|
@ -370,7 +412,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* @return the user preference key.
|
* @return the user preference key.
|
||||||
*/
|
*/
|
||||||
Ptr<const Glib::ustring>::Ref
|
Ptr<const Glib::ustring>::Ref
|
||||||
getUserPreferencesKey(void) throw ()
|
getUserPreferencesKey(void) throw ()
|
||||||
{
|
{
|
||||||
return userPreferencesKey;
|
return userPreferencesKey;
|
||||||
}
|
}
|
||||||
|
@ -379,7 +421,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* Update the cue player display to show a stopped state.
|
* Update the cue player display to show a stopped state.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
showCuePlayerStopped(void) throw ()
|
showCuePlayerStopped(void) throw ()
|
||||||
{
|
{
|
||||||
cuePlayer->onStop();
|
cuePlayer->onStop();
|
||||||
}
|
}
|
||||||
|
@ -391,7 +433,7 @@ class ScratchpadWindow : public GuiWindow,
|
||||||
* and Schedule Playlist pop-up windows, if they are still open.
|
* and Schedule Playlist pop-up windows, if they are still open.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void
|
||||||
hide(void) throw ();
|
hide(void) throw ();
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ================================================= external data structures */
|
/* ================================================= external data structures */
|
||||||
|
|
|
@ -237,6 +237,7 @@ SearchWindow :: constructSearchResultsView(void) throw ()
|
||||||
false /* call this first */);
|
false /* call this first */);
|
||||||
searchResultsTreeView->signal_row_activated().connect(sigc::mem_fun(*this,
|
searchResultsTreeView->signal_row_activated().connect(sigc::mem_fun(*this,
|
||||||
&SearchWindow::onDoubleClick));
|
&SearchWindow::onDoubleClick));
|
||||||
|
setupDndCallbacks();
|
||||||
|
|
||||||
audioClipContextMenu = constructAudioClipContextMenu();
|
audioClipContextMenu = constructAudioClipContextMenu();
|
||||||
playlistContextMenu = constructPlaylistContextMenu();
|
playlistContextMenu = constructPlaylistContextMenu();
|
||||||
|
@ -1120,3 +1121,46 @@ SearchWindow :: updatePagingToolbar(void) throw ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set up the D'n'D callbacks.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SearchWindow :: setupDndCallbacks (void) throw ()
|
||||||
|
{
|
||||||
|
std::list<Gtk::TargetEntry> targets;
|
||||||
|
targets.push_back(Gtk::TargetEntry("STRING",
|
||||||
|
Gtk::TARGET_SAME_APP));
|
||||||
|
|
||||||
|
// set up the tree view as a d'n'd source
|
||||||
|
searchResultsTreeView->enable_model_drag_source(targets);
|
||||||
|
searchResultsTreeView->signal_drag_data_get().connect(sigc::mem_fun(*this,
|
||||||
|
&SearchWindow::onTreeViewDragDataGet));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The callback for supplying the data for the drag and drop.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SearchWindow :: onTreeViewDragDataGet(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
Glib::ustring dropString = bundleName;
|
||||||
|
Ptr<Playable>::Ref playable = getFirstSelectedPlayable();
|
||||||
|
|
||||||
|
while ((playable = getNextSelectedPlayable())) {
|
||||||
|
dropString += " ";
|
||||||
|
dropString += std::string(*playable->getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
selectionData.set(selectionData.get_target(),
|
||||||
|
8 /* 8 bits format*/,
|
||||||
|
(const guchar *) dropString.c_str(),
|
||||||
|
dropString.bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -420,6 +420,12 @@ class SearchWindow : public GuiWindow,
|
||||||
Ptr<Playable>::Ref
|
Ptr<Playable>::Ref
|
||||||
getNextSelectedPlayable(void) throw ();
|
getNextSelectedPlayable(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the D'n'D callbacks.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setupDndCallbacks (void) throw ();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -618,6 +624,22 @@ class SearchWindow : public GuiWindow,
|
||||||
void
|
void
|
||||||
onForwardButtonClicked(void) throw ();
|
onForwardButtonClicked(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The callback for supplying the data for the drag and drop.
|
||||||
|
*
|
||||||
|
* @param context the drag context.
|
||||||
|
* @param selectionData the data (filled in by this function).
|
||||||
|
* @param info not used.
|
||||||
|
* @param time timestamp for the d'n'd operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
onTreeViewDragDataGet(
|
||||||
|
const Glib::RefPtr<Gdk::DragContext> & context,
|
||||||
|
Gtk::SelectionData & selectionData,
|
||||||
|
guint info,
|
||||||
|
guint time)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue