📄 gtkmusicbrowser.cpp
字号:
default:
break;
}
selection = selection->next;
}
return newlist;
}
static gboolean list_drag_drop_internal(GtkWidget *widget,
GdkDragContext *context,
gint x, gint y, guint time,
GTKMusicBrowser *p)
{
if (widget == gtk_drag_get_source_widget(context))
return FALSE;
GList *list = context->targets;
GdkAtom atom = gdk_atom_intern("tree-drag", FALSE);
while (list) {
if ((int)atom == GPOINTER_TO_INT(list->data))
return TRUE;
list = list->next;
}
return FALSE;
}
static void drag_dest_info_destroy(gpointer data)
{
GtkCListDestInfo *info = (GtkCListDestInfo *)data;
g_free(info);
}
#define ROW_TOP_YPIXEL(clist, row) (((clist)->row_height * (row)) + \
((row) + 1) + (clist)->voffset)
#define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \
((clist)->row_height + 1))
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (((GtkObject*) (_widget_))->klass)
static gint COLUMN_FROM_XPIXEL (GtkCList * clist, gint x)
{
gint i, cx;
for (i = 0; i < clist->columns; i++)
if (clist->column[i].visible)
{
cx = clist->column[i].area.x + clist->hoffset;
if (x >= (cx - 4) &&
x <= (cx + clist->column[i].area.width + 3))
return i;
}
return -1;
}
static void drag_dest_cell (GtkCList *clist, gint x, gint y,
GtkCListDestInfo *dest_info)
{
GtkWidget *widget;
widget = GTK_WIDGET (clist);
dest_info->insert_pos = GTK_CLIST_DRAG_NONE;
y -= (GTK_CONTAINER (clist)->border_width +
widget->style->klass->ythickness + clist->column_title_area.height);
dest_info->cell.row = ROW_FROM_YPIXEL (clist, y);
if (dest_info->cell.row >= clist->rows) {
dest_info->cell.row = clist->rows - 1;
y = ROW_TOP_YPIXEL (clist, dest_info->cell.row) + clist->row_height;
}
if (dest_info->cell.row < -1)
dest_info->cell.row = -1;
x -= GTK_CONTAINER (widget)->border_width +
widget->style->klass->xthickness;
dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x);
if (dest_info->cell.row >= 0) {
gint y_delta;
gint h = 0;
y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row);
if (GTK_CLIST_DRAW_DRAG_RECT(clist)) {
dest_info->insert_pos = GTK_CLIST_DRAG_INTO;
h = clist->row_height / 4;
}
else if (GTK_CLIST_DRAW_DRAG_LINE(clist)) {
dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE;
h = clist->row_height / 2;
}
if (GTK_CLIST_DRAW_DRAG_LINE(clist)) {
if (y_delta < h)
dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE;
else if (clist->row_height - y_delta < h)
dest_info->insert_pos = GTK_CLIST_DRAG_AFTER;
}
}
}
static void list_drag_rec_internal(GtkWidget *widget, GdkDragContext *context,
gint x, gint y, GtkSelectionData *data,
guint info, guint time, GTKMusicBrowser *p)
{
if (widget == gtk_drag_get_source_widget(context))
return;
if (data->length == sizeof(vector<PlaylistItem *> *)) {
vector<PlaylistItem *> *newlist = *((vector<PlaylistItem *> **)(data->data));
if (newlist) {
GtkCListDestInfo dest_info;
drag_dest_cell(GTK_CLIST(widget), x, y, &dest_info);
if (dest_info.insert_pos == GTK_CLIST_DRAG_AFTER)
dest_info.cell.row++;
p->m_currentindex = dest_info.cell.row;
p->AddTracksPlaylistEvent(newlist);
p->SetClickState(kContextPlaylist);
g_dataset_remove_data(context, "gtk-clist-drag-dest");
}
}
}
static void list_drag_leave_internal(GtkWidget *widget, GdkDragContext *context,
guint time, GTKMusicBrowser *p)
{
if (widget == gtk_drag_get_source_widget(context))
return;
GtkCList *clist = GTK_CLIST(widget);
GtkCListDestInfo *dest_info;
dest_info = (GtkCListDestInfo *)g_dataset_get_data(context,
"gtk-clist-drag-dest");
if (dest_info) {
if (dest_info->cell.row >= 0) {
GList *list = context->targets;
GdkAtom atom = gdk_atom_intern("tree-drag", FALSE);
while (list) {
if ((int)atom == GPOINTER_TO_INT(list->data)) {
GTK_CLIST_CLASS_FW(clist)->draw_drag_highlight(clist,
(GtkCListRow *)g_list_nth(clist->row_list,
dest_info->cell.row)->data,
dest_info->cell.row, dest_info->insert_pos);
break;
}
list = list->next;
}
}
g_dataset_remove_data(context, "gtk-clist-drag-dest");
}
}
static gint list_drag_motion_internal(GtkWidget *widget,
GdkDragContext *context,
gint x, gint y, guint time,
GTKMusicBrowser *p)
{
if (widget == gtk_drag_get_source_widget(context))
return FALSE;
GtkCList *clist = GTK_CLIST(widget);
GtkCListDestInfo new_info;
GtkCListDestInfo *dest_info;
dest_info = (GtkCListDestInfo *)g_dataset_get_data(context,
"gtk-clist-drag-dest");
if (!dest_info) {
dest_info = g_new(GtkCListDestInfo, 1);
dest_info->insert_pos = GTK_CLIST_DRAG_NONE;
dest_info->cell.row = -1;
dest_info->cell.column = -1;
g_dataset_set_data_full(context, "gtk-clist-drag-dest", dest_info,
drag_dest_info_destroy);
}
drag_dest_cell(clist, x, y, &new_info);
GList *list = context->targets;
GdkAtom atom = gdk_atom_intern("tree-drag", FALSE);
list = context->targets;
while (list) {
if ((int)atom == GPOINTER_TO_INT(list->data))
break;
list = list->next;
}
if (list) {
/* if (new_info.insert_pos == GTK_CLIST_DRAG_NONE) {
if (dest_info->cell.row < 0) {
gdk_drag_status(context, GDK_ACTION_DEFAULT, time);
return FALSE;
}
return TRUE;
} */
if (new_info.cell.row != dest_info->cell.row ||
(new_info.cell.row == dest_info->cell.row &&
dest_info->insert_pos != new_info.insert_pos)) {
if (dest_info->cell.row >= 0)
GTK_CLIST_CLASS_FW(clist)->draw_drag_highlight(clist,
(GtkCListRow *)g_list_nth(clist->row_list,
dest_info->cell.row)->data,
dest_info->cell.row, dest_info->insert_pos);
dest_info->insert_pos = new_info.insert_pos;
dest_info->cell.row = new_info.cell.row;
dest_info->cell.column = new_info.cell.column;
GTK_CLIST_CLASS_FW(clist)->draw_drag_highlight(clist,
(GtkCListRow *)g_list_nth(clist->row_list,
dest_info->cell.row)->data,
dest_info->cell.row, dest_info->insert_pos);
gdk_drag_status(context, context->suggested_action, time);
}
return TRUE;
}
dest_info->insert_pos = new_info.insert_pos;
dest_info->cell.row = new_info.cell.row;
dest_info->cell.column = new_info.cell.column;
return TRUE;
}
static void tree_clicked(GtkWidget *widget, GdkEventButton *event,
GTKMusicBrowser *p)
{
if (!event)
return;
g_return_if_fail(widget != NULL);
g_return_if_fail(GTK_IS_CTREE(widget));
g_return_if_fail(event != NULL);
GtkCTree *ctree = GTK_CTREE(widget);
GtkCList *clist = GTK_CLIST(widget);
if (event->window != clist->clist_window)
return;
if (event->type == GDK_2BUTTON_PRESS) {
vector<PlaylistItem *> *newlist = getTreeSelection(ctree);
p->AddTracksPlaylistEvent(newlist, true);
}
else {
int row, column;
if (!gtk_clist_get_selection_info(clist, (int)event->x, (int)event->y,
&row, &column))
return;
GtkCTreeNode *node = GTK_CTREE_NODE(g_list_nth(clist->row_list, row));
p->mbSelection = (TreeData *)gtk_ctree_node_get_row_data(ctree, node);
if (p->mbSelection->type == kTreePlaylist)
p->SetTreeClick(kClickPlaylist);
else if (p->mbSelection->type == kTreeTrack)
p->SetTreeClick(kClickTrack);
else
p->SetTreeClick(kClickNone);
}
p->SetClickState(kContextBrowser);
}
static void tree_source_destroy(gpointer data)
{
}
static void tree_drag_begin(GtkWidget *w, GdkDragContext *context)
{
GtkCTree *ctree;
GtkCList *clist;
g_return_if_fail(w != NULL);
g_return_if_fail(GTK_IS_CTREE(w));
g_return_if_fail(context != NULL);
ctree = GTK_CTREE(w);
clist = GTK_CLIST(w);
GtkCTreeNode *node = GTK_CTREE_NODE(g_list_nth(clist->row_list,
clist->click_cell.row));
if (node)
gtk_ctree_select(ctree, node);
vector<PlaylistItem *> *newlist = getTreeSelection(ctree);
if (newlist->size() == 0)
return;
vector<PlaylistItem *> *test =
(vector<PlaylistItem *> *)g_dataset_get_data(context,
"tree-drag-source");
if (!test)
g_dataset_set_data_full(context, "tree-drag-source", newlist,
tree_source_destroy);
}
static void tree_drag_data_get(GtkWidget *w, GdkDragContext *context,
GtkSelectionData *selection_data, guint info,
guint time, GtkWidget *widget)
{
if (selection_data->target == gdk_atom_intern("tree-drag", FALSE)) {
vector<PlaylistItem *> *newlist =
(vector<PlaylistItem *> *)g_dataset_get_data(context,
"tree-drag-source");
gtk_selection_data_set(selection_data, selection_data->target,
0, (guchar *)&newlist, sizeof(vector<PlaylistItem *>*));
}
}
static void tree_status(GtkWidget *w, GdkEventMotion *event,
GTKMusicBrowser *p)
{
int x, y, row, column;
GtkCTree *ctree = GTK_CTREE(w);
GtkCList *clist = GTK_CLIST(w);
x = (int)event->x;
y = (int)event->y;
if (!gtk_clist_get_selection_info(clist, x, y, &row, &column)) {
gdk_threads_leave();
p->AcceptEvent(new BrowserMessageEvent(" "));
gdk_threads_enter();
return;
}
GtkCTreeNode *node = GTK_CTREE_NODE(g_list_nth(clist->row_list, row));
TreeData *data = (TreeData *)gtk_ctree_node_get_row_data(ctree, node);
gdk_threads_leave();
switch (data->type) {
case kTreeMyMusic:
case kTreeAll:
case kTreeUncat:
case kTreePlaylistHead:
case kTreePlaylist:
p->AcceptEvent(new BrowserMessageEvent(data->message.c_str()));
break;
default:
p->AcceptEvent(new BrowserMessageEvent(" "));
break;
}
gdk_threads_enter();
}
static void tree_status_clear(GtkWidget *w, GdkEventCrossing *event,
GTKMusicBrowser *p)
{
gdk_threads_leave();
p->AcceptEvent(new BrowserMessageEvent(" "));
gdk_threads_enter();
}
static gint nocase_compare(GtkCList *clist, gconstpointer ptr1,
gconstpointer ptr2)
{
char *text1 = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -