ocarina: Remove old ocarina code

I don't need it anymore, so it is just taking up space.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-03-01 17:48:25 -05:00 committed by Anna Schumaker
parent 968d723ec7
commit 44d1fcd1ad
18 changed files with 0 additions and 2660 deletions

View File

@ -1,33 +0,0 @@
#!/usr/bin/python
from config import *
env.ParseConfig('pkg-config --cflags --libs gtk+-2.0')
env.ParseConfig('pkg-config --cflags --libs gmodule-export-2.0')
def script(target, source, env):
f = open(str(target[0]), 'w')
for line in open(str(source[0])):
line = line.replace("%DEBUG", str(DEBUG))
f.write(line)
f.close()
os.chmod(str(target[0]), 0755)
extra_files = [
("ocarina.xml", "../lib/ocarina/ocarina.xml", copy),
("images/random.png", "../lib/ocarina/random.png", copy),
("images/ocarina.png", "../lib/ocarina/ocarina.png", copy),
("images/thumbs_up.png", "../lib/ocarina/thumbs_up.png", copy),
("images/thumbs_down.png", "../lib/ocarina/thumbs_down.png", copy),
("scripts/ocarina", "../bin/ocarina", script),
("scripts/ocarina-completion.bash", "../lib/ocarina/ocarina-completion.bash", copy),
("../bin/ocarina", "../ocarina.bin", symlink),
]
build = [env.Program("../bin/ocarina-player", libsaria + get_cpp_files())]
for (src, dst, func) in extra_files:
build.append(env.Command(dst, src, func))
env.Alias("ocarina", build)
Return('build')

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,147 +0,0 @@
// Copyright (c) 2012 Bryan Schumaker
#include <library.h>
#include "ocarina.h"
static inline GtkListStore *get_list()
{
return GTK_LIST_STORE(get_object("LibraryList"));
}
static bool find_iter(libsaria::library::Path *path, GtkTreeIter *iter)
{
libsaria::library::Path *list_path;
/* get_iter_first() return FALSE if the liststore is empty */
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(get_list()), iter))
return false;
do {
gtk_tree_model_get(GTK_TREE_MODEL(get_list()), iter, 0, &list_path, -1);
if (list_path == path)
return true;
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(get_list()), iter));
return false;
}
static libsaria::library::Path *find_path(gchar *path)
{
GtkTreeIter iter;
libsaria::library::Path *lib_path = NULL;
if (!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(get_list()), &iter, path))
return NULL;
gtk_tree_model_get(GTK_TREE_MODEL(get_list()), &iter, 0, &lib_path, -1);
return lib_path;
}
static libsaria::library::Path *get_selected_path(GtkWidget *treeview)
{
GtkTreeIter iter;
GtkTreeModel *model = GTK_TREE_MODEL(get_list());
GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
libsaria::library::Path *path;
if (!gtk_tree_selection_get_selected(sel, &model, &iter))
return NULL;
gtk_tree_model_get(model, &iter, 0, &path, -1);
return path;
}
static void path_updated(libsaria::library::Path *path)
{
GtkTreeIter iter;
if (!find_iter(path, &iter))
return;
gtk_list_store_set(get_list(), &iter,
1, path->visible,
2, path->path.c_str(),
3, path->tracks.size(),
-1);
}
static void path_added(libsaria::library::Path *path)
{
GtkTreeIter iter;
println("Path added: " + path->path);
gtk_list_store_append(get_list(), &iter);
gtk_list_store_set(get_list(), &iter,
0, path,
1, path->visible,
2, path->path.c_str(),
3, path->tracks.size(),
-1);
}
static void path_removed(libsaria::library::Path *path)
{
GtkTreeIter iter;
if (!find_iter(path, &iter))
return;
gtk_list_store_remove(get_list(), &iter);
}
void notify_library(notify_t event, libsaria::library::Path *path)
{
switch (event) {
case PATH_ADDED:
path_added(path);
break;
case PATH_DELETED:
path_removed(path);
break;
case PATH_UPDATED:
path_updated(path);
default:
break;
}
}
static void add_library(GtkWidget *b, gpointer d)
{
string dir = run_chooser("DirectoryChooser");
if (dir != "") {
println("Scanning dir: " + dir);
libsaria::library::add_path(dir);
}
}
static void path_toggled(GtkCellRendererToggle *toggle, gchar *path, gpointer d)
{
libsaria::library::Path *lib_path = find_path(path);
if (!path)
return;
if (gtk_cell_renderer_toggle_get_active(toggle))
libsaria::library::show_path(lib_path);
else
libsaria::library::hide_path(lib_path);
}
static gboolean key_pressed(GtkWidget *treeview, GdkEvent *event, gpointer data)
{
libsaria::library::Path *path;
string key = gdk_keyval_name(event->key.keyval);
println("Library settings handling key press: " + key);
path = get_selected_path(treeview);
if (!path)
return FALSE;
if (key == "Delete")
libsaria::library::delete_path(path);
else if (key == "plus" || key == "KP_Add")
add_library(NULL, NULL);
else
return FALSE;
return TRUE;
}
void init_library()
{
connect_signal("AddLibrary", "clicked", G_CALLBACK(add_library), NULL);
connect_signal("UpdateLibraries", "clicked", G_CALLBACK(libsaria::library::update_all), NULL);
connect_signal("LibraryToggle", "toggled", G_CALLBACK(path_toggled), NULL);
connect_signal("LibraryView", "key-press-event", G_CALLBACK(key_pressed), NULL);
}

View File

@ -1,52 +0,0 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <idle.h>
#include "ocarina.h"
static void idle_add()
{
if (libsaria::idle::size() == 1) {
println("Adding idle callback");
g_idle_add(ocarina_idle, NULL);
}
}
void on_notify(notify_t event, void *data)
{
/* TODO: Array of function pointers */
switch (event) {
case IDLE_ADD:
idle_add();
break;
case TRACK_CHANGED:
update_labels((libsaria::Track *)data);
break;
case PATH_ADDED:
case PATH_DELETED:
case PATH_UPDATED:
notify_library(event, (libsaria::library::Path *)data);
break;
case PLAYING:
case PAUSED:
update_buttons(event);
break;
case PAUSE_TYPE:
update_autopause_type((AutoPauseType *)data);
break;
case PAUSE_COUNT:
update_autopause_count((unsigned int *)data);
break;
case PLAYLIST_NEW:
case PLAYLIST_DELETE:
case PLAYLIST_RENUMBER:
case PLAYLIST_CHANGED:
update_tabs(event, (libsaria::Playlist *)data);
break;
case PLAYLIST_ADD:
case PLAYLIST_RM:
case PLAYLIST_UPDATE:
case PLAYLIST_GOTO:
update_playlist(event, (libsaria::PlaylistNotification *)data);
default:
break;
}
}

View File

@ -1,174 +0,0 @@
// Copyright (c) 2011 Bryan Schumaker
#include <version.h>
#include <libsaria.h>
#include <notify.h>
#include <audio.h>
#include <deck.h>
#include <idle.h>
#include "ocarina.h"
static string lib_path;
static GtkBuilder *builder;
static GtkWidget *ban_button;
static GtkWidget *yes_image;
static GtkWidget *no_image;
static void find_exe_path(string &res)
{
char buf[1024];
ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf) -1);
if (len != -1)
res = string(buf);
}
static void rstrip_word(string &path)
{
unsigned int index = path.rfind("/");
if (index != string::npos)
path = path.substr(0, index);
}
static void find_lib_path()
{
string exe;
find_exe_path(exe);
if (exe == "")
return;
rstrip_word(exe); // ocarina-player
rstrip_word(exe); // bin/
lib_path = exe + "/lib/ocarina";
println("Lib directory? %s", lib_path.c_str());
}
string lib_file(const string &path)
{
string res = lib_path + "/" + path;
println("Expanding to path: " + res);
return res;
}
gboolean ocarina_idle(gpointer data)
{
int size = libsaria::idle::run_task();
return update_idle_bar(size);
}
static gboolean timeout_poll(gpointer data)
{
update_progress();
return TRUE;
}
GObject *get_object(const string &name)
{
/* TODO: Figure out GtkNotebook action area in GtkBuilder */
if (name == "BanButton")
return G_OBJECT(ban_button);
else if (name == "YesImage")
return G_OBJECT(yes_image);
else if (name == "NoImage")
return G_OBJECT(no_image);
return gtk_builder_get_object(builder, name.c_str());
}
GtkWidget *get_widget(const string &name)
{
GtkWidget *widget = GTK_WIDGET(get_object(name));
if (!widget)
println(name + " is not a widget!");
return widget;
}
void connect_signal(const string &name, const string &signal, GCallback func, void *data)
{
GObject *widget = get_object(name);
if (widget)
g_signal_connect(widget, signal.c_str(), func, data);
}
string run_chooser(const string &name)
{
char *file;
string filename = "";
GtkWidget *chooser = get_widget(name);
if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK) {
file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
filename = file;
g_free(file);
}
gtk_widget_hide(chooser);
return filename;
}
static void init_widgets()
{
ban_button = gtk_toggle_button_new();
yes_image = gtk_image_new_from_file(lib_file("thumbs_up.png").c_str());
no_image = gtk_image_new_from_file(lib_file("thumbs_down.png").c_str());
gtk_button_set_image(GTK_BUTTON(ban_button), yes_image);
/* Prevent widgets from being destroyed when toggling banned button */
g_object_ref(yes_image);
g_object_ref(no_image);
}
static void init(int argc, char **argv)
{
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, lib_file("ocarina.xml").c_str(), NULL);
/* Set up small button style */
gtk_rc_parse_string(
"style \"small-button-style\"\n"
"{\n"
" GtkButton::inner-border = {0,0,0,0}\n"
"}\n"
"widget \"*.ocarina-small-button\" style \"small-button-style\"");
/* Initialize widgets static to this file */
init_widgets();
/* Other setup */
init_window();
init_library();
init_tabs();
init_playlist();
init_status();
init_pipe();
/* Connect signals */
connect_signal("PlayButton", "clicked", libsaria::audio::play, NULL);
connect_signal("PauseButton", "clicked", libsaria::audio::pause, NULL);
connect_signal("StopButton", "clicked", libsaria::audio::stop, NULL);
connect_signal("PrevButton", "clicked", libsaria::deck::prev, NULL);
connect_signal("NextButton", "clicked", libsaria::deck::next, NULL);
/* Show any widgets that need showing */
gtk_timeout_add(250, timeout_poll, NULL);
}
int main(int argc, char **argv)
{
struct libsaria::initdata ls_init = {
argc,
argv,
on_notify, /* notification handler */
};
println("Ocarina " + vers_str());
find_lib_path();
libsaria::init(&ls_init);
init(argc, argv);
gtk_main();
libsaria::quit();
return 0;
}

View File

@ -1,88 +0,0 @@
#ifndef OCARINA_H
#define OCARINA_H
#include <notify.h>
#include <track.h>
#include <print.h>
#include <deck.h>
#include <gtk/gtk.h>
#include <string>
using namespace std;
enum ExtraWidgets {
NO_EXTRA_WIDGETS = 0,
CLOSE_BUTTON = (1 << 0),
DISABLE_BUTTON = (1 << 1),
RANDOM_BUTTON = (1 << 2),
SORT_BUTTON = (1 << 3),
};
struct PlaylistWidgets {
libsaria::Playlist *playlist;
GtkListStore *liststore;
GtkBox *page_box;
GtkBox *tab_box;
GtkTreeView *treeview;
GtkTreeModel *filter;
GtkLabel *size_label;
GtkLabel *page_label;
GtkEntry *entry;
GtkToggleButton *disable;
GtkToggleButton *random;
GtkToggleButton *sort;
set<string> *filter_text;
};
/* library.cpp */
void notify_library(notify_t, libsaria::library::Path *);
void init_library();
/* notify.cpp */
void on_notify(notify_t, void *);
/* ocarina.cpp */
string lib_file(const string &);
gboolean ocarina_idle(gpointer);
GObject *get_object(const string &);
GtkWidget *get_widget(const string &);
void connect_signal(const string &, const string &, GCallback, void *);
string run_chooser(const string &);
/* pipe.cpp */
void init_pipe();
/* playlist.cpp */
void update_playlist(notify_t, libsaria::PlaylistNotification *);
bool playlist_key_pressed(GtkTreeView *treeview, string &);
void setup_widgets(struct PlaylistWidgets *, libsaria::Playlist *);
void setup_playlist_page(struct PlaylistWidgets *, int);
void init_playlist();
/* status.cpp */
bool update_idle_bar(int);
void update_length_label(libsaria::Playlist *);
void update_labels(libsaria::Track *);
void update_buttons(notify_t);
void update_progress();
void update_autopause_type(AutoPauseType *);
void update_autopause_count(unsigned int *);
void init_status();
/* tabs.cpp */
struct PlaylistWidgets *find_playlist_widgets(libsaria::Playlist *);
struct PlaylistWidgets *current_widgets();
libsaria::Playlist *current_playlist();
bool playlist_entry_focused();
void playlist_focus_entry();
bool playlist_key_press(string &);
void playlist_focus_treeview();
void playlist_switch_to(string &);
void playlist_switch_to_n(unsigned int);
void init_tabs();
void update_tabs(notify_t, libsaria::Playlist *);
/* window.cpp */
void init_window();
#endif

View File

@ -1,897 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAction" id="action1"/>
<object class="GtkFileChooserDialog" id="DirectoryChooser">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Choose a directory</property>
<property name="role">GtkFileChooserDialog</property>
<property name="type_hint">dialog</property>
<property name="action">select-folder</property>
<property name="preview_widget_active">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="DirectoryCancelButton">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="DirectoryOpenButton">
<property name="label">gtk-open</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">DirectoryCancelButton</action-widget>
<action-widget response="-5">DirectoryOpenButton</action-widget>
</action-widgets>
</object>
<object class="GtkFileChooserDialog" id="FileChooser">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Choose a file</property>
<property name="role">GtkFileChooserDialog</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="FileCancelButton">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="FileOpenButton">
<property name="label">gtk-open</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">FileCancelButton</action-widget>
<action-widget response="-5">FileOpenButton</action-widget>
</action-widgets>
</object>
<object class="GtkListStore" id="LibraryList">
<columns>
<!-- column-name Pointer -->
<column type="gpointer"/>
<!-- column-name Enabled -->
<column type="gboolean"/>
<!-- column-name Path1 -->
<column type="gchararray"/>
<!-- column-name Size -->
<column type="guint"/>
</columns>
</object>
<object class="GtkWindow" id="MainWindow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="default_width">900</property>
<property name="default_height">600</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkNotebook" id="PlaylistTabs">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tab_pos">left</property>
<property name="scrollable">True</property>
<property name="tab_border">0</property>
<property name="tab_hborder">0</property>
<property name="tab_vborder">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="PosLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHScale" id="TrackProgress">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="round_digits">0</property>
<property name="draw_value">False</property>
<property name="value_pos">left</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="DurLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="PlayButton">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="stock">gtk-media-play</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="PauseButton">
<property name="use_action_appearance">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="stock">gtk-media-pause</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="StopButton">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-media-stop</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="PrevButton">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="stock">gtk-media-previous</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkButton" id="NextButton">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-media-next</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">7</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">never</property>
<child>
<object class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">etched-in</property>
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="TitleLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;span size='xx-large'&gt; &lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="ArtistLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">&lt;span size='x-large'&gt; &lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="AlbumLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">&lt;span size='x-large'&gt; &lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tab_pos">left</property>
<child>
<object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioButton" id="NoPause">
<property name="label" translatable="yes">No automatic pause</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioButton" id="PauseAfterN">
<property name="label" translatable="yes">Pause after</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">NoPause</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="PauseCounter">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<property name="adjustment">PauseAdjustment</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> songs</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">AutoPause</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="LibraryView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">LibraryList</property>
<property name="headers_visible">False</property>
<property name="headers_clickable">False</property>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="title" translatable="yes">On</property>
<child>
<object class="GtkCellRendererToggle" id="LibraryToggle"/>
<attributes>
<attribute name="active">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn2">
<property name="title" translatable="yes">Path</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="cellrenderertext1"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn3">
<property name="title" translatable="yes">Size</property>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="AddLibrary">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="UpdateLibraries">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<child>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-refresh</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Library</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="ShowRecent">
<property name="label" translatable="yes">Show list recently played songs</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="ShowBanned">
<property name="label" translatable="yes">Show list of banned songs</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.54000002145767212</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Settings</property>
</object>
<packing>
<property name="position">2</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkProgressBar" id="IdleProgress">
<property name="height_request">10</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="LengthLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="PauseAdjustment">
<property name="upper">256</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkMenu" id="PlaylistMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="MenuQueueFront">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">New queue (front)</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="MenuSetFront">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">New set (front)</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="MenuNewSep">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="MenuQueueBack">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">New queue (back)</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="MenuSetBack">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">New set (back)</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="MenuAddSep">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist0">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 0</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist1">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 1</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist2">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 2</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist3">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 3</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist4">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 4</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist5">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 5</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist6">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 6</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist7">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 7</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist8">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 8</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="AddPlaylist9">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add to playlist 9</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</interface>

View File

@ -1,47 +0,0 @@
// Copyright (c) Bryan Schumaker 2012.
#include <libsaria.h>
#include <print.h>
#include <fs.h>
#include <glib.h>
#include <string>
using namespace std;
static GIOChannel *pipe_in;
static void pipe_read_text(GIOChannel *source, string &text)
{
gchar *str = NULL;
GError *error = NULL;
gsize size, end;
g_io_channel_read_line(source, &str, &size, &end, &error);
text = str;
/* Strip newline character */
text = text.substr(0, text.size() - 1);
/* g_io_channel_read_line allocates memory */
g_free(str);
}
static gboolean pipe_read(GIOChannel *source, GIOCondition condition, gpointer data)
{
string text;
pipe_read_text(source, text);
libsaria::run_cmd(text);
return TRUE;
}
void init_pipe()
{
GError *error = NULL;
string pipe = libsaria::app::pipe_file();
if (pipe == "")
return;
pipe_in = g_io_channel_new_file(pipe.c_str(), "r+", &error);
if (!pipe_in)
return;
g_io_add_watch(pipe_in, G_IO_IN, pipe_read, NULL);
}

View File

@ -1,578 +0,0 @@
// Copyright (c) 2012 Bryan Schumaker
#include <ban.h>
#include <track.h>
#include <format.h>
#include <library.h>
#include <stdlib.h>
#include "ocarina.h"
static GType types[] = {
G_TYPE_POINTER, // libsaria::Track *
G_TYPE_UINT, // Track number
G_TYPE_STRING, // Title
G_TYPE_STRING, // Length
G_TYPE_STRING, // Artist
G_TYPE_STRING, // Album
G_TYPE_UINT, // Year
G_TYPE_UINT, // Count
G_TYPE_STRING, // Last played
G_TYPE_STRING, // Filepath
};
static string formatted(string str)
{
char *escaped = g_markup_escape_text(str.c_str(), -1);
string ret = escaped;
g_free(escaped);
return ret;
}
static void update_track(libsaria::Track *track, GtkListStore *liststore,
GtkTreeIter *iter)
{
gtk_list_store_set(liststore, iter,
0, track,
1, track->track,
2, track->title.c_str(),
3, track->lenstr.c_str(),
4, track->artist.c_str(),
5, track->album.c_str(),
6, track->year,
7, track->count,
8, track->get_last_played().c_str(),
9, formatted(track->filepath).c_str(),
-1);
}
static void playlist_add(libsaria::Playlist *plist, libsaria::Track *track,
unsigned int index)
{
GtkTreeIter iter;
struct PlaylistWidgets *widgets = find_playlist_widgets(plist);
if (!widgets)
return;
gtk_list_store_insert(widgets->liststore, &iter, index);
update_track(track, widgets->liststore, &iter);
}
static void playlist_rm(libsaria::Playlist *plist, unsigned int index)
{
GtkTreeIter iter;
PlaylistWidgets *widgets = find_playlist_widgets(plist);
gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(widgets->liststore), &iter, NULL, index);
gtk_list_store_remove(widgets->liststore, &iter);
update_length_label(current_playlist());
}
static void playlist_update(libsaria::Playlist *plist, libsaria::Track *track,
unsigned int index)
{
GtkTreeIter iter;
PlaylistWidgets *widgets = find_playlist_widgets(plist);
gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(widgets->liststore), &iter, NULL, index);
update_track(track, widgets->liststore, &iter);
}
static void set_playlist_size(libsaria::Playlist *plist)
{
char buf[11];
struct PlaylistWidgets *widgets = find_playlist_widgets(plist);
if (!widgets)
return;
sprintf(buf, "%u", plist->get_size());
gtk_label_set_text(widgets->size_label, buf);
update_length_label(current_playlist());
}
static void playlist_goto_index(libsaria::Playlist *playlist, unsigned int index)
{
GtkTreeIter iter;
GtkTreePath *path;
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore);
gtk_tree_model_get_iter_first(model, &iter);
path = gtk_tree_model_get_path(model, &iter);
for (unsigned int i = 0; i < index; i++)
gtk_tree_path_next(path);
gtk_tree_view_set_cursor(widgets->treeview, path, NULL, FALSE);
gtk_tree_path_free(path);
}
void update_playlist(notify_t event, libsaria::PlaylistNotification *data)
{
if (event == PLAYLIST_ADD) {
playlist_add(data->plist, data->track, data->index);
set_playlist_size(data->plist);
} else if (event == PLAYLIST_RM) {
playlist_rm(data->plist, data->index);
set_playlist_size(data->plist);
} else if (event == PLAYLIST_UPDATE)
playlist_update(data->plist, data->track, data->index);
else if (event == PLAYLIST_GOTO)
playlist_goto_index(data->plist, data->index);
}
static gboolean is_visible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
libsaria::Track *track;
struct PlaylistWidgets *widgets = (struct PlaylistWidgets *)data;
if (widgets->filter_text == NULL)
return true;
gtk_tree_model_get(model, iter, 0, &track, -1);
return track->is_visible(widgets->filter_text);
}
static void do_filter(GtkWidget *entry, gpointer data)
{
struct PlaylistWidgets *widgets = (struct PlaylistWidgets *)data;
string text = gtk_entry_get_text(GTK_ENTRY(entry));
widgets->filter_text = libsaria::format_text(text);
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(widgets->filter));
}
static void track_selected(GtkWidget *treeview, GtkTreePath *path,
GtkTreeViewColumn *col, gpointer data)
{
GtkTreeIter iter;
GtkTreeModel *model;
libsaria::Track *track;
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, 0, &track, -1);
track->load(true);
}
static void do_tree_path_prev(GtkTreePath *path)
{
gtk_tree_path_prev(path);
}
static void do_move_cursor(GtkTreeView *treeview, void path_next(GtkTreePath *))
{
GtkTreePath *path, *scroll;
gtk_widget_grab_focus(GTK_WIDGET(treeview));
gtk_tree_view_get_cursor(treeview, &path, NULL);
if (path == NULL)
return;
path_next(path);
scroll = gtk_tree_path_copy(path);
for (unsigned int i = 0; i < 2; i++)
path_next(scroll);
gtk_tree_view_scroll_to_cell(treeview, scroll, NULL, FALSE, 0, 0);
gtk_tree_view_set_cursor(treeview, path, NULL, FALSE);
gtk_tree_path_free(path);
gtk_tree_path_free(scroll);
}
static void move_cursor(GtkTreeView *treeview, const string &key)
{
if (key == "j")
do_move_cursor(treeview, gtk_tree_path_next);
else
do_move_cursor(treeview, do_tree_path_prev);
}
static void selected_foreach_list(GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter *iter, gpointer data)
{
libsaria::Track *track;
list<libsaria::Track *> *tracks = (list<libsaria::Track *> *)data;
gtk_tree_model_get(model, iter, 0, &track, -1);
tracks->push_back(track);
}
static void list_selected_tracks(GtkTreeView *treeview, list<libsaria::Track *> *tracks)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
gtk_tree_selection_selected_foreach(selection, selected_foreach_list, tracks);
}
static void selected_foreach_index(GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter *iter, gpointer data)
{
list<unsigned int> *indices = (list<unsigned int> *)data;
unsigned int *index = (unsigned int *)gtk_tree_path_get_indices(path);
indices->push_back(*index);
}
static void list_selected_indices(GtkTreeView *treeview, list<unsigned int> *indices)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
gtk_tree_selection_selected_foreach(selection, selected_foreach_index, indices);
}
static void new_playlist(const string &key, GtkTreeView *treeview, bool front)
{
list<libsaria::Track *> tracks;
unsigned int flags = PL_NONE;
list_selected_tracks(treeview, &tracks);
if (tracks.size() == 0)
return;
if (key == "s" || key == "S")
flags |= PL_SORTED | PL_RANDOM;
libsaria::deck::new_playlist(tracks, flags, front);
}
static bool add_to_playlist(GtkTreeView *treeview, int n)
{
list<libsaria::Track *> tracks;
libsaria::Playlist *playlist;
list_selected_tracks(treeview, &tracks);
if (tracks.size() == 0)
return false;
playlist = libsaria::deck::get_playlist(n);
if (playlist)
playlist->push_back(tracks);
return true;
}
static void ban_selected(GtkTreeView *treeview, bool state)
{
list<libsaria::Track *> tracks;
list<libsaria::Track *>::iterator it;
list_selected_tracks(treeview, &tracks);
for (it = tracks.begin(); it != tracks.end(); it++)
(*it)->set_banned(state);
}
static void delete_from_playlist(GtkTreeView *treeview)
{
list<unsigned int> indices;
libsaria::Playlist *playlist = current_playlist();
if (playlist == libsaria::library::get_playlist() || playlist == libsaria::ban::get_banned_plist()) {
ban_selected(treeview, playlist == libsaria::library::get_playlist());
return;
}
list_selected_indices(treeview, &indices);
if (indices.back() == (playlist->get_size() - 1))
move_cursor(treeview, "k");
else
move_cursor(treeview, "j");
playlist->remove_indices(indices);
libsaria::deck::garbage_collect();
}
static bool on_escape_key(GtkTreeView *treeview)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
if (gtk_tree_selection_count_selected_rows(selection) == 0)
return false;
gtk_tree_selection_unselect_all(selection);
return true;
}
static void on_return_key(GtkTreeView *treeview)
{
GtkTreePath *path;
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
if (gtk_tree_selection_count_selected_rows(selection) == 0)
return;
gtk_tree_view_get_cursor(treeview, &path, NULL);
gtk_tree_view_row_activated(treeview, path, NULL);
gtk_tree_path_free(path);
}
bool playlist_key_pressed(GtkTreeView *treeview, string &key)
{
if (key == "j" || key == "k")
move_cursor(treeview, key);
else if (key == "s" || key == "q")
new_playlist(key, treeview, false);
else if (key == "S" || key == "Q")
new_playlist(key, treeview, true);
else if (key >= "0" && key <= "9")
return add_to_playlist(treeview, atoi(key.c_str()));
else if (key == "Delete" || key == "d")
delete_from_playlist(treeview);
else if (key == "Return")
on_return_key(treeview);
else if (key == "Escape")
return on_escape_key(treeview);
else
return false;
return true;
}
static void on_menu_item(GtkWidget *item, gpointer data)
{
struct PlaylistWidgets *widgets = current_widgets();
if (item == get_widget("MenuQueueFront"))
new_playlist("Q", widgets->treeview, true);
else if (item == get_widget("MenuQueueBack"))
new_playlist("q", widgets->treeview, false);
else if (item == get_widget("MenuSetFront"))
new_playlist("S", widgets->treeview, true);
else if (item == get_widget("MenuSetBack"))
new_playlist("s", widgets->treeview, false);
else if (item == get_widget("AddPlaylist0"))
add_to_playlist(widgets->treeview, 0);
else if (item == get_widget("AddPlaylist1"))
add_to_playlist(widgets->treeview, 1);
else if (item == get_widget("AddPlaylist2"))
add_to_playlist(widgets->treeview, 2);
else if (item == get_widget("AddPlaylist3"))
add_to_playlist(widgets->treeview, 3);
else if (item == get_widget("AddPlaylist4"))
add_to_playlist(widgets->treeview, 4);
else if (item == get_widget("AddPlaylist5"))
add_to_playlist(widgets->treeview, 5);
else if (item == get_widget("AddPlaylist6"))
add_to_playlist(widgets->treeview, 6);
else if (item == get_widget("AddPlaylist7"))
add_to_playlist(widgets->treeview, 7);
else if (item == get_widget("AddPlaylist8"))
add_to_playlist(widgets->treeview, 8);
else if (item == get_widget("AddPlaylist9"))
add_to_playlist(widgets->treeview, 9);
}
static gboolean entry_keypress(GtkEntry *entry, GdkEvent *event, gpointer data)
{
string key = gdk_keyval_name(event->key.keyval);
if (key == "Return") {
playlist_focus_treeview();
return TRUE;
}
return FALSE;
}
static void show_menu_widget(const string &name, unsigned int plist_num,
unsigned int deck_size)
{
if (plist_num < deck_size)
gtk_widget_show(get_widget(name));
else
gtk_widget_hide(get_widget(name));
}
static void on_click(GtkTreeView *treeview, GdkEvent *event, gpointer data)
{
unsigned int deck_size = libsaria::deck::size();
if (event->button.button != 3)
return;
show_menu_widget("MenuQueueBack", deck_size, 10);
show_menu_widget("MenuQueueFront", deck_size, 10);
show_menu_widget("MenuSetBack", deck_size, 10);
show_menu_widget("MenuSetFront", deck_size, 10);
show_menu_widget("MenuNewSep", deck_size, 10);
if (deck_size > 0 && deck_size < 10)
gtk_widget_show(get_widget("MenuAddSep"));
else
gtk_widget_hide(get_widget("MenuAddSep"));
show_menu_widget("AddPlaylist0", 0, deck_size);
show_menu_widget("AddPlaylist1", 1, deck_size);
show_menu_widget("AddPlaylist2", 2, deck_size);
show_menu_widget("AddPlaylist3", 3, deck_size);
show_menu_widget("AddPlaylist4", 4, deck_size);
show_menu_widget("AddPlaylist5", 5, deck_size);
show_menu_widget("AddPlaylist6", 6, deck_size);
show_menu_widget("AddPlaylist7", 7, deck_size);
show_menu_widget("AddPlaylist8", 8, deck_size);
show_menu_widget("AddPlaylist9", 9, deck_size);
gtk_menu_popup(GTK_MENU(get_widget("PlaylistMenu")), NULL, NULL, NULL, NULL, event->button.button, event->button.time);
}
static void playlist_close(GtkWidget *button, gpointer data)
{
struct libsaria::Playlist *playlist = (libsaria::Playlist *)data;
libsaria::deck::delete_playlist(playlist);
}
static void playlist_disable(GtkToggleButton *button, gpointer data)
{
struct libsaria::Playlist *playlist = (libsaria::Playlist *)data;
playlist->set_flag(PL_DISABLED, gtk_toggle_button_get_active(button));
}
static void playlist_random(GtkToggleButton *button, gpointer data)
{
struct libsaria::Playlist *playlist = (libsaria::Playlist *)data;
if (playlist == libsaria::library::get_playlist())
libsaria::library::set_random(gtk_toggle_button_get_active(button));
else
playlist->set_flag(PL_RANDOM, gtk_toggle_button_get_active(button));
}
static void playlist_sort(GtkToggleButton *button, gpointer data)
{
struct libsaria::Playlist *playlist = (libsaria::Playlist *)data;
playlist->set_flag(PL_SORTED, gtk_toggle_button_get_active(button));
}
void setup_widgets(struct PlaylistWidgets *widgets, libsaria::Playlist *playlist)
{
unsigned int num_columns = sizeof(types) / sizeof(GType);
GtkTreeSelection *selection;
widgets->playlist = playlist;
widgets->liststore = gtk_list_store_newv(num_columns, types);
widgets->page_box = GTK_BOX(gtk_vbox_new(FALSE, 0));
widgets->treeview = GTK_TREE_VIEW(gtk_tree_view_new());
widgets->filter = gtk_tree_model_filter_new(
GTK_TREE_MODEL(widgets->liststore), NULL);
widgets->size_label = GTK_LABEL(gtk_label_new("0"));
widgets->page_label = GTK_LABEL(gtk_label_new(""));
widgets->entry = GTK_ENTRY(gtk_entry_new());
widgets->filter_text = NULL;
selection = gtk_tree_view_get_selection(widgets->treeview);
gtk_tree_selection_set_mode(selection,GTK_SELECTION_MULTIPLE);
gtk_tree_view_set_model(widgets->treeview, widgets->filter);
gtk_tree_view_set_rules_hint(widgets->treeview, TRUE);
gtk_tree_view_set_enable_search(widgets->treeview, FALSE);
gtk_tree_view_set_tooltip_column(widgets->treeview, 9);
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(widgets->filter),
is_visible, widgets, NULL);
g_signal_connect(widgets->treeview, "row-activated", G_CALLBACK(track_selected), NULL);
g_signal_connect(widgets->treeview, "button-release-event", G_CALLBACK(on_click), NULL);
g_signal_connect(widgets->entry, "changed", G_CALLBACK(do_filter), widgets);
g_signal_connect(widgets->entry, "key-press-event", G_CALLBACK(entry_keypress), widgets);
}
static GtkWidget *setup_close_button(struct PlaylistWidgets *widgets)
{
GtkWidget *close = gtk_button_new();
GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
gtk_button_set_image(GTK_BUTTON(close), image);
gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE);
gtk_widget_set_name(close, "ocarina-small-button");
g_signal_connect(close, "clicked", G_CALLBACK(playlist_close), widgets->playlist);
return close;
}
static GtkWidget *setup_disable_button(struct PlaylistWidgets *widgets)
{
GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_MENU);
widgets->disable = GTK_TOGGLE_BUTTON(gtk_toggle_button_new());
gtk_button_set_image(GTK_BUTTON(widgets->disable), image);
gtk_widget_set_name(GTK_WIDGET(widgets->disable), "ocarina-small-button");
g_signal_connect(GTK_WIDGET(widgets->disable), "toggled", G_CALLBACK(playlist_disable), widgets->playlist);
return GTK_WIDGET(widgets->disable);
}
static GtkWidget *setup_random_button(struct PlaylistWidgets *widgets)
{
GtkWidget *image = gtk_image_new_from_file(lib_file("random.png").c_str());
widgets->random = GTK_TOGGLE_BUTTON(gtk_toggle_button_new());
gtk_button_set_image(GTK_BUTTON(widgets->random), image);
gtk_widget_set_name(GTK_WIDGET(widgets->random), "ocarina-small-button");
gtk_toggle_button_set_active(widgets->random, widgets->playlist->check_flag(PL_RANDOM));
g_signal_connect(GTK_WIDGET(widgets->random), "toggled", G_CALLBACK(playlist_random), widgets->playlist);
return GTK_WIDGET(widgets->random);
}
static GtkWidget *setup_sort_button(struct PlaylistWidgets *widgets)
{
GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU);
widgets->sort = GTK_TOGGLE_BUTTON(gtk_toggle_button_new());
gtk_button_set_image(GTK_BUTTON(widgets->sort), image);
gtk_widget_set_name(GTK_WIDGET(widgets->sort), "ocarina-small-button");
gtk_toggle_button_set_active(widgets->sort, widgets->playlist->check_flag(PL_SORTED));
g_signal_connect(GTK_WIDGET(widgets->sort), "toggled", G_CALLBACK(playlist_sort), widgets->playlist);
return GTK_WIDGET(widgets->sort);
}
static void add_column(GtkTreeView *treeview, const string &title, int index,
GtkTreeViewColumnSizing sizing, unsigned int fixed_width)
{
GtkCellRenderer *cell = gtk_cell_renderer_text_new();
GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(
title.c_str(), cell, "text", index, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_sizing(column, sizing);
gtk_tree_view_column_set_fixed_width(column, fixed_width);
gtk_tree_view_column_set_min_width(column, 1);
gtk_tree_view_column_set_max_width(column, 700);
gtk_tree_view_append_column(treeview, column);
}
void setup_playlist_page(struct PlaylistWidgets *widgets, int flags)
{
GtkWidget *top_box = gtk_hbox_new(FALSE, 0);
GtkWidget *window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
if (flags & CLOSE_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_close_button(widgets), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(top_box), GTK_WIDGET(widgets->entry), TRUE, TRUE, 0);
if (flags & RANDOM_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_random_button(widgets), FALSE, FALSE, 0);
if (flags & SORT_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_sort_button(widgets), FALSE, FALSE, 0);
if (flags & DISABLE_BUTTON)
gtk_box_pack_start(GTK_BOX(top_box), setup_disable_button(widgets), FALSE, FALSE, 0);
gtk_box_pack_start(widgets->page_box, top_box, FALSE, FALSE, 0);
gtk_box_pack_start(widgets->page_box, window, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(widgets->treeview));
add_column(widgets->treeview, "#", 1, GTK_TREE_VIEW_COLUMN_FIXED, 20);
add_column(widgets->treeview, "Title", 2, GTK_TREE_VIEW_COLUMN_FIXED, 300);
add_column(widgets->treeview, "Length", 3, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1);
add_column(widgets->treeview, "Artist", 4, GTK_TREE_VIEW_COLUMN_FIXED, 125);
add_column(widgets->treeview, "Album", 5, GTK_TREE_VIEW_COLUMN_FIXED, 125);
add_column(widgets->treeview, "Year", 6, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1);
add_column(widgets->treeview, "Count", 7, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1);
add_column(widgets->treeview, "Played", 8, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1);
gtk_widget_show_all(GTK_WIDGET(widgets->page_box));
}
void init_playlist()
{
connect_signal("MenuQueueFront", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("MenuSetFront", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("MenuQueueBack", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("MenuSetBack", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist0", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist1", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist2", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist3", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist4", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist5", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist6", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist7", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist8", "activate", G_CALLBACK(on_menu_item), NULL);
connect_signal("AddPlaylist9", "activate", G_CALLBACK(on_menu_item), NULL);
}

View File

@ -1,30 +0,0 @@
#!/bin/bash
APPDIR="$HOME/.ocarina"
if [ "%DEBUG" == "True" ]; then
APPDIR="$APPDIR-debug"
fi
function write_to_pipe
{
pipe=$APPDIR/pipe
if [ -p $pipe ]; then
echo "$*" > $pipe
fi
}
case $1 in
next|pause|play|prev|stop|toggle)
write_to_pipe $1
exit 0
;;
esac
cmd=`which ocarina-$1 2>/dev/null`
args="${@: +2}"
if [ "$cmd" ]; then
$cmd "$args"
else
cmd=`readlink -f $0`
`dirname $cmd`/ocarina-player "$*"
fi

View File

@ -1,18 +0,0 @@
_ocarina()
{
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
cmd="${COMP_WORDS[1]}"
if [ $COMP_CWORD -eq 1 ]; then
opts=`compgen -c "ocarina-" | awk -F "-" '{print $2}'`
opts="$opts next pause play prev stop toggle"
fi
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
}
complete -F _ocarina ocarina

View File

@ -1,203 +0,0 @@
// Copyright (c) 2012 Bryan Schumaker
#include <format.h>
#include <audio.h>
#include <track.h>
#include <prefs.h>
#include <deck.h>
#include <idle.h>
#include <ban.h>
#include "ocarina.h"
#include <sstream>
using namespace std;
static void set_label(const string &name, const string &text, const string &size)
{
GtkWidget *label = get_widget(name);
if (!label)
return;
if (size == "") {
gtk_label_set_text(GTK_LABEL(label), text.c_str());
} else {
char *escaped = g_markup_escape_text(text.c_str(), -1);
string markup = "<span size='" + size + "'>" + escaped + "</span>";
gtk_label_set_markup(GTK_LABEL(label), markup.c_str());
g_free(escaped);
}
}
void update_labels(libsaria::Track *track)
{
set_label("TitleLabel", track->title, "xx-large");
set_label("ArtistLabel", track->artist, "x-large");
set_label("AlbumLabel", track->album, "x-large");
set_label("DurLabel", track->lenstr, "");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(get_widget("BanButton")),
track->banned);
}
void update_buttons(notify_t event)
{
GtkWidget *play, *pause;
play = get_widget("PlayButton");
pause = get_widget("PauseButton");
if (event == PLAYING) {
gtk_widget_show(pause);
gtk_widget_hide(play);
} else {
gtk_widget_show(play);
gtk_widget_hide(pause);
}
}
void update_progress()
{
GtkWidget *label = get_widget("PosLabel");
GtkWidget *progress = get_widget("TrackProgress");
gint64 pos = libsaria::audio::position();
gint64 dur = libsaria::audio::duration() + 1;
gtk_label_set_text(GTK_LABEL(label), libsaria::audio::posstr().c_str());
/*
* This happens when gstreamer's "about-to-finish" signal
* is emitted and we queue up a shorter song before the
* pipeline finishes.
*/
if (pos > dur)
pos = 0;
gtk_range_set_range(GTK_RANGE(progress), 0, dur);
gtk_range_set_value(GTK_RANGE(progress), pos);
}
static void slider_changed(GtkWidget *w, GtkScrollType s, gdouble v, gpointer d)
{
libsaria::audio::seek_to(v);
}
void update_autopause_type(AutoPauseType *type)
{
GtkWidget *button;
if (*type == PS_NONE)
button = get_widget("NoPause");
else
button = get_widget("PauseAfterN");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true);
}
void update_autopause_count(unsigned int *count)
{
gtk_spin_button_set_value(GTK_SPIN_BUTTON(get_widget("PauseCounter")), *count);
}
static void toggle_pause(GtkWidget *b, gpointer d)
{
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b)))
return;
if (b == get_widget("NoPause"))
libsaria::deck::set_pause_type(PS_NONE, 0);
else {
unsigned short count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(get_widget("PauseCounter")));
libsaria::deck::set_pause_type(PS_AFTER_N, count);
}
}
static void counter_changed(GtkWidget *b, GtkScrollType *s, gpointer d)
{
unsigned short count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(get_widget("PauseCounter")));
libsaria::deck::set_pause_type(PS_AFTER_N, count);
}
static void toggle_ban(GtkWidget *b, gpointer d)
{
libsaria::Track *cur = libsaria::current_track();
GtkWidget *ban = get_widget("BanButton");
bool banned = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ban));
if (banned)
gtk_button_set_image(GTK_BUTTON(ban), get_widget("NoImage"));
else
gtk_button_set_image(GTK_BUTTON(ban), get_widget("YesImage"));
if (cur->banned == banned)
return;
cur->set_banned(banned);
if (banned)
libsaria::deck::next();
}
static void toggle_playlist(GtkToggleButton *button, gpointer data)
{
libsaria::Playlist *plist = (libsaria::Playlist *)data;
struct PlaylistWidgets *widgets = find_playlist_widgets(plist);
bool show = gtk_toggle_button_get_active(button);
if (show)
gtk_widget_show(GTK_WIDGET(widgets->page_box));
else
gtk_widget_hide(GTK_WIDGET(widgets->page_box));
if (GTK_WIDGET(button) == get_widget("ShowRecent"))
libsaria::prefs::set("ocarina.showrecent", show);
else if (GTK_WIDGET(button) == get_widget("ShowBanned"))
libsaria::prefs::set("ocarina.showbanned", show);
}
bool update_idle_bar(int size)
{
GtkWidget *idle = get_widget("IdleProgress");
if (size == 0) {
gtk_widget_hide(idle);
return false;
}
gtk_widget_show(idle);
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(idle),
libsaria::idle::progress());
return true;
}
void update_length_label(libsaria::Playlist *playlist)
{
stringstream stream;
unsigned int size = playlist->get_size();
GtkWidget *label = get_widget("LengthLabel");
if (!label)
return;
stream << size << " song";
if (size != 1)
stream << "s";
if (size != 0)
stream << ": " << libsaria::length_string(playlist->get_length());
gtk_label_set_text(GTK_LABEL(label), stream.str().c_str());
}
void init_plist_visible_button(const string &button_name, const string &pref,
libsaria::Playlist *plist)
{
bool show = libsaria::prefs::init(pref, true);
GtkToggleButton *button = GTK_TOGGLE_BUTTON(get_widget(button_name));
gtk_toggle_button_set_active(button, show);
connect_signal(button_name, "toggled", G_CALLBACK(toggle_playlist), plist);
toggle_playlist(button, (void *)plist);
}
void init_status()
{
connect_signal("TrackProgress", "change-value", G_CALLBACK(slider_changed), NULL);
connect_signal("NoPause", "toggled", G_CALLBACK(toggle_pause), NULL);
connect_signal("PauseAfterN", "toggled", G_CALLBACK(toggle_pause), NULL);
connect_signal("PauseCounter", "value-changed", G_CALLBACK(counter_changed), NULL);
connect_signal("BanButton", "toggled", G_CALLBACK(toggle_ban), NULL);
connect_signal("ShowBanned", "toggled", G_CALLBACK(toggle_playlist), libsaria::ban::get_banned_plist());
init_plist_visible_button("ShowRecent", "ocarina.showrecent", libsaria::deck::get_recent_plist());
init_plist_visible_button("ShowBanned", "ocarina.showbanned", libsaria::ban::get_banned_plist());
}

