From 710f36e3316b8d8a5477491cee434745019998a4 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Fri, 6 May 2016 10:47:55 +0200 Subject: [PATCH 01/12] New feature: Option to only apply the first matching rule Based on changes by Pete Goodeve. Added a checkbox to toggle setting to only apply the first matching rule. --- sources/FilerDefs.h | 1 + sources/MainWindow.cpp | 17 ++++++++- sources/MainWindow.h | 1 + sources/RuleRunner.cpp | 9 ++++- sources/RuleRunner.h | 2 + sources/RuleTab.cpp | 41 ++++++++++++-------- sources/RuleTab.h | 3 ++ sources/main.cpp | 87 ++++++++++++++++++++++++++++++++---------- sources/main.h | 13 +++++-- 9 files changed, 133 insertions(+), 41 deletions(-) diff --git a/sources/FilerDefs.h b/sources/FilerDefs.h index f35167d..23339d0 100644 --- a/sources/FilerDefs.h +++ b/sources/FilerDefs.h @@ -39,6 +39,7 @@ static const char kSettingsFile[] = "Filer_settings"; #define MSG_RULE_SELECTED 'rlsl' #define MSG_MOVE_RULE_UP 'mvup' #define MSG_MOVE_RULE_DOWN 'mvdn' +#define MSG_MATCH_ONCE 'chon' #define MSG_STARTSTOP_AUTOFILER 'ssaf' #define MSG_AUTOFILER_AUTORUN 'afas' diff --git a/sources/MainWindow.cpp b/sources/MainWindow.cpp index 8cc0c5a..4671111 100644 --- a/sources/MainWindow.cpp +++ b/sources/MainWindow.cpp @@ -12,6 +12,7 @@ #include #include +#include "main.h" #include "MainWindow.h" @@ -91,6 +92,13 @@ MainWindow::MessageReceived(BMessage* msg) // msg->PrintToStream(); switch (msg->what) { + case MSG_MATCH_ONCE: + { + App* my_app = dynamic_cast(be_app); + my_app->ToggleMatchSetting(); + SaveSettings(); + break; + } default: { BWindow::MessageReceived(msg); @@ -104,6 +112,7 @@ MainWindow::LoadSettings() { fPosition.Set(-1, -1, -1, -1); fTabSelection = 0; + fMatchBoxSetting = false; BPath path; BMessage msg; @@ -119,6 +128,8 @@ MainWindow::LoadSettings() fPosition.Set(-1, -1, -1, -1); if (msg.FindInt32("tab", &fTabSelection) != B_OK) fTabSelection = 0; + if (msg.FindBool("match", &fMatchBoxSetting) != B_OK) + fMatchBoxSetting = false; } } } @@ -130,7 +141,10 @@ MainWindow::SaveSettings() { BRect pos = Frame(); int32 tab = fTabView->Selection(); - if (pos == fPosition && tab == fTabSelection) + App* my_app = dynamic_cast(be_app); + bool match = my_app->GetMatchSetting(); + + if (pos == fPosition && tab == fTabSelection && match == fMatchBoxSetting) return; BPath path; @@ -153,6 +167,7 @@ MainWindow::SaveSettings() if (ret == B_OK) { msg.AddRect("pos", pos); msg.AddInt32("tab", tab); + msg.AddBool("match", match); msg.Flatten(&file); } } diff --git a/sources/MainWindow.h b/sources/MainWindow.h index c6049ce..6860977 100644 --- a/sources/MainWindow.h +++ b/sources/MainWindow.h @@ -42,6 +42,7 @@ class MainWindow : public BWindow { BRect fPosition; int32 fTabSelection; + bool fMatchBoxSetting; BTabView* fTabView; DropZoneTab* fDropZone; diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index 881dc4e..d55d0ab 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -172,6 +172,7 @@ static const char* sActions[] = "Move it to the Trash", "Delete it", "Terminal command…", + "Continue", // Future expansion // "Shred it", @@ -476,6 +477,8 @@ RuleRunner::RunAction(const BMessage& action, entry_ref& ref) return TrashAction(action, ref); else if (actionname.Compare("Delete it") == 0) return DeleteAction(action, ref); + else if (actionname.Compare("Continue") == 0) + return CONTINUE_TESTS; // arbitrary pos non-B_OK value return B_ERROR; } @@ -525,11 +528,14 @@ RuleRunner::RunRule(FilerRule* rule, entry_ref& ref) // required to do this is for the particular action to change the ref // passed to it. status_t status = RunAction(*action, realref); + if (status == CONTINUE_TESTS) // keep ref in sync with reality + ref = realref; if (status != B_OK) return status; } + return B_OK; } - return B_OK; + return CONTINUE_TESTS; } @@ -1234,6 +1240,7 @@ LoadRules(BObjectList* ruleList) query.finalize(); } db.close(); + return B_OK; } diff --git a/sources/RuleRunner.h b/sources/RuleRunner.h index 493fc8d..ee4aff4 100644 --- a/sources/RuleRunner.h +++ b/sources/RuleRunner.h @@ -23,6 +23,8 @@ enum TEST_TYPE_ANY }; +// Pos-non-zero status value to specify checking more rules after match +#define CONTINUE_TESTS 1 class RuleRunner { diff --git a/sources/RuleTab.cpp b/sources/RuleTab.cpp index de92e69..0334e2e 100644 --- a/sources/RuleTab.cpp +++ b/sources/RuleTab.cpp @@ -16,6 +16,7 @@ #include "FilerRule.h" #include "FilerDefs.h" +#include "main.h" #include "RuleEditWindow.h" #include "RuleItem.h" #include "RuleRunner.h" @@ -98,6 +99,10 @@ RuleTab::~RuleTab() void RuleTab::_BuildLayout() { + fMatchBox = new BCheckBox("matchoncebox", + "Apply only the first matching rule", + new BMessage(MSG_MATCH_ONCE)); + fRuleItemList = new BListView("rulelist", B_SINGLE_SELECTION_LIST, B_WILL_DRAW | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE | B_NAVIGABLE); fScrollView = new BScrollView("listscroll", fRuleItemList, @@ -105,7 +110,6 @@ RuleTab::_BuildLayout() fRuleItemList->SetSelectionMessage(new BMessage(MSG_RULE_SELECTED)); fRuleItemList->SetInvocationMessage(new BMessage(MSG_SHOW_EDIT_WINDOW)); -// fScrollView->ScrollBar(B_HORIZONTAL)->SetRange(0.0, 0.0); fAddButton = new BButton("addbutton", "Add" B_UTF8_ELLIPSIS, new BMessage(MSG_SHOW_ADD_WINDOW)); @@ -127,22 +131,25 @@ RuleTab::_BuildLayout() fMoveDownButton->SetEnabled(false); static const float spacing = be_control_look->DefaultItemSpacing(); - BLayoutBuilder::Group<>(this, B_HORIZONTAL, B_USE_DEFAULT_SPACING) + BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_DEFAULT_SPACING) .SetInsets(spacing) - .AddGroup(B_VERTICAL, 10.0f) - .Add(fScrollView) - .AddGroup(B_HORIZONTAL) - .AddGlue() - .Add(fAddButton) - .Add(fEditButton) - .Add(fRemoveButton) + .Add(fMatchBox) + .AddGroup(B_HORIZONTAL) + .AddGroup(B_VERTICAL, 10.0f) + .Add(fScrollView) + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(fAddButton) + .Add(fEditButton) + .Add(fRemoveButton) + .AddGlue() + .End() + .End() + .AddGroup(B_VERTICAL) + .Add(fMoveUpButton) + .Add(fMoveDownButton) .AddGlue() .End() - .End() - .AddGroup(B_VERTICAL) - .Add(fMoveUpButton) - .Add(fMoveDownButton) - .AddGlue() .End(); } @@ -150,6 +157,7 @@ RuleTab::_BuildLayout() void RuleTab::AttachedToWindow() { + fMatchBox->SetTarget(Looper()); fAddButton->SetTarget(this); fEditButton->SetTarget(this); fRemoveButton->SetTarget(this); @@ -161,7 +169,10 @@ RuleTab::AttachedToWindow() BMessenger messenger(this); BMessage message(MSG_RULE_SELECTED); messenger.SendMessage(&message); - } + } + App* my_app = dynamic_cast(be_app); + fMatchBox->SetValue(my_app->GetMatchSetting()); + BView::AttachedToWindow(); } diff --git a/sources/RuleTab.h b/sources/RuleTab.h index bd9512a..bd70938 100644 --- a/sources/RuleTab.h +++ b/sources/RuleTab.h @@ -10,6 +10,7 @@ #define RULETAB_H #include +#include #include #include @@ -36,6 +37,8 @@ class RuleTab : public BView BObjectList*fRuleList; + BCheckBox* fMatchBox; + BButton* fAddButton; BButton* fEditButton; BButton* fRemoveButton; diff --git a/sources/main.cpp b/sources/main.cpp index fe2e6f8..81ff8f6 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -30,13 +30,15 @@ App::App() fRefList(NULL), fRuleList(NULL), fMainWin(NULL), - fQuitRequested(false) + fQuitRequested(false), + fMatchSetting(false) { fRefList = new BObjectList(20, true); fRuleList = new BObjectList(20, true); // SetupTypeMenu(); + LoadRuleSettings(); LoadRules(fRuleList); } @@ -48,6 +50,41 @@ App::~App() } +void +App::LoadRuleSettings() +{ + BPath path; + BMessage msg; + + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { + status_t ret = path.Append(kSettingsFolder); + if (ret == B_OK) { + path.Append(kSettingsFile); + BFile file(path.Path(), B_READ_ONLY); + + if ((file.InitCheck() == B_OK) && (msg.Unflatten(&file) == B_OK)) { + if (msg.FindBool("match", &fMatchSetting) != B_OK) + fMatchSetting = false; + } + } + } +} + + +bool +App::GetMatchSetting() +{ + return fMatchSetting; +} + + +void +App::ToggleMatchSetting() +{ + fMatchSetting = !fMatchSetting; +} + + void App::MessageReceived(BMessage* msg) { @@ -141,25 +178,6 @@ App::ProcessFiles() } -void -App::ShowHTML(const char* docfile) -{ - app_info info; - BPath path; - be_roster->GetActiveAppInfo(&info); - BEntry entry(&info.ref); - - entry.GetPath(&path); - path.GetParent(&path); - path.Append(docfile); - - entry = path.Path(); - entry_ref ref; - entry.GetRef(&ref); - be_roster->Launch(&ref); -} - - void App::FileRef(entry_ref ref) { @@ -168,7 +186,15 @@ App::FileRef(entry_ref ref) for (int32 i = 0; i < fRuleList->CountItems(); i++) { FilerRule* rule = fRuleList->ItemAt(i); - runner.RunRule(rule, ref); + status_t res = runner.RunRule(rule,ref); + printf("return: %i\n", res); + + // default stop here if rule was successful + // note that the loop will continue if a rule has an error + if (res == B_OK && fMatchSetting == true) { + printf("Applying first matching rule only!\n"); + break; + } } } @@ -228,6 +254,25 @@ App::SetupTypeMenu() } +void +App::ShowHTML(const char* docfile) +{ + app_info info; + BPath path; + be_roster->GetActiveAppInfo(&info); + BEntry entry(&info.ref); + + entry.GetPath(&path); + path.GetParent(&path); + path.Append(docfile); + + entry = path.Path(); + entry_ref ref; + entry.GetRef(&ref); + be_roster->Launch(&ref); +} + + int main() { diff --git a/sources/main.h b/sources/main.h index f202b6e..9bba9b7 100644 --- a/sources/main.h +++ b/sources/main.h @@ -31,15 +31,22 @@ class App : public BApplication void SetupTypeMenu(); void ShowHTML(const char* docfile); void FileRef(entry_ref ref); - + + bool GetMatchSetting(); + void ToggleMatchSetting(); + private: + void LoadRuleSettings(); +// void SaveRuleSettings(); void ProcessFiles(); - BObjectList* fRefList; - BObjectList* fRuleList; MainWindow* fMainWin; bool fQuitRequested; + bool fMatchSetting; + + BObjectList* fRefList; + BObjectList* fRuleList; }; #endif // MAIN_H From cc9b74a354175e561e978406b44a3390e224e6fc Mon Sep 17 00:00:00 2001 From: Humdinger Date: Sat, 7 May 2016 09:09:24 +0200 Subject: [PATCH 02/12] Bugfix in EditRuleWindow After changing a rule to add another action, opening it for editing again kept showing "Move it to..." instead of the previously set action. Fixed by emptying and reloading the list of rules. The AddTest button now sends the correct message... Removed the case MSG_REVERT, as it was never called before the GUI changes and now wouldn't work anyway with the live-updated settings. Added Pete Goodeve to the contributers where I adopted his changes to stop matching rules after the first was found and introducing the "Continue" action. --- sources/FilerDefs.h | 1 - sources/RuleEditWindow.cpp | 2 +- sources/RuleRunner.cpp | 4 +++- sources/RuleTab.cpp | 10 ---------- sources/main.cpp | 4 +++- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/sources/FilerDefs.h b/sources/FilerDefs.h index 23339d0..a93e9af 100644 --- a/sources/FilerDefs.h +++ b/sources/FilerDefs.h @@ -35,7 +35,6 @@ static const char kSettingsFile[] = "Filer_settings"; #define MSG_SHOW_ADD_WINDOW 'shaw' #define MSG_SHOW_EDIT_WINDOW 'shew' #define MSG_REMOVE_RULE 'shrr' -#define MSG_REVERT 'rvrt' #define MSG_RULE_SELECTED 'rlsl' #define MSG_MOVE_RULE_UP 'mvup' #define MSG_MOVE_RULE_DOWN 'mvdn' diff --git a/sources/RuleEditWindow.cpp b/sources/RuleEditWindow.cpp index 5764478..274b964 100644 --- a/sources/RuleEditWindow.cpp +++ b/sources/RuleEditWindow.cpp @@ -68,7 +68,7 @@ RuleEditWindow::RuleEditWindow(BRect& rect, FilerRule* rule, BHandler* caller) top->AddChild(fTestGroup); fAddTest = new BButton(BRect(0, 0, 1, 1),"addtestbutton", "Add", - new BMessage(MSG_ADD_ACTION), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); + new BMessage(MSG_ADD_TEST), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); fAddTest->ResizeToPreferred(); fAddTest->MoveTo(10.0, fTestGroup->Bounds().bottom - 10.0 - fAddTest->Bounds().Height()); diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index d55d0ab..de6a9b3 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -2,7 +2,9 @@ RuleRunner.cpp: class to handle running test and actions for the rules Released under the MIT license. Written by DarkWyrm , Copyright 2008 - Contributed by: Humdinger , 2016 + Contributed by: + Humdinger , 2016 + Pete Goodeve */ #include diff --git a/sources/RuleTab.cpp b/sources/RuleTab.cpp index 0334e2e..b751d82 100644 --- a/sources/RuleTab.cpp +++ b/sources/RuleTab.cpp @@ -185,7 +185,6 @@ RuleTab::MessageReceived(BMessage* message) { case MSG_SHOW_ADD_WINDOW: { - printf("Show Add Window\n"); BRect frame(Frame()); ConvertToScreen(&frame); frame.right = frame.left + 400; @@ -258,16 +257,7 @@ RuleTab::MessageReceived(BMessage* message) } SaveRules(fRuleList); - break; - } - case MSG_REVERT: - { - while (fRuleItemList->CountItems() > 0) - RemoveRule((RuleItem*)fRuleItemList->ItemAt(0L)); fRuleList->MakeEmpty(); - fEditButton->SetEnabled(false); - fRemoveButton->SetEnabled(false); - LoadRules(fRuleList); break; } diff --git a/sources/main.cpp b/sources/main.cpp index 81ff8f6..0465f30 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -3,7 +3,9 @@ Released under the MIT license. Written by DarkWyrm , Copyright 2008 - Contributed by: Humdinger , 2016 + Contributed by: + Humdinger , 2016 + Pete Goodeve */ #include From b20016e95aa19dac420d471805ca92aba03419dc Mon Sep 17 00:00:00 2001 From: Humdinger Date: Sat, 7 May 2016 10:31:21 +0200 Subject: [PATCH 03/12] ToolTip for the Action view of the RuleEditWindow Add a ToolTip with the substitution variables. Corrected vertical offset of the test add/remove buttons. --- documentation/images/filer_icon_64.png | Bin 3223 -> 6389 bytes sources/ActionView.cpp | 13 +++++++++++++ sources/RuleEditWindow.cpp | 3 +-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/documentation/images/filer_icon_64.png b/documentation/images/filer_icon_64.png index f617f5c5bbb4b59697d14f9d19492bdf20a3ef16..d5a3ea440e1279bd14bccb00b3243fb46f91b6b9 100644 GIT binary patch literal 6389 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 DM{#2M literal 3223 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�WJW+cMd=YJ}!)Sm@XgK!CjUu3O# z(eaDa1+g5!^2Nu@;+?F_{86U*-^QZt;J%`WioD zv@Q@bd$WuGJJt8B-hziQ5QfI6xx}+KJ>I&{9qNPFDDkX*WAzq4I0$_J@n#bLN2_<_ zG4qDooT2&~)py?&0M1nRP2A=Tm6v8&duJbp!g4+Jo;hF4{{hF8+gSkN1&9Cu002ov JPDHLkV1fj|YOVkP diff --git a/sources/ActionView.cpp b/sources/ActionView.cpp index c80a652..91c39ee 100644 --- a/sources/ActionView.cpp +++ b/sources/ActionView.cpp @@ -80,6 +80,19 @@ ActionView::ActionView(const BRect& frame, const char* name, BMessage* action, fValueBox->SetText(""); } + + BString toolTip( + "\%FILENAME\%\t\t\tFull file name\n" + "\%EXTENSION\%\t\tJust the extension\n" + "\%BASENAME\%\t\tFile name without extension\n" + "\%FOLDER\%\t\t\tFull location of the folder which contains the file\n" + "\%FULLPATH\%\t\t\tFull location of the file\n" + "\%DATE\%\t\t\t\tCurrent date in the format MM-DD-YYYY\n" + "\%EURODATE\%\t\tCurrent date in the format DD-MM-YYYY\n" + "\%REVERSEDATE\%\t\tCurrent date in the format YYYY-MM-DD\n" + "\%TIME\%\t\t\t\tCurrent time using 24-hour time\n" + "\%ATTR:xxxx\%\t\t\tAn extended attribute of the file"); + SetToolTip(toolTip.String()); } diff --git a/sources/RuleEditWindow.cpp b/sources/RuleEditWindow.cpp index 274b964..8284cff 100644 --- a/sources/RuleEditWindow.cpp +++ b/sources/RuleEditWindow.cpp @@ -81,10 +81,9 @@ RuleEditWindow::RuleEditWindow(BRect& rect, FilerRule* rule, BHandler* caller) fTestGroup->AddChild(fRemoveTest); fRemoveTest->SetEnabled(false); - fTestGroup->ResizeBy(0, fAddTest->Bounds().Height() + 10.0); + fTestGroup->ResizeBy(0, fAddTest->Bounds().Height()); // Set up the actions group and associated buttons - rect.OffsetTo(10, fTestGroup->Frame().bottom + 10.0); fActionGroup = new BBox(rect, "dogroup", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fActionGroup->SetLabel("Do"); From bb392c17146e4bf42c88be819034875a5e76f1b6 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Sat, 7 May 2016 12:40:48 +0200 Subject: [PATCH 04/12] Documentation update Describe the "stop after first rule matches" option and the new "Continue" action for rules. Only apply the tooltip to the value text box, not the whole view. --- documentation/Rule-Making Reference.html | 7 +++++-- documentation/User Documentation.html | 16 +++++++++------- sources/ActionView.cpp | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/documentation/Rule-Making Reference.html b/documentation/Rule-Making Reference.html index 601d062..a864899 100644 --- a/documentation/Rule-Making Reference.html +++ b/documentation/Rule-Making Reference.html @@ -123,7 +123,7 @@
-Filer icon +Filer icon

