Abstract common features into ReplicantView
This should make it easier to make consistent replicants of the same style. Also adds APP_SIGNATURE and APP_NAME defines.
This commit is contained in:
parent
a1b5bf42db
commit
c91b665253
5
Makefile
5
Makefile
|
@ -36,6 +36,7 @@ SRCS = src/App.cpp \
|
||||||
src/LyricsView.cpp \
|
src/LyricsView.cpp \
|
||||||
src/MainWindow.cpp \
|
src/MainWindow.cpp \
|
||||||
src/MediaPlayer.cpp \
|
src/MediaPlayer.cpp \
|
||||||
|
src/ReplicantView.cpp \
|
||||||
src/Song.cpp
|
src/Song.cpp
|
||||||
|
|
||||||
# Specify the resource definition files to use. Full or relative paths can be
|
# Specify the resource definition files to use. Full or relative paths can be
|
||||||
|
@ -97,7 +98,9 @@ LOCALES =
|
||||||
# use. For example, setting DEFINES to "DEBUG=1" will cause the compiler
|
# use. For example, setting DEFINES to "DEBUG=1" will cause the compiler
|
||||||
# option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" would pass
|
# option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" would pass
|
||||||
# "-DDEBUG" on the compiler's command line.
|
# "-DDEBUG" on the compiler's command line.
|
||||||
DEFINES =
|
DEFINES = BUILD_DATE="\"$(shell date +"%Y-%m-%d %H:%M")\"" \
|
||||||
|
APP_NAME="\"$(NAME)"\" \
|
||||||
|
APP_SIGNATURE="\"$(APP_MIME_SIG)"\"
|
||||||
|
|
||||||
# Specify the warning level. Either NONE (suppress all warnings),
|
# Specify the warning level. Either NONE (suppress all warnings),
|
||||||
# ALL (enable all warnings), or leave blank (enable default warnings).
|
# ALL (enable all warnings), or leave blank (enable default warnings).
|
||||||
|
|
21
src/App.cpp
21
src/App.cpp
|
@ -5,32 +5,15 @@
|
||||||
|
|
||||||
#include "App.h"
|
#include "App.h"
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
|
|
||||||
|
|
||||||
BString
|
|
||||||
get_string_mediaplayer(const char* attribute)
|
|
||||||
{
|
|
||||||
BMessage message, reply;
|
|
||||||
message.what = B_GET_PROPERTY;
|
|
||||||
message.AddSpecifier(attribute);
|
|
||||||
message.AddSpecifier("Window", 0);
|
|
||||||
BMessenger("application/x-vnd.Haiku-MediaPlayer").SendMessage(&message, &reply);
|
|
||||||
|
|
||||||
BString result;
|
|
||||||
reply.FindString("result", &result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
App::App()
|
App::App()
|
||||||
:
|
:
|
||||||
BApplication("application/x-vnd.mediamonitor")
|
BApplication(APP_SIGNATURE)
|
||||||
{
|
{
|
||||||
MainWindow* win = new MainWindow();
|
MainWindow* win = new MainWindow();
|
||||||
win->SetPulseRate(5000000);
|
win->SetPulseRate(2500000);
|
||||||
win->Show();
|
win->Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,32 +14,20 @@
|
||||||
|
|
||||||
CoverView::CoverView(BRect frame)
|
CoverView::CoverView(BRect frame)
|
||||||
:
|
:
|
||||||
BView(frame, "Cover", B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_TRANSPARENT_BACKGROUND | B_PULSE_NEEDED)
|
ReplicantView(frame, "Cover", B_FOLLOW_LEFT)
|
||||||
{
|
{
|
||||||
BRect dragRect(0, 0, 10, frame.Height());
|
|
||||||
fDragger = new BDragger(dragRect, this,
|
|
||||||
B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW);
|
|
||||||
fDragger->SetViewColor(B_TRANSPARENT_COLOR);
|
|
||||||
AddChild(fDragger);
|
|
||||||
|
|
||||||
fMediaPlayer = new MediaPlayer(0);
|
|
||||||
|
|
||||||
fCover = NULL;
|
|
||||||
SetViewColor(B_TRANSPARENT_COLOR);
|
SetViewColor(B_TRANSPARENT_COLOR);
|
||||||
|
fCover = NULL;
|
||||||
Pulse();
|
Pulse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CoverView::CoverView(BMessage* data)
|
CoverView::CoverView(BMessage* data)
|
||||||
:
|
:
|
||||||
BView(data)
|
ReplicantView(data)
|
||||||
{
|
{
|
||||||
BMessage mediaplayer;
|
|
||||||
data->FindMessage("mediaplayer", &mediaplayer);
|
|
||||||
fMediaPlayer = new MediaPlayer(&mediaplayer);
|
|
||||||
|
|
||||||
fCover = NULL;
|
|
||||||
SetViewColor(B_TRANSPARENT_COLOR);
|
SetViewColor(B_TRANSPARENT_COLOR);
|
||||||
|
fCover = NULL;
|
||||||
Pulse();
|
Pulse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,13 +35,10 @@ CoverView::CoverView(BMessage* data)
|
||||||
status_t
|
status_t
|
||||||
CoverView::Archive(BMessage* data, bool deep) const
|
CoverView::Archive(BMessage* data, bool deep) const
|
||||||
{
|
{
|
||||||
status_t status = BView::Archive(data, deep);
|
status_t status = ReplicantView::Archive(data, deep);
|
||||||
|
|
||||||
BMessage mediaPlayer;
|
|
||||||
fMediaPlayer->Archive(&mediaPlayer);
|
|
||||||
data->AddMessage("mediaplayer", &mediaPlayer);
|
|
||||||
data->AddString("class", "CoverView");
|
data->AddString("class", "CoverView");
|
||||||
data->AddString("add_on", "application/x-vnd.mediamonitor");
|
data->AddString("add_on", APP_SIGNATURE);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,19 +56,23 @@ void
|
||||||
CoverView::Pulse()
|
CoverView::Pulse()
|
||||||
{
|
{
|
||||||
Song song;
|
Song song;
|
||||||
|
// No song playing
|
||||||
if (fMediaPlayer->CurrentItem(&song, false) == false) {
|
if (fMediaPlayer->CurrentItem(&song, false) == false) {
|
||||||
if (fCurrentSong.InitCheck()) {
|
if (fCurrentSong.InitCheck()) {
|
||||||
fCurrentSong = song;
|
fCurrentSong = song;
|
||||||
delete fCover;
|
delete fCover;
|
||||||
fCover = NULL;
|
fCover = NULL;
|
||||||
Invalidate();
|
|
||||||
|
SetInactive(true);
|
||||||
}
|
}
|
||||||
|
// New song
|
||||||
} else if (song != fCurrentSong) {
|
} else if (song != fCurrentSong) {
|
||||||
fCurrentSong = song;
|
fCurrentSong = song;
|
||||||
if (fCover != NULL)
|
if (fCover != NULL)
|
||||||
delete fCover;
|
delete fCover;
|
||||||
fCover = song.Cover();
|
fCover = song.Cover();
|
||||||
Invalidate();
|
|
||||||
|
SetInactive(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +81,6 @@ void
|
||||||
CoverView::Draw(BRect updateRect)
|
CoverView::Draw(BRect updateRect)
|
||||||
{
|
{
|
||||||
BView::Draw(updateRect);
|
BView::Draw(updateRect);
|
||||||
|
|
||||||
if (fCover != NULL && fCover->IsValid())
|
if (fCover != NULL && fCover->IsValid())
|
||||||
DrawBitmap(fCover, Bounds());
|
DrawBitmap(fCover, Bounds());
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,15 +5,14 @@
|
||||||
#ifndef COVERVIEW_H
|
#ifndef COVERVIEW_H
|
||||||
#define COVERVIEW_H
|
#define COVERVIEW_H
|
||||||
|
|
||||||
#include <View.h>
|
#include "ReplicantView.h"
|
||||||
|
|
||||||
#include "Song.h"
|
#include "Song.h"
|
||||||
|
|
||||||
class BDragger;
|
class BDragger;
|
||||||
class MediaPlayer;
|
class MediaPlayer;
|
||||||
|
|
||||||
|
|
||||||
class CoverView : public BView {
|
class CoverView : public ReplicantView {
|
||||||
public:
|
public:
|
||||||
CoverView(BRect frame);
|
CoverView(BRect frame);
|
||||||
CoverView(BMessage* archive);
|
CoverView(BMessage* archive);
|
||||||
|
@ -28,10 +27,7 @@ public:
|
||||||
private:
|
private:
|
||||||
void _Init(BRect frame);
|
void _Init(BRect frame);
|
||||||
|
|
||||||
MediaPlayer* fMediaPlayer;
|
|
||||||
Song fCurrentSong;
|
Song fCurrentSong;
|
||||||
|
|
||||||
BDragger* fDragger;
|
|
||||||
BBitmap* fCover;
|
BBitmap* fCover;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,7 @@
|
||||||
|
|
||||||
#include "LyricsView.h"
|
#include "LyricsView.h"
|
||||||
|
|
||||||
#include <Dragger.h>
|
|
||||||
#include <MenuItem.h>
|
#include <MenuItem.h>
|
||||||
#include <Messenger.h>
|
|
||||||
#include <PopUpMenu.h>
|
#include <PopUpMenu.h>
|
||||||
#include <ScrollView.h>
|
#include <ScrollView.h>
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
@ -35,7 +33,7 @@ LyricsTextView::Archive(BMessage* data, bool deep) const
|
||||||
{
|
{
|
||||||
status_t status = BTextView::Archive(data, deep);
|
status_t status = BTextView::Archive(data, deep);
|
||||||
data->AddString("class", "LyricsTextView");
|
data->AddString("class", "LyricsTextView");
|
||||||
data->AddString("add_on", "application/x-vnd.mediamonitor");
|
data->AddString("add_on", APP_SIGNATURE);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,14 +63,8 @@ LyricsTextView::MouseDown(BPoint where)
|
||||||
|
|
||||||
LyricsView::LyricsView(BRect frame)
|
LyricsView::LyricsView(BRect frame)
|
||||||
:
|
:
|
||||||
BView(frame, "Lyrics", B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_TRANSPARENT_BACKGROUND | B_PULSE_NEEDED)
|
ReplicantView(frame, "Lyrics", B_FOLLOW_LEFT)
|
||||||
{
|
{
|
||||||
BRect dragRect(0, 0, 10, frame.Height());
|
|
||||||
fDragger = new BDragger(dragRect, this,
|
|
||||||
B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW);
|
|
||||||
fDragger->SetViewColor(B_TRANSPARENT_COLOR);
|
|
||||||
AddChild(fDragger);
|
|
||||||
|
|
||||||
BRect textRect(0, 0, Bounds().Width(), Bounds().Height() - 10);
|
BRect textRect(0, 0, Bounds().Width(), Bounds().Height() - 10);
|
||||||
fTextView = new LyricsTextView(textRect, "lyricsText", textRect,
|
fTextView = new LyricsTextView(textRect, "lyricsText", textRect,
|
||||||
B_FOLLOW_ALL, B_WILL_DRAW);
|
B_FOLLOW_ALL, B_WILL_DRAW);
|
||||||
|
@ -85,41 +77,28 @@ LyricsView::LyricsView(BRect frame)
|
||||||
AddChild(fScrollView);
|
AddChild(fScrollView);
|
||||||
|
|
||||||
fAutoScroll = false;
|
fAutoScroll = false;
|
||||||
fTransparentInactivity = true;
|
|
||||||
fTransparentDragger = false;
|
|
||||||
|
|
||||||
fFgColor = ui_color(B_PANEL_TEXT_COLOR);
|
fFgColor = ui_color(B_PANEL_TEXT_COLOR);
|
||||||
fBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
|
fBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
|
||||||
|
|
||||||
fMediaPlayer = new MediaPlayer(0);
|
|
||||||
|
|
||||||
_Init(frame);
|
_Init(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LyricsView::LyricsView(BMessage* data)
|
LyricsView::LyricsView(BMessage* data)
|
||||||
:
|
:
|
||||||
BView(data)
|
ReplicantView(data)
|
||||||
{
|
{
|
||||||
fAutoScroll = false;
|
fAutoScroll = false;
|
||||||
fTransparentInactivity = true;
|
|
||||||
fTransparentDragger = false;
|
|
||||||
|
|
||||||
fFgColor = ui_color(B_PANEL_TEXT_COLOR);
|
fFgColor = ui_color(B_PANEL_TEXT_COLOR);
|
||||||
fBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
|
fBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
|
||||||
|
|
||||||
fTextView = dynamic_cast<LyricsTextView*>(FindView("lyricsText"));
|
fTextView = dynamic_cast<LyricsTextView*>(FindView("lyricsText"));
|
||||||
fScrollView = dynamic_cast<BScrollView*>(FindView("scrollView"));
|
fScrollView = dynamic_cast<BScrollView*>(FindView("scrollView"));
|
||||||
fDragger = dynamic_cast<BDragger*>(FindView("_dragger_"));
|
|
||||||
data->FindColor("background_color", &fBgColor);
|
data->FindColor("background_color", &fBgColor);
|
||||||
data->FindColor("foreground_color", &fFgColor);
|
data->FindColor("foreground_color", &fFgColor);
|
||||||
data->FindBool("autoscroll", &fAutoScroll);
|
data->FindBool("autoscroll", &fAutoScroll);
|
||||||
data->FindBool("transparent_inactivity", &fTransparentInactivity);
|
|
||||||
data->FindBool("transparent_dragger", &fTransparentDragger);
|
|
||||||
|
|
||||||
BMessage mediaplayer;
|
|
||||||
data->FindMessage("mediaplayer", &mediaplayer);
|
|
||||||
fMediaPlayer = new MediaPlayer(&mediaplayer);
|
|
||||||
|
|
||||||
_Init(Frame());
|
_Init(Frame());
|
||||||
}
|
}
|
||||||
|
@ -128,20 +107,14 @@ LyricsView::LyricsView(BMessage* data)
|
||||||
status_t
|
status_t
|
||||||
LyricsView::Archive(BMessage* data, bool deep) const
|
LyricsView::Archive(BMessage* data, bool deep) const
|
||||||
{
|
{
|
||||||
status_t status = BView::Archive(data, deep);
|
status_t status = ReplicantView::Archive(data, deep);
|
||||||
|
|
||||||
BMessage mediaPlayer;
|
|
||||||
fMediaPlayer->Archive(&mediaPlayer);
|
|
||||||
data->AddMessage("mediaplayer", &mediaPlayer);
|
|
||||||
data->AddColor("background_color", fBgColor);
|
data->AddColor("background_color", fBgColor);
|
||||||
data->AddColor("foreground_color", fFgColor);
|
data->AddColor("foreground_color", fFgColor);
|
||||||
data->AddBool("autoscroll", fAutoScroll);
|
data->AddBool("autoscroll", fAutoScroll);
|
||||||
data->AddBool("transparent_inactivity", fTransparentInactivity);
|
|
||||||
data->AddBool("transparent_dragger", fTransparentDragger);
|
|
||||||
|
|
||||||
|
|
||||||
data->AddString("class", "LyricsView");
|
data->AddString("class", "LyricsView");
|
||||||
data->AddString("add_on", "application/x-vnd.mediamonitor");
|
data->AddString("add_on", APP_SIGNATURE);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,19 +152,8 @@ LyricsView::MessageReceived(BMessage* msg)
|
||||||
case LYRICS_AUTO_SCROLL:
|
case LYRICS_AUTO_SCROLL:
|
||||||
fAutoScroll = !fAutoScroll;
|
fAutoScroll = !fAutoScroll;
|
||||||
break;
|
break;
|
||||||
case LYRICS_TRANSPARENTLY_INACTIVE:
|
|
||||||
case LYRICS_TRANSPARENTLY_DRAG: {
|
|
||||||
if (msg->what == LYRICS_TRANSPARENTLY_INACTIVE)
|
|
||||||
fTransparentInactivity = !fTransparentInactivity;
|
|
||||||
if (msg->what == LYRICS_TRANSPARENTLY_DRAG)
|
|
||||||
fTransparentDragger = !fTransparentDragger;
|
|
||||||
|
|
||||||
if (fCurrentSong.InitCheck() == false)
|
|
||||||
_ClearText();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
BView::MessageReceived(msg);
|
ReplicantView::MessageReceived(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,19 +163,22 @@ void
|
||||||
LyricsView::Pulse()
|
LyricsView::Pulse()
|
||||||
{
|
{
|
||||||
Song song;
|
Song song;
|
||||||
|
// No song
|
||||||
if (fMediaPlayer->CurrentItem(&song, fAutoScroll) == false) {
|
if (fMediaPlayer->CurrentItem(&song, fAutoScroll) == false) {
|
||||||
if (fCurrentSong.InitCheck()) {
|
if (fCurrentSong.InitCheck()) {
|
||||||
fCurrentSong = song;
|
fCurrentSong = song;
|
||||||
_ClearText();
|
SetInactive(true);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// New song
|
||||||
if (song != fCurrentSong) {
|
if (song != fCurrentSong) {
|
||||||
fCurrentSong = song;
|
fCurrentSong = song;
|
||||||
BString lyrics;
|
BString lyrics;
|
||||||
song.Lyrics(&lyrics);
|
song.Lyrics(&lyrics);
|
||||||
_SetText(lyrics.String());
|
fTextView->SetText(lyrics.String());
|
||||||
|
SetInactive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fAutoScroll) {
|
if (fAutoScroll) {
|
||||||
|
@ -224,59 +189,66 @@ LyricsView::Pulse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
BPopUpMenu*
|
||||||
LyricsView::MouseDown(BPoint where)
|
LyricsView::RightClickPopUp(BPopUpMenu* menu)
|
||||||
{
|
{
|
||||||
uint32 buttons = 0;
|
if (menu == NULL)
|
||||||
Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
menu = new BPopUpMenu("rightClickPopUp");
|
||||||
|
|
||||||
if (buttons & B_SECONDARY_MOUSE_BUTTON)
|
BMenuItem* copy =
|
||||||
_RightClickPopUp()->Go(ConvertToScreen(where), true, false, true);
|
new BMenuItem("Copy", new BMessage(B_COPY), 'C', B_COMMAND_KEY);
|
||||||
|
|
||||||
|
int32 start = -1, end = -1;
|
||||||
|
fTextView->GetSelection(&start, &end);
|
||||||
|
|
||||||
|
copy->SetEnabled(start >= 0 && end > 0);
|
||||||
|
copy->SetTarget(fTextView);
|
||||||
|
menu->AddItem(copy);
|
||||||
|
|
||||||
|
BMenuItem* selectAll = new BMenuItem("Select all",
|
||||||
|
new BMessage(B_SELECT_ALL), 'A', B_COMMAND_KEY);
|
||||||
|
selectAll->SetTarget(fTextView);
|
||||||
|
menu->AddItem(selectAll);
|
||||||
|
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
|
BMenuItem* autoScroll = new BMenuItem("Auto-scroll",
|
||||||
|
new BMessage(LYRICS_AUTO_SCROLL));
|
||||||
|
autoScroll->SetMarked(fAutoScroll);
|
||||||
|
autoScroll->SetTarget(this);
|
||||||
|
menu->AddItem(autoScroll);
|
||||||
|
|
||||||
|
return ReplicantView::RightClickPopUp(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
LyricsView::SetInactive(bool inactive)
|
||||||
|
{
|
||||||
|
if (inactive && fTransparentInactivity && !fScrollView->IsHidden())
|
||||||
|
fScrollView->Hide();
|
||||||
|
else if (!inactive && fScrollView->IsHidden())
|
||||||
|
fScrollView->Show();
|
||||||
|
|
||||||
|
if (inactive) {
|
||||||
|
fTextView->SetText("No lyrics to display!");
|
||||||
|
fTextView->SetAlignment(B_ALIGN_CENTER);
|
||||||
|
} else
|
||||||
|
fTextView->SetAlignment(B_ALIGN_LEFT);
|
||||||
|
|
||||||
|
ReplicantView::SetInactive(inactive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LyricsView::_Init(BRect frame)
|
LyricsView::_Init(BRect frame)
|
||||||
{
|
{
|
||||||
_ClearText();
|
SetInactive(true);
|
||||||
_UpdateColors();
|
_UpdateColors();
|
||||||
Pulse();
|
Pulse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
LyricsView::_SetText(const char* text)
|
|
||||||
{
|
|
||||||
if (fScrollView->IsHidden())
|
|
||||||
fScrollView->Show();
|
|
||||||
if (fDragger->IsHidden())
|
|
||||||
fDragger->Show();
|
|
||||||
|
|
||||||
fTextView->SetText(text);
|
|
||||||
fTextView->SetAlignment(B_ALIGN_LEFT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
LyricsView::_ClearText()
|
|
||||||
{
|
|
||||||
if (fTransparentInactivity) {
|
|
||||||
if (fScrollView->IsHidden())
|
|
||||||
fScrollView->Hide();
|
|
||||||
if (fDragger->IsHidden() && fTransparentDragger)
|
|
||||||
fDragger->Hide();
|
|
||||||
} else {
|
|
||||||
if (fScrollView->IsHidden())
|
|
||||||
fScrollView->Show();
|
|
||||||
if (fDragger->IsHidden())
|
|
||||||
fDragger->Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
fTextView->SetText("No lyrics to display!");
|
|
||||||
fTextView->SetAlignment(B_ALIGN_CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LyricsView::_UpdateColors()
|
LyricsView::_UpdateColors()
|
||||||
{
|
{
|
||||||
|
@ -299,53 +271,6 @@ LyricsView::_UpdateColors()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BPopUpMenu*
|
|
||||||
LyricsView::_RightClickPopUp()
|
|
||||||
{
|
|
||||||
BPopUpMenu* menu = new BPopUpMenu("rightClickPopUp");
|
|
||||||
menu->SetRadioMode(false);
|
|
||||||
|
|
||||||
BMenuItem* copy =
|
|
||||||
new BMenuItem("Copy", new BMessage(B_COPY), 'C', B_COMMAND_KEY);
|
|
||||||
|
|
||||||
int32 start = -1, end = -1;
|
|
||||||
fTextView->GetSelection(&start, &end);
|
|
||||||
|
|
||||||
copy->SetEnabled(start >= 0 && end > 0);
|
|
||||||
copy->SetTarget(fTextView);
|
|
||||||
menu->AddItem(copy);
|
|
||||||
|
|
||||||
BMenuItem* selectAll = new BMenuItem("Select all",
|
|
||||||
new BMessage(B_SELECT_ALL), 'A', B_COMMAND_KEY);
|
|
||||||
selectAll->SetTarget(fTextView);
|
|
||||||
menu->AddItem(selectAll);
|
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
|
||||||
|
|
||||||
BMenuItem* autoScroll = new BMenuItem("Auto-scroll",
|
|
||||||
new BMessage(LYRICS_AUTO_SCROLL));
|
|
||||||
autoScroll->SetMarked(fAutoScroll);
|
|
||||||
autoScroll->SetTarget(this);
|
|
||||||
menu->AddItem(autoScroll);
|
|
||||||
|
|
||||||
BMenu* hideMenu = new BMenu("Hide when inactive");
|
|
||||||
menu->AddItem(hideMenu);
|
|
||||||
|
|
||||||
BMenuItem* hideInactive = hideMenu->Superitem();
|
|
||||||
hideInactive->SetMessage(new BMessage(LYRICS_TRANSPARENTLY_INACTIVE));
|
|
||||||
hideInactive->SetMarked(fTransparentInactivity);
|
|
||||||
hideInactive->SetTarget(this);
|
|
||||||
|
|
||||||
BMenuItem* hideDragger = new BMenuItem("… including the dragger",
|
|
||||||
new BMessage(LYRICS_TRANSPARENTLY_DRAG));
|
|
||||||
hideDragger->SetMarked(fTransparentDragger);
|
|
||||||
hideDragger->SetTarget(this);
|
|
||||||
hideMenu->AddItem(hideDragger);
|
|
||||||
|
|
||||||
return menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
float
|
float
|
||||||
LyricsView::_GetPositionProportion()
|
LyricsView::_GetPositionProportion()
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include <TextView.h>
|
#include <TextView.h>
|
||||||
|
|
||||||
|
#include "ReplicantView.h"
|
||||||
#include "Song.h"
|
#include "Song.h"
|
||||||
|
|
||||||
class BDragger;
|
class BDragger;
|
||||||
|
@ -35,41 +36,34 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class LyricsView : public BView {
|
class LyricsView : public ReplicantView {
|
||||||
public:
|
public:
|
||||||
LyricsView(BRect frame);
|
LyricsView(BRect frame);
|
||||||
LyricsView(BMessage* archive);
|
LyricsView(BMessage* archive);
|
||||||
|
|
||||||
virtual status_t Archive(BMessage* data, bool deep = true) const;
|
virtual status_t Archive(BMessage* data, bool deep = true) const;
|
||||||
static LyricsView* Instantiate(BMessage* data);
|
static LyricsView* Instantiate(BMessage* data);
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* msg);
|
virtual void MessageReceived(BMessage* msg);
|
||||||
virtual void Pulse();
|
virtual void Pulse();
|
||||||
|
|
||||||
virtual void MouseDown(BPoint where);
|
virtual BPopUpMenu* RightClickPopUp(BPopUpMenu* menu = NULL);
|
||||||
|
|
||||||
|
virtual void SetInactive(bool inactive);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _Init(BRect frame);
|
void _Init(BRect frame);
|
||||||
|
|
||||||
void _SetText(const char* text);
|
void _UpdateColors();
|
||||||
void _ClearText();
|
|
||||||
|
|
||||||
void _UpdateColors();
|
float _GetPositionProportion();
|
||||||
|
|
||||||
BPopUpMenu* _RightClickPopUp();
|
|
||||||
|
|
||||||
float _GetPositionProportion();
|
|
||||||
|
|
||||||
MediaPlayer* fMediaPlayer;
|
|
||||||
Song fCurrentSong;
|
Song fCurrentSong;
|
||||||
|
|
||||||
LyricsTextView* fTextView;
|
LyricsTextView* fTextView;
|
||||||
BScrollView* fScrollView;
|
BScrollView* fScrollView;
|
||||||
BDragger* fDragger;
|
|
||||||
|
|
||||||
bool fAutoScroll;
|
bool fAutoScroll;
|
||||||
bool fTransparentInactivity;
|
|
||||||
bool fTransparentDragger;
|
|
||||||
|
|
||||||
rgb_color fBgColor;
|
rgb_color fBgColor;
|
||||||
rgb_color fFgColor;
|
rgb_color fFgColor;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
MainWindow::MainWindow()
|
MainWindow::MainWindow()
|
||||||
:
|
:
|
||||||
BWindow(BRect(BPoint(0,0),BSize(500.0, 500.0)), "MediaMonitor",
|
BWindow(BRect(BPoint(0,0),BSize(500.0, 500.0)), APP_NAME,
|
||||||
B_TITLED_WINDOW, B_AUTO_UPDATE_SIZE_LIMITS | B_QUIT_ON_WINDOW_CLOSE)
|
B_TITLED_WINDOW, B_AUTO_UPDATE_SIZE_LIMITS | B_QUIT_ON_WINDOW_CLOSE)
|
||||||
{
|
{
|
||||||
SetPulseRate(0);
|
SetPulseRate(0);
|
||||||
|
|
|
@ -31,7 +31,7 @@ MediaPlayer::Archive(BMessage* data, bool deep) const
|
||||||
status_t status = BArchivable::Archive(data, deep);
|
status_t status = BArchivable::Archive(data, deep);
|
||||||
data->AddInt32("_window", fWindowIndex);
|
data->AddInt32("_window", fWindowIndex);
|
||||||
data->AddString("class", "MediaPlayer");
|
data->AddString("class", "MediaPlayer");
|
||||||
data->AddString("add_on", "application/x-vnd.mediamonitor");
|
data->AddString("add_on", APP_SIGNATURE);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022, Jaidyn Levesque <jadedctrl@teknik.io>
|
||||||
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ReplicantView.h"
|
||||||
|
|
||||||
|
#include <Dragger.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
|
#include <PopUpMenu.h>
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
|
#include "MediaPlayer.h"
|
||||||
|
|
||||||
|
|
||||||
|
ReplicantView::ReplicantView(BRect frame, const char* name, uint32 draggerPlacement)
|
||||||
|
:
|
||||||
|
BView(frame, name, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_TRANSPARENT_BACKGROUND | B_PULSE_NEEDED)
|
||||||
|
{
|
||||||
|
BRect dragRect(frame.Width() - 10, 0, frame.Width(), frame.Height());
|
||||||
|
uint32 dragFollow = B_FOLLOW_RIGHT;
|
||||||
|
if (draggerPlacement & _VIEW_LEFT_) {
|
||||||
|
dragRect = BRect(0, 0, 10, frame.Height());
|
||||||
|
dragFollow = B_FOLLOW_LEFT;
|
||||||
|
}
|
||||||
|
fDragger = new BDragger(dragRect, this, dragFollow | B_FOLLOW_BOTTOM, B_WILL_DRAW);
|
||||||
|
fDragger->SetViewColor(B_TRANSPARENT_COLOR);
|
||||||
|
AddChild(fDragger);
|
||||||
|
|
||||||
|
fTransparentInactivity = true;
|
||||||
|
fTransparentDragger = false;
|
||||||
|
fInactive = true;
|
||||||
|
|
||||||
|
fMediaPlayer = new MediaPlayer(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ReplicantView::ReplicantView(BMessage* data)
|
||||||
|
:
|
||||||
|
BView(data)
|
||||||
|
{
|
||||||
|
BMessage mediaplayer;
|
||||||
|
data->FindMessage("mediaplayer", &mediaplayer);
|
||||||
|
fMediaPlayer = new MediaPlayer(&mediaplayer);
|
||||||
|
|
||||||
|
fDragger = dynamic_cast<BDragger*>(FindView("_dragger_"));
|
||||||
|
|
||||||
|
fTransparentInactivity = data->GetBool("transparent_inactivity", true);
|
||||||
|
fTransparentDragger = data->GetBool("transparent_dragger", false);
|
||||||
|
fInactive = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
ReplicantView::Archive(BMessage* data, bool deep) const
|
||||||
|
{
|
||||||
|
status_t status = BView::Archive(data, deep);
|
||||||
|
|
||||||
|
BMessage mediaPlayer;
|
||||||
|
fMediaPlayer->Archive(&mediaPlayer);
|
||||||
|
data->AddMessage("mediaplayer", &mediaPlayer);
|
||||||
|
data->AddBool("transparent_inactivity", fTransparentInactivity);
|
||||||
|
data->AddBool("transparent_dragger", fTransparentDragger);
|
||||||
|
|
||||||
|
data->AddString("class", "ReplicantView");
|
||||||
|
data->AddString("add_on", APP_SIGNATURE);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ReplicantView*
|
||||||
|
ReplicantView::Instantiate(BMessage* data)
|
||||||
|
{
|
||||||
|
if (!validate_instantiation(data, "ReplicantView"))
|
||||||
|
return NULL;
|
||||||
|
return new ReplicantView(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ReplicantView::MessageReceived(BMessage* msg)
|
||||||
|
{
|
||||||
|
switch (msg->what)
|
||||||
|
{
|
||||||
|
case REPL_TRANSPARENTLY_INACTIVE:
|
||||||
|
case REPL_TRANSPARENTLY_DRAG: {
|
||||||
|
if (msg->what == REPL_TRANSPARENTLY_INACTIVE)
|
||||||
|
fTransparentInactivity = !fTransparentInactivity;
|
||||||
|
if (msg->what == REPL_TRANSPARENTLY_DRAG)
|
||||||
|
fTransparentDragger = !fTransparentDragger;
|
||||||
|
SetInactive(fInactive);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
BView::MessageReceived(msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ReplicantView::MouseDown(BPoint where)
|
||||||
|
{
|
||||||
|
uint32 buttons = 0;
|
||||||
|
Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
||||||
|
if (buttons & B_SECONDARY_MOUSE_BUTTON)
|
||||||
|
RightClickPopUp()->Go(ConvertToScreen(where), true, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BPopUpMenu*
|
||||||
|
ReplicantView::RightClickPopUp(BPopUpMenu* menu)
|
||||||
|
{
|
||||||
|
if (menu == NULL)
|
||||||
|
menu = new BPopUpMenu("rightClickPopUp");
|
||||||
|
menu->SetRadioMode(false);
|
||||||
|
|
||||||
|
BMenu* hideMenu = new BMenu("Hide when inactive");
|
||||||
|
menu->AddItem(hideMenu);
|
||||||
|
|
||||||
|
BMenuItem* hideInactive = hideMenu->Superitem();
|
||||||
|
hideInactive->SetMessage(new BMessage(REPL_TRANSPARENTLY_INACTIVE));
|
||||||
|
hideInactive->SetMarked(fTransparentInactivity);
|
||||||
|
hideInactive->SetTarget(this);
|
||||||
|
|
||||||
|
BMenuItem* hideDragger = new BMenuItem("… including the dragger",
|
||||||
|
new BMessage(REPL_TRANSPARENTLY_DRAG));
|
||||||
|
hideDragger->SetMarked(fTransparentDragger);
|
||||||
|
hideDragger->SetTarget(this);
|
||||||
|
hideMenu->AddItem(hideDragger);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ReplicantView::SetInactive(bool inactive)
|
||||||
|
{
|
||||||
|
fInactive = inactive;
|
||||||
|
|
||||||
|
if (inactive && fTransparentInactivity)
|
||||||
|
if (!fDragger->IsHidden() && fTransparentDragger)
|
||||||
|
fDragger->Hide();
|
||||||
|
if (fDragger->IsHidden() && (!fTransparentDragger || !fTransparentInactivity))
|
||||||
|
fDragger->Show();
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022, Jaidyn Levesque <jadedctrl@teknik.io>
|
||||||
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
|
*/
|
||||||
|
#ifndef REPLICANTVIEW_H
|
||||||
|
#define REPLICANTVIEW_H
|
||||||
|
|
||||||
|
#include <View.h>
|
||||||
|
|
||||||
|
class BDragger;
|
||||||
|
class BPopUpMenu;
|
||||||
|
class MediaPlayer;
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MP_AUDIO_WINDOW = 'mpaw',
|
||||||
|
MP_VIDEO_WINDOW = 'mpvw',
|
||||||
|
MP_NEWEST_WINDOW = 'mpnw'
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
REPL_TRANSPARENTLY_INACTIVE = 'rtti',
|
||||||
|
REPL_TRANSPARENTLY_DRAG = 'rttd'
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Base class for each replicant, containing features need for (most) of them:
|
||||||
|
- Dragger where you'd expect it
|
||||||
|
- Transparency/hiding during inactivity
|
||||||
|
- Right-click menu with common options
|
||||||
|
- Setting custom background color (by drag)
|
||||||
|
- MediaPlayer object */
|
||||||
|
class ReplicantView : public BView {
|
||||||
|
public:
|
||||||
|
ReplicantView(BRect frame, const char* name, uint32 draggerPlacement);
|
||||||
|
ReplicantView(BMessage* archive);
|
||||||
|
|
||||||
|
virtual status_t Archive(BMessage* data, bool deep = true) const;
|
||||||
|
static ReplicantView* Instantiate(BMessage* data);
|
||||||
|
|
||||||
|
virtual void MessageReceived(BMessage* msg);
|
||||||
|
|
||||||
|
virtual void MouseDown(BPoint where);
|
||||||
|
|
||||||
|
// Populates the given menu with default items
|
||||||
|
virtual BPopUpMenu* RightClickPopUp(BPopUpMenu* menu = NULL);
|
||||||
|
|
||||||
|
// Set inactivity state, re-render accordingly
|
||||||
|
virtual void SetInactive(bool inactive);
|
||||||
|
|
||||||
|
MediaPlayer* fMediaPlayer;
|
||||||
|
BDragger* fDragger;
|
||||||
|
|
||||||
|
bool fInactive;
|
||||||
|
bool fTransparentInactivity;
|
||||||
|
bool fTransparentDragger;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // REPLICANTVIEW_H
|
Ŝarĝante…
Reference in New Issue