View File

@ -1,283 +0,0 @@
// Copyright (c) 2011 Bryan Schumaker
#include <libsaria.h>
#include <library.h>
#include <print.h>
#include <deck.h>
#include <ban.h>
#include "ocarina.h"
#include <sstream>
using namespace std;
static GtkNotebook *tabs;
static PlaylistWidgets library_widgets;
static PlaylistWidgets recent_widgets;
static PlaylistWidgets banned_widgets;
static list<struct PlaylistWidgets *> dynamic_widgets;
struct PlaylistWidgets *find_page_widgets(GtkWidget *page)
{
list<struct PlaylistWidgets *>::iterator it;
for (it = dynamic_widgets.begin(); it != dynamic_widgets.end(); it++) {
if (GTK_WIDGET((*it)->page_box) == page)
return *it;
}
return NULL;
}
struct PlaylistWidgets *find_playlist_widgets(libsaria::Playlist *plist)
{
list<struct PlaylistWidgets *>::iterator it;
if (plist == library_widgets.playlist)
return &library_widgets;
else if (plist == recent_widgets.playlist)
return &recent_widgets;
else if (plist == banned_widgets.playlist)
return &banned_widgets;
for (it = dynamic_widgets.begin(); it != dynamic_widgets.end(); it++) {
if ((*it)->playlist == plist)
return *it;
}
return NULL;
}
static struct PlaylistWidgets *find_nth_widgets(unsigned int n)
{
unsigned int size = dynamic_widgets.size();
/* Dynamic playlists */
if (n < size)
return find_playlist_widgets(libsaria::deck::get_playlist(n));
switch (n - size) {
case 0:
return &library_widgets;
case 1:
return &recent_widgets;
case 2:
return &banned_widgets;
}
return NULL;
}
struct PlaylistWidgets *current_widgets()
{
return find_nth_widgets(gtk_notebook_get_current_page(tabs));
}
libsaria::Playlist *current_playlist()
{
return current_widgets()->playlist;
}
void playlist_switch_to(string &key)
{
unsigned int size = dynamic_widgets.size();
if (key == "l")
gtk_notebook_set_current_page(tabs, size);
else if (key == "r")
gtk_notebook_set_current_page(tabs, size + 1);
else if (key == "b")
gtk_notebook_set_current_page(tabs, size + 2);
}
void playlist_switch_to_n(unsigned int n)
{
unsigned int size = dynamic_widgets.size();
if (size <= n)
return;
gtk_notebook_set_current_page(tabs, n);
}
bool playlist_entry_focused()
{
return gtk_widget_is_focus(GTK_WIDGET(current_widgets()->entry));
}
void playlist_focus_entry()
{
gtk_widget_grab_focus(GTK_WIDGET(current_widgets()->entry));
}
bool playlist_key_press(string &key)
{
GtkTreeView *treeview = current_widgets()->treeview;
if (gtk_widget_is_focus(GTK_WIDGET(treeview)))
return playlist_key_pressed(treeview, key);
return false;
}
void playlist_focus_treeview()
{
GtkTreePath *path;
GtkTreeView *treeview = current_widgets()->treeview;
gtk_widget_grab_focus(GTK_WIDGET(treeview));
gtk_tree_view_get_cursor(treeview, &path, NULL);
if (path == NULL)
return;
gtk_tree_view_set_cursor(treeview, path, NULL, FALSE);
gtk_tree_path_free(path);
}
static void on_switch_page(GtkNotebook *tabs, gpointer page,
unsigned int page_num, gpointer data)
{
struct PlaylistWidgets *widgets = find_nth_widgets(page_num);
update_length_label(widgets->playlist);
}
static void on_page_reordered(GtkWidget *notebook, GtkWidget *page, guint num, gpointer d)
{
struct PlaylistWidgets *widgets = find_page_widgets(page);
unsigned int n = libsaria::deck::move_playlist(widgets->playlist, num);
if (n != num)
gtk_notebook_reorder_child(tabs, page, n);
}
static void on_click_open(GtkWidget *b, gpointer d)
{
string file = run_chooser("FileChooser");
if (file != "") {
println("Playing file: " + file);
libsaria::play_outside_song(file);
}
}
static void init_tab_action()
{
GtkWidget *box = gtk_vbox_new(FALSE, 0);
GtkWidget *img = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
GtkWidget *open = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(open), img);
g_signal_connect(open, "clicked", G_CALLBACK(on_click_open), NULL);
gtk_box_pack_start(GTK_BOX(box), open, false, false, 0);
gtk_box_pack_start(GTK_BOX(box), get_widget("BanButton"), false, false, 0);
gtk_widget_show_all(box);
gtk_notebook_set_action_widget(tabs, box, GTK_PACK_END);
}
static void add_page(GtkWidget *page, GtkWidget *tab_label, int page_num)
{
gtk_notebook_insert_page(tabs, page, tab_label, page_num);
}
static void make_tab_label(const string &name, struct PlaylistWidgets *widgets)
{
GtkWidget *box = gtk_vbox_new(FALSE, 0);
GtkWidget *label = gtk_label_new(name.c_str());
widgets->tab_box = GTK_BOX(gtk_hbox_new(FALSE, 0));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
gtk_misc_set_alignment(GTK_MISC(widgets->size_label), 1.0, 0.0);
gtk_box_pack_start(widgets->tab_box, GTK_WIDGET(widgets->page_label), FALSE, FALSE, 0);
gtk_box_pack_start(widgets->tab_box, box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(widgets->size_label), FALSE, FALSE, 0);
gtk_widget_show_all(GTK_WIDGET(widgets->tab_box));
}
static void init_page(const string &name, struct PlaylistWidgets *widgets,
libsaria::Playlist *playlist, int page_num, unsigned int flags)
{
setup_widgets(widgets, playlist);
setup_playlist_page(widgets, flags);
make_tab_label(name, widgets);
add_page(GTK_WIDGET(widgets->page_box), GTK_WIDGET(widgets->tab_box), page_num);
}
void init_tabs()
{
tabs = GTK_NOTEBOOK(get_widget("PlaylistTabs"));
init_tab_action();
init_page("Library", &library_widgets, libsaria::library::get_playlist(), -1, RANDOM_BUTTON);
init_page("Recent", &recent_widgets, libsaria::deck::get_recent_plist(), -1, NO_EXTRA_WIDGETS);
init_page("Banned", &banned_widgets, libsaria::ban::get_banned_plist(), -1, NO_EXTRA_WIDGETS);
connect_signal("PlaylistTabs", "switch-page", G_CALLBACK(on_switch_page), NULL);
connect_signal("PlaylistTabs", "page-reordered", G_CALLBACK(on_page_reordered), NULL);
}
static void new_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = new struct PlaylistWidgets;
dynamic_widgets.push_back(widgets);
init_page("Playlist", widgets, playlist,
libsaria::deck::get_playlist_index(playlist),
CLOSE_BUTTON | DISABLE_BUTTON | RANDOM_BUTTON | SORT_BUTTON);
gtk_notebook_set_tab_reorderable(tabs, GTK_WIDGET(widgets->page_box), true);
}
static void delete_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
int page_num = gtk_notebook_page_num(tabs, GTK_WIDGET(widgets->page_box));
int cur_page = gtk_notebook_get_current_page(tabs);
if (cur_page == page_num)
gtk_notebook_set_current_page(tabs, cur_page + 1);
dynamic_widgets.remove(widgets);
delete widgets;
gtk_notebook_remove_page(tabs, page_num);
}
static void renumber_playlist(libsaria::Playlist *playlist)
{
stringstream s;
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
s << "<span size='x-large'>" << playlist->get_number() << " </span>";
gtk_label_set_markup(widgets->page_label, s.str().c_str());
gtk_notebook_reorder_child(tabs, GTK_WIDGET(widgets->page_box),
playlist->get_number());
}
static void disable_playlist(libsaria::Playlist *playlist)
{
bool enabled = !playlist->check_flag(PL_DISABLED);
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
if (widgets) {
gtk_toggle_button_set_active(widgets->disable, !enabled);
gtk_widget_set_sensitive(GTK_WIDGET(widgets->treeview), enabled);
gtk_widget_set_sensitive(GTK_WIDGET(widgets->tab_box), enabled);
}
}
static void random_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
if (widgets)
gtk_toggle_button_set_active(widgets->random, playlist->check_flag(PL_RANDOM));
}
static void sort_playlist(libsaria::Playlist *playlist)
{
struct PlaylistWidgets *widgets = find_playlist_widgets(playlist);
if (widgets)
gtk_toggle_button_set_active(widgets->sort, playlist->check_flag(PL_SORTED));
}
void update_tabs(notify_t event, libsaria::Playlist *playlist)
{
if (event == PLAYLIST_NEW)
new_playlist(playlist);
else if (event == PLAYLIST_DELETE)
delete_playlist(playlist);
else if (event == PLAYLIST_CHANGED) {
disable_playlist(playlist);
random_playlist(playlist);
sort_playlist(playlist);
} else if (event == PLAYLIST_RENUMBER)
renumber_playlist(playlist);
}

View File

@ -1,110 +0,0 @@
// Copyright (c) 2011 Bryan Schumaker
#include <version.h>
#include <audio.h>
#include <prefs.h>
#include "ocarina.h"
static int old_w, old_h;
static bool ignore_configure_event = false;
static gboolean configure(GtkWidget *widget, GdkEvent *event, gpointer data)
{
int w = event->configure.width;
int h = event->configure.height;
int cur_w = libsaria::prefs::get("ocarina.window.w");
int cur_h = libsaria::prefs::get("ocarina.window.h");
if (ignore_configure_event == true) {
ignore_configure_event = false;
return FALSE;
}
if (w != cur_w)
libsaria::prefs::set("ocarina.window.w", w);
if (h != cur_h)
libsaria::prefs::set("ocarina.window.h", h);
return FALSE;
}
static void window_state(GtkWidget *widget, GdkEvent *event, gpointer data)
{
bool maximized = libsaria::prefs::get("ocarina.window.maximized");
if (!(event->window_state.changed_mask & GDK_WINDOW_STATE_MAXIMIZED))
return;
maximized = event->window_state.new_window_state & GDK_WINDOW_STATE_MAXIMIZED;
println("Maximization changed to: %d", maximized);
libsaria::prefs::set("ocarina.window.maximized", maximized);
ignore_configure_event = true;
if (maximized) {
println("Restoring old (w,h): (%d, %d)", old_w, old_h);
libsaria::prefs::set("ocarina.window.w", old_w);
libsaria::prefs::set("ocarina.window.h", old_h);
}
}
static gboolean key_pressed(GtkWindow *window, GdkEvent *event, gpointer data)
{
string key = gdk_keyval_name(event->key.keyval);
if (key.substr(0, 3) == "KP_")
key = key.substr(3);
if (playlist_key_press(key))
return TRUE;
if (key == "Escape") {
gtk_window_set_focus(window, NULL);
return TRUE;
}
if (playlist_entry_focused())
return FALSE;
/*
* TODO: something for banning / unbanning songs
* something for incrementing / decrementing the pause after N count
*/
if (key == "b" || key == "l" || key == "r") {
playlist_switch_to(key);
gtk_window_set_focus(window, NULL);
} else if (key == "j" || key == "k")
playlist_focus_treeview();
else if (key >= "0" && key <= "9")
playlist_switch_to_n(atoi(key.c_str()));
else if (key == "n")
libsaria::deck::next();
else if (key == "N")
libsaria::deck::prev();
else if (key == "slash")
playlist_focus_entry();
else if (key == "space")
libsaria::audio::toggle_play();
else if (key == "Return")
playlist_focus_treeview();
else {
println("Unhandled key: " + key);
return FALSE;
}
return TRUE;
}
void init_window()
{
GtkWindow *window = GTK_WINDOW(get_widget("MainWindow"));
gtk_window_set_title(window, ("Ocarina " + vers_str()).c_str());
gtk_window_set_icon_from_file(window, lib_file("ocarina.png").c_str(), NULL);
old_h = libsaria::prefs::init("ocarina.window.h", 600);
old_w = libsaria::prefs::init("ocarina.window.w", 900);
gtk_window_resize(window, old_w, old_h);
if (libsaria::prefs::init("ocarina.window.maximized", false) == true)
gtk_window_maximize(window);
connect_signal("MainWindow", "destroy", gtk_main_quit, NULL);
connect_signal("MainWindow", "configure-event", G_CALLBACK(configure), NULL);
connect_signal("MainWindow", "window-state-event", G_CALLBACK(window_state), NULL);
connect_signal("MainWindow", "key-press-event", G_CALLBACK(key_pressed), NULL);
}