Filer's Rule-Making Reference


Rule ConditionsRule ActionsSubstitutions
Common Attribute NamesExample Rules

@@ -149,7 +149,10 @@

Rename it to…Rename the file. Move it to the TrashFor those files which you no longer want. Delete itOnly if you're sure of yourself and hate a cluttered Trash can. -Terminal command…For experts. Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more Terminal command actions or a shell script. +Terminal command…Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more Terminal command actions or a shell script. +ContinueThis one should only be added last to a list of actions. There are two cases where it comes in useful: +
  • Firstly, if you've set Apply only the first matching rule in the rules settings, this "Continue" will override it, and the matching of rules will continue anyway.
  • +
  • Secondly, if several rules are applied to a file which change the file name or location. Otherwise, if the first rule renames or moves a file, the second won't be able to find the file anymore. A "Continue" at the bottom of the first rule will hand over the new file name or location to the next rule.

diff --git a/documentation/User Documentation.html b/documentation/User Documentation.html index 9b8cf9a..bad10bc 100644 --- a/documentation/User Documentation.html +++ b/documentation/User Documentation.html @@ -125,7 +125,7 @@
-Filer icon +Filer icon

Filer's User Documentation


UsageDropzoneRulesAutoFilerHelpHistory

@@ -167,9 +167,10 @@

Filer's rules
-

The second tab shows the list of organization rules. Every dropped file is being tested against – and if its type etc. matches processed by – each rule, top to bottom.

+

The second tab shows the list of organization rules. Every dropped file is being tested against – and if its type etc. matches, processed by – each rule, top to bottom.

+

You can opt to Apply only the first matching rule if you prefer that. Filer will then stop trying to match rules to a file after it found one. (A rule can override that by adding a Continue at the end of its "Do" block. See the Rule-Making Reference for more info.)

You can arrange the rules with the Move up/down buttons and Add…, Edit… and Remove them.
-Here's the window that opens to edit a rule:

+Here's the window that opens to edit a rule, which is similar to the one for adding a rule:

Editing a rule

A rule needs three items: A Description, the condition When it is applied, and what action to Do.

@@ -203,14 +204,15 @@

  • Initial release.
  • -

    1.1.0 - 05-05-2016

    +

    1.1.0 - 08-05-2016

    • A new GUI that integrates Filer and AutoFiler settings.
    • -
    • Some usability improvements.
    • +
    • Some usability improvements like drag&drop support for AutoFiler folders and a tooltip for actions in the rule editing window.
    • Apply changed settings, rules and monitored folders live.
    • Add a button to manually start/stop AutoFiler.
    • -
    • Add a dropzone and make it replicatable. -
    • Add user documentation.
    • +
    • Add a dropzone and make it replicatable.
    • +
    • Add an option to stop matching rules after the first match was found (idea and code adopted from Pete Goodeve).
    • +
    • Add user documentation.
    diff --git a/sources/ActionView.cpp b/sources/ActionView.cpp index 91c39ee..b8e0107 100644 --- a/sources/ActionView.cpp +++ b/sources/ActionView.cpp @@ -92,7 +92,7 @@ ActionView::ActionView(const BRect& frame, const char* name, BMessage* action, "\%REVERSEDATE\%\t\tCurrent date in the format YYYY-MM-DD\n" "\%TIME\%\t\t\t\tCurrent time using 24-hour time\n" "\%ATTR:xxxx\%\t\t\tAn extended attribute of the file"); - SetToolTip(toolTip.String()); + fValueBox->SetToolTip(toolTip.String()); } From 2ae78a9b428d9435570fafc9836299e56851293b Mon Sep 17 00:00:00 2001 From: Humdinger Date: Mon, 9 May 2016 17:51:58 +0200 Subject: [PATCH 05/12] Bugfixes by Pete Goodeve --- sources/FSUtils.cpp | 8 -------- sources/RuleRunner.cpp | 45 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/sources/FSUtils.cpp b/sources/FSUtils.cpp index b637750..41e5ec8 100644 --- a/sources/FSUtils.cpp +++ b/sources/FSUtils.cpp @@ -125,14 +125,6 @@ status_t CopyFile(BEntry* srcentry, BEntry* destentry, bool clobber) command << "'" << srcstring << "' '" << deststring << "/'"; int code = system(command.String()); - if (!code) { - entry_ref ref; - srcentry->GetRef(&ref); - - deststring << "/" << ref.name; - return srcentry->SetTo(deststring.String()); - } - return code; } diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index de6a9b3..43c9ad7 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -86,7 +86,7 @@ static const char* sTestTypes[] = "Name", "Size", "Location", -// "Last Changed", +// "Last changed", NULL }; @@ -106,7 +106,7 @@ static const char* sNumberTests[] = static const char* sDateTests[] = { -// "Last Changed", +// "Last changed", NULL }; @@ -166,13 +166,13 @@ static const char* sDateModes[] = static const char* sActions[] = { - "Move it to…", - "Copy it to…", - "Rename it to…", - "Open it", - "Add it to the archive…", - "Move it to the Trash", - "Delete it", + "Move to folder…", + "Copy to folder…", + "Rename to…", + "Open", + "Add to archive…", + "Move to Trash", + "Delete", "Terminal command…", "Continue", @@ -445,7 +445,7 @@ RuleRunner::IsMatch(const BMessage& test, const entry_ref& ref) return IsLocationMatch(test, ref); else if (testname.Compare("Type") == 0) return IsTypeMatch(test, ref); - else if (testname.Compare("Last Changed") == 0) + else if (testname.Compare("Last changed") == 0) return IsModifiedMatch(test, ref); else if (testname.Compare("Attribute") == 0) return IsAttributeMatch(test, ref); @@ -463,21 +463,21 @@ RuleRunner::RunAction(const BMessage& action, entry_ref& ref) return B_ERROR; } - if (actionname.Compare("Move it to…") == 0) + if (actionname.Compare("Move to folder…") == 0) return MoveAction(action, ref); - else if (actionname.Compare("Copy it to…") == 0) + else if (actionname.Compare("Copy to folder…") == 0) return CopyAction(action, ref); - else if (actionname.Compare("Rename it to…") == 0) + else if (actionname.Compare("Rename to…") == 0) return RenameAction(action, ref); - else if (actionname.Compare("Open it") == 0) + else if (actionname.Compare("Open") == 0) return OpenAction(action, ref); - else if (actionname.Compare("Add it to the archive…") == 0) + else if (actionname.Compare("Add to archive…") == 0) return ArchiveAction(action, ref); else if (actionname.Compare("Terminal command…") == 0) return CommandAction(action, ref); - else if (actionname.Compare("Move it to the Trash") == 0) + else if (actionname.Compare("Move to Trash") == 0) return TrashAction(action, ref); - else if (actionname.Compare("Delete it") == 0) + else if (actionname.Compare("Delete") == 0) return DeleteAction(action, ref); else if (actionname.Compare("Continue") == 0) return CONTINUE_TESTS; // arbitrary pos non-B_OK value @@ -530,8 +530,8 @@ RuleRunner::RunRule(FilerRule* rule, entry_ref& ref) // required to do this is for the particular action to change the ref // passed to it. status_t status = RunAction(*action, realref); - if (status == CONTINUE_TESTS) // keep ref in sync with reality - ref = realref; +// if (status == CONTINUE_TESTS) // keep ref in sync with reality + ref = realref; if (status != B_OK) return status; } @@ -1019,15 +1019,16 @@ status_t DeleteAction(const BMessage& action, entry_ref& ref) { BEntry entry(&ref); + BPath path(&entry); status_t status = entry.Remove(); if (status == B_OK) - printf("\tDeleted %s\n", BPath(ref.name).Path()); + printf("\tDeleted %s\n", path.Path()); else { printf("\tCouldn't delete %s. Stopping here.\n\t\tError Message: %s\n", - BPath(ref.name).Path(), strerror(status)); + path.Path(), strerror(status)); } - return entry.Remove(); + return status; } From 77949dc90e7424508cf2e9f04bb6a57a4b60fe54 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Mon, 9 May 2016 19:08:48 +0200 Subject: [PATCH 06/12] Bugfix for "end with" action The compare function didn't care if there actually was the search string at the end or not. --- sources/RuleRunner.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index 43c9ad7..ff1e6b3 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -785,6 +785,9 @@ StringCompare(const BString& from, const BString& to, const char* mode, else pos = to.IFindLast(from); + if (pos == B_ERROR) + return false; + return (to.CountChars() - from.CountChars() == pos); } From 470fb2105db59ca0ee1eb89b0c33cf5a9a7cc87a Mon Sep 17 00:00:00 2001 From: Humdinger Date: Tue, 10 May 2016 21:11:18 +0200 Subject: [PATCH 07/12] Drag&drop support for AutoTextControl by Pete Goodeve. Reverted the recent "fix" of the "ends with" check. Turned out to be not correctly updated rules. Added UpdateRules() to RuleTab to ensure always complete updates. --- sources/AutoTextControl.cpp | 23 +++++++++++++++++++++-- sources/AutoTextControl.h | 3 +++ sources/RuleRunner.cpp | 3 --- sources/RuleTab.cpp | 22 +++++++++++++++------- sources/RuleTab.h | 1 + 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/sources/AutoTextControl.cpp b/sources/AutoTextControl.cpp index 50b6cd8..18179f8 100644 --- a/sources/AutoTextControl.cpp +++ b/sources/AutoTextControl.cpp @@ -2,14 +2,20 @@ AutoTextControl.cpp: A BTextControl which notifies on each keypress Written by DarkWyrm , Copyright 2007 Released under the MIT license. + Contributed by: + Pete Goodeve */ #include "AutoTextControl.h" -#include + +#include +#include +#include #include +#include + #include #include -#include static property_info sProperties[] = { { "CharacterLimit", { B_GET_PROPERTY, 0 }, { B_DIRECT_SPECIFIER, 0 }, @@ -118,6 +124,19 @@ AutoTextControl::DetachedFromWindow() } +void +AutoTextControl::MessageReceived(BMessage* msg) +{ + if (msg->WasDropped()) { + entry_ref r; + if (msg->FindRef("refs", &r) == B_OK) + SetText(BPath(&r).Path()); + Invoke(); + } + else BTextControl::MessageReceived(msg); +} + + void AutoTextControl::SetCharacterLimit(const uint32& limit) { diff --git a/sources/AutoTextControl.h b/sources/AutoTextControl.h index 63d5d2f..393db88 100644 --- a/sources/AutoTextControl.h +++ b/sources/AutoTextControl.h @@ -2,6 +2,8 @@ AutoTextControl.h: A BTextControl which notifies on each keypress Written by DarkWyrm , Copyright 2007 Released under the MIT license. + Contributed by: + Pete Goodeve */ #ifndef AUTO_TEXT_CONTROL_H @@ -44,6 +46,7 @@ class AutoTextControl : public BTextControl virtual void AttachedToWindow(); virtual void DetachedFromWindow(); + virtual void MessageReceived(BMessage* msg); void SetFilter(AutoTextControlFilter* filter); AutoTextControlFilter* GetFilter() { return fFilter; } diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index ff1e6b3..43c9ad7 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -785,9 +785,6 @@ StringCompare(const BString& from, const BString& to, const char* mode, else pos = to.IFindLast(from); - if (pos == B_ERROR) - return false; - return (to.CountChars() - from.CountChars() == pos); } diff --git a/sources/RuleTab.cpp b/sources/RuleTab.cpp index b751d82..0b364aa 100644 --- a/sources/RuleTab.cpp +++ b/sources/RuleTab.cpp @@ -216,7 +216,7 @@ RuleTab::MessageReceived(BMessage* message) if (message->FindPointer("item", (void**)&item) == B_OK) AddRule(item); - SaveRules(fRuleList); + UpdateRules(); break; } case MSG_REMOVE_RULE: @@ -230,7 +230,7 @@ RuleTab::MessageReceived(BMessage* message) int32 count = fRuleItemList->CountItems(); fRuleItemList->Select((selection > count - 1) ? count - 1 : selection); - SaveRules(fRuleList); + UpdateRules(); break; } case MSG_UPDATE_RULE: @@ -256,9 +256,7 @@ RuleTab::MessageReceived(BMessage* message) delete rule; } - SaveRules(fRuleList); - fRuleList->MakeEmpty(); - LoadRules(fRuleList); + UpdateRules(); break; } case MSG_RULE_SELECTED: @@ -283,7 +281,7 @@ RuleTab::MessageReceived(BMessage* message) fRuleItemList->SwapItems(selection, selection - 1); fRuleList->SwapItems(selection, selection - 1); - SaveRules(fRuleList); + UpdateRules(); break; } case MSG_MOVE_RULE_DOWN: @@ -295,7 +293,7 @@ RuleTab::MessageReceived(BMessage* message) fRuleItemList->SwapItems(selection, selection + 1); fRuleList->SwapItems(selection, selection + 1); - SaveRules(fRuleList); + UpdateRules(); break; } default: @@ -359,3 +357,13 @@ RuleTab::MakeEmpty() delete item; } } + + +void +RuleTab::UpdateRules() +{ +printf("UpdateRules!\n"); + SaveRules(fRuleList); + fRuleList->MakeEmpty(); + LoadRules(fRuleList); +} diff --git a/sources/RuleTab.h b/sources/RuleTab.h index bd70938..da09802 100644 --- a/sources/RuleTab.h +++ b/sources/RuleTab.h @@ -34,6 +34,7 @@ class RuleTab : public BView void AddRule(FilerRule* rule); void RemoveRule(RuleItem* item); void MakeEmpty(); + void UpdateRules(); BObjectList*fRuleList; From fc6a03c4141efb8b93791425265b408b5ce68519 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Wed, 11 May 2016 18:08:31 +0200 Subject: [PATCH 08/12] Patch by Pete Goodeve to improve dropping of text as action value. Renaming "Terminal command" to "Shell command". Some code stle clean up. --- sources/ActionView.cpp | 9 ++++++++- sources/RuleRunner.cpp | 8 ++++---- sources/RuleTab.cpp | 2 +- sources/TestView.cpp | 11 +++++++++-- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/sources/ActionView.cpp b/sources/ActionView.cpp index b8e0107..638abd0 100644 --- a/sources/ActionView.cpp +++ b/sources/ActionView.cpp @@ -2,6 +2,7 @@ ActionView.cpp: View for adjusting settings for an individual Filer action Written by DarkWyrm , Copyright 2008 Released under the MIT license. + Contributed by: Pete Goodeve, 2016 */ #include @@ -157,7 +158,7 @@ ActionView::MessageReceived(BMessage* msg) break; } case MSG_VALUE_CHANGED: - { + { // now done in GetAction, but left here for now BString str; if (fAction->FindString("value", &str) == B_OK) fAction->ReplaceString("value", fValueBox->Text()); @@ -176,6 +177,12 @@ ActionView::MessageReceived(BMessage* msg) BMessage* ActionView::GetAction() const { + BString str; + if (fAction->FindString("value", &str) == B_OK) + fAction->ReplaceString("value", fValueBox->Text()); + else + fAction->AddString("value", fValueBox->Text()); + return fAction; } diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index 43c9ad7..afcc519 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -173,7 +173,7 @@ static const char* sActions[] = "Add to archive…", "Move to Trash", "Delete", - "Terminal command…", + "Shell command…", "Continue", // Future expansion @@ -473,7 +473,7 @@ RuleRunner::RunAction(const BMessage& action, entry_ref& ref) return OpenAction(action, ref); else if (actionname.Compare("Add to archive…") == 0) return ArchiveAction(action, ref); - else if (actionname.Compare("Terminal command…") == 0) + else if (actionname.Compare("Shell command…") == 0) return CommandAction(action, ref); else if (actionname.Compare("Move to Trash") == 0) return TrashAction(action, ref); @@ -978,10 +978,10 @@ CommandAction(const BMessage& action, entry_ref& ref) int result = system(value.String()); if (result) { - printf("\tTerminal Command: %s\n\t\tPossible error: " + printf("\Shell Command: %s\n\t\tPossible error: " "command returned %d\n", value.String(), result); } else - printf("\tTerminal Command: %s\n", value.String()); + printf("\Shell Command: %s\n", value.String()); return B_OK; } diff --git a/sources/RuleTab.cpp b/sources/RuleTab.cpp index 0b364aa..3d59e0b 100644 --- a/sources/RuleTab.cpp +++ b/sources/RuleTab.cpp @@ -74,7 +74,7 @@ RuleTab::RuleTab() rule = new FilerRule(); rule->AddTest(MakeTest("Name", "ends with", ".zip")); - rule->AddAction(MakeAction("Terminal command…", + rule->AddAction(MakeAction("Shell command…", "unzip %FULLPATH% -d /boot/home/Desktop")); rule->SetDescription("Extract ZIP files to the Desktop"); AddRule(rule); diff --git a/sources/TestView.cpp b/sources/TestView.cpp index d8402ba..961fcd5 100644 --- a/sources/TestView.cpp +++ b/sources/TestView.cpp @@ -2,6 +2,7 @@ TestView.cpp: view to display and edit settings for Filer tests Written by DarkWyrm , Copyright 2008 Released under the MIT license. + Contributed by: Pete Goodeve, 2016 */ #include @@ -187,7 +188,7 @@ TestView::MessageReceived(BMessage* msg) break; } case MSG_VALUE_CHANGED: - { + { // Now done in GetTest, but left for now... BString str; if (fTest->FindString("value", &str) == B_OK) fTest->ReplaceString("value", fValueBox->Text()); @@ -271,6 +272,12 @@ TestView::MessageReceived(BMessage* msg) BMessage* TestView::GetTest() const { + BString str; + if (fTest->FindString("value", &str) == B_OK) + fTest->ReplaceString("value", fValueBox->Text()); + else + fTest->AddString("value", fValueBox->Text()); + return fTest; } @@ -293,7 +300,7 @@ TestView::SetupTestMenu() BMimeType::GetInstalledTypes(&types); int32 index = 0; - while (types.FindString("types",index,&string) == B_OK) + while (types.FindString("types", index, &string) == B_OK) { index++; mime.SetTo(string.String()); From e5f2e8c0958b551bca6f23912ee3dbb74d69876a Mon Sep 17 00:00:00 2001 From: Humdinger Date: Fri, 13 May 2016 18:52:07 +0200 Subject: [PATCH 09/12] Made saving settings (esp. match once) more robust. Only load and keep track of the MatchOnce setting where needed. Removing rules messed up the saved file. Now simply use the currently selected item index. Introducing new logic to en/disable buttons in RulesTab. Using new longest StringWidth for button after renaming actions. Corrected action string when creating default rules. --- sources/ActionView.cpp | 2 +- sources/MainWindow.cpp | 7 +-- sources/MainWindow.h | 1 - sources/RuleRunner.cpp | 6 +-- sources/RuleTab.cpp | 107 ++++++++++++++--------------------------- sources/RuleTab.h | 5 +- sources/main.cpp | 1 - 7 files changed, 41 insertions(+), 88 deletions(-) diff --git a/sources/ActionView.cpp b/sources/ActionView.cpp index 638abd0..a22d159 100644 --- a/sources/ActionView.cpp +++ b/sources/ActionView.cpp @@ -126,7 +126,7 @@ ActionView::GetPreferredSize() BRect rect(0.0, 0.0, 10.0, 10.0); rect.bottom = fActionButton->Frame().Height(); - rect.right = StringWidth("Move it to the Trash") + 5.0 + 100; + rect.right = StringWidth("Shell command…") + 5.0 + 100; return rect; } diff --git a/sources/MainWindow.cpp b/sources/MainWindow.cpp index 4671111..7de151f 100644 --- a/sources/MainWindow.cpp +++ b/sources/MainWindow.cpp @@ -107,12 +107,12 @@ MainWindow::MessageReceived(BMessage* msg) } } + void MainWindow::LoadSettings() { fPosition.Set(-1, -1, -1, -1); fTabSelection = 0; - fMatchBoxSetting = false; BPath path; BMessage msg; @@ -128,8 +128,6 @@ MainWindow::LoadSettings() fPosition.Set(-1, -1, -1, -1); if (msg.FindInt32("tab", &fTabSelection) != B_OK) fTabSelection = 0; - if (msg.FindBool("match", &fMatchBoxSetting) != B_OK) - fMatchBoxSetting = false; } } } @@ -144,9 +142,6 @@ MainWindow::SaveSettings() App* my_app = dynamic_cast(be_app); bool match = my_app->GetMatchSetting(); - if (pos == fPosition && tab == fTabSelection && match == fMatchBoxSetting) - return; - BPath path; BMessage msg; diff --git a/sources/MainWindow.h b/sources/MainWindow.h index 6860977..c6049ce 100644 --- a/sources/MainWindow.h +++ b/sources/MainWindow.h @@ -42,7 +42,6 @@ class MainWindow : public BWindow { BRect fPosition; int32 fTabSelection; - bool fMatchBoxSetting; BTabView* fTabView; DropZoneTab* fDropZone; diff --git a/sources/RuleRunner.cpp b/sources/RuleRunner.cpp index afcc519..2e70579 100644 --- a/sources/RuleRunner.cpp +++ b/sources/RuleRunner.cpp @@ -978,10 +978,10 @@ CommandAction(const BMessage& action, entry_ref& ref) int result = system(value.String()); if (result) { - printf("\Shell Command: %s\n\t\tPossible error: " + printf("\tShell Command: %s\n\t\tPossible error: " "command returned %d\n", value.String(), result); } else - printf("\Shell Command: %s\n", value.String()); + printf("\tShell Command: %s\n", value.String()); return B_OK; } @@ -1140,7 +1140,6 @@ SaveRules(BObjectList* ruleList) } } db.close(); - return B_OK; } @@ -1243,7 +1242,6 @@ LoadRules(BObjectList* ruleList) query.finalize(); } db.close(); - return B_OK; } diff --git a/sources/RuleTab.cpp b/sources/RuleTab.cpp index 3d59e0b..b7b4216 100644 --- a/sources/RuleTab.cpp +++ b/sources/RuleTab.cpp @@ -50,25 +50,25 @@ RuleTab::RuleTab() // NOTE: If actions rule->AddTest(MakeTest("Type", "is", "text/plain")); - rule->AddAction(MakeAction("Move it to…", "/boot/home/Documents")); + rule->AddAction(MakeAction("Move to folder…", "/boot/home/Documents")); rule->SetDescription("Store text files in my Documents folder"); AddRule(rule); rule = new FilerRule(); rule->AddTest(MakeTest("Type", "is", "application/pdf")); - rule->AddAction(MakeAction("Move it to…", "/boot/home/Documents")); + rule->AddAction(MakeAction("Move to folder…", "/boot/home/Documents")); rule->SetDescription("Store PDF files in my Documents folder"); AddRule(rule); rule = new FilerRule(); rule->AddTest(MakeTest("Type", "starts with", "image/")); - rule->AddAction(MakeAction("Move it to…", "/boot/home/Pictures")); + rule->AddAction(MakeAction("Move to folder…", "/boot/home/Pictures")); rule->SetDescription("Store pictures in my Pictures folder"); AddRule(rule); rule = new FilerRule(); rule->AddTest(MakeTest("Type", "starts with","video/")); - rule->AddAction(MakeAction("Move it to…", "/boot/home/Videos")); + rule->AddAction(MakeAction("Move to folder…", "/boot/home/Videos")); rule->SetDescription("Store movie files in my Videos folder"); AddRule(rule); @@ -165,11 +165,9 @@ RuleTab::AttachedToWindow() fMoveDownButton->SetTarget(this); fRuleItemList->SetTarget(this); - if (fRuleItemList->CountItems() > 0) { - BMessenger messenger(this); - BMessage message(MSG_RULE_SELECTED); - messenger.SendMessage(&message); - } + if (fRuleItemList->CountItems() > 0) + UpdateButtons(); + App* my_app = dynamic_cast(be_app); fMatchBox->SetValue(my_app->GetMatchSetting()); @@ -216,7 +214,8 @@ RuleTab::MessageReceived(BMessage* message) if (message->FindPointer("item", (void**)&item) == B_OK) AddRule(item); - UpdateRules(); + UpdateButtons(); + SaveRules(fRuleList); break; } case MSG_REMOVE_RULE: @@ -225,12 +224,13 @@ RuleTab::MessageReceived(BMessage* message) if (selection < 0) break; - RemoveRule((RuleItem*)fRuleItemList->ItemAt(selection)); + RemoveRule(selection); int32 count = fRuleItemList->CountItems(); fRuleItemList->Select((selection > count - 1) ? count - 1 : selection); - UpdateRules(); + UpdateButtons(); + SaveRules(fRuleList); break; } case MSG_UPDATE_RULE: @@ -256,20 +256,12 @@ RuleTab::MessageReceived(BMessage* message) delete rule; } - UpdateRules(); + SaveRules(fRuleList); break; } case MSG_RULE_SELECTED: { - bool value = (fRuleItemList->CurrentSelection() >= 0); - - fEditButton->SetEnabled(value); - fRemoveButton->SetEnabled(value); - - if (fRuleItemList->CountItems() > 1) { - fMoveUpButton->SetEnabled(value); - fMoveDownButton->SetEnabled(value); - } + UpdateButtons(); break; } case MSG_MOVE_RULE_UP: @@ -281,7 +273,8 @@ RuleTab::MessageReceived(BMessage* message) fRuleItemList->SwapItems(selection, selection - 1); fRuleList->SwapItems(selection, selection - 1); - UpdateRules(); + UpdateButtons(); + SaveRules(fRuleList); break; } case MSG_MOVE_RULE_DOWN: @@ -293,7 +286,8 @@ RuleTab::MessageReceived(BMessage* message) fRuleItemList->SwapItems(selection, selection + 1); fRuleList->SwapItems(selection, selection + 1); - UpdateRules(); + UpdateButtons(); + SaveRules(fRuleList); break; } default: @@ -304,66 +298,35 @@ RuleTab::MessageReceived(BMessage* message) void -RuleTab::AddRule(FilerRule* rule) +RuleTab::UpdateButtons() { - fRuleList->AddItem(rule); - fRuleItemList->AddItem(new RuleItem(rule)); - - if (fRuleItemList->CurrentSelection() < 0) - fRuleItemList->Select(0L); -} - - -void -RuleTab::RemoveRule(RuleItem* item) -{ - // Select a new rule (if there is one) before removing the old one. - // BListView simply drops the selection if the selected item is removed. - // What a pain in the neck. :/ - int32 itemindex = fRuleItemList->IndexOf(item); int32 selection = fRuleItemList->CurrentSelection(); - if (itemindex == selection && fRuleItemList->CountItems() > 1) { - if (selection == fRuleItemList->CountItems() - 1) - selection--; - else - selection++; - fRuleItemList->Select(selection); - } - - fRuleItemList->RemoveItem(item); - - FilerRule* rule = item->Rule(); - fRuleList->RemoveItem(rule); - delete item; + int32 count = fRuleItemList->CountItems(); - if (fRuleItemList->CountItems() <= 0) { - fEditButton->SetEnabled(false); - fRemoveButton->SetEnabled(false); - } + if (selection < 0) + count = -1; - if (fRuleItemList->CountItems() < 2) { - fMoveUpButton->SetEnabled(false); - fMoveDownButton->SetEnabled(false); - } + fEditButton->SetEnabled((count >= 0) ? true : false); + fRemoveButton->SetEnabled((count >= 0) ? true : false); + fMoveUpButton->SetEnabled((count > 1 && selection > 0) ? true : false); + fMoveDownButton->SetEnabled((count > 1 && selection < count - 1) ? true : false); } void -RuleTab::MakeEmpty() +RuleTab::AddRule(FilerRule* rule) { - for (int32 i = fRuleItemList->CountItems() - 1; i >= 0; i--) - { - RuleItem* item = (RuleItem*)fRuleItemList->RemoveItem(i); - delete item; - } + fRuleList->AddItem(rule); + fRuleItemList->AddItem(new RuleItem(rule)); + + if (fRuleItemList->CurrentSelection() < 0) + fRuleItemList->Select(0L); } void -RuleTab::UpdateRules() +RuleTab::RemoveRule(int32 selection) { -printf("UpdateRules!\n"); - SaveRules(fRuleList); - fRuleList->MakeEmpty(); - LoadRules(fRuleList); + fRuleList->RemoveItemAt(selection); + fRuleItemList->RemoveItem(selection); } diff --git a/sources/RuleTab.h b/sources/RuleTab.h index da09802..498bb76 100644 --- a/sources/RuleTab.h +++ b/sources/RuleTab.h @@ -30,11 +30,10 @@ class RuleTab : public BView private: void _BuildLayout(); + void UpdateButtons(); void AddRule(FilerRule* rule); - void RemoveRule(RuleItem* item); - void MakeEmpty(); - void UpdateRules(); + void RemoveRule(int32 selection); BObjectList*fRuleList; diff --git a/sources/main.cpp b/sources/main.cpp index 0465f30..4f6619c 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -189,7 +189,6 @@ App::FileRef(entry_ref ref) { FilerRule* rule = fRuleList->ItemAt(i); status_t res = runner.RunRule(rule,ref); - printf("return: %i\n", res); // default stop here if rule was successful // note that the loop will continue if a rule has an error From fea0de7fbb9acfae5070b5118a69b7a0baf26b46 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Fri, 13 May 2016 19:44:09 +0200 Subject: [PATCH 10/12] Updated documentation Added Pete Goodeve to the copyrights. Thaks for the patches and bug finding and fixing. --- documentation/Rule-Making Reference.html | 34 +++++++++++------------ documentation/User Documentation.html | 7 +++-- documentation/images/filer_edit_rule.png | Bin 12593 -> 12732 bytes documentation/images/filer_ruleslist.png | Bin 12390 -> 13229 bytes documentation/images/help.png | Bin 15655 -> 15933 bytes sources/DropZoneTab.cpp | 2 +- sources/HelpTab.cpp | 2 +- 7 files changed, 23 insertions(+), 22 deletions(-) diff --git a/documentation/Rule-Making Reference.html b/documentation/Rule-Making Reference.html index a864899..4d325e8 100644 --- a/documentation/Rule-Making Reference.html +++ b/documentation/Rule-Making Reference.html @@ -144,15 +144,15 @@

    Rule Actions

    If the conditions are met, the Filer will perform a series of actions that you choose. Actions can be chained together, such as renaming a file and then moving it to another folder.

    - - - - - - - + + + + + + + + +
    Move it to…Move a file to the folder entered in the text field.
    Copy it to…Copy a file to the folder entered in the text field.
    Rename it to…Rename the file.
    Move it to the TrashFor those files which you no longer want.
    Delete itOnly if you're sure of yourself and hate a cluttered Trash can.
    Terminal command…Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more Terminal command actions or a shell script.
    ContinueThis one should only be added last to a list of actions. There are two cases where it comes in useful: -
    • Firstly, if you've set Apply only the first matching rule in the rules settings, this "Continue" will override it, and the matching of rules will continue anyway.
    • -
    • Secondly, if several rules are applied to a file which change the file name or location. Otherwise, if the first rule renames or moves a file, the second won't be able to find the file anymore. A "Continue" at the bottom of the first rule will hand over the new file name or location to the next rule.
    Move to folder…Move a file to the folder entered in the text field.
    Copy to folder…Copy a file to the folder entered in the text field.
    Rename to…Rename the file.
    OpenOpen the file with its preferred application.
    Add to archive…Adds the file to a ZIP archive.
    Move to TrashPuts the file into the Trash.
    DeleteBy-passes the Trash and removes the file directly.
    Shell command…Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more Terminal command actions or a shell script, because the following actions/rules can't keep track of these changes.
    ContinueIf you've set Apply only the first matching rule in the rules settings, this "Continue" will override it, and the matching of rules will continue anyway.

    @@ -198,29 +198,29 @@

    Move all e-mails on the MyAccount account to its own folder in the mail folder:

    - +
    When:Email:AccountisMyAccount
    Do:Move it to…/boot/home/mail/MyAccount
    Do:Move to folder…/boot/home/mail/MyAccount
  • Sort JPEG photos by date into their own folder in /boot/home/Pictures:

    - - + +
    When:Typeisimage/jpeg
    Do:Rename it to…Photo %TIME%.jpg
    Move it to…/boot/home/Pictures/%DATE%
    Do:Rename to…Photo %TIME%.jpg
    Move to folder…/boot/home/Pictures/%DATE%
  • Make sure that MP3s have searchable attributes using Axel Dörfler's excellent id3attr program, rename them to "ArtistName - SongName.mp3", and sort them in the /boot/home/music folder by the artist's name. This would make importing an MP3 collection from somewhere else very easy.

    - - - + + +
    When:Nameends with.mp3
    Do:Terminal command…id3attr '%FULLPATH%'
    Rename it to…%ATTR:Audio:Artist% - %ATTR:Audio:Title%.mp3
    Move it to…/boot/home/music/%ATTR:Audio:Artist%
    Do:Shell command…id3attr '%FULLPATH%'
    Rename to…%ATTR:Audio:Artist% - %ATTR:Audio:Title%.mp3
    Move to folder…/boot/home/music/%ATTR:Audio:Artist%
  • Extract Zip archives to the Desktop and dump them into the Trash for later disposal:

    - - + +
    When:Nameends with.zip
    Do:Terminal command…unzip %FULLPATH% -d boot/home/Desktop
    Move it to the Trash
    Do:Shell command…unzip %FULLPATH% -d boot/home/Desktop
    Move to Trash
  • diff --git a/documentation/User Documentation.html b/documentation/User Documentation.html index bad10bc..4612b4d 100644 --- a/documentation/User Documentation.html +++ b/documentation/User Documentation.html @@ -168,7 +168,7 @@

    Filer's rules

    The second tab shows the list of organization rules. Every dropped file is being tested against – and if its type etc. matches, processed by – each rule, top to bottom.

    -

    You can opt to Apply only the first matching rule if you prefer that. Filer will then stop trying to match rules to a file after it found one. (A rule can override that by adding a Continue at the end of its "Do" block. See the Rule-Making Reference for more info.)

    +

    You can opt to Apply only the first matching rule if you prefer that. Filer will then stop trying to match rules to a file after it found one. (A rule can override that by adding a Continue in its "Do" block. See the Rule-Making Reference for more info.)

    You can arrange the rules with the Move up/down buttons and Add…, Edit… and Remove them.
    Here's the window that opens to edit a rule, which is similar to the one for adding a rule:

    @@ -204,14 +204,15 @@

  • Initial release.
  • -

    1.1.0 - 08-05-2016

    +

    1.1.0 - 13-05-2016

    • A new GUI that integrates Filer and AutoFiler settings.
    • +
    • Change to the action names, rule settings have to be created anew.
    • Some usability improvements like drag&drop support for AutoFiler folders and a tooltip for actions in the rule editing window.
    • Apply changed settings, rules and monitored folders live.
    • Add a button to manually start/stop AutoFiler.
    • Add a dropzone and make it replicatable.
    • -
    • Add an option to stop matching rules after the first match was found (idea and code adopted from Pete Goodeve).
    • +
    • Add an option to stop matching rules after the first match was found (idea and code by Pete Goodeve).
    • Add user documentation.
    diff --git a/documentation/images/filer_edit_rule.png b/documentation/images/filer_edit_rule.png index d5d5c1bf877d4e2191ff146830575a90be6a4d78..fc390c8923138b4b6d87abf78b8c161c396b76a2 100644 GIT binary patch literal 12732 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 Bf=K`X literal 12593 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 bIF}y3YDLb`v;qDM=aQ_Xl0=@^Yw!O9S)av) literal 12390 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 I!1R6p2gXVMqyPW_ diff --git a/documentation/images/help.png b/documentation/images/help.png index 110ced541744b51bcbafc0b61b2d81b3bff768c3..a32c514670b5f346f7dc56fdc8c30eb6e1af9700 100644 GIT binary patch literal 15933 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 diff --git a/sources/DropZoneTab.cpp b/sources/DropZoneTab.cpp index 0a758e4..1a07456 100644 --- a/sources/DropZoneTab.cpp +++ b/sources/DropZoneTab.cpp @@ -171,7 +171,7 @@ DropZone::MessageReceived(BMessage* msg) "renames, copies or does all sorts of other things with them " "according to rules created by the user."); about->AddCopyright(2008, "DarkWyrm"); - about->AddCopyright(2016, "Humdinger"); + about->AddCopyright(2016, "Humdinger, Pete Goodeve"); about->Show(); } default: diff --git a/sources/HelpTab.cpp b/sources/HelpTab.cpp index d449e01..6fc5af0 100644 --- a/sources/HelpTab.cpp +++ b/sources/HelpTab.cpp @@ -120,7 +120,7 @@ HelpTab::HelpTab() fVersion->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED)); fCopyright1 = new BStringView("copy1", "Copyright 2008, DarkWyrm"); - fCopyright2 = new BStringView("copy2", "Copyright 2016, Humdinger"); + fCopyright2 = new BStringView("copy2", "Copyright 2016, Humdinger, Pete Goodeve"); fCopyright1->SetFont(&font, B_FONT_FAMILY_AND_STYLE | B_FONT_SIZE | B_FONT_FLAGS); fCopyright2->SetFont(&font, B_FONT_FAMILY_AND_STYLE | B_FONT_SIZE From e53013584de00398a97b5716a10eb789aab108af Mon Sep 17 00:00:00 2001 From: Humdinger Date: Fri, 13 May 2016 20:03:05 +0200 Subject: [PATCH 11/12] Default AutoFiler autorun to "false". --- sources/AutoFilerTab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/AutoFilerTab.cpp b/sources/AutoFilerTab.cpp index 577e1b3..868a5cd 100644 --- a/sources/AutoFilerTab.cpp +++ b/sources/AutoFilerTab.cpp @@ -87,7 +87,7 @@ AutoFilerTab::_BuildLayout() path.Append(gPrefsPath); BNode node(path.Path()); - bool autorun = true; + bool autorun = false; if (node.InitCheck() == B_OK) { bool tmpbool; if (node.ReadAttr("autorun", B_BOOL_TYPE, 0, (void*)&tmpbool, From 5230e97eca7fcbd4e6fa8d363591abefefde5a55 Mon Sep 17 00:00:00 2001 From: Humdinger Date: Sat, 14 May 2016 08:28:02 +0200 Subject: [PATCH 12/12] Updated user doc. Ready for release v1.1.0. Removed the MSG_VALUE_CHANGED cases in TestView and ActionView. Thanks to Pete Goodeve for his bughunting, reporting and fixing and sending a few patches with the changes he privately made to DarkWyrms original code. --- documentation/Rule-Making Reference.html | 9 +++++---- documentation/User Documentation.html | 7 ++++--- sources/ActionView.cpp | 11 +---------- sources/FilerDefs.h | 1 - sources/TestView.cpp | 11 +---------- 5 files changed, 11 insertions(+), 28 deletions(-) diff --git a/documentation/Rule-Making Reference.html b/documentation/Rule-Making Reference.html index 4d325e8..1ca9f53 100644 --- a/documentation/Rule-Making Reference.html +++ b/documentation/Rule-Making Reference.html @@ -151,7 +151,7 @@

      Add to archive…Adds the file to a ZIP archive. Move to TrashPuts the file into the Trash. DeleteBy-passes the Trash and removes the file directly. -Shell command…Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more Terminal command actions or a shell script, because the following actions/rules can't keep track of these changes. +Shell command…Run a command just as if you typed it into a Terminal. Substitutions (see below) are performed before the command is executed. This can make the Filer automatically do all sorts of things it couldn't do otherwise. If you move or rename the file this way, you'll need to do everything else with more shell command actions or a script, because the following actions/rules can't keep track of these changes. ContinueIf you've set Apply only the first matching rule in the rules settings, this "Continue" will override it, and the matching of rules will continue anyway. @@ -164,7 +164,7 @@

      %EXTENSION%Just the extension of the file, as in .txt in MyTextFile.txt or .tar.gz in MyArchive.tar.gz. %BASENAME%File name without extension, like MyTextFile in MyTextFile.txt. %FOLDER%Full location of the folder which contains the file, like /boot/home/Videos for /boot/home/Videos/HaikuRocks.wmv. -%FULLPATH%Full location of the file, such as /boot/home/config/MyFavoriteSong.mp3. You'll need this for "Terminal Command" actions. +%FULLPATH%Full location of the file, such as /boot/home/config/MyFavoriteSong.mp3. You'll need this for "Shell command" actions. %DATE%Current date in the format MM-DD-YYYY. %EURODATE%Current date in the format DD-MM-YYYY. %REVERSEDATE%Current date in the format YYYY-MM-DD. This is often useful for file archives or for pictures. @@ -209,6 +209,7 @@

    1. Make sure that MP3s have searchable attributes using Axel Dörfler's excellent id3attr program, rename them to "ArtistName - SongName.mp3", and sort them in the /boot/home/music folder by the artist's name. This would make importing an MP3 collection from somewhere else very easy.

      +

      Note when using shell commands: Take care to 'escape' the variable, here '%FULLPATH%'. The inverted commas make sure spaces and other special characters don't spoil the fun.

      @@ -216,10 +217,10 @@

      When:Nameends with.mp3
      Do:Shell command…id3attr '%FULLPATH%'
      Move to folder…/boot/home/music/%ATTR:Audio:Artist%
    2. -

      Extract Zip archives to the Desktop and dump them into the Trash for later disposal:

      +

      Extract Zip archives to the Desktop and dump them into the Trash for later disposal. Again, mind the 'escaped' variable '%FULLPATH%' in the shell command!

      - +
      When:Nameends with.zip
      Do:Shell command…unzip %FULLPATH% -d boot/home/Desktop
      Do:Shell command…unzip '%FULLPATH%' -d boot/home/Desktop
      Move to Trash
    3. diff --git a/documentation/User Documentation.html b/documentation/User Documentation.html index 4612b4d..caaec76 100644 --- a/documentation/User Documentation.html +++ b/documentation/User Documentation.html @@ -174,7 +174,8 @@

      Editing a rule

      A rule needs three items: A Description, the condition When it is applied, and what action to Do.

      -

      Click on the buttons in the "When" and "Do" boxes to explore the various options to construct the right condition and what action will be taken. You can add several conditions which will all have to be met to trigger the action. If you add several actions in the "Do" box, be aware that they are executed in order, from top to bottom.

      +

      Click on the buttons in the "When" and "Do" boxes to explore the various options to construct the right condition and what action will be taken. You can add several conditions which will all have to be met to trigger the action. If you add several actions in the "Do" box, be aware that they are executed in order, from top to bottom.
      +Conveniently, the text boxes support drag&dropping of a file or folder.

      Please read the Rule-Making Reference (also available from the Help… button) for more information on the various possibilities.

      @@ -186,7 +187,7 @@

    The AutoFiler itself is a background application. You can activate the checkbox at the top to automatically Run AutoFiler on system startup. The button to beside it lets you start/stop it manually.

    -

    You can Add…, Edit… and Remove the folders that AutoFiler will monitor for incoming files.

    +

    You can Add…, Edit… and Remove the folders that AutoFiler will monitor for incoming files. One or more folders are quickly added via drag&drop.

    index @@ -204,7 +205,7 @@

  • Initial release.
  • -

    1.1.0 - 13-05-2016

    +

    1.1.0 - 14-05-2016

    • A new GUI that integrates Filer and AutoFiler settings.
    • Change to the action names, rule settings have to be created anew.
    • diff --git a/sources/ActionView.cpp b/sources/ActionView.cpp index a22d159..fa9bf77 100644 --- a/sources/ActionView.cpp +++ b/sources/ActionView.cpp @@ -48,7 +48,7 @@ ActionView::ActionView(const BRect& frame, const char* name, BMessage* action, rect.right = rect.left + 10; fValueBox = new AutoTextControl(rect, "valuebox", NULL, NULL, - new BMessage(MSG_VALUE_CHANGED), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); + new BMessage(), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); AddChild(fValueBox); fValueBox->SetDivider(0); @@ -157,15 +157,6 @@ ActionView::MessageReceived(BMessage* msg) SetAction(name.String()); break; } - case MSG_VALUE_CHANGED: - { // now done in GetAction, but left here for now - BString str; - if (fAction->FindString("value", &str) == B_OK) - fAction->ReplaceString("value", fValueBox->Text()); - else - fAction->AddString("value", fValueBox->Text()); - break; - } default: { BView::MessageReceived(msg); diff --git a/sources/FilerDefs.h b/sources/FilerDefs.h index a93e9af..cf420c8 100644 --- a/sources/FilerDefs.h +++ b/sources/FilerDefs.h @@ -52,7 +52,6 @@ static const char kSettingsFile[] = "Filer_settings"; #define MSG_ACTION_CHOSEN 'tsch' #define MSG_SHOW_ACTION_MENU 'sham' -#define MSG_VALUE_CHANGED 'vlch' #define MSG_TEST_CHOSEN 'tsch' #define MSG_MODE_CHOSEN 'mdch' diff --git a/sources/TestView.cpp b/sources/TestView.cpp index 961fcd5..e399a2c 100644 --- a/sources/TestView.cpp +++ b/sources/TestView.cpp @@ -81,7 +81,7 @@ TestView::TestView(const BRect& frame, const char* name, BMessage* test, rect.OffsetBy(rect.Width() + 5, 0); rect.right = rect.left + StringWidth("application/x-vnd.dw-foo") + 5; fValueBox = new AutoTextControl(rect, "valuebox", NULL, NULL, - new BMessage(MSG_VALUE_CHANGED), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); + new BMessage(), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); AddChild(fValueBox); fValueBox->SetDivider(0); if (fValueBox->Bounds().Height() < fModeButton->Bounds().Height()) { @@ -187,15 +187,6 @@ TestView::MessageReceived(BMessage* msg) SetMode(mode.String()); break; } - case MSG_VALUE_CHANGED: - { // Now done in GetTest, but left for now... - BString str; - if (fTest->FindString("value", &str) == B_OK) - fTest->ReplaceString("value", fValueBox->Text()); - else - fTest->AddString("value", fValueBox->Text()); - break; - } case MSG_SHOW_TEST_MENU: { BPopUpMenu* menu