Serious cleanup of the app

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13160 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm
2005-06-15 19:04:52 +00:00
parent 0f0232c767
commit 4399fd6025
11 changed files with 261 additions and 1637 deletions
+5 -25
View File
@@ -26,40 +26,20 @@
//
//------------------------------------------------------------------------------
#include "APRMain.h"
#include "APRWindow.h"
#include <stdio.h>
#include "defs.h"
#include "FontServer.h"
#include "ServerConfig.h"
APRApplication::APRApplication()
:BApplication(APPEARANCE_APP_SIGNATURE)
APRApplication::APRApplication(void)
: BApplication(APPEARANCE_APP_SIGNATURE)
{
fontserver=new FontServer();
fontserver->ScanDirectory("/boot/beos/etc/fonts/ttfonts/");
fontserver->ScanDirectory("/boot/beos/etc/fonts/PS-Type1/");
if(!fontserver->SetSystemPlain(DEFAULT_PLAIN_FONT_FAMILY,DEFAULT_PLAIN_FONT_STYLE,DEFAULT_PLAIN_FONT_SIZE))
printf("Couldn't set plain to %s, %s %d pt\n",DEFAULT_PLAIN_FONT_FAMILY,
DEFAULT_PLAIN_FONT_STYLE,DEFAULT_PLAIN_FONT_SIZE);
if(!fontserver->SetSystemBold(DEFAULT_BOLD_FONT_FAMILY,DEFAULT_BOLD_FONT_STYLE,DEFAULT_BOLD_FONT_SIZE))
printf("Couldn't set bold to %s, %s %d pt\n",DEFAULT_BOLD_FONT_FAMILY,
DEFAULT_BOLD_FONT_STYLE,DEFAULT_BOLD_FONT_SIZE);
if(!fontserver->SetSystemFixed(DEFAULT_FIXED_FONT_FAMILY,DEFAULT_FIXED_FONT_STYLE,DEFAULT_FIXED_FONT_SIZE))
printf("Couldn't set fixed to %s, %s %d pt\n",DEFAULT_FIXED_FONT_FAMILY,
DEFAULT_FIXED_FONT_STYLE,DEFAULT_FIXED_FONT_SIZE);
BRect rect;
// This is just the size and location of the window when Show() is called
rect.Set(100,100,540,410);
aprwin=new APRWindow(rect);
aprwin->Show();
fWindow=new APRWindow( BRect(100,100,540,410) );
fWindow->Show();
}
int main(int, char**)
{
APRApplication myApplication;
// This function doesn't return until the application quits
myApplication.Run();
return(0);
+7 -3
View File
@@ -29,13 +29,17 @@
#define APR_WORLD_H
#include <Application.h>
#include "APRWindow.h"
class APRWindow;
class APRApplication : public BApplication
{
public:
APRApplication();
APRWindow *aprwin;
APRApplication(void);
private:
APRWindow *fWindow;
};
#endif
+76 -501
View File
@@ -34,18 +34,19 @@
#include <storage/Path.h>
#include <Entry.h>
#include <File.h>
#include <Screen.h> // for settings Desktop color
#include <stdio.h>
#include "APRView.h"
#include <PortLink.h>
#include <PortMessage.h>
#include <InterfaceDefs.h>
#include <ServerProtocol.h>
#include "APRView.h"
#include "defs.h"
#include "ColorWell.h"
#include <ColorUtils.h>
#include <InterfaceDefs.h>
#include <ServerProtocol.h>
#include "ColorWhichItem.h"
#include "ColorSet.h"
#include "ServerConfig.h"
//#define DEBUG_COLORSET
@@ -56,43 +57,22 @@
#define STRACE(A) /* nothing */
#endif
//#define SAVE_COLORSET 'svcs'
//#define DELETE_COLORSET 'dlcs'
//#define LOAD_COLORSET 'ldcs'
#define COLOR_DROPPED 'cldp'
// Declarations for private functions in InterfaceDefs.cpp
namespace BPrivate
{
void get_system_colors(ColorSet *colors);
void set_system_colors(const ColorSet &colors);
}
APRView::APRView(const BRect &frame, const char *name, int32 resize, int32 flags)
:BView(frame,name,resize,flags)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
currentset=new ColorSet;
prevset=NULL;
/*
// This disabled code block is being saved for a color set app
BMenuBar *mb=new BMenuBar(BRect(0,0,Bounds().Width(),16),"menubar");
settings_menu=new BMenu("Settings");
settings_menu->AddItem(new BMenuItem("Save Color Set",new BMessage(SAVE_COLORSET),'S'));
settings_menu->AddSeparatorItem();
settings_menu->AddItem(new BMenuItem("Delete Color Set",new BMessage(DELETE_COLORSET)));
mb->AddItem(settings_menu);
colorset_menu=LoadColorSets();
if(colorset_menu)
mb->AddItem(colorset_menu);
else
{
// We should *never* be here, but just in case....
colorset_menu=new BMenu("Color Sets");
mb->AddItem(colorset_menu);
}
AddChild(mb);
*/
// Set up list of color attributes
BRect rect(10,10,200,175);
BRect rect(10,10,200,150);
attrlist=new BListView(rect,"AttributeList");
scrollview=new BScrollView("ScrollView",attrlist, B_FOLLOW_LEFT |
@@ -130,41 +110,54 @@ APRView::APRView(const BRect &frame, const char *name, int32 resize, int32 flags
BRect wellrect(0,0,50,50);
wellrect.OffsetTo(rect.right + 42,25);
wellrect.OffsetTo( rect.right + 42, rect.top +
(scrollview->Bounds().Height() - wellrect.Height())/2 );
colorwell=new ColorWell(wellrect,new BMessage(COLOR_DROPPED),true);
AddChild(colorwell);
// Center the list and color well
rect = scrollview->Frame();
rect.right = wellrect.right;
rect.OffsetTo( (Bounds().Width()-rect.Width())/2,rect.top);
scrollview->MoveTo(rect.left, rect.top);
colorwell->MoveTo(rect.right - colorwell->Bounds().Width(), colorwell->Frame().top);
picker=new BColorControl(BPoint(10,scrollview->Frame().bottom+20),B_CELLS_32x8,5.0,"Picker",
new BMessage(UPDATE_COLOR));
AddChild(picker);
picker->MoveTo( (Bounds().Width() - picker->Frame().Width())/2,
scrollview->Frame().bottom + 20 );
BRect cvrect;
cvrect=picker->Frame();
cvrect.right=cvrect.left+60;
cvrect.bottom=cvrect.top+30;
// 40 is 10 pixel space between buttons and other objects, such as the edge or another button
cvrect.OffsetTo( (Bounds().Width()-((cvrect.Width()*3)+40))/2,picker->Frame().bottom+10);
// 40 is a 10 pixel space between buttons and other objects,
// such as the edge or another button
cvrect.OffsetTo( (Bounds().Width()- ((cvrect.Width()*3) + 40))/2,
picker->Frame().bottom+10);
defaults=new BButton(cvrect,"DefaultsButton","Defaults",
new BMessage(DEFAULT_SETTINGS),B_FOLLOW_LEFT |B_FOLLOW_TOP,
B_WILL_DRAW | B_NAVIGABLE);
new BMessage(DEFAULT_SETTINGS),
B_FOLLOW_LEFT |B_FOLLOW_TOP, B_WILL_DRAW | B_NAVIGABLE);
AddChild(defaults);
defaults->SetEnabled(false);
cvrect.OffsetBy(70,0);
revert=new BButton(cvrect,"RevertButton","Revert",
new BMessage(REVERT_SETTINGS),B_FOLLOW_LEFT |B_FOLLOW_TOP,
B_WILL_DRAW | B_NAVIGABLE);
revert=new BButton(cvrect,"RevertButton","Revert",
new BMessage(REVERT_SETTINGS),
B_FOLLOW_LEFT |B_FOLLOW_TOP, B_WILL_DRAW | B_NAVIGABLE);
AddChild(revert);
revert->SetEnabled(false);
cvrect.OffsetBy(70,0);
apply=new BButton(cvrect,"ApplyButton","Apply",
new BMessage(APPLY_SETTINGS),B_FOLLOW_LEFT |B_FOLLOW_TOP,
B_WILL_DRAW | B_NAVIGABLE);
apply=new BButton(cvrect,"ApplyButton","Apply", new BMessage(APPLY_SETTINGS),
B_FOLLOW_LEFT |B_FOLLOW_TOP, B_WILL_DRAW | B_NAVIGABLE);
AddChild(apply);
apply->SetEnabled(false);
@@ -174,18 +167,14 @@ APRView::APRView(const BRect &frame, const char *name, int32 resize, int32 flags
attribute=B_PANEL_BACKGROUND_COLOR;
attrstring="Panel Background";
LoadSettings();
// Save values for when we need to revert
prevset=currentset;
}
APRView::~APRView(void)
{
if(currentset)
delete currentset;
if(prevset)
delete prevset;
}
void APRView::AllAttached(void)
void APRView::AttachedToWindow(void)
{
picker->SetTarget(this);
attrlist->Select(0);
@@ -195,8 +184,7 @@ void APRView::AllAttached(void)
revert->SetTarget(this);
colorwell->SetTarget(this);
BMessenger msgr(this);
picker->SetValue(currentset->StringToColor(attrstring.String()).GetColor32());
picker->SetValue(currentset.StringToColor(attrstring.String()));
}
void APRView::MessageReceived(BMessage *msg)
@@ -215,91 +203,9 @@ void APRView::MessageReceived(BMessage *msg)
switch(msg->what)
{
/*
// More code being saved for a color set app
case DELETE_COLORSET:
{
// We can't delete the Default set
if(currentset->name.Compare("Default")==0)
break;
// Construct the path and delete
BString path(COLOR_SET_DIR);
path+=currentset->name;
BString printstring("Remove ");
printstring+=currentset->name;
printstring+=" from disk permenantly?";
BAlert *a=new BAlert("OpenBeOS",printstring.String(),"Yes", "No");
if(a->Go()==0)
{
int stat=remove(path.String());
if(stat!=0)
{
STRACE(("MSG: Delete Request - couldn't delete file %s\n",path.String()));
}
else
{
BMenuItem *item=colorset_menu->FindItem(currentset->name.String());
if(item!=NULL)
{
if(colorset_menu->RemoveItem(item))
delete item;
}
}
}
break;
}
case LOAD_COLORSET:
{
BString name;
if(msg->FindString("name",&name)!=B_OK)
{
STRACE(("MSG: Load Request - couldn't find file name\n"));
break;
}
LoadColorSet(name);
break;
}
case SAVE_COLORSET:
{
// Saving the Default set is rather dumb
if(currentset->name.Compare("Default")==0)
break;
savepanel->Show();
break;
}
case B_SAVE_REQUESTED:
{
BString name;
if(msg->FindString("name",&name)!=B_OK)
{
STRACE(("MSG: Save Request - couldn't find file name\n"));
break;
}
if(name.ICompare("Default")==0)
{
BAlert *a=new BAlert("OpenBeOS","The name 'Default' is reserved. Please choose another.","OK");
a->Go();
savepanel->Show();
break;
}
SaveColorSet(name);
break;
}
// end disabled colorset code
*/
case UPDATE_COLOR:
{
// Received from the color picker when its color changes
if(!prevset)
{
prevset=new ColorSet;
*prevset=*currentset;
}
rgb_color col=picker->ValueAsColor();
@@ -307,92 +213,60 @@ void APRView::MessageReceived(BMessage *msg)
colorwell->Invalidate();
// Update current attribute in the settings
if(currentset->SetColor(attrstring.String(),col)!=B_OK)
{
STRACE(("Couldn't set color for attribute %s\n",attrstring.String()));
}
currentset.SetColor(attrstring.String(),col);
if(!apply->IsEnabled())
apply->SetEnabled(true);
if(!defaults->IsEnabled())
defaults->SetEnabled(true);
if(!revert->IsEnabled())
revert->SetEnabled(true);
apply->SetEnabled(true);
revert->SetEnabled(true);
Window()->PostMessage(SET_UI_COLORS);
break;
}
case ATTRIBUTE_CHOSEN:
{
// Received when the user chooses a GUI attribute from the list
ColorWhichItem *whichitem=(ColorWhichItem*)attrlist->ItemAt(attrlist->CurrentSelection());
ColorWhichItem *whichitem = (ColorWhichItem*)attrlist->ItemAt( attrlist->CurrentSelection() );
if(!whichitem)
break;
attrstring=whichitem->Text();
UpdateControlsFromAttr(whichitem->Text());
break;
}
case APPLY_SETTINGS:
{
if(prevset)
{
delete prevset;
prevset=NULL;
revert->SetEnabled(false);
}
if(currentset->name=="Default")
defaults->SetEnabled(false);
apply->SetEnabled(false);
SaveSettings();
NotifyServer();
break;
}
case TRY_SETTINGS:
{
// Tell server to apply settings here without saving them.
// Theoretically, the user can set this temporarily and keep it
// until the next boot.
NotifyServer();
BPrivate::set_system_colors(currentset);
BString path(SERVER_SETTINGS_DIR);
path += COLOR_SETTINGS_NAME;
SaveColorSet( path.String(), currentset);
break;
}
case REVERT_SETTINGS:
{
delete currentset;
currentset=prevset;
prevset=NULL;
rgb_color col=picker->ValueAsColor();
colorwell->SetColor(col);
colorwell->Invalidate();
// Update current attribute in the settings
currentset->SetColor(attrstring.String(),col);
UpdateControlsFromAttr(attrstring.String());
// Save settings on disk if 'Apply' has been used
if(!apply->IsEnabled())
apply->SetEnabled(false);
if((currentset->name!="Default"))
defaults->SetEnabled(true);
else
defaults->SetEnabled(false);
{
BString path(SERVER_SETTINGS_DIR);
path += COLOR_SETTINGS_NAME;
SaveColorSet( path.String(), currentset);
}
apply->SetEnabled(false);
revert->SetEnabled(false);
Window()->PostMessage(SET_UI_COLORS);
break;
}
case DEFAULT_SETTINGS:
{
if(!prevset)
{
prevset=new ColorSet;
*prevset=*currentset;
revert->SetEnabled(true);
apply->SetEnabled(true);
}
SetDefaults();
currentset.SetToDefaults();
apply->SetEnabled(true);
UpdateControlsFromAttr(attrstring.String());
if(Window())
Window()->PostMessage(SET_UI_COLORS);
break;
}
default:
@@ -401,317 +275,18 @@ void APRView::MessageReceived(BMessage *msg)
}
}
/*
// This section is commented out because Appearance doesn't manage color sets. That
// task is better left to another application.
BMenu *APRView::LoadColorSets(void)
{
STRACE(("Loading color sets from disk\n"));
// This function populates the member menu *colorset_menu with the color
// set files located in the color set directory. To ensure that there are
// no entries pointing to invalid color sets, they are validated before
// a menu item is added.
BDirectory dir;
BEntry entry;
BPath path;
BString name;
BMenu *menu=new BMenu("Color Sets");
status_t dirstat=dir.SetTo(COLOR_SET_DIR);
if(dirstat!=B_OK)
{
// We couldn't set the directory, so more than likely it just
// doesn't exist. Create it and return an empty menu.
switch(dirstat)
{
case B_NAME_TOO_LONG:
{
BAlert *a=new BAlert("OpenBeOS","Couldn't open the folder for color sets. "
"You will be able to change system colors, but be unable to save them to a color set. "
"Please contact OpenBeOS about Appearance Preferences::APRView::"
"LoadColorSets::B_NAME_TOO_LONG for a bugfix", "OK",
NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
a->Go();
break;
}
case B_ENTRY_NOT_FOUND:
{
create_directory(COLOR_SET_DIR,0777);
break;
}
case B_BAD_VALUE:
{
STRACE(("APRView::LoadColorSets(): Invalid colorset folder path.\n"));
break;
}
case B_NO_MEMORY:
{
STRACE(("APRView::LoadColorSets(): No memory left. We're probably going to crash now. \n"));
break;
}
case B_BUSY:
{
STRACE(("APRView::LoadColorSets(): Busy node " COLOR_SET_DIR "\n"));
break;
}
case B_FILE_ERROR:
{
BAlert *a=new BAlert("OpenBeOS","Couldn't open the folder for color sets "
"because of a file error. Perhaps there is a file (instead of a folder) at " COLOR_SET_DIR
"? You will be able to change system colors, but be unable to save them to a color set. ",
"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
a->Go();
break;
}
case B_NO_MORE_FDS:
{
BAlert *a=new BAlert("OpenBeOS","Couldn't open the folder for color sets "
"because there are too many open files. Please close some files and restart "
" this application.", "OK",
NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
a->Go();
if(Window())
Window()->PostMessage(B_QUIT_REQUESTED);
break;
}
}
return menu;
}
int32 count=dir.CountEntries();
BMessage *msg;
for(int32 i=0;i<count;i++)
{
dir.GetNextEntry(&entry);
entry.GetPath(&path);
name=path.Path();
name.Remove(0,name.FindLast('/')+1);
msg=new BMessage(LOAD_COLORSET);
msg->AddString("name",name);
menu->AddItem(new BMenuItem(name.String(),msg));
}
return menu;
}
*/
void APRView::LoadColorSet(const BString &name)
{
// Load the current GUI color settings from a color set file.
STRACE(("LoadColorSet: %s\n",name.String()));
BDirectory dir,newdir;
if(dir.SetTo(COLOR_SET_DIR)==B_ENTRY_NOT_FOUND)
{
STRACE(("Color set folder not found. Creating %s\n",COLOR_SET_DIR));
create_directory(COLOR_SET_DIR,0777);
}
BString path(COLOR_SET_DIR);
path+=name.String();
BFile file(path.String(),B_READ_ONLY);
if(file.InitCheck()!=B_OK)
{
STRACE(("Couldn't open file %s for read\n",path.String()));
return;
}
BMessage settings;
if(settings.Unflatten(&file)!=B_OK)
{
STRACE(("Error unflattening file %s\n",name.String()));
return;
}
currentset->ConvertFromMessage(&settings);
// SetColorSetName(currentset->name.String());
UpdateControlsFromAttr(attrstring.String());
}
/*
// More code being saved for a color set app
void APRView::SaveColorSet(const BString &name)
{
// Save the current color attributes as a flattened BMessage in the
// color set folder
BString path(COLOR_SET_DIR);
path+=name.String();
STRACE(("SaveColorSet: %s\n",path.String()));
BFile file(path.String(),B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE);
if(file.InitCheck()!=B_OK)
{
STRACE(("SaveColorSet: Couldn't open settings file for write\n"));
return;
}
BMessage settings;
currentset->name=name;
currentset->ConvertToMessage(&settings);
if(settings.Flatten(&file)!=B_OK)
{
STRACE(("SaveColorSet: Couldn't flatten settings to file\n"));
return;
}
BMessage *msg=new BMessage(LOAD_COLORSET);
msg->AddString("name",name.String());
if(colorset_menu->AddItem(new BMenuItem(name.String(),msg))==false)
{
STRACE(("SaveColorSet: Error in adding item to menu\n"));
}
SetColorSetName(name.String());
// If we saved the color set after Applying it, the name won't be updated on disk, so
// save again to disk if this has happened.
if(prevset==NULL)
SaveSettings();
}
// More code being saved for a color set app
void APRView::SetColorSetName(const char *name)
{
if(!name)
return;
BString namestr("Color Set: ");
currentset->name.SetTo(name);
namestr+=name;
colorwell_label->SetText(namestr.String());
colorwell_label->ResizeToPreferred();
colorwell_label->Invalidate();
}
*/
void APRView::SaveSettings(void)
{
// Save the current GUI color settings to the GUI colors file in the
// path specified in defs.h
BString path(SERVER_SETTINGS_DIR);
path+=COLOR_SETTINGS_NAME;
STRACE(("SaveSettings: %s\n",path.String()));
BFile file(path.String(),B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE);
BMessage settings;
currentset->ConvertToMessage(&settings);
settings.Flatten(&file);
}
void APRView::LoadSettings(void)
{
// Load the current GUI color settings from disk. This is done instead of
// getting them from the server at this point for testing purposes.
#ifndef RUN_WITHOUT_APP_SERVER
// Query the server for the current settings
port_id port=find_port(SERVER_PORT_NAME);
if(port!=B_NAME_NOT_FOUND)
{
STRACE(("Retrieving settings from app_server\n"));
BPrivate::PortLink link(port);
int32 code;
//BPrivate::get_system_colors(&currentset);
// TODO: remove this and enable the get_system_colors() call
LoadColorSet("/boot/home/config/settings/app_server/system_colors",&currentset);
link.StartMessage(AS_GET_UI_COLORS);
link.Flush();
link.GetNextMessage(code);
link.Read<ColorSet>(currentset);
}
else
{
#endif
STRACE(("Loading settings from disk\n"));
BDirectory dir,newdir;
if(dir.SetTo(SERVER_SETTINGS_DIR)==B_ENTRY_NOT_FOUND)
{
STRACE(("Color set folder not found. Creating %s\n",SERVER_SETTINGS_DIR));
create_directory(SERVER_SETTINGS_DIR,0777);
}
BString path(SERVER_SETTINGS_DIR);
path+=COLOR_SETTINGS_NAME;
BFile file(path.String(),B_READ_ONLY);
if(file.InitCheck()!=B_OK)
{
STRACE(("Couldn't open file %s for read\n",path.String()));
SetDefaults();
SaveSettings();
return;
}
BMessage settings;
if(settings.Unflatten(&file)!=B_OK)
{
STRACE(("Error unflattening SystemColors file %s\n",path.String()));
SetDefaults();
SaveSettings();
}
currentset->ConvertFromMessage(&settings);
#ifndef RUN_WITHOUT_APP_SERVER
}
// SetColorSetName(currentset->name.String());
#endif
UpdateControlsFromAttr(attrstring.String());
if(currentset->name.Compare("Default")!=0)
defaults->SetEnabled(true);
}
void APRView::SetDefaults(void)
{
STRACE(("Initializing color settings to defaults\n"));
defaults->SetEnabled(false);
currentset->name.SetTo("Default");
currentset->SetToDefaults();
}
void APRView::NotifyServer(void)
{
#ifndef RUN_WITHOUT_APP_SERVER
// Send a message to the app_server with the settings which we have.
port_id port=find_port(SERVER_PORT_NAME);
if(port!=B_NAME_NOT_FOUND)
{
STRACE(("Notifying app_server\n"));
BPrivate::PortLink link(port);
link.StartMessage(AS_SET_UI_COLORS);
link.Attach<ColorSet>(*currentset);
link.Flush();
}
// We also need to send the message to the window so that the Decorators tab updates itself
if(Window())
Window()->PostMessage(SET_UI_COLORS);
#endif
}
void APRView::UpdateControlsFromAttr(const char *string)
@@ -720,7 +295,7 @@ void APRView::UpdateControlsFromAttr(const char *string)
return;
STRACE(("Update color for %s\n",string));
picker->SetValue(currentset->StringToColor(string).GetColor32());
picker->SetValue(currentset.StringToColor(string));
colorwell->SetColor(picker->ValueAsColor());
colorwell->Invalidate();
}
+28 -21
View File
@@ -41,36 +41,43 @@
#include <MenuItem.h>
#include <StringView.h>
#include <Invoker.h>
#include <ColorSet.h>
#include "ColorSet.h"
class ColorWell;
class APRWindow;
class APRView : public BView
{
public:
APRView(const BRect &frame, const char *name, int32 resize, int32 flags);
~APRView(void);
void AllAttached(void);
void MessageReceived(BMessage *msg);
void SaveSettings(void);
void LoadSettings(void);
void SetDefaults(void);
void NotifyServer(void);
APRView(const BRect &frame, const char *name, int32 resize,
int32 flags);
void AttachedToWindow(void);
void MessageReceived(BMessage *msg);
void LoadSettings(void);
protected:
friend APRWindow;
void UpdateControlsFromAttr(const char *string);
// BMenu *LoadColorSets(void);
void LoadColorSet(const BString &name);
BColorControl *picker;
BButton *apply,*revert,*defaults;
BListView *attrlist;
color_which attribute;
BString attrstring;
BScrollView *scrollview;
ColorWell *colorwell;
void UpdateControlsFromAttr(const char *string);
ColorSet *currentset,*prevset;
BColorControl *picker;
BButton *apply;
BButton *revert;
BButton *defaults;
BListView *attrlist;
color_which attribute;
BString attrstring;
BScrollView *scrollview;
ColorWell *colorwell;
ColorSet currentset;
ColorSet prevset;
};
#endif
+9 -88
View File
@@ -32,67 +32,24 @@
#include "CurView.h"
#include "MenuView.h"
#include "defs.h"
#include <ScrollView.h>
#include <ListItem.h>
#include <TabView.h>
APRWindow::APRWindow(BRect frame)
: BWindow(frame, "Appearance", B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE, B_ALL_WORKSPACES )
{
BView *topview=new BView(Bounds(),"topview",B_FOLLOW_ALL,B_WILL_DRAW);
topview->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
AddChild(topview);
BTabView *tabview = new BTabView(Bounds(),"tabview");
BRect r(10,10,110,Bounds().Height()-10);
listview=new BListView(r,"prefslist");
topview->AddChild(listview);
listview->SetSelectionMessage(new BMessage(PREFS_CHOSEN));
BRect r(Bounds());
r.bottom -= 20;
r.Set(100,100,385,445);
r.OffsetTo(listview->Bounds().Width()+20,0);
r.right=Bounds().right;
DecView *decview=new DecView(r,"Decorators",B_FOLLOW_ALL, B_WILL_DRAW);
tabview->AddTab(decview);
listview->AddItem(new BStringItem("Colors"));
colors=new APRView(r,"Colors",B_FOLLOW_ALL, B_WILL_DRAW);
topview->AddChild(colors);
viewlist.AddItem(colors);
colors->Hide();
APRView *colorview=new APRView(r,"Colors",B_FOLLOW_ALL, B_WILL_DRAW);
tabview->AddTab(colorview);
// TODO: Finish CurView
/* listview->AddItem(new BStringItem("Cursors"));
cursors=new CurView(r,"Cursors",B_FOLLOW_ALL, B_WILL_DRAW);
topview->AddChild(cursors);
viewlist.AddItem(cursors);
cursors->Hide();
*/
listview->AddItem(new BStringItem("Decorators"));
decorators=new DecView(r,"Decorator",B_FOLLOW_ALL, B_WILL_DRAW);
topview->AddChild(decorators);
decorators->Hide();
viewlist.AddItem(decorators);
decorators->SetColors(*colors->currentset);
// This code works properly IIRC, but will remain disabled for now.
// One of the cool things about Appearance is that eventually we will probably
// integrate all appearance-related preference panels into this to reduce the number
// of preference applications and to make the entire preferences area more organized.
// This is the route that Zeta took with theirs, but ours will not be a hack -- it will
// be done right. B^>
// This won't amount to much -- we won't bother with the scrollbar prefs app and just
// set sensible defaults. It should just be menu and fonts, so not much work, either.
// listview->AddItem(new BStringItem("Menu"));
// MenuView *menuview=new MenuView(r,"Menu",B_FOLLOW_ALL, B_WILL_DRAW);
// topview->AddChild(menuview);
// viewlist.AddItem(menuview);
// menuview->Hide();
listview->Select(1);
AddChild(tabview);
}
bool APRWindow::QuitRequested()
@@ -100,39 +57,3 @@ bool APRWindow::QuitRequested()
be_app->PostMessage(B_QUIT_REQUESTED);
return(true);
}
void APRWindow::MessageReceived(BMessage *msg)
{
switch(msg->what)
{
case SET_UI_COLORS:
{
decorators->SetColors(*colors->currentset);
break;
}
case PREFS_CHOSEN:
{
int32 selectionindex=listview->CurrentSelection();
if(selectionindex==-1)
break;
// Hide any visible preference views
for(int32 i=0; i<listview->CountItems(); i++)
{
BView *v=(BView*)viewlist.ItemAt(i);
if(!v)
continue;
if(!v->IsHidden())
v->Hide();
}
BView *visible=(BView*)viewlist.ItemAt(selectionindex);
visible->Show();
break;
}
default:
BWindow::MessageReceived(msg);
break;
}
}
+2 -13
View File
@@ -31,23 +31,12 @@
#include <Application.h>
#include <Window.h>
#include <Message.h>
#include <ListView.h>
class APRView;
class DecView;
class CurView;
class APRWindow : public BWindow
{
public:
APRWindow(BRect frame);
virtual bool QuitRequested();
virtual void MessageReceived(BMessage *msg);
BListView *listview;
APRView *colors;
DecView *decorators;
CurView *cursors;
BList viewlist;
APRWindow(BRect frame);
bool QuitRequested(void);
};
#endif
+112 -393
View File
@@ -28,21 +28,17 @@
// settings directory.
//------------------------------------------------------------------------------
#include <OS.h>
#include <String.h>
#include <Directory.h>
#include <Entry.h>
#include <Path.h>
#include "DecView.h"
#include <PortLink.h>
#include <Directory.h>
#include <ServerProtocol.h>
#include <Message.h>
#include <File.h>
#include <ScrollView.h>
#include <ListItem.h>
#include <stdio.h>
#include <Directory.h>
#include <Bitmap.h>
#include "ServerConfig.h"
#include "RGBColor.h"
#include "DecView.h"
#include "defs.h"
#include "PreviewDriver.h"
#include "Decorator.h"
//#define DEBUG_DECORATOR
@@ -52,98 +48,89 @@
#define STRACE(a) /* nothing */
#endif
namespace BPrivate
{
int32 count_decorators(void);
status_t set_decorator(const int32 &index);
int32 get_decorator(void);
status_t get_decorator_name(const int32 &index, BString &name);
status_t get_decorator_preview(const int32 &index, BBitmap *bitmap);
}
class DecoratorItem : public BStringItem
{
public:
DecoratorItem(const char *text, const int32 &index);
int32 GetIndex(void) const { return fIndex; }
private:
int32 fIndex;
};
DecoratorItem::DecoratorItem(const char *text, const int32 &index)
: BStringItem(text),
fIndex(index)
{
}
DecView::DecView(BRect frame, const char *name, int32 resize, int32 flags)
:BView(frame,name,resize,flags)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
BRect cvrect(0,0,50,25);
cvrect.OffsetTo(Bounds().right-60,10);
apply=new BButton(cvrect,"ApplyButton","Apply",
new BMessage(APPLY_SETTINGS),B_FOLLOW_LEFT |B_FOLLOW_TOP,
B_WILL_DRAW | B_NAVIGABLE);
BRect r;
r.left = r.top = 10;
r.right = Bounds().Width()/2 - 10;
r.bottom = Bounds().bottom * .75;
// TODO: This will eventually be just a BView which draws a BBitmap, but for now
// we will use a placeholder
preview = new BView(r, "preview", B_FOLLOW_NONE, B_WILL_DRAW);
preview->SetViewColor(100,140,255);
AddChild(preview);
r.left = r.right + 20;
r.right = Bounds().right - 10 - B_V_SCROLL_BAR_WIDTH;
declist = new BListView(r, "listview");
declist->SetSelectionMessage( new BMessage(DECORATOR_CHOSEN) );
BScrollView *scrollView = new BScrollView("scrollview", declist, B_FOLLOW_NONE,
0,false,true);
AddChild(scrollView);
apply = new BButton( BRect(0,0,1,1), "apply", "Apply", new BMessage(APPLY_SETTINGS),
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
apply->ResizeToPreferred();
apply->MoveTo( Bounds().Width() - 10 - apply->Bounds().Width(),
Bounds().Height() - 10 - apply->Bounds().Height() );
AddChild(apply);
// set up app_server emulation
driver=new PreviewDriver();
if(!driver->Initialize())
// Now that we have all the controls in place, populate the list
int32 decCount = BPrivate::count_decorators();
for(int32 i=0; i<decCount; i++)
{
STRACE(("Uh-oh... Couldn't initialize graphics module for server emu!\n"));
}
else
{
preview=driver->View();
AddChild(preview);
BRect temp(driver->View()->Bounds());
BString string;
preview->MoveTo(apply->Frame().left-temp.Width()-20,apply->Frame().top);
}
// Set up list of color attributes
float top=preview->Frame().bottom+15;
cvrect.Set(10,top,Bounds().right-10-B_V_SCROLL_BAR_WIDTH, top+125);
declist=new BListView(cvrect,"DecoratorList");
scrollview=new BScrollView("ScrollView",declist, B_FOLLOW_LEFT |
B_FOLLOW_TOP, 0, false, true);
AddChild(scrollview);
scrollview->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
declist->SetSelectionMessage(new BMessage(DECORATOR_CHOSEN));
// Finish setup
ldata.SetHighColor(RGBColor(51,102,160));
pat_solid_high=0xFFFFFFFFFFFFFFFFLL;
driver->FillRect(preview_bounds,&ldata);
decorator=NULL;
decorator_id=-1;
GetDecorators();
LoadSettings();
BString path(ConvertIndexToPath(0L));
if(LoadDecorator(path.String()))
{
driver->FillRect(preview_bounds,&ldata);
if(decorator)
{
BStringItem *item=(BStringItem*)declist->ItemAt(declist->CurrentSelection());
path=(item)?item->Text():path="Title";
decorator->SetDriver(driver);
decorator->SetTitle(path.String());
decorator->SetColors(colorset);
}
if( BPrivate::get_decorator_name( i, string ) == B_OK )
declist->AddItem( new DecoratorItem( string.String(), i ) );
}
}
DecView::~DecView(void)
{
driver->Shutdown();
delete driver;
if(decorator!=NULL)
delete decorator;
}
void DecView::AllAttached(void)
void DecView::AttachedToWindow(void)
{
declist->SetTarget(this);
apply->SetTarget(this);
LoadSettings();
BRegion clip;
if(decorator)
{
decorator->GetFootprint(&clip);
driver->View()->ConstrainClippingRegion(&clip);
decorator->Draw();
}
int32 currentDec = BPrivate::get_decorator();
if(currentDec>=0)
declist->Select(currentDec);
}
void DecView::MessageReceived(BMessage *msg)
@@ -153,44 +140,20 @@ void DecView::MessageReceived(BMessage *msg)
case APPLY_SETTINGS:
{
SaveSettings();
NotifyServer();
int32 selection = declist->CurrentSelection();
if(selection >=0 )
BPrivate::set_decorator(selection);
break;
}
case DECORATOR_CHOSEN:
{
STRACE(("MSG: Decorator Chosen - #%ld\n",declist->CurrentSelection()));
bool success=false;
BString path( ConvertIndexToPath(declist->CurrentSelection()) );
STRACE(("MSG: Decorator path: %s\n",path.String()));
success=LoadDecorator(path.String());
if(!success)
{
STRACE(("MSG: Decorator NOT Chosen - couldn't load decorator\n"));
break;
}
driver->FillRect(preview_bounds,&ldata);
if(decorator)
{
BStringItem *item=(BStringItem*)declist->ItemAt(declist->CurrentSelection());
path=(item)?item->Text():path="Title";
decorator->SetDriver(driver);
decorator->SetFocus(true);
decorator->SetTitle(path.String());
decorator->SetColors(colorset);
BRegion clip;
decorator->GetFootprint(&clip);
driver->View()->ConstrainClippingRegion(&clip);
decorator->Draw();
}
// TODO: update the preview here
break;
}
default:
BView::MessageReceived(msg);
break;
@@ -199,303 +162,59 @@ void DecView::MessageReceived(BMessage *msg)
void DecView::SaveSettings(void)
{
BStringItem *item=(BStringItem*)declist->ItemAt(declist->CurrentSelection());
BStringItem *item=(DecoratorItem*)declist->ItemAt(declist->CurrentSelection());
if(!item)
return;
BString path(SERVER_SETTINGS_DIR);
path+="DecoratorSettings";
path+="decorator_settings";
STRACE(("%s\n",path.String()));
BFile file(path.String(),B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE);
settings.MakeEmpty();
BMessage settings;
settings.AddString("decorator",item->Text());
settings.Flatten(&file);
}
void DecView::LoadSettings(void)
{
settings.MakeEmpty();
BMessage settings;
BDirectory dir,newdir;
if(dir.SetTo(SERVER_SETTINGS_DIR)==B_ENTRY_NOT_FOUND)
create_directory(SERVER_SETTINGS_DIR,0777);
BString path(SERVER_SETTINGS_DIR);
path+="DecoratorSettings";
path+="decorator_settings";
BFile file(path.String(),B_READ_ONLY);
if(file.InitCheck()==B_OK)
if(file.InitCheck()!=B_OK)
{
if(settings.Unflatten(&file)==B_OK)
STRACE(("Error opening settings file %s\n",path.String()));
return;
}
if(settings.Unflatten(&file)!=B_OK)
{
STRACE(("Error unflattening settings file %s\n",path.String()));
return;
}
BString itemtext;
if(settings.FindString("decorator",&itemtext)!=B_OK)
{
STRACE(("Couldn't find decorator name in settings file %s\n",path.String()));
return;
}
for(int32 i=0;i<declist->CountItems();i++)
{
BStringItem *item=(BStringItem*)declist->ItemAt(i);
if(item && itemtext.Compare(item->Text())==0)
{
BString itemtext;
if(settings.FindString("decorator",&itemtext)==B_OK)
{
for(int32 i=0;i<declist->CountItems();i++)
{
BStringItem *item=(BStringItem*)declist->ItemAt(i);
if(item && itemtext.Compare(item->Text())==0)
{
declist->Select(i);
return;
}
}
}
// We got this far, so something must have gone wrong. Select the first item
declist->Select(0L);
declist->Select(i);
return;
}
STRACE(("Error unflattening settings file %s\n",path.String()));
}
}
void DecView::NotifyServer(void)
{
// Send a message to the app_server to tell it which decorator we have selected.
BStringItem *item=(BStringItem*)declist->ItemAt(declist->CurrentSelection());
if(!item)
return;
port_id serverport=find_port(SERVER_PORT_NAME);
if(serverport==B_NAME_NOT_FOUND)
return;
BPrivate::PortLink pl(serverport);
pl.StartMessage(AS_SET_DECORATOR);
pl.AttachString(item->Text());
pl.Flush();
}
void DecView::GetDecorators(void)
{
STRACE(("DecView::GetDecorators()\n"));
BDirectory dir;
BEntry entry;
BPath path;
BString name;
BStringItem *item;
status_t dirstat=dir.SetTo(DECORATORS_DIR);
if(dirstat!=B_OK)
if(dirstat!=B_OK)
{
// We couldn't set the directory, so more than likely it just
// doesn't exist. Create it and return an empty menu.
switch(dirstat)
{
case B_NAME_TOO_LONG:
{
STRACE(("DecView::GetDecorators: Couldn't open the folder for decorators - path string too long.\n"));
break;
}
case B_ENTRY_NOT_FOUND:
{
STRACE(("Couldn't open the folder for decorators - entry not found\n"));
break;
}
case B_BAD_VALUE:
{
STRACE(("DecView::GetDecorators: Couldn't open the folder for decorators - bad path\n"));
break;
}
case B_NO_MEMORY:
{
STRACE(("DecView::GetDecorators: No memory left. We're probably going to crash now\n"));
break;
}
case B_BUSY:
{
STRACE(("DecView::GetDecorators: Couldn't open the folder for decorators - node busy\n"));
break;
}
case B_FILE_ERROR:
{
STRACE(("DecView::GetDecorators: Couldn't open the folder for decorators - general file error\n"));
break;
}
case B_NO_MORE_FDS:
{
STRACE(("DecView::GetDecorators: Couldn't open the folder for decorators - no more file descriptors\n"));
break;
}
}
return;
}
int32 count=dir.CountEntries();
for(int32 i=0;i<count;i++)
{
dir.GetNextEntry(&entry);
entry.GetPath(&path);
name=path.Path();
name.Remove(0,name.FindLast('/')+1);
item=new BStringItem(name.String());
declist->AddItem(item);
}
}
bool DecView::LoadDecorator(const char *path)
{
if(!path)
return false;
create_decorator *pcreatefunc=NULL;
// get_decorator_version *pversionfunc=NULL;
status_t stat;
image_id addon;
addon=load_add_on(path);
/* stat=get_image_symbol(addon, "get_decorator_version", B_SYMBOL_TYPE_TEXT, (void**)&pversionfunc);
if(stat!=B_OK)
{
unload_add_on(addon);
STRACE(("LoadDecorator(%s): Couldn't get version symbol\n",path));
return false;
}
*/
// As of now, we do nothing with decorator versions, but the possibility exists
// that the API will change even though I cannot forsee any reason to do so. If
// we *did* do anything with decorator versions, the assignment to a global would
// go here.
stat=get_image_symbol(addon, "instantiate_decorator", B_SYMBOL_TYPE_TEXT, (void**)&pcreatefunc);
if(stat!=B_OK)
{
unload_add_on(addon);
STRACE(("LoadDecorator(%s): Couldn't get allocation symbol\n",path));
return false;
}
if(decorator!=NULL)
{
STRACE(("LoadDecorator(): Deleting old decorator\n"));
delete decorator;
decorator=NULL;
// NEVER, *EVER*, call unload_add_on() if there is _any_ possibility,
// no matter remote, that memory might still be in use when it is called.
// It wll lead to unpredictable crashes which have almost nothing to
// do with the *real* cause.
// unload_add_on(decorator_id);
}
decorator_id=addon;
decorator=pcreatefunc(BRect(25,25,125,125),B_TITLED_WINDOW_LOOK,
B_NORMAL_WINDOW_FEEL,0);
decorator->SetDriver(driver);
decorator->SetFocus(true);
// decorator->Draw();
return true;
}
BString DecView::ConvertIndexToPath(int32 index)
{
BStringItem *item=(BStringItem*)declist->ItemAt(index);
if(!item)
{
STRACE(("ConvertIndexToPath(): Couldn't get item for index %ld\n",index));
return NULL;
}
BString path(DECORATORS_DIR);
path+=item->Text();
STRACE(("ConvertIndexToPath(): returned %s\n",path.String()));
return BString(path.String());
}
void DecView::SetColors(const ColorSet &set)
{
STRACE(("DecView::SetColors\n"));
colorset=set;
if(decorator)
{
driver->FillRect(preview_bounds,&ldata);
decorator->SetColors(colorset);
decorator->Draw();
}
else
{
STRACE(("DecView::SetColors: NULL decorator\n"));
}
}
bool DecView::UnpackSettings(ColorSet *set, const BMessage &msg)
{
if(!set)
{
STRACE(("UnpackSettings(): NULL parameter\n"));
return false;
}
rgb_color *col;
ssize_t size;
if(msg.FindData("Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->panel_background=*col;
if(msg.FindData("Panel Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->panel_text=*col;
if(msg.FindData("Document Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->document_background=*col;
if(msg.FindData("Document Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->document_text=*col;
if(msg.FindData("Control Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->control_background=*col;
if(msg.FindData("Control Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->control_text=*col;
if(msg.FindData("Control Highlight",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->control_highlight=*col;
if(msg.FindData("Control Border",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->control_border=*col;
if(msg.FindData("Tooltip Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->tooltip_background=*col;
if(msg.FindData("Tooltip Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->tooltip_text=*col;
if(msg.FindData("Menu Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->menu_background=*col;
if(msg.FindData("Selected Menu Item Background",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->menu_selected_background=*col;
if(msg.FindData("Navigation Base",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->keyboard_navigation_base=*col;
if(msg.FindData("Navigation Pulse",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->keyboard_navigation_pulse=*col;
if(msg.FindData("Menu Item Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->menu_text=*col;
if(msg.FindData("Selected Menu Item Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->menu_selected_text=*col;
if(msg.FindData("Selected Menu Item Border",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->menu_selected_border=*col;
if(msg.FindData("Success",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->success=*col;
if(msg.FindData("Failure",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->failure=*col;
if(msg.FindData("Shine",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->shine=*col;
if(msg.FindData("Shadow",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->shadow=*col;
if(msg.FindData("Window Tab",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->window_tab=*col;
if(msg.FindData("Window Tab Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->window_tab_text=*col;
if(msg.FindData("Inactive Window Tab",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->inactive_window_tab=*col;
if(msg.FindData("Inactive Window Tab Text",(type_code)'RGBC',(const void**)&col,&size)==B_OK)
set->inactive_window_tab_text=*col;
return true;
}
+11 -32
View File
@@ -28,46 +28,25 @@
#define DEC_VIEW_H_
#include <View.h>
#include <Message.h>
#include <ListItem.h>
#include <ListView.h>
#include <Button.h>
#include <ScrollView.h>
#include <ScrollBar.h>
#include <String.h>
#include "ColorSet.h"
#include "LayerData.h"
class PreviewDriver;
class Decorator;
class DecView : public BView
{
public:
DecView(BRect frame, const char *name, int32 resize, int32 flags);
~DecView(void);
void AllAttached(void);
void MessageReceived(BMessage *msg);
void SaveSettings(void);
void LoadSettings(void);
void NotifyServer(void);
void GetDecorators(void);
void SetColors(const ColorSet &set);
bool LoadDecorator(const char *path);
BString ConvertIndexToPath(int32 index);
DecView(BRect frame, const char *name, int32 resize, int32 flags);
void AttachedToWindow(void);
void MessageReceived(BMessage *msg);
void SaveSettings(void);
void LoadSettings(void);
protected:
bool UnpackSettings(ColorSet *set, const BMessage &msg);
BButton *apply;
BListView *declist;
BMessage settings;
BScrollView *scrollview;
PreviewDriver *driver;
BView *preview;
Decorator *decorator;
image_id decorator_id;
BString decpath;
LayerData ldata;
uint64 pat_solid_high;
ColorSet colorset;
BButton *apply;
BListView *declist;
BView *preview;
};
#endif
+11 -8
View File
@@ -1,22 +1,25 @@
SubDir OBOS_TOP src prefs appearance ;
UseFreeTypeHeaders ;
UsePrivateHeaders app [ FDirName servers app ] ;
Preference Appearance :
APRMain.cpp
APRView.cpp
APRWindow.cpp
CurView.cpp
DecView.cpp
FontMenu.cpp
MenuView.cpp
PreviewDriver.cpp
SysCursorAPI.cpp
ColorWell.cpp
ColorWhichItem.cpp
CursorWhichItem.cpp
: libopenbeos.so libbe.so libtranslation.so libappserver.so
# These are currently disabled while everything else is being worked on
#CurView.cpp
#CursorWhichItem.cpp
#SysCursorAPI.cpp
# These exist for post-R1, so they are disabled for now
#FontMenu.cpp
#MenuView.cpp
: libbe.so libopenbeos.so libtranslation.so libappserver.so
: Appearance.rdef
;
-240
View File
@@ -1,240 +0,0 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: PreviewDriver.cpp
// Author: DarkWyrm <[email protected]>
// Description: Class to display decorators from regular BApplications
//
//------------------------------------------------------------------------------
/*
PreviewDriver:
Module based on app_server's ViewDriver for the purpose of Decorator previews.
The concept is to have a view draw a bitmap, which is a "frame buffer"
of sorts, utilize a second view to write to it. This cuts out
the most problems with having a crapload of code to get just right without
having to write a bunch of unit tests
Components: 3 classes, VDView, VDWindow, and ViewDriver
PreviewDriver - a wrapper class which mostly posts messages to the VDWindow
PDView - doesn't do all that much except display the rendered bitmap
*/
//#define DEBUG_DRIVER_MODULE
//#define DEBUG_SERVER_EMU
//#define DISABLE_SERVER_EMU
#include <stdio.h>
#include <iostream.h>
#include <Message.h>
#include <Region.h>
#include <Bitmap.h>
#include <OS.h>
#include <Font.h>
#include <GraphicsDefs.h>
#include "PortLink.h"
#include "PatternHandler.h"
#include "PreviewDriver.h"
#include "LayerData.h"
#include "ColorSet.h"
#include <ft2build.h>
#include FT_FREETYPE_H
BRect preview_bounds(0,0,150,150);;
PVView::PVView(const BRect &bounds)
: BView(bounds,"previewdriver_view",B_FOLLOW_NONE, B_WILL_DRAW)
{
viewbmp=new BBitmap(bounds,B_RGB32,true);
}
PVView::~PVView(void)
{
delete viewbmp;
}
void PVView::AttachedToWindow(void)
{
win=Window();
}
void PVView::DetachedFromWindow(void)
{
win=NULL;
}
void PVView::Draw(BRect rect)
{
if(viewbmp)
{
DrawBitmapAsync(viewbmp,rect,rect);
Sync();
}
}
PreviewDriver::PreviewDriver(void)
{
fView=new PVView(preview_bounds);
fDrawView=new BView(preview_bounds,"drawview",B_FOLLOW_ALL, 0);
}
PreviewDriver::~PreviewDriver(void)
{
delete fView;
delete fDrawView;
}
bool PreviewDriver::Initialize(void)
{
fView->viewbmp->Lock();
fView->viewbmp->AddChild(fDrawView);
fView->viewbmp->Unlock();
return true;
}
void PreviewDriver::Shutdown(void)
{
fView->viewbmp->Lock();
fView->viewbmp->RemoveChild(fDrawView);
fView->viewbmp->Unlock();
}
void PreviewDriver::InvertRect(const BRect &r)
{
fView->viewbmp->Lock();
fDrawView->InvertRect(r);
fDrawView->Sync();
fView->Invalidate(r);
fView->viewbmp->Unlock();
}
void PreviewDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata,
const DrawData *d)
{
if(!linedata || !d)
return;
fView->viewbmp->Lock();
fDrawView->SetHighColor(d->HighColor().GetColor32());
fDrawView->SetLowColor(d->LowColor().GetColor32());
fDrawView->SetPenSize(d->PenSize());
fDrawView->BeginLineArray(numlines);
for(int32 i=0; i<numlines; i++)
{
const LineArrayData *data=&(linedata[i]);
fDrawView->AddLine(data->pt1,data->pt2,data->color);
}
fDrawView->EndLineArray();
fDrawView->Sync();
fView->Invalidate();
fView->viewbmp->Unlock();
}
bool PreviewDriver::Lock(bigtime_t timeout=B_INFINITE_TIMEOUT)
{
return true;
}
void PreviewDriver::Unlock(void)
{
}
float
PreviewDriver::StringWidth(const char *string, int32 length, const DrawData *d)
{
SetDrawData(d,true);
fView->viewbmp->Lock();
float value=fDrawView->StringWidth(string,length);
fView->viewbmp->Unlock();
return value;
}
float
PreviewDriver::StringWidth(const char *string,int32 length, const ServerFont &font)
{
DrawData d;
d.SetFont(font);
return StringWidth(string,length,&d);
}
void
PreviewDriver::SetDrawData(const DrawData *d, bool set_font_data)
{
if(!d)
return;
fView->viewbmp->Lock();
BRegion reg=*d->ClippingRegion();
fDrawView->ConstrainClippingRegion(&reg);
fDrawView->SetPenSize(d->PenSize());
fDrawView->SetDrawingMode(d->GetDrawingMode());
fDrawView->SetHighColor(d->HighColor().GetColor32());
fDrawView->SetLowColor(d->LowColor().GetColor32());
fDrawView->SetScale(d->Scale());
fDrawView->MovePenTo(d->PenLocation());
if(set_font_data)
{
BFont font;
const ServerFont *sf=&(d->Font());
if(!sf)
return;
font.SetFamilyAndStyle(sf->GetFamily(),sf->GetStyle());
font.SetFlags(sf->Flags());
font.SetEncoding(sf->Encoding());
font.SetSize(sf->Size());
font.SetRotation(sf->Rotation());
font.SetShear(sf->Shear());
font.SetSpacing(sf->Spacing());
fDrawView->SetFont(&font);
}
fView->viewbmp->Unlock();
}
float
PreviewDriver::StringHeight(const char *string,int32 length,
const DrawData *d)
{
SetDrawData(d,true);
fView->viewbmp->Lock();
font_height fh;
fDrawView->GetFontHeight(&fh);
float value=fh.ascent+fh.descent+fh.leading;
fView->viewbmp->Unlock();
return value;
}
-313
View File
@@ -1,313 +0,0 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: PreviewDriver.cpp
// Author: DarkWyrm <[email protected]>
// Description: Class to display decorators from regular BApplications
//
//------------------------------------------------------------------------------
#ifndef _PREVIEWDRIVER_H_
#define _PREVIEWDRIVER_H_
#include <Application.h>
#include <Window.h>
#include <View.h>
#include <GraphicsCard.h>
#include <Cursor.h>
#include <Message.h>
#include <Rect.h>
#include <Region.h>
#include "DisplayDriver.h"
class BBitmap;
class PortLink;
class ServerCursor;
class ColorSet;
class PVView : public BView
{
public:
PVView(const BRect &bounds);
~PVView(void);
void AttachedToWindow(void);
void DetachedFromWindow(void);
void Draw(BRect rect);
BBitmap *viewbmp;
BWindow *win;
};
class PreviewDriver : public DisplayDriver
{
public:
PreviewDriver();
virtual ~PreviewDriver();
// when implementing, be sure to call the inherited version
virtual bool Initialize();
virtual void Shutdown();
// clipping for all drawing functions
virtual void ConstrainClippingRegion(BRegion* region) {}
// Graphics calls implemented in DisplayDriver
virtual void CopyRegion( /*const*/ BRegion* region,
int32 xOffset,
int32 yOffset) {}
virtual void CopyRegionList( BList* list,
BList* pList,
int32 rCount,
BRegion* clipReg) {}
virtual void InvertRect( const BRect &r);
virtual void DrawBitmap( ServerBitmap *bitmap,
const BRect &source,
const BRect &dest,
const DrawData *d) {}
virtual void FillArc( const BRect &r,
const float &angle,
const float &span,
const DrawData *d) {}
virtual void FillBezier( BPoint *pts,
const DrawData *d) {}
virtual void FillEllipse( const BRect &r,
const DrawData *d) {}
virtual void FillPolygon( BPoint *ptlist,
int32 numpts,
const BRect &bounds,
const DrawData *d) {}
virtual void FillRect( const BRect &r,
const RGBColor &color) {}
virtual void FillRect( const BRect &r,
const DrawData *d) {}
virtual void FillRegion( BRegion &r,
const DrawData *d) {}
virtual void FillRoundRect( const BRect &r,
const float &xrad,
const float &yrad,
const DrawData *d) {}
virtual void FillShape( const BRect &bounds,
const int32 &opcount,
const int32 *oplist,
const int32 &ptcount,
const BPoint *ptlist,
const DrawData *d) {}
virtual void FillTriangle( BPoint *pts,
const BRect &bounds,
const DrawData *d) {}
virtual void StrokeArc( const BRect &r,
const float &angle,
const float &span,
const DrawData *d) {}
virtual void StrokeBezier( BPoint *pts,
const DrawData *d) {}
virtual void StrokeEllipse( const BRect &r,
const DrawData *d) {}
// this version used by Decorator
virtual void StrokeLine( const BPoint &start,
const BPoint &end,
const RGBColor &color) {}
virtual void StrokeLine( const BPoint &start,
const BPoint &end,
DrawData *d) {}
virtual void StrokeLineArray(const int32 &numlines,
const LineArrayData *data,
const DrawData *d);
// this version used by Decorator
virtual void StrokePoint( const BPoint &pt,
const RGBColor &color) {}
virtual void StrokePoint( const BPoint &pt,
DrawData *d) {}
virtual void StrokePolygon( BPoint *ptlist,
int32 numpts,
const BRect &bounds,
const DrawData *d,
bool is_closed=true) {}
// this version used by Decorator
virtual void StrokeRect( const BRect &r,
const RGBColor &color) {}
virtual void StrokeRect( const BRect &r,
const DrawData *d) {}
virtual void StrokeRegion( BRegion &r,
const DrawData *d) {}
virtual void StrokeRoundRect(const BRect &r,
const float &xrad,
const float &yrad,
const DrawData *d) {}
virtual void StrokeShape( const BRect &bounds,
const int32 &opcount,
const int32 *oplist,
const int32 &ptcount,
const BPoint *ptlist,
const DrawData *d) {}
virtual void StrokeTriangle( BPoint *pts,
const BRect &bounds,
const DrawData *d) {}
// Font-related calls
// DrawData is NOT const because this call updates the pen position in the passed DrawData
virtual void DrawString( const char *string,
const int32 &length,
const BPoint &pt,
DrawData *d) {}
virtual void DrawString( const char *string,
const int32 &length,
const BPoint &pt,
const RGBColor &color,
escapement_delta *delta=NULL) {}
virtual float StringWidth( const char *string,
int32 length,
const DrawData *d);
virtual float StringWidth( const char *string,
int32 length,
const ServerFont &font);
virtual float StringHeight( const char *string,
int32 length,
const DrawData *d);
virtual void GetBoundingBoxes(const char *string,
int32 count,
font_metric_mode mode,
escapement_delta *delta,
BRect *rectarray,
const DrawData *d) {}
virtual void GetEscapements( const char *string,
int32 charcount,
escapement_delta *delta,
escapement_delta *escapements,
escapement_delta *offsets,
const DrawData *d) {}
virtual void GetEdges( const char *string,
int32 charcount,
edge_info *edgearray,
const DrawData *d) {}
virtual void GetHasGlyphs( const char *string,
int32 charcount,
bool *hasarray) {}
virtual void GetTruncatedStrings(const char **instrings,
const int32 &stringcount,
const uint32 &mode,
const float &maxwidth,
char **outstrings) {}
virtual void HideCursor() {}
virtual bool IsCursorHidden() { return false; }
virtual void MoveCursorTo( const float &x,
const float &y) {}
virtual void ShowCursor() {}
virtual void ObscureCursor() {}
virtual void SetCursor(ServerCursor *cursor) {}
virtual BPoint GetCursorPosition() { return BPoint(0,0); }
virtual bool IsCursorObscured(bool state) { return false; }
// Virtual methods which need to be implemented by each subclass
// These two will rarely be implemented by subclasses,
// but it still needs to be possible
virtual bool Lock(bigtime_t timeout = B_INFINITE_TIMEOUT);
virtual void Unlock();
// display mode access
virtual status_t SetMode(const display_mode &mode) { return B_OK; }
virtual void GetMode(display_mode &mode) {}
const display_mode* DisplayMode()
{ return &fDisplayMode; }
virtual bool DumpToFile(const char *path) { return false; }
virtual ServerBitmap* DumpToBitmap() { return NULL; }
virtual status_t SetDPMSMode(const uint32 &state) { return B_ERROR; }
virtual uint32 DPMSMode() { return 0; }
virtual uint32 DPMSCapabilities() { return 0; }
virtual status_t GetDeviceInfo(accelerant_device_info *info) { return B_ERROR; }
virtual status_t GetModeList(display_mode **mode_list,
uint32 *count) { return B_ERROR; }
virtual status_t GetPixelClockLimits(display_mode *mode,
uint32 *low,
uint32 *high) { return B_ERROR; }
virtual status_t GetTimingConstraints(display_timing_constraints *dtc) { return B_ERROR; }
virtual status_t ProposeMode(display_mode *candidate,
const display_mode *low,
const display_mode *high) { return B_ERROR; }
virtual status_t WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT) { return B_ERROR; }
// This is only for the PreviewDriver
BView * View(void) { return (BView*)fView; };
protected:
void SetDrawData(const DrawData *d,
bool set_font_data);
display_mode fDisplayMode;
BBitmap *fFramebuffer;
BView *fDrawView;
// Region used to track of invalid areas for the
// Begin/EndLineArray functions
BRegion fArrayRegion;
PVView *fView;
};
extern BRect preview_bounds;
#endif