📄 editlyricdlg.c
字号:
/* * * Author: Allan <qimingos_lsk@163.com>, (C) 2005-2007 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */#include "../include/ShowLyric.h"#include "../include/EditLyricDlg.h"#define this theApp.m_LyricWnd.m_EditLyricDlgvoid EditLyricDlgInit(){ this.m_bModfiy = FALSE; this.m_bEditing = FALSE; this.RefreshState = RefreshState; this.EditLyric = EditLyric; glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_EditLyricDlg_delete_event", G_CALLBACK(on_EditLyricDlg_delete_event), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuFileApply_activate", G_CALLBACK(on_Apply), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuFileDiscard_activate", G_CALLBACK(on_Discard), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuEditCut_activate", G_CALLBACK(on_Cut), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuEditCopy_activate", G_CALLBACK(on_Copy), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuEditPaste_activate", G_CALLBACK(on_Paste), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_MenuEditDel_activate", G_CALLBACK(on_Del), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarApply_clicked", G_CALLBACK(on_Apply), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarReload_clicked", G_CALLBACK(on_Discard), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarCut_clicked", G_CALLBACK(on_Cut), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarCopy_clicked", G_CALLBACK(on_Copy), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarPaste_clicked", G_CALLBACK(on_Paste), NULL); glade_xml_signal_connect_data(this.m_pEditLyricXML, "on_ToolbarDel_clicked", G_CALLBACK(on_Del), NULL); GtkWidget* pEditLyric = glade_xml_get_widget(this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); gtk_text_buffer_create_tag(pEditBuf, "lyric", "foreground","green",NULL); g_signal_connect(GTK_OBJECT(pEditBuf), "changed", GTK_SIGNAL_FUNC(on_TestViewLyric_changed), NULL); g_signal_connect(GTK_OBJECT(pEditBuf), "mark-set", GTK_SIGNAL_FUNC(on_TestViewLyric_selected), NULL); }// 编辑歌词void EditLyric(){ strncpy(this.m_szLyricFile, theApp.m_CurrSongInfo.szLyricFileName, MAX_PATH); if (strlen(this.m_szLyricFile) <= 0) return; GtkWidget * pEditLyricDlg = glade_xml_get_widget(this.m_pEditLyricXML, "EditLyricDlg"); // 从文件中读取歌词内容 FILE* file = fopen(this.m_szLyricFile, "r"); if (!file) { LyricLog("%s:%d==>open file(%s) failed!", __FILE__, __LINE__, this.m_szLyricFile); return; } fseek(file, 0, SEEK_END); int iLen = ftell(file); if (iLen <= 0) return; fseek(file, 0, SEEK_SET); gchar* lpszLyric = (gchar *)malloc(iLen*sizeof(gchar)); if (!lpszLyric) { LyricLog("%s:%d==>Not enough memory.", __FILE__, __LINE__); return; } GtkWidget* pEditLyric = glade_xml_get_widget(this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); gtk_text_buffer_set_text(pEditBuf, "", -1); GtkTextIter end; while(fgets(lpszLyric, iLen, file) != NULL) { int iLineLen = strlen(lpszLyric); char* lpszTimeEnd = lpszLyric + iLineLen; if(iLineLen>2) { do { lpszTimeEnd--; }while(*lpszTimeEnd != ']' && lpszTimeEnd> lpszLyric); lpszTimeEnd++; int iEnd = lpszTimeEnd - lpszLyric; gtk_text_buffer_get_end_iter(pEditBuf, &end); gtk_text_buffer_insert_with_tags_by_name(pEditBuf, &end, lpszLyric, iEnd, "time", NULL); } gtk_text_buffer_get_end_iter(pEditBuf, &end); gtk_text_buffer_insert_with_tags_by_name(pEditBuf, &end, lpszTimeEnd, -1, "lyric", NULL); } fclose(file); file = NULL; free(lpszLyric); lpszLyric = NULL; char szTitle[MAX_PATH]; snprintf(szTitle, MAX_PATH, "%s - %s", PLUGIN_NAME, this.m_szLyricFile); gtk_window_set_title(GTK_WINDOW(pEditLyricDlg), szTitle); this.m_bModfiy = FALSE; this.RefreshState(); this.m_bEditing = TRUE; theApp.m_LyricWnd.SmartShowWnd(FALSE);}// 处理关闭事件gboolean on_EditLyricDlg_delete_event(GtkWidget* widget, gpointer user_data){ this.m_bEditing = FALSE; this.m_bModfiy = FALSE; theApp.m_LyricWnd.SmartShowWnd(TRUE); return TRUE;}// 保存歌词文件void on_Apply(GtkWidget* widget, gpointer user_data){ GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); GtkTextIter start, end; /*获得缓冲区开始和结束位置的Iter*/ gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(pEditBuf), &start, &end); /*获得文本框缓冲区文本*/ gchar *lpszLyric = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(pEditBuf), &start, &end, FALSE); if (!lpszLyric) { LyricLog("%s:%d==>Can't get lyric from the view.",__FILE__ , __LINE__); return; } // 歌词内容写入文件 FILE* file = fopen(this.m_szLyricFile, "w+"); if (!file) { LyricLog("%s:%d==>open file(%s) failed!", __FILE__, __LINE__, this.m_szLyricFile); return; } fwrite(lpszLyric, strlen(lpszLyric), 1, file); fclose(file); file = NULL; // 显示歌词界面重新加载歌词 SongInfo info; if (theApp.m_player.GetSongInfo(&info)) { gchar szLrcFile[MAX_PATH] = { 0}; sprintf(szLrcFile, "%s/%s/%s.lyric", theApp.m_configs.szLyricPath, info.szArtist, info.szTitle); strcpy(info.szLyricFileName, szLrcFile); theApp.PreChangeSong(&info); } this.m_bModfiy = FALSE; this.m_bEditing = FALSE; theApp.m_LyricWnd.SmartShowWnd(TRUE);}// 重新加载歌词void on_Discard(GtkWidget* widget, gpointer user_data){ LyricDebug("on_Discard"); EditLyric(); this.m_bModfiy = FALSE; RefreshState();}// 剪切void on_Cut(GtkWidget* widget, gpointer user_data){ GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); GtkClipboard* clipboard = gtk_widget_get_clipboard(pEditLyric, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_cut_clipboard(pEditBuf, clipboard, TRUE); // TODO:重新校正颜色 this.m_bModfiy = TRUE; RefreshState();}// 拷贝void on_Copy(GtkWidget* widget, gpointer user_data){ GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); GtkClipboard* clipboard = gtk_widget_get_clipboard(pEditLyric, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard(pEditBuf, clipboard); // TODO:重新校正颜色 RefreshState();}// 粘贴void on_Paste(GtkWidget* widget, gpointer user_data){ GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); GtkClipboard* clipboard = gtk_widget_get_clipboard(pEditLyric, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_paste_clipboard(pEditBuf, clipboard, NULL, TRUE); // TODO:重新校正颜色 this.m_bModfiy = TRUE; RefreshState();}// 删除void on_Del(GtkWidget* widget, gpointer user_data){ GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric)); gtk_text_buffer_delete_selection(pEditBuf, FALSE, TRUE); this.m_bModfiy = TRUE; // TODO:重新校正颜色 RefreshState();}void on_TestViewLyric_selected(GtkTextBuffer *textbuffer, GtkTextIter *location, GtkTextMark *mark, gpointer user_data){ static gboolean bSel; if(bSel == gtk_text_buffer_get_has_selection(textbuffer)) return; bSel = !bSel; RefreshState();}void on_TestViewLyric_changed(GtkTextBuffer *textbuffer, gpointer user_data){ if(!this.m_bModfiy) { this.m_bModfiy = TRUE; RefreshState(); }}void RefreshState(){ GtkWidget * pEditLyricDlg = glade_xml_get_widget(this.m_pEditLyricXML, "EditLyricDlg"); char szTitle[MAX_PATH]; if (this.m_bModfiy) { snprintf(szTitle, MAX_PATH, "*%s - %s", PLUGIN_NAME, this.m_szLyricFile); } else { snprintf(szTitle, MAX_PATH, "%s - %s", PLUGIN_NAME, this.m_szLyricFile); } gtk_window_set_title(GTK_WINDOW(pEditLyricDlg), szTitle); GtkWidget* pEditLyric = glade_xml_get_widget( this.m_pEditLyricXML, "TextViewLyric"); GtkTextBuffer* pEditBuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pEditLyric));#define ENABLE_WIDGET(widget, bEnable) gtk_widget_set_sensitive(\ glade_xml_get_widget(this.m_pEditLyricXML, widget),\ bEnable) if (gtk_text_buffer_get_has_selection(pEditBuf) == TRUE) { ENABLE_WIDGET("MenuEditCut", TRUE); ENABLE_WIDGET("MenuEditCopy", TRUE); ENABLE_WIDGET("MenuEditDel", TRUE); ENABLE_WIDGET("ToolbarCut", TRUE); ENABLE_WIDGET("ToolbarCopy", TRUE); ENABLE_WIDGET("ToolbarDel", TRUE); } else { ENABLE_WIDGET("MenuEditCut", FALSE); ENABLE_WIDGET("MenuEditCopy", FALSE); ENABLE_WIDGET("MenuEditDel", FALSE); ENABLE_WIDGET("ToolbarCut", FALSE); ENABLE_WIDGET("ToolbarCopy", FALSE); ENABLE_WIDGET("ToolbarDel", FALSE); } ENABLE_WIDGET("MenuFileApply", this.m_bModfiy); ENABLE_WIDGET("MenuFileDiscard", this.m_bModfiy); //ENABLE_WIDGET("ToolbarReload", this.m_bModfiy); ENABLE_WIDGET("ToolbarApply", this.m_bModfiy); // 检测剪贴板的状态 GtkClipboard* clipboard = gtk_widget_get_clipboard(pEditLyric, GDK_SELECTION_CLIPBOARD); if (gtk_clipboard_wait_is_text_available(clipboard)) { ENABLE_WIDGET("MenuEditPaste", TRUE); ENABLE_WIDGET("ToolbarPaste", TRUE); } else { ENABLE_WIDGET("MenuEditPaste", FALSE); ENABLE_WIDGET("ToolbarPaste", FALSE); